Merge pull request #10574 from ahocevar/text-background
Text rendering improvements
This commit is contained in:
+6
-19
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user