JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / bin / javajs / img / JpgEncoder.js
1 Clazz.declarePackage ("javajs.img");\r
2 Clazz.load (["javajs.img.ImageEncoder", "javajs.util.AU"], ["javajs.img.DCT", "$.JpgEncoder", "$.JpegObj", "$.Huffman"], null, function () {\r
3 c$ = Clazz.decorateAsClass (function () {\r
4 this.jpegObj = null;\r
5 this.huf = null;\r
6 this.dct = null;\r
7 this.defaultQuality = 100;\r
8 this.applicationTag = null;\r
9 Clazz.instantialize (this, arguments);\r
10 }, javajs.img, "JpgEncoder", javajs.img.ImageEncoder);\r
11 Clazz.makeConstructor (c$, \r
12 function () {\r
13 Clazz.superConstructor (this, javajs.img.JpgEncoder, []);\r
14 });\r
15 Clazz.overrideMethod (c$, "setParams", \r
16 function (params) {\r
17 if (this.quality <= 0) this.quality = (params.containsKey ("qualityJPG") ? (params.get ("qualityJPG")).intValue () : this.defaultQuality);\r
18 this.jpegObj =  new javajs.img.JpegObj ();\r
19 this.jpegObj.comment = params.get ("comment");\r
20 this.applicationTag = params.get ("jpgAppTag");\r
21 }, "java.util.Map");\r
22 Clazz.overrideMethod (c$, "generate", \r
23 function () {\r
24 this.jpegObj.imageWidth = this.width;\r
25 this.jpegObj.imageHeight = this.height;\r
26 this.dct =  new javajs.img.DCT (this.quality);\r
27 this.huf =  new javajs.img.Huffman (this.width, this.height);\r
28 if (this.jpegObj == null) return;\r
29 this.jpegObj.getYCCArray (this.pixels);\r
30 var longState = this.writeHeaders (this.jpegObj, this.dct);\r
31 this.writeCompressedData (this.jpegObj, this.dct, this.huf);\r
32 this.writeMarker (javajs.img.JpgEncoder.eoi);\r
33 if (longState != null) {\r
34 var b = longState.getBytes ();\r
35 this.out.write (b, 0, b.length);\r
36 }});\r
37 Clazz.defineMethod (c$, "writeCompressedData", \r
38 ($fz = function (jpegObj, dct, huf) {\r
39 var i;\r
40 var j;\r
41 var r;\r
42 var c;\r
43 var a;\r
44 var b;\r
45 var comp;\r
46 var xpos;\r
47 var ypos;\r
48 var xblockoffset;\r
49 var yblockoffset;\r
50 var inputArray;\r
51 var dctArray1 =  Clazz.newFloatArray (8, 8, 0);\r
52 var dctArray2 =  Clazz.newDoubleArray (8, 8, 0);\r
53 var dctArray3 =  Clazz.newIntArray (64, 0);\r
54 var lastDCvalue =  Clazz.newIntArray (jpegObj.numberOfComponents, 0);\r
55 var minBlockWidth;\r
56 var minBlockHeight;\r
57 minBlockWidth = ((huf.imageWidth % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageWidth / 8.0) + 1) * 8 : huf.imageWidth);\r
58 minBlockHeight = ((huf.imageHeight % 8 != 0) ? Clazz.doubleToInt (Math.floor (huf.imageHeight / 8.0) + 1) * 8 : huf.imageHeight);\r
59 for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {\r
60 minBlockWidth = Math.min (minBlockWidth, jpegObj.blockWidth[comp]);\r
61 minBlockHeight = Math.min (minBlockHeight, jpegObj.blockHeight[comp]);\r
62 }\r
63 xpos = 0;\r
64 for (r = 0; r < minBlockHeight; r++) {\r
65 for (c = 0; c < minBlockWidth; c++) {\r
66 xpos = c * 8;\r
67 ypos = r * 8;\r
68 for (comp = 0; comp < jpegObj.numberOfComponents; comp++) {\r
69 inputArray = jpegObj.components[comp];\r
70 var vsampF = jpegObj.vsampFactor[comp];\r
71 var hsampF = jpegObj.hsampFactor[comp];\r
72 var qNumber = jpegObj.qtableNumber[comp];\r
73 var dcNumber = jpegObj.dctableNumber[comp];\r
74 var acNumber = jpegObj.actableNumber[comp];\r
75 for (i = 0; i < vsampF; i++) {\r
76 for (j = 0; j < hsampF; j++) {\r
77 xblockoffset = j * 8;\r
78 yblockoffset = i * 8;\r
79 for (a = 0; a < 8; a++) {\r
80 for (b = 0; b < 8; b++) {\r
81 dctArray1[a][b] = inputArray[ypos + yblockoffset + a][xpos + xblockoffset + b];\r
82 }\r
83 }\r
84 dctArray2 = javajs.img.DCT.forwardDCT (dctArray1);\r
85 dctArray3 = javajs.img.DCT.quantizeBlock (dctArray2, dct.divisors[qNumber]);\r
86 huf.HuffmanBlockEncoder (this.out, dctArray3, lastDCvalue[comp], dcNumber, acNumber);\r
87 lastDCvalue[comp] = dctArray3[0];\r
88 }\r
89 }\r
90 }\r
91 }\r
92 }\r
93 huf.flushBuffer (this.out);\r
94 }, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT,javajs.img.Huffman");\r
95 Clazz.defineMethod (c$, "writeHeaders", \r
96 ($fz = function (jpegObj, dct) {\r
97 var i;\r
98 var j;\r
99 var index;\r
100 var offset;\r
101 var tempArray;\r
102 this.writeMarker (javajs.img.JpgEncoder.soi);\r
103 this.writeArray (javajs.img.JpgEncoder.jfif);\r
104 var comment = null;\r
105 if (jpegObj.comment.length > 0) this.writeString (jpegObj.comment, 0xE1);\r
106 this.writeString ("JPEG Encoder Copyright 1998, James R. Weeks and BioElectroMech.\n\n", 0xFE);\r
107 var dqt =  Clazz.newByteArray (134, 0);\r
108 dqt[0] = 0xFF;\r
109 dqt[1] = 0xDB;\r
110 dqt[2] = 0;\r
111 dqt[3] = 132;\r
112 offset = 4;\r
113 for (i = 0; i < 2; i++) {\r
114 dqt[offset++] = ((0) + i);\r
115 tempArray = dct.quantum[i];\r
116 for (j = 0; j < 64; j++) {\r
117 dqt[offset++] = tempArray[javajs.img.Huffman.jpegNaturalOrder[j]];\r
118 }\r
119 }\r
120 this.writeArray (dqt);\r
121 var sof =  Clazz.newByteArray (19, 0);\r
122 sof[0] = 0xFF;\r
123 sof[1] = 0xC0;\r
124 sof[2] = 0;\r
125 sof[3] = 17;\r
126 sof[4] = jpegObj.precision;\r
127 sof[5] = ((jpegObj.imageHeight >> 8) & 0xFF);\r
128 sof[6] = ((jpegObj.imageHeight) & 0xFF);\r
129 sof[7] = ((jpegObj.imageWidth >> 8) & 0xFF);\r
130 sof[8] = ((jpegObj.imageWidth) & 0xFF);\r
131 sof[9] = jpegObj.numberOfComponents;\r
132 index = 10;\r
133 for (i = 0; i < sof[9]; i++) {\r
134 sof[index++] = jpegObj.compID[i];\r
135 sof[index++] = ((jpegObj.hsampFactor[i] << 4) + jpegObj.vsampFactor[i]);\r
136 sof[index++] = jpegObj.qtableNumber[i];\r
137 }\r
138 this.writeArray (sof);\r
139 this.WriteDHTHeader (javajs.img.Huffman.bitsDCluminance, javajs.img.Huffman.valDCluminance);\r
140 this.WriteDHTHeader (javajs.img.Huffman.bitsACluminance, javajs.img.Huffman.valACluminance);\r
141 this.WriteDHTHeader (javajs.img.Huffman.bitsDCchrominance, javajs.img.Huffman.valDCchrominance);\r
142 this.WriteDHTHeader (javajs.img.Huffman.bitsACchrominance, javajs.img.Huffman.valACchrominance);\r
143 var sos =  Clazz.newByteArray (14, 0);\r
144 sos[0] = 0xFF;\r
145 sos[1] = 0xDA;\r
146 sos[2] = 0;\r
147 sos[3] = 12;\r
148 sos[4] = jpegObj.numberOfComponents;\r
149 index = 5;\r
150 for (i = 0; i < sos[4]; i++) {\r
151 sos[index++] = jpegObj.compID[i];\r
152 sos[index++] = ((jpegObj.dctableNumber[i] << 4) + jpegObj.actableNumber[i]);\r
153 }\r
154 sos[index++] = jpegObj.ss;\r
155 sos[index++] = jpegObj.se;\r
156 sos[index++] = ((jpegObj.ah << 4) + jpegObj.al);\r
157 this.writeArray (sos);\r
158 return comment;\r
159 }, $fz.isPrivate = true, $fz), "javajs.img.JpegObj,javajs.img.DCT");\r
160 Clazz.defineMethod (c$, "writeString", \r
161 ($fz = function (s, id) {\r
162 var len = s.length;\r
163 var i0 = 0;\r
164 var suffix = this.applicationTag;\r
165 while (i0 < len) {\r
166 var nBytes = len - i0;\r
167 if (nBytes > 65510) {\r
168 nBytes = 65500;\r
169 var pt = s.lastIndexOf ('\n', i0 + nBytes);\r
170 if (pt > i0 + 1) nBytes = pt - i0;\r
171 }if (i0 + nBytes == len) suffix = "";\r
172 this.writeTag (nBytes + suffix.length, id);\r
173 this.writeArray (s.substring (i0, i0 + nBytes).getBytes ());\r
174 if (suffix.length > 0) this.writeArray (suffix.getBytes ());\r
175 i0 += nBytes;\r
176 }\r
177 }, $fz.isPrivate = true, $fz), "~S,~N");\r
178 Clazz.defineMethod (c$, "writeTag", \r
179 ($fz = function (length, id) {\r
180 length += 2;\r
181 var com =  Clazz.newByteArray (4, 0);\r
182 com[0] = 0xFF;\r
183 com[1] = id;\r
184 com[2] = ((length >> 8) & 0xFF);\r
185 com[3] = (length & 0xFF);\r
186 this.writeArray (com);\r
187 }, $fz.isPrivate = true, $fz), "~N,~N");\r
188 Clazz.defineMethod (c$, "WriteDHTHeader", \r
189 function (bits, val) {\r
190 var dht;\r
191 var bytes = 0;\r
192 for (var j = 1; j < 17; j++) bytes += bits[j];\r
193 \r
194 dht =  Clazz.newByteArray (21 + bytes, 0);\r
195 dht[0] = 0xFF;\r
196 dht[1] = 0xC4;\r
197 var index = 4;\r
198 for (var j = 0; j < 17; j++) dht[index++] = bits[j];\r
199 \r
200 for (var j = 0; j < bytes; j++) dht[index++] = val[j];\r
201 \r
202 dht[2] = (((index - 2) >> 8) & 0xFF);\r
203 dht[3] = ((index - 2) & 0xFF);\r
204 this.writeArray (dht);\r
205 }, "~A,~A");\r
206 Clazz.defineMethod (c$, "writeMarker", \r
207 function (data) {\r
208 this.out.write (data, 0, 2);\r
209 }, "~A");\r
210 Clazz.defineMethod (c$, "writeArray", \r
211 function (data) {\r
212 this.out.write (data, 0, data.length);\r
213 }, "~A");\r
214 Clazz.defineStatics (c$,\r
215 "CONTINUE_MAX", 65500,\r
216 "CONTINUE_MAX_BUFFER", 65510,\r
217 "eoi",  Clazz.newByteArray (-1, [0xFF, 0xD9]),\r
218 "jfif",  Clazz.newByteArray (-1, [0xff, 0xe0, 0, 16, 0x4a, 0x46, 0x49, 0x46, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0]),\r
219 "soi",  Clazz.newByteArray (-1, [0xFF, 0xD8]));\r
220 c$ = Clazz.decorateAsClass (function () {\r
221 this.quantum = null;\r
222 this.divisors = null;\r
223 this.quantum_luminance = null;\r
224 this.DivisorsLuminance = null;\r
225 this.quantum_chrominance = null;\r
226 this.DivisorsChrominance = null;\r
227 Clazz.instantialize (this, arguments);\r
228 }, javajs.img, "DCT");\r
229 Clazz.prepareFields (c$, function () {\r
230 this.quantum = javajs.util.AU.newInt2 (2);\r
231 this.divisors = javajs.util.AU.newDouble2 (2);\r
232 this.quantum_luminance =  Clazz.newIntArray (64, 0);\r
233 this.DivisorsLuminance =  Clazz.newDoubleArray (64, 0);\r
234 this.quantum_chrominance =  Clazz.newIntArray (64, 0);\r
235 this.DivisorsChrominance =  Clazz.newDoubleArray (64, 0);\r
236 });\r
237 Clazz.makeConstructor (c$, \r
238 function (quality) {\r
239 this.initMatrix (quality);\r
240 }, "~N");\r
241 Clazz.defineMethod (c$, "initMatrix", \r
242 ($fz = function (quality) {\r
243 quality = (quality < 1 ? 1 : quality > 100 ? 100 : quality);\r
244 quality = (quality < 50 ? Clazz.doubleToInt (5000 / quality) : 200 - quality * 2);\r
245 this.quantum_luminance[0] = 16;\r
246 this.quantum_luminance[1] = 11;\r
247 this.quantum_luminance[2] = 10;\r
248 this.quantum_luminance[3] = 16;\r
249 this.quantum_luminance[4] = 24;\r
250 this.quantum_luminance[5] = 40;\r
251 this.quantum_luminance[6] = 51;\r
252 this.quantum_luminance[7] = 61;\r
253 this.quantum_luminance[8] = 12;\r
254 this.quantum_luminance[9] = 12;\r
255 this.quantum_luminance[10] = 14;\r
256 this.quantum_luminance[11] = 19;\r
257 this.quantum_luminance[12] = 26;\r
258 this.quantum_luminance[13] = 58;\r
259 this.quantum_luminance[14] = 60;\r
260 this.quantum_luminance[15] = 55;\r
261 this.quantum_luminance[16] = 14;\r
262 this.quantum_luminance[17] = 13;\r
263 this.quantum_luminance[18] = 16;\r
264 this.quantum_luminance[19] = 24;\r
265 this.quantum_luminance[20] = 40;\r
266 this.quantum_luminance[21] = 57;\r
267 this.quantum_luminance[22] = 69;\r
268 this.quantum_luminance[23] = 56;\r
269 this.quantum_luminance[24] = 14;\r
270 this.quantum_luminance[25] = 17;\r
271 this.quantum_luminance[26] = 22;\r
272 this.quantum_luminance[27] = 29;\r
273 this.quantum_luminance[28] = 51;\r
274 this.quantum_luminance[29] = 87;\r
275 this.quantum_luminance[30] = 80;\r
276 this.quantum_luminance[31] = 62;\r
277 this.quantum_luminance[32] = 18;\r
278 this.quantum_luminance[33] = 22;\r
279 this.quantum_luminance[34] = 37;\r
280 this.quantum_luminance[35] = 56;\r
281 this.quantum_luminance[36] = 68;\r
282 this.quantum_luminance[37] = 109;\r
283 this.quantum_luminance[38] = 103;\r
284 this.quantum_luminance[39] = 77;\r
285 this.quantum_luminance[40] = 24;\r
286 this.quantum_luminance[41] = 35;\r
287 this.quantum_luminance[42] = 55;\r
288 this.quantum_luminance[43] = 64;\r
289 this.quantum_luminance[44] = 81;\r
290 this.quantum_luminance[45] = 104;\r
291 this.quantum_luminance[46] = 113;\r
292 this.quantum_luminance[47] = 92;\r
293 this.quantum_luminance[48] = 49;\r
294 this.quantum_luminance[49] = 64;\r
295 this.quantum_luminance[50] = 78;\r
296 this.quantum_luminance[51] = 87;\r
297 this.quantum_luminance[52] = 103;\r
298 this.quantum_luminance[53] = 121;\r
299 this.quantum_luminance[54] = 120;\r
300 this.quantum_luminance[55] = 101;\r
301 this.quantum_luminance[56] = 72;\r
302 this.quantum_luminance[57] = 92;\r
303 this.quantum_luminance[58] = 95;\r
304 this.quantum_luminance[59] = 98;\r
305 this.quantum_luminance[60] = 112;\r
306 this.quantum_luminance[61] = 100;\r
307 this.quantum_luminance[62] = 103;\r
308 this.quantum_luminance[63] = 99;\r
309 javajs.img.DCT.AANscale (this.DivisorsLuminance, this.quantum_luminance, quality);\r
310 for (var i = 4; i < 64; i++) this.quantum_chrominance[i] = 99;\r
311 \r
312 this.quantum_chrominance[0] = 17;\r
313 this.quantum_chrominance[1] = 18;\r
314 this.quantum_chrominance[2] = 24;\r
315 this.quantum_chrominance[3] = 47;\r
316 this.quantum_chrominance[8] = 18;\r
317 this.quantum_chrominance[9] = 21;\r
318 this.quantum_chrominance[10] = 26;\r
319 this.quantum_chrominance[11] = 66;\r
320 this.quantum_chrominance[16] = 24;\r
321 this.quantum_chrominance[17] = 26;\r
322 this.quantum_chrominance[18] = 56;\r
323 this.quantum_chrominance[24] = 47;\r
324 this.quantum_chrominance[25] = 66;\r
325 javajs.img.DCT.AANscale (this.DivisorsChrominance, this.quantum_chrominance, quality);\r
326 this.quantum[0] = this.quantum_luminance;\r
327 this.quantum[1] = this.quantum_chrominance;\r
328 this.divisors[0] = this.DivisorsLuminance;\r
329 this.divisors[1] = this.DivisorsChrominance;\r
330 }, $fz.isPrivate = true, $fz), "~N");\r
331 c$.AANscale = Clazz.defineMethod (c$, "AANscale", \r
332 ($fz = function (divisors, values, quality) {\r
333 for (var j = 0; j < 64; j++) {\r
334 var temp = Clazz.doubleToInt ((values[j] * quality + 50) / 100);\r
335 values[j] = (temp < 1 ? 1 : temp > 255 ? 255 : temp);\r
336 }\r
337 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
338 \r
339 \r
340 }, $fz.isPrivate = true, $fz), "~A,~A,~N");\r
341 c$.forwardDCT = Clazz.defineMethod (c$, "forwardDCT", \r
342 function (input) {\r
343 var output =  Clazz.newDoubleArray (8, 8, 0);\r
344 var tmp0;\r
345 var tmp1;\r
346 var tmp2;\r
347 var tmp3;\r
348 var tmp4;\r
349 var tmp5;\r
350 var tmp6;\r
351 var tmp7;\r
352 var tmp10;\r
353 var tmp11;\r
354 var tmp12;\r
355 var tmp13;\r
356 var z1;\r
357 var z2;\r
358 var z3;\r
359 var z4;\r
360 var z5;\r
361 var z11;\r
362 var z13;\r
363 for (var i = 0; i < 8; i++) for (var j = 0; j < 8; j++) output[i][j] = (input[i][j] - 128.0);\r
364 \r
365 \r
366 for (var i = 0; i < 8; i++) {\r
367 tmp0 = output[i][0] + output[i][7];\r
368 tmp7 = output[i][0] - output[i][7];\r
369 tmp1 = output[i][1] + output[i][6];\r
370 tmp6 = output[i][1] - output[i][6];\r
371 tmp2 = output[i][2] + output[i][5];\r
372 tmp5 = output[i][2] - output[i][5];\r
373 tmp3 = output[i][3] + output[i][4];\r
374 tmp4 = output[i][3] - output[i][4];\r
375 tmp10 = tmp0 + tmp3;\r
376 tmp13 = tmp0 - tmp3;\r
377 tmp11 = tmp1 + tmp2;\r
378 tmp12 = tmp1 - tmp2;\r
379 output[i][0] = tmp10 + tmp11;\r
380 output[i][4] = tmp10 - tmp11;\r
381 z1 = (tmp12 + tmp13) * 0.707106781;\r
382 output[i][2] = tmp13 + z1;\r
383 output[i][6] = tmp13 - z1;\r
384 tmp10 = tmp4 + tmp5;\r
385 tmp11 = tmp5 + tmp6;\r
386 tmp12 = tmp6 + tmp7;\r
387 z5 = (tmp10 - tmp12) * 0.382683433;\r
388 z2 = 0.541196100 * tmp10 + z5;\r
389 z4 = 1.306562965 * tmp12 + z5;\r
390 z3 = tmp11 * 0.707106781;\r
391 z11 = tmp7 + z3;\r
392 z13 = tmp7 - z3;\r
393 output[i][5] = z13 + z2;\r
394 output[i][3] = z13 - z2;\r
395 output[i][1] = z11 + z4;\r
396 output[i][7] = z11 - z4;\r
397 }\r
398 for (var i = 0; i < 8; i++) {\r
399 tmp0 = output[0][i] + output[7][i];\r
400 tmp7 = output[0][i] - output[7][i];\r
401 tmp1 = output[1][i] + output[6][i];\r
402 tmp6 = output[1][i] - output[6][i];\r
403 tmp2 = output[2][i] + output[5][i];\r
404 tmp5 = output[2][i] - output[5][i];\r
405 tmp3 = output[3][i] + output[4][i];\r
406 tmp4 = output[3][i] - output[4][i];\r
407 tmp10 = tmp0 + tmp3;\r
408 tmp13 = tmp0 - tmp3;\r
409 tmp11 = tmp1 + tmp2;\r
410 tmp12 = tmp1 - tmp2;\r
411 output[0][i] = tmp10 + tmp11;\r
412 output[4][i] = tmp10 - tmp11;\r
413 z1 = (tmp12 + tmp13) * 0.707106781;\r
414 output[2][i] = tmp13 + z1;\r
415 output[6][i] = tmp13 - z1;\r
416 tmp10 = tmp4 + tmp5;\r
417 tmp11 = tmp5 + tmp6;\r
418 tmp12 = tmp6 + tmp7;\r
419 z5 = (tmp10 - tmp12) * 0.382683433;\r
420 z2 = 0.541196100 * tmp10 + z5;\r
421 z4 = 1.306562965 * tmp12 + z5;\r
422 z3 = tmp11 * 0.707106781;\r
423 z11 = tmp7 + z3;\r
424 z13 = tmp7 - z3;\r
425 output[5][i] = z13 + z2;\r
426 output[3][i] = z13 - z2;\r
427 output[1][i] = z11 + z4;\r
428 output[7][i] = z11 - z4;\r
429 }\r
430 return output;\r
431 }, "~A");\r
432 c$.quantizeBlock = Clazz.defineMethod (c$, "quantizeBlock", \r
433 function (inputData, divisorsCode) {\r
434 var outputData =  Clazz.newIntArray (64, 0);\r
435 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
436 \r
437 \r
438 return outputData;\r
439 }, "~A,~A");\r
440 Clazz.defineStatics (c$,\r
441 "N", 8,\r
442 "NN", 64,\r
443 "AANscaleFactor",  Clazz.newDoubleArray (-1, [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, 0.275899379]));\r
444 c$ = Clazz.decorateAsClass (function () {\r
445 this.bufferPutBits = 0;\r
446 this.bufferPutBuffer = 0;\r
447 this.imageHeight = 0;\r
448 this.imageWidth = 0;\r
449 this.dc_matrix0 = null;\r
450 this.ac_matrix0 = null;\r
451 this.dc_matrix1 = null;\r
452 this.ac_matrix1 = null;\r
453 this.dc_matrix = null;\r
454 this.ac_matrix = null;\r
455 this.numOfDCTables = 0;\r
456 this.numOfACTables = 0;\r
457 Clazz.instantialize (this, arguments);\r
458 }, javajs.img, "Huffman");\r
459 Clazz.makeConstructor (c$, \r
460 function (width, height) {\r
461 this.initHuf ();\r
462 this.imageWidth = width;\r
463 this.imageHeight = height;\r
464 }, "~N,~N");\r
465 Clazz.defineMethod (c$, "HuffmanBlockEncoder", \r
466 function (out, zigzag, prec, dcCode, acCode) {\r
467 var temp;\r
468 var temp2;\r
469 var nbits;\r
470 var k;\r
471 var r;\r
472 var i;\r
473 this.numOfDCTables = 2;\r
474 this.numOfACTables = 2;\r
475 var matrixDC = this.dc_matrix[dcCode];\r
476 var matrixAC = this.ac_matrix[acCode];\r
477 temp = temp2 = zigzag[0] - prec;\r
478 if (temp < 0) {\r
479 temp = -temp;\r
480 temp2--;\r
481 }nbits = 0;\r
482 while (temp != 0) {\r
483 nbits++;\r
484 temp >>= 1;\r
485 }\r
486 this.bufferIt (out, matrixDC[nbits][0], matrixDC[nbits][1]);\r
487 if (nbits != 0) {\r
488 this.bufferIt (out, temp2, nbits);\r
489 }r = 0;\r
490 for (k = 1; k < 64; k++) {\r
491 if ((temp = zigzag[javajs.img.Huffman.jpegNaturalOrder[k]]) == 0) {\r
492 r++;\r
493 } else {\r
494 while (r > 15) {\r
495 this.bufferIt (out, matrixAC[0xF0][0], matrixAC[0xF0][1]);\r
496 r -= 16;\r
497 }\r
498 temp2 = temp;\r
499 if (temp < 0) {\r
500 temp = -temp;\r
501 temp2--;\r
502 }nbits = 1;\r
503 while ((temp >>= 1) != 0) {\r
504 nbits++;\r
505 }\r
506 i = (r << 4) + nbits;\r
507 this.bufferIt (out, matrixAC[i][0], matrixAC[i][1]);\r
508 this.bufferIt (out, temp2, nbits);\r
509 r = 0;\r
510 }}\r
511 if (r > 0) {\r
512 this.bufferIt (out, matrixAC[0][0], matrixAC[0][1]);\r
513 }}, "javajs.util.OC,~A,~N,~N,~N");\r
514 Clazz.defineMethod (c$, "bufferIt", \r
515 function (out, code, size) {\r
516 var putBuffer = code;\r
517 var putBits = this.bufferPutBits;\r
518 putBuffer &= (1 << size) - 1;\r
519 putBits += size;\r
520 putBuffer <<= 24 - putBits;\r
521 putBuffer |= this.bufferPutBuffer;\r
522 while (putBits >= 8) {\r
523 var c = ((putBuffer >> 16) & 0xFF);\r
524 out.writeByteAsInt (c);\r
525 if (c == 0xFF) {\r
526 out.writeByteAsInt (0);\r
527 }putBuffer <<= 8;\r
528 putBits -= 8;\r
529 }\r
530 this.bufferPutBuffer = putBuffer;\r
531 this.bufferPutBits = putBits;\r
532 }, "javajs.util.OC,~N,~N");\r
533 Clazz.defineMethod (c$, "flushBuffer", \r
534 function (out) {\r
535 var putBuffer = this.bufferPutBuffer;\r
536 var putBits = this.bufferPutBits;\r
537 while (putBits >= 8) {\r
538 var c = ((putBuffer >> 16) & 0xFF);\r
539 out.writeByteAsInt (c);\r
540 if (c == 0xFF) {\r
541 out.writeByteAsInt (0);\r
542 }putBuffer <<= 8;\r
543 putBits -= 8;\r
544 }\r
545 if (putBits > 0) {\r
546 var c = ((putBuffer >> 16) & 0xFF);\r
547 out.writeByteAsInt (c);\r
548 }}, "javajs.util.OC");\r
549 Clazz.defineMethod (c$, "initHuf", \r
550 ($fz = function () {\r
551 this.dc_matrix0 =  Clazz.newIntArray (12, 2, 0);\r
552 this.dc_matrix1 =  Clazz.newIntArray (12, 2, 0);\r
553 this.ac_matrix0 =  Clazz.newIntArray (255, 2, 0);\r
554 this.ac_matrix1 =  Clazz.newIntArray (255, 2, 0);\r
555 this.dc_matrix = javajs.util.AU.newInt3 (2, -1);\r
556 this.ac_matrix = javajs.util.AU.newInt3 (2, -1);\r
557 var p;\r
558 var l;\r
559 var i;\r
560 var lastp;\r
561 var si;\r
562 var code;\r
563 var huffsize =  Clazz.newIntArray (257, 0);\r
564 var huffcode =  Clazz.newIntArray (257, 0);\r
565 p = 0;\r
566 for (l = 1; l <= 16; l++) {\r
567 for (i = javajs.img.Huffman.bitsDCchrominance[l]; --i >= 0; ) {\r
568 huffsize[p++] = l;\r
569 }\r
570 }\r
571 huffsize[p] = 0;\r
572 lastp = p;\r
573 code = 0;\r
574 si = huffsize[0];\r
575 p = 0;\r
576 while (huffsize[p] != 0) {\r
577 while (huffsize[p] == si) {\r
578 huffcode[p++] = code;\r
579 code++;\r
580 }\r
581 code <<= 1;\r
582 si++;\r
583 }\r
584 for (p = 0; p < lastp; p++) {\r
585 this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][0] = huffcode[p];\r
586 this.dc_matrix1[javajs.img.Huffman.valDCchrominance[p]][1] = huffsize[p];\r
587 }\r
588 p = 0;\r
589 for (l = 1; l <= 16; l++) {\r
590 for (i = javajs.img.Huffman.bitsACchrominance[l]; --i >= 0; ) {\r
591 huffsize[p++] = l;\r
592 }\r
593 }\r
594 huffsize[p] = 0;\r
595 lastp = p;\r
596 code = 0;\r
597 si = huffsize[0];\r
598 p = 0;\r
599 while (huffsize[p] != 0) {\r
600 while (huffsize[p] == si) {\r
601 huffcode[p++] = code;\r
602 code++;\r
603 }\r
604 code <<= 1;\r
605 si++;\r
606 }\r
607 for (p = 0; p < lastp; p++) {\r
608 this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][0] = huffcode[p];\r
609 this.ac_matrix1[javajs.img.Huffman.valACchrominance[p]][1] = huffsize[p];\r
610 }\r
611 p = 0;\r
612 for (l = 1; l <= 16; l++) {\r
613 for (i = javajs.img.Huffman.bitsDCluminance[l]; --i >= 0; ) {\r
614 huffsize[p++] = l;\r
615 }\r
616 }\r
617 huffsize[p] = 0;\r
618 lastp = p;\r
619 code = 0;\r
620 si = huffsize[0];\r
621 p = 0;\r
622 while (huffsize[p] != 0) {\r
623 while (huffsize[p] == si) {\r
624 huffcode[p++] = code;\r
625 code++;\r
626 }\r
627 code <<= 1;\r
628 si++;\r
629 }\r
630 for (p = 0; p < lastp; p++) {\r
631 this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][0] = huffcode[p];\r
632 this.dc_matrix0[javajs.img.Huffman.valDCluminance[p]][1] = huffsize[p];\r
633 }\r
634 p = 0;\r
635 for (l = 1; l <= 16; l++) {\r
636 for (i = javajs.img.Huffman.bitsACluminance[l]; --i >= 0; ) {\r
637 huffsize[p++] = l;\r
638 }\r
639 }\r
640 huffsize[p] = 0;\r
641 lastp = p;\r
642 code = 0;\r
643 si = huffsize[0];\r
644 p = 0;\r
645 while (huffsize[p] != 0) {\r
646 while (huffsize[p] == si) {\r
647 huffcode[p++] = code;\r
648 code++;\r
649 }\r
650 code <<= 1;\r
651 si++;\r
652 }\r
653 for (var q = 0; q < lastp; q++) {\r
654 this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][0] = huffcode[q];\r
655 this.ac_matrix0[javajs.img.Huffman.valACluminance[q]][1] = huffsize[q];\r
656 }\r
657 this.dc_matrix[0] = this.dc_matrix0;\r
658 this.dc_matrix[1] = this.dc_matrix1;\r
659 this.ac_matrix[0] = this.ac_matrix0;\r
660 this.ac_matrix[1] = this.ac_matrix1;\r
661 }, $fz.isPrivate = true, $fz));\r
662 Clazz.defineStatics (c$,\r
663 "bitsDCluminance",  Clazz.newIntArray (-1, [0x00, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]),\r
664 "valDCluminance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),\r
665 "bitsDCchrominance",  Clazz.newIntArray (-1, [0x01, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),\r
666 "valDCchrominance",  Clazz.newIntArray (-1, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),\r
667 "bitsACluminance",  Clazz.newIntArray (-1, [0x10, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d]),\r
668 "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
669 "bitsACchrominance",  Clazz.newIntArray (-1, [0x11, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77]),\r
670 "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
671 "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
672 c$ = Clazz.decorateAsClass (function () {\r
673 this.comment = null;\r
674 this.imageHeight = 0;\r
675 this.imageWidth = 0;\r
676 this.blockWidth = null;\r
677 this.blockHeight = null;\r
678 this.precision = 8;\r
679 this.numberOfComponents = 3;\r
680 this.components = null;\r
681 this.compID = null;\r
682 this.hsampFactor = null;\r
683 this.vsampFactor = null;\r
684 this.qtableNumber = null;\r
685 this.dctableNumber = null;\r
686 this.actableNumber = null;\r
687 this.lastColumnIsDummy = null;\r
688 this.lastRowIsDummy = null;\r
689 this.ss = 0;\r
690 this.se = 63;\r
691 this.ah = 0;\r
692 this.al = 0;\r
693 this.compWidth = null;\r
694 this.compHeight = null;\r
695 this.maxHsampFactor = 0;\r
696 this.maxVsampFactor = 0;\r
697 Clazz.instantialize (this, arguments);\r
698 }, javajs.img, "JpegObj");\r
699 Clazz.prepareFields (c$, function () {\r
700 this.compID =  Clazz.newIntArray (-1, [1, 2, 3]);\r
701 this.hsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);\r
702 this.vsampFactor =  Clazz.newIntArray (-1, [1, 1, 1]);\r
703 this.qtableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
704 this.dctableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
705 this.actableNumber =  Clazz.newIntArray (-1, [0, 1, 1]);\r
706 this.lastColumnIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);\r
707 this.lastRowIsDummy =  Clazz.newBooleanArray (-1, [false, false, false]);\r
708 });\r
709 Clazz.makeConstructor (c$, \r
710 function () {\r
711 this.components = javajs.util.AU.newFloat3 (this.numberOfComponents, -1);\r
712 this.compWidth =  Clazz.newIntArray (this.numberOfComponents, 0);\r
713 this.compHeight =  Clazz.newIntArray (this.numberOfComponents, 0);\r
714 this.blockWidth =  Clazz.newIntArray (this.numberOfComponents, 0);\r
715 this.blockHeight =  Clazz.newIntArray (this.numberOfComponents, 0);\r
716 });\r
717 Clazz.defineMethod (c$, "getYCCArray", \r
718 function (pixels) {\r
719 this.maxHsampFactor = 1;\r
720 this.maxVsampFactor = 1;\r
721 for (var y = 0; y < this.numberOfComponents; y++) {\r
722 this.maxHsampFactor = Math.max (this.maxHsampFactor, this.hsampFactor[y]);\r
723 this.maxVsampFactor = Math.max (this.maxVsampFactor, this.vsampFactor[y]);\r
724 }\r
725 for (var y = 0; y < this.numberOfComponents; y++) {\r
726 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
727 if (this.compWidth[y] != ((Clazz.doubleToInt (this.imageWidth / this.maxHsampFactor)) * this.hsampFactor[y])) {\r
728 this.lastColumnIsDummy[y] = true;\r
729 }this.blockWidth[y] = Clazz.doubleToInt (Math.ceil (this.compWidth[y] / 8.0));\r
730 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
731 if (this.compHeight[y] != ((Clazz.doubleToInt (this.imageHeight / this.maxVsampFactor)) * this.vsampFactor[y])) {\r
732 this.lastRowIsDummy[y] = true;\r
733 }this.blockHeight[y] = Clazz.doubleToInt (Math.ceil (this.compHeight[y] / 8.0));\r
734 }\r
735 var Y =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
736 var Cr1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
737 var Cb1 =  Clazz.newFloatArray (this.compHeight[0], this.compWidth[0], 0);\r
738 for (var pt = 0, y = 0; y < this.imageHeight; ++y) {\r
739 for (var x = 0; x < this.imageWidth; ++x, pt++) {\r
740 var p = pixels[pt];\r
741 var r = ((p >> 16) & 0xff);\r
742 var g = ((p >> 8) & 0xff);\r
743 var b = (p & 0xff);\r
744 Y[y][x] = ((0.299 * r + 0.587 * g + 0.114 * b));\r
745 Cb1[y][x] = 128 + ((-0.16874 * r - 0.33126 * g + 0.5 * b));\r
746 Cr1[y][x] = 128 + ((0.5 * r - 0.41869 * g - 0.08131 * b));\r
747 }\r
748 }\r
749 this.components[0] = Y;\r
750 this.components[1] = Cb1;\r
751 this.components[2] = Cr1;\r
752 }, "~A");\r
753 });\r