Merge pull request #10574 from ahocevar/text-background

Text rendering improvements
This commit is contained in:
Andreas Hocevar
2020-01-30 15:57:04 +01:00
committed by GitHub
2 changed files with 17 additions and 19 deletions
+6 -19
View File
@@ -4,7 +4,6 @@
import {getFontParameters} from '../css.js'; import {getFontParameters} from '../css.js';
import {createCanvasContext2D} from '../dom.js'; import {createCanvasContext2D} from '../dom.js';
import {clear} from '../obj.js'; import {clear} from '../obj.js';
import {create as createTransform} from '../transform.js';
import {executeLabelInstructions} from './canvas/Executor.js'; import {executeLabelInstructions} from './canvas/Executor.js';
import BaseObject from '../Object.js'; import BaseObject from '../Object.js';
import EventTarget from '../events/Target.js'; import EventTarget from '../events/Target.js';
@@ -383,9 +382,6 @@ export function rotateAtOffset(context, rotation, offsetX, offsetY) {
} }
export const resetTransform = createTransform();
/** /**
* @param {CanvasRenderingContext2D} context Context. * @param {CanvasRenderingContext2D} context Context.
* @param {import("../transform.js").Transform|null} transform Transform. * @param {import("../transform.js").Transform|null} transform Transform.
@@ -401,30 +397,21 @@ export const resetTransform = createTransform();
*/ */
export function drawImageOrLabel(context, export function drawImageOrLabel(context,
transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) { transform, opacity, labelOrImage, originX, originY, w, h, x, y, scale) {
let alpha; context.save();
if (opacity != 1) {
alpha = context.globalAlpha;
context.globalAlpha = alpha * opacity;
}
if (transform) { if (transform) {
context.setTransform.apply(context, transform); context.setTransform.apply(context, transform);
} }
const isLabel = !!(/** @type {*} */ (labelOrImage).contextInstructions); if ((/** @type {*} */ (labelOrImage).contextInstructions)) {
// label
if (isLabel) {
context.translate(x, y); context.translate(x, y);
context.scale(scale, scale); context.scale(scale, scale);
executeLabelInstructions(/** @type {import("./canvas/Executor.js").Label} */ (labelOrImage), context); executeLabelInstructions(/** @type {import("./canvas/Executor.js").Label} */ (labelOrImage), context);
} else { } else {
// image
context.drawImage(/** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (labelOrImage), originX, originY, w, h, x, y, w * scale, h * scale); context.drawImage(/** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (labelOrImage), originX, originY, w, h, x, y, w * scale, h * scale);
} }
if (opacity != 1) { context.restore();
context.globalAlpha = alpha;
}
if (transform || isLabel) {
context.setTransform.apply(context, resetTransform);
}
} }
+11
View File
@@ -173,6 +173,12 @@ class Executor {
* @type {Object<string, Object<string, number>>} * @type {Object<string, Object<string, number>>}
*/ */
this.widths_ = {}; this.widths_ = {};
/**
* @private
* @type {Object<string, Label>}
*/
this.labels_ = {};
} }
/** /**
@@ -183,6 +189,10 @@ class Executor {
* @return {Label} Label. * @return {Label} Label.
*/ */
createLabel(text, textKey, fillKey, strokeKey) { createLabel(text, textKey, fillKey, strokeKey) {
const key = text + textKey + fillKey + strokeKey;
if (this.labels_[key]) {
return this.labels_[key];
}
const strokeState = strokeKey ? this.strokeStates[strokeKey] : null; const strokeState = strokeKey ? this.strokeStates[strokeKey] : null;
const fillState = fillKey ? this.fillStates[fillKey] : null; const fillState = fillKey ? this.fillStates[fillKey] : null;
const textState = this.textStates[textKey]; const textState = this.textStates[textKey];
@@ -239,6 +249,7 @@ class Executor {
contextInstructions.push('fillText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]); contextInstructions.push('fillText', [lines[i], x + leftRight * widths[i], 0.5 * (strokeWidth + lineHeight) + i * lineHeight]);
} }
} }
this.labels_[key] = label;
return label; return label;
} }