Home Manual Reference Source

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();
  }
}