mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-05-23 19:30:59 +02:00
Use the original array-data when parsing Type 0 (Sampled) Functions
It seems just as easy to lookup the needed data in the original arrays, rather than having to first create (and allocate) nested arrays for that purpose.
This commit is contained in:
parent
bc38b633ee
commit
fa344c1852
@ -155,22 +155,13 @@ class PDFFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static constructSampled(factory, fn, dict) {
|
static constructSampled(factory, fn, dict) {
|
||||||
function toMultiArray(arr) {
|
|
||||||
const inputLength = arr.length;
|
|
||||||
const out = [];
|
|
||||||
let index = 0;
|
|
||||||
for (let i = 0; i < inputLength; i += 2) {
|
|
||||||
out[index++] = [arr[i], arr[i + 1]];
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
// See chapter 3, page 109 of the PDF reference
|
// See chapter 3, page 109 of the PDF reference
|
||||||
function interpolate(x, xmin, xmax, ymin, ymax) {
|
function interpolate(x, xmin, xmax, ymin, ymax) {
|
||||||
return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
|
return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
|
||||||
}
|
}
|
||||||
|
|
||||||
let domain = toNumberArray(dict.getArray("Domain"));
|
const domain = toNumberArray(dict.getArray("Domain"));
|
||||||
let range = toNumberArray(dict.getArray("Range"));
|
const range = toNumberArray(dict.getArray("Range"));
|
||||||
|
|
||||||
if (!domain || !range) {
|
if (!domain || !range) {
|
||||||
throw new FormatError("No domain or range");
|
throw new FormatError("No domain or range");
|
||||||
@ -179,9 +170,6 @@ class PDFFunction {
|
|||||||
const inputSize = domain.length / 2;
|
const inputSize = domain.length / 2;
|
||||||
const outputSize = range.length / 2;
|
const outputSize = range.length / 2;
|
||||||
|
|
||||||
domain = toMultiArray(domain);
|
|
||||||
range = toMultiArray(range);
|
|
||||||
|
|
||||||
const size = toNumberArray(dict.getArray("Size"));
|
const size = toNumberArray(dict.getArray("Size"));
|
||||||
const bps = dict.get("BitsPerSample");
|
const bps = dict.get("BitsPerSample");
|
||||||
const order = dict.get("Order") || 1;
|
const order = dict.get("Order") || 1;
|
||||||
@ -195,14 +183,11 @@ class PDFFunction {
|
|||||||
if (!encode) {
|
if (!encode) {
|
||||||
encode = [];
|
encode = [];
|
||||||
for (let i = 0; i < inputSize; ++i) {
|
for (let i = 0; i < inputSize; ++i) {
|
||||||
encode.push([0, size[i] - 1]);
|
encode.push(0, size[i] - 1);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
encode = toMultiArray(encode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let decode = toNumberArray(dict.getArray("Decode"));
|
const decode = toNumberArray(dict.getArray("Decode")) || range;
|
||||||
decode = !decode ? range : toMultiArray(decode);
|
|
||||||
|
|
||||||
const samples = this.getSampleArray(size, outputSize, bps, fn);
|
const samples = this.getSampleArray(size, outputSize, bps, fn);
|
||||||
// const mask = 2 ** bps - 1;
|
// const mask = 2 ** bps - 1;
|
||||||
@ -222,8 +207,8 @@ class PDFFunction {
|
|||||||
// Map x_i to y_j for 0 <= i < m using the sampled function.
|
// Map x_i to y_j for 0 <= i < m using the sampled function.
|
||||||
for (i = 0; i < inputSize; ++i) {
|
for (i = 0; i < inputSize; ++i) {
|
||||||
// x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
|
// x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
|
||||||
const domain_2i = domain[i][0];
|
const domain_2i = domain[2 * i];
|
||||||
const domain_2i_1 = domain[i][1];
|
const domain_2i_1 = domain[2 * i + 1];
|
||||||
const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1);
|
const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1);
|
||||||
|
|
||||||
// e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
|
// e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
|
||||||
@ -232,8 +217,8 @@ class PDFFunction {
|
|||||||
xi,
|
xi,
|
||||||
domain_2i,
|
domain_2i,
|
||||||
domain_2i_1,
|
domain_2i_1,
|
||||||
encode[i][0],
|
encode[2 * i],
|
||||||
encode[i][1]
|
encode[2 * i + 1]
|
||||||
);
|
);
|
||||||
|
|
||||||
// e_i' = min(max(e_i, 0), Size_i - 1)
|
// e_i' = min(max(e_i, 0), Size_i - 1)
|
||||||
@ -269,10 +254,10 @@ class PDFFunction {
|
|||||||
|
|
||||||
// r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
|
// r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
|
||||||
// Decode_2j, Decode_2j+1)
|
// Decode_2j, Decode_2j+1)
|
||||||
rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
|
rj = interpolate(rj, 0, 1, decode[2 * j], decode[2 * j + 1]);
|
||||||
|
|
||||||
// y_j = min(max(r_j, range_2j), range_2j+1)
|
// y_j = min(max(r_j, range_2j), range_2j+1)
|
||||||
dest[destOffset + j] = MathClamp(rj, range[j][0], range[j][1]);
|
dest[destOffset + j] = MathClamp(rj, range[2 * j], range[2 * j + 1]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user