mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-08-01 20:07:22 +02:00
Re-factor the bCache, used with /Mesh Shadings
- Initialize the `bCache` lazily, since many/most PDF documents don't need it. - Change the `bCache` to a `Map`, rather than an Object, which thanks to `getOrInsertComputed` allows the `buildB` function to be inlined. Also, while unrelated here, move the `this.matrix = null;` definition to the `BaseShadingPattern` class to reduce (a tiny bit of) unnecessary duplication.
This commit is contained in:
parent
dd7e3731d1
commit
344736bcad
@ -667,25 +667,25 @@ class MeshStreamReader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let bCache = Object.create(null);
|
let bCache = null;
|
||||||
|
|
||||||
function buildB(count) {
|
|
||||||
const lut = [];
|
|
||||||
for (let i = 0; i <= count; i++) {
|
|
||||||
const t = i / count,
|
|
||||||
t_ = 1 - t;
|
|
||||||
lut.push(
|
|
||||||
new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return lut;
|
|
||||||
}
|
|
||||||
function getB(count) {
|
function getB(count) {
|
||||||
return (bCache[count] ||= buildB(count));
|
return (bCache ??= new Map()).getOrInsertComputed(count, () =>
|
||||||
|
Array.from({ length: count + 1 }, (_, i) => {
|
||||||
|
const t = i / count,
|
||||||
|
t_ = 1 - t;
|
||||||
|
return new Float32Array([
|
||||||
|
t_ ** 3,
|
||||||
|
3 * t * t_ ** 2,
|
||||||
|
3 * t ** 2 * t_,
|
||||||
|
t ** 3,
|
||||||
|
]);
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearPatternCaches() {
|
function clearPatternCaches() {
|
||||||
bCache = Object.create(null);
|
bCache?.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
class MeshShading extends BaseShading {
|
class MeshShading extends BaseShading {
|
||||||
|
|||||||
@ -36,6 +36,8 @@ function applyBoundingBox(ctx, bbox) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class BaseShadingPattern {
|
class BaseShadingPattern {
|
||||||
|
matrix = null;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
if (
|
if (
|
||||||
(typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) &&
|
(typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) &&
|
||||||
@ -64,7 +66,6 @@ class RadialAxialShadingPattern extends BaseShadingPattern {
|
|||||||
this._p1 = IR[5];
|
this._p1 = IR[5];
|
||||||
this._r0 = IR[6];
|
this._r0 = IR[6];
|
||||||
this._r1 = IR[7];
|
this._r1 = IR[7];
|
||||||
this.matrix = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isOriginBased() {
|
isOriginBased() {
|
||||||
@ -381,7 +382,6 @@ class MeshShadingPattern extends BaseShadingPattern {
|
|||||||
this._bounds = IR[5];
|
this._bounds = IR[5];
|
||||||
this._bbox = IR[6];
|
this._bbox = IR[6];
|
||||||
this._background = IR[7];
|
this._background = IR[7];
|
||||||
this.matrix = null;
|
|
||||||
// Pre-compile the mesh pipeline now that we know GPU-renderable content
|
// Pre-compile the mesh pipeline now that we know GPU-renderable content
|
||||||
// is present; no-op if the GPU is not available or already compiled.
|
// is present; no-op if the GPU is not available or already compiled.
|
||||||
loadMeshShader();
|
loadMeshShader();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user