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