Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change src/core/jpg.js to use the error utility function instead of throwing #7591

Merged
merged 1 commit into from
Sep 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 28 additions & 27 deletions src/core/jpg.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

/* Copyright 2014 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the 'License');
Expand All @@ -18,26 +17,28 @@

(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define('pdfjs/core/jpg', ['exports'], factory);
define('pdfjs/core/jpg', ['exports', 'pdfjs/shared/util'], factory);
} else if (typeof exports !== 'undefined') {
factory(exports);
factory(exports, require('../shared/util.js'));
} else {
factory((root.pdfjsCoreJpg = {}));
factory((root.pdfjsCoreJpg = {}), root.pdfjsSharedUtil);
}
}(this, function (exports) {
}(this, function (exports, sharedUtil) {

/*
This code was forked from https://github.com/notmasteryet/jpgjs. The original
version was created by github user notmasteryet
var error = sharedUtil.error;

- The JPEG specification can be found in the ITU CCITT Recommendation T.81
(www.w3.org/Graphics/JPEG/itu-t81.pdf)
- The JFIF specification can be found in the JPEG File Interchange Format
(www.w3.org/Graphics/JPEG/jfif3.pdf)
- The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
in PostScript Level 2, Technical Note #5116
(partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
*/
/**
* This code was forked from https://github.com/notmasteryet/jpgjs.
* The original version was created by GitHub user notmasteryet.
*
* - The JPEG specification can be found in the ITU CCITT Recommendation T.81
* (www.w3.org/Graphics/JPEG/itu-t81.pdf)
* - The JFIF specification can be found in the JPEG File Interchange Format
* (www.w3.org/Graphics/JPEG/jfif3.pdf)
* - The Adobe Application-Specific JPEG markers in the
* Supporting the DCT Filters in PostScript Level 2, Technical Note #5116
* (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
*/

var JpegImage = (function jpegImage() {
var dctZigZag = new Uint8Array([
Expand Down Expand Up @@ -123,8 +124,8 @@ var JpegImage = (function jpegImage() {
if (bitsData === 0xFF) {
var nextByte = data[offset++];
if (nextByte) {
throw 'unexpected marker: ' +
((bitsData << 8) | nextByte).toString(16);
error('JPEG error: unexpected marker ' +
((bitsData << 8) | nextByte).toString(16));
}
// unstuff 0
}
Expand All @@ -140,7 +141,7 @@ var JpegImage = (function jpegImage() {
return node;
}
if (typeof node !== 'object') {
throw 'invalid huffman sequence';
error('JPEG error: invalid huffman sequence');
}
}
}
Expand Down Expand Up @@ -247,7 +248,7 @@ var JpegImage = (function jpegImage() {
}
} else {
if (s !== 1) {
throw 'invalid ACn encoding';
error('JPEG error: invalid ACn encoding');
}
successiveACNextValue = receiveAndExtend(s);
successiveACState = r ? 2 : 3;
Expand Down Expand Up @@ -363,7 +364,7 @@ var JpegImage = (function jpegImage() {
bitsCount = 0;
marker = (data[offset] << 8) | data[offset + 1];
if (marker <= 0xFF00) {
throw 'marker was not found';
error('JPEG error: marker was not found');
}

if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
Expand All @@ -388,7 +389,7 @@ var JpegImage = (function jpegImage() {
var t;

if (!qt) {
throw 'missing required Quantization Table.';
error('JPEG error: missing required Quantization Table.');
}

// inverse DCT on rows
Expand Down Expand Up @@ -630,7 +631,7 @@ var JpegImage = (function jpegImage() {
var huffmanTablesAC = [], huffmanTablesDC = [];
var fileMarker = readUint16();
if (fileMarker !== 0xFFD8) { // SOI (Start of Image)
throw 'SOI not found';
error('JPEG error: SOI not found');
}

fileMarker = readUint16();
Expand Down Expand Up @@ -705,7 +706,7 @@ var JpegImage = (function jpegImage() {
tableData[z] = readUint16();
}
} else {
throw 'DQT: invalid table spec';
error('JPEG error: DQT - invalid table spec');
}
quantizationTables[quantizationTableSpec & 15] = tableData;
}
Expand All @@ -715,7 +716,7 @@ var JpegImage = (function jpegImage() {
case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
if (frame) {
throw 'Only single frame JPEGs supported';
error('JPEG error: Only single frame JPEGs supported');
}
readUint16(); // skip data length
frame = {};
Expand Down Expand Up @@ -815,7 +816,7 @@ var JpegImage = (function jpegImage() {
offset -= 3;
break;
}
throw 'unknown JPEG marker ' + fileMarker.toString(16);
error('JPEG error: unknown marker ' + fileMarker.toString(16));
}
fileMarker = readUint16();
}
Expand Down Expand Up @@ -1028,7 +1029,7 @@ var JpegImage = (function jpegImage() {

getData: function getData(width, height, forceRGBoutput) {
if (this.numComponents > 4) {
throw 'Unsupported color mode';
error('JPEG error: Unsupported color mode');
}
// type of data: Uint8Array(width * height * numComponents)
var data = this._getLinearizedBlockData(width, height);
Expand Down
54 changes: 25 additions & 29 deletions src/core/stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -922,38 +922,34 @@ var JpegStream = (function JpegStreamClosure() {
if (this.bufferLength) {
return;
}
try {
var jpegImage = new JpegImage();

// checking if values needs to be transformed before conversion
if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) {
var decodeArr = this.dict.getArray('Decode');
var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
var decodeArrLength = decodeArr.length;
var transform = new Int32Array(decodeArrLength);
var transformNeeded = false;
var maxValue = (1 << bitsPerComponent) - 1;
for (var i = 0; i < decodeArrLength; i += 2) {
transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
transform[i + 1] = (decodeArr[i] * maxValue) | 0;
if (transform[i] !== 256 || transform[i + 1] !== 0) {
transformNeeded = true;
}
}
if (transformNeeded) {
jpegImage.decodeTransform = transform;
var jpegImage = new JpegImage();

// Checking if values need to be transformed before conversion.
if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) {
var decodeArr = this.dict.getArray('Decode');
var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
var decodeArrLength = decodeArr.length;
var transform = new Int32Array(decodeArrLength);
var transformNeeded = false;
var maxValue = (1 << bitsPerComponent) - 1;
for (var i = 0; i < decodeArrLength; i += 2) {
transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
transform[i + 1] = (decodeArr[i] * maxValue) | 0;
if (transform[i] !== 256 || transform[i + 1] !== 0) {
transformNeeded = true;
}
}

jpegImage.parse(this.bytes);
var data = jpegImage.getData(this.drawWidth, this.drawHeight,
this.forceRGB);
this.buffer = data;
this.bufferLength = data.length;
this.eof = true;
} catch (e) {
error('JPEG error: ' + e);
if (transformNeeded) {
jpegImage.decodeTransform = transform;
}
}

jpegImage.parse(this.bytes);
var data = jpegImage.getData(this.drawWidth, this.drawHeight,
this.forceRGB);
this.buffer = data;
this.bufferLength = data.length;
this.eof = true;
};

JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {
Expand Down