canvas2gl 1.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.
- package/README.md +376 -0
- package/README_zh.md +375 -0
- package/dist/gradient.d.ts +21 -0
- package/dist/gradient.js +137 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +409 -0
- package/dist/renderer.d.ts +55 -0
- package/dist/renderer.js +871 -0
- package/dist/shapes.d.ts +9 -0
- package/dist/shapes.js +165 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.js +1 -0
- package/package.json +32 -0
package/dist/shapes.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Point2D } from './types.js';
|
|
2
|
+
export declare function triangulateRect(x: number, y: number, w: number, h: number): Point2D[];
|
|
3
|
+
export declare function arcToPoints(cx: number, cy: number, r: number, startAngle: number, endAngle: number, anticlockwise: boolean, segments?: number): Point2D[];
|
|
4
|
+
export declare function triangulateArc(cx: number, cy: number, r: number, startAngle: number, endAngle: number, anticlockwise: boolean, segments?: number): Point2D[];
|
|
5
|
+
export declare function triangulateFillPath(points: Point2D[]): Point2D[];
|
|
6
|
+
export declare function triangulateStrokePath(points: Point2D[], lineWidth: number, closed: boolean): Point2D[];
|
|
7
|
+
export declare function quadVerts(dx: number, dy: number, dw: number, dh: number, sx: number, sy: number, sw: number, sh: number, texW: number, texH: number): Float32Array;
|
|
8
|
+
export declare function cubicBezierPoints(x0: number, y0: number, cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number, segments?: number): Point2D[];
|
|
9
|
+
export declare function quadraticBezierPoints(x0: number, y0: number, cpx: number, cpy: number, x: number, y: number, segments?: number): Point2D[];
|
package/dist/shapes.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
export function triangulateRect(x, y, w, h) {
|
|
2
|
+
return [
|
|
3
|
+
{ x, y }, { x: x + w, y }, { x, y: y + h },
|
|
4
|
+
{ x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h },
|
|
5
|
+
];
|
|
6
|
+
}
|
|
7
|
+
export function arcToPoints(cx, cy, r, startAngle, endAngle, anticlockwise, segments) {
|
|
8
|
+
const pts = [];
|
|
9
|
+
let diff = endAngle - startAngle;
|
|
10
|
+
if (anticlockwise && diff > 0)
|
|
11
|
+
diff -= Math.PI * 2;
|
|
12
|
+
if (!anticlockwise && diff < 0)
|
|
13
|
+
diff += Math.PI * 2;
|
|
14
|
+
const seg = segments ?? Math.max(16, Math.ceil(Math.abs(r) * 0.5));
|
|
15
|
+
for (let i = 0; i <= seg; i++) {
|
|
16
|
+
const t = i / seg;
|
|
17
|
+
const angle = startAngle + diff * t;
|
|
18
|
+
pts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });
|
|
19
|
+
}
|
|
20
|
+
return pts;
|
|
21
|
+
}
|
|
22
|
+
export function triangulateArc(cx, cy, r, startAngle, endAngle, anticlockwise, segments) {
|
|
23
|
+
const pts = arcToPoints(cx, cy, r, startAngle, endAngle, anticlockwise, segments);
|
|
24
|
+
const verts = [];
|
|
25
|
+
for (let i = 1; i < pts.length; i++) {
|
|
26
|
+
verts.push({ x: cx, y: cy }, pts[i - 1], pts[i]);
|
|
27
|
+
}
|
|
28
|
+
return verts;
|
|
29
|
+
}
|
|
30
|
+
export function triangulateFillPath(points) {
|
|
31
|
+
if (points.length < 3)
|
|
32
|
+
return [];
|
|
33
|
+
const verts = [];
|
|
34
|
+
for (let i = 1; i < points.length - 1; i++) {
|
|
35
|
+
verts.push(points[0], points[i], points[i + 1]);
|
|
36
|
+
}
|
|
37
|
+
return verts;
|
|
38
|
+
}
|
|
39
|
+
export function triangulateStrokePath(points, lineWidth, closed) {
|
|
40
|
+
if (points.length < 2)
|
|
41
|
+
return [];
|
|
42
|
+
const verts = [];
|
|
43
|
+
const half = lineWidth / 2;
|
|
44
|
+
const miterLimit = 4;
|
|
45
|
+
const n = points.length;
|
|
46
|
+
const segCount = closed ? n : n - 1;
|
|
47
|
+
const offsets = [];
|
|
48
|
+
for (let i = 0; i < segCount + 1; i++) {
|
|
49
|
+
const pi = points[((i - 1) + n) % n] ?? points[i - 1];
|
|
50
|
+
const p = points[i % n];
|
|
51
|
+
const pn = points[(i + 1) % n] ?? points[i + 1];
|
|
52
|
+
if (i === 0 && !closed) {
|
|
53
|
+
const dx = pn.x - p.x;
|
|
54
|
+
const dy = pn.y - p.y;
|
|
55
|
+
const d = Math.sqrt(dx * dx + dy * dy);
|
|
56
|
+
if (d === 0) {
|
|
57
|
+
offsets.push({ ox: 0, oy: 0, ix: 0, iy: 0 });
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const nx = (-dy / d) * half;
|
|
61
|
+
const ny = (dx / d) * half;
|
|
62
|
+
offsets.push({ ox: nx, oy: ny, ix: -nx, iy: -ny });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (i === segCount && !closed) {
|
|
66
|
+
const dx = p.x - pi.x;
|
|
67
|
+
const dy = p.y - pi.y;
|
|
68
|
+
const d = Math.sqrt(dx * dx + dy * dy);
|
|
69
|
+
if (d === 0) {
|
|
70
|
+
offsets.push({ ox: 0, oy: 0, ix: 0, iy: 0 });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const nx = (-dy / d) * half;
|
|
74
|
+
const ny = (dx / d) * half;
|
|
75
|
+
offsets.push({ ox: nx, oy: ny, ix: -nx, iy: -ny });
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const dx1 = p.x - pi.x;
|
|
79
|
+
const dy1 = p.y - pi.y;
|
|
80
|
+
const d1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
|
|
81
|
+
const dx2 = pn.x - p.x;
|
|
82
|
+
const dy2 = pn.y - p.y;
|
|
83
|
+
const d2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
|
|
84
|
+
if (d1 === 0 || d2 === 0) {
|
|
85
|
+
const dx = d2 !== 0 ? dx2 : dx1;
|
|
86
|
+
const dy = d2 !== 0 ? dy2 : dy1;
|
|
87
|
+
const d = Math.max(d1, d2);
|
|
88
|
+
if (d === 0) {
|
|
89
|
+
offsets.push({ ox: 0, oy: 0, ix: 0, iy: 0 });
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const nx = (-dy / d) * half;
|
|
93
|
+
const ny = (dx / d) * half;
|
|
94
|
+
offsets.push({ ox: nx, oy: ny, ix: -nx, iy: -ny });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const nx1 = -dy1 / d1;
|
|
98
|
+
const ny1 = dx1 / d1;
|
|
99
|
+
const nx2 = -dy2 / d2;
|
|
100
|
+
const ny2 = dx2 / d2;
|
|
101
|
+
const cross = nx1 * ny2 - ny1 * nx2;
|
|
102
|
+
const dot = nx1 * nx2 + ny1 * ny2;
|
|
103
|
+
const miter = Math.sqrt(2 / (1 - dot));
|
|
104
|
+
if (Math.abs(cross) < 0.01 || miter > miterLimit) {
|
|
105
|
+
const mx = (nx1 + nx2) * half * 0.5;
|
|
106
|
+
const my = (ny1 + ny2) * half * 0.5;
|
|
107
|
+
offsets.push({ ox: mx, oy: my, ix: -mx, iy: -my });
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const ml = Math.min(miter, miterLimit);
|
|
111
|
+
const mx = (nx1 + nx2) * half * ml / Math.sqrt(2);
|
|
112
|
+
const my = (ny1 + ny2) * half * ml / Math.sqrt(2);
|
|
113
|
+
if (cross > 0) {
|
|
114
|
+
offsets.push({ ox: -mx, oy: -my, ix: mx, iy: my });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
offsets.push({ ox: mx, oy: my, ix: -mx, iy: -my });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
for (let i = 0; i < segCount; i++) {
|
|
122
|
+
const p0 = points[i % n];
|
|
123
|
+
const p1 = points[(i + 1) % n];
|
|
124
|
+
const o0 = offsets[i];
|
|
125
|
+
const o1 = offsets[i + 1];
|
|
126
|
+
verts.push({ x: p0.x + o0.ox, y: p0.y + o0.oy }, { x: p0.x + o0.ix, y: p0.y + o0.iy }, { x: p1.x + o1.ox, y: p1.y + o1.oy }, { x: p0.x + o0.ix, y: p0.y + o0.iy }, { x: p1.x + o1.ix, y: p1.y + o1.iy }, { x: p1.x + o1.ox, y: p1.y + o1.oy });
|
|
127
|
+
}
|
|
128
|
+
return verts;
|
|
129
|
+
}
|
|
130
|
+
export function quadVerts(dx, dy, dw, dh, sx, sy, sw, sh, texW, texH) {
|
|
131
|
+
const u0 = sx / texW;
|
|
132
|
+
const v0 = sy / texH;
|
|
133
|
+
const u1 = (sx + sw) / texW;
|
|
134
|
+
const v1 = (sy + sh) / texH;
|
|
135
|
+
return new Float32Array([
|
|
136
|
+
dx, dy, u0, v0,
|
|
137
|
+
dx + dw, dy, u1, v0,
|
|
138
|
+
dx, dy + dh, u0, v1,
|
|
139
|
+
dx + dw, dy, u1, v0,
|
|
140
|
+
dx + dw, dy + dh, u1, v1,
|
|
141
|
+
dx, dy + dh, u0, v1,
|
|
142
|
+
]);
|
|
143
|
+
}
|
|
144
|
+
export function cubicBezierPoints(x0, y0, cp1x, cp1y, cp2x, cp2y, x, y, segments = 30) {
|
|
145
|
+
const pts = [];
|
|
146
|
+
for (let i = 1; i <= segments; i++) {
|
|
147
|
+
const t = i / segments;
|
|
148
|
+
const ti = 1 - t;
|
|
149
|
+
const px = ti * ti * ti * x0 + 3 * ti * ti * t * cp1x + 3 * ti * t * t * cp2x + t * t * t * x;
|
|
150
|
+
const py = ti * ti * ti * y0 + 3 * ti * ti * t * cp1y + 3 * ti * t * t * cp2y + t * t * t * y;
|
|
151
|
+
pts.push({ x: px, y: py });
|
|
152
|
+
}
|
|
153
|
+
return pts;
|
|
154
|
+
}
|
|
155
|
+
export function quadraticBezierPoints(x0, y0, cpx, cpy, x, y, segments = 20) {
|
|
156
|
+
const pts = [];
|
|
157
|
+
for (let i = 1; i <= segments; i++) {
|
|
158
|
+
const t = i / segments;
|
|
159
|
+
const ti = 1 - t;
|
|
160
|
+
const px = ti * ti * x0 + 2 * ti * t * cpx + t * t * x;
|
|
161
|
+
const py = ti * ti * y0 + 2 * ti * t * cpy + t * t * y;
|
|
162
|
+
pts.push({ x: px, y: py });
|
|
163
|
+
}
|
|
164
|
+
return pts;
|
|
165
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface Point2D {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface PathCommand {
|
|
6
|
+
type: 'moveTo' | 'lineTo' | 'arc' | 'rect' | 'bezierCurveTo' | 'quadraticCurveTo';
|
|
7
|
+
x?: number;
|
|
8
|
+
y?: number;
|
|
9
|
+
cx?: number;
|
|
10
|
+
cy?: number;
|
|
11
|
+
radius?: number;
|
|
12
|
+
startAngle?: number;
|
|
13
|
+
endAngle?: number;
|
|
14
|
+
anticlockwise?: boolean;
|
|
15
|
+
rx?: number;
|
|
16
|
+
ry?: number;
|
|
17
|
+
rw?: number;
|
|
18
|
+
rh?: number;
|
|
19
|
+
cp1x?: number;
|
|
20
|
+
cp1y?: number;
|
|
21
|
+
cp2x?: number;
|
|
22
|
+
cp2y?: number;
|
|
23
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "canvas2gl",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A high-performance 2D graphics library that maps the Canvas 2D API to WebGL rendering",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/",
|
|
17
|
+
"README.md",
|
|
18
|
+
"README_zh.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"canvas2d",
|
|
26
|
+
"webgl",
|
|
27
|
+
"2d",
|
|
28
|
+
"graphics",
|
|
29
|
+
"rendering"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT"
|
|
32
|
+
}
|