Use async/await in the rasterization classes in test/driver.js

This is achieved by letting the `writeSVG` function return a promise so
we don't need callback passing anymore.
This commit is contained in:
Tim van der Meij 2021-12-05 14:04:23 +01:00
parent 13786ef806
commit 5fd4276dcf
No known key found for this signature in database
GPG Key ID: 8C3FD2925A5F2762

View File

@ -60,20 +60,22 @@ function loadStyles(styles) {
return Promise.all(styles.map(style => style.promise));
}
function writeSVG(svgElement, ctx, resolve, reject) {
function writeSVG(svgElement, ctx) {
// We need to have UTF-8 encoded XML.
const svg_xml = unescape(
encodeURIComponent(new XMLSerializer().serializeToString(svgElement))
);
const img = new Image();
img.src = "data:image/svg+xml;base64," + btoa(svg_xml);
img.onload = function () {
ctx.drawImage(img, 0, 0);
resolve();
};
img.onerror = function (e) {
reject(new Error("Error rasterizing text layer " + e));
};
return new Promise((resolve, reject) => {
const img = new Image();
img.src = "data:image/svg+xml;base64," + btoa(svg_xml);
img.onload = function () {
ctx.drawImage(img, 0, 0);
resolve();
};
img.onerror = function (e) {
reject(new Error(`Error rasterizing SVG: ${e}`));
};
});
}
function inlineImages(images) {
@ -155,13 +157,13 @@ var rasterizeTextLayer = (function rasterizeTextLayerClosure() {
};
// eslint-disable-next-line no-shadow
function rasterizeTextLayer(
async function rasterizeTextLayer(
ctx,
viewport,
textContent,
enhanceTextSelection
) {
return new Promise(function (resolve, reject) {
try {
// Building SVG with size of the viewport.
var svg = document.createElementNS(SVG_NS, "svg:svg");
svg.setAttribute("width", viewport.width + "px");
@ -182,28 +184,25 @@ var rasterizeTextLayer = (function rasterizeTextLayerClosure() {
div.className = "textLayer";
foreignObject.appendChild(div);
stylePromise
.then(async ([cssRules]) => {
style.textContent = cssRules;
const [cssRules] = await stylePromise;
style.textContent = cssRules;
// Rendering text layer as HTML.
var task = renderTextLayer({
textContent,
container: div,
viewport,
enhanceTextSelection,
});
await task.promise;
// Rendering text layer as HTML.
var task = renderTextLayer({
textContent,
container: div,
viewport,
enhanceTextSelection,
});
await task.promise;
task.expandTextDivs(true);
svg.appendChild(foreignObject);
task.expandTextDivs(true);
svg.appendChild(foreignObject);
writeSVG(svg, ctx, resolve, reject);
})
.catch(reason => {
reject(new Error(`rasterizeTextLayer: "${reason?.message}".`));
});
});
await writeSVG(svg, ctx);
} catch (reason) {
throw new Error(`rasterizeTextLayer: "${reason?.message}".`);
}
}
return rasterizeTextLayer;
@ -234,7 +233,7 @@ var rasterizeAnnotationLayer = (function rasterizeAnnotationLayerClosure() {
};
// eslint-disable-next-line no-shadow
function rasterizeAnnotationLayer(
async function rasterizeAnnotationLayer(
ctx,
viewport,
annotations,
@ -243,7 +242,7 @@ var rasterizeAnnotationLayer = (function rasterizeAnnotationLayerClosure() {
imageResourcesPath,
renderForms = false
) {
return new Promise(function (resolve, reject) {
try {
// Building SVG with size of the viewport.
var svg = document.createElementNS(SVG_NS, "svg:svg");
svg.setAttribute("width", viewport.width + "px");
@ -262,38 +261,35 @@ var rasterizeAnnotationLayer = (function rasterizeAnnotationLayerClosure() {
div.className = "annotationLayer";
// Rendering annotation layer as HTML.
stylePromise
.then(async ([common, overrides]) => {
style.textContent = common + "\n" + overrides;
const [common, overrides] = await stylePromise;
style.textContent = common + "\n" + overrides;
var annotation_viewport = viewport.clone({ dontFlip: true });
const annotationImageMap = await convertCanvasesToImages(
annotationCanvasMap
);
var annotation_viewport = viewport.clone({ dontFlip: true });
const annotationImageMap = await convertCanvasesToImages(
annotationCanvasMap
);
var parameters = {
viewport: annotation_viewport,
div,
annotations,
page,
linkService: new SimpleLinkService(),
imageResourcesPath,
renderForms,
annotationCanvasMap: annotationImageMap,
};
AnnotationLayer.render(parameters);
var parameters = {
viewport: annotation_viewport,
div,
annotations,
page,
linkService: new SimpleLinkService(),
imageResourcesPath,
renderForms,
annotationCanvasMap: annotationImageMap,
};
AnnotationLayer.render(parameters);
// Inline SVG images from text annotations.
await resolveImages(div);
foreignObject.appendChild(div);
svg.appendChild(foreignObject);
// Inline SVG images from text annotations.
await resolveImages(div);
foreignObject.appendChild(div);
svg.appendChild(foreignObject);
writeSVG(svg, ctx, resolve, reject);
})
.catch(reason => {
reject(new Error(`rasterizeAnnotationLayer: "${reason?.message}".`));
});
});
await writeSVG(svg, ctx);
} catch (reason) {
throw new Error(`rasterizeAnnotationLayer: "${reason?.message}".`);
}
}
return rasterizeAnnotationLayer;
@ -315,7 +311,7 @@ var rasterizeXfaLayer = (function rasterizeXfaLayerClosure() {
};
// eslint-disable-next-line no-shadow
function rasterizeXfaLayer(
async function rasterizeXfaLayer(
ctx,
viewport,
xfa,
@ -323,7 +319,7 @@ var rasterizeXfaLayer = (function rasterizeXfaLayerClosure() {
annotationStorage,
isPrint
) {
return new Promise(function (resolve, reject) {
try {
// Building SVG with size of the viewport.
const svg = document.createElementNS(SVG_NS, "svg:svg");
svg.setAttribute("width", viewport.width + "px");
@ -342,30 +338,27 @@ var rasterizeXfaLayer = (function rasterizeXfaLayerClosure() {
const div = document.createElement("div");
foreignObject.appendChild(div);
stylePromise
.then(async ([common, overrides]) => {
style.textContent = fontRules + "\n" + common + "\n" + overrides;
const [common, overrides] = await stylePromise;
style.textContent = fontRules + "\n" + common + "\n" + overrides;
XfaLayer.render({
xfa,
div,
viewport: viewport.clone({ dontFlip: true }),
annotationStorage,
linkService: new SimpleLinkService(),
intent: isPrint ? "print" : "display",
});
XfaLayer.render({
xfa,
div,
viewport: viewport.clone({ dontFlip: true }),
annotationStorage,
linkService: new SimpleLinkService(),
intent: isPrint ? "print" : "display",
});
// Some unsupported type of images (e.g. tiff)
// lead to errors.
await resolveImages(div, /* silentErrors = */ true);
svg.appendChild(foreignObject);
// Some unsupported type of images (e.g. tiff)
// lead to errors.
await resolveImages(div, /* silentErrors = */ true);
svg.appendChild(foreignObject);
writeSVG(svg, ctx, resolve, reject);
})
.catch(reason => {
reject(new Error(`rasterizeXfaLayer: "${reason?.message}".`));
});
});
await writeSVG(svg, ctx);
} catch (reason) {
throw new Error(`rasterizeXfaLayer: "${reason?.message}".`);
}
}
return rasterizeXfaLayer;