|
|
@ -324,12 +324,6 @@ var JpxImage = (function JpxImageClosure() { |
|
|
|
cod.precinctsSizes = precinctsSizes; |
|
|
|
cod.precinctsSizes = precinctsSizes; |
|
|
|
} |
|
|
|
} |
|
|
|
var unsupported = []; |
|
|
|
var unsupported = []; |
|
|
|
if (cod.sopMarkerUsed) { |
|
|
|
|
|
|
|
unsupported.push('sopMarkerUsed'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (cod.ephMarkerUsed) { |
|
|
|
|
|
|
|
unsupported.push('ephMarkerUsed'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (cod.selectiveArithmeticCodingBypass) { |
|
|
|
if (cod.selectiveArithmeticCodingBypass) { |
|
|
|
unsupported.push('selectiveArithmeticCodingBypass'); |
|
|
|
unsupported.push('selectiveArithmeticCodingBypass'); |
|
|
|
} |
|
|
|
} |
|
|
@ -816,6 +810,21 @@ var JpxImage = (function JpxImageClosure() { |
|
|
|
bufferSize -= count; |
|
|
|
bufferSize -= count; |
|
|
|
return (buffer >>> bufferSize) & ((1 << count) - 1); |
|
|
|
return (buffer >>> bufferSize) & ((1 << count) - 1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function skipMarkerIfEqual(value) { |
|
|
|
|
|
|
|
if (data[offset + position - 1] === 0xFF && |
|
|
|
|
|
|
|
data[offset + position] === value) { |
|
|
|
|
|
|
|
skipBytes(1); |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} else if (data[offset + position] === 0xFF && |
|
|
|
|
|
|
|
data[offset + position + 1] === value) { |
|
|
|
|
|
|
|
skipBytes(2); |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
function skipBytes(count) { |
|
|
|
|
|
|
|
position += count; |
|
|
|
|
|
|
|
} |
|
|
|
function alignToByte() { |
|
|
|
function alignToByte() { |
|
|
|
bufferSize = 0; |
|
|
|
bufferSize = 0; |
|
|
|
if (skipNextBit) { |
|
|
|
if (skipNextBit) { |
|
|
@ -843,9 +852,15 @@ var JpxImage = (function JpxImageClosure() { |
|
|
|
} |
|
|
|
} |
|
|
|
var tileIndex = context.currentTile.index; |
|
|
|
var tileIndex = context.currentTile.index; |
|
|
|
var tile = context.tiles[tileIndex]; |
|
|
|
var tile = context.tiles[tileIndex]; |
|
|
|
|
|
|
|
var sopMarkerUsed = context.COD.sopMarkerUsed; |
|
|
|
|
|
|
|
var ephMarkerUsed = context.COD.ephMarkerUsed; |
|
|
|
var packetsIterator = tile.packetsIterator; |
|
|
|
var packetsIterator = tile.packetsIterator; |
|
|
|
while (position < dataLength) { |
|
|
|
while (position < dataLength) { |
|
|
|
alignToByte(); |
|
|
|
alignToByte(); |
|
|
|
|
|
|
|
if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { |
|
|
|
|
|
|
|
// Skip also marker segment length and packet sequence ID
|
|
|
|
|
|
|
|
skipBytes(4); |
|
|
|
|
|
|
|
} |
|
|
|
if (!readBits(1)) { |
|
|
|
if (!readBits(1)) { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
@ -928,6 +943,9 @@ var JpxImage = (function JpxImageClosure() { |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
alignToByte(); |
|
|
|
alignToByte(); |
|
|
|
|
|
|
|
if (ephMarkerUsed) { |
|
|
|
|
|
|
|
skipMarkerIfEqual(0x92); |
|
|
|
|
|
|
|
} |
|
|
|
while (queue.length > 0) { |
|
|
|
while (queue.length > 0) { |
|
|
|
var packetItem = queue.shift(); |
|
|
|
var packetItem = queue.shift(); |
|
|
|
codeblock = packetItem.codeblock; |
|
|
|
codeblock = packetItem.codeblock; |
|
|
|