Don't get bytes eagerly when creating {Jpeg,Jpx,Jbig2}Stream objects.
This avoids lots of unnecessary work when such streams are referred to via fetch(), and so their bytes aren't subsequently read. This is a large performance win on some files.
This commit is contained in:
parent
f12d588258
commit
d0253c8291
@ -300,12 +300,10 @@ var Parser = (function ParserClosure() {
|
|||||||
return new LZWStream(stream, earlyChange);
|
return new LZWStream(stream, earlyChange);
|
||||||
}
|
}
|
||||||
if (name == 'DCTDecode' || name == 'DCT') {
|
if (name == 'DCTDecode' || name == 'DCT') {
|
||||||
var bytes = stream.getBytes(length);
|
return new JpegStream(stream, length, stream.dict, this.xref);
|
||||||
return new JpegStream(bytes, stream.dict, this.xref);
|
|
||||||
}
|
}
|
||||||
if (name == 'JPXDecode' || name == 'JPX') {
|
if (name == 'JPXDecode' || name == 'JPX') {
|
||||||
var bytes = stream.getBytes(length);
|
return new JpxStream(stream, length, stream.dict);
|
||||||
return new JpxStream(bytes, stream.dict);
|
|
||||||
}
|
}
|
||||||
if (name == 'ASCII85Decode' || name == 'A85') {
|
if (name == 'ASCII85Decode' || name == 'A85') {
|
||||||
return new Ascii85Stream(stream);
|
return new Ascii85Stream(stream);
|
||||||
@ -320,8 +318,7 @@ var Parser = (function ParserClosure() {
|
|||||||
return new RunLengthStream(stream);
|
return new RunLengthStream(stream);
|
||||||
}
|
}
|
||||||
if (name == 'JBIG2Decode') {
|
if (name == 'JBIG2Decode') {
|
||||||
var bytes = stream.getBytes(length);
|
return new Jbig2Stream(stream, length, stream.dict);
|
||||||
return new Jbig2Stream(bytes, stream.dict);
|
|
||||||
}
|
}
|
||||||
warn('filter "' + name + '" not supported yet');
|
warn('filter "' + name + '" not supported yet');
|
||||||
return stream;
|
return stream;
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* globals bytesToString, ColorSpace, Dict, EOF, error, info, Jbig2Image,
|
/* globals bytesToString, ColorSpace, Dict, EOF, error, info, isArray,
|
||||||
JpegImage, JpxImage, Lexer, Util, PDFJS, isArray, warn */
|
Jbig2Image, JpegImage, JpxImage, Lexer, PDFJS, shadow, Util, warn */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
@ -777,17 +777,25 @@ var PredictorStream = (function PredictorStreamClosure() {
|
|||||||
* DecodeStreams.
|
* DecodeStreams.
|
||||||
*/
|
*/
|
||||||
var JpegStream = (function JpegStreamClosure() {
|
var JpegStream = (function JpegStreamClosure() {
|
||||||
function JpegStream(bytes, dict, xref) {
|
function JpegStream(stream, length, dict, xref) {
|
||||||
// TODO: per poppler, some images may have 'junk' before that
|
// TODO: per poppler, some images may have 'junk' before that
|
||||||
// need to be removed
|
// need to be removed
|
||||||
|
this.stream = stream;
|
||||||
|
this.length = length;
|
||||||
this.dict = dict;
|
this.dict = dict;
|
||||||
this.bytes = bytes;
|
|
||||||
|
|
||||||
DecodeStream.call(this);
|
DecodeStream.call(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
JpegStream.prototype = Object.create(DecodeStream.prototype);
|
JpegStream.prototype = Object.create(DecodeStream.prototype);
|
||||||
|
|
||||||
|
Object.defineProperty(JpegStream.prototype, 'bytes', {
|
||||||
|
get: function JpegStream_bytes() {
|
||||||
|
return shadow(this, 'bytes', this.stream.getBytes(this.length));
|
||||||
|
},
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
|
JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
|
||||||
if (this.bufferLength)
|
if (this.bufferLength)
|
||||||
return;
|
return;
|
||||||
@ -836,15 +844,23 @@ var JpegStream = (function JpegStreamClosure() {
|
|||||||
* the stream behaves like all the other DecodeStreams.
|
* the stream behaves like all the other DecodeStreams.
|
||||||
*/
|
*/
|
||||||
var JpxStream = (function JpxStreamClosure() {
|
var JpxStream = (function JpxStreamClosure() {
|
||||||
function JpxStream(bytes, dict) {
|
function JpxStream(stream, length, dict) {
|
||||||
|
this.stream = stream;
|
||||||
|
this.length = length;
|
||||||
this.dict = dict;
|
this.dict = dict;
|
||||||
this.bytes = bytes;
|
|
||||||
|
|
||||||
DecodeStream.call(this);
|
DecodeStream.call(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
JpxStream.prototype = Object.create(DecodeStream.prototype);
|
JpxStream.prototype = Object.create(DecodeStream.prototype);
|
||||||
|
|
||||||
|
Object.defineProperty(JpxStream.prototype, 'bytes', {
|
||||||
|
get: function JpxStream_bytes() {
|
||||||
|
return shadow(this, 'bytes', this.stream.getBytes(this.length));
|
||||||
|
},
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
|
JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
|
||||||
if (this.bufferLength)
|
if (this.bufferLength)
|
||||||
return;
|
return;
|
||||||
@ -935,15 +951,23 @@ var JpxStream = (function JpxStreamClosure() {
|
|||||||
* the stream behaves like all the other DecodeStreams.
|
* the stream behaves like all the other DecodeStreams.
|
||||||
*/
|
*/
|
||||||
var Jbig2Stream = (function Jbig2StreamClosure() {
|
var Jbig2Stream = (function Jbig2StreamClosure() {
|
||||||
function Jbig2Stream(bytes, dict) {
|
function Jbig2Stream(stream, length, dict) {
|
||||||
|
this.stream = stream;
|
||||||
|
this.length = length;
|
||||||
this.dict = dict;
|
this.dict = dict;
|
||||||
this.bytes = bytes;
|
|
||||||
|
|
||||||
DecodeStream.call(this);
|
DecodeStream.call(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
|
Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
|
||||||
|
|
||||||
|
Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
|
||||||
|
get: function Jbig2Stream_bytes() {
|
||||||
|
return shadow(this, 'bytes', this.stream.getBytes(this.length));
|
||||||
|
},
|
||||||
|
configurable: true
|
||||||
|
});
|
||||||
|
|
||||||
Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
|
Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
|
||||||
if (this.bufferLength)
|
if (this.bufferLength)
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user