devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
338 lines (314 loc) • 11.5 kB
JavaScript
/**
* DevExtreme (cjs/exporter/jspdf/common/draw_utils.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
exports.addNewPage = addNewPage;
exports.drawCellsContent = drawCellsContent;
exports.drawCellsLines = drawCellsLines;
exports.drawGridLines = drawGridLines;
exports.drawLine = drawLine;
exports.drawRect = drawRect;
exports.drawTextInRect = drawTextInRect;
exports.getDocumentStyles = getDocumentStyles;
exports.roundToThreeDecimals = roundToThreeDecimals;
exports.setDocumentStyles = setDocumentStyles;
var _type = require("../../../core/utils/type");
var _extend = require("../../../core/utils/extend");
var _pdf_utils = require("./pdf_utils");
const _excluded = ["_rect", "gridCell"];
function _objectWithoutPropertiesLoose(r, e) {
if (null == r) {
return {}
}
var t = {};
for (var n in r) {
if ({}.hasOwnProperty.call(r, n)) {
if (e.includes(n)) {
continue
}
t[n] = r[n]
}
}
return t
}
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
function roundToThreeDecimals(value) {
return Math.round(1e3 * value) / 1e3
}
function drawCellsContent(doc, customDrawCell, cellsArray, docStyles) {
cellsArray.forEach((cell => {
const {
_rect: _rect,
gridCell: gridCell
} = cell, pdfCell = _objectWithoutPropertiesLoose(cell, _excluded);
const {
x: x,
y: y,
w: w,
h: h
} = _rect;
const rect = {
x: x,
y: y,
w: w,
h: h
};
const eventArg = {
doc: doc,
rect: rect,
pdfCell: pdfCell,
gridCell: gridCell,
cancel: false
};
null === customDrawCell || void 0 === customDrawCell || customDrawCell(eventArg);
if (!eventArg.cancel) {
drawCellBackground(doc, cell);
drawCellText(doc, cell, docStyles)
}
}))
}
function drawLine(doc, startX, startY, endX, endY) {
doc.line(roundToThreeDecimals(startX), roundToThreeDecimals(startY), roundToThreeDecimals(endX), roundToThreeDecimals(endY))
}
function drawRect(doc, x, y, width, height, style) {
if ((0, _type.isDefined)(style)) {
doc.rect(roundToThreeDecimals(x), roundToThreeDecimals(y), roundToThreeDecimals(width), roundToThreeDecimals(height), style)
} else {
doc.rect(roundToThreeDecimals(x), roundToThreeDecimals(y), roundToThreeDecimals(width), roundToThreeDecimals(height))
}
}
function getLineHeightShift(doc) {
return (doc.getLineHeightFactor() - 1.15) * doc.getFontSize()
}
function drawTextInRect(doc, text, rect, verticalAlign, horizontalAlign, jsPDFTextOptions) {
const textArray = text.split("\n");
const linesCount = textArray.length;
const heightOfOneLine = (0, _pdf_utils.calculateTextHeight)(doc, textArray[0], doc.getFont(), {
wordWrapEnabled: false,
targetRectWidth: 1e9
});
const vAlign = verticalAlign ?? "middle";
const hAlign = horizontalAlign ?? "left";
const verticalAlignCoefficientsMap = {
top: 0,
middle: .5,
bottom: 1
};
const y = rect.y + rect.h * verticalAlignCoefficientsMap[vAlign] - heightOfOneLine * (linesCount - 1) * verticalAlignCoefficientsMap[vAlign] + getLineHeightShift(doc);
const x = rect.x + rect.w * {
left: 0,
center: .5,
right: 1
} [hAlign];
const textOptions = (0, _extend.extend)({
baseline: vAlign,
align: hAlign
}, jsPDFTextOptions);
doc.text(textArray.join("\n"), roundToThreeDecimals(x), roundToThreeDecimals(y), textOptions)
}
function drawCellBackground(doc, cell) {
if ((0, _type.isDefined)(cell.backgroundColor)) {
trySetColor(doc, "fill", cell.backgroundColor);
drawRect(doc, cell._rect.x, cell._rect.y, cell._rect.w, cell._rect.h, "F")
}
}
function drawCellText(doc, cell, docStyles) {
if ((0, _type.isDefined)(cell.text) && "" !== cell.text) {
const {
textColor: textColor,
font: font,
_rect: _rect,
padding: padding
} = cell;
setTextStyles(doc, {
textColor: textColor,
font: font
}, docStyles);
const textRect = {
x: _rect.x + padding.left,
y: _rect.y + padding.top,
w: _rect.w - (padding.left + padding.right),
h: _rect.h - (padding.top + padding.bottom)
};
if ((0, _type.isDefined)(cell._textLeftOffset) || (0, _type.isDefined)(cell._textTopOffset)) {
textRect.x = textRect.x + (cell._textLeftOffset ?? 0);
textRect.y = textRect.y + (cell._textTopOffset ?? 0);
doc.saveGraphicsState();
clipOutsideRectContent(doc, cell._rect.x, cell._rect.y, cell._rect.w, cell._rect.h)
}
drawTextInRect(doc, cell.text, textRect, cell.verticalAlign, cell.horizontalAlign, cell._internalTextOptions);
if ((0, _type.isDefined)(cell._textLeftOffset) || (0, _type.isDefined)(cell._textTopOffset)) {
doc.restoreGraphicsState()
}
}
}
function drawCellsLines(doc, cellsArray, docStyles) {
cellsArray.filter((cell => !(0, _type.isDefined)(cell.borderColor))).forEach((cell => {
drawBorders(doc, cell._rect, cell, docStyles)
}));
cellsArray.filter((cell => (0, _type.isDefined)(cell.borderColor))).forEach((cell => {
drawBorders(doc, cell._rect, cell, docStyles)
}))
}
function drawGridLines(doc, rect, options, docStyles) {
drawBorders(doc, rect, options, docStyles)
}
function drawBorders(doc, rect, _ref, docStyles) {
let {
borderWidth: borderWidth,
borderColor: borderColor,
drawLeftBorder: drawLeftBorder = true,
drawRightBorder: drawRightBorder = true,
drawTopBorder: drawTopBorder = true,
drawBottomBorder: drawBottomBorder = true
} = _ref;
if (!(0, _type.isDefined)(rect)) {
throw "rect is required"
}
if (!drawLeftBorder && !drawRightBorder && !drawTopBorder && !drawBottomBorder) {
return
} else if (drawLeftBorder && drawRightBorder && drawTopBorder && drawBottomBorder) {
setLinesStyles(doc, {
borderWidth: borderWidth,
borderColor: borderColor
}, docStyles);
drawRect(doc, rect.x, rect.y, rect.w, rect.h)
} else {
setLinesStyles(doc, {
borderWidth: borderWidth,
borderColor: borderColor
}, docStyles);
if (drawTopBorder) {
drawLine(doc, rect.x, rect.y, rect.x + rect.w, rect.y)
}
if (drawLeftBorder) {
drawLine(doc, rect.x, rect.y, rect.x, rect.y + rect.h)
}
if (drawRightBorder) {
drawLine(doc, rect.x + rect.w, rect.y, rect.x + rect.w, rect.y + rect.h)
}
if (drawBottomBorder) {
drawLine(doc, rect.x, rect.y + rect.h, rect.x + rect.w, rect.y + rect.h)
}
}
}
function setTextStyles(doc, _ref2, docStyles) {
let {
textColor: textColor,
font: font
} = _ref2;
trySetColor(doc, "text", (0, _type.isDefined)(textColor) ? textColor : docStyles.textColor);
const currentFont = (0, _type.isDefined)(font) ? (0, _extend.extend)({}, docStyles.font, font) : docStyles.font;
const docFont = doc.getFont();
if (currentFont.name !== docFont.fontName || currentFont.style !== docFont.fontStyle || (0, _type.isDefined)(currentFont.weight)) {
doc.setFont(currentFont.name, currentFont.style, currentFont.weight)
}
if (currentFont.size !== doc.getFontSize()) {
doc.setFontSize(currentFont.size)
}
}
function setLinesStyles(doc, _ref3, docStyles) {
let {
borderWidth: borderWidth,
borderColor: borderColor
} = _ref3;
const currentBorderWidth = (0, _type.isDefined)(borderWidth) ? borderWidth : docStyles.borderWidth;
if (currentBorderWidth !== getDocBorderWidth(doc)) {
setDocBorderWidth(doc, (0, _pdf_utils.toPdfUnit)(doc, currentBorderWidth))
}
trySetColor(doc, "draw", (0, _type.isDefined)(borderColor) ? borderColor : docStyles.borderColor)
}
function trySetColor(doc, target, color) {
const getterName = `get${capitalizeFirstLetter(target)}Color`;
const setterName = `set${capitalizeFirstLetter(target)}Color`;
const {
ch1: ch1 = color,
ch2: ch2,
ch3: ch3,
ch4: ch4
} = color;
const normalizedColor = doc.__private__.decodeColorString(doc.__private__.encodeColorString({
ch1: ch1,
ch2: ch2,
ch3: ch3,
ch4: ch4,
precision: "text" === target ? 3 : 2
}));
if (normalizedColor !== doc[getterName]() || "fill" === target) {
doc[setterName].apply(doc, [ch1, ch2, ch3, ch4].filter((item => void 0 !== item)))
}
}
function getDocumentStyles(doc) {
const docFont = doc.getFont();
return {
borderWidth: getDocBorderWidth(doc),
borderColor: doc.getDrawColor(),
font: {
name: docFont.fontName,
style: docFont.fontStyle,
size: doc.getFontSize()
},
textColor: doc.getTextColor()
}
}
function setDocumentStyles(doc, styles) {
const {
borderWidth: borderWidth,
borderColor: borderColor,
font: font,
textColor: textColor
} = styles;
const docFont = doc.getFont();
if (docFont.fontName !== font.name || docFont.fontStyle !== font.style) {
doc.setFont(font.name, font.style, void 0)
}
const docFontSize = doc.getFontSize();
if (docFontSize !== font.size) {
doc.setFontSize(font.size)
}
if (getDocBorderWidth(doc) !== borderWidth) {
setDocBorderWidth(doc, borderWidth)
}
if (doc.getDrawColor() !== borderColor) {
doc.setDrawColor(borderColor)
}
if (doc.getTextColor() !== textColor) {
doc.setTextColor(textColor)
}
}
function addNewPage(doc) {
doc.addPage();
resetDocBorderWidth(doc)
}
function getDocBorderWidth(doc) {
if ((0, _type.isDefined)(doc.getLineWidth)) {
return doc.getLineWidth()
}
return doc.__borderWidth ?? .200025
}
function setDocBorderWidth(doc, width) {
doc.setLineWidth(width);
if (!(0, _type.isDefined)(doc.getLineWidth)) {
doc.__borderWidth = width
}
}
function resetDocBorderWidth(doc) {
if (!(0, _type.isDefined)(doc.getLineWidth)) {
doc.__borderWidth = null
}
}
function clipOutsideRectContent(doc, x, y, w, h) {
doc.moveTo(roundToThreeDecimals(x), roundToThreeDecimals(y));
doc.lineTo(roundToThreeDecimals(x + w), roundToThreeDecimals(y));
doc.lineTo(roundToThreeDecimals(x + w), roundToThreeDecimals(y + h));
doc.lineTo(roundToThreeDecimals(x), roundToThreeDecimals(y + h));
doc.clip();
doc.discardPath()
}