scratch0-5 / plugins /JPEGReaderPlugin.js
soiz1's picture
Upload folder using huggingface_hub
8f3f8db verified
/* Smalltalk from Squeak4.5 with VMMaker 4.13.6 translated as JS source on 3 November 2014 1:52:20 pm */
/* Automatically generated by
JSPluginCodeGenerator VMMakerJS-bf.15 uuid: fd4e10f2-3773-4e80-8bb5-c4b471a014e5
from
JPEGReaderPlugin VMMaker-bf.353 uuid: 8ae25e7e-8d2c-451e-8277-598b30e9c002
*/
(function JPEGReaderPlugin() {
"use strict";
var VM_PROXY_MAJOR = 1;
var VM_PROXY_MINOR = 11;
/*** Functions ***/
function CLASSOF(obj) { return typeof obj === "number" ? interpreterProxy.classSmallInteger() : obj.sqClass }
function SIZEOF(obj) { return obj.pointers ? obj.pointers.length : obj.words ? obj.words.length : obj.bytes ? obj.bytes.length : 0 }
function BYTESIZEOF(obj) { return obj.bytes ? obj.bytes.length : obj.words ? obj.words.length * 4 : 0 }
function DIV(a, b) { return Math.floor(a / b) | 0; } // integer division
function MOD(a, b) { return a - DIV(a, b) * b | 0; } // signed modulus
function SHL(a, b) { return b > 31 ? 0 : a << b; } // fix JS shift
function SHR(a, b) { return b > 31 ? 0 : a >>> b; } // fix JS shift
function SHIFT(a, b) { return b < 0 ? (b < -31 ? 0 : a >>> (0-b) ) : (b > 31 ? 0 : a << b); }
/*** Constants ***/
var BlockWidthIndex = 5;
var BlueIndex = 2;
var ConstBits = 13;
var CurrentXIndex = 0;
var CurrentYIndex = 1;
var DCTSize = 8;
var DCTSize2 = 64;
var FIXn0n298631336 = 2446;
var FIXn0n34414 = 22554;
var FIXn0n390180644 = 3196;
var FIXn0n541196100 = 4433;
var FIXn0n71414 = 46802;
var FIXn0n765366865 = 6270;
var FIXn0n899976223 = 7373;
var FIXn1n175875602 = 9633;
var FIXn1n40200 = 91881;
var FIXn1n501321110 = 12299;
var FIXn1n77200 = 116130;
var FIXn1n847759065 = 15137;
var FIXn1n961570560 = 16069;
var FIXn2n053119869 = 16819;
var FIXn2n562915447 = 20995;
var FIXn3n072711026 = 25172;
var GreenIndex = 1;
var HScaleIndex = 2;
var MCUBlockIndex = 4;
var MCUWidthIndex = 8;
var MaxBits = 16;
var MaxMCUBlocks = 128;
var MaxSample = 255;
var MinComponentSize = 11;
var Pass1Bits = 2;
var Pass1Div = 2048;
var Pass2Div = 262144;
var PriorDCValueIndex = 10;
var RedIndex = 0;
var SampleOffset = 127;
var VScaleIndex = 3;
/*** Variables ***/
var acTable = null;
var acTableSize = 0;
var cbBlocks = new Array(128);
var cbComponent = new Array(11);
var cbSampleStream = 0;
var crBlocks = new Array(128);
var crComponent = new Array(11);
var crSampleStream = 0;
var dcTable = null;
var dcTableSize = 0;
var ditherMask = 0;
var interpreterProxy = null;
var jpegBits = null;
var jpegBitsSize = 0;
var jpegNaturalOrder = [
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, 7, 14, 21, 28,
35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63
];
var jsBitBuffer = 0;
var jsBitCount = 0;
var jsCollection = null;
var jsPosition = 0;
var jsReadLimit = 0;
var moduleName = "JPEGReaderPlugin 3 November 2014 (e)";
var residuals = null;
var yBlocks = new Array(128);
var yComponent = new Array(11);
var ySampleStream = 0;
function cbColorComponentFrom(oop) {
return colorComponentfrom(cbComponent, oop) && (colorComponentBlocksfrom(cbBlocks, oop));
}
function colorComponentfrom(aColorComponent, oop) {
if (typeof oop === "number") {
return false;
}
if (!interpreterProxy.isPointers(oop)) {
return false;
}
if (SIZEOF(oop) < MinComponentSize) {
return false;
}
aColorComponent[CurrentXIndex] = interpreterProxy.fetchIntegerofObject(CurrentXIndex, oop);
aColorComponent[CurrentYIndex] = interpreterProxy.fetchIntegerofObject(CurrentYIndex, oop);
aColorComponent[HScaleIndex] = interpreterProxy.fetchIntegerofObject(HScaleIndex, oop);
aColorComponent[VScaleIndex] = interpreterProxy.fetchIntegerofObject(VScaleIndex, oop);
aColorComponent[BlockWidthIndex] = interpreterProxy.fetchIntegerofObject(BlockWidthIndex, oop);
aColorComponent[MCUWidthIndex] = interpreterProxy.fetchIntegerofObject(MCUWidthIndex, oop);
aColorComponent[PriorDCValueIndex] = interpreterProxy.fetchIntegerofObject(PriorDCValueIndex, oop);
return !interpreterProxy.failed();
}
function colorComponentBlocksfrom(blocks, oop) {
var arrayOop;
var blockOop;
var i;
var max;
if (typeof oop === "number") {
return false;
}
if (!interpreterProxy.isPointers(oop)) {
return false;
}
if (SIZEOF(oop) < MinComponentSize) {
return false;
}
arrayOop = interpreterProxy.fetchPointerofObject(MCUBlockIndex, oop);
if (typeof arrayOop === "number") {
return false;
}
if (!interpreterProxy.isPointers(arrayOop)) {
return false;
}
max = SIZEOF(arrayOop);
if (max > MaxMCUBlocks) {
return false;
}
for (i = 0; i <= (max - 1); i++) {
blockOop = interpreterProxy.fetchPointerofObject(i, arrayOop);
if (typeof blockOop === "number") {
return false;
}
if (!interpreterProxy.isWords(blockOop)) {
return false;
}
if (SIZEOF(blockOop) !== DCTSize2) {
return false;
}
blocks[i] = blockOop.wordsAsInt32Array();
}
return !interpreterProxy.failed();
}
function colorConvertGrayscaleMCU() {
var i;
var y;
yComponent[CurrentXIndex] = 0;
yComponent[CurrentYIndex] = 0;
for (i = 0; i <= (jpegBitsSize - 1); i++) {
y = nextSampleY();
y += residuals[GreenIndex];
y = Math.min(y, MaxSample);
residuals[GreenIndex] = (y & ditherMask);
y = y & (MaxSample - ditherMask);
y = Math.max(y, 1);
jpegBits[i] = (((4278190080 + (y << 16)) + (y << 8)) + y);
}
}
function colorConvertMCU() {
var blue;
var cb;
var cr;
var green;
var i;
var red;
var y;
yComponent[CurrentXIndex] = 0;
yComponent[CurrentYIndex] = 0;
cbComponent[CurrentXIndex] = 0;
cbComponent[CurrentYIndex] = 0;
crComponent[CurrentXIndex] = 0;
crComponent[CurrentYIndex] = 0;
for (i = 0; i <= (jpegBitsSize - 1); i++) {
y = nextSampleY();
cb = nextSampleCb();
cb -= SampleOffset;
cr = nextSampleCr();
cr -= SampleOffset;
red = (y + ((FIXn1n40200 * cr) >> 16)) + residuals[RedIndex];
red = Math.min(red, MaxSample);
red = Math.max(red, 0);
residuals[RedIndex] = (red & ditherMask);
red = red & (MaxSample - ditherMask);
red = Math.max(red, 1);
green = ((y - ((FIXn0n34414 * cb) >> 16)) - ((FIXn0n71414 * cr) >> 16)) + residuals[GreenIndex];
green = Math.min(green, MaxSample);
green = Math.max(green, 0);
residuals[GreenIndex] = (green & ditherMask);
green = green & (MaxSample - ditherMask);
green = Math.max(green, 1);
blue = (y + ((FIXn1n77200 * cb) >> 16)) + residuals[BlueIndex];
blue = Math.min(blue, MaxSample);
blue = Math.max(blue, 0);
residuals[BlueIndex] = (blue & ditherMask);
blue = blue & (MaxSample - ditherMask);
blue = Math.max(blue, 1);
jpegBits[i] = (((4278190080 + (red << 16)) + (green << 8)) + blue);
}
}
function crColorComponentFrom(oop) {
return colorComponentfrom(crComponent, oop) && (colorComponentBlocksfrom(crBlocks, oop));
}
function decodeBlockIntocomponent(anArray, aColorComponent) {
var bits;
var byte;
var i;
var index;
var zeroCount;
byte = jpegDecodeValueFromsize(dcTable, dcTableSize);
if (byte < 0) {
return interpreterProxy.primitiveFail();
}
if (byte !== 0) {
bits = getBits(byte);
byte = scaleAndSignExtendinFieldWidth(bits, byte);
}
byte = aColorComponent[PriorDCValueIndex] = (aColorComponent[PriorDCValueIndex] + byte);
anArray[0] = byte;
for (i = 1; i <= (DCTSize2 - 1); i++) {
anArray[i] = 0;
}
index = 1;
while (index < DCTSize2) {
byte = jpegDecodeValueFromsize(acTable, acTableSize);
if (byte < 0) {
return interpreterProxy.primitiveFail();
}
zeroCount = byte >>> 4;
byte = byte & 15;
if (byte !== 0) {
index += zeroCount;
bits = getBits(byte);
byte = scaleAndSignExtendinFieldWidth(bits, byte);
if ((index < 0) || (index >= DCTSize2)) {
return interpreterProxy.primitiveFail();
}
anArray[jpegNaturalOrder[index]] = byte;
} else {
if (zeroCount === 15) {
index += zeroCount;
} else {
return null;
}
}
++index;
}
}
function fillBuffer() {
var byte;
while (jsBitCount <= 16) {
if (!(jsPosition < jsReadLimit)) {
return jsBitCount;
}
byte = jsCollection[jsPosition];
++jsPosition;
if (byte === 255) {
/* peek for 00 */
if (!((jsPosition < jsReadLimit) && (jsCollection[jsPosition] === 0))) {
--jsPosition;
return jsBitCount;
}
++jsPosition;
}
jsBitBuffer = (jsBitBuffer << 8) | byte;
jsBitCount += 8;
}
return jsBitCount;
}
function getBits(requestedBits) {
var value;
if (requestedBits > jsBitCount) {
fillBuffer();
if (requestedBits > jsBitCount) {
return -1;
}
}
jsBitCount -= requestedBits;
value = SHR(jsBitBuffer, jsBitCount);
jsBitBuffer = jsBitBuffer & ((SHL(1, jsBitCount)) - 1);
return value;
}
/* Note: This is hardcoded so it can be run from Squeak.
The module name is used for validating a module *after*
it is loaded to check if it does really contain the module
we're thinking it contains. This is important! */
function getModuleName() {
return moduleName;
}
function halt() {
;
}
function idctBlockIntqt(anArray, qt) {
var anACTerm;
var dcval;
var i;
var j;
var row;
var t0;
var t1;
var t10;
var t11;
var t12;
var t13;
var t2;
var t3;
var v;
var ws = new Array(64);
var z1;
var z2;
var z3;
var z4;
var z5;
;
for (i = 0; i <= (DCTSize - 1); i++) {
anACTerm = -1;
for (row = 1; row <= (DCTSize - 1); row++) {
if (anACTerm === -1) {
if (anArray[(row * DCTSize) + i] !== 0) {
anACTerm = row;
}
}
}
if (anACTerm === -1) {
dcval = (anArray[i] * qt[0]) << 2;
for (j = 0; j <= (DCTSize - 1); j++) {
ws[(j * DCTSize) + i] = dcval;
}
} else {
z2 = anArray[(DCTSize * 2) + i] * qt[(DCTSize * 2) + i];
z3 = anArray[(DCTSize * 6) + i] * qt[(DCTSize * 6) + i];
z1 = (z2 + z3) * FIXn0n541196100;
t2 = z1 + (z3 * (0 - FIXn1n847759065));
t3 = z1 + (z2 * FIXn0n765366865);
z2 = anArray[i] * qt[i];
z3 = anArray[(DCTSize * 4) + i] * qt[(DCTSize * 4) + i];
t0 = (z2 + z3) << 13;
t1 = (z2 - z3) << 13;
t10 = t0 + t3;
t13 = t0 - t3;
t11 = t1 + t2;
t12 = t1 - t2;
t0 = anArray[(DCTSize * 7) + i] * qt[(DCTSize * 7) + i];
t1 = anArray[(DCTSize * 5) + i] * qt[(DCTSize * 5) + i];
t2 = anArray[(DCTSize * 3) + i] * qt[(DCTSize * 3) + i];
t3 = anArray[DCTSize + i] * qt[DCTSize + i];
z1 = t0 + t3;
z2 = t1 + t2;
z3 = t0 + t2;
z4 = t1 + t3;
z5 = (z3 + z4) * FIXn1n175875602;
t0 = t0 * FIXn0n298631336;
t1 = t1 * FIXn2n053119869;
t2 = t2 * FIXn3n072711026;
t3 = t3 * FIXn1n501321110;
z1 = z1 * (0 - FIXn0n899976223);
z2 = z2 * (0 - FIXn2n562915447);
z3 = z3 * (0 - FIXn1n961570560);
z4 = z4 * (0 - FIXn0n390180644);
z3 += z5;
z4 += z5;
t0 = (t0 + z1) + z3;
t1 = (t1 + z2) + z4;
t2 = (t2 + z2) + z3;
t3 = (t3 + z1) + z4;
ws[i] = ((t10 + t3) >> 11);
ws[(DCTSize * 7) + i] = ((t10 - t3) >> 11);
ws[(DCTSize * 1) + i] = ((t11 + t2) >> 11);
ws[(DCTSize * 6) + i] = ((t11 - t2) >> 11);
ws[(DCTSize * 2) + i] = ((t12 + t1) >> 11);
ws[(DCTSize * 5) + i] = ((t12 - t1) >> 11);
ws[(DCTSize * 3) + i] = ((t13 + t0) >> 11);
ws[(DCTSize * 4) + i] = ((t13 - t0) >> 11);
}
}
for (i = 0; i <= (DCTSize2 - DCTSize); i += DCTSize) {
z2 = ws[i + 2];
z3 = ws[i + 6];
z1 = (z2 + z3) * FIXn0n541196100;
t2 = z1 + (z3 * (0 - FIXn1n847759065));
t3 = z1 + (z2 * FIXn0n765366865);
t0 = (ws[i] + ws[i + 4]) << 13;
t1 = (ws[i] - ws[i + 4]) << 13;
t10 = t0 + t3;
t13 = t0 - t3;
t11 = t1 + t2;
t12 = t1 - t2;
t0 = ws[i + 7];
t1 = ws[i + 5];
t2 = ws[i + 3];
t3 = ws[i + 1];
z1 = t0 + t3;
z2 = t1 + t2;
z3 = t0 + t2;
z4 = t1 + t3;
z5 = (z3 + z4) * FIXn1n175875602;
t0 = t0 * FIXn0n298631336;
t1 = t1 * FIXn2n053119869;
t2 = t2 * FIXn3n072711026;
t3 = t3 * FIXn1n501321110;
z1 = z1 * (0 - FIXn0n899976223);
z2 = z2 * (0 - FIXn2n562915447);
z3 = z3 * (0 - FIXn1n961570560);
z4 = z4 * (0 - FIXn0n390180644);
z3 += z5;
z4 += z5;
t0 = (t0 + z1) + z3;
t1 = (t1 + z2) + z4;
t2 = (t2 + z2) + z3;
t3 = (t3 + z1) + z4;
v = ((t10 + t3) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i] = v;
v = ((t10 - t3) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 7] = v;
v = ((t11 + t2) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 1] = v;
v = ((t11 - t2) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 6] = v;
v = ((t12 + t1) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 2] = v;
v = ((t12 - t1) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 5] = v;
v = ((t13 + t0) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 3] = v;
v = ((t13 - t0) >> 18) + SampleOffset;
v = Math.min(v, MaxSample);
v = Math.max(v, 0);
anArray[i + 4] = v;
}
}
/* Decode the next value in the receiver using the given huffman table. */
function jpegDecodeValueFromsize(table, tableSize) {
var bits;
var bitsNeeded;
var index;
var tableIndex;
var value;
/* Initial bits needed */
bitsNeeded = table[0] >>> 24;
if (bitsNeeded > MaxBits) {
return -1;
}
/* First real table */
tableIndex = 2;
while (true) {
/* Get bits */
bits = getBits(bitsNeeded);
if (bits < 0) {
return -1;
}
index = (tableIndex + bits) - 1;
if (index >= tableSize) {
return -1;
}
/* Lookup entry in table */
value = table[index];
if ((value & 1056964608) === 0) {
return value;
}
/* Table offset in low 16 bit */
tableIndex = value & 65535;
/* Additional bits in high 8 bit */
bitsNeeded = (value >>> 24) & 255;
if (bitsNeeded > MaxBits) {
return -1;
}
}
return -1;
}
function loadJPEGStreamFrom(streamOop) {
var oop;
var sz;
if (SIZEOF(streamOop) < 5) {
return false;
}
if (!interpreterProxy.isPointers(streamOop)) {
return false;
}
oop = interpreterProxy.fetchPointerofObject(0, streamOop);
if (typeof oop === "number") {
return false;
}
if (!interpreterProxy.isBytes(oop)) {
return false;
}
jsCollection = oop.bytes;
sz = BYTESIZEOF(oop);
jsPosition = interpreterProxy.fetchIntegerofObject(1, streamOop);
jsReadLimit = interpreterProxy.fetchIntegerofObject(2, streamOop);
jsBitBuffer = interpreterProxy.fetchIntegerofObject(3, streamOop);
jsBitCount = interpreterProxy.fetchIntegerofObject(4, streamOop);
if (interpreterProxy.failed()) {
return false;
}
if (sz < jsReadLimit) {
return false;
}
if ((jsPosition < 0) || (jsPosition >= jsReadLimit)) {
return false;
}
return true;
}
function nextSampleCb() {
var blockIndex;
var curX;
var dx;
var dy;
var sample;
var sampleIndex;
var sx;
var sy;
dx = (curX = cbComponent[CurrentXIndex]);
dy = cbComponent[CurrentYIndex];
sx = cbComponent[HScaleIndex];
sy = cbComponent[VScaleIndex];
if ((sx !== 0) && (sy !== 0)) {
dx = DIV(dx, sx);
dy = DIV(dy, sy);
}
blockIndex = ((dy >>> 3) * cbComponent[BlockWidthIndex]) + (dx >>> 3);
sampleIndex = ((dy & 7) << 3) + (dx & 7);
sample = cbBlocks[blockIndex][sampleIndex];
++curX;
if (curX < (cbComponent[MCUWidthIndex] * 8)) {
cbComponent[CurrentXIndex] = curX;
} else {
cbComponent[CurrentXIndex] = 0;
cbComponent[CurrentYIndex]++;
}
return sample;
}
function nextSampleCr() {
var blockIndex;
var curX;
var dx;
var dy;
var sample;
var sampleIndex;
var sx;
var sy;
dx = (curX = crComponent[CurrentXIndex]);
dy = crComponent[CurrentYIndex];
sx = crComponent[HScaleIndex];
sy = crComponent[VScaleIndex];
if ((sx !== 0) && (sy !== 0)) {
dx = DIV(dx, sx);
dy = DIV(dy, sy);
}
blockIndex = ((dy >>> 3) * crComponent[BlockWidthIndex]) + (dx >>> 3);
sampleIndex = ((dy & 7) << 3) + (dx & 7);
sample = crBlocks[blockIndex][sampleIndex];
++curX;
if (curX < (crComponent[MCUWidthIndex] * 8)) {
crComponent[CurrentXIndex] = curX;
} else {
crComponent[CurrentXIndex] = 0;
crComponent[CurrentYIndex]++;
}
return sample;
}
function nextSampleY() {
var blockIndex;
var curX;
var dx;
var dy;
var sample;
var sampleIndex;
var sx;
var sy;
dx = (curX = yComponent[CurrentXIndex]);
dy = yComponent[CurrentYIndex];
sx = yComponent[HScaleIndex];
sy = yComponent[VScaleIndex];
if ((sx !== 0) && (sy !== 0)) {
dx = DIV(dx, sx);
dy = DIV(dy, sy);
}
blockIndex = ((dy >>> 3) * yComponent[BlockWidthIndex]) + (dx >>> 3);
sampleIndex = ((dy & 7) << 3) + (dx & 7);
sample = yBlocks[blockIndex][sampleIndex];
++curX;
if (curX < (yComponent[MCUWidthIndex] * 8)) {
yComponent[CurrentXIndex] = curX;
} else {
yComponent[CurrentXIndex] = 0;
yComponent[CurrentYIndex]++;
}
return sample;
}
/* Requires:
JPEGColorComponent
bits
WordArray with: 3*Integer (residuals)
ditherMask
*/
function primitiveColorConvertGrayscaleMCU() {
var arrayOop;
stInit();
if (interpreterProxy.methodArgumentCount() !== 4) {
return interpreterProxy.primitiveFail();
}
ditherMask = interpreterProxy.stackIntegerValue(0);
arrayOop = interpreterProxy.stackObjectValue(1);
if (interpreterProxy.failed()) {
return null;
}
if (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === 3))) {
return interpreterProxy.primitiveFail();
}
residuals = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(2);
if (interpreterProxy.failed()) {
return null;
}
if (!interpreterProxy.isWords(arrayOop)) {
return interpreterProxy.primitiveFail();
}
jpegBitsSize = SIZEOF(arrayOop);
jpegBits = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(3);
if (interpreterProxy.failed()) {
return null;
}
if (!yColorComponentFrom(arrayOop)) {
return interpreterProxy.primitiveFail();
}
colorConvertGrayscaleMCU();
interpreterProxy.pop(4);
}
/* Requires:
Array with: 3*JPEGColorComponent
bits
WordArray with: 3*Integer (residuals)
ditherMask
*/
function primitiveColorConvertMCU() {
var arrayOop;
stInit();
if (interpreterProxy.methodArgumentCount() !== 4) {
return interpreterProxy.primitiveFail();
}
ditherMask = interpreterProxy.stackIntegerValue(0);
arrayOop = interpreterProxy.stackObjectValue(1);
if (interpreterProxy.failed()) {
return null;
}
if (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === 3))) {
return interpreterProxy.primitiveFail();
}
residuals = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(2);
if (interpreterProxy.failed()) {
return null;
}
if (!interpreterProxy.isWords(arrayOop)) {
return interpreterProxy.primitiveFail();
}
jpegBitsSize = SIZEOF(arrayOop);
jpegBits = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(3);
if (interpreterProxy.failed()) {
return null;
}
if (!(interpreterProxy.isPointers(arrayOop) && (SIZEOF(arrayOop) === 3))) {
return interpreterProxy.primitiveFail();
}
if (!yColorComponentFrom(interpreterProxy.fetchPointerofObject(0, arrayOop))) {
return interpreterProxy.primitiveFail();
}
if (!cbColorComponentFrom(interpreterProxy.fetchPointerofObject(1, arrayOop))) {
return interpreterProxy.primitiveFail();
}
if (!crColorComponentFrom(interpreterProxy.fetchPointerofObject(2, arrayOop))) {
return interpreterProxy.primitiveFail();
}
colorConvertMCU();
interpreterProxy.pop(4);
}
/* In:
anArray WordArray of: DCTSize2
aColorComponent JPEGColorComponent
dcTable WordArray
acTable WordArray
stream JPEGStream
*/
function primitiveDecodeMCU() {
var anArray;
var arrayOop;
var oop;
;
if (interpreterProxy.methodArgumentCount() !== 5) {
return interpreterProxy.primitiveFail();
}
oop = interpreterProxy.stackObjectValue(0);
if (interpreterProxy.failed()) {
return null;
}
if (!loadJPEGStreamFrom(oop)) {
return interpreterProxy.primitiveFail();
}
arrayOop = interpreterProxy.stackObjectValue(1);
if (interpreterProxy.failed()) {
return null;
}
if (!interpreterProxy.isWords(arrayOop)) {
return interpreterProxy.primitiveFail();
}
acTableSize = SIZEOF(arrayOop);
acTable = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(2);
if (interpreterProxy.failed()) {
return null;
}
if (!interpreterProxy.isWords(arrayOop)) {
return interpreterProxy.primitiveFail();
}
dcTableSize = SIZEOF(arrayOop);
dcTable = arrayOop.wordsAsInt32Array();
oop = interpreterProxy.stackObjectValue(3);
if (interpreterProxy.failed()) {
return null;
}
if (!colorComponentfrom(yComponent, oop)) {
return interpreterProxy.primitiveFail();
}
arrayOop = interpreterProxy.stackObjectValue(4);
if (interpreterProxy.failed()) {
return null;
}
if (!interpreterProxy.isWords(arrayOop)) {
return interpreterProxy.primitiveFail();
}
if (SIZEOF(arrayOop) !== DCTSize2) {
return interpreterProxy.primitiveFail();
}
anArray = arrayOop.wordsAsInt32Array();
if (interpreterProxy.failed()) {
return null;
}
decodeBlockIntocomponent(anArray, yComponent);
if (interpreterProxy.failed()) {
return null;
}
storeJPEGStreamOn(interpreterProxy.stackValue(0));
interpreterProxy.storeIntegerofObjectwithValue(PriorDCValueIndex, interpreterProxy.stackValue(3), yComponent[PriorDCValueIndex]);
interpreterProxy.pop(5);
}
/* In:
anArray: IntegerArray new: DCTSize2
qt: IntegerArray new: DCTSize2.
*/
function primitiveIdctInt() {
var anArray;
var arrayOop;
var qt;
;
if (interpreterProxy.methodArgumentCount() !== 2) {
return interpreterProxy.primitiveFail();
}
arrayOop = interpreterProxy.stackObjectValue(0);
if (interpreterProxy.failed()) {
return null;
}
if (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === DCTSize2))) {
return interpreterProxy.primitiveFail();
}
qt = arrayOop.wordsAsInt32Array();
arrayOop = interpreterProxy.stackObjectValue(1);
if (interpreterProxy.failed()) {
return null;
}
if (!(interpreterProxy.isWords(arrayOop) && (SIZEOF(arrayOop) === DCTSize2))) {
return interpreterProxy.primitiveFail();
}
anArray = arrayOop.wordsAsInt32Array();
idctBlockIntqt(anArray, qt);
interpreterProxy.pop(2);
}
function scaleAndSignExtendinFieldWidth(aNumber, w) {
if (aNumber < (SHL(1, (w - 1)))) {
return (aNumber - (SHL(1, w))) + 1;
} else {
return aNumber;
}
}
/* Note: This is coded so that is can be run from Squeak. */
function setInterpreter(anInterpreter) {
var ok;
interpreterProxy = anInterpreter;
ok = interpreterProxy.majorVersion() == VM_PROXY_MAJOR;
if (ok === false) {
return false;
}
ok = interpreterProxy.minorVersion() >= VM_PROXY_MINOR;
return ok;
}
function stInit() {
;
}
function storeJPEGStreamOn(streamOop) {
interpreterProxy.storeIntegerofObjectwithValue(1, streamOop, jsPosition);
interpreterProxy.storeIntegerofObjectwithValue(3, streamOop, jsBitBuffer);
interpreterProxy.storeIntegerofObjectwithValue(4, streamOop, jsBitCount);
}
function yColorComponentFrom(oop) {
return colorComponentfrom(yComponent, oop) && (colorComponentBlocksfrom(yBlocks, oop));
}
function registerPlugin() {
if (typeof Squeak === "object" && Squeak.registerExternalModule) {
Squeak.registerExternalModule("JPEGReaderPlugin", {
setInterpreter: setInterpreter,
primitiveIdctInt: primitiveIdctInt,
primitiveColorConvertMCU: primitiveColorConvertMCU,
primitiveColorConvertGrayscaleMCU: primitiveColorConvertGrayscaleMCU,
primitiveDecodeMCU: primitiveDecodeMCU,
getModuleName: getModuleName,
});
} else self.setTimeout(registerPlugin, 100);
}
registerPlugin();
})(); // Register module/plugin