src/renderer/canvas/symbols/TextSymbolCanvasRenderer.js
import { rendererLogger as logger } from '../../../configuration/LoggerConfig';
import { drawLine } from './ShapeSymbolCanvasRenderer';
/**
* @type {{inputCharacter: String, char: String, string: String, textLine: String}}
*/
export const TextSymbols = {
inputCharacter: 'inputCharacter',
char: 'char',
string: 'string',
textLine: 'textLine'
};
function drawUnderline(context, underline, label, data) {
const delta = data.width / label.length;
const p1 = {
x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),
y: data.topLeftPoint.y + data.height
};
const p2 = {
x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),
y: data.topLeftPoint.y + data.height
};
drawLine(context, p1, p2);
}
function drawText(context, label, data) {
const contextReference = context;
contextReference.save();
try {
contextReference.font = `${data.textHeight}px serif`;
contextReference.textAlign = (data.justificationType === 'CENTER') ? 'center' : 'left';
contextReference.textBaseline = 'bottom';
contextReference.fillStyle = contextReference.strokeStyle;
contextReference.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height));
} finally {
contextReference.restore();
}
}
function drawTextLine(context, textLine) {
drawText(context, textLine.label, textLine.data);
textLine.underlineList.forEach((underline) => {
drawUnderline(context, underline, textLine.label, textLine.data);
});
}
/**
* Draw a text symbol
* @param {Object} context Current rendering context
* @param {Object} symbol Symbol to draw
*/
export function drawTextSymbol(context, symbol) {
logger.debug(`draw ${symbol.type} symbol`);
const contextReference = context;
contextReference.save();
try {
contextReference.lineWidth = symbol.width;
contextReference.strokeStyle = symbol.color;
if (symbol.elementType) {
switch (symbol.elementType) {
case TextSymbols.textLine:
drawTextLine(contextReference, symbol);
break;
default:
logger.error(`${symbol.elementType} not implemented`);
break;
}
} else {
switch (symbol.type) {
case TextSymbols.textLine:
drawTextLine(contextReference, symbol);
break;
default:
logger.error(`${symbol.type} not implemented`);
}
}
} finally {
contextReference.restore();
}
}