|
|
|
@ -139,7 +139,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -139,7 +139,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var code = readUint16(data, position); |
|
|
|
|
position += 2; |
|
|
|
|
|
|
|
|
|
var length = 0, j; |
|
|
|
|
var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; |
|
|
|
|
switch (code) { |
|
|
|
|
case 0xFF4F: // Start of codestream (SOC)
|
|
|
|
|
context.mainHeader = true; |
|
|
|
@ -181,8 +181,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -181,8 +181,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
length = readUint16(data, position); |
|
|
|
|
var qcd = {}; |
|
|
|
|
j = position + 2; |
|
|
|
|
var sqcd = data[j++]; |
|
|
|
|
var spqcdSize, scalarExpounded; |
|
|
|
|
sqcd = data[j++]; |
|
|
|
|
switch (sqcd & 0x1F) { |
|
|
|
|
case 0: |
|
|
|
|
spqcdSize = 8; |
|
|
|
@ -202,7 +201,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -202,7 +201,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
qcd.noQuantization = (spqcdSize == 8); |
|
|
|
|
qcd.scalarExpounded = scalarExpounded; |
|
|
|
|
qcd.guardBits = sqcd >> 5; |
|
|
|
|
var spqcds = []; |
|
|
|
|
spqcds = []; |
|
|
|
|
while (j < length + position) { |
|
|
|
|
var spqcd = {}; |
|
|
|
|
if (spqcdSize == 8) { |
|
|
|
@ -234,8 +233,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -234,8 +233,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
cqcc = readUint16(data, j); |
|
|
|
|
j += 2; |
|
|
|
|
} |
|
|
|
|
var sqcd = data[j++]; |
|
|
|
|
var spqcdSize, scalarExpounded; |
|
|
|
|
sqcd = data[j++]; |
|
|
|
|
switch (sqcd & 0x1F) { |
|
|
|
|
case 0: |
|
|
|
|
spqcdSize = 8; |
|
|
|
@ -255,9 +253,9 @@ var JpxImage = (function JpxImageClosure() {
@@ -255,9 +253,9 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
qcc.noQuantization = (spqcdSize == 8); |
|
|
|
|
qcc.scalarExpounded = scalarExpounded; |
|
|
|
|
qcc.guardBits = sqcd >> 5; |
|
|
|
|
var spqcds = []; |
|
|
|
|
spqcds = []; |
|
|
|
|
while (j < (length + position)) { |
|
|
|
|
var spqcd = {}; |
|
|
|
|
spqcd = {}; |
|
|
|
|
if (spqcdSize == 8) { |
|
|
|
|
spqcd.epsilon = data[j++] >> 3; |
|
|
|
|
spqcd.mu = 0; |
|
|
|
@ -330,7 +328,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -330,7 +328,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
break; |
|
|
|
|
case 0xFF90: // Start of tile-part (SOT)
|
|
|
|
|
length = readUint16(data, position); |
|
|
|
|
var tile = {}; |
|
|
|
|
tile = {}; |
|
|
|
|
tile.index = readUint16(data, position + 2); |
|
|
|
|
tile.length = readUint32(data, position + 4); |
|
|
|
|
tile.dataEnd = tile.length + position - 2; |
|
|
|
@ -348,7 +346,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -348,7 +346,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
context.currentTile = tile; |
|
|
|
|
break; |
|
|
|
|
case 0xFF93: // Start of data (SOD)
|
|
|
|
|
var tile = context.currentTile; |
|
|
|
|
tile = context.currentTile; |
|
|
|
|
if (tile.partIndex === 0) { |
|
|
|
|
initializeTile(context, tile.index); |
|
|
|
|
buildPackets(context); |
|
|
|
@ -409,12 +407,12 @@ var JpxImage = (function JpxImageClosure() {
@@ -409,12 +407,12 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
function calculateTileGrids(context, components) { |
|
|
|
|
var siz = context.SIZ; |
|
|
|
|
// Section B.3 Division into tile and tile-components
|
|
|
|
|
var tiles = []; |
|
|
|
|
var tile, tiles = []; |
|
|
|
|
var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); |
|
|
|
|
var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); |
|
|
|
|
for (var q = 0; q < numYtiles; q++) { |
|
|
|
|
for (var p = 0; p < numXtiles; p++) { |
|
|
|
|
var tile = {}; |
|
|
|
|
tile = {}; |
|
|
|
|
tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); |
|
|
|
|
tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); |
|
|
|
|
tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); |
|
|
|
@ -432,7 +430,8 @@ var JpxImage = (function JpxImageClosure() {
@@ -432,7 +430,8 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var component = components[i]; |
|
|
|
|
var tileComponents = []; |
|
|
|
|
for (var j = 0, jj = tiles.length; j < jj; j++) { |
|
|
|
|
var tileComponent = {}, tile = tiles[j]; |
|
|
|
|
var tileComponent = {}; |
|
|
|
|
tile = tiles[j]; |
|
|
|
|
tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); |
|
|
|
|
tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); |
|
|
|
|
tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); |
|
|
|
@ -498,9 +497,10 @@ var JpxImage = (function JpxImageClosure() {
@@ -498,9 +497,10 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var precinctParameters = subband.resolution.precinctParameters; |
|
|
|
|
var codeblocks = []; |
|
|
|
|
var precincts = []; |
|
|
|
|
for (var j = cby0; j < cby1; j++) { |
|
|
|
|
for (var i = cbx0; i < cbx1; i++) { |
|
|
|
|
var codeblock = { |
|
|
|
|
var i, ii, j, codeblock, precinctNumber; |
|
|
|
|
for (j = cby0; j < cby1; j++) { |
|
|
|
|
for (i = cbx0; i < cbx1; i++) { |
|
|
|
|
codeblock = { |
|
|
|
|
cbx: i, |
|
|
|
|
cby: j, |
|
|
|
|
tbx0: codeblockWidth * i, |
|
|
|
@ -515,8 +515,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -515,8 +515,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var pj = Math.floor((codeblock.tby0 - |
|
|
|
|
precinctParameters.precinctYOffset) / |
|
|
|
|
precinctParameters.precinctHeight); |
|
|
|
|
var precinctNumber = pj + |
|
|
|
|
pi * precinctParameters.numprecinctswide; |
|
|
|
|
precinctNumber = pj + pi * precinctParameters.numprecinctswide; |
|
|
|
|
codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); |
|
|
|
|
codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); |
|
|
|
|
codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); |
|
|
|
@ -816,19 +815,20 @@ var JpxImage = (function JpxImageClosure() {
@@ -816,19 +815,20 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
var layerNumber = packet.layerNumber; |
|
|
|
|
var queue = []; |
|
|
|
|
var queue = [], codeblock; |
|
|
|
|
for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { |
|
|
|
|
var codeblock = packet.codeblocks[i]; |
|
|
|
|
codeblock = packet.codeblocks[i]; |
|
|
|
|
var precinct = codeblock.precinct; |
|
|
|
|
var codeblockColumn = codeblock.cbx - precinct.cbxMin; |
|
|
|
|
var codeblockRow = codeblock.cby - precinct.cbyMin; |
|
|
|
|
var codeblockIncluded = false; |
|
|
|
|
var firstTimeInclusion = false; |
|
|
|
|
var valueReady; |
|
|
|
|
if ('included' in codeblock) { |
|
|
|
|
codeblockIncluded = !!readBits(1); |
|
|
|
|
} else { |
|
|
|
|
// reading inclusion tree
|
|
|
|
|
var precinct = codeblock.precinct; |
|
|
|
|
precinct = codeblock.precinct; |
|
|
|
|
var inclusionTree, zeroBitPlanesTree; |
|
|
|
|
if ('inclusionTree' in precinct) { |
|
|
|
|
inclusionTree = precinct.inclusionTree; |
|
|
|
@ -845,7 +845,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -845,7 +845,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { |
|
|
|
|
while (true) { |
|
|
|
|
if (readBits(1)) { |
|
|
|
|
var valueReady = !inclusionTree.nextLevel(); |
|
|
|
|
valueReady = !inclusionTree.nextLevel(); |
|
|
|
|
if (valueReady) { |
|
|
|
|
codeblock.included = true; |
|
|
|
|
codeblockIncluded = firstTimeInclusion = true; |
|
|
|
@ -866,7 +866,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -866,7 +866,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); |
|
|
|
|
while (true) { |
|
|
|
|
if (readBits(1)) { |
|
|
|
|
var valueReady = !zeroBitPlanesTree.nextLevel(); |
|
|
|
|
valueReady = !zeroBitPlanesTree.nextLevel(); |
|
|
|
|
if (valueReady) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -894,7 +894,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -894,7 +894,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
alignToByte(); |
|
|
|
|
while (queue.length > 0) { |
|
|
|
|
var packetItem = queue.shift(); |
|
|
|
|
var codeblock = packetItem.codeblock; |
|
|
|
|
codeblock = packetItem.codeblock; |
|
|
|
|
if (!('data' in codeblock)) { |
|
|
|
|
codeblock.data = []; |
|
|
|
|
} |
|
|
|
@ -930,14 +930,15 @@ var JpxImage = (function JpxImageClosure() {
@@ -930,14 +930,15 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
|
|
|
|
|
// collect data
|
|
|
|
|
var data = codeblock.data, totalLength = 0, codingpasses = 0; |
|
|
|
|
for (var q = 0, qq = data.length; q < qq; q++) { |
|
|
|
|
var dataItem = data[q]; |
|
|
|
|
var q, qq, dataItem; |
|
|
|
|
for (q = 0, qq = data.length; q < qq; q++) { |
|
|
|
|
dataItem = data[q]; |
|
|
|
|
totalLength += dataItem.end - dataItem.start; |
|
|
|
|
codingpasses += dataItem.codingpasses; |
|
|
|
|
} |
|
|
|
|
var encodedData = new Uint8Array(totalLength), k = 0; |
|
|
|
|
for (var q = 0, qq = data.length; q < qq; q++) { |
|
|
|
|
var dataItem = data[q]; |
|
|
|
|
for (q = 0, qq = data.length; q < qq; q++) { |
|
|
|
|
dataItem = data[q]; |
|
|
|
|
var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); |
|
|
|
|
encodedData.set(chunk, k); |
|
|
|
|
k += chunk.length; |
|
|
|
@ -946,7 +947,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -946,7 +947,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); |
|
|
|
|
bitModel.setDecoder(decoder); |
|
|
|
|
|
|
|
|
|
for (var q = 0; q < codingpasses; q++) { |
|
|
|
|
for (q = 0; q < codingpasses; q++) { |
|
|
|
|
switch (currentCodingpassType) { |
|
|
|
|
case 0: |
|
|
|
|
bitModel.runSignificancePropogationPass(); |
|
|
|
@ -972,7 +973,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -972,7 +973,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var bitsDecoded = bitModel.bitsDecoded; |
|
|
|
|
var magnitudeCorrection = reversible ? 0 : 0.5; |
|
|
|
|
for (var j = 0; j < blockHeight; j++) { |
|
|
|
|
for (var k = 0; k < blockWidth; k++) { |
|
|
|
|
for (k = 0; k < blockWidth; k++) { |
|
|
|
|
n = magnitude[position]; |
|
|
|
|
if (n !== 0) { |
|
|
|
|
n = (n + magnitudeCorrection) * delta; |
|
|
|
@ -1068,32 +1069,35 @@ var JpxImage = (function JpxImageClosure() {
@@ -1068,32 +1069,35 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
for (var i = 0, ii = context.tiles.length; i < ii; i++) { |
|
|
|
|
var tile = context.tiles[i]; |
|
|
|
|
var result = []; |
|
|
|
|
for (var c = 0; c < componentsCount; c++) { |
|
|
|
|
var c; |
|
|
|
|
for (c = 0; c < componentsCount; c++) { |
|
|
|
|
var image = transformTile(context, tile, c); |
|
|
|
|
result.push(image); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Section G.2.2 Inverse multi component transform
|
|
|
|
|
var y0items, y1items, y2items, j, jj, y0, y1, y2; |
|
|
|
|
var component, offset, tileImage, items; |
|
|
|
|
if (tile.codingStyleDefaultParameters.multipleComponentTransform) { |
|
|
|
|
var component0 = tile.components[0]; |
|
|
|
|
if (!component0.codingStyleParameters.reversibleTransformation) { |
|
|
|
|
// inverse irreversible multiple component transform
|
|
|
|
|
var y0items = result[0].items; |
|
|
|
|
var y1items = result[1].items; |
|
|
|
|
var y2items = result[2].items; |
|
|
|
|
for (var j = 0, jj = y0items.length; j < jj; ++j) { |
|
|
|
|
var y0 = y0items[j] + 0.5, y1 = y1items[j], y2 = y2items[j]; |
|
|
|
|
y0items = result[0].items; |
|
|
|
|
y1items = result[1].items; |
|
|
|
|
y2items = result[2].items; |
|
|
|
|
for (j = 0, jj = y0items.length; j < jj; ++j) { |
|
|
|
|
y0 = y0items[j] + 0.5; y1 = y1items[j]; y2 = y2items[j]; |
|
|
|
|
y0items[j] = y0 + 1.402 * y2; |
|
|
|
|
y1items[j] = y0 - 0.34413 * y1 - 0.71414 * y2; |
|
|
|
|
y2items[j] = y0 + 1.772 * y1; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// inverse reversible multiple component transform
|
|
|
|
|
var y0items = result[0].items; |
|
|
|
|
var y1items = result[1].items; |
|
|
|
|
var y2items = result[2].items; |
|
|
|
|
for (var j = 0, jj = y0items.length; j < jj; ++j) { |
|
|
|
|
var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j]; |
|
|
|
|
y0items = result[0].items; |
|
|
|
|
y1items = result[1].items; |
|
|
|
|
y2items = result[2].items; |
|
|
|
|
for (j = 0, jj = y0items.length; j < jj; ++j) { |
|
|
|
|
y0 = y0items[j]; y1 = y1items[j]; y2 = y2items[j]; |
|
|
|
|
var i1 = y0 - ((y2 + y1) >> 2); |
|
|
|
|
y1items[j] = i1; |
|
|
|
|
y0items[j] = y2 + i1; |
|
|
|
@ -1103,15 +1107,15 @@ var JpxImage = (function JpxImageClosure() {
@@ -1103,15 +1107,15 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// To simplify things: shift and clamp output to 8 bit unsigned
|
|
|
|
|
for (var c = 0; c < componentsCount; c++) { |
|
|
|
|
var component = components[c]; |
|
|
|
|
for (c = 0; c < componentsCount; c++) { |
|
|
|
|
component = components[c]; |
|
|
|
|
var shift = component.precision - 8; |
|
|
|
|
var tileImage = result[c]; |
|
|
|
|
var items = tileImage.items; |
|
|
|
|
tileImage = result[c]; |
|
|
|
|
items = tileImage.items; |
|
|
|
|
var data = new Uint8Array(items.length); |
|
|
|
|
var low = -(128 << shift); |
|
|
|
|
var high = 127 << shift; |
|
|
|
|
for (var j = 0, jj = items.length; j < jj; j++) { |
|
|
|
|
for (j = 0, jj = items.length; j < jj; j++) { |
|
|
|
|
var val = items[j]; |
|
|
|
|
data[j] = val <= low ? 0 : val >= high ? 255 : (val >> shift) + 128; |
|
|
|
|
} |
|
|
|
@ -1157,9 +1161,9 @@ var JpxImage = (function JpxImageClosure() {
@@ -1157,9 +1161,9 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
TagTree.prototype = { |
|
|
|
|
reset: function TagTree_reset(i, j) { |
|
|
|
|
var currentLevel = 0, value = 0; |
|
|
|
|
var currentLevel = 0, value = 0, level; |
|
|
|
|
while (currentLevel < this.levels.length) { |
|
|
|
|
var level = this.levels[currentLevel]; |
|
|
|
|
level = this.levels[currentLevel]; |
|
|
|
|
var index = i + j * level.width; |
|
|
|
|
if (index in level.items) { |
|
|
|
|
value = level.items[index]; |
|
|
|
@ -1171,7 +1175,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1171,7 +1175,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
currentLevel++; |
|
|
|
|
} |
|
|
|
|
currentLevel--; |
|
|
|
|
var level = this.levels[currentLevel]; |
|
|
|
|
level = this.levels[currentLevel]; |
|
|
|
|
level.items[level.index] = value; |
|
|
|
|
this.currentLevel = currentLevel; |
|
|
|
|
delete this.value; |
|
|
|
@ -1191,7 +1195,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1191,7 +1195,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
this.currentLevel = currentLevel; |
|
|
|
|
var level = this.levels[currentLevel]; |
|
|
|
|
level = this.levels[currentLevel]; |
|
|
|
|
level.items[level.index] = value; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -1257,7 +1261,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1257,7 +1261,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var level = this.levels[levelIndex]; |
|
|
|
|
var currentValue = level.items[level.index]; |
|
|
|
|
while (--levelIndex >= 0) { |
|
|
|
|
var level = this.levels[levelIndex]; |
|
|
|
|
level = this.levels[levelIndex]; |
|
|
|
|
level.items[level.index] = currentValue; |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
@ -1272,7 +1276,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1272,7 +1276,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
this.currentLevel = currentLevel; |
|
|
|
|
var level = this.levels[currentLevel]; |
|
|
|
|
level = this.levels[currentLevel]; |
|
|
|
|
level.items[level.index] = value; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -1351,9 +1355,10 @@ var JpxImage = (function JpxImageClosure() {
@@ -1351,9 +1355,10 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var width = this.width, height = this.height; |
|
|
|
|
var left = (column > 0); |
|
|
|
|
var right = (column + 1 < width); |
|
|
|
|
var i; |
|
|
|
|
|
|
|
|
|
if (row > 0) { |
|
|
|
|
var i = index - width; |
|
|
|
|
i = index - width; |
|
|
|
|
if (left) { |
|
|
|
|
neighborsSignificance[i - 1] += 0x10; |
|
|
|
|
} |
|
|
|
@ -1364,7 +1369,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1364,7 +1369,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (row + 1 < height) { |
|
|
|
|
var i = index + width; |
|
|
|
|
i = index + width; |
|
|
|
|
if (left) { |
|
|
|
|
neighborsSignificance[i - 1] += 0x10; |
|
|
|
|
} |
|
|
|
@ -1434,6 +1439,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1434,6 +1439,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var coefficentsMagnitude = this.coefficentsMagnitude; |
|
|
|
|
var coefficentsSign = this.coefficentsSign; |
|
|
|
|
var contribution, sign0, sign1, significance1; |
|
|
|
|
var contextLabel, decoded; |
|
|
|
|
|
|
|
|
|
// calculate horizontal contribution
|
|
|
|
|
significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); |
|
|
|
@ -1471,11 +1477,11 @@ var JpxImage = (function JpxImageClosure() {
@@ -1471,11 +1477,11 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (contribution >= 0) { |
|
|
|
|
var contextLabel = 9 + contribution; |
|
|
|
|
var decoded = this.decoder.readBit(this.contexts, contextLabel); |
|
|
|
|
contextLabel = 9 + contribution; |
|
|
|
|
decoded = this.decoder.readBit(this.contexts, contextLabel); |
|
|
|
|
} else { |
|
|
|
|
var contextLabel = 9 - contribution; |
|
|
|
|
var decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; |
|
|
|
|
contextLabel = 9 - contribution; |
|
|
|
|
decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; |
|
|
|
|
} |
|
|
|
|
return decoded; |
|
|
|
|
}, |
|
|
|
@ -1552,7 +1558,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1552,7 +1558,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
neighborsSignificance[index0 + twoRowsDown] === 0 && |
|
|
|
|
neighborsSignificance[index0 + threeRowsDown] === 0); |
|
|
|
|
var i1 = 0, index = index0; |
|
|
|
|
var i; |
|
|
|
|
var i, sign; |
|
|
|
|
if (allEmpty) { |
|
|
|
|
var hasSignificantCoefficent = |
|
|
|
|
decoder.readBit(contexts, RUNLENGTH_CONTEXT); |
|
|
|
@ -1568,7 +1574,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1568,7 +1574,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
i = i0 + i1; |
|
|
|
|
index += i1 * width; |
|
|
|
|
|
|
|
|
|
var sign = this.decodeSignBit(i, j, index); |
|
|
|
|
sign = this.decodeSignBit(i, j, index); |
|
|
|
|
coefficentsSign[index] = sign; |
|
|
|
|
coefficentsMagnitude[index] = 1; |
|
|
|
|
this.setNeighborsSignificance(i, j, index); |
|
|
|
@ -1595,7 +1601,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1595,7 +1601,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var contextLabel = labels[neighborsSignificance[index]]; |
|
|
|
|
var decision = decoder.readBit(contexts, contextLabel); |
|
|
|
|
if (decision == 1) { |
|
|
|
|
var sign = this.decodeSignBit(i, j, index); |
|
|
|
|
sign = this.decodeSignBit(i, j, index); |
|
|
|
|
coefficentsSign[index] = sign; |
|
|
|
|
coefficentsMagnitude[index] = 1; |
|
|
|
|
this.setNeighborsSignificance(i, j, index); |
|
|
|
@ -1659,11 +1665,11 @@ var JpxImage = (function JpxImageClosure() {
@@ -1659,11 +1665,11 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var width = llWidth + hlWidth; |
|
|
|
|
var height = llHeight + lhHeight; |
|
|
|
|
var items = new Float32Array(width * height); |
|
|
|
|
var i, j, k, l; |
|
|
|
|
var i, j, k, l, v, u; |
|
|
|
|
|
|
|
|
|
for (i = 0, k = 0; i < llHeight; i++) { |
|
|
|
|
l = i * 2 * width; |
|
|
|
|
for (var j = 0; j < llWidth; j++, k++, l += 2) { |
|
|
|
|
for (j = 0; j < llWidth; j++, k++, l += 2) { |
|
|
|
|
items[l] = llItems[k]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1693,12 +1699,12 @@ var JpxImage = (function JpxImageClosure() {
@@ -1693,12 +1699,12 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
if (width === 1) { |
|
|
|
|
// if width = 1, when u0 even keep items as is, when odd divide by 2
|
|
|
|
|
if ((u0 & 1) !== 0) { |
|
|
|
|
for (var v = 0, k = 0; v < height; v++, k += width) { |
|
|
|
|
for (v = 0, k = 0; v < height; v++, k += width) { |
|
|
|
|
items[k] *= 0.5; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (var v = 0, k = 0; v < height; v++, k += width) { |
|
|
|
|
for (v = 0, k = 0; v < height; v++, k += width) { |
|
|
|
|
rowBuffer.set(items.subarray(k, k + width), bufferPadding); |
|
|
|
|
|
|
|
|
|
this.extend(rowBuffer, bufferPadding, width); |
|
|
|
@ -1721,18 +1727,19 @@ var JpxImage = (function JpxImageClosure() {
@@ -1721,18 +1727,19 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
for (i = 0; i < numBuffers; i++) { |
|
|
|
|
colBuffers.push(new Float32Array(height + 2 * bufferPadding)); |
|
|
|
|
} |
|
|
|
|
var b, currentBuffer = 0, ll = bufferPadding + height; |
|
|
|
|
var b, currentBuffer = 0; |
|
|
|
|
ll = bufferPadding + height; |
|
|
|
|
|
|
|
|
|
// Section F.3.5 VER_SR
|
|
|
|
|
if (height === 1) { |
|
|
|
|
// if height = 1, when v0 even keep items as is, when odd divide by 2
|
|
|
|
|
if ((v0 & 1) !== 0) { |
|
|
|
|
for (var u = 0; u < width; u++) { |
|
|
|
|
for (u = 0; u < width; u++) { |
|
|
|
|
items[u] *= 0.5; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (var u = 0; u < width; u++) { |
|
|
|
|
for (u = 0; u < width; u++) { |
|
|
|
|
// if we ran out of buffers, copy several image columns at once
|
|
|
|
|
if (currentBuffer === 0) { |
|
|
|
|
numBuffers = Math.min(width - u, numBuffers); |
|
|
|
@ -1780,7 +1787,7 @@ var JpxImage = (function JpxImageClosure() {
@@ -1780,7 +1787,7 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
IrreversibleTransform.prototype.filter = |
|
|
|
|
function irreversibleTransformFilter(y, offset, length, i0, x) { |
|
|
|
|
var len = length >> 1; |
|
|
|
|
var offset = offset | 0; |
|
|
|
|
offset = offset | 0; |
|
|
|
|
|
|
|
|
|
var alpha = -1.586134342059924; |
|
|
|
|
var beta = -0.052980118572961; |
|
|
|
@ -1788,32 +1795,33 @@ var JpxImage = (function JpxImageClosure() {
@@ -1788,32 +1795,33 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
var delta = 0.443506852043971; |
|
|
|
|
var K = 1.230174104914001; |
|
|
|
|
var K_ = 1 / K; |
|
|
|
|
var j, n, nn; |
|
|
|
|
|
|
|
|
|
// step 1 is combined with step 3
|
|
|
|
|
|
|
|
|
|
// step 2
|
|
|
|
|
for (var j = offset - 3, n = len + 4; n--; j += 2) { |
|
|
|
|
for (j = offset - 3, n = len + 4; n--; j += 2) { |
|
|
|
|
x[j] = K_ * y[j]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// step 1 & 3
|
|
|
|
|
for (var j = offset - 2, n = len + 3; n--; j += 2) { |
|
|
|
|
for (j = offset - 2, n = len + 3; n--; j += 2) { |
|
|
|
|
x[j] = K * y[j] - |
|
|
|
|
delta * (x[j - 1] + x[j + 1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// step 4
|
|
|
|
|
for (var j = offset - 1, n = len + 2; n--; j += 2) { |
|
|
|
|
for (j = offset - 1, n = len + 2; n--; j += 2) { |
|
|
|
|
x[j] -= gamma * (x[j - 1] + x[j + 1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// step 5
|
|
|
|
|
for (var j = offset, n = len + 1; n--; j += 2) { |
|
|
|
|
for (j = offset, n = len + 1; n--; j += 2) { |
|
|
|
|
x[j] -= beta * (x[j - 1] + x[j + 1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// step 6
|
|
|
|
|
for (var j = offset + 1, n = len; n--; j += 2) { |
|
|
|
|
for (j = offset + 1, n = len; n--; j += 2) { |
|
|
|
|
x[j] -= alpha * (x[j - 1] + x[j + 1]); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
@ -1831,13 +1839,14 @@ var JpxImage = (function JpxImageClosure() {
@@ -1831,13 +1839,14 @@ var JpxImage = (function JpxImageClosure() {
|
|
|
|
|
ReversibleTransform.prototype.filter = |
|
|
|
|
function reversibleTransformFilter(y, offset, length, i0, x) { |
|
|
|
|
var len = length >> 1; |
|
|
|
|
var offset = offset | 0; |
|
|
|
|
offset = offset | 0; |
|
|
|
|
var j, n; |
|
|
|
|
|
|
|
|
|
for (var j = offset, n = len + 1; n--; j += 2) { |
|
|
|
|
for (j = offset, n = len + 1; n--; j += 2) { |
|
|
|
|
x[j] = y[j] - ((y[j - 1] + y[j + 1] + 2) >> 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (var j = offset + 1, n = len; n--; j += 2) { |
|
|
|
|
for (j = offset + 1, n = len; n--; j += 2) { |
|
|
|
|
x[j] = y[j] + ((x[j - 1] + x[j + 1]) >> 1); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|