apexify.js 4.6.2 → 4.6.3
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.
- package/dist/cjs/ai/functions/readFiles.js +1 -1
- package/dist/cjs/ai/functions/readFiles.js.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/chatmodels.d.ts.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/chatmodels.js +2 -1
- package/dist/cjs/ai/modals-chat/electronHub/chatmodels.js.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/speechModels.d.ts.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/speechModels.js +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/speechModels.js.map +1 -1
- package/dist/cjs/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/cjs/canvas/ApexPainter.js +27 -28
- package/dist/cjs/canvas/ApexPainter.js.map +1 -1
- package/dist/cjs/canvas/Themes/Level-Up/levelup.d.ts +11 -0
- package/dist/cjs/canvas/Themes/Level-Up/levelup.d.ts.map +1 -0
- package/dist/cjs/canvas/Themes/Level-Up/levelup.js +163 -0
- package/dist/cjs/canvas/Themes/Level-Up/levelup.js.map +1 -0
- package/dist/cjs/canvas/utils/Background/bg.d.ts +17 -10
- package/dist/cjs/canvas/utils/Background/bg.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/Background/bg.js +102 -27
- package/dist/cjs/canvas/utils/Background/bg.js.map +1 -1
- package/dist/cjs/canvas/utils/Custom/customLines.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/Custom/customLines.js +43 -19
- package/dist/cjs/canvas/utils/Custom/customLines.js.map +1 -1
- package/dist/cjs/canvas/utils/General/general functions.d.ts +6 -1
- package/dist/cjs/canvas/utils/General/general functions.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/General/general functions.js +19 -20
- package/dist/cjs/canvas/utils/General/general functions.js.map +1 -1
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts +3 -9
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/Image/imageProperties.js +220 -214
- package/dist/cjs/canvas/utils/Image/imageProperties.js.map +1 -1
- package/dist/cjs/canvas/utils/Texts/textProperties.d.ts +12 -14
- package/dist/cjs/canvas/utils/Texts/textProperties.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/Texts/textProperties.js +100 -91
- package/dist/cjs/canvas/utils/Texts/textProperties.js.map +1 -1
- package/dist/cjs/canvas/utils/types.d.ts +89 -109
- package/dist/cjs/canvas/utils/types.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/types.js.map +1 -1
- package/dist/cjs/canvas/utils/utils.d.ts +2 -4
- package/dist/cjs/canvas/utils/utils.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/utils.js +2 -5
- package/dist/cjs/canvas/utils/utils.js.map +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +31 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/ai/functions/readFiles.js +1 -1
- package/dist/esm/ai/functions/readFiles.js.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/chatmodels.d.ts.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/chatmodels.js +2 -1
- package/dist/esm/ai/modals-chat/electronHub/chatmodels.js.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/speechModels.d.ts.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/speechModels.js +1 -1
- package/dist/esm/ai/modals-chat/electronHub/speechModels.js.map +1 -1
- package/dist/esm/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/esm/canvas/ApexPainter.js +27 -28
- package/dist/esm/canvas/ApexPainter.js.map +1 -1
- package/dist/esm/canvas/Themes/Level-Up/levelup.d.ts +11 -0
- package/dist/esm/canvas/Themes/Level-Up/levelup.d.ts.map +1 -0
- package/dist/esm/canvas/Themes/Level-Up/levelup.js +163 -0
- package/dist/esm/canvas/Themes/Level-Up/levelup.js.map +1 -0
- package/dist/esm/canvas/utils/Background/bg.d.ts +17 -10
- package/dist/esm/canvas/utils/Background/bg.d.ts.map +1 -1
- package/dist/esm/canvas/utils/Background/bg.js +102 -27
- package/dist/esm/canvas/utils/Background/bg.js.map +1 -1
- package/dist/esm/canvas/utils/Custom/customLines.d.ts.map +1 -1
- package/dist/esm/canvas/utils/Custom/customLines.js +43 -19
- package/dist/esm/canvas/utils/Custom/customLines.js.map +1 -1
- package/dist/esm/canvas/utils/General/general functions.d.ts +6 -1
- package/dist/esm/canvas/utils/General/general functions.d.ts.map +1 -1
- package/dist/esm/canvas/utils/General/general functions.js +19 -20
- package/dist/esm/canvas/utils/General/general functions.js.map +1 -1
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts +3 -9
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts.map +1 -1
- package/dist/esm/canvas/utils/Image/imageProperties.js +220 -214
- package/dist/esm/canvas/utils/Image/imageProperties.js.map +1 -1
- package/dist/esm/canvas/utils/Texts/textProperties.d.ts +12 -14
- package/dist/esm/canvas/utils/Texts/textProperties.d.ts.map +1 -1
- package/dist/esm/canvas/utils/Texts/textProperties.js +100 -91
- package/dist/esm/canvas/utils/Texts/textProperties.js.map +1 -1
- package/dist/esm/canvas/utils/types.d.ts +89 -109
- package/dist/esm/canvas/utils/types.d.ts.map +1 -1
- package/dist/esm/canvas/utils/types.js.map +1 -1
- package/dist/esm/canvas/utils/utils.d.ts +2 -4
- package/dist/esm/canvas/utils/utils.d.ts.map +1 -1
- package/dist/esm/canvas/utils/utils.js +2 -5
- package/dist/esm/canvas/utils/utils.js.map +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +31 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/ai/functions/readFiles.ts +1 -1
- package/lib/ai/modals-chat/electronHub/chatmodels.ts +4 -2
- package/lib/ai/modals-chat/electronHub/speechModels.ts +2 -1
- package/lib/canvas/ApexPainter.ts +52 -61
- package/lib/canvas/Themes/Level-Up/levelup.ts +183 -0
- package/lib/canvas/utils/Background/bg.ts +179 -65
- package/lib/canvas/utils/Custom/customLines.ts +53 -20
- package/lib/canvas/utils/General/general functions.ts +21 -29
- package/lib/canvas/utils/Image/imageProperties.ts +399 -318
- package/lib/canvas/utils/Texts/textProperties.ts +213 -162
- package/lib/canvas/utils/types.ts +74 -107
- package/lib/canvas/utils/utils.ts +2 -5
- package/lib/index.ts +38 -10
- package/package.json +2 -2
- package/dist/cjs/canvas/utils/Background/circular.d.ts +0 -3
- package/dist/cjs/canvas/utils/Background/circular.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/Background/circular.js +0 -13
- package/dist/cjs/canvas/utils/Background/circular.js.map +0 -1
- package/dist/cjs/canvas/utils/Background/radius.d.ts +0 -18
- package/dist/cjs/canvas/utils/Background/radius.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/Background/radius.js +0 -104
- package/dist/cjs/canvas/utils/Background/radius.js.map +0 -1
- package/dist/esm/canvas/utils/Background/circular.d.ts +0 -3
- package/dist/esm/canvas/utils/Background/circular.d.ts.map +0 -1
- package/dist/esm/canvas/utils/Background/circular.js +0 -13
- package/dist/esm/canvas/utils/Background/circular.js.map +0 -1
- package/dist/esm/canvas/utils/Background/radius.d.ts +0 -18
- package/dist/esm/canvas/utils/Background/radius.d.ts.map +0 -1
- package/dist/esm/canvas/utils/Background/radius.js +0 -104
- package/dist/esm/canvas/utils/Background/radius.js.map +0 -1
- package/lib/canvas/utils/Background/circular.ts +0 -17
- package/lib/canvas/utils/Background/radius.ts +0 -102
|
@@ -1,180 +1,231 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SKRSContext2D } from '@napi-rs/canvas';
|
|
2
|
+
import { TextObject } from '../types';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @param ctx
|
|
6
|
-
* @param textOptions
|
|
5
|
+
* The main function that draws text with optional wrapping.
|
|
6
|
+
* @param ctx CanvasRenderingContext2D
|
|
7
|
+
* @param textOptions TextObject
|
|
7
8
|
*/
|
|
8
|
-
export function drawText(ctx:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// Apply gradient fill
|
|
42
|
-
if (textOptions.gradient) {
|
|
43
|
-
const gradientFill = createGradient(
|
|
44
|
-
ctx,
|
|
45
|
-
textOptions.gradient,
|
|
46
|
-
textOptions.x || 0,
|
|
47
|
-
textOptions.y || 0 - textHeight,
|
|
48
|
-
(textOptions.x || 0) + textWidth,
|
|
49
|
-
(textOptions.y || 0)
|
|
50
|
-
);
|
|
51
|
-
console.log("Gradient Fill Created:", gradientFill);
|
|
52
|
-
ctx.fillStyle = gradientFill;
|
|
53
|
-
} else {
|
|
54
|
-
ctx.fillStyle = textOptions.color || 'darkgray';
|
|
9
|
+
export function drawText(ctx: SKRSContext2D, textOptions: TextObject) {
|
|
10
|
+
ctx.save();
|
|
11
|
+
|
|
12
|
+
// 1) Apply rotation if any
|
|
13
|
+
if (textOptions.rotation && textOptions.rotation !== 0) {
|
|
14
|
+
ctx.translate(textOptions.x || 0, textOptions.y || 0);
|
|
15
|
+
ctx.rotate((textOptions.rotation * Math.PI) / 180);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 2) Setup font (for measuring and for final draw)
|
|
19
|
+
const fontSize = textOptions.fontSize || 16;
|
|
20
|
+
const isBold = textOptions.isBold ? 'bold ' : '';
|
|
21
|
+
const fontFamily = textOptions.fontName || (textOptions.fontPath ? 'customFont' : 'Arial');
|
|
22
|
+
ctx.font = `${isBold}${fontSize}px "${fontFamily}"`;
|
|
23
|
+
|
|
24
|
+
// 3) Alignment, baseline
|
|
25
|
+
ctx.textAlign = textOptions.textAlign || 'left';
|
|
26
|
+
ctx.textBaseline = textOptions.textBaseline || 'alphabetic';
|
|
27
|
+
|
|
28
|
+
// 4) Shadow
|
|
29
|
+
if (textOptions.shadow) {
|
|
30
|
+
const { color, offsetX, offsetY, blur, opacity } = textOptions.shadow;
|
|
31
|
+
ctx.shadowColor = color || 'transparent';
|
|
32
|
+
ctx.shadowOffsetX = offsetX || 0;
|
|
33
|
+
ctx.shadowOffsetY = offsetY || 0;
|
|
34
|
+
ctx.shadowBlur = blur || 0;
|
|
35
|
+
ctx.globalAlpha = opacity !== undefined ? opacity : 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 5) Opacity
|
|
39
|
+
if (textOptions.opacity !== undefined) {
|
|
40
|
+
if (textOptions.opacity < 0 || textOptions.opacity > 1) {
|
|
41
|
+
throw new Error('Text opacity must be between 0 and 1.');
|
|
55
42
|
}
|
|
43
|
+
ctx.globalAlpha = textOptions.opacity;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 6) If maxWidth is provided, we do word wrapping
|
|
47
|
+
if (textOptions.maxWidth) {
|
|
48
|
+
WrappedText(
|
|
49
|
+
ctx,
|
|
50
|
+
textOptions.text as string,
|
|
51
|
+
textOptions.x || 0,
|
|
52
|
+
textOptions.y || 0,
|
|
53
|
+
textOptions.maxWidth,
|
|
54
|
+
textOptions
|
|
55
|
+
);
|
|
56
|
+
} else {
|
|
57
|
+
// No wrapping needed → just draw stroke + fill
|
|
58
|
+
drawStrokeAndFill(ctx, textOptions.text as string, textOptions.x || 0, textOptions.y || 0, textOptions);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
ctx.restore();
|
|
62
|
+
}
|
|
56
63
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Handles word-based wrapping. Then draws each line with stroke, fill, gradient, etc.
|
|
66
|
+
*/
|
|
67
|
+
export function WrappedText(
|
|
68
|
+
ctx: SKRSContext2D,
|
|
69
|
+
text: string,
|
|
70
|
+
startX: number,
|
|
71
|
+
startY: number,
|
|
72
|
+
maxWidth: number,
|
|
73
|
+
options: TextObject
|
|
74
|
+
) {
|
|
75
|
+
const fontSize = options.fontSize || 16;
|
|
76
|
+
const lineHeight = options.lineHeight || fontSize * 1.4;
|
|
77
|
+
const maxHeight = options.maxHeight;
|
|
78
|
+
const maxLines = maxHeight ? Math.floor(maxHeight / lineHeight) : Infinity;
|
|
79
|
+
|
|
80
|
+
let currentLine = "";
|
|
81
|
+
const words = text.split(" ");
|
|
82
|
+
const lines: string[] = [];
|
|
83
|
+
|
|
84
|
+
for (let i = 0; i < words.length; i++) {
|
|
85
|
+
const testLine = currentLine ? currentLine + " " + words[i] : words[i];
|
|
86
|
+
const testWidth = ctx.measureText(testLine).width;
|
|
87
|
+
|
|
88
|
+
if (testWidth > maxWidth && currentLine) {
|
|
89
|
+
lines.push(currentLine);
|
|
90
|
+
currentLine = words[i];
|
|
91
|
+
|
|
92
|
+
if (lines.length >= maxLines) {
|
|
93
|
+
currentLine = "...";
|
|
94
|
+
break;
|
|
72
95
|
}
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
} else {
|
|
97
|
+
currentLine = testLine;
|
|
98
|
+
}
|
|
75
99
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
WrappedText(ctx, textOptions.text || 'Hello World', textOptions.x || 0, textOptions.y || 0, textOptions.maxWidth, textOptions);
|
|
80
|
-
} else {
|
|
81
|
-
if (!textOptions.rotation) {
|
|
82
|
-
ctx.fillText(textOptions.text, textOptions.x || 0, textOptions.y || 0);
|
|
83
|
-
} else {
|
|
84
|
-
ctx.fillText(textOptions.text, 0, 0);
|
|
85
|
-
}
|
|
100
|
+
|
|
101
|
+
if (currentLine && lines.length < maxLines) {
|
|
102
|
+
lines.push(currentLine);
|
|
86
103
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
|
|
105
|
+
// 🔥 Ensure correct text alignment for Arabic & English
|
|
106
|
+
ctx.textAlign = options.textAlign || "left";
|
|
107
|
+
|
|
108
|
+
// 🎯 Draw each line with stroke & fill together
|
|
109
|
+
let offsetY = 0;
|
|
110
|
+
for (const line of lines) {
|
|
111
|
+
drawStrokeAndFill(ctx, line, startX, startY + offsetY, options);
|
|
112
|
+
offsetY += lineHeight;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
90
116
|
/**
|
|
91
|
-
* Draws
|
|
92
|
-
* @param ctx The canvas rendering context.
|
|
93
|
-
* @param text The text to be drawn.
|
|
94
|
-
* @param x The x-coordinate of the starting point of the text.
|
|
95
|
-
* @param y The y-coordinate of the starting point of the text.
|
|
96
|
-
* @param maxWidth The maximum width for wrapping the text.
|
|
97
|
-
* @param textOptions The options for the text.
|
|
117
|
+
* Draws a single line with correct alignment. Then uses `drawStrokeAndFill` to apply stroke, fill, etc.
|
|
98
118
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
119
|
+
function drawLine(
|
|
120
|
+
ctx: SKRSContext2D,
|
|
121
|
+
lineText: string,
|
|
122
|
+
startX: number,
|
|
123
|
+
startY: number,
|
|
124
|
+
maxWidth: number,
|
|
125
|
+
options: TextObject
|
|
126
|
+
) {
|
|
127
|
+
let xOffset = startX;
|
|
128
|
+
|
|
129
|
+
// If user wants 'center' or 'right', we offset by measured width
|
|
130
|
+
const measuredWidth = ctx.measureText(lineText).width;
|
|
131
|
+
if (options.textAlign === 'center') {
|
|
132
|
+
xOffset = startX + (maxWidth / 2) - (measuredWidth / 2);
|
|
133
|
+
} else if (options.textAlign === 'right') {
|
|
134
|
+
xOffset = startX + maxWidth - measuredWidth;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Finally, draw stroke+fill for this line
|
|
138
|
+
drawStrokeAndFill(ctx, lineText, xOffset, startY, options);
|
|
139
|
+
}
|
|
104
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Actually draws stroke (if any) and fill for the given text & position.
|
|
143
|
+
*/
|
|
144
|
+
function drawStrokeAndFill(
|
|
145
|
+
ctx: SKRSContext2D,
|
|
146
|
+
text: string,
|
|
147
|
+
x: number,
|
|
148
|
+
y: number,
|
|
149
|
+
options: TextObject
|
|
150
|
+
) {
|
|
151
|
+
const fontSize = options.fontSize || 16;
|
|
152
|
+
const textWidth = ctx.measureText(text).width;
|
|
153
|
+
const textHeight = fontSize;
|
|
154
|
+
|
|
155
|
+
// Apply gradient fill if needed
|
|
156
|
+
if (options.gradient) {
|
|
157
|
+
const gradientFill = createGradient(
|
|
158
|
+
ctx,
|
|
159
|
+
options.gradient,
|
|
160
|
+
x,
|
|
161
|
+
y - textHeight,
|
|
162
|
+
x + textWidth,
|
|
163
|
+
y
|
|
164
|
+
);
|
|
165
|
+
ctx.fillStyle = gradientFill;
|
|
166
|
+
} else {
|
|
167
|
+
ctx.fillStyle = options.color || 'darkgray';
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Draw stroke first (if exists)
|
|
171
|
+
if (options.stroke) {
|
|
105
172
|
ctx.save();
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
ctx
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
y = 0;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
for (let n = 0; n < words.length; n++) {
|
|
121
|
-
const testLine = currentLine + words[n] + ' ';
|
|
122
|
-
const metrics = ctx.measureText(testLine);
|
|
123
|
-
const testWidth = metrics.width;
|
|
124
|
-
|
|
125
|
-
if (testWidth > maxWidth && n > 0) {
|
|
126
|
-
const adjustedY = y + lineHeight;
|
|
127
|
-
if (textOptions.outlined || textOptions.stroke) {
|
|
128
|
-
ctx.strokeText(currentLine.trim(), x, adjustedY);
|
|
129
|
-
} else {
|
|
130
|
-
ctx.fillText(currentLine.trim(), x, adjustedY);
|
|
131
|
-
}
|
|
132
|
-
currentLine = words[n] + ' ';
|
|
133
|
-
y += lineHeight;
|
|
134
|
-
} else {
|
|
135
|
-
currentLine = testLine;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const adjustedY = y + lineHeight;
|
|
140
|
-
if (textOptions.outlined || textOptions.stroke) {
|
|
141
|
-
ctx.strokeText(currentLine.trim(), x, adjustedY);
|
|
173
|
+
ctx.lineWidth = options.stroke.width || 1;
|
|
174
|
+
if (options.stroke.gradient) {
|
|
175
|
+
const gradientStroke = createGradient(
|
|
176
|
+
ctx,
|
|
177
|
+
options.stroke.gradient,
|
|
178
|
+
x,
|
|
179
|
+
y - textHeight,
|
|
180
|
+
x + textWidth,
|
|
181
|
+
y
|
|
182
|
+
);
|
|
183
|
+
ctx.strokeStyle = gradientStroke;
|
|
142
184
|
} else {
|
|
143
|
-
|
|
185
|
+
ctx.strokeStyle = options.stroke.color || options.color || 'darkgray';
|
|
144
186
|
}
|
|
145
|
-
|
|
187
|
+
ctx.strokeText(text, x, y);
|
|
146
188
|
ctx.restore();
|
|
147
|
-
}
|
|
189
|
+
}
|
|
148
190
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (!Array.isArray(gradientOptions.colors)) {
|
|
155
|
-
throw new Error("Invalid gradient options. The colors property should be an array of color stops.");
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
let gradient;
|
|
159
|
-
if (gradientOptions.type === "linear") {
|
|
160
|
-
gradient = ctx.createLinearGradient(startX, startY, endX, endY);
|
|
161
|
-
} else if (gradientOptions.type === "radial") {
|
|
162
|
-
gradient = ctx.createRadialGradient(
|
|
163
|
-
gradientOptions.startX || startX,
|
|
164
|
-
gradientOptions.startY || startY,
|
|
165
|
-
gradientOptions.startRadius || 0,
|
|
166
|
-
gradientOptions.endX || endX,
|
|
167
|
-
gradientOptions.endY || endY,
|
|
168
|
-
gradientOptions.endRadius || 0
|
|
169
|
-
);
|
|
170
|
-
} else {
|
|
171
|
-
throw new Error('Unsupported gradient type. Use "linear" or "radial".');
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
for (const colorStop of gradientOptions.colors) {
|
|
175
|
-
console.log(`Adding color stop: ${colorStop.stop} ${colorStop.color}`);
|
|
176
|
-
gradient.addColorStop(colorStop.stop, colorStop.color);
|
|
177
|
-
}
|
|
191
|
+
// Then fill
|
|
192
|
+
ctx.fillText(text, x, y);
|
|
193
|
+
}
|
|
178
194
|
|
|
179
|
-
|
|
195
|
+
/**
|
|
196
|
+
* Creates a linear or radial gradient for fill/stroke.
|
|
197
|
+
*/
|
|
198
|
+
export function createGradient(
|
|
199
|
+
ctx: SKRSContext2D,
|
|
200
|
+
gradientOptions: any,
|
|
201
|
+
startX: number,
|
|
202
|
+
startY: number,
|
|
203
|
+
endX: number,
|
|
204
|
+
endY: number
|
|
205
|
+
) {
|
|
206
|
+
if (!gradientOptions || !gradientOptions.type || !gradientOptions.colors) {
|
|
207
|
+
throw new Error("Invalid gradient options. Provide a valid object with type and colors properties.");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
let gradient: CanvasGradient;
|
|
211
|
+
if (gradientOptions.type === "linear") {
|
|
212
|
+
gradient = ctx.createLinearGradient(startX, startY, endX, endY);
|
|
213
|
+
} else if (gradientOptions.type === "radial") {
|
|
214
|
+
gradient = ctx.createRadialGradient(
|
|
215
|
+
gradientOptions.startX || startX,
|
|
216
|
+
gradientOptions.startY || startY,
|
|
217
|
+
gradientOptions.startRadius || 0,
|
|
218
|
+
gradientOptions.endX || endX,
|
|
219
|
+
gradientOptions.endY || endY,
|
|
220
|
+
gradientOptions.endRadius || 0
|
|
221
|
+
);
|
|
222
|
+
} else {
|
|
223
|
+
throw new Error('Unsupported gradient type. Use "linear" or "radial".');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
for (const colorStop of gradientOptions.colors) {
|
|
227
|
+
gradient.addColorStop(colorStop.stop, colorStop.color);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return gradient;
|
|
180
231
|
}
|