JAL-1807 test
[jalviewjs.git] / bin / javajs / img / JpgEncoder.js
index 9edf3b2..b13c26f 100644 (file)
-Clazz.declarePackage ("javajs.img");\r
-Clazz.load (["javajs.img.ImageEncoder", "javajs.util.AU"], ["javajs.img.DCT", "$.JpgEncoder", "$.JpegObj", "$.Huffman"], null, function () {\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.jpegObj = null;\r
-this.huf = null;\r
-this.dct = null;\r
-this.defaultQuality = 100;\r
-this.applicationTag = null;\r
-Clazz.instantialize (this, arguments);\r
-}, javajs.img, "JpgEncoder", javajs.img.ImageEncoder);\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-Clazz.superConstructor (this, javajs.img.JpgEncoder, []);\r
-});\r
-Clazz.overrideMethod (c$, "setParams", \r
-function (params) {\r
-if (this.quality <= 0) this.quality = (params.containsKey ("qualityJPG") ? (params.get ("qualityJPG")).intValue () : this.defaultQuality);\r
-this.jpegObj =  new javajs.img.JpegObj ();\r
-this.jpegObj.comment = params.get ("comment");\r
-this.applicationTag = params.get ("jpgAppTag");\r
-}, "java.util.Map");\r
-Clazz.overrideMethod (c$, "generate", \r
-function () {\r
-this.jpegObj.imageWidth = this.width;\r
-this.jpegObj.imageHeight = this.height;\r
-this.dct =  new javajs.img.DCT (this.quality);\r
-this.huf =  new javajs.img.Huffman (this.width, this.height);\r
-if (this.jpegObj == null) return;\r
-this.jpegObj.getYCCArray (this.pixels);\r
-var longState = this.writeHeaders (this.jpegObj, this.dct);\r
-this.writeCompressedData (this.jpegObj, this.dct, this.huf);\r
-this.writeMarker (javajs.img.JpgEncoder.eoi);\r
-if (longState != null) {\r
-var b = longState.getBytes ();\r
-this.out.write (b, 0, b.length);\r
-}});\r
-Clazz.defineMethod (c$, "writeCompressedData", \r
-($fz = function (jpegObj, dct, huf) {\r
-var i;\r
-var j;\r
-var r;\r
-var c;\r
-var a;\r
-var b;\r
-var comp;\r
-var xpos;\r
-var ypos;\r
-var xblockoffset;\r
-var yblockoffset;\r
-var inputArray;\r
-var dctArray1 =  Clazz.newFloatArray (8, 8, 0);\r
-var dctArray2 =  Clazz.newDoubleArray (8, 8, 0);\r
-var dctArray3 =  Clazz.newIntArray (64, 0);\r
-var lastDCvalue =  Clazz.newIntArray (jpegObj.numberOfComponents, 0);\r
-var minBlockWidth;\r
-var minBlockHeight;\r
-minBlockWidth = ((huf.imageWidth % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageWidth / 8.0) + 1) * 8 : huf.imageWidth);\r
-minBlockHeight = ((huf.imageHeight % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageHeight / 8.0) + 1) * 8 : huf.imageHeight);\r
-for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {\r
-minBlockWidth = Math.min (minBlockWidth, jpegObj.blockWidth[comp]);\r
-minBlockHeight = Math.min (minBlockHeight, jpegObj.blockHeight[comp]);\r
-}\r
-xpos = 0;\r
-for (r = 0; r < minBlockHeight; r++) {\r
-for (c = 0; c < minBlockWidth; c++) {\r
-xpos = c * 8;\r
-ypos = r * 8;\r
-for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {\r
-inputArray = jpegObj.components[comp];\r
-var vsampF = jpegObj.vsampFactor[comp];\r
-var hsampF = jpegObj.hsampFactor[comp];\r
-var qNumber = jpegObj.qtableNumber[comp];\r
-var dcNumber = jpegObj.dctableNumber[comp];\r
-var acNumber = jpegObj.actableNumber[comp];\r
-for (i = 0; i < vsampF; i++) {\r
-for (j = 0; j < hsampF; j++) {\r
-xblockoffset = j * 8;\r
-yblockoffset = i * 8;\r
-for (a = 0; a < 8; a++) {\r
-for (b = 0; b < 8; b++) {\r
-dctArray1[a][b] = inputArray[ypos + yblockoffset + a][xpos + xblockoffset + b];\r
-}\r
-}\r
-dctArray2 = javajs.img.DCT.forwardDCT (dctArray1);\r
-dctArray3 = javajs.img.DCT.quantizeBlock (dctArray2, dct.divisors[qNumber]);\r
-huf.HuffmanBlockEncoder (this.out, dctArray3, lastDCvalue[comp], dcNumber, acNumber);\r
-lastDCvalue[comp] = dctArray3[0];\r
-}\r
-}\r
-}\r
-}\r
-}\r
-huf.flushBuffer (this.out);\r
-}, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT,javajs.img.Huffman");\r
-Clazz.defineMethod (c$, "writeHeaders", \r
-($fz = function (jpegObj, dct) {\r
-var i;\r
-var j;\r
-var index;\r
-var offset;\r
-var tempArray;\r
-this.writeMarker (javajs.img.JpgEncoder.soi);\r
-this.writeArray (javajs.img.JpgEncoder.jfif);\r
-var comment = null;\r
-if (jpegObj.comment.length > 0) this.writeString (jpegObj.comment, 0xE1);\r
-this.writeString ("JPEG Encoder Copyright 1998, James R. Weeks and BioElectroMech.\n\n", 0xFE);\r
-var dqt =  Clazz.newByteArray (134, 0);\r
-dqt[0] = 0xFF;\r
-dqt[1] = 0xDB;\r
-dqt[2] = 0;\r
-dqt[3] = 132;\r
-offset = 4;\r
-for (i = 0; i < 2; i++) {\r
-dqt[offset++] = ((0) + i);\r
-tempArray = dct.quantum[i];\r
-for (j = 0; j < 64; j++) {\r
-dqt[offset++] = tempArray[javajs.img.Huffman.jpegNaturalOrder[j]];\r
-}\r
-}\r
-this.writeArray (dqt);\r
-var sof =  Clazz.newByteArray (19, 0);\r
-sof[0] = 0xFF;\r
-sof[1] = 0xC0;\r
-sof[2] = 0;\r
-sof[3] = 17;\r
-sof[4] = jpegObj.precision;\r
-sof[5] = ((jpegObj.imageHeight >> 8) & 0xFF);\r
-sof[6] = ((jpegObj.imageHeight) & 0xFF);\r
-sof[7] = ((jpegObj.imageWidth >> 8) & 0xFF);\r
-sof[8] = ((jpegObj.imageWidth) & 0xFF);\r
-sof[9] = jpegObj.numberOfComponents;\r
-index = 10;\r
-for (i = 0; i < sof[9]; i++) {\r
-sof[index++] = jpegObj.compID[i];\r
-sof[index++] = ((jpegObj.hsampFactor[i] << 4) + jpegObj.vsampFactor[i]);\r
-sof[index++] = jpegObj.qtableNumber[i];\r
-}\r
-this.writeArray (sof);\r
-this.WriteDHTHeader (javajs.img.Huffman.bitsDCluminance, javajs.img.Huffman.valDCluminance);\r
-this.WriteDHTHeader (javajs.img.Huffman.bitsACluminance, javajs.img.Huffman.valACluminance);\r
-this.WriteDHTHeader (javajs.img.Huffman.bitsDCchrominance, javajs.img.Huffman.valDCchrominance);\r
-this.WriteDHTHeader (javajs.img.Huffman.bitsACchrominance, javajs.img.Huffman.valACchrominance);\r
-var sos =  Clazz.newByteArray (14, 0);\r
-sos[0] = 0xFF;\r
-sos[1] = 0xDA;\r
-sos[2] = 0;\r
-sos[3] = 12;\r
-sos[4] = jpegObj.numberOfComponents;\r
-index = 5;\r
-for (i = 0; i < sos[4]; i++) {\r
-sos[index++] = jpegObj.compID[i];\r
-sos[index++] = ((jpegObj.dctableNumber[i] << 4) + jpegObj.actableNumber[i]);\r
-}\r
-sos[index++] = jpegObj.ss;\r
-sos[index++] = jpegObj.se;\r
-sos[index++] = ((jpegObj.ah << 4) + jpegObj.al);\r
-this.writeArray (sos);\r
-return comment;\r
-}, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT");\r
-Clazz.defineMethod (c$, "writeString", \r
-($fz = function (s, id) {\r
-var len = s.length;\r
-var i0 = 0;\r
-var suffix = this.applicationTag;\r
-while (i0 < len) {\r
-var nBytes = len - i0;\r
-if (nBytes > 65510) {\r
-nBytes = 65500;\r
-var pt = s.lastIndexOf ('\n', i0 + nBytes);\r
-if (pt > i0 + 1) nBytes = pt - i0;\r
-}if (i0 + nBytes == len) suffix = "";\r
-this.writeTag (nBytes + suffix.length, id);\r
-this.writeArray (s.substring (i0, i0 + nBytes).getBytes ());\r
-if (suffix.length > 0) this.writeArray (suffix.getBytes ());\r
-i0 += nBytes;\r
-}\r
-}, $fz.isPrivate = true, $fz), "~S,~N");\r
-Clazz.defineMethod (c$, "writeTag", \r
-($fz = function (length, id) {\r
-length += 2;\r
-var com =  Clazz.newByteArray (4, 0);\r
-com[0] = 0xFF;\r
-com[1] = id;\r
-com[2] = ((length >> 8) & 0xFF);\r
-com[3] = (length & 0xFF);\r
-this.writeArray (com);\r
-}, $fz.isPrivate = true, $fz), "~N,~N");\r
-Clazz.defineMethod (c$, "WriteDHTHeader", \r
-function (bits, val) {\r
-var dht;\r
-var bytes = 0;\r
-for (var j = 1; j < 17; j++) bytes += bits[j];\r
-\r
-dht =  Clazz.newByteArray (21 + bytes, 0);\r
-dht[0] = 0xFF;\r
-dht[1] = 0xC4;\r
-var index = 4;\r
-for (var j = 0; j < 17; j++) dht[index++] = bits[j];\r
-\r
-for (var j = 0; j < bytes; j++) dht[index++] = val[j];\r
-\r
-dht[2] = (((index - 2) >> 8) & 0xFF);\r
-dht[3] = ((index - 2) & 0xFF);\r
-this.writeArray (dht);\r
-}, "~A,~A");\r
-Clazz.defineMethod (c$, "writeMarker", \r
-function (data) {\r
-this.out.write (data, 0, 2);\r
-}, "~A");\r
-Clazz.defineMethod (c$, "writeArray", \r
-function (data) {\r
-this.out.write (data, 0, data.length);\r
-}, "~A");\r
-Clazz.defineStatics (c$,\r
-"CONTINUE_MAX", 65500,\r
-"CONTINUE_MAX_BUFFER", 65510,\r
-"eoi",  Clazz.newByteArray (-1, [0xFF, 0xD9]),\r
-"jfif",  Clazz.newByteArray (-1, [0xff, 0xe0, 0, 16, 0x4a, 0x46, 0x49, 0x46, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0]),\r
-"soi",  Clazz.newByteArray (-1, [0xFF, 0xD8]));\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.quantum = null;\r
-this.divisors = null;\r
-this.quantum_luminance = null;\r
-this.DivisorsLuminance = null;\r
-this.quantum_chrominance = null;\r
-this.DivisorsChrominance = null;\r
-Clazz.instantialize (this, arguments);\r
-}, javajs.img, "DCT");\r
-Clazz.prepareFields (c$, function () {\r
-this.quantum = javajs.util.AU.newInt2 (2);\r
-this.divisors = javajs.util.AU.newDouble2 (2);\r
-this.quantum_luminance =  Clazz.newIntArray (64, 0);\r
-this.DivisorsLuminance =  Clazz.newDoubleArray (64, 0);\r
-this.quantum_chrominance =  Clazz.newIntArray (64, 0);\r
-this.DivisorsChrominance =  Clazz.newDoubleArray (64, 0);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function (quality) {\r
-this.initMatrix (quality);\r
-}, "~N");\r
-Clazz.defineMethod (c$, "initMatrix", \r
-($fz = function (quality) {\r
-quality = (quality < 1 ? 1 : quality > 100 ? 100 : quality);\r
-quality = (quality < 50 ? Clazz.doubleToInt (5000 / quality) : 200 - quality * 2);\r
-this.quantum_luminance[0] = 16;\r
-this.quantum_luminance[1] = 11;\r
-this.quantum_luminance[2] = 10;\r
-this.quantum_luminance[3] = 16;\r
-this.quantum_luminance[4] = 24;\r
-this.quantum_luminance[5] = 40;\r
-this.quantum_luminance[6] = 51;\r
-this.quantum_luminance[7] = 61;\r
-this.quantum_luminance[8] = 12;\r
-this.quantum_luminance[9] = 12;\r
-this.quantum_luminance[10] = 14;\r
-this.quantum_luminance[11] = 19;\r
-this.quantum_luminance[12] = 26;\r
-this.quantum_luminance[13] = 58;\r
-this.quantum_luminance[14] = 60;\r
-this.quantum_luminance[15] = 55;\r
-this.quantum_luminance[16] = 14;\r
-this.quantum_luminance[17] = 13;\r
-this.quantum_luminance[18] = 16;\r
-this.quantum_luminance[19] = 24;\r
-this.quantum_luminance[20] = 40;\r
-this.quantum_luminance[21] = 57;\r
-this.quantum_luminance[22] = 69;\r
-this.quantum_luminance[23] = 56;\r
-this.quantum_luminance[24] = 14;\r
-this.quantum_luminance[25] = 17;\r
-this.quantum_luminance[26] = 22;\r
-this.quantum_luminance[27] = 29;\r
-this.quantum_luminance[28] = 51;\r
-this.quantum_luminance[29] = 87;\r
-this.quantum_luminance[30] = 80;\r
-this.quantum_luminance[31] = 62;\r
-this.quantum_luminance[32] = 18;\r
-this.quantum_luminance[33] = 22;\r
-this.quantum_luminance[34] = 37;\r
-this.quantum_luminance[35] = 56;\r
-this.quantum_luminance[36] = 68;\r
-this.quantum_luminance[37] = 109;\r
-this.quantum_luminance[38] = 103;\r
-this.quantum_luminance[39] = 77;\r
-this.quantum_luminance[40] = 24;\r
-this.quantum_luminance[41] = 35;\r
-this.quantum_luminance[42] = 55;\r
-this.quantum_luminance[43] = 64;\r
-this.quantum_luminance[44] = 81;\r
-this.quantum_luminance[45] = 104;\r
-this.quantum_luminance[46] = 113;\r
-this.quantum_luminance[47] = 92;\r
-this.quantum_luminance[48] = 49;\r
-this.quantum_luminance[49] = 64;\r
-this.quantum_luminance[50] = 78;\r
-this.quantum_luminance[51] = 87;\r
-this.quantum_luminance[52] = 103;\r
-this.quantum_luminance[53] = 121;\r
-this.quantum_luminance[54] = 120;\r
-this.quantum_luminance[55] = 101;\r
-this.quantum_luminance[56] = 72;\r
-this.quantum_luminance[57] = 92;\r
-this.quantum_luminance[58] = 95;\r
-this.quantum_luminance[59] = 98;\r
-this.quantum_luminance[60] = 112;\r
-this.quantum_luminance[61] = 100;\r
-this.quantum_luminance[62] = 103;\r
-this.quantum_luminance[63] = 99;\r
-javajs.img.DCT.AANscale (this.DivisorsLuminance, this.quantum_luminance, quality);\r
-for (var i = 4; i < 64; i++) this.quantum_chrominance[i] = 99;\r
-\r
-this.quantum_chrominance[0] = 17;\r
-this.quantum_chrominance[1] = 18;\r
-this.quantum_chrominance[2] = 24;\r
-this.quantum_chrominance[3] = 47;\r
-this.quantum_chrominance[8] = 18;\r
-this.quantum_chrominance[9] = 21;\r
-this.quantum_chrominance[10] = 26;\r
-this.quantum_chrominance[11] = 66;\r
-this.quantum_chrominance[16] = 24;\r
-this.quantum_chrominance[17] = 26;\r
-this.quantum_chrominance[18] = 56;\r
-this.quantum_chrominance[24] = 47;\r
-this.quantum_chrominance[25] = 66;\r
-javajs.img.DCT.AANscale (this.DivisorsChrominance, this.quantum_chrominance, quality);\r
-this.quantum[0] = this.quantum_luminance;\r
-this.quantum[1] = this.quantum_chrominance;\r
-this.divisors[0] = this.DivisorsLuminance;\r
-this.divisors[1] = this.DivisorsChrominance;\r
-}, $fz.isPrivate = true, $fz), "~N");\r
-c$.AANscale = Clazz.defineMethod (c$, "AANscale", \r
-($fz = function (divisors, values, quality) {\r
-for (var j = 0; j < 64; j++) {\r
-var temp = Clazz.doubleToInt ((values[j] * quality + 50) / 100);\r
-values[j] = (temp < 1 ? 1 : temp > 255 ? 255 : temp);\r
-}\r
-for (var i = 0, index = 0; i < 8; i++) for (var j = 0; j < 8; j++, index++) divisors[index] = (0.125 / (values[index] * javajs.img.DCT.AANscaleFactor[i] * javajs.img.DCT.AANscaleFactor[j]));\r
-\r
-\r
-}, $fz.isPrivate = true, $fz), "~A,~A,~N");\r
-c$.forwardDCT = Clazz.defineMethod (c$, "forwardDCT", \r
-function (input) {\r
-var output =  Clazz.newDoubleArray (8, 8, 0);\r
-var tmp0;\r
-var tmp1;\r
-var tmp2;\r
-var tmp3;\r
-var tmp4;\r
-var tmp5;\r
-var tmp6;\r
-var tmp7;\r
-var tmp10;\r
-var tmp11;\r
-var tmp12;\r
-var tmp13;\r
-var z1;\r
-var z2;\r
-var z3;\r
-var z4;\r
-var z5;\r
-var z11;\r
-var z13;\r
-for (var i = 0; i < 8; i++) for (var j = 0; j < 8; j++) output[i][j] = (input[i][j] - 128.0);\r
-\r
-\r
-for (var i = 0; i < 8; i++) {\r
-tmp0 = output[i][0] + output[i][7];\r
-tmp7 = output[i][0] - output[i][7];\r
-tmp1 = output[i][1] + output[i][6];\r
-tmp6 = output[i][1] - output[i][6];\r
-tmp2 = output[i][2] + output[i][5];\r
-tmp5 = output[i][2] - output[i][5];\r
-tmp3 = output[i][3] + output[i][4];\r
-tmp4 = output[i][3] - output[i][4];\r
-tmp10 = tmp0 + tmp3;\r
-tmp13 = tmp0 - tmp3;\r
-tmp11 = tmp1 + tmp2;\r
-tmp12 = tmp1 - tmp2;\r
-output[i][0] = tmp10 + tmp11;\r
-output[i][4] = tmp10 - tmp11;\r
-z1 = (tmp12 + tmp13) * 0.707106781;\r
-output[i][2] = tmp13 + z1;\r
-output[i][6] = tmp13 - z1;\r
-tmp10 = tmp4 + tmp5;\r
-tmp11 = tmp5 + tmp6;\r
-tmp12 = tmp6 + tmp7;\r
-z5 = (tmp10 - tmp12) * 0.382683433;\r
-z2 = 0.541196100 * tmp10 + z5;\r
-z4 = 1.306562965 * tmp12 + z5;\r
-z3 = tmp11 * 0.707106781;\r
-z11 = tmp7 + z3;\r
-z13 = tmp7 - z3;\r
-output[i][5] = z13 + z2;\r
-output[i][3] = z13 - z2;\r
-output[i][1] = z11 + z4;\r
-output[i][7] = z11 - z4;\r
-}\r
-for (var i = 0; i < 8; i++) {\r
-tmp0 = output[0][i] + output[7][i];\r
-tmp7 = output[0][i] - output[7][i];\r
-tmp1 = output[1][i] + output[6][i];\r
-tmp6 = output[1][i] - output[6][i];\r
-tmp2 = output[2][i] + output[5][i];\r
-tmp5 = output[2][i] - output[5][i];\r
-tmp3 = output[3][i] + output[4][i];\r
-tmp4 = output[3][i] - output[4][i];\r
-tmp10 = tmp0 + tmp3;\r
-tmp13 = tmp0 - tmp3;\r
-tmp11 = tmp1 + tmp2;\r
-tmp12 = tmp1 - tmp2;\r
-output[0][i] = tmp10 + tmp11;\r
-output[4][i] = tmp10 - tmp11;\r
-z1 = (tmp12 + tmp13) * 0.707106781;\r
-output[2][i] = tmp13 + z1;\r
-output[6][i] = tmp13 - z1;\r
-tmp10 = tmp4 + tmp5;\r
-tmp11 = tmp5 + tmp6;\r
-tmp12 = tmp6 + tmp7;\r
-z5 = (tmp10 - tmp12) * 0.382683433;\r
-z2 = 0.541196100 * tmp10 + z5;\r
-z4 = 1.306562965 * tmp12 + z5;\r
-z3 = tmp11 * 0.707106781;\r
-z11 = tmp7 + z3;\r
-z13 = tmp7 - z3;\r
-output[5][i] = z13 + z2;\r
-output[3][i] = z13 - z2;\r
-output[1][i] = z11 + z4;\r
-output[7][i] = z11 - z4;\r
-}\r
-return output;\r
-}, "~A");\r
-c$.quantizeBlock = Clazz.defineMethod (c$, "quantizeBlock", \r
-function (inputData, divisorsCode) {\r
-var outputData =  Clazz.newIntArray (64, 0);\r
-for (var i = 0, index = 0; i < 8; i++) for (var j = 0; j < 8; j++, index++) outputData[index] = (Math.round (inputData[i][j] * divisorsCode[index]));\r
-\r
-\r
-return outputData;\r
-}, "~A,~A");\r
-Clazz.defineStatics (c$,\r
-"N", 8,\r
-"NN", 64,\r
-"AANscaleFactor",  Clazz.newDoubleArray (-1, [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, 0.275899379]));\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.bufferPutBits = 0;\r
-this.bufferPutBuffer = 0;\r
-this.imageHeight = 0;\r
-this.imageWidth = 0;\r
-this.dc_matrix0 = null;\r
-this.ac_matrix0 = null;\r
-this.dc_matrix1 = null;\r
-this.ac_matrix1 = null;\r
-this.dc_matrix = null;\r
-this.ac_matrix = null;\r
-this.numOfDCTables = 0;\r
-this.numOfACTables = 0;\r
-Clazz.instantialize (this, arguments);\r
-}, javajs.img, "Huffman");\r
-Clazz.makeConstructor (c$, \r
-function (width, height) {\r
-this.initHuf ();\r
-this.imageWidth = width;\r
-this.imageHeight = height;\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "HuffmanBlockEncoder", \r
-function (out, zigzag, prec, dcCode, acCode) {\r
-var temp;\r
-var temp2;\r
-var nbits;\r
-var k;\r
-var r;\r
-var i;\r
-this.numOfDCTables = 2;\r
-this.numOfACTables = 2;\r
-var matrixDC = this.dc_matrix[dcCode];\r
-var matrixAC = this.ac_matrix[acCode];\r
-temp = temp2 = zigzag[0] - prec;\r
-if (temp < 0) {\r
-temp = -temp;\r
-temp2--;\r
-}nbits = 0;\r
-while (temp != 0) {\r
-nbits++;\r
-temp >>= 1;\r
-}\r
-this.bufferIt (out, matrixDC[nbits][0], matrixDC[nbits][1]);\r
-if (nbits != 0) {\r
-this.bufferIt (out, temp2, nbits);\r
-}r = 0;\r
-for (k = 1; k < 64; k++) {\r
-if ((temp = zigzag[javajs.img.Huffman.jpegNaturalOrder[k]]) == 0) {\r
-r++;\r
-} else {\r
-while (r > 15) {\r
-this.bufferIt (out, matrixAC[0xF0][0], matrixAC[0xF0][1]);\r
-r -= 16;\r
-}\r
-temp2 = temp;\r
-if (temp < 0) {\r
-temp = -temp;\r
-temp2--;\r
-}nbits = 1;\r
-while ((temp >>= 1) != 0) {\r
-nbits++;\r
-}\r
-i = (r << 4) + nbits;\r
-this.bufferIt (out, matrixAC[i][0], matrixAC[i][1]);\r
-this.bufferIt (out, temp2, nbits);\r
-r = 0;\r
-}}\r
-if (r > 0) {\r
-this.bufferIt (out, matrixAC[0][0], matrixAC[0][1]);\r
-}}, "javajs.util.OC,~A,~N,~N,~N");\r
-Clazz.defineMethod (c$, "bufferIt", \r
-function (out, code, size) {\r
-var putBuffer = code;\r
-var putBits = this.bufferPutBits;\r
-putBuffer &= (1 << size) - 1;\r
-putBits += size;\r
-putBuffer <<= 24 - putBits;\r
-putBuffer |= this.bufferPutBuffer;\r
-while (putBits >= 8) {\r
-var c = ((putBuffer >> 16) & 0xFF);\r
-out.writeByteAsInt (c);\r
-if (c == 0xFF) {\r
-out.writeByteAsInt (0);\r
-}putBuffer <<= 8;\r
-putBits -= 8;\r
-}\r
-this.bufferPutBuffer = putBuffer;\r
-this.bufferPutBits = putBits;\r
-}, "javajs.util.OC,~N,~N");\r
-Clazz.defineMethod (c$, "flushBuffer", \r
-function (out) {\r
-var putBuffer = this.bufferPutBuffer;\r
-var putBits = this.bufferPutBits;\r
-while (putBits >= 8) {\r
-var c = ((putBuffer >> 16) & 0xFF);\r
-out.writeByteAsInt (c);\r
-if (c == 0xFF) {\r
-out.writeByteAsInt (0);\r
-}putBuffer <<= 8;\r
-putBits -= 8;\r
-}\r
-if (putBits > 0) {\r
-var c = ((putBuffer >> 16) & 0xFF);\r
-out.writeByteAsInt (c);\r
-}}, "javajs.util.OC");\r
-Clazz.defineMethod (c$, "initHuf", \r
-($fz = function () {\r
-this.dc_matrix0 =  Clazz.newIntArray (12, 2, 0);\r
-this.dc_matrix1 =  Clazz.newIntArray (12, 2, 0);\r
-this.ac_matrix0 =  Clazz.newIntArray (255, 2, 0);\r
-this.ac_matrix1 =  Clazz.newIntArray (255, 2, 0);\r
-this.dc_matrix = javajs.util.AU.newInt3 (2, -1);\r
-this.ac_matrix = javajs.util.AU.newInt3 (2, -1);\r
-var p;\r
-var l;\r
-var i;\r
-var lastp;\r
-var si;\r
-var code;\r
-var huffsize =  Clazz.newIntArray (257, 0);\r
-var huffcode =  Clazz.newIntArray (257, 0);\r
-p = 0;\r
-for (l = 1; l <= 16; l++) {\r
-for (i = javajs.img.Huffman.bitsDCchrominance[l]; --i >= 0; ) {\r
-huffsize[p++] = l;\r
-}\r
-}\r
-huffsize[p] = 0;\r
-lastp = p;\r
-code = 0;\r
-si = huffsize[0];\r
-p = 0;\r
-while (huffsize[p] != 0) {\r
-while (huffsize[p] == si) {\r
-huffcode[p++] = code;\r
-code++;\r
-}\r
-code <<= 1;\r
-si++;\r
-}\r
-for (p = 0; p < lastp; p++) {\r
-this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][0] = huffcode[p];\r
-this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][1] = huffsize[p];\r
-}\r
-p = 0;\r
-for (l = 1; l <= 16; l++) {\r
-for (i = javajs.img.Huffman.bitsACchrominance[l]; --i >= 0; ) {\r
-huffsize[p++] = l;\r
-}\r
-}\r
-huffsize[p] = 0;\r
-lastp = p;\r
-code = 0;\r
-si = huffsize[0];\r
-p = 0;\r
-while (huffsize[p] != 0) {\r
-while (huffsize[p] == si) {\r
-huffcode[p++] = code;\r
-code++;\r
-}\r
-code <<= 1;\r
-si++;\r
-}\r
-for (p = 0; p < lastp; p++) {\r
-this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][0] = huffcode[p];\r
-this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][1] = huffsize[p];\r
-}\r
-p = 0;\r
-for (l = 1; l <= 16; l++) {\r
-for (i = javajs.img.Huffman.bitsDCluminance[l]; --i >= 0; ) {\r
-huffsize[p++] = l;\r
-}\r
-}\r
-huffsize[p] = 0;\r
-lastp = p;\r
-code = 0;\r
-si = huffsize[0];\r
-p = 0;\r
-while (huffsize[p] != 0) {\r
-while (huffsize[p] == si) {\r
-huffcode[p++] = code;\r
-code++;\r
-}\r
-code <<= 1;\r
-si++;\r
-}\r
-for (p = 0; p < lastp; p++) {\r
-this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][0] = huffcode[p];\r
-this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][1] = huffsize[p];\r
-}\r
-p = 0;\r
-for (l = 1; l <= 16; l++) {\r
-for (i = javajs.img.Huffman.bitsACluminance[l]; --i >= 0; ) {\r
-huffsize[p++] = l;\r
-}\r
-}\r
-huffsize[p] = 0;\r
-lastp = p;\r
-code = 0;\r
-si = huffsize[0];\r
-p = 0;\r
-while (huffsize[p] != 0) {\r
-while (huffsize[p] == si) {\r
-huffcode[p++] = code;\r
-code++;\r
-}\r
-code <<= 1;\r
-si++;\r
-}\r
-for (var q = 0; q < lastp; q++) {\r
-this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][0] = huffcode[q];\r
-this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][1] = huffsize[q];\r
-}\r
-this.dc_matrix[0] = this.dc_matrix0;\r
-this.dc_matrix[1] = this.dc_matrix1;\r
-this.ac_matrix[0] = this.ac_matrix0;\r
-this.ac_matrix[1] = this.ac_matrix1;\r
-}, $fz.isPrivate = true, $fz));\r
-Clazz.defineStatics (c$,\r
-"bitsDCluminance",  Clazz.newIntArray (-1, [0x00, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]),\r
-"valDCluminance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),\r
-"bitsDCchrominance",  Clazz.newIntArray (-1, [0x01, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),\r
-"valDCchrominance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),\r
-"bitsACluminance",  Clazz.newIntArray (-1, [0x10, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d]),\r
-"valACluminance",  Clazz.newIntArray (-1, [0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa]),\r
-"bitsACchrominance",  Clazz.newIntArray (-1, [0x11, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77]),\r
-"valACchrominance",  Clazz.newIntArray (-1, [0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa]),\r
-"jpegNaturalOrder",  Clazz.newIntArray (-1, [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]));\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.comment = null;\r
-this.imageHeight = 0;\r
-this.imageWidth = 0;\r
-this.blockWidth = null;\r
-this.blockHeight = null;\r
-this.precision = 8;\r
-this.numberOfComponents = 3;\r
-this.components = null;\r
-this.compID = null;\r
-this.hsampFactor = null;\r
-this.vsampFactor = null;\r
-this.qtableNumber = null;\r
-this.dctableNumber = null;\r
-this.actableNumber = null;\r
-this.lastColumnIsDummy = null;\r
-this.lastRowIsDummy = null;\r
-this.ss = 0;\r
-this.se = 63;\r
-this.ah = 0;\r
-this.al = 0;\r
-this.compWidth = null;\r
-this.compHeight = null;\r
-this.maxHsampFactor = 0;\r
-this.maxVsampFactor = 0;\r
-Clazz.instantialize (this, arguments);\r
-}, javajs.img, "JpegObj");\r
-Clazz.prepareFields (c$, function () {\r
-this.compID =  Clazz.newIntArray (-1, [1, 2, 3]);\r
-this.hsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);\r
-this.vsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);\r
-this.qtableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
-this.dctableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
-this.actableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
-this.lastColumnIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);\r
-this.lastRowIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);\r
-});\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-this.components = javajs.util.AU.newFloat3 (this.numberOfComponents, -1);\r
-this.compWidth =  Clazz.newIntArray (this.numberOfComponents, 0);\r
-this.compHeight =  Clazz.newIntArray (this.numberOfComponents, 0);\r
-this.blockWidth =  Clazz.newIntArray (this.numberOfComponents, 0);\r
-this.blockHeight =  Clazz.newIntArray (this.numberOfComponents, 0);\r
-});\r
-Clazz.defineMethod (c$, "getYCCArray", \r
-function (pixels) {\r
-this.maxHsampFactor = 1;\r
-this.maxVsampFactor = 1;\r
-for (var y = 0; y < this.numberOfComponents; y++) {\r
-this.maxHsampFactor = Math.max (this.maxHsampFactor, this.hsampFactor[y]);\r
-this.maxVsampFactor = Math.max (this.maxVsampFactor, this.vsampFactor[y]);\r
-}\r
-for (var y = 0; y < this.numberOfComponents; y++) {\r
-this.compWidth[y] = (Clazz.doubleToInt (((this.imageWidth % 8 != 0) ? (Clazz.doubleToInt (Math.ceil (this.imageWidth / 8.0))) * 8 : this.imageWidth) / this.maxHsampFactor)) * this.hsampFactor[y];\r
-if (this.compWidth[y] != ((Clazz.doubleToInt (this.imageWidth / this.maxHsampFactor)) * this.hsampFactor[y])) {\r
-this.lastColumnIsDummy[y] = true;\r
-}this.blockWidth[y] = Clazz.doubleToInt (Math.ceil (this.compWidth[y] / 8.0));\r
-this.compHeight[y] = (Clazz.doubleToInt (((this.imageHeight % 8 != 0) ? (Clazz.doubleToInt (Math.ceil (this.imageHeight / 8.0))) * 8 : this.imageHeight) / this.maxVsampFactor)) * this.vsampFactor[y];\r
-if (this.compHeight[y] != ((Clazz.doubleToInt (this.imageHeight / this.maxVsampFactor)) * this.vsampFactor[y])) {\r
-this.lastRowIsDummy[y] = true;\r
-}this.blockHeight[y] = Clazz.doubleToInt (Math.ceil (this.compHeight[y] / 8.0));\r
-}\r
-var Y =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
-var Cr1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
-var Cb1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
-for (var pt = 0, y = 0; y < this.imageHeight; ++y) {\r
-for (var x = 0; x < this.imageWidth; ++x, pt++) {\r
-var p = pixels[pt];\r
-var r = ((p >> 16) & 0xff);\r
-var g = ((p >> 8) & 0xff);\r
-var b = (p & 0xff);\r
-Y[y][x] = ((0.299 * r + 0.587 * g + 0.114 * b));\r
-Cb1[y][x] = 128 + ((-0.16874 * r - 0.33126 * g + 0.5 * b));\r
-Cr1[y][x] = 128 + ((0.5 * r - 0.41869 * g - 0.08131 * b));\r
-}\r
-}\r
-this.components[0] = Y;\r
-this.components[1] = Cb1;\r
-this.components[2] = Cr1;\r
-}, "~A");\r
-});\r
+Clazz.declarePackage ("javajs.img");
+Clazz.load (["javajs.img.ImageEncoder", "javajs.util.AU"], ["javajs.img.DCT", "$.JpgEncoder", "$.JpegObj", "$.Huffman"], null, function () {
+c$ = Clazz.decorateAsClass (function () {
+this.jpegObj = null;
+this.huf = null;
+this.dct = null;
+this.defaultQuality = 100;
+this.applicationTag = null;
+Clazz.instantialize (this, arguments);
+}, javajs.img, "JpgEncoder", javajs.img.ImageEncoder);
+Clazz.makeConstructor (c$, 
+function () {
+Clazz.superConstructor (this, javajs.img.JpgEncoder, []);
+});
+Clazz.overrideMethod (c$, "setParams", 
+function (params) {
+if (this.quality <= 0) this.quality = (params.containsKey ("qualityJPG") ? (params.get ("qualityJPG")).intValue () : this.defaultQuality);
+this.jpegObj =  new javajs.img.JpegObj ();
+this.jpegObj.comment = params.get ("comment");
+this.applicationTag = params.get ("jpgAppTag");
+}, "java.util.Map");
+Clazz.overrideMethod (c$, "generate", 
+function () {
+this.jpegObj.imageWidth = this.width;
+this.jpegObj.imageHeight = this.height;
+this.dct =  new javajs.img.DCT (this.quality);
+this.huf =  new javajs.img.Huffman (this.width, this.height);
+if (this.jpegObj == null) return;
+this.jpegObj.getYCCArray (this.pixels);
+var longState = this.writeHeaders (this.jpegObj, this.dct);
+this.writeCompressedData (this.jpegObj, this.dct, this.huf);
+this.writeMarker (javajs.img.JpgEncoder.eoi);
+if (longState != null) {
+var b = longState.getBytes ();
+this.out.write (b, 0, b.length);
+}});
+Clazz.defineMethod (c$, "writeCompressedData", 
+($fz = function (jpegObj, dct, huf) {
+var i;
+var j;
+var r;
+var c;
+var a;
+var b;
+var comp;
+var xpos;
+var ypos;
+var xblockoffset;
+var yblockoffset;
+var inputArray;
+var dctArray1 =  Clazz.newFloatArray (8, 8, 0);
+var dctArray2 =  Clazz.newDoubleArray (8, 8, 0);
+var dctArray3 =  Clazz.newIntArray (64, 0);
+var lastDCvalue =  Clazz.newIntArray (jpegObj.numberOfComponents, 0);
+var minBlockWidth;
+var minBlockHeight;
+minBlockWidth = ((huf.imageWidth % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageWidth / 8.0) + 1) * 8 : huf.imageWidth);
+minBlockHeight = ((huf.imageHeight % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageHeight / 8.0) + 1) * 8 : huf.imageHeight);
+for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {
+minBlockWidth = Math.min (minBlockWidth, jpegObj.blockWidth[comp]);
+minBlockHeight = Math.min (minBlockHeight, jpegObj.blockHeight[comp]);
+}
+xpos = 0;
+for (r = 0; r < minBlockHeight; r++) {
+for (c = 0; c < minBlockWidth; c++) {
+xpos = c * 8;
+ypos = r * 8;
+for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {
+inputArray = jpegObj.components[comp];
+var vsampF = jpegObj.vsampFactor[comp];
+var hsampF = jpegObj.hsampFactor[comp];
+var qNumber = jpegObj.qtableNumber[comp];
+var dcNumber = jpegObj.dctableNumber[comp];
+var acNumber = jpegObj.actableNumber[comp];
+for (i = 0; i < vsampF; i++) {
+for (j = 0; j < hsampF; j++) {
+xblockoffset = j * 8;
+yblockoffset = i * 8;
+for (a = 0; a < 8; a++) {
+for (b = 0; b < 8; b++) {
+dctArray1[a][b] = inputArray[ypos + yblockoffset + a][xpos + xblockoffset + b];
+}
+}
+dctArray2 = javajs.img.DCT.forwardDCT (dctArray1);
+dctArray3 = javajs.img.DCT.quantizeBlock (dctArray2, dct.divisors[qNumber]);
+huf.HuffmanBlockEncoder (this.out, dctArray3, lastDCvalue[comp], dcNumber, acNumber);
+lastDCvalue[comp] = dctArray3[0];
+}
+}
+}
+}
+}
+huf.flushBuffer (this.out);
+}, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT,javajs.img.Huffman");
+Clazz.defineMethod (c$, "writeHeaders", 
+($fz = function (jpegObj, dct) {
+var i;
+var j;
+var index;
+var offset;
+var tempArray;
+this.writeMarker (javajs.img.JpgEncoder.soi);
+this.writeArray (javajs.img.JpgEncoder.jfif);
+var comment = null;
+if (jpegObj.comment.length > 0) this.writeString (jpegObj.comment, 0xE1);
+this.writeString ("JPEG Encoder Copyright 1998, James R. Weeks and BioElectroMech.\n\n", 0xFE);
+var dqt =  Clazz.newByteArray (134, 0);
+dqt[0] = 0xFF;
+dqt[1] = 0xDB;
+dqt[2] = 0;
+dqt[3] = 132;
+offset = 4;
+for (i = 0; i < 2; i++) {
+dqt[offset++] = ((0) + i);
+tempArray = dct.quantum[i];
+for (j = 0; j < 64; j++) {
+dqt[offset++] = tempArray[javajs.img.Huffman.jpegNaturalOrder[j]];
+}
+}
+this.writeArray (dqt);
+var sof =  Clazz.newByteArray (19, 0);
+sof[0] = 0xFF;
+sof[1] = 0xC0;
+sof[2] = 0;
+sof[3] = 17;
+sof[4] = jpegObj.precision;
+sof[5] = ((jpegObj.imageHeight >> 8) & 0xFF);
+sof[6] = ((jpegObj.imageHeight) & 0xFF);
+sof[7] = ((jpegObj.imageWidth >> 8) & 0xFF);
+sof[8] = ((jpegObj.imageWidth) & 0xFF);
+sof[9] = jpegObj.numberOfComponents;
+index = 10;
+for (i = 0; i < sof[9]; i++) {
+sof[index++] = jpegObj.compID[i];
+sof[index++] = ((jpegObj.hsampFactor[i] << 4) + jpegObj.vsampFactor[i]);
+sof[index++] = jpegObj.qtableNumber[i];
+}
+this.writeArray (sof);
+this.WriteDHTHeader (javajs.img.Huffman.bitsDCluminance, javajs.img.Huffman.valDCluminance);
+this.WriteDHTHeader (javajs.img.Huffman.bitsACluminance, javajs.img.Huffman.valACluminance);
+this.WriteDHTHeader (javajs.img.Huffman.bitsDCchrominance, javajs.img.Huffman.valDCchrominance);
+this.WriteDHTHeader (javajs.img.Huffman.bitsACchrominance, javajs.img.Huffman.valACchrominance);
+var sos =  Clazz.newByteArray (14, 0);
+sos[0] = 0xFF;
+sos[1] = 0xDA;
+sos[2] = 0;
+sos[3] = 12;
+sos[4] = jpegObj.numberOfComponents;
+index = 5;
+for (i = 0; i < sos[4]; i++) {
+sos[index++] = jpegObj.compID[i];
+sos[index++] = ((jpegObj.dctableNumber[i] << 4) + jpegObj.actableNumber[i]);
+}
+sos[index++] = jpegObj.ss;
+sos[index++] = jpegObj.se;
+sos[index++] = ((jpegObj.ah << 4) + jpegObj.al);
+this.writeArray (sos);
+return comment;
+}, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT");
+Clazz.defineMethod (c$, "writeString", 
+($fz = function (s, id) {
+var len = s.length;
+var i0 = 0;
+var suffix = this.applicationTag;
+while (i0 < len) {
+var nBytes = len - i0;
+if (nBytes > 65510) {
+nBytes = 65500;
+var pt = s.lastIndexOf ('\n', i0 + nBytes);
+if (pt > i0 + 1) nBytes = pt - i0;
+}if (i0 + nBytes == len) suffix = "";
+this.writeTag (nBytes + suffix.length, id);
+this.writeArray (s.substring (i0, i0 + nBytes).getBytes ());
+if (suffix.length > 0) this.writeArray (suffix.getBytes ());
+i0 += nBytes;
+}
+}, $fz.isPrivate = true, $fz), "~S,~N");
+Clazz.defineMethod (c$, "writeTag", 
+($fz = function (length, id) {
+length += 2;
+var com =  Clazz.newByteArray (4, 0);
+com[0] = 0xFF;
+com[1] = id;
+com[2] = ((length >> 8) & 0xFF);
+com[3] = (length & 0xFF);
+this.writeArray (com);
+}, $fz.isPrivate = true, $fz), "~N,~N");
+Clazz.defineMethod (c$, "WriteDHTHeader", 
+function (bits, val) {
+var dht;
+var bytes = 0;
+for (var j = 1; j < 17; j++) bytes += bits[j];
+
+dht =  Clazz.newByteArray (21 + bytes, 0);
+dht[0] = 0xFF;
+dht[1] = 0xC4;
+var index = 4;
+for (var j = 0; j < 17; j++) dht[index++] = bits[j];
+
+for (var j = 0; j < bytes; j++) dht[index++] = val[j];
+
+dht[2] = (((index - 2) >> 8) & 0xFF);
+dht[3] = ((index - 2) & 0xFF);
+this.writeArray (dht);
+}, "~A,~A");
+Clazz.defineMethod (c$, "writeMarker", 
+function (data) {
+this.out.write (data, 0, 2);
+}, "~A");
+Clazz.defineMethod (c$, "writeArray", 
+function (data) {
+this.out.write (data, 0, data.length);
+}, "~A");
+Clazz.defineStatics (c$,
+"CONTINUE_MAX", 65500,
+"CONTINUE_MAX_BUFFER", 65510,
+"eoi",  Clazz.newByteArray (-1, [0xFF, 0xD9]),
+"jfif",  Clazz.newByteArray (-1, [0xff, 0xe0, 0, 16, 0x4a, 0x46, 0x49, 0x46, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0]),
+"soi",  Clazz.newByteArray (-1, [0xFF, 0xD8]));
+c$ = Clazz.decorateAsClass (function () {
+this.quantum = null;
+this.divisors = null;
+this.quantum_luminance = null;
+this.DivisorsLuminance = null;
+this.quantum_chrominance = null;
+this.DivisorsChrominance = null;
+Clazz.instantialize (this, arguments);
+}, javajs.img, "DCT");
+Clazz.prepareFields (c$, function () {
+this.quantum = javajs.util.AU.newInt2 (2);
+this.divisors = javajs.util.AU.newDouble2 (2);
+this.quantum_luminance =  Clazz.newIntArray (64, 0);
+this.DivisorsLuminance =  Clazz.newDoubleArray (64, 0);
+this.quantum_chrominance =  Clazz.newIntArray (64, 0);
+this.DivisorsChrominance =  Clazz.newDoubleArray (64, 0);
+});
+Clazz.makeConstructor (c$, 
+function (quality) {
+this.initMatrix (quality);
+}, "~N");
+Clazz.defineMethod (c$, "initMatrix", 
+($fz = function (quality) {
+quality = (quality < 1 ? 1 : quality > 100 ? 100 : quality);
+quality = (quality < 50 ? Clazz.doubleToInt (5000 / quality) : 200 - quality * 2);
+this.quantum_luminance[0] = 16;
+this.quantum_luminance[1] = 11;
+this.quantum_luminance[2] = 10;
+this.quantum_luminance[3] = 16;
+this.quantum_luminance[4] = 24;
+this.quantum_luminance[5] = 40;
+this.quantum_luminance[6] = 51;
+this.quantum_luminance[7] = 61;
+this.quantum_luminance[8] = 12;
+this.quantum_luminance[9] = 12;
+this.quantum_luminance[10] = 14;
+this.quantum_luminance[11] = 19;
+this.quantum_luminance[12] = 26;
+this.quantum_luminance[13] = 58;
+this.quantum_luminance[14] = 60;
+this.quantum_luminance[15] = 55;
+this.quantum_luminance[16] = 14;
+this.quantum_luminance[17] = 13;
+this.quantum_luminance[18] = 16;
+this.quantum_luminance[19] = 24;
+this.quantum_luminance[20] = 40;
+this.quantum_luminance[21] = 57;
+this.quantum_luminance[22] = 69;
+this.quantum_luminance[23] = 56;
+this.quantum_luminance[24] = 14;
+this.quantum_luminance[25] = 17;
+this.quantum_luminance[26] = 22;
+this.quantum_luminance[27] = 29;
+this.quantum_luminance[28] = 51;
+this.quantum_luminance[29] = 87;
+this.quantum_luminance[30] = 80;
+this.quantum_luminance[31] = 62;
+this.quantum_luminance[32] = 18;
+this.quantum_luminance[33] = 22;
+this.quantum_luminance[34] = 37;
+this.quantum_luminance[35] = 56;
+this.quantum_luminance[36] = 68;
+this.quantum_luminance[37] = 109;
+this.quantum_luminance[38] = 103;
+this.quantum_luminance[39] = 77;
+this.quantum_luminance[40] = 24;
+this.quantum_luminance[41] = 35;
+this.quantum_luminance[42] = 55;
+this.quantum_luminance[43] = 64;
+this.quantum_luminance[44] = 81;
+this.quantum_luminance[45] = 104;
+this.quantum_luminance[46] = 113;
+this.quantum_luminance[47] = 92;
+this.quantum_luminance[48] = 49;
+this.quantum_luminance[49] = 64;
+this.quantum_luminance[50] = 78;
+this.quantum_luminance[51] = 87;
+this.quantum_luminance[52] = 103;
+this.quantum_luminance[53] = 121;
+this.quantum_luminance[54] = 120;
+this.quantum_luminance[55] = 101;
+this.quantum_luminance[56] = 72;
+this.quantum_luminance[57] = 92;
+this.quantum_luminance[58] = 95;
+this.quantum_luminance[59] = 98;
+this.quantum_luminance[60] = 112;
+this.quantum_luminance[61] = 100;
+this.quantum_luminance[62] = 103;
+this.quantum_luminance[63] = 99;
+javajs.img.DCT.AANscale (this.DivisorsLuminance, this.quantum_luminance, quality);
+for (var i = 4; i < 64; i++) this.quantum_chrominance[i] = 99;
+
+this.quantum_chrominance[0] = 17;
+this.quantum_chrominance[1] = 18;
+this.quantum_chrominance[2] = 24;
+this.quantum_chrominance[3] = 47;
+this.quantum_chrominance[8] = 18;
+this.quantum_chrominance[9] = 21;
+this.quantum_chrominance[10] = 26;
+this.quantum_chrominance[11] = 66;
+this.quantum_chrominance[16] = 24;
+this.quantum_chrominance[17] = 26;
+this.quantum_chrominance[18] = 56;
+this.quantum_chrominance[24] = 47;
+this.quantum_chrominance[25] = 66;
+javajs.img.DCT.AANscale (this.DivisorsChrominance, this.quantum_chrominance, quality);
+this.quantum[0] = this.quantum_luminance;
+this.quantum[1] = this.quantum_chrominance;
+this.divisors[0] = this.DivisorsLuminance;
+this.divisors[1] = this.DivisorsChrominance;
+}, $fz.isPrivate = true, $fz), "~N");
+c$.AANscale = Clazz.defineMethod (c$, "AANscale", 
+($fz = function (divisors, values, quality) {
+for (var j = 0; j < 64; j++) {
+var temp = Clazz.doubleToInt ((values[j] * quality + 50) / 100);
+values[j] = (temp < 1 ? 1 : temp > 255 ? 255 : temp);
+}
+for (var i = 0, index = 0; i < 8; i++) for (var j = 0; j < 8; j++, index++) divisors[index] = (0.125 / (values[index] * javajs.img.DCT.AANscaleFactor[i] * javajs.img.DCT.AANscaleFactor[j]));
+
+
+}, $fz.isPrivate = true, $fz), "~A,~A,~N");
+c$.forwardDCT = Clazz.defineMethod (c$, "forwardDCT", 
+function (input) {
+var output =  Clazz.newDoubleArray (8, 8, 0);
+var tmp0;
+var tmp1;
+var tmp2;
+var tmp3;
+var tmp4;
+var tmp5;
+var tmp6;
+var tmp7;
+var tmp10;
+var tmp11;
+var tmp12;
+var tmp13;
+var z1;
+var z2;
+var z3;
+var z4;
+var z5;
+var z11;
+var z13;
+for (var i = 0; i < 8; i++) for (var j = 0; j < 8; j++) output[i][j] = (input[i][j] - 128.0);
+
+
+for (var i = 0; i < 8; i++) {
+tmp0 = output[i][0] + output[i][7];
+tmp7 = output[i][0] - output[i][7];
+tmp1 = output[i][1] + output[i][6];
+tmp6 = output[i][1] - output[i][6];
+tmp2 = output[i][2] + output[i][5];
+tmp5 = output[i][2] - output[i][5];
+tmp3 = output[i][3] + output[i][4];
+tmp4 = output[i][3] - output[i][4];
+tmp10 = tmp0 + tmp3;
+tmp13 = tmp0 - tmp3;
+tmp11 = tmp1 + tmp2;
+tmp12 = tmp1 - tmp2;
+output[i][0] = tmp10 + tmp11;
+output[i][4] = tmp10 - tmp11;
+z1 = (tmp12 + tmp13) * 0.707106781;
+output[i][2] = tmp13 + z1;
+output[i][6] = tmp13 - z1;
+tmp10 = tmp4 + tmp5;
+tmp11 = tmp5 + tmp6;
+tmp12 = tmp6 + tmp7;
+z5 = (tmp10 - tmp12) * 0.382683433;
+z2 = 0.541196100 * tmp10 + z5;
+z4 = 1.306562965 * tmp12 + z5;
+z3 = tmp11 * 0.707106781;
+z11 = tmp7 + z3;
+z13 = tmp7 - z3;
+output[i][5] = z13 + z2;
+output[i][3] = z13 - z2;
+output[i][1] = z11 + z4;
+output[i][7] = z11 - z4;
+}
+for (var i = 0; i < 8; i++) {
+tmp0 = output[0][i] + output[7][i];
+tmp7 = output[0][i] - output[7][i];
+tmp1 = output[1][i] + output[6][i];
+tmp6 = output[1][i] - output[6][i];
+tmp2 = output[2][i] + output[5][i];
+tmp5 = output[2][i] - output[5][i];
+tmp3 = output[3][i] + output[4][i];
+tmp4 = output[3][i] - output[4][i];
+tmp10 = tmp0 + tmp3;
+tmp13 = tmp0 - tmp3;
+tmp11 = tmp1 + tmp2;
+tmp12 = tmp1 - tmp2;
+output[0][i] = tmp10 + tmp11;
+output[4][i] = tmp10 - tmp11;
+z1 = (tmp12 + tmp13) * 0.707106781;
+output[2][i] = tmp13 + z1;
+output[6][i] = tmp13 - z1;
+tmp10 = tmp4 + tmp5;
+tmp11 = tmp5 + tmp6;
+tmp12 = tmp6 + tmp7;
+z5 = (tmp10 - tmp12) * 0.382683433;
+z2 = 0.541196100 * tmp10 + z5;
+z4 = 1.306562965 * tmp12 + z5;
+z3 = tmp11 * 0.707106781;
+z11 = tmp7 + z3;
+z13 = tmp7 - z3;
+output[5][i] = z13 + z2;
+output[3][i] = z13 - z2;
+output[1][i] = z11 + z4;
+output[7][i] = z11 - z4;
+}
+return output;
+}, "~A");
+c$.quantizeBlock = Clazz.defineMethod (c$, "quantizeBlock", 
+function (inputData, divisorsCode) {
+var outputData =  Clazz.newIntArray (64, 0);
+for (var i = 0, index = 0; i < 8; i++) for (var j = 0; j < 8; j++, index++) outputData[index] = (Math.round (inputData[i][j] * divisorsCode[index]));
+
+
+return outputData;
+}, "~A,~A");
+Clazz.defineStatics (c$,
+"N", 8,
+"NN", 64,
+"AANscaleFactor",  Clazz.newDoubleArray (-1, [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, 0.275899379]));
+c$ = Clazz.decorateAsClass (function () {
+this.bufferPutBits = 0;
+this.bufferPutBuffer = 0;
+this.imageHeight = 0;
+this.imageWidth = 0;
+this.dc_matrix0 = null;
+this.ac_matrix0 = null;
+this.dc_matrix1 = null;
+this.ac_matrix1 = null;
+this.dc_matrix = null;
+this.ac_matrix = null;
+this.numOfDCTables = 0;
+this.numOfACTables = 0;
+Clazz.instantialize (this, arguments);
+}, javajs.img, "Huffman");
+Clazz.makeConstructor (c$, 
+function (width, height) {
+this.initHuf ();
+this.imageWidth = width;
+this.imageHeight = height;
+}, "~N,~N");
+Clazz.defineMethod (c$, "HuffmanBlockEncoder", 
+function (out, zigzag, prec, dcCode, acCode) {
+var temp;
+var temp2;
+var nbits;
+var k;
+var r;
+var i;
+this.numOfDCTables = 2;
+this.numOfACTables = 2;
+var matrixDC = this.dc_matrix[dcCode];
+var matrixAC = this.ac_matrix[acCode];
+temp = temp2 = zigzag[0] - prec;
+if (temp < 0) {
+temp = -temp;
+temp2--;
+}nbits = 0;
+while (temp != 0) {
+nbits++;
+temp >>= 1;
+}
+this.bufferIt (out, matrixDC[nbits][0], matrixDC[nbits][1]);
+if (nbits != 0) {
+this.bufferIt (out, temp2, nbits);
+}r = 0;
+for (k = 1; k < 64; k++) {
+if ((temp = zigzag[javajs.img.Huffman.jpegNaturalOrder[k]]) == 0) {
+r++;
+} else {
+while (r > 15) {
+this.bufferIt (out, matrixAC[0xF0][0], matrixAC[0xF0][1]);
+r -= 16;
+}
+temp2 = temp;
+if (temp < 0) {
+temp = -temp;
+temp2--;
+}nbits = 1;
+while ((temp >>= 1) != 0) {
+nbits++;
+}
+i = (r << 4) + nbits;
+this.bufferIt (out, matrixAC[i][0], matrixAC[i][1]);
+this.bufferIt (out, temp2, nbits);
+r = 0;
+}}
+if (r > 0) {
+this.bufferIt (out, matrixAC[0][0], matrixAC[0][1]);
+}}, "javajs.util.OC,~A,~N,~N,~N");
+Clazz.defineMethod (c$, "bufferIt", 
+function (out, code, size) {
+var putBuffer = code;
+var putBits = this.bufferPutBits;
+putBuffer &= (1 << size) - 1;
+putBits += size;
+putBuffer <<= 24 - putBits;
+putBuffer |= this.bufferPutBuffer;
+while (putBits >= 8) {
+var c = ((putBuffer >> 16) & 0xFF);
+out.writeByteAsInt (c);
+if (c == 0xFF) {
+out.writeByteAsInt (0);
+}putBuffer <<= 8;
+putBits -= 8;
+}
+this.bufferPutBuffer = putBuffer;
+this.bufferPutBits = putBits;
+}, "javajs.util.OC,~N,~N");
+Clazz.defineMethod (c$, "flushBuffer", 
+function (out) {
+var putBuffer = this.bufferPutBuffer;
+var putBits = this.bufferPutBits;
+while (putBits >= 8) {
+var c = ((putBuffer >> 16) & 0xFF);
+out.writeByteAsInt (c);
+if (c == 0xFF) {
+out.writeByteAsInt (0);
+}putBuffer <<= 8;
+putBits -= 8;
+}
+if (putBits > 0) {
+var c = ((putBuffer >> 16) & 0xFF);
+out.writeByteAsInt (c);
+}}, "javajs.util.OC");
+Clazz.defineMethod (c$, "initHuf", 
+($fz = function () {
+this.dc_matrix0 =  Clazz.newIntArray (12, 2, 0);
+this.dc_matrix1 =  Clazz.newIntArray (12, 2, 0);
+this.ac_matrix0 =  Clazz.newIntArray (255, 2, 0);
+this.ac_matrix1 =  Clazz.newIntArray (255, 2, 0);
+this.dc_matrix = javajs.util.AU.newInt3 (2, -1);
+this.ac_matrix = javajs.util.AU.newInt3 (2, -1);
+var p;
+var l;
+var i;
+var lastp;
+var si;
+var code;
+var huffsize =  Clazz.newIntArray (257, 0);
+var huffcode =  Clazz.newIntArray (257, 0);
+p = 0;
+for (l = 1; l <= 16; l++) {
+for (i = javajs.img.Huffman.bitsDCchrominance[l]; --i >= 0; ) {
+huffsize[p++] = l;
+}
+}
+huffsize[p] = 0;
+lastp = p;
+code = 0;
+si = huffsize[0];
+p = 0;
+while (huffsize[p] != 0) {
+while (huffsize[p] == si) {
+huffcode[p++] = code;
+code++;
+}
+code <<= 1;
+si++;
+}
+for (p = 0; p < lastp; p++) {
+this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][0] = huffcode[p];
+this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][1] = huffsize[p];
+}
+p = 0;
+for (l = 1; l <= 16; l++) {
+for (i = javajs.img.Huffman.bitsACchrominance[l]; --i >= 0; ) {
+huffsize[p++] = l;
+}
+}
+huffsize[p] = 0;
+lastp = p;
+code = 0;
+si = huffsize[0];
+p = 0;
+while (huffsize[p] != 0) {
+while (huffsize[p] == si) {
+huffcode[p++] = code;
+code++;
+}
+code <<= 1;
+si++;
+}
+for (p = 0; p < lastp; p++) {
+this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][0] = huffcode[p];
+this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][1] = huffsize[p];
+}
+p = 0;
+for (l = 1; l <= 16; l++) {
+for (i = javajs.img.Huffman.bitsDCluminance[l]; --i >= 0; ) {
+huffsize[p++] = l;
+}
+}
+huffsize[p] = 0;
+lastp = p;
+code = 0;
+si = huffsize[0];
+p = 0;
+while (huffsize[p] != 0) {
+while (huffsize[p] == si) {
+huffcode[p++] = code;
+code++;
+}
+code <<= 1;
+si++;
+}
+for (p = 0; p < lastp; p++) {
+this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][0] = huffcode[p];
+this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][1] = huffsize[p];
+}
+p = 0;
+for (l = 1; l <= 16; l++) {
+for (i = javajs.img.Huffman.bitsACluminance[l]; --i >= 0; ) {
+huffsize[p++] = l;
+}
+}
+huffsize[p] = 0;
+lastp = p;
+code = 0;
+si = huffsize[0];
+p = 0;
+while (huffsize[p] != 0) {
+while (huffsize[p] == si) {
+huffcode[p++] = code;
+code++;
+}
+code <<= 1;
+si++;
+}
+for (var q = 0; q < lastp; q++) {
+this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][0] = huffcode[q];
+this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][1] = huffsize[q];
+}
+this.dc_matrix[0] = this.dc_matrix0;
+this.dc_matrix[1] = this.dc_matrix1;
+this.ac_matrix[0] = this.ac_matrix0;
+this.ac_matrix[1] = this.ac_matrix1;
+}, $fz.isPrivate = true, $fz));
+Clazz.defineStatics (c$,
+"bitsDCluminance",  Clazz.newIntArray (-1, [0x00, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]),
+"valDCluminance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
+"bitsDCchrominance",  Clazz.newIntArray (-1, [0x01, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),
+"valDCchrominance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
+"bitsACluminance",  Clazz.newIntArray (-1, [0x10, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d]),
+"valACluminance",  Clazz.newIntArray (-1, [0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa]),
+"bitsACchrominance",  Clazz.newIntArray (-1, [0x11, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77]),
+"valACchrominance",  Clazz.newIntArray (-1, [0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa]),
+"jpegNaturalOrder",  Clazz.newIntArray (-1, [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]));
+c$ = Clazz.decorateAsClass (function () {
+this.comment = null;
+this.imageHeight = 0;
+this.imageWidth = 0;
+this.blockWidth = null;
+this.blockHeight = null;
+this.precision = 8;
+this.numberOfComponents = 3;
+this.components = null;
+this.compID = null;
+this.hsampFactor = null;
+this.vsampFactor = null;
+this.qtableNumber = null;
+this.dctableNumber = null;
+this.actableNumber = null;
+this.lastColumnIsDummy = null;
+this.lastRowIsDummy = null;
+this.ss = 0;
+this.se = 63;
+this.ah = 0;
+this.al = 0;
+this.compWidth = null;
+this.compHeight = null;
+this.maxHsampFactor = 0;
+this.maxVsampFactor = 0;
+Clazz.instantialize (this, arguments);
+}, javajs.img, "JpegObj");
+Clazz.prepareFields (c$, function () {
+this.compID =  Clazz.newIntArray (-1, [1, 2, 3]);
+this.hsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);
+this.vsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);
+this.qtableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);
+this.dctableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);
+this.actableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);
+this.lastColumnIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);
+this.lastRowIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);
+});
+Clazz.makeConstructor (c$, 
+function () {
+this.components = javajs.util.AU.newFloat3 (this.numberOfComponents, -1);
+this.compWidth =  Clazz.newIntArray (this.numberOfComponents, 0);
+this.compHeight =  Clazz.newIntArray (this.numberOfComponents, 0);
+this.blockWidth =  Clazz.newIntArray (this.numberOfComponents, 0);
+this.blockHeight =  Clazz.newIntArray (this.numberOfComponents, 0);
+});
+Clazz.defineMethod (c$, "getYCCArray", 
+function (pixels) {
+this.maxHsampFactor = 1;
+this.maxVsampFactor = 1;
+for (var y = 0; y < this.numberOfComponents; y++) {
+this.maxHsampFactor = Math.max (this.maxHsampFactor, this.hsampFactor[y]);
+this.maxVsampFactor = Math.max (this.maxVsampFactor, this.vsampFactor[y]);
+}
+for (var y = 0; y < this.numberOfComponents; y++) {
+this.compWidth[y] = (Clazz.doubleToInt (((this.imageWidth % 8 != 0) ? (Clazz.doubleToInt (Math.ceil (this.imageWidth / 8.0))) * 8 : this.imageWidth) / this.maxHsampFactor)) * this.hsampFactor[y];
+if (this.compWidth[y] != ((Clazz.doubleToInt (this.imageWidth / this.maxHsampFactor)) * this.hsampFactor[y])) {
+this.lastColumnIsDummy[y] = true;
+}this.blockWidth[y] = Clazz.doubleToInt (Math.ceil (this.compWidth[y] / 8.0));
+this.compHeight[y] = (Clazz.doubleToInt (((this.imageHeight % 8 != 0) ? (Clazz.doubleToInt (Math.ceil (this.imageHeight / 8.0))) * 8 : this.imageHeight) / this.maxVsampFactor)) * this.vsampFactor[y];
+if (this.compHeight[y] != ((Clazz.doubleToInt (this.imageHeight / this.maxVsampFactor)) * this.vsampFactor[y])) {
+this.lastRowIsDummy[y] = true;
+}this.blockHeight[y] = Clazz.doubleToInt (Math.ceil (this.compHeight[y] / 8.0));
+}
+var Y =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);
+var Cr1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);
+var Cb1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);
+for (var pt = 0, y = 0; y < this.imageHeight; ++y) {
+for (var x = 0; x < this.imageWidth; ++x, pt++) {
+var p = pixels[pt];
+var r = ((p >> 16) & 0xff);
+var g = ((p >> 8) & 0xff);
+var b = (p & 0xff);
+Y[y][x] = ((0.299 * r + 0.587 * g + 0.114 * b));
+Cb1[y][x] = 128 + ((-0.16874 * r - 0.33126 * g + 0.5 * b));
+Cr1[y][x] = 128 + ((0.5 * r - 0.41869 * g - 0.08131 * b));
+}
+}
+this.components[0] = Y;
+this.components[1] = Cb1;
+this.components[2] = Cr1;
+}, "~A");
+});