@gtkx/cairo 1.2.2

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 (86) hide show
  1. package/dist/context.d.ts +229 -0
  2. package/dist/context.d.ts.map +1 -0
  3. package/dist/context.js +646 -0
  4. package/dist/context.js.map +1 -0
  5. package/dist/device.d.ts +21 -0
  6. package/dist/device.d.ts.map +1 -0
  7. package/dist/device.js +39 -0
  8. package/dist/device.js.map +1 -0
  9. package/dist/enums.d.ts +526 -0
  10. package/dist/enums.d.ts.map +1 -0
  11. package/dist/enums.js +482 -0
  12. package/dist/enums.js.map +1 -0
  13. package/dist/font-face.d.ts +55 -0
  14. package/dist/font-face.d.ts.map +1 -0
  15. package/dist/font-face.js +103 -0
  16. package/dist/font-face.js.map +1 -0
  17. package/dist/font-options.d.ts +43 -0
  18. package/dist/font-options.d.ts.map +1 -0
  19. package/dist/font-options.js +95 -0
  20. package/dist/font-options.js.map +1 -0
  21. package/dist/index.d.ts +29 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +27 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/lib.d.ts +36 -0
  26. package/dist/lib.d.ts.map +1 -0
  27. package/dist/lib.js +120 -0
  28. package/dist/lib.js.map +1 -0
  29. package/dist/matrix.d.ts +40 -0
  30. package/dist/matrix.d.ts.map +1 -0
  31. package/dist/matrix.js +93 -0
  32. package/dist/matrix.js.map +1 -0
  33. package/dist/path.d.ts +14 -0
  34. package/dist/path.d.ts.map +1 -0
  35. package/dist/path.js +67 -0
  36. package/dist/path.js.map +1 -0
  37. package/dist/pattern.d.ts +95 -0
  38. package/dist/pattern.d.ts.map +1 -0
  39. package/dist/pattern.js +250 -0
  40. package/dist/pattern.js.map +1 -0
  41. package/dist/region.d.ts +59 -0
  42. package/dist/region.d.ts.map +1 -0
  43. package/dist/region.js +154 -0
  44. package/dist/region.js.map +1 -0
  45. package/dist/scaled-font.d.ts +43 -0
  46. package/dist/scaled-font.d.ts.map +1 -0
  47. package/dist/scaled-font.js +156 -0
  48. package/dist/scaled-font.js.map +1 -0
  49. package/dist/structs.d.ts +120 -0
  50. package/dist/structs.d.ts.map +1 -0
  51. package/dist/structs.js +185 -0
  52. package/dist/structs.js.map +1 -0
  53. package/dist/surface.d.ts +98 -0
  54. package/dist/surface.d.ts.map +1 -0
  55. package/dist/surface.js +274 -0
  56. package/dist/surface.js.map +1 -0
  57. package/dist/text.d.ts +10 -0
  58. package/dist/text.d.ts.map +1 -0
  59. package/dist/text.js +45 -0
  60. package/dist/text.js.map +1 -0
  61. package/dist/types.d.ts +245 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/version.d.ts +9 -0
  66. package/dist/version.d.ts.map +1 -0
  67. package/dist/version.js +13 -0
  68. package/dist/version.js.map +1 -0
  69. package/package.json +64 -0
  70. package/src/context.ts +899 -0
  71. package/src/device.ts +50 -0
  72. package/src/enums.ts +571 -0
  73. package/src/font-face.ts +157 -0
  74. package/src/font-options.ts +142 -0
  75. package/src/index.ts +28 -0
  76. package/src/lib.ts +186 -0
  77. package/src/matrix.ts +135 -0
  78. package/src/path.ts +87 -0
  79. package/src/pattern.ts +423 -0
  80. package/src/region.ts +216 -0
  81. package/src/scaled-font.ts +268 -0
  82. package/src/structs.ts +306 -0
  83. package/src/surface.ts +411 -0
  84. package/src/text.ts +56 -0
  85. package/src/types.ts +290 -0
  86. package/src/version.ts +16 -0
package/src/path.ts ADDED
@@ -0,0 +1,87 @@
1
+ import { type ExternalObject, getHandle, type Handle, read, t } from "@gtkx/runtime";
2
+ import type { PathData } from "./types.js";
3
+ import { PathDataType } from "./enums.js";
4
+
5
+ type PathBuffer = ExternalObject<Handle>;
6
+ type Point = { x: number; y: number };
7
+ type SegmentReader = (data: PathBuffer, base: number) => PathData;
8
+
9
+ const ELEMENT_SIZE = 16;
10
+ const DATA_OFFSET = 8;
11
+ const NUM_DATA_OFFSET = 16;
12
+
13
+ const readPoint = (data: PathBuffer, base: number): Point => ({
14
+ x: read(data, t.float64, base) as number,
15
+ y: read(data, t.float64, base + 8) as number,
16
+ });
17
+
18
+ const readMoveTo: SegmentReader = (data, base) => ({ type: "moveTo", ...readPoint(data, base + ELEMENT_SIZE) });
19
+ const readLineTo: SegmentReader = (data, base) => ({ type: "lineTo", ...readPoint(data, base + ELEMENT_SIZE) });
20
+
21
+ const readCurveTo: SegmentReader = (data, base) => {
22
+ const first = readPoint(data, base + ELEMENT_SIZE);
23
+ const second = readPoint(data, base + ELEMENT_SIZE * 2);
24
+ const third = readPoint(data, base + ELEMENT_SIZE * 3);
25
+
26
+ return { type: "curveTo", x1: first.x, y1: first.y, x2: second.x, y2: second.y, x3: third.x, y3: third.y };
27
+ };
28
+
29
+ const readClosePath: SegmentReader = () => ({ type: "closePath" });
30
+
31
+ const segmentReaderFor = (headerType: PathDataType): SegmentReader | null => {
32
+ switch (headerType) {
33
+ case PathDataType.MOVE_TO: {
34
+ return readMoveTo;
35
+ }
36
+ case PathDataType.LINE_TO: {
37
+ return readLineTo;
38
+ }
39
+ case PathDataType.CURVE_TO: {
40
+ return readCurveTo;
41
+ }
42
+ case PathDataType.CLOSE_PATH: {
43
+ return readClosePath;
44
+ }
45
+ default: {
46
+ return null;
47
+ }
48
+ }
49
+ };
50
+
51
+ const parsePath = (pathHandle: PathBuffer): PathData[] => {
52
+ const numData = read(pathHandle, t.int32, NUM_DATA_OFFSET) as number;
53
+
54
+ if (numData === 0) {
55
+ return [];
56
+ }
57
+
58
+ const data = read(pathHandle, t.struct("borrowed", { size: numData * ELEMENT_SIZE }), DATA_OFFSET) as PathBuffer;
59
+ const segments: PathData[] = [];
60
+ let index = 0;
61
+
62
+ while (index < numData) {
63
+ const base = index * ELEMENT_SIZE;
64
+ const reader = segmentReaderFor(read(data, t.int32, base) as PathDataType);
65
+
66
+ if (reader !== null) {
67
+ segments.push(reader(data, base));
68
+ }
69
+
70
+ index += read(data, t.int32, base + 4) as number;
71
+ }
72
+
73
+ return segments;
74
+ };
75
+
76
+ /**
77
+ * A cairo path (`cairo_path_t`). Instances come from the bindings that hand one back, and the bindings that take
78
+ * one, such as `Gsk.PathBuilder.addCairoPath`, accept it as is.
79
+ */
80
+ abstract class Path {
81
+ /** Reads the segments of the path in drawing order. */
82
+ toData(): PathData[] {
83
+ return parsePath(getHandle(this));
84
+ }
85
+ }
86
+
87
+ export { parsePath, Path };
package/src/pattern.ts ADDED
@@ -0,0 +1,423 @@
1
+ import {
2
+ type ExternalObject,
3
+ getHandle,
4
+ type Handle,
5
+ registerWrapperClass,
6
+ registerWrapperClassResolver,
7
+ t,
8
+ wrapHandle,
9
+ type WrapperClassResolver,
10
+ } from "@gtkx/runtime";
11
+ import type { Surface } from "./surface.js";
12
+ import type { ColorStop, LinearPoints, PathData, Point, RadialCircles, RgbaColor } from "./types.js";
13
+ import { type Extend, type Filter, PatternType, type Status } from "./enums.js";
14
+ import {
15
+ bindCairo,
16
+ type BoundFunction,
17
+ cairoGType,
18
+ MATRIX_T,
19
+ PATH_T,
20
+ PATTERN_FULL_T,
21
+ PATTERN_T,
22
+ SURFACE_T,
23
+ } from "./lib.js";
24
+ import { allocMatrix, Matrix } from "./matrix.js";
25
+ import { parsePath } from "./path.js";
26
+
27
+ type RgbaRefs = [
28
+ red: { value: number },
29
+ green: { value: number },
30
+ blue: { value: number },
31
+ alpha: { value: number },
32
+ ];
33
+
34
+ const PATTERN_TYPE = cairoGType("cairo_gobject_pattern_get_type");
35
+ const FOUR_DOUBLES_OUT = [t.ref(t.float64), t.ref(t.float64), t.ref(t.float64), t.ref(t.float64)];
36
+ const POINT_ARGS = [PATTERN_T, t.float64, t.float64];
37
+ const cairoPatternCreateRgb = bindCairo("cairo_pattern_create_rgb", [t.float64, t.float64, t.float64], PATTERN_FULL_T);
38
+
39
+ const cairoPatternCreateRgba = bindCairo(
40
+ "cairo_pattern_create_rgba",
41
+ [t.float64, t.float64, t.float64, t.float64],
42
+ PATTERN_FULL_T,
43
+ );
44
+
45
+ const cairoPatternCreateLinear = bindCairo(
46
+ "cairo_pattern_create_linear",
47
+ [t.float64, t.float64, t.float64, t.float64],
48
+ PATTERN_FULL_T,
49
+ );
50
+
51
+ const cairoPatternCreateRadial = bindCairo(
52
+ "cairo_pattern_create_radial",
53
+ [t.float64, t.float64, t.float64, t.float64, t.float64, t.float64],
54
+ PATTERN_FULL_T,
55
+ );
56
+
57
+ const cairoPatternCreateMesh = bindCairo("cairo_pattern_create_mesh", [], PATTERN_FULL_T);
58
+ const cairoPatternCreateForSurface = bindCairo("cairo_pattern_create_for_surface", [SURFACE_T], PATTERN_FULL_T);
59
+
60
+ const cairoPatternAddColorStopRgb = bindCairo(
61
+ "cairo_pattern_add_color_stop_rgb",
62
+ [PATTERN_T, t.float64, t.float64, t.float64, t.float64],
63
+ t.void,
64
+ );
65
+
66
+ const cairoPatternAddColorStopRgba = bindCairo(
67
+ "cairo_pattern_add_color_stop_rgba",
68
+ [PATTERN_T, t.float64, t.float64, t.float64, t.float64, t.float64],
69
+ t.void,
70
+ );
71
+
72
+ const cairoPatternGetColorStopCount = bindCairo(
73
+ "cairo_pattern_get_color_stop_count",
74
+ [PATTERN_T, t.ref(t.int32)],
75
+ t.int32,
76
+ );
77
+
78
+ const cairoPatternGetColorStopRgba = bindCairo(
79
+ "cairo_pattern_get_color_stop_rgba",
80
+ [PATTERN_T, t.int32, t.ref(t.float64), ...FOUR_DOUBLES_OUT],
81
+ t.int32,
82
+ );
83
+
84
+ const cairoPatternGetRgba = bindCairo("cairo_pattern_get_rgba", [PATTERN_T, ...FOUR_DOUBLES_OUT], t.int32);
85
+ const cairoPatternStatus = bindCairo("cairo_pattern_status", [PATTERN_T], t.int32);
86
+ const cairoPatternSetExtend = bindCairo("cairo_pattern_set_extend", [PATTERN_T, t.int32], t.void);
87
+ const cairoPatternGetExtend = bindCairo("cairo_pattern_get_extend", [PATTERN_T], t.int32);
88
+ const cairoPatternSetFilter = bindCairo("cairo_pattern_set_filter", [PATTERN_T, t.int32], t.void);
89
+ const cairoPatternGetFilter = bindCairo("cairo_pattern_get_filter", [PATTERN_T], t.int32);
90
+ const cairoPatternSetMatrix = bindCairo("cairo_pattern_set_matrix", [PATTERN_T, MATRIX_T], t.void);
91
+ const cairoPatternGetMatrix = bindCairo("cairo_pattern_get_matrix", [PATTERN_T, MATRIX_T], t.void);
92
+ const cairoPatternGetType = bindCairo("cairo_pattern_get_type", [PATTERN_T], t.int32);
93
+ const cairoPatternGetReferenceCount = bindCairo("cairo_pattern_get_reference_count", [PATTERN_T], t.int32);
94
+
95
+ const cairoPatternGetLinearPoints = bindCairo(
96
+ "cairo_pattern_get_linear_points",
97
+ [PATTERN_T, ...FOUR_DOUBLES_OUT],
98
+ t.int32,
99
+ );
100
+
101
+ const cairoPatternGetRadialCircles = bindCairo(
102
+ "cairo_pattern_get_radial_circles",
103
+ [PATTERN_T, ...FOUR_DOUBLES_OUT, t.ref(t.float64), t.ref(t.float64)],
104
+ t.int32,
105
+ );
106
+
107
+ const cairoMeshPatternBeginPatch = bindCairo("cairo_mesh_pattern_begin_patch", [PATTERN_T], t.void);
108
+ const cairoMeshPatternEndPatch = bindCairo("cairo_mesh_pattern_end_patch", [PATTERN_T], t.void);
109
+ const cairoMeshPatternMoveTo = bindCairo("cairo_mesh_pattern_move_to", POINT_ARGS, t.void);
110
+ const cairoMeshPatternLineTo = bindCairo("cairo_mesh_pattern_line_to", POINT_ARGS, t.void);
111
+
112
+ const cairoMeshPatternCurveTo = bindCairo(
113
+ "cairo_mesh_pattern_curve_to",
114
+ [PATTERN_T, t.float64, t.float64, t.float64, t.float64, t.float64, t.float64],
115
+ t.void,
116
+ );
117
+
118
+ const cairoMeshPatternSetControlPoint = bindCairo(
119
+ "cairo_mesh_pattern_set_control_point",
120
+ [PATTERN_T, t.int32, t.float64, t.float64],
121
+ t.void,
122
+ );
123
+
124
+ const cairoMeshPatternSetCornerColorRgb = bindCairo(
125
+ "cairo_mesh_pattern_set_corner_color_rgb",
126
+ [PATTERN_T, t.int32, t.float64, t.float64, t.float64],
127
+ t.void,
128
+ );
129
+
130
+ const cairoMeshPatternSetCornerColorRgba = bindCairo(
131
+ "cairo_mesh_pattern_set_corner_color_rgba",
132
+ [PATTERN_T, t.int32, t.float64, t.float64, t.float64, t.float64],
133
+ t.void,
134
+ );
135
+
136
+ const cairoMeshPatternGetPatchCount = bindCairo(
137
+ "cairo_mesh_pattern_get_patch_count",
138
+ [PATTERN_T, t.ref(t.int32)],
139
+ t.int32,
140
+ );
141
+
142
+ const cairoMeshPatternGetPath = bindCairo("cairo_mesh_pattern_get_path", [PATTERN_T, t.int32], PATH_T);
143
+
144
+ const cairoMeshPatternGetControlPoint = bindCairo(
145
+ "cairo_mesh_pattern_get_control_point",
146
+ [PATTERN_T, t.int32, t.int32, t.ref(t.float64), t.ref(t.float64)],
147
+ t.int32,
148
+ );
149
+
150
+ const cairoMeshPatternGetCornerColorRgba = bindCairo(
151
+ "cairo_mesh_pattern_get_corner_color_rgba",
152
+ [PATTERN_T, t.int32, t.int32, ...FOUR_DOUBLES_OUT],
153
+ t.int32,
154
+ );
155
+
156
+ const wrapPattern = (handle: unknown): Pattern => wrapHandle(handle as ExternalObject<Handle>, Pattern);
157
+
158
+ const readRgba = (fill: (...refs: RgbaRefs) => void): RgbaColor => {
159
+ const red = { value: 0 };
160
+ const green = { value: 0 };
161
+ const blue = { value: 0 };
162
+ const alpha = { value: 0 };
163
+ fill(red, green, blue, alpha);
164
+
165
+ return { red: red.value, green: green.value, blue: blue.value, alpha: alpha.value };
166
+ };
167
+
168
+ const readCount = (boundFn: BoundFunction, self: object): number => {
169
+ const count = { value: 0 };
170
+ boundFn(getHandle(self), count);
171
+
172
+ return count.value;
173
+ };
174
+
175
+ const patternClassFor: WrapperClassResolver = (handle) => {
176
+ const type = cairoPatternGetType(handle) as PatternType;
177
+
178
+ if (type === PatternType.LINEAR) {
179
+ return LinearPattern;
180
+ }
181
+
182
+ if (type === PatternType.RADIAL) {
183
+ return RadialPattern;
184
+ }
185
+
186
+ if (type === PatternType.MESH) {
187
+ return MeshPattern;
188
+ }
189
+
190
+ return Pattern;
191
+ };
192
+
193
+ /**
194
+ * A cairo pattern (`cairo_pattern_t`): the source a context paints with, such as a solid color, a gradient,
195
+ * a mesh or another surface. Patterns come from the `create*` statics or from a context, and wrap as the
196
+ * concrete class their type reports (`instanceof LinearPattern` for a linear gradient).
197
+ */
198
+ abstract class Pattern {
199
+ static {
200
+ registerWrapperClass(this, PATTERN_TYPE);
201
+ registerWrapperClassResolver(this, patternClassFor);
202
+ }
203
+
204
+ /** Creates an opaque solid-color pattern. */
205
+ static createRgb(red: number, green: number, blue: number): Pattern {
206
+ return wrapPattern(cairoPatternCreateRgb(red, green, blue));
207
+ }
208
+
209
+ /** Creates a translucent solid-color pattern. */
210
+ static createRgba(red: number, green: number, blue: number, alpha: number): Pattern {
211
+ return wrapPattern(cairoPatternCreateRgba(red, green, blue, alpha));
212
+ }
213
+
214
+ /** Creates a linear gradient between `(x0, y0)` and `(x1, y1)`; add stops with `addColorStopRgba`. */
215
+ static createLinear(x0: number, y0: number, x1: number, y1: number): LinearPattern {
216
+ return wrapHandle(cairoPatternCreateLinear(x0, y0, x1, y1) as ExternalObject<Handle>, LinearPattern);
217
+ }
218
+
219
+ /** Creates a radial gradient between two circles; add stops with `addColorStopRgba`. */
220
+ static createRadial(
221
+ cx0: number,
222
+ cy0: number,
223
+ radius0: number,
224
+ cx1: number,
225
+ cy1: number,
226
+ radius1: number,
227
+ ): RadialPattern {
228
+ const handle = cairoPatternCreateRadial(cx0, cy0, radius0, cx1, cy1, radius1) as ExternalObject<Handle>;
229
+
230
+ return wrapHandle(handle, RadialPattern);
231
+ }
232
+
233
+ /** Creates an empty mesh gradient; describe its patches with the `MeshPattern` methods. */
234
+ static createMesh(): MeshPattern {
235
+ return wrapHandle(cairoPatternCreateMesh() as ExternalObject<Handle>, MeshPattern);
236
+ }
237
+
238
+ /** Creates a pattern that paints with the content of `surface`. */
239
+ static createForSurface(surface: Surface): Pattern {
240
+ return wrapPattern(cairoPatternCreateForSurface(getHandle(surface)));
241
+ }
242
+
243
+ /** GType of `CairoPattern`, the boxed type this class is registered under. */
244
+ declare __type__: bigint;
245
+
246
+ /** Adds an opaque color stop at `offset` (0 to 1) to a gradient pattern. */
247
+ addColorStopRgb(offset: number, red: number, green: number, blue: number): void {
248
+ cairoPatternAddColorStopRgb(getHandle(this), offset, red, green, blue);
249
+ }
250
+
251
+ /** Adds a translucent color stop at `offset` (0 to 1) to a gradient pattern. */
252
+ addColorStopRgba(offset: number, red: number, green: number, blue: number, alpha: number): void {
253
+ cairoPatternAddColorStopRgba(getHandle(this), offset, red, green, blue, alpha);
254
+ }
255
+
256
+ /** Returns how many color stops a gradient pattern has. */
257
+ getColorStopCount(): number {
258
+ return readCount(cairoPatternGetColorStopCount, this);
259
+ }
260
+
261
+ /** Returns the color stop at `index` of a gradient pattern. */
262
+ getColorStopRgba(index: number): ColorStop {
263
+ const offset = { value: 0 };
264
+ const color = readRgba((...refs) => cairoPatternGetColorStopRgba(getHandle(this), index, offset, ...refs));
265
+
266
+ return { offset: offset.value, ...color };
267
+ }
268
+
269
+ /** Returns the color of a solid pattern. */
270
+ getRgba(): RgbaColor {
271
+ return readRgba((...refs) => cairoPatternGetRgba(getHandle(this), ...refs));
272
+ }
273
+
274
+ /** Returns the error status of the pattern, `Status.SUCCESS` when it is usable. */
275
+ status(): Status {
276
+ return cairoPatternStatus(getHandle(this)) as Status;
277
+ }
278
+
279
+ /** Sets how the pattern is extended outside its natural area. */
280
+ setExtend(extend: Extend): void {
281
+ cairoPatternSetExtend(getHandle(this), extend);
282
+ }
283
+
284
+ /** Returns how the pattern is extended outside its natural area. */
285
+ getExtend(): Extend {
286
+ return cairoPatternGetExtend(getHandle(this)) as Extend;
287
+ }
288
+
289
+ /** Sets the filter used when the pattern is resampled. */
290
+ setFilter(filter: Filter): void {
291
+ cairoPatternSetFilter(getHandle(this), filter);
292
+ }
293
+
294
+ /** Returns the filter used when the pattern is resampled. */
295
+ getFilter(): Filter {
296
+ return cairoPatternGetFilter(getHandle(this)) as Filter;
297
+ }
298
+
299
+ /** Sets the transformation from user space to pattern space. */
300
+ setMatrix(matrix: Matrix): void {
301
+ cairoPatternSetMatrix(getHandle(this), getHandle(matrix));
302
+ }
303
+
304
+ /** Returns the transformation from user space to pattern space. */
305
+ getMatrix(): Matrix {
306
+ const { handle, matrix } = allocMatrix();
307
+ cairoPatternGetMatrix(getHandle(this), handle);
308
+
309
+ return matrix;
310
+ }
311
+
312
+ /** Returns the kind of pattern this is. */
313
+ getType(): PatternType {
314
+ return cairoPatternGetType(getHandle(this)) as PatternType;
315
+ }
316
+
317
+ /** Returns the reference count of the pattern. */
318
+ getReferenceCount(): number {
319
+ return cairoPatternGetReferenceCount(getHandle(this)) as number;
320
+ }
321
+ }
322
+
323
+ /** A linear gradient pattern, created with `Pattern.createLinear`. */
324
+ class LinearPattern extends Pattern {
325
+ /** Returns the two end points of the gradient. */
326
+ getLinearPoints(): LinearPoints {
327
+ const x0 = { value: 0 };
328
+ const y0 = { value: 0 };
329
+ const x1 = { value: 0 };
330
+ const y1 = { value: 0 };
331
+ cairoPatternGetLinearPoints(getHandle(this), x0, y0, x1, y1);
332
+
333
+ return { x0: x0.value, y0: y0.value, x1: x1.value, y1: y1.value };
334
+ }
335
+ }
336
+
337
+ /** A radial gradient pattern, created with `Pattern.createRadial`. */
338
+ class RadialPattern extends Pattern {
339
+ /** Returns the two circles of the gradient. */
340
+ getRadialCircles(): RadialCircles {
341
+ const x0 = { value: 0 };
342
+ const y0 = { value: 0 };
343
+ const r0 = { value: 0 };
344
+ const x1 = { value: 0 };
345
+ const y1 = { value: 0 };
346
+ const r1 = { value: 0 };
347
+ cairoPatternGetRadialCircles(getHandle(this), x0, y0, r0, x1, y1, r1);
348
+
349
+ return { x0: x0.value, y0: y0.value, r0: r0.value, x1: x1.value, y1: y1.value, r1: r1.value };
350
+ }
351
+ }
352
+
353
+ /**
354
+ * A mesh gradient pattern, created with `Pattern.createMesh`: a set of Coons patches, each described between
355
+ * `beginPatch` and `endPatch` by a path of up to four sides and the colors of its corners.
356
+ */
357
+ class MeshPattern extends Pattern {
358
+ /** Starts describing a new patch. */
359
+ beginPatch(): void {
360
+ cairoMeshPatternBeginPatch(getHandle(this));
361
+ }
362
+
363
+ /** Finishes the patch being described. */
364
+ endPatch(): void {
365
+ cairoMeshPatternEndPatch(getHandle(this));
366
+ }
367
+
368
+ /** Sets the first corner of the patch being described. */
369
+ moveTo(x: number, y: number): void {
370
+ cairoMeshPatternMoveTo(getHandle(this), x, y);
371
+ }
372
+
373
+ /** Adds a straight side from the previous corner to `(x, y)`. */
374
+ lineTo(x: number, y: number): void {
375
+ cairoMeshPatternLineTo(getHandle(this), x, y);
376
+ }
377
+
378
+ /** Adds a curved side from the previous corner through two control points to `(x3, y3)`. */
379
+ curveTo(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): void {
380
+ cairoMeshPatternCurveTo(getHandle(this), x1, y1, x2, y2, x3, y3);
381
+ }
382
+
383
+ /** Sets an interior control point (0 to 3) of the patch being described. */
384
+ setControlPoint(pointNum: number, x: number, y: number): void {
385
+ cairoMeshPatternSetControlPoint(getHandle(this), pointNum, x, y);
386
+ }
387
+
388
+ /** Sets the opaque color of a corner (0 to 3) of the patch being described. */
389
+ setCornerColorRgb(cornerNum: number, red: number, green: number, blue: number): void {
390
+ cairoMeshPatternSetCornerColorRgb(getHandle(this), cornerNum, red, green, blue);
391
+ }
392
+
393
+ /** Sets the translucent color of a corner (0 to 3) of the patch being described. */
394
+ setCornerColorRgba(cornerNum: number, red: number, green: number, blue: number, alpha: number): void {
395
+ cairoMeshPatternSetCornerColorRgba(getHandle(this), cornerNum, red, green, blue, alpha);
396
+ }
397
+
398
+ /** Returns how many patches have been finished. */
399
+ getPatchCount(): number {
400
+ return readCount(cairoMeshPatternGetPatchCount, this);
401
+ }
402
+
403
+ /** Returns the path around patch `patchNum`. */
404
+ getPath(patchNum: number): PathData[] {
405
+ return parsePath(cairoMeshPatternGetPath(getHandle(this), patchNum) as ExternalObject<Handle>);
406
+ }
407
+
408
+ /** Returns control point `pointNum` of patch `patchNum`. */
409
+ getControlPoint(patchNum: number, pointNum: number): Point {
410
+ const x = { value: 0 };
411
+ const y = { value: 0 };
412
+ cairoMeshPatternGetControlPoint(getHandle(this), patchNum, pointNum, x, y);
413
+
414
+ return { x: x.value, y: y.value };
415
+ }
416
+
417
+ /** Returns the color of corner `cornerNum` of patch `patchNum`. */
418
+ getCornerColorRgba(patchNum: number, cornerNum: number): RgbaColor {
419
+ return readRgba((...refs) => cairoMeshPatternGetCornerColorRgba(getHandle(this), patchNum, cornerNum, ...refs));
420
+ }
421
+ }
422
+
423
+ export { LinearPattern, MeshPattern, Pattern, RadialPattern };