html2canvas-pro 1.6.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +1 -0
  2. package/demo/image-smoothing-demo.html +256 -0
  3. package/demo/refactoring-test.html +602 -0
  4. package/dist/html2canvas-pro.esm.js +2846 -1238
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +2849 -1237
  7. package/dist/html2canvas-pro.js.map +1 -1
  8. package/dist/html2canvas-pro.min.js +5 -4
  9. package/dist/lib/__tests__/index.js +8 -2
  10. package/dist/lib/__tests__/index.js.map +1 -1
  11. package/dist/lib/config.js +72 -0
  12. package/dist/lib/config.js.map +1 -0
  13. package/dist/lib/core/__tests__/cache-storage.js +6 -3
  14. package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
  15. package/dist/lib/core/__tests__/cache-storage.test.js +158 -0
  16. package/dist/lib/core/__tests__/cache-storage.test.js.map +1 -0
  17. package/dist/lib/core/__tests__/validator.js +296 -0
  18. package/dist/lib/core/__tests__/validator.js.map +1 -0
  19. package/dist/lib/core/cache-storage.js +130 -11
  20. package/dist/lib/core/cache-storage.js.map +1 -1
  21. package/dist/lib/core/context.js +5 -2
  22. package/dist/lib/core/context.js.map +1 -1
  23. package/dist/lib/core/debugger.js +3 -0
  24. package/dist/lib/core/debugger.js.map +1 -1
  25. package/dist/lib/core/origin-checker.js +54 -0
  26. package/dist/lib/core/origin-checker.js.map +1 -0
  27. package/dist/lib/core/performance-monitor.js +208 -0
  28. package/dist/lib/core/performance-monitor.js.map +1 -0
  29. package/dist/lib/core/validator.js +501 -0
  30. package/dist/lib/core/validator.js.map +1 -0
  31. package/dist/lib/css/index.js +2 -0
  32. package/dist/lib/css/index.js.map +1 -1
  33. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +7 -1
  34. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
  35. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
  36. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
  37. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
  38. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
  39. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
  40. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
  41. package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
  42. package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
  43. package/dist/lib/css/types/__tests__/image-tests.js +7 -1
  44. package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
  45. package/dist/lib/css/types/color-math.js +26 -0
  46. package/dist/lib/css/types/color-math.js.map +1 -0
  47. package/dist/lib/css/types/color-spaces/srgb.js +6 -6
  48. package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
  49. package/dist/lib/css/types/color-utilities.js +13 -22
  50. package/dist/lib/css/types/color-utilities.js.map +1 -1
  51. package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
  52. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
  53. package/dist/lib/dom/__tests__/element-container.test.js +109 -0
  54. package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
  55. package/dist/lib/dom/document-cloner.js +152 -11
  56. package/dist/lib/dom/document-cloner.js.map +1 -1
  57. package/dist/lib/dom/dom-normalizer.js +80 -0
  58. package/dist/lib/dom/dom-normalizer.js.map +1 -0
  59. package/dist/lib/dom/element-container.js +32 -15
  60. package/dist/lib/dom/element-container.js.map +1 -1
  61. package/dist/lib/dom/node-parser.js +16 -20
  62. package/dist/lib/dom/node-parser.js.map +1 -1
  63. package/dist/lib/dom/node-type-guards.js +44 -0
  64. package/dist/lib/dom/node-type-guards.js.map +1 -0
  65. package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
  66. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
  67. package/dist/lib/index.js +148 -41
  68. package/dist/lib/index.js.map +1 -1
  69. package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
  70. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
  71. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
  72. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
  73. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
  74. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
  75. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +63 -0
  76. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
  77. package/dist/lib/render/canvas/background-renderer.js +222 -0
  78. package/dist/lib/render/canvas/background-renderer.js.map +1 -0
  79. package/dist/lib/render/canvas/border-renderer.js +185 -0
  80. package/dist/lib/render/canvas/border-renderer.js.map +1 -0
  81. package/dist/lib/render/canvas/canvas-renderer.js +61 -689
  82. package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
  83. package/dist/lib/render/canvas/effects-renderer.js +89 -0
  84. package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
  85. package/dist/lib/render/canvas/text-renderer.js +508 -0
  86. package/dist/lib/render/canvas/text-renderer.js.map +1 -0
  87. package/dist/lib/render/renderer-interface.js +3 -0
  88. package/dist/lib/render/renderer-interface.js.map +1 -0
  89. package/dist/types/config.d.ts +54 -0
  90. package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
  91. package/dist/types/core/__tests__/validator.d.ts +1 -0
  92. package/dist/types/core/cache-storage.d.ts +42 -1
  93. package/dist/types/core/context.d.ts +5 -1
  94. package/dist/types/core/origin-checker.d.ts +33 -0
  95. package/dist/types/core/performance-monitor.d.ts +131 -0
  96. package/dist/types/core/validator.d.ts +132 -0
  97. package/dist/types/css/index.d.ts +2 -0
  98. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
  99. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
  100. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
  101. package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
  102. package/dist/types/css/types/color-math.d.ts +12 -0
  103. package/dist/types/css/types/color-utilities.d.ts +2 -3
  104. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
  105. package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
  106. package/dist/types/dom/document-cloner.d.ts +46 -0
  107. package/dist/types/dom/dom-normalizer.d.ts +43 -0
  108. package/dist/types/dom/element-container.d.ts +20 -1
  109. package/dist/types/dom/node-parser.d.ts +2 -7
  110. package/dist/types/dom/node-type-guards.d.ts +33 -0
  111. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
  112. package/dist/types/index.d.ts +48 -3
  113. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
  114. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
  115. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
  116. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
  117. package/dist/types/render/canvas/background-renderer.d.ts +87 -0
  118. package/dist/types/render/canvas/border-renderer.d.ts +67 -0
  119. package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
  120. package/dist/types/render/canvas/effects-renderer.d.ts +64 -0
  121. package/dist/types/render/canvas/text-renderer.d.ts +57 -0
  122. package/dist/types/render/renderer-interface.d.ts +26 -0
  123. package/package.json +2 -1
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ /**
3
+ * Background Renderer
4
+ *
5
+ * Handles rendering of element backgrounds including:
6
+ * - Background colors
7
+ * - Background images (URL)
8
+ * - Linear gradients
9
+ * - Radial gradients
10
+ * - Background patterns and repeats
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BackgroundRenderer = void 0;
14
+ const image_1 = require("../../css/types/image");
15
+ const background_1 = require("../background");
16
+ const gradient_1 = require("../../css/types/functions/gradient");
17
+ const length_percentage_1 = require("../../css/types/length-percentage");
18
+ const color_utilities_1 = require("../../css/types/color-utilities");
19
+ const bezier_curve_1 = require("../bezier-curve");
20
+ const image_rendering_1 = require("../../css/property-descriptors/image-rendering");
21
+ /**
22
+ * Background Renderer
23
+ *
24
+ * Specialized renderer for element backgrounds.
25
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
26
+ */
27
+ class BackgroundRenderer {
28
+ constructor(deps) {
29
+ this.ctx = deps.ctx;
30
+ this.context = deps.context;
31
+ this.canvas = deps.canvas;
32
+ // Options stored in deps but not needed as instance property
33
+ }
34
+ /**
35
+ * Render background images for a container
36
+ * Supports URL images, linear gradients, and radial gradients
37
+ *
38
+ * @param container - Element container with background styles
39
+ */
40
+ async renderBackgroundImage(container) {
41
+ let index = container.styles.backgroundImage.length - 1;
42
+ for (const backgroundImage of container.styles.backgroundImage.slice(0).reverse()) {
43
+ if (backgroundImage.type === 0 /* CSSImageType.URL */) {
44
+ await this.renderBackgroundURLImage(container, backgroundImage, index);
45
+ }
46
+ else if ((0, image_1.isLinearGradient)(backgroundImage)) {
47
+ this.renderLinearGradient(container, backgroundImage, index);
48
+ }
49
+ else if ((0, image_1.isRadialGradient)(backgroundImage)) {
50
+ this.renderRadialGradient(container, backgroundImage, index);
51
+ }
52
+ index--;
53
+ }
54
+ }
55
+ /**
56
+ * Render a URL-based background image
57
+ */
58
+ async renderBackgroundURLImage(container, backgroundImage, index) {
59
+ let image;
60
+ const url = backgroundImage.url;
61
+ try {
62
+ image = await this.context.cache.match(url);
63
+ }
64
+ catch (e) {
65
+ this.context.logger.error(`Error loading background-image ${url}`);
66
+ }
67
+ if (image) {
68
+ const imageWidth = isNaN(image.width) || image.width === 0 ? 1 : image.width;
69
+ const imageHeight = isNaN(image.height) || image.height === 0 ? 1 : image.height;
70
+ const [path, x, y, width, height] = (0, background_1.calculateBackgroundRendering)(container, index, [
71
+ imageWidth,
72
+ imageHeight,
73
+ imageWidth / imageHeight
74
+ ]);
75
+ const pattern = this.ctx.createPattern(this.resizeImage(image, width, height, container.styles.imageRendering), 'repeat');
76
+ this.renderRepeat(path, pattern, x, y);
77
+ }
78
+ }
79
+ /**
80
+ * Render a linear gradient background
81
+ */
82
+ renderLinearGradient(container, backgroundImage, index) {
83
+ const [path, x, y, width, height] = (0, background_1.calculateBackgroundRendering)(container, index, [null, null, null]);
84
+ const [lineLength, x0, x1, y0, y1] = (0, gradient_1.calculateGradientDirection)(backgroundImage.angle, width, height);
85
+ const ownerDocument = this.canvas.ownerDocument ?? document;
86
+ const canvas = ownerDocument.createElement('canvas');
87
+ canvas.width = width;
88
+ canvas.height = height;
89
+ const ctx = canvas.getContext('2d');
90
+ const gradient = ctx.createLinearGradient(x0, y0, x1, y1);
91
+ (0, gradient_1.processColorStops)(backgroundImage.stops, lineLength || 1).forEach((colorStop) => gradient.addColorStop(colorStop.stop, (0, color_utilities_1.asString)(colorStop.color)));
92
+ ctx.fillStyle = gradient;
93
+ ctx.fillRect(0, 0, width, height);
94
+ if (width > 0 && height > 0) {
95
+ const pattern = this.ctx.createPattern(canvas, 'repeat');
96
+ this.renderRepeat(path, pattern, x, y);
97
+ }
98
+ }
99
+ /**
100
+ * Render a radial gradient background
101
+ */
102
+ renderRadialGradient(container, backgroundImage, index) {
103
+ const [path, left, top, width, height] = (0, background_1.calculateBackgroundRendering)(container, index, [null, null, null]);
104
+ const position = backgroundImage.position.length === 0 ? [length_percentage_1.FIFTY_PERCENT] : backgroundImage.position;
105
+ const x = (0, length_percentage_1.getAbsoluteValue)(position[0], width);
106
+ const y = (0, length_percentage_1.getAbsoluteValue)(position[position.length - 1], height);
107
+ let [rx, ry] = (0, gradient_1.calculateRadius)(backgroundImage, x, y, width, height);
108
+ // Handle edge case where radial gradient size is 0
109
+ // Use a minimum value of 0.01 to ensure gradient is still rendered
110
+ if (rx === 0 || ry === 0) {
111
+ rx = Math.max(rx, 0.01);
112
+ ry = Math.max(ry, 0.01);
113
+ }
114
+ if (rx > 0 && ry > 0) {
115
+ const radialGradient = this.ctx.createRadialGradient(left + x, top + y, 0, left + x, top + y, rx);
116
+ (0, gradient_1.processColorStops)(backgroundImage.stops, rx * 2).forEach((colorStop) => radialGradient.addColorStop(colorStop.stop, (0, color_utilities_1.asString)(colorStop.color)));
117
+ this.path(path);
118
+ this.ctx.fillStyle = radialGradient;
119
+ if (rx !== ry) {
120
+ // transforms for elliptical radial gradient
121
+ const midX = container.bounds.left + 0.5 * container.bounds.width;
122
+ const midY = container.bounds.top + 0.5 * container.bounds.height;
123
+ const f = ry / rx;
124
+ const invF = 1 / f;
125
+ this.ctx.save();
126
+ this.ctx.translate(midX, midY);
127
+ this.ctx.transform(1, 0, 0, f, 0, 0);
128
+ this.ctx.translate(-midX, -midY);
129
+ this.ctx.fillRect(left, invF * (top - midY) + midY, width, height * invF);
130
+ this.ctx.restore();
131
+ }
132
+ else {
133
+ this.ctx.fill();
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Render a repeating pattern with offset
139
+ *
140
+ * @param path - Path to fill
141
+ * @param pattern - Canvas pattern or gradient
142
+ * @param offsetX - X offset for pattern
143
+ * @param offsetY - Y offset for pattern
144
+ */
145
+ renderRepeat(path, pattern, offsetX, offsetY) {
146
+ this.path(path);
147
+ this.ctx.fillStyle = pattern;
148
+ this.ctx.translate(offsetX, offsetY);
149
+ this.ctx.fill();
150
+ this.ctx.translate(-offsetX, -offsetY);
151
+ }
152
+ /**
153
+ * Resize an image to target dimensions
154
+ *
155
+ * @param image - Source image
156
+ * @param width - Target width
157
+ * @param height - Target height
158
+ * @param imageRendering - CSS image-rendering property value
159
+ * @returns Resized canvas or original image
160
+ */
161
+ resizeImage(image, width, height, imageRendering) {
162
+ // https://github.com/niklasvh/html2canvas/pull/2911
163
+ // if (image.width === width && image.height === height) {
164
+ // return image;
165
+ // }
166
+ const ownerDocument = this.canvas.ownerDocument ?? document;
167
+ const canvas = ownerDocument.createElement('canvas');
168
+ canvas.width = Math.max(1, width);
169
+ canvas.height = Math.max(1, height);
170
+ const ctx = canvas.getContext('2d');
171
+ // Apply image smoothing based on CSS image-rendering property
172
+ if (imageRendering === image_rendering_1.IMAGE_RENDERING.PIXELATED || imageRendering === image_rendering_1.IMAGE_RENDERING.CRISP_EDGES) {
173
+ this.context.logger.debug(`Disabling image smoothing for background image due to CSS image-rendering`);
174
+ ctx.imageSmoothingEnabled = false;
175
+ }
176
+ else if (imageRendering === image_rendering_1.IMAGE_RENDERING.SMOOTH) {
177
+ this.context.logger.debug(`Enabling image smoothing for background image due to CSS image-rendering: smooth`);
178
+ ctx.imageSmoothingEnabled = true;
179
+ }
180
+ else {
181
+ // AUTO: inherit from main renderer context
182
+ ctx.imageSmoothingEnabled = this.ctx.imageSmoothingEnabled;
183
+ }
184
+ // Inherit quality setting
185
+ if (this.ctx.imageSmoothingQuality) {
186
+ ctx.imageSmoothingQuality = this.ctx.imageSmoothingQuality;
187
+ }
188
+ ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);
189
+ return canvas;
190
+ }
191
+ /**
192
+ * Create a canvas path from path array
193
+ *
194
+ * @param paths - Array of path points
195
+ */
196
+ path(paths) {
197
+ this.ctx.beginPath();
198
+ this.formatPath(paths);
199
+ this.ctx.closePath();
200
+ }
201
+ /**
202
+ * Format path points into canvas path
203
+ *
204
+ * @param paths - Array of path points
205
+ */
206
+ formatPath(paths) {
207
+ paths.forEach((point, index) => {
208
+ const start = (0, bezier_curve_1.isBezierCurve)(point) ? point.start : point;
209
+ if (index === 0) {
210
+ this.ctx.moveTo(start.x, start.y);
211
+ }
212
+ else {
213
+ this.ctx.lineTo(start.x, start.y);
214
+ }
215
+ if ((0, bezier_curve_1.isBezierCurve)(point)) {
216
+ this.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);
217
+ }
218
+ });
219
+ }
220
+ }
221
+ exports.BackgroundRenderer = BackgroundRenderer;
222
+ //# sourceMappingURL=background-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-renderer.js","sourceRoot":"","sources":["../../../../src/render/canvas/background-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Border Renderer
4
+ *
5
+ * Handles rendering of element borders including:
6
+ * - Solid borders
7
+ * - Double borders
8
+ * - Dashed borders
9
+ * - Dotted borders
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BorderRenderer = void 0;
13
+ const color_utilities_1 = require("../../css/types/color-utilities");
14
+ const border_1 = require("../border");
15
+ const bezier_curve_1 = require("../bezier-curve");
16
+ const vector_1 = require("../vector");
17
+ /**
18
+ * Border Renderer
19
+ *
20
+ * Specialized renderer for element borders.
21
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
22
+ */
23
+ class BorderRenderer {
24
+ constructor(deps, pathCallbacks) {
25
+ this.ctx = deps.ctx;
26
+ this.pathCallbacks = pathCallbacks;
27
+ }
28
+ /**
29
+ * Render a solid border
30
+ *
31
+ * @param color - Border color
32
+ * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
33
+ * @param curvePoints - Border curve points
34
+ */
35
+ async renderSolidBorder(color, side, curvePoints) {
36
+ this.pathCallbacks.path((0, border_1.parsePathForBorder)(curvePoints, side));
37
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(color);
38
+ this.ctx.fill();
39
+ }
40
+ /**
41
+ * Render a double border
42
+ * Falls back to solid border if width is too small
43
+ *
44
+ * @param color - Border color
45
+ * @param width - Border width
46
+ * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
47
+ * @param curvePoints - Border curve points
48
+ */
49
+ async renderDoubleBorder(color, width, side, curvePoints) {
50
+ if (width < 3) {
51
+ await this.renderSolidBorder(color, side, curvePoints);
52
+ return;
53
+ }
54
+ const outerPaths = (0, border_1.parsePathForBorderDoubleOuter)(curvePoints, side);
55
+ this.pathCallbacks.path(outerPaths);
56
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(color);
57
+ this.ctx.fill();
58
+ const innerPaths = (0, border_1.parsePathForBorderDoubleInner)(curvePoints, side);
59
+ this.pathCallbacks.path(innerPaths);
60
+ this.ctx.fill();
61
+ }
62
+ /**
63
+ * Render a dashed or dotted border
64
+ *
65
+ * @param color - Border color
66
+ * @param width - Border width
67
+ * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
68
+ * @param curvePoints - Border curve points
69
+ * @param style - Border style (DASHED or DOTTED)
70
+ */
71
+ async renderDashedDottedBorder(color, width, side, curvePoints, style) {
72
+ this.ctx.save();
73
+ const strokePaths = (0, border_1.parsePathForBorderStroke)(curvePoints, side);
74
+ const boxPaths = (0, border_1.parsePathForBorder)(curvePoints, side);
75
+ if (style === 2 /* BORDER_STYLE.DASHED */) {
76
+ this.pathCallbacks.path(boxPaths);
77
+ this.ctx.clip();
78
+ }
79
+ // Extract start and end coordinates
80
+ let startX, startY, endX, endY;
81
+ if ((0, bezier_curve_1.isBezierCurve)(boxPaths[0])) {
82
+ startX = boxPaths[0].start.x;
83
+ startY = boxPaths[0].start.y;
84
+ }
85
+ else {
86
+ startX = boxPaths[0].x;
87
+ startY = boxPaths[0].y;
88
+ }
89
+ if ((0, bezier_curve_1.isBezierCurve)(boxPaths[1])) {
90
+ endX = boxPaths[1].end.x;
91
+ endY = boxPaths[1].end.y;
92
+ }
93
+ else {
94
+ endX = boxPaths[1].x;
95
+ endY = boxPaths[1].y;
96
+ }
97
+ // Calculate border length
98
+ let length;
99
+ if (side === 0 || side === 2) {
100
+ length = Math.abs(startX - endX);
101
+ }
102
+ else {
103
+ length = Math.abs(startY - endY);
104
+ }
105
+ this.ctx.beginPath();
106
+ if (style === 3 /* BORDER_STYLE.DOTTED */) {
107
+ this.pathCallbacks.formatPath(strokePaths);
108
+ }
109
+ else {
110
+ this.pathCallbacks.formatPath(boxPaths.slice(0, 2));
111
+ }
112
+ // Calculate dash and space lengths
113
+ let dashLength = width < 3 ? width * 3 : width * 2;
114
+ let spaceLength = width < 3 ? width * 2 : width;
115
+ if (style === 3 /* BORDER_STYLE.DOTTED */) {
116
+ dashLength = width;
117
+ spaceLength = width;
118
+ }
119
+ // Adjust dash pattern for border length
120
+ let useLineDash = true;
121
+ if (length <= dashLength * 2) {
122
+ useLineDash = false;
123
+ }
124
+ else if (length <= dashLength * 2 + spaceLength) {
125
+ const multiplier = length / (2 * dashLength + spaceLength);
126
+ dashLength *= multiplier;
127
+ spaceLength *= multiplier;
128
+ }
129
+ else {
130
+ const numberOfDashes = Math.floor((length + spaceLength) / (dashLength + spaceLength));
131
+ const minSpace = (length - numberOfDashes * dashLength) / (numberOfDashes - 1);
132
+ const maxSpace = (length - (numberOfDashes + 1) * dashLength) / numberOfDashes;
133
+ spaceLength =
134
+ maxSpace <= 0 || Math.abs(spaceLength - minSpace) < Math.abs(spaceLength - maxSpace)
135
+ ? minSpace
136
+ : maxSpace;
137
+ }
138
+ // Apply line dash pattern
139
+ if (useLineDash) {
140
+ if (style === 3 /* BORDER_STYLE.DOTTED */) {
141
+ this.ctx.setLineDash([0, dashLength + spaceLength]);
142
+ }
143
+ else {
144
+ this.ctx.setLineDash([dashLength, spaceLength]);
145
+ }
146
+ }
147
+ // Set line style and stroke
148
+ if (style === 3 /* BORDER_STYLE.DOTTED */) {
149
+ this.ctx.lineCap = 'round';
150
+ this.ctx.lineWidth = width;
151
+ }
152
+ else {
153
+ this.ctx.lineWidth = width * 2 + 1.1;
154
+ }
155
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(color);
156
+ this.ctx.stroke();
157
+ this.ctx.setLineDash([]);
158
+ // Fill dashed round edge gaps
159
+ if (style === 2 /* BORDER_STYLE.DASHED */) {
160
+ if ((0, bezier_curve_1.isBezierCurve)(boxPaths[0])) {
161
+ const path1 = boxPaths[3];
162
+ const path2 = boxPaths[0];
163
+ this.ctx.beginPath();
164
+ this.pathCallbacks.formatPath([
165
+ new vector_1.Vector(path1.end.x, path1.end.y),
166
+ new vector_1.Vector(path2.start.x, path2.start.y)
167
+ ]);
168
+ this.ctx.stroke();
169
+ }
170
+ if ((0, bezier_curve_1.isBezierCurve)(boxPaths[1])) {
171
+ const path1 = boxPaths[1];
172
+ const path2 = boxPaths[2];
173
+ this.ctx.beginPath();
174
+ this.pathCallbacks.formatPath([
175
+ new vector_1.Vector(path1.end.x, path1.end.y),
176
+ new vector_1.Vector(path2.start.x, path2.start.y)
177
+ ]);
178
+ this.ctx.stroke();
179
+ }
180
+ }
181
+ this.ctx.restore();
182
+ }
183
+ }
184
+ exports.BorderRenderer = BorderRenderer;
185
+ //# sourceMappingURL=border-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border-renderer.js","sourceRoot":"","sources":["../../../../src/render/canvas/border-renderer.ts"],"names":[],"mappings":"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"}