Skip to content

Commit

Permalink
feat(decode): add tolerantDecoding option (jpeg-js#57)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dewep committed Apr 21, 2020
1 parent 9a6e6fc commit ce5433c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
6 changes: 4 additions & 2 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ export declare function decode(jpegData: BufferLike, opts?: false): BufferRet;

export declare function decode(jpegData: BufferLike, opts: {
useTArray: true,
colorTransform?: boolean
colorTransform?: boolean,
tolerantDecoding?: boolean
}): UintArrRet;
export declare function decode(jpegData: BufferLike, opts?: {
useTArray?: false,
colorTransform?: boolean
colorTransform?: boolean,
tolerantDecoding?: boolean
}): BufferRet;
16 changes: 13 additions & 3 deletions lib/decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ var JpegImage = (function jpegImage() {
function decodeScan(data, offset,
frame, components, resetInterval,
spectralStart, spectralEnd,
successivePrev, successive) {
successivePrev, successive, opts) {
var precision = frame.precision;
var samplesPerLine = frame.samplesPerLine;
var scanLines = frame.scanLines;
Expand Down Expand Up @@ -258,11 +258,17 @@ var JpegImage = (function jpegImage() {
var mcuCol = mcu % mcusPerLine;
var blockRow = mcuRow * component.v + row;
var blockCol = mcuCol * component.h + col;
// If the block is missing and we're in tolerant mode, just skip it.
if (component.blocks[blockRow] === undefined && opts.tolerantDecoding)
return;
decode(component, component.blocks[blockRow][blockCol]);
}
function decodeBlock(component, decode, mcu) {
var blockRow = (mcu / component.blocksPerLine) | 0;
var blockCol = mcu % component.blocksPerLine;
// If the block is missing and we're in tolerant mode, just skip it.
if (component.blocks[blockRow] === undefined && opts.tolerantDecoding)
return;
decode(component, component.blocks[blockRow][blockCol]);
}

Expand Down Expand Up @@ -746,7 +752,7 @@ var JpegImage = (function jpegImage() {
var processed = decodeScan(data, offset,
frame, components, resetInterval,
spectralStart, spectralEnd,
successiveApproximation >> 4, successiveApproximation & 15);
successiveApproximation >> 4, successiveApproximation & 15, this.opts);
offset += processed;
break;

Expand Down Expand Up @@ -990,7 +996,8 @@ function decode(jpegData, opts) {
useTArray: false,
// "undefined" means "Choose whether to transform colors based on the image’s color model."
colorTransform: undefined,
formatAsRGBA: true
formatAsRGBA: true,
tolerantDecoding: false
};
if (opts) {
if (typeof opts === 'object') {
Expand All @@ -999,6 +1006,8 @@ function decode(jpegData, opts) {
defaultOpts.useTArray : opts.useTArray),
colorTransform: (typeof opts.colorTransform === 'undefined' ?
defaultOpts.colorTransform : opts.colorTransform),
tolerantDecoding: (typeof opts.tolerantDecoding === 'undefined' ?
defaultOpts.tolerantDecoding : opts.tolerantDecoding),
formatAsRGBA: (typeof opts.formatAsRGBA === 'undefined' ?
defaultOpts.formatAsRGBA : opts.formatAsRGBA)
};
Expand All @@ -1013,6 +1022,7 @@ function decode(jpegData, opts) {

var arr = new Uint8Array(jpegData);
var decoder = new JpegImage();
decoder.opts = opts;
decoder.parse(arr);
decoder.colorTransform = opts.colorTransform;

Expand Down

0 comments on commit ce5433c

Please sign in to comment.