Spaces:
Running
Running
/* 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() { | |
; | |
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 | |