annotate WebApplication/jpeg-decoder.js @ 3:ca16691db433

simplification
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 26 Feb 2015 11:39:28 +0100
parents 02f7a0400a91
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * SOURCE: https://github.com/notmasteryet/jpgjs/blob/master/jpg.js
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 **/
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 /*
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 Copyright 2011 notmasteryet
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 Licensed under the Apache License, Version 2.0 (the "License");
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 you may not use this file except in compliance with the License.
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 You may obtain a copy of the License at
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 http://www.apache.org/licenses/LICENSE-2.0
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 Unless required by applicable law or agreed to in writing, software
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 distributed under the License is distributed on an "AS IS" BASIS,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 See the License for the specific language governing permissions and
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 limitations under the License.
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 */
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 // (www.w3.org/Graphics/JPEG/itu-t81.pdf)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 // - The JFIF specification can be found in the JPEG File Interchange Format
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 // (www.w3.org/Graphics/JPEG/jfif3.pdf)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 // in PostScript Level 2, Technical Note #5116
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 var JpegImage = (function jpegImage() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 "use strict";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 var dctZigZag = new Int32Array([
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 0,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36 1, 8,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37 16, 9, 2,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 3, 10, 17, 24,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 32, 25, 18, 11, 4,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 5, 12, 19, 26, 33, 40,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 48, 41, 34, 27, 20, 13, 6,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 7, 14, 21, 28, 35, 42, 49, 56,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 57, 50, 43, 36, 29, 22, 15,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44 23, 30, 37, 44, 51, 58,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 59, 52, 45, 38, 31,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 39, 46, 53, 60,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 61, 54, 47,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 55, 62,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 63
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 ]);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 var dctCos1 = 4017 // cos(pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 var dctSin1 = 799 // sin(pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54 var dctCos3 = 3406 // cos(3*pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 var dctSin3 = 2276 // sin(3*pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 var dctCos6 = 1567 // cos(6*pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 var dctSin6 = 3784 // sin(6*pi/16)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 var dctSqrt2 = 5793 // sqrt(2)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 var dctSqrt1d2 = 2896 // sqrt(2) / 2
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 function constructor() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 function buildHuffmanTable(codeLengths, values) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 var k = 0, code = [], i, j, length = 16;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 while (length > 0 && !codeLengths[length - 1])
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 length--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 code.push({children: [], index: 0});
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69 var p = code[0], q;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 for (i = 0; i < length; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 for (j = 0; j < codeLengths[i]; j++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 p = code.pop();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 p.children[p.index] = values[k];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 while (p.index > 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 p = code.pop();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 p.index++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 code.push(p);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 while (code.length <= i) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 code.push(q = {children: [], index: 0});
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 p.children[p.index] = q.children;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 p = q;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84 k++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86 if (i + 1 < length) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 // p here points to last code
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 code.push(q = {children: [], index: 0});
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89 p.children[p.index] = q.children;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 p = q;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 return code[0].children;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 function getBlockBufferOffset(component, row, col) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97 return 64 * ((component.blocksPerLine + 1) * row + col);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 function decodeScan(data, offset,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 frame, components, resetInterval,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 spectralStart, spectralEnd,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 successivePrev, successive) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 var precision = frame.precision;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 var samplesPerLine = frame.samplesPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 var scanLines = frame.scanLines;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 var mcusPerLine = frame.mcusPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
108 var progressive = frame.progressive;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 var maxH = frame.maxH, maxV = frame.maxV;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111 var startOffset = offset, bitsData = 0, bitsCount = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
112
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
113 function readBit() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
114 if (bitsCount > 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
115 bitsCount--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
116 return (bitsData >> bitsCount) & 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
117 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
118 bitsData = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
119 if (bitsData == 0xFF) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 var nextByte = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
121 if (nextByte) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
122 throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
123 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
124 // unstuff 0
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
125 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
126 bitsCount = 7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 return bitsData >>> 7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
130 function decodeHuffman(tree) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
131 var node = tree;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 var bit;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
133 while ((bit = readBit()) !== null) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
134 node = node[bit];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
135 if (typeof node === 'number')
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 return node;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137 if (typeof node !== 'object')
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138 throw "invalid huffman sequence";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
139 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
140 return null;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
142
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
143 function receive(length) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
144 var n = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
145 while (length > 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
146 var bit = readBit();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
147 if (bit === null) return;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
148 n = (n << 1) | bit;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
149 length--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
150 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
151 return n;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
152 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
153
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
154 function receiveAndExtend(length) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 var n = receive(length);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
156 if (n >= 1 << (length - 1))
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157 return n;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
158 return n + (-1 << length) + 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
159 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
160
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
161 function decodeBaseline(component, offset) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
162 var t = decodeHuffman(component.huffmanTableDC);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
163 var diff = t === 0 ? 0 : receiveAndExtend(t);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164 component.blockData[offset] = (component.pred += diff);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
165 var k = 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
166 while (k < 64) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
167 var rs = decodeHuffman(component.huffmanTableAC);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
168 var s = rs & 15, r = rs >> 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
169 if (s === 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
170 if (r < 15)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
172 k += 16;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
173 continue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
174 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
175 k += r;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
176 var z = dctZigZag[k];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
177 component.blockData[offset + z] = receiveAndExtend(s);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
178 k++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
179 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
180 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
181
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
182 function decodeDCFirst(component, offset) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 var t = decodeHuffman(component.huffmanTableDC);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
185 component.blockData[offset] = (component.pred += diff);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
186 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
187
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
188 function decodeDCSuccessive(component, offset) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
189 component.blockData[offset] |= readBit() << successive;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
190 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
191
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
192 var eobrun = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
193 function decodeACFirst(component, offset) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
194 if (eobrun > 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
195 eobrun--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
196 return;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
197 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
198 var k = spectralStart, e = spectralEnd;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
199 while (k <= e) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
200 var rs = decodeHuffman(component.huffmanTableAC);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
201 var s = rs & 15, r = rs >> 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 if (s === 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
203 if (r < 15) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
204 eobrun = receive(r) + (1 << r) - 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
205 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
206 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
207 k += 16;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
208 continue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
209 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
210 k += r;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
211 var z = dctZigZag[k];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
212 component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
213 k++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
214 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
215 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
216
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
217 var successiveACState = 0, successiveACNextValue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
218 function decodeACSuccessive(component, offset) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
219 var k = spectralStart, e = spectralEnd, r = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
220 while (k <= e) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
221 var z = dctZigZag[k];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
222 switch (successiveACState) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
223 case 0: // initial state
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
224 var rs = decodeHuffman(component.huffmanTableAC);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
225 var s = rs & 15, r = rs >> 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
226 if (s === 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
227 if (r < 15) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
228 eobrun = receive(r) + (1 << r);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
229 successiveACState = 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
230 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
231 r = 16;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
232 successiveACState = 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
233 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
234 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
235 if (s !== 1)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
236 throw "invalid ACn encoding";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
237 successiveACNextValue = receiveAndExtend(s);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
238 successiveACState = r ? 2 : 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
239 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 continue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
241 case 1: // skipping r zero items
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
242 case 2:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
243 if (component.blockData[offset + z]) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
244 component.blockData[offset + z] += (readBit() << successive);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
245 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
246 r--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
247 if (r === 0)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
248 successiveACState = successiveACState == 2 ? 3 : 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
249 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
250 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
251 case 3: // set value for a zero item
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
252 if (component.blockData[offset + z]) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
253 component.blockData[offset + z] += (readBit() << successive);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
254 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
255 component.blockData[offset + z] = successiveACNextValue << successive;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
256 successiveACState = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
257 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
258 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
259 case 4: // eob
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
260 if (component.blockData[offset + z]) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
261 component.blockData[offset + z] += (readBit() << successive);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
262 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
263 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
264 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
265 k++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
266 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
267 if (successiveACState === 4) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
268 eobrun--;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
269 if (eobrun === 0)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
270 successiveACState = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
271 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
272 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
273
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
274 function decodeMcu(component, decode, mcu, row, col) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
275 var mcuRow = (mcu / mcusPerLine) | 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
276 var mcuCol = mcu % mcusPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
277 var blockRow = mcuRow * component.v + row;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
278 var blockCol = mcuCol * component.h + col;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
279 var offset = getBlockBufferOffset(component, blockRow, blockCol);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
280 decode(component, offset);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
281 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
282
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
283 function decodeBlock(component, decode, mcu) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
284 var blockRow = (mcu / component.blocksPerLine) | 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
285 var blockCol = mcu % component.blocksPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
286 var offset = getBlockBufferOffset(component, blockRow, blockCol);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
287 decode(component, offset);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
288 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
289
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
290 var componentsLength = components.length;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
291 var component, i, j, k, n;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
292 var decodeFn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
293 if (progressive) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
294 if (spectralStart === 0)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
295 decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
296 else
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
297 decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
298 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
299 decodeFn = decodeBaseline;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
300 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
301
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
302 var mcu = 0, marker;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
303 var mcuExpected;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
304 if (componentsLength == 1) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
305 mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
306 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
307 mcuExpected = mcusPerLine * frame.mcusPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
308 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
309 if (!resetInterval) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
310 resetInterval = mcuExpected;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
311 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
312
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
313 var h, v;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
314 while (mcu < mcuExpected) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
315 // reset interval stuff
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
316 for (i = 0; i < componentsLength; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
317 components[i].pred = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
318 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
319 eobrun = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
320
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
321 if (componentsLength == 1) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
322 component = components[0];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
323 for (n = 0; n < resetInterval; n++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
324 decodeBlock(component, decodeFn, mcu);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
325 mcu++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
326 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
327 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
328 for (n = 0; n < resetInterval; n++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
329 for (i = 0; i < componentsLength; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
330 component = components[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
331 h = component.h;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
332 v = component.v;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
333 for (j = 0; j < v; j++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
334 for (k = 0; k < h; k++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
335 decodeMcu(component, decodeFn, mcu, j, k);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
336 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
337 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
338 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
339 mcu++;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
340 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
341 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
342
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
343 // find marker
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
344 bitsCount = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
345 marker = (data[offset] << 8) | data[offset + 1];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
346 if (marker <= 0xFF00) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
347 throw "marker was not found";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
348 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
349
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
350 if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
351 offset += 2;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
352 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
353 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
354 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
355 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
356
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
357 return offset - startOffset;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
358 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
359
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
360 // A port of poppler's IDCT method which in turn is taken from:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
361 // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
362 // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
363 // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
364 // 988-991.
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
365 function quantizeAndInverse(component, blockBufferOffset, p) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
366 var qt = component.quantizationTable;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
367 var v0, v1, v2, v3, v4, v5, v6, v7, t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
368 var i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
369
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
370 // dequant
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
371 for (i = 0; i < 64; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
372 p[i] = component.blockData[blockBufferOffset + i] * qt[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
373 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
374
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
375 // inverse DCT on rows
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
376 for (i = 0; i < 8; ++i) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
377 var row = 8 * i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
378
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
379 // check for all-zero AC coefficients
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
380 if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
381 p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
382 p[7 + row] == 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
383 t = (dctSqrt2 * p[0 + row] + 512) >> 10;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
384 p[0 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
385 p[1 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
386 p[2 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
387 p[3 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
388 p[4 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
389 p[5 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
390 p[6 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
391 p[7 + row] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
392 continue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
393 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
394
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
395 // stage 4
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
396 v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
397 v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
398 v2 = p[2 + row];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
399 v3 = p[6 + row];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
400 v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
401 v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
402 v5 = p[3 + row] << 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
403 v6 = p[5 + row] << 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
404
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
405 // stage 3
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
406 t = (v0 - v1+ 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
407 v0 = (v0 + v1 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
408 v1 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
409 t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
410 v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
411 v3 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
412 t = (v4 - v6 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
413 v4 = (v4 + v6 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
414 v6 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
415 t = (v7 + v5 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
416 v5 = (v7 - v5 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
417 v7 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
418
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
419 // stage 2
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
420 t = (v0 - v3 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
421 v0 = (v0 + v3 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
422 v3 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
423 t = (v1 - v2 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
424 v1 = (v1 + v2 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
425 v2 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
426 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
427 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
428 v7 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
429 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
430 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
431 v6 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
432
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
433 // stage 1
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
434 p[0 + row] = v0 + v7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
435 p[7 + row] = v0 - v7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
436 p[1 + row] = v1 + v6;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
437 p[6 + row] = v1 - v6;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
438 p[2 + row] = v2 + v5;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
439 p[5 + row] = v2 - v5;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
440 p[3 + row] = v3 + v4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
441 p[4 + row] = v3 - v4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
442 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
443
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
444 // inverse DCT on columns
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
445 for (i = 0; i < 8; ++i) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
446 var col = i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
447
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
448 // check for all-zero AC coefficients
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
449 if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
450 p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
451 p[7*8 + col] == 0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
452 t = (dctSqrt2 * p[i+0] + 8192) >> 14;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
453 p[0*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
454 p[1*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
455 p[2*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
456 p[3*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
457 p[4*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
458 p[5*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
459 p[6*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
460 p[7*8 + col] = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
461 continue;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
462 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
463
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
464 // stage 4
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
465 v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
466 v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
467 v2 = p[2*8 + col];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
468 v3 = p[6*8 + col];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
469 v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
470 v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
471 v5 = p[3*8 + col];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
472 v6 = p[5*8 + col];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
473
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
474 // stage 3
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
475 t = (v0 - v1 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
476 v0 = (v0 + v1 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
477 v1 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
478 t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
479 v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
480 v3 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
481 t = (v4 - v6 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
482 v4 = (v4 + v6 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
483 v6 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
484 t = (v7 + v5 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
485 v5 = (v7 - v5 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
486 v7 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
487
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
488 // stage 2
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
489 t = (v0 - v3 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
490 v0 = (v0 + v3 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
491 v3 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
492 t = (v1 - v2 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
493 v1 = (v1 + v2 + 1) >> 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
494 v2 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
495 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
496 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
497 v7 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
498 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
499 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
500 v6 = t;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
501
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
502 // stage 1
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
503 p[0*8 + col] = v0 + v7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
504 p[7*8 + col] = v0 - v7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
505 p[1*8 + col] = v1 + v6;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
506 p[6*8 + col] = v1 - v6;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
507 p[2*8 + col] = v2 + v5;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
508 p[5*8 + col] = v2 - v5;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
509 p[3*8 + col] = v3 + v4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
510 p[4*8 + col] = v3 - v4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
511 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
512
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
513 // convert to 8-bit integers
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
514 for (i = 0; i < 64; ++i) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
515 var index = blockBufferOffset + i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
516 var q = p[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
517 q = (q <= -2056) ? 0 : (q >= 2024) ? 255 : (q + 2056) >> 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
518 component.blockData[index] = q;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
519 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
520 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
521
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
522 function buildComponentData(frame, component) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
523 var lines = [];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
524 var blocksPerLine = component.blocksPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
525 var blocksPerColumn = component.blocksPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
526 var samplesPerLine = blocksPerLine << 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
527 var computationBuffer = new Int32Array(64);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
528
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
529 var i, j, ll = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
530 for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
531 for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
532 var offset = getBlockBufferOffset(component, blockRow, blockCol)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
533 quantizeAndInverse(component, offset, computationBuffer);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
534 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
535 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
536 return component.blockData;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
537 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
538
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
539 function clampToUint8(a) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
540 return a <= 0 ? 0 : a >= 255 ? 255 : a | 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
541 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
542
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
543 constructor.prototype = {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
544 load: function load(path) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
545 var handleData = (function(data) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
546 this.parse(data);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
547 if (this.onload)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
548 this.onload();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
549 }).bind(this);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
550
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
551 if (path.indexOf("data:") > -1) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
552 var offset = path.indexOf("base64,")+7;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
553 var data = atob(path.substring(offset));
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
554 var arr = new Uint8Array(data.length);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
555 for (var i = data.length - 1; i >= 0; i--) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
556 arr[i] = data.charCodeAt(i);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
557 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
558 handleData(data);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
559 } else {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
560 var xhr = new XMLHttpRequest();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
561 xhr.open("GET", path, true);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
562 xhr.responseType = "arraybuffer";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
563 xhr.onload = (function() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
564 // TODO catch parse error
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
565 var data = new Uint8Array(xhr.response);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
566 handleData(data);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
567 }).bind(this);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
568 xhr.send(null);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
569 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
570 },
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
571
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
572 parse: function parse(data) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
573
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
574 function readUint16() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
575 var value = (data[offset] << 8) | data[offset + 1];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
576 offset += 2;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
577 return value;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
578 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
579
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
580 function readDataBlock() {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
581 var length = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
582 var array = data.subarray(offset, offset + length - 2);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
583 offset += array.length;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
584 return array;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
585 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
586
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
587 function prepareComponents(frame) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
588 var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
589 var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
590 for (var i = 0; i < frame.components.length; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
591 component = frame.components[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
592 var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
593 var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
594 var blocksPerLineForMcu = mcusPerLine * component.h;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
595 var blocksPerColumnForMcu = mcusPerColumn * component.v;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
596
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
597 var blocksBufferSize = 64 * blocksPerColumnForMcu
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
598 * (blocksPerLineForMcu + 1);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
599 component.blockData = new Int16Array(blocksBufferSize);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
600 component.blocksPerLine = blocksPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
601 component.blocksPerColumn = blocksPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
602 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
603 frame.mcusPerLine = mcusPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
604 frame.mcusPerColumn = mcusPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
605 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
606
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
607 var offset = 0, length = data.length;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
608 var jfif = null;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
609 var adobe = null;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
610 var pixels = null;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
611 var frame, resetInterval;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
612 var quantizationTables = [];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
613 var huffmanTablesAC = [], huffmanTablesDC = [];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
614 var fileMarker = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
615 if (fileMarker != 0xFFD8) { // SOI (Start of Image)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
616 throw "SOI not found";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
617 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
618
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
619 fileMarker = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
620 while (fileMarker != 0xFFD9) { // EOI (End of image)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
621 var i, j, l;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
622 switch(fileMarker) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
623 case 0xFFE0: // APP0 (Application Specific)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
624 case 0xFFE1: // APP1
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
625 case 0xFFE2: // APP2
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
626 case 0xFFE3: // APP3
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
627 case 0xFFE4: // APP4
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
628 case 0xFFE5: // APP5
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
629 case 0xFFE6: // APP6
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
630 case 0xFFE7: // APP7
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
631 case 0xFFE8: // APP8
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
632 case 0xFFE9: // APP9
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
633 case 0xFFEA: // APP10
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
634 case 0xFFEB: // APP11
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
635 case 0xFFEC: // APP12
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
636 case 0xFFED: // APP13
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
637 case 0xFFEE: // APP14
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
638 case 0xFFEF: // APP15
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
639 case 0xFFFE: // COM (Comment)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
640 var appData = readDataBlock();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
641
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
642 if (fileMarker === 0xFFE0) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
643 if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
644 appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
645 jfif = {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
646 version: { major: appData[5], minor: appData[6] },
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
647 densityUnits: appData[7],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
648 xDensity: (appData[8] << 8) | appData[9],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
649 yDensity: (appData[10] << 8) | appData[11],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
650 thumbWidth: appData[12],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
651 thumbHeight: appData[13],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
652 thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
653 };
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
654 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
655 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
656 // TODO APP1 - Exif
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
657 if (fileMarker === 0xFFEE) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
658 if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
659 appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
660 adobe = {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
661 version: appData[6],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
662 flags0: (appData[7] << 8) | appData[8],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
663 flags1: (appData[9] << 8) | appData[10],
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
664 transformCode: appData[11]
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
665 };
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
666 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
667 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
668 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
669
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
670 case 0xFFDB: // DQT (Define Quantization Tables)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
671 var quantizationTablesLength = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
672 var quantizationTablesEnd = quantizationTablesLength + offset - 2;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
673 while (offset < quantizationTablesEnd) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
674 var quantizationTableSpec = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
675 var tableData = new Int32Array(64);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
676 if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
677 for (j = 0; j < 64; j++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
678 var z = dctZigZag[j];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
679 tableData[z] = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
680 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
681 } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
682 for (j = 0; j < 64; j++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
683 var z = dctZigZag[j];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
684 tableData[z] = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
685 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
686 } else
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
687 throw "DQT: invalid table spec";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
688 quantizationTables[quantizationTableSpec & 15] = tableData;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
689 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
690 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
691
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
692 case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
693 case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
694 case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
695 if (frame) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
696 throw "Only single frame JPEGs supported";
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
697 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
698 readUint16(); // skip data length
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
699 frame = {};
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
700 frame.extended = (fileMarker === 0xFFC1);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
701 frame.progressive = (fileMarker === 0xFFC2);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
702 frame.precision = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
703 frame.scanLines = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
704 frame.samplesPerLine = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
705 frame.components = [];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
706 frame.componentIds = {};
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
707 var componentsCount = data[offset++], componentId;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
708 var maxH = 0, maxV = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
709 for (i = 0; i < componentsCount; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
710 componentId = data[offset];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
711 var h = data[offset + 1] >> 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
712 var v = data[offset + 1] & 15;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
713 if (maxH < h) maxH = h;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
714 if (maxV < v) maxV = v;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
715 var qId = data[offset + 2];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
716 var l = frame.components.push({
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
717 h: h,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
718 v: v,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
719 quantizationTable: quantizationTables[qId]
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
720 });
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
721 frame.componentIds[componentId] = l - 1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
722 offset += 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
723 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
724 frame.maxH = maxH;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
725 frame.maxV = maxV;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
726 prepareComponents(frame);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
727 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
728
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
729 case 0xFFC4: // DHT (Define Huffman Tables)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
730 var huffmanLength = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
731 for (i = 2; i < huffmanLength;) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
732 var huffmanTableSpec = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
733 var codeLengths = new Uint8Array(16);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
734 var codeLengthSum = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
735 for (j = 0; j < 16; j++, offset++)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
736 codeLengthSum += (codeLengths[j] = data[offset]);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
737 var huffmanValues = new Uint8Array(codeLengthSum);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
738 for (j = 0; j < codeLengthSum; j++, offset++)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
739 huffmanValues[j] = data[offset];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
740 i += 17 + codeLengthSum;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
741
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
742 ((huffmanTableSpec >> 4) === 0 ?
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
743 huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
744 buildHuffmanTable(codeLengths, huffmanValues);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
745 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
746 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
747
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
748 case 0xFFDD: // DRI (Define Restart Interval)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
749 readUint16(); // skip data length
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
750 resetInterval = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
751 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
752
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
753 case 0xFFDA: // SOS (Start of Scan)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
754 var scanLength = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
755 var selectorsCount = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
756 var components = [], component;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
757 for (i = 0; i < selectorsCount; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
758 var componentIndex = frame.componentIds[data[offset++]];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
759 component = frame.components[componentIndex];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
760 var tableSpec = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
761 component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
762 component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
763 components.push(component);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
764 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
765 var spectralStart = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
766 var spectralEnd = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
767 var successiveApproximation = data[offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
768 var processed = decodeScan(data, offset,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
769 frame, components, resetInterval,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
770 spectralStart, spectralEnd,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
771 successiveApproximation >> 4, successiveApproximation & 15);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
772 offset += processed;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
773 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
774 default:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
775 if (data[offset - 3] == 0xFF &&
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
776 data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
777 // could be incorrect encoding -- last 0xFF byte of the previous
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
778 // block was eaten by the encoder
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
779 offset -= 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
780 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
781 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
782 throw "unknown JPEG marker " + fileMarker.toString(16);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
783 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
784 fileMarker = readUint16();
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
785 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
786
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
787 this.width = frame.samplesPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
788 this.height = frame.scanLines;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
789 this.jfif = jfif;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
790 this.adobe = adobe;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
791 this.components = [];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
792 for (var i = 0; i < frame.components.length; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
793 var component = frame.components[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
794 this.components.push({
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
795 output: buildComponentData(frame, component),
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
796 scaleX: component.h / frame.maxH,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
797 scaleY: component.v / frame.maxV,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
798 blocksPerLine: component.blocksPerLine,
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
799 blocksPerColumn: component.blocksPerColumn
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
800 });
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
801 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
802 },
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
803
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
804 getData: function getData(width, height) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
805 var scaleX = this.width / width, scaleY = this.height / height;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
806
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
807 var component, componentScaleX, componentScaleY;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
808 var x, y, i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
809 var offset = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
810 var Y, Cb, Cr, K, C, M, Ye, R, G, B;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
811 var colorTransform;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
812 var numComponents = this.components.length;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
813 var dataLength = width * height * numComponents;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
814 var data = new Uint8Array(dataLength);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
815 var componentLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
816
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
817 // lineData is reused for all components. Assume first component is
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
818 // the biggest
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
819 var lineData = new Uint8Array((this.components[0].blocksPerLine << 3) *
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
820 this.components[0].blocksPerColumn * 8);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
821
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
822 // First construct image data ...
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
823 for (i = 0; i < numComponents; i++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
824 component = this.components[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
825 var blocksPerLine = component.blocksPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
826 var blocksPerColumn = component.blocksPerColumn;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
827 var samplesPerLine = blocksPerLine << 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
828
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
829 var j, k, ll = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
830 var lineOffset = 0;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
831 for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
832 var scanLine = blockRow << 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
833 for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
834 var bufferOffset = getBlockBufferOffset(component, blockRow, blockCol);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
835 var offset = 0, sample = blockCol << 3;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
836 for (j = 0; j < 8; j++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
837 var lineOffset = (scanLine + j) * samplesPerLine;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
838 for (k = 0; k < 8; k++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
839 lineData[lineOffset + sample + k] =
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
840 component.output[bufferOffset + offset++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
841 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
842 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
843 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
844 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
845
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
846 componentScaleX = component.scaleX * scaleX;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
847 componentScaleY = component.scaleY * scaleY;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
848 offset = i;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
849
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
850 var cx, cy;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
851 var index;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
852 for (y = 0; y < height; y++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
853 for (x = 0; x < width; x++) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
854 cy = 0 | (y * componentScaleY);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
855 cx = 0 | (x * componentScaleX);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
856 index = cy * samplesPerLine + cx;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
857 data[offset] = lineData[index];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
858 offset += numComponents;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
859 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
860 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
861 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
862
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
863 // ... then transform colors, if necessary
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
864 switch (numComponents) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
865 case 1: case 2: break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
866 // no color conversion for one or two compoenents
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
867
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
868 case 3:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
869 // The default transform for three components is true
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
870 colorTransform = true;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
871 // The adobe transform marker overrides any previous setting
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
872 if (this.adobe && this.adobe.transformCode)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
873 colorTransform = true;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
874 else if (typeof this.colorTransform !== 'undefined')
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
875 colorTransform = !!this.colorTransform;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
876
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
877 if (colorTransform) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
878 for (i = 0; i < dataLength; i += numComponents) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
879 Y = data[i ];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
880 Cb = data[i + 1];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
881 Cr = data[i + 2];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
882
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
883 R = clampToUint8(Y - 179.456 + 1.402 * Cr);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
884 G = clampToUint8(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
885 B = clampToUint8(Y - 226.816 + 1.772 * Cb);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
886
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
887 data[i ] = R;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
888 data[i + 1] = G;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
889 data[i + 2] = B;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
890 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
891 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
892 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
893 case 4:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
894 if (!this.adobe)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
895 throw 'Unsupported color mode (4 components)';
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
896 // The default transform for four components is false
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
897 colorTransform = false;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
898 // The adobe transform marker overrides any previous setting
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
899 if (this.adobe && this.adobe.transformCode)
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
900 colorTransform = true;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
901 else if (typeof this.colorTransform !== 'undefined')
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
902 colorTransform = !!this.colorTransform;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
903
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
904 if (colorTransform) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
905 for (i = 0; i < dataLength; i += numComponents) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
906 Y = data[i];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
907 Cb = data[i + 1];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
908 Cr = data[i + 2];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
909
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
910 C = clampToUint8(434.456 - Y - 1.402 * Cr);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
911 M = clampToUint8(119.541 - Y + 0.344 * Cb + 0.714 * Cr);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
912 Y = clampToUint8(481.816 - Y - 1.772 * Cb);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
913
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
914 data[i ] = C;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
915 data[i + 1] = M;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
916 data[i + 2] = Y;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
917 // K is unchanged
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
918 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
919 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
920 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
921 default:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
922 throw 'Unsupported color mode';
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
923 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
924 return data;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
925 },
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
926 copyToImageData: function copyToImageData(imageData) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
927 var width = imageData.width, height = imageData.height;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
928 var imageDataBytes = width * height * 4;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
929 var imageDataArray = imageData.data;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
930 var data = this.getData(width, height);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
931 var i = 0, j = 0, k0, k1;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
932 var Y, K, C, M, R, G, B;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
933 switch (this.components.length) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
934 case 1:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
935 while (j < imageDataBytes) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
936 Y = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
937
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
938 imageDataArray[j++] = Y;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
939 imageDataArray[j++] = Y;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
940 imageDataArray[j++] = Y;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
941 imageDataArray[j++] = 255;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
942 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
943 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
944 case 3:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
945 while (j < imageDataBytes) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
946 R = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
947 G = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
948 B = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
949
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
950 imageDataArray[j++] = R;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
951 imageDataArray[j++] = G;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
952 imageDataArray[j++] = B;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
953 imageDataArray[j++] = 255;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
954 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
955 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
956 case 4:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
957 while (j < imageDataBytes) {
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
958 C = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
959 M = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
960 Y = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
961 K = data[i++];
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
962
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
963 k0 = 255 - K;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
964 k1 = k0 / 255;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
965
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
966
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
967 R = clampToUint8(k0 - C * k1);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
968 G = clampToUint8(k0 - M * k1);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
969 B = clampToUint8(k0 - Y * k1);
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
970
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
971 imageDataArray[j++] = R;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
972 imageDataArray[j++] = G;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
973 imageDataArray[j++] = B;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
974 imageDataArray[j++] = 255;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
975 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
976 break;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
977 default:
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
978 throw 'Unsupported color mode';
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
979 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
980 }
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
981 };
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
982
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
983 return constructor;
02f7a0400a91 initial commit
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
984 })();