Expose a Jbig2Image.parse
method, by re-instating the parseJbig2
function
The purpose of this patch is to hopefully provide *slightly* better user ergonomics, if/when the PDF.js image decoders are used standalone. This implementation is (basically) reverting the changes in PR 9386, in conjunction with code from the `parse` method found at https://github.com/notmasteryet/jpgjs/blob/master/src/pdfjs.js
This commit is contained in:
parent
682672db8e
commit
bfc88ead66
@ -1192,6 +1192,47 @@ var Jbig2Image = (function Jbig2ImageClosure() {
|
|||||||
return visitor.buffer;
|
return visitor.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseJbig2(data) {
|
||||||
|
let position = 0, end = data.length;
|
||||||
|
|
||||||
|
if (data[position] !== 0x97 || data[position + 1] !== 0x4A ||
|
||||||
|
data[position + 2] !== 0x42 || data[position + 3] !== 0x32 ||
|
||||||
|
data[position + 4] !== 0x0D || data[position + 5] !== 0x0A ||
|
||||||
|
data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
|
||||||
|
throw new Jbig2Error('parseJbig2 - invalid header.');
|
||||||
|
}
|
||||||
|
|
||||||
|
let header = Object.create(null);
|
||||||
|
position += 8;
|
||||||
|
const flags = data[position++];
|
||||||
|
header.randomAccess = !(flags & 1);
|
||||||
|
if (!(flags & 2)) {
|
||||||
|
header.numberOfPages = readUint32(data, position);
|
||||||
|
position += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
let segments = readSegments(header, data, position, end);
|
||||||
|
let visitor = new SimpleSegmentVisitor();
|
||||||
|
processSegments(segments, visitor);
|
||||||
|
|
||||||
|
const { width, height, } = visitor.currentPageInfo;
|
||||||
|
const bitPacked = visitor.buffer;
|
||||||
|
let imgData = new Uint8ClampedArray(width * height);
|
||||||
|
let q = 0, k = 0;
|
||||||
|
for (let i = 0; i < height; i++) {
|
||||||
|
let mask = 0, buffer;
|
||||||
|
for (let j = 0; j < width; j++) {
|
||||||
|
if (!mask) {
|
||||||
|
mask = 128; buffer = bitPacked[k++];
|
||||||
|
}
|
||||||
|
imgData[q++] = (buffer & mask) ? 0 : 255;
|
||||||
|
mask >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { imgData, width, height, };
|
||||||
|
}
|
||||||
|
|
||||||
function SimpleSegmentVisitor() {}
|
function SimpleSegmentVisitor() {}
|
||||||
|
|
||||||
SimpleSegmentVisitor.prototype = {
|
SimpleSegmentVisitor.prototype = {
|
||||||
@ -2095,9 +2136,16 @@ var Jbig2Image = (function Jbig2ImageClosure() {
|
|||||||
function Jbig2Image() {}
|
function Jbig2Image() {}
|
||||||
|
|
||||||
Jbig2Image.prototype = {
|
Jbig2Image.prototype = {
|
||||||
parseChunks: function Jbig2Image_parseChunks(chunks) {
|
parseChunks(chunks) {
|
||||||
return parseJbig2Chunks(chunks);
|
return parseJbig2Chunks(chunks);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
parse(data) {
|
||||||
|
const { imgData, width, height, } = parseJbig2(data);
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
return imgData;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return Jbig2Image;
|
return Jbig2Image;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user