@codehz/draw-call 0.1.0 → 0.1.1

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.
@@ -0,0 +1,234 @@
1
+ //#region src/types/base.d.ts
2
+ type Size = number | `${number}%` | "auto" | "fill";
3
+ interface ColorStop {
4
+ offset: number;
5
+ color: string;
6
+ }
7
+ interface LinearGradientDescriptor {
8
+ type: "linear-gradient";
9
+ angle: number;
10
+ stops: ColorStop[];
11
+ }
12
+ interface RadialGradientDescriptor {
13
+ type: "radial-gradient";
14
+ startX?: number;
15
+ startY?: number;
16
+ startRadius?: number;
17
+ endX?: number;
18
+ endY?: number;
19
+ endRadius?: number;
20
+ stops: ColorStop[];
21
+ }
22
+ type GradientDescriptor = LinearGradientDescriptor | RadialGradientDescriptor;
23
+ type Color = string | CanvasGradient | CanvasPattern | GradientDescriptor;
24
+ declare function linearGradient(angle: number, ...stops: (string | [number, string])[]): LinearGradientDescriptor;
25
+ declare function radialGradient(options: {
26
+ startX?: number;
27
+ startY?: number;
28
+ startRadius?: number;
29
+ endX?: number;
30
+ endY?: number;
31
+ endRadius?: number;
32
+ }, ...stops: (string | [number, string])[]): RadialGradientDescriptor;
33
+ interface Spacing {
34
+ top?: number;
35
+ right?: number;
36
+ bottom?: number;
37
+ left?: number;
38
+ }
39
+ interface Border {
40
+ width?: number;
41
+ color?: Color;
42
+ radius?: number | [number, number, number, number];
43
+ }
44
+ interface Shadow {
45
+ offsetX?: number;
46
+ offsetY?: number;
47
+ blur?: number;
48
+ color?: Color;
49
+ }
50
+ interface FontProps {
51
+ family?: string;
52
+ size?: number;
53
+ weight?: number | "normal" | "bold";
54
+ style?: "normal" | "italic";
55
+ }
56
+ interface StrokeProps {
57
+ color: Color;
58
+ width: number;
59
+ dash?: number[];
60
+ cap?: "butt" | "round" | "square";
61
+ join?: "miter" | "round" | "bevel";
62
+ }
63
+ interface Bounds {
64
+ x: number;
65
+ y: number;
66
+ width: number;
67
+ height: number;
68
+ }
69
+ //#endregion
70
+ //#region src/types/layout.d.ts
71
+ type FlexDirection = "row" | "column" | "row-reverse" | "column-reverse";
72
+ type JustifyContent = "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly";
73
+ type AlignItems = "start" | "end" | "center" | "stretch" | "baseline";
74
+ type AlignSelf = "auto" | AlignItems;
75
+ interface LayoutProps {
76
+ width?: Size;
77
+ height?: Size;
78
+ minWidth?: number;
79
+ maxWidth?: number;
80
+ minHeight?: number;
81
+ maxHeight?: number;
82
+ margin?: number | Spacing;
83
+ padding?: number | Spacing;
84
+ flex?: number;
85
+ alignSelf?: AlignSelf;
86
+ }
87
+ interface ContainerLayoutProps extends LayoutProps {
88
+ direction?: FlexDirection;
89
+ justify?: JustifyContent;
90
+ align?: AlignItems;
91
+ gap?: number;
92
+ wrap?: boolean;
93
+ }
94
+ interface ComputedLayout {
95
+ x: number;
96
+ y: number;
97
+ width: number;
98
+ height: number;
99
+ contentX: number;
100
+ contentY: number;
101
+ contentWidth: number;
102
+ contentHeight: number;
103
+ }
104
+ interface LayoutConstraints {
105
+ minWidth: number;
106
+ maxWidth: number;
107
+ minHeight: number;
108
+ maxHeight: number;
109
+ }
110
+ //#endregion
111
+ //#region src/types/components.d.ts
112
+ type ElementType = "box" | "text" | "image" | "shape" | "stack";
113
+ interface ElementBase {
114
+ type: ElementType;
115
+ }
116
+ interface BoxProps extends ContainerLayoutProps {
117
+ background?: Color;
118
+ border?: Border;
119
+ shadow?: Shadow;
120
+ opacity?: number;
121
+ clip?: boolean;
122
+ children?: Element[];
123
+ }
124
+ interface BoxElement extends ElementBase, BoxProps {
125
+ type: "box";
126
+ }
127
+ interface TextProps extends LayoutProps {
128
+ content: string;
129
+ font?: FontProps;
130
+ color?: Color;
131
+ align?: "left" | "center" | "right";
132
+ verticalAlign?: "top" | "middle" | "bottom";
133
+ lineHeight?: number;
134
+ maxLines?: number;
135
+ ellipsis?: boolean;
136
+ wrap?: boolean;
137
+ shadow?: Shadow;
138
+ stroke?: StrokeProps;
139
+ }
140
+ interface TextElement extends ElementBase, TextProps {
141
+ type: "text";
142
+ }
143
+ interface ImageProps extends LayoutProps {
144
+ src: string | ImageBitmap | CanvasImageSource;
145
+ fit?: "contain" | "cover" | "fill" | "none" | "scale-down";
146
+ position?: {
147
+ x?: "left" | "center" | "right" | number;
148
+ y?: "top" | "center" | "bottom" | number;
149
+ };
150
+ border?: Border;
151
+ shadow?: Shadow;
152
+ opacity?: number;
153
+ }
154
+ interface ImageElement extends ElementBase, ImageProps {
155
+ type: "image";
156
+ }
157
+ type ShapeType = "rect" | "circle" | "ellipse" | "line" | "polygon" | "path";
158
+ interface ShapeProps extends LayoutProps {
159
+ shape: ShapeType;
160
+ fill?: Color;
161
+ stroke?: StrokeProps;
162
+ shadow?: Shadow;
163
+ points?: [number, number][];
164
+ path?: string;
165
+ }
166
+ interface ShapeElement extends ElementBase, ShapeProps {
167
+ type: "shape";
168
+ }
169
+ interface StackProps extends ContainerLayoutProps {
170
+ children: Element[];
171
+ background?: Color;
172
+ border?: Border;
173
+ shadow?: Shadow;
174
+ opacity?: number;
175
+ clip?: boolean;
176
+ }
177
+ interface StackElement extends ElementBase, StackProps {
178
+ type: "stack";
179
+ }
180
+ type Element = BoxElement | TextElement | ImageElement | ShapeElement | StackElement;
181
+ //#endregion
182
+ //#region src/layout/measure.d.ts
183
+ interface MeasureContext {
184
+ measureText(text: string, font: FontProps): {
185
+ width: number;
186
+ height: number;
187
+ offset: number;
188
+ };
189
+ }
190
+ declare function createCanvasMeasureContext(ctx: CanvasRenderingContext2D): MeasureContext;
191
+ //#endregion
192
+ //#region src/layout/engine.d.ts
193
+ interface LayoutNode {
194
+ element: Element;
195
+ layout: ComputedLayout;
196
+ children: LayoutNode[];
197
+ lines?: string[];
198
+ lineOffsets?: number[];
199
+ }
200
+ declare function computeLayout(element: Element, ctx: MeasureContext, constraints: LayoutConstraints, x?: number, y?: number): LayoutNode;
201
+ //#endregion
202
+ //#region src/canvas.d.ts
203
+ interface CanvasOptions {
204
+ width: number;
205
+ height: number;
206
+ pixelRatio?: number;
207
+ canvas?: {
208
+ getContext(type: "2d"): CanvasRenderingContext2D | null;
209
+ width: number;
210
+ height: number;
211
+ };
212
+ }
213
+ interface LayoutSize {
214
+ width: number;
215
+ height: number;
216
+ }
217
+ interface DrawCallCanvas {
218
+ readonly width: number;
219
+ readonly height: number;
220
+ readonly pixelRatio: number;
221
+ render(element: Element): LayoutNode;
222
+ clear(): void;
223
+ getContext(): CanvasRenderingContext2D;
224
+ toDataURL(type?: string, quality?: number): string;
225
+ toBuffer(type?: "image/png" | "image/jpeg"): Promise<Buffer>;
226
+ }
227
+ /**
228
+ * 创建适用于浏览器环境的 Canvas
229
+ *
230
+ * 在浏览器环境中使用,支持传入已有的 canvas 实例
231
+ */
232
+ declare function createCanvas(options: CanvasOptions): DrawCallCanvas;
233
+ //#endregion
234
+ export { Shadow as A, Bounds as C, GradientDescriptor as D, FontProps as E, radialGradient as F, Spacing as M, StrokeProps as N, LinearGradientDescriptor as O, linearGradient as P, Border as S, ColorStop as T, AlignSelf as _, LayoutNode as a, JustifyContent as b, createCanvasMeasureContext as c, Element as d, StackElement as f, AlignItems as g, TextProps as h, createCanvas as i, Size as j, RadialGradientDescriptor as k, BoxElement as l, TextElement as m, DrawCallCanvas as n, computeLayout as o, StackProps as p, LayoutSize as r, MeasureContext as s, CanvasOptions as t, BoxProps as u, ContainerLayoutProps as v, Color as w, LayoutProps as x, FlexDirection as y };
@@ -0,0 +1,234 @@
1
+ //#region src/types/base.d.ts
2
+ type Size = number | `${number}%` | "auto" | "fill";
3
+ interface ColorStop {
4
+ offset: number;
5
+ color: string;
6
+ }
7
+ interface LinearGradientDescriptor {
8
+ type: "linear-gradient";
9
+ angle: number;
10
+ stops: ColorStop[];
11
+ }
12
+ interface RadialGradientDescriptor {
13
+ type: "radial-gradient";
14
+ startX?: number;
15
+ startY?: number;
16
+ startRadius?: number;
17
+ endX?: number;
18
+ endY?: number;
19
+ endRadius?: number;
20
+ stops: ColorStop[];
21
+ }
22
+ type GradientDescriptor = LinearGradientDescriptor | RadialGradientDescriptor;
23
+ type Color = string | CanvasGradient | CanvasPattern | GradientDescriptor;
24
+ declare function linearGradient(angle: number, ...stops: (string | [number, string])[]): LinearGradientDescriptor;
25
+ declare function radialGradient(options: {
26
+ startX?: number;
27
+ startY?: number;
28
+ startRadius?: number;
29
+ endX?: number;
30
+ endY?: number;
31
+ endRadius?: number;
32
+ }, ...stops: (string | [number, string])[]): RadialGradientDescriptor;
33
+ interface Spacing {
34
+ top?: number;
35
+ right?: number;
36
+ bottom?: number;
37
+ left?: number;
38
+ }
39
+ interface Border {
40
+ width?: number;
41
+ color?: Color;
42
+ radius?: number | [number, number, number, number];
43
+ }
44
+ interface Shadow {
45
+ offsetX?: number;
46
+ offsetY?: number;
47
+ blur?: number;
48
+ color?: Color;
49
+ }
50
+ interface FontProps {
51
+ family?: string;
52
+ size?: number;
53
+ weight?: number | "normal" | "bold";
54
+ style?: "normal" | "italic";
55
+ }
56
+ interface StrokeProps {
57
+ color: Color;
58
+ width: number;
59
+ dash?: number[];
60
+ cap?: "butt" | "round" | "square";
61
+ join?: "miter" | "round" | "bevel";
62
+ }
63
+ interface Bounds {
64
+ x: number;
65
+ y: number;
66
+ width: number;
67
+ height: number;
68
+ }
69
+ //#endregion
70
+ //#region src/types/layout.d.ts
71
+ type FlexDirection = "row" | "column" | "row-reverse" | "column-reverse";
72
+ type JustifyContent = "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly";
73
+ type AlignItems = "start" | "end" | "center" | "stretch" | "baseline";
74
+ type AlignSelf = "auto" | AlignItems;
75
+ interface LayoutProps {
76
+ width?: Size;
77
+ height?: Size;
78
+ minWidth?: number;
79
+ maxWidth?: number;
80
+ minHeight?: number;
81
+ maxHeight?: number;
82
+ margin?: number | Spacing;
83
+ padding?: number | Spacing;
84
+ flex?: number;
85
+ alignSelf?: AlignSelf;
86
+ }
87
+ interface ContainerLayoutProps extends LayoutProps {
88
+ direction?: FlexDirection;
89
+ justify?: JustifyContent;
90
+ align?: AlignItems;
91
+ gap?: number;
92
+ wrap?: boolean;
93
+ }
94
+ interface ComputedLayout {
95
+ x: number;
96
+ y: number;
97
+ width: number;
98
+ height: number;
99
+ contentX: number;
100
+ contentY: number;
101
+ contentWidth: number;
102
+ contentHeight: number;
103
+ }
104
+ interface LayoutConstraints {
105
+ minWidth: number;
106
+ maxWidth: number;
107
+ minHeight: number;
108
+ maxHeight: number;
109
+ }
110
+ //#endregion
111
+ //#region src/types/components.d.ts
112
+ type ElementType = "box" | "text" | "image" | "shape" | "stack";
113
+ interface ElementBase {
114
+ type: ElementType;
115
+ }
116
+ interface BoxProps extends ContainerLayoutProps {
117
+ background?: Color;
118
+ border?: Border;
119
+ shadow?: Shadow;
120
+ opacity?: number;
121
+ clip?: boolean;
122
+ children?: Element[];
123
+ }
124
+ interface BoxElement extends ElementBase, BoxProps {
125
+ type: "box";
126
+ }
127
+ interface TextProps extends LayoutProps {
128
+ content: string;
129
+ font?: FontProps;
130
+ color?: Color;
131
+ align?: "left" | "center" | "right";
132
+ verticalAlign?: "top" | "middle" | "bottom";
133
+ lineHeight?: number;
134
+ maxLines?: number;
135
+ ellipsis?: boolean;
136
+ wrap?: boolean;
137
+ shadow?: Shadow;
138
+ stroke?: StrokeProps;
139
+ }
140
+ interface TextElement extends ElementBase, TextProps {
141
+ type: "text";
142
+ }
143
+ interface ImageProps extends LayoutProps {
144
+ src: string | ImageBitmap | CanvasImageSource;
145
+ fit?: "contain" | "cover" | "fill" | "none" | "scale-down";
146
+ position?: {
147
+ x?: "left" | "center" | "right" | number;
148
+ y?: "top" | "center" | "bottom" | number;
149
+ };
150
+ border?: Border;
151
+ shadow?: Shadow;
152
+ opacity?: number;
153
+ }
154
+ interface ImageElement extends ElementBase, ImageProps {
155
+ type: "image";
156
+ }
157
+ type ShapeType = "rect" | "circle" | "ellipse" | "line" | "polygon" | "path";
158
+ interface ShapeProps extends LayoutProps {
159
+ shape: ShapeType;
160
+ fill?: Color;
161
+ stroke?: StrokeProps;
162
+ shadow?: Shadow;
163
+ points?: [number, number][];
164
+ path?: string;
165
+ }
166
+ interface ShapeElement extends ElementBase, ShapeProps {
167
+ type: "shape";
168
+ }
169
+ interface StackProps extends ContainerLayoutProps {
170
+ children: Element[];
171
+ background?: Color;
172
+ border?: Border;
173
+ shadow?: Shadow;
174
+ opacity?: number;
175
+ clip?: boolean;
176
+ }
177
+ interface StackElement extends ElementBase, StackProps {
178
+ type: "stack";
179
+ }
180
+ type Element = BoxElement | TextElement | ImageElement | ShapeElement | StackElement;
181
+ //#endregion
182
+ //#region src/layout/measure.d.ts
183
+ interface MeasureContext {
184
+ measureText(text: string, font: FontProps): {
185
+ width: number;
186
+ height: number;
187
+ offset: number;
188
+ };
189
+ }
190
+ declare function createCanvasMeasureContext(ctx: CanvasRenderingContext2D): MeasureContext;
191
+ //#endregion
192
+ //#region src/layout/engine.d.ts
193
+ interface LayoutNode {
194
+ element: Element;
195
+ layout: ComputedLayout;
196
+ children: LayoutNode[];
197
+ lines?: string[];
198
+ lineOffsets?: number[];
199
+ }
200
+ declare function computeLayout(element: Element, ctx: MeasureContext, constraints: LayoutConstraints, x?: number, y?: number): LayoutNode;
201
+ //#endregion
202
+ //#region src/canvas.d.ts
203
+ interface CanvasOptions {
204
+ width: number;
205
+ height: number;
206
+ pixelRatio?: number;
207
+ canvas?: {
208
+ getContext(type: "2d"): CanvasRenderingContext2D | null;
209
+ width: number;
210
+ height: number;
211
+ };
212
+ }
213
+ interface LayoutSize {
214
+ width: number;
215
+ height: number;
216
+ }
217
+ interface DrawCallCanvas {
218
+ readonly width: number;
219
+ readonly height: number;
220
+ readonly pixelRatio: number;
221
+ render(element: Element): LayoutNode;
222
+ clear(): void;
223
+ getContext(): CanvasRenderingContext2D;
224
+ toDataURL(type?: string, quality?: number): string;
225
+ toBuffer(type?: "image/png" | "image/jpeg"): Promise<Buffer>;
226
+ }
227
+ /**
228
+ * 创建适用于浏览器环境的 Canvas
229
+ *
230
+ * 在浏览器环境中使用,支持传入已有的 canvas 实例
231
+ */
232
+ declare function createCanvas(options: CanvasOptions): DrawCallCanvas;
233
+ //#endregion
234
+ export { Shadow as A, Bounds as C, GradientDescriptor as D, FontProps as E, radialGradient as F, Spacing as M, StrokeProps as N, LinearGradientDescriptor as O, linearGradient as P, Border as S, ColorStop as T, AlignSelf as _, LayoutNode as a, JustifyContent as b, createCanvasMeasureContext as c, Element as d, StackElement as f, AlignItems as g, TextProps as h, createCanvas as i, Size as j, RadialGradientDescriptor as k, BoxElement as l, TextElement as m, DrawCallCanvas as n, computeLayout as o, StackProps as p, LayoutSize as r, MeasureContext as s, CanvasOptions as t, BoxProps as u, ContainerLayoutProps as v, Color as w, LayoutProps as x, FlexDirection as y };