1 module bindbc.blend2d.bindstatic;
2 
3 version(BindBC_Static) version = BindBlend2D_Static;
4 
5 import core.stdc.stdint;
6 import core.stdc.stdarg;
7 
8 auto BL_MAKE_VERSION(uint MAJOR, uint MINOR, uint PATCH)
9 {
10     return (MAJOR << 16) | (MINOR << 8) | PATCH;
11 }
12 
13 enum BL_VERSION = BL_MAKE_VERSION(0, 8, 0);
14 
15 private
16 enum expandEnum(EnumType, string fqnEnumType = EnumType.stringof) = (){
17     string expandEnum = "enum {";
18     foreach(m;__traits(allMembers, EnumType)) {
19         expandEnum ~= m ~ " = " ~ fqnEnumType ~ "." ~ m ~ ",";
20     }
21     expandEnum  ~= "}";
22     return expandEnum;
23 }();
24 
25 struct BLObjectImpl;
26 
27 
28 mixin(expandEnum!BLResultCode);
29 mixin(expandEnum!BLByteOrder);
30 mixin(expandEnum!BLDataAccessFlags);
31 mixin(expandEnum!BLDataSourceType);
32 mixin(expandEnum!BLModifyOp);
33 mixin(expandEnum!BLBooleanOp);
34 mixin(expandEnum!BLExtendMode);
35 mixin(expandEnum!BLTextEncoding);
36 mixin(expandEnum!BLObjectInfoShift);
37 mixin(expandEnum!BLObjectInfoBits);
38 mixin(expandEnum!BLObjectType);
39 mixin(expandEnum!BLBitSetConstants);
40 mixin(expandEnum!BLFileOpenFlags);
41 mixin(expandEnum!BLFileSeekType);
42 mixin(expandEnum!BLFileReadFlags);
43 mixin(expandEnum!BLGeometryDirection);
44 mixin(expandEnum!BLGeometryType);
45 mixin(expandEnum!BLFillRule);
46 mixin(expandEnum!BLHitTest);
47 mixin(expandEnum!BLOrientation);
48 mixin(expandEnum!BLGlyphPlacementType);
49 mixin(expandEnum!BLGlyphRunFlags);
50 mixin(expandEnum!BLFontDataFlags);
51 mixin(expandEnum!BLFontFaceType);
52 mixin(expandEnum!BLFontFaceFlags);
53 mixin(expandEnum!BLFontFaceDiagFlags);
54 mixin(expandEnum!BLFontOutlineType);
55 mixin(expandEnum!BLFontStretch);
56 mixin(expandEnum!BLFontStyle);
57 mixin(expandEnum!BLFontWeight);
58 mixin(expandEnum!BLFontStringId);
59 mixin(expandEnum!BLFontUnicodeCoverageIndex);
60 mixin(expandEnum!BLTextDirection);
61 mixin(expandEnum!BLPathCmd);
62 mixin(expandEnum!BLPathCmdExtra);
63 mixin(expandEnum!BLPathFlags);
64 mixin(expandEnum!BLPathReverseMode);
65 mixin(expandEnum!BLStrokeJoin);
66 mixin(expandEnum!BLStrokeCapPosition);
67 mixin(expandEnum!BLStrokeCap);
68 mixin(expandEnum!BLStrokeTransformOrder);
69 mixin(expandEnum!BLFlattenMode);
70 mixin(expandEnum!BLOffsetMode);
71 mixin(expandEnum!BLFormat);
72 mixin(expandEnum!BLFormatFlags);
73 mixin(expandEnum!BLImageCodecFeatures);
74 mixin(expandEnum!BLImageInfoFlags);
75 mixin(expandEnum!BLImageScaleFilter);
76 mixin(expandEnum!BLMatrix2DType);
77 mixin(expandEnum!BLMatrix2DValue);
78 mixin(expandEnum!BLMatrix2DOp);
79 mixin(expandEnum!BLContextType);
80 mixin(expandEnum!BLContextHint);
81 mixin(expandEnum!BLContextOpType);
82 mixin(expandEnum!BLContextFlushFlags);
83 mixin(expandEnum!BLContextCreateFlags);
84 mixin(expandEnum!BLContextErrorFlags);
85 mixin(expandEnum!BLClipMode);
86 mixin(expandEnum!BLCompOp);
87 mixin(expandEnum!BLGradientQuality);
88 mixin(expandEnum!BLPatternQuality);
89 mixin(expandEnum!BLRenderingQuality);
90 mixin(expandEnum!BLGradientType);
91 mixin(expandEnum!BLGradientValue);
92 mixin(expandEnum!BLPixelConverterCreateFlags);
93 mixin(expandEnum!BLRuntimeLimits);
94 mixin(expandEnum!BLRuntimeInfoType);
95 mixin(expandEnum!BLRuntimeBuildType);
96 mixin(expandEnum!BLRuntimeCpuArch);
97 mixin(expandEnum!BLRuntimeCpuFeatures);
98 mixin(expandEnum!BLRuntimeCleanupFlags);
99 
100 
101 //****** api.d ******//
102 
103 import core.stdc.stddef;
104 import core.stdc.stdint;
105 
106 extern (C):
107 
108 //struct BLObjectImpl;
109 alias BLResult = uint;
110 alias BLTag = uint;
111 alias BLUniqueId = ulong;
112 alias BLUnknown = void;
113 
114 enum BLResultCode
115 {
116     BL_SUCCESS = 0,
117     BL_ERROR_START_INDEX = 0x00010000u,
118     BL_ERROR_OUT_OF_MEMORY = 0x00010000u,
119     BL_ERROR_INVALID_VALUE = 65537,
120     BL_ERROR_INVALID_STATE = 65538,
121     BL_ERROR_INVALID_HANDLE = 65539,
122     BL_ERROR_INVALID_CONVERSION = 65540,
123     BL_ERROR_OVERFLOW = 65541,
124     BL_ERROR_NOT_INITIALIZED = 65542,
125     BL_ERROR_NOT_IMPLEMENTED = 65543,
126     BL_ERROR_NOT_PERMITTED = 65544,
127     BL_ERROR_IO = 65545,
128     BL_ERROR_BUSY = 65546,
129     BL_ERROR_INTERRUPTED = 65547,
130     BL_ERROR_TRY_AGAIN = 65548,
131     BL_ERROR_TIMED_OUT = 65549,
132     BL_ERROR_BROKEN_PIPE = 65550,
133     BL_ERROR_INVALID_SEEK = 65551,
134     BL_ERROR_SYMLINK_LOOP = 65552,
135     BL_ERROR_FILE_TOO_LARGE = 65553,
136     BL_ERROR_ALREADY_EXISTS = 65554,
137     BL_ERROR_ACCESS_DENIED = 65555,
138     BL_ERROR_MEDIA_CHANGED = 65556,
139     BL_ERROR_READ_ONLY_FS = 65557,
140     BL_ERROR_NO_DEVICE = 65558,
141     BL_ERROR_NO_ENTRY = 65559,
142     BL_ERROR_NO_MEDIA = 65560,
143     BL_ERROR_NO_MORE_DATA = 65561,
144     BL_ERROR_NO_MORE_FILES = 65562,
145     BL_ERROR_NO_SPACE_LEFT = 65563,
146     BL_ERROR_NOT_EMPTY = 65564,
147     BL_ERROR_NOT_FILE = 65565,
148     BL_ERROR_NOT_DIRECTORY = 65566,
149     BL_ERROR_NOT_SAME_DEVICE = 65567,
150     BL_ERROR_NOT_BLOCK_DEVICE = 65568,
151     BL_ERROR_INVALID_FILE_NAME = 65569,
152     BL_ERROR_FILE_NAME_TOO_LONG = 65570,
153     BL_ERROR_TOO_MANY_OPEN_FILES = 65571,
154     BL_ERROR_TOO_MANY_OPEN_FILES_BY_OS = 65572,
155     BL_ERROR_TOO_MANY_LINKS = 65573,
156     BL_ERROR_TOO_MANY_THREADS = 65574,
157     BL_ERROR_THREAD_POOL_EXHAUSTED = 65575,
158     BL_ERROR_FILE_EMPTY = 65576,
159     BL_ERROR_OPEN_FAILED = 65577,
160     BL_ERROR_NOT_ROOT_DEVICE = 65578,
161     BL_ERROR_UNKNOWN_SYSTEM_ERROR = 65579,
162     BL_ERROR_INVALID_ALIGNMENT = 65580,
163     BL_ERROR_INVALID_SIGNATURE = 65581,
164     BL_ERROR_INVALID_DATA = 65582,
165     BL_ERROR_INVALID_STRING = 65583,
166     BL_ERROR_INVALID_KEY = 65584,
167     BL_ERROR_DATA_TRUNCATED = 65585,
168     BL_ERROR_DATA_TOO_LARGE = 65586,
169     BL_ERROR_DECOMPRESSION_FAILED = 65587,
170     BL_ERROR_INVALID_GEOMETRY = 65588,
171     BL_ERROR_NO_MATCHING_VERTEX = 65589,
172     BL_ERROR_INVALID_CREATE_FLAGS = 65590,
173     BL_ERROR_NO_MATCHING_COOKIE = 65591,
174     BL_ERROR_NO_STATES_TO_RESTORE = 65592,
175     BL_ERROR_IMAGE_TOO_LARGE = 65593,
176     BL_ERROR_IMAGE_NO_MATCHING_CODEC = 65594,
177     BL_ERROR_IMAGE_UNKNOWN_FILE_FORMAT = 65595,
178     BL_ERROR_IMAGE_DECODER_NOT_PROVIDED = 65596,
179     BL_ERROR_IMAGE_ENCODER_NOT_PROVIDED = 65597,
180     BL_ERROR_PNG_MULTIPLE_IHDR = 65598,
181     BL_ERROR_PNG_INVALID_IDAT = 65599,
182     BL_ERROR_PNG_INVALID_IEND = 65600,
183     BL_ERROR_PNG_INVALID_PLTE = 65601,
184     BL_ERROR_PNG_INVALID_TRNS = 65602,
185     BL_ERROR_PNG_INVALID_FILTER = 65603,
186     BL_ERROR_JPEG_UNSUPPORTED_FEATURE = 65604,
187     BL_ERROR_JPEG_INVALID_SOS = 65605,
188     BL_ERROR_JPEG_INVALID_SOF = 65606,
189     BL_ERROR_JPEG_MULTIPLE_SOF = 65607,
190     BL_ERROR_JPEG_UNSUPPORTED_SOF = 65608,
191     BL_ERROR_FONT_NOT_INITIALIZED = 65609,
192     BL_ERROR_FONT_NO_MATCH = 65610,
193     BL_ERROR_FONT_NO_CHARACTER_MAPPING = 65611,
194     BL_ERROR_FONT_MISSING_IMPORTANT_TABLE = 65612,
195     BL_ERROR_FONT_FEATURE_NOT_AVAILABLE = 65613,
196     BL_ERROR_FONT_CFF_INVALID_DATA = 65614,
197     BL_ERROR_FONT_PROGRAM_TERMINATED = 65615,
198     BL_ERROR_INVALID_GLYPH = 65616,
199     BL_ERROR_FORCE_UINT = 0xFFFFFFFFu
200 }
201 
202 enum BLByteOrder
203 {
204     BL_BYTE_ORDER_LE = 0,
205     BL_BYTE_ORDER_BE = 1,
206     BL_BYTE_ORDER_NATIVE = 1234 == 1234 ? BL_BYTE_ORDER_LE : BL_BYTE_ORDER_BE,
207     BL_BYTE_ORDER_SWAPPED = 1234 == 1234 ? BL_BYTE_ORDER_BE : BL_BYTE_ORDER_LE,
208     BL_BYTE_ORDER_FORCE_UINT = 0xFFFFFFFFu
209 }
210 
211 enum BLDataAccessFlags
212 {
213     BL_DATA_ACCESS_NO_FLAGS = 0x00u,
214     BL_DATA_ACCESS_READ = 0x01u,
215     BL_DATA_ACCESS_WRITE = 0x02u,
216     BL_DATA_ACCESS_RW = 0x03u,
217     BL_DATA_ACCESS_FORCE_UINT = 0xFFFFFFFFu
218 }
219 
220 enum BLDataSourceType
221 {
222     BL_DATA_SOURCE_TYPE_NONE = 0,
223     BL_DATA_SOURCE_TYPE_MEMORY = 1,
224     BL_DATA_SOURCE_TYPE_FILE = 2,
225     BL_DATA_SOURCE_TYPE_CUSTOM = 3,
226     BL_DATA_SOURCE_TYPE_MAX_VALUE = 3,
227     BL_DATA_SOURCE_TYPE_FORCE_UINT = 0xFFFFFFFFu
228 }
229 
230 enum BLModifyOp
231 {
232     BL_MODIFY_OP_ASSIGN_FIT = 0,
233     BL_MODIFY_OP_ASSIGN_GROW = 1,
234     BL_MODIFY_OP_APPEND_FIT = 2,
235     BL_MODIFY_OP_APPEND_GROW = 3,
236     BL_MODIFY_OP_MAX_VALUE = 3,
237     BL_MODIFY_OP_FORCE_UINT = 0xFFFFFFFFu
238 }
239 
240 enum BLBooleanOp
241 {
242     BL_BOOLEAN_OP_COPY = 0,
243     BL_BOOLEAN_OP_AND = 1,
244     BL_BOOLEAN_OP_OR = 2,
245     BL_BOOLEAN_OP_XOR = 3,
246     BL_BOOLEAN_OP_AND_NOT = 4,
247     BL_BOOLEAN_OP_NOT_AND = 5,
248     BL_BOOLEAN_OP_MAX_VALUE = 5,
249     BL_BOOLEAN_OP_FORCE_UINT = 0xFFFFFFFFu
250 }
251 
252 enum BLExtendMode
253 {
254     BL_EXTEND_MODE_PAD = 0,
255     BL_EXTEND_MODE_REPEAT = 1,
256     BL_EXTEND_MODE_REFLECT = 2,
257     BL_EXTEND_MODE_PAD_X_PAD_Y = 0,
258     BL_EXTEND_MODE_PAD_X_REPEAT_Y = 3,
259     BL_EXTEND_MODE_PAD_X_REFLECT_Y = 4,
260     BL_EXTEND_MODE_REPEAT_X_REPEAT_Y = 1,
261     BL_EXTEND_MODE_REPEAT_X_PAD_Y = 5,
262     BL_EXTEND_MODE_REPEAT_X_REFLECT_Y = 6,
263     BL_EXTEND_MODE_REFLECT_X_REFLECT_Y = 2,
264     BL_EXTEND_MODE_REFLECT_X_PAD_Y = 7,
265     BL_EXTEND_MODE_REFLECT_X_REPEAT_Y = 8,
266     BL_EXTEND_MODE_SIMPLE_MAX_VALUE = 2,
267     BL_EXTEND_MODE_COMPLEX_MAX_VALUE = 8,
268     BL_EXTEND_MODE_MAX_VALUE = 8,
269     BL_EXTEND_MODE_FORCE_UINT = 0xFFFFFFFFu
270 }
271 
272 enum BLTextEncoding
273 {
274     BL_TEXT_ENCODING_UTF8 = 0,
275     BL_TEXT_ENCODING_UTF16 = 1,
276     BL_TEXT_ENCODING_UTF32 = 2,
277     BL_TEXT_ENCODING_LATIN1 = 3,
278     BL_TEXT_ENCODING_WCHAR = wchar_t.sizeof == 4 ? BL_TEXT_ENCODING_UTF32 : wchar_t.sizeof == 2 ? BL_TEXT_ENCODING_UTF16 : BL_TEXT_ENCODING_UTF8,
279     BL_TEXT_ENCODING_MAX_VALUE = 3,
280     BL_TEXT_ENCODING_FORCE_UINT = 0xFFFFFFFFu
281 }
282 
283 BLResult blTraceError(BLResult result);
284 
285 version(BindBlend2D_Static) void blRuntimeAssertionFailure(const(char)* file, int line, const(char)* msg);
286 
287 struct BLRange
288 {
289     size_t start;
290     size_t end;
291 }
292 
293 struct BLArrayView
294 {
295     const(void)* data;
296     size_t size;
297 }
298 
299 struct BLStringView
300 {
301     const(char)* data;
302     size_t size;
303 }
304 
305 alias BLDataView = BLArrayView;
306 
307 enum BLObjectInfoShift
308 {
309     BL_OBJECT_INFO_REF_COUNTED_SHIFT = 0,
310     BL_OBJECT_INFO_IMMUTABLE_SHIFT = 1,
311     BL_OBJECT_INFO_X_SHIFT = 2,
312     BL_OBJECT_INFO_P_SHIFT = 3,
313     BL_OBJECT_INFO_C_SHIFT = 10,
314     BL_OBJECT_INFO_B_SHIFT = 14,
315     BL_OBJECT_INFO_A_SHIFT = 18,
316     BL_OBJECT_INFO_TYPE_SHIFT = 22,
317     BL_OBJECT_INFO_VIRTUAL_SHIFT = 28,
318     BL_OBJECT_INFO_T_MSB_SHIFT = 29,
319     BL_OBJECT_INFO_DYNAMIC_SHIFT = 30,
320     BL_OBJECT_INFO_MARKER_SHIFT = 31,
321     BL_OBJECT_INFO_RC_INIT_SHIFT = BL_OBJECT_INFO_REF_COUNTED_SHIFT,
322     BL_OBJECT_INFO_SHIFT_FORCE_UINT = 0xFFFFFFFFu
323 }
324 
325 enum BLObjectInfoBits
326 {
327     BL_OBJECT_INFO_REF_COUNTED_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_REF_COUNTED_SHIFT,
328     BL_OBJECT_INFO_IMMUTABLE_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_IMMUTABLE_SHIFT,
329     BL_OBJECT_INFO_X_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_X_SHIFT,
330     BL_OBJECT_INFO_P_MASK = 0x7Fu << BLObjectInfoShift.BL_OBJECT_INFO_B_SHIFT,
331     BL_OBJECT_INFO_C_MASK = 0x0Fu << BLObjectInfoShift.BL_OBJECT_INFO_C_SHIFT,
332     BL_OBJECT_INFO_B_MASK = 0x0Fu << BLObjectInfoShift.BL_OBJECT_INFO_B_SHIFT,
333     BL_OBJECT_INFO_A_MASK = 0x0Fu << BLObjectInfoShift.BL_OBJECT_INFO_A_SHIFT,
334     BL_OBJECT_INFO_TYPE_MASK = 0xFFu << BLObjectInfoShift.BL_OBJECT_INFO_TYPE_SHIFT,
335     BL_OBJECT_INFO_VIRTUAL_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_VIRTUAL_SHIFT,
336     BL_OBJECT_INFO_T_MSB_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_T_MSB_SHIFT,
337     BL_OBJECT_INFO_DYNAMIC_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_DYNAMIC_SHIFT,
338     BL_OBJECT_INFO_MARKER_FLAG = 0x01u << BLObjectInfoShift.BL_OBJECT_INFO_MARKER_SHIFT,
339     BL_OBJECT_INFO_RC_INIT_MASK = 0x03u << BLObjectInfoShift.BL_OBJECT_INFO_RC_INIT_SHIFT,
340     BL_OBJECT_INFO_BITS_FORCE_UINT = 0xFFFFFFFFu
341 }
342 
343 enum BLObjectType
344 {
345     BL_OBJECT_TYPE_RGBA = 0,
346     BL_OBJECT_TYPE_NULL = 1,
347     BL_OBJECT_TYPE_PATTERN = 2,
348     BL_OBJECT_TYPE_GRADIENT = 3,
349     BL_OBJECT_TYPE_IMAGE = 9,
350     BL_OBJECT_TYPE_PATH = 10,
351     BL_OBJECT_TYPE_FONT = 16,
352     BL_OBJECT_TYPE_FONT_FEATURE_SETTINGS = 17,
353     BL_OBJECT_TYPE_FONT_VARIATION_SETTINGS = 18,
354     BL_OBJECT_TYPE_BOOL = 28,
355     BL_OBJECT_TYPE_INT64 = 29,
356     BL_OBJECT_TYPE_UINT64 = 30,
357     BL_OBJECT_TYPE_DOUBLE = 31,
358     BL_OBJECT_TYPE_STRING = 32,
359     BL_OBJECT_TYPE_ARRAY_OBJECT = 33,
360     BL_OBJECT_TYPE_ARRAY_INT8 = 34,
361     BL_OBJECT_TYPE_ARRAY_UINT8 = 35,
362     BL_OBJECT_TYPE_ARRAY_INT16 = 36,
363     BL_OBJECT_TYPE_ARRAY_UINT16 = 37,
364     BL_OBJECT_TYPE_ARRAY_INT32 = 38,
365     BL_OBJECT_TYPE_ARRAY_UINT32 = 39,
366     BL_OBJECT_TYPE_ARRAY_INT64 = 40,
367     BL_OBJECT_TYPE_ARRAY_UINT64 = 41,
368     BL_OBJECT_TYPE_ARRAY_FLOAT32 = 42,
369     BL_OBJECT_TYPE_ARRAY_FLOAT64 = 43,
370     BL_OBJECT_TYPE_ARRAY_STRUCT_1 = 44,
371     BL_OBJECT_TYPE_ARRAY_STRUCT_2 = 45,
372     BL_OBJECT_TYPE_ARRAY_STRUCT_3 = 46,
373     BL_OBJECT_TYPE_ARRAY_STRUCT_4 = 47,
374     BL_OBJECT_TYPE_ARRAY_STRUCT_6 = 48,
375     BL_OBJECT_TYPE_ARRAY_STRUCT_8 = 49,
376     BL_OBJECT_TYPE_ARRAY_STRUCT_10 = 50,
377     BL_OBJECT_TYPE_ARRAY_STRUCT_12 = 51,
378     BL_OBJECT_TYPE_ARRAY_STRUCT_16 = 52,
379     BL_OBJECT_TYPE_ARRAY_STRUCT_20 = 53,
380     BL_OBJECT_TYPE_ARRAY_STRUCT_24 = 54,
381     BL_OBJECT_TYPE_ARRAY_STRUCT_32 = 55,
382     BL_OBJECT_TYPE_CONTEXT = 64,
383     BL_OBJECT_TYPE_IMAGE_CODEC = 65,
384     BL_OBJECT_TYPE_IMAGE_DECODER = 66,
385     BL_OBJECT_TYPE_IMAGE_ENCODER = 67,
386     BL_OBJECT_TYPE_FONT_FACE = 68,
387     BL_OBJECT_TYPE_FONT_DATA = 69,
388     BL_OBJECT_TYPE_FONT_MANAGER = 70,
389     BL_OBJECT_TYPE_BIT_SET = 128,
390     BL_OBJECT_TYPE_ARRAY_FIRST = 33,
391     BL_OBJECT_TYPE_ARRAY_LAST = 55,
392     BL_OBJECT_TYPE_MAX_STYLE_VALUE = 3,
393     BL_OBJECT_TYPE_MAX_VALUE = 128,
394     BL_OBJECT_TYPE_FORCE_UINT = 0xFFFFFFFFu
395 }
396 
397 struct BLObjectInfo
398 {
399     uint bits;
400 }
401 
402 union BLObjectDetail
403 {
404     void* impl;
405     char[16] char_data;
406     byte[16] i8_data;
407     ubyte[16] u8_data;
408     short[8] i16_data;
409     ushort[8] u16_data;
410     int[4] i32_data;
411     uint[4] u32_data;
412     long[2] i64_data;
413     ulong[2] u64_data;
414     float[4] f32_data;
415     double[2] f64_data;
416 
417     struct
418     {
419         uint[2] u32_data_overlap;
420         uint impl_payload;
421         BLObjectInfo info;
422     }
423 }
424 
425 alias BLDestroyExternalDataFunc = void function(void* impl, void* externalData, void* userData);
426 
427 struct BLObjectExternalInfo
428 {
429     BLDestroyExternalDataFunc destroyFunc;
430     void* userData;
431 }
432 
433 version(BindBlend2D_Static) void* blObjectDetailAllocImpl(BLObjectDetail* d, uint info, size_t implSize, size_t* implSizeOut);
434 version(BindBlend2D_Static) void* blObjectDetailAllocImplExternal(BLObjectDetail* d, uint info, size_t implSize, BLObjectExternalInfo** externalInfoOut, void** externalOptDataOut);
435 version(BindBlend2D_Static) BLResult blObjectDetailFreeImpl(void* impl, uint info);
436 version(BindBlend2D_Static) BLResult blObjectInitMove(BLUnknown* self, BLUnknown* other);
437 version(BindBlend2D_Static) BLResult blObjectInitWeak(BLUnknown* self, const(BLUnknown)* other);
438 version(BindBlend2D_Static) BLResult blObjectReset(BLUnknown* self);
439 version(BindBlend2D_Static) BLResult blObjectAssignMove(BLUnknown* self, BLUnknown* other);
440 version(BindBlend2D_Static) BLResult blObjectAssignWeak(BLUnknown* self, const(BLUnknown)* other);
441 version(BindBlend2D_Static) BLResult blObjectGetProperty(const(BLUnknown)* self, const(char)* name, size_t nameSize, BLVarCore* valueOut);
442 version(BindBlend2D_Static) BLResult blObjectGetPropertyBool(const(BLUnknown)* self, const(char)* name, size_t nameSize, bool* valueOut);
443 version(BindBlend2D_Static) BLResult blObjectGetPropertyInt32(const(BLUnknown)* self, const(char)* name, size_t nameSize, int* valueOut);
444 version(BindBlend2D_Static) BLResult blObjectGetPropertyInt64(const(BLUnknown)* self, const(char)* name, size_t nameSize, long* valueOut);
445 version(BindBlend2D_Static) BLResult blObjectGetPropertyUInt32(const(BLUnknown)* self, const(char)* name, size_t nameSize, uint* valueOut);
446 version(BindBlend2D_Static) BLResult blObjectGetPropertyUInt64(const(BLUnknown)* self, const(char)* name, size_t nameSize, ulong* valueOut);
447 version(BindBlend2D_Static) BLResult blObjectGetPropertyDouble(const(BLUnknown)* self, const(char)* name, size_t nameSize, double* valueOut);
448 version(BindBlend2D_Static) BLResult blObjectSetProperty(BLUnknown* self, const(char)* name, size_t nameSize, const(BLUnknown)* value);
449 version(BindBlend2D_Static) BLResult blObjectSetPropertyBool(BLUnknown* self, const(char)* name, size_t nameSize, bool value);
450 version(BindBlend2D_Static) BLResult blObjectSetPropertyInt32(BLUnknown* self, const(char)* name, size_t nameSize, int value);
451 version(BindBlend2D_Static) BLResult blObjectSetPropertyInt64(BLUnknown* self, const(char)* name, size_t nameSize, long value);
452 version(BindBlend2D_Static) BLResult blObjectSetPropertyUInt32(BLUnknown* self, const(char)* name, size_t nameSize, uint value);
453 version(BindBlend2D_Static) BLResult blObjectSetPropertyUInt64(BLUnknown* self, const(char)* name, size_t nameSize, ulong value);
454 version(BindBlend2D_Static) BLResult blObjectSetPropertyDouble(BLUnknown* self, const(char)* name, size_t nameSize, double value);
455 
456 struct BLObjectVirtBase
457 {
458     BLResult function(BLObjectImpl* impl, uint info) destroy;
459     BLResult function(const(BLObjectImpl)* impl, const(char)* name, size_t nameSize, BLVarCore* valueOut) getProperty;
460     BLResult function(BLObjectImpl* impl, const(char)* name, size_t nameSize, const(BLVarCore)* value) setProperty;
461 }
462 
463 struct BLObjectVirt
464 {
465     BLObjectVirtBase base;
466 }
467 
468 struct BLObjectCore
469 {
470     BLObjectDetail _d;
471 }
472 
473 version(BindBlend2D_Static) BLResult blArrayInit(BLArrayCore* self, BLObjectType arrayType);
474 version(BindBlend2D_Static) BLResult blArrayInitMove(BLArrayCore* self, BLArrayCore* other);
475 version(BindBlend2D_Static) BLResult blArrayInitWeak(BLArrayCore* self, const(BLArrayCore)* other);
476 version(BindBlend2D_Static) BLResult blArrayDestroy(BLArrayCore* self);
477 version(BindBlend2D_Static) BLResult blArrayReset(BLArrayCore* self);
478 version(BindBlend2D_Static) size_t blArrayGetSize(const(BLArrayCore)* self);
479 version(BindBlend2D_Static) size_t blArrayGetCapacity(const(BLArrayCore)* self);
480 version(BindBlend2D_Static) size_t blArrayGetItemSize(BLArrayCore* self);
481 version(BindBlend2D_Static) const(void)* blArrayGetData(const(BLArrayCore)* self);
482 version(BindBlend2D_Static) BLResult blArrayClear(BLArrayCore* self);
483 version(BindBlend2D_Static) BLResult blArrayShrink(BLArrayCore* self);
484 version(BindBlend2D_Static) BLResult blArrayReserve(BLArrayCore* self, size_t n);
485 version(BindBlend2D_Static) BLResult blArrayResize(BLArrayCore* self, size_t n, const(void)* fill);
486 version(BindBlend2D_Static) BLResult blArrayMakeMutable(BLArrayCore* self, void** dataOut);
487 version(BindBlend2D_Static) BLResult blArrayModifyOp(BLArrayCore* self, BLModifyOp op, size_t n, void** dataOut);
488 version(BindBlend2D_Static) BLResult blArrayInsertOp(BLArrayCore* self, size_t index, size_t n, void** dataOut);
489 version(BindBlend2D_Static) BLResult blArrayAssignMove(BLArrayCore* self, BLArrayCore* other);
490 version(BindBlend2D_Static) BLResult blArrayAssignWeak(BLArrayCore* self, const(BLArrayCore)* other);
491 version(BindBlend2D_Static) BLResult blArrayAssignDeep(BLArrayCore* self, const(BLArrayCore)* other);
492 version(BindBlend2D_Static) BLResult blArrayAssignData(BLArrayCore* self, const(void)* data, size_t n);
493 version(BindBlend2D_Static) BLResult blArrayAssignExternalData(BLArrayCore* self, void* data, size_t size, size_t capacity, BLDataAccessFlags dataAccessFlags, BLDestroyExternalDataFunc destroyFunc, void* userData);
494 version(BindBlend2D_Static) BLResult blArrayAppendU8(BLArrayCore* self, ubyte value);
495 version(BindBlend2D_Static) BLResult blArrayAppendU16(BLArrayCore* self, ushort value);
496 version(BindBlend2D_Static) BLResult blArrayAppendU32(BLArrayCore* self, uint value);
497 version(BindBlend2D_Static) BLResult blArrayAppendU64(BLArrayCore* self, ulong value);
498 version(BindBlend2D_Static) BLResult blArrayAppendF32(BLArrayCore* self, float value);
499 version(BindBlend2D_Static) BLResult blArrayAppendF64(BLArrayCore* self, double value);
500 version(BindBlend2D_Static) BLResult blArrayAppendItem(BLArrayCore* self, const(void)* item);
501 version(BindBlend2D_Static) BLResult blArrayAppendData(BLArrayCore* self, const(void)* data, size_t n);
502 version(BindBlend2D_Static) BLResult blArrayInsertU8(BLArrayCore* self, size_t index, ubyte value);
503 version(BindBlend2D_Static) BLResult blArrayInsertU16(BLArrayCore* self, size_t index, ushort value);
504 version(BindBlend2D_Static) BLResult blArrayInsertU32(BLArrayCore* self, size_t index, uint value);
505 version(BindBlend2D_Static) BLResult blArrayInsertU64(BLArrayCore* self, size_t index, ulong value);
506 version(BindBlend2D_Static) BLResult blArrayInsertF32(BLArrayCore* self, size_t index, float value);
507 version(BindBlend2D_Static) BLResult blArrayInsertF64(BLArrayCore* self, size_t index, double value);
508 version(BindBlend2D_Static) BLResult blArrayInsertItem(BLArrayCore* self, size_t index, const(void)* item);
509 version(BindBlend2D_Static) BLResult blArrayInsertData(BLArrayCore* self, size_t index, const(void)* data, size_t n);
510 version(BindBlend2D_Static) BLResult blArrayReplaceU8(BLArrayCore* self, size_t index, ubyte value);
511 version(BindBlend2D_Static) BLResult blArrayReplaceU16(BLArrayCore* self, size_t index, ushort value);
512 version(BindBlend2D_Static) BLResult blArrayReplaceU32(BLArrayCore* self, size_t index, uint value);
513 version(BindBlend2D_Static) BLResult blArrayReplaceU64(BLArrayCore* self, size_t index, ulong value);
514 version(BindBlend2D_Static) BLResult blArrayReplaceF32(BLArrayCore* self, size_t index, float value);
515 version(BindBlend2D_Static) BLResult blArrayReplaceF64(BLArrayCore* self, size_t index, double value);
516 version(BindBlend2D_Static) BLResult blArrayReplaceItem(BLArrayCore* self, size_t index, const(void)* item);
517 version(BindBlend2D_Static) BLResult blArrayReplaceData(BLArrayCore* self, size_t rStart, size_t rEnd, const(void)* data, size_t n);
518 version(BindBlend2D_Static) BLResult blArrayRemoveIndex(BLArrayCore* self, size_t index);
519 version(BindBlend2D_Static) BLResult blArrayRemoveRange(BLArrayCore* self, size_t rStart, size_t rEnd);
520 version(BindBlend2D_Static) bool blArrayEquals(const(BLArrayCore)* a, const(BLArrayCore)* b);
521 
522 struct BLArrayCore
523 {
524     BLObjectDetail _d;
525 }
526 
527 struct BLArrayImpl
528 {
529     void* data;
530     size_t size;
531     size_t capacity;
532 }
533 
534 enum BLBitSetConstants
535 {
536     BL_BIT_SET_INVALID_INDEX = 0xFFFFFFFFu,
537     BL_BIT_SET_RANGE_MASK = 0x80000000u,
538     BL_BIT_SET_SEGMENT_WORD_COUNT = 4u
539 }
540 
541 struct BLBitSetSegment
542 {
543     uint _startWord;
544     uint[BL_BIT_SET_SEGMENT_WORD_COUNT] _data;
545 }
546 
547 struct BLBitSetData
548 {
549     const(BLBitSetSegment)* segmentData;
550     uint segmentCount;
551     BLBitSetSegment[3] ssoSegments;
552 }
553 
554 version(BindBlend2D_Static) BLResult blBitSetInit(BLBitSetCore* self);
555 version(BindBlend2D_Static) BLResult blBitSetInitMove(BLBitSetCore* self, BLBitSetCore* other);
556 version(BindBlend2D_Static) BLResult blBitSetInitWeak(BLBitSetCore* self, const(BLBitSetCore)* other);
557 version(BindBlend2D_Static) BLResult blBitSetInitRange(BLBitSetCore* self, uint startBit, uint endBit);
558 version(BindBlend2D_Static) BLResult blBitSetDestroy(BLBitSetCore* self);
559 version(BindBlend2D_Static) BLResult blBitSetReset(BLBitSetCore* self);
560 version(BindBlend2D_Static) BLResult blBitSetAssignMove(BLBitSetCore* self, BLBitSetCore* other);
561 version(BindBlend2D_Static) BLResult blBitSetAssignWeak(BLBitSetCore* self, const(BLBitSetCore)* other);
562 version(BindBlend2D_Static) BLResult blBitSetAssignDeep(BLBitSetCore* self, const(BLBitSetCore)* other);
563 version(BindBlend2D_Static) BLResult blBitSetAssignRange(BLBitSetCore* self, uint startBit, uint endBit);
564 version(BindBlend2D_Static) BLResult blBitSetAssignWords(BLBitSetCore* self, uint startWord, const(uint)* wordData, uint wordCount);
565 version(BindBlend2D_Static) bool blBitSetIsEmpty(const(BLBitSetCore)* self);
566 version(BindBlend2D_Static) BLResult blBitSetGetData(const(BLBitSetCore)* self, BLBitSetData* out_);
567 version(BindBlend2D_Static) uint blBitSetGetSegmentCount(const(BLBitSetCore)* self);
568 version(BindBlend2D_Static) uint blBitSetGetSegmentCapacity(const(BLBitSetCore)* self);
569 version(BindBlend2D_Static) uint blBitSetGetCardinality(const(BLBitSetCore)* self);
570 version(BindBlend2D_Static) uint blBitSetGetCardinalityInRange(const(BLBitSetCore)* self, uint startBit, uint endBit);
571 version(BindBlend2D_Static) bool blBitSetHasBit(const(BLBitSetCore)* self, uint bitIndex);
572 version(BindBlend2D_Static) bool blBitSetHasBitsInRange(const(BLBitSetCore)* self, uint startBit, uint endBit);
573 version(BindBlend2D_Static) bool blBitSetSubsumes(const(BLBitSetCore)* a, const(BLBitSetCore)* b);
574 version(BindBlend2D_Static) bool blBitSetIntersects(const(BLBitSetCore)* a, const(BLBitSetCore)* b);
575 version(BindBlend2D_Static) bool blBitSetGetRange(const(BLBitSetCore)* self, uint* startOut, uint* endOut);
576 version(BindBlend2D_Static) bool blBitSetEquals(const(BLBitSetCore)* a, const(BLBitSetCore)* b);
577 version(BindBlend2D_Static) int blBitSetCompare(const(BLBitSetCore)* a, const(BLBitSetCore)* b);
578 version(BindBlend2D_Static) BLResult blBitSetClear(BLBitSetCore* self);
579 version(BindBlend2D_Static) BLResult blBitSetShrink(BLBitSetCore* self);
580 version(BindBlend2D_Static) BLResult blBitSetOptimize(BLBitSetCore* self);
581 version(BindBlend2D_Static) BLResult blBitSetChop(BLBitSetCore* self, uint startBit, uint endBit);
582 version(BindBlend2D_Static) BLResult blBitSetAddBit(BLBitSetCore* self, uint bitIndex);
583 version(BindBlend2D_Static) BLResult blBitSetAddRange(BLBitSetCore* self, uint rangeStartBit, uint rangeEndBit);
584 version(BindBlend2D_Static) BLResult blBitSetAddWords(BLBitSetCore* self, uint startWord, const(uint)* wordData, uint wordCount);
585 version(BindBlend2D_Static) BLResult blBitSetClearBit(BLBitSetCore* self, uint bitIndex);
586 version(BindBlend2D_Static) BLResult blBitSetClearRange(BLBitSetCore* self, uint rangeStartBit, uint rangeEndBit);
587 version(BindBlend2D_Static) BLResult blBitSetBuilderCommit(BLBitSetCore* self, BLBitSetBuilderCore* builder, uint newAreaIndex);
588 version(BindBlend2D_Static) BLResult blBitSetBuilderAddRange(BLBitSetCore* self, BLBitSetBuilderCore* builder, uint startBit, uint endBit);
589 
590 struct BLBitSetCore
591 {
592     BLObjectDetail _d;
593 }
594 
595 struct BLBitSetBuilderCore
596 {
597     uint _areaShift;
598     uint _areaIndex;
599 }
600 
601 struct BLBitSetImpl
602 {
603     uint segmentCount;
604     uint segmentCapacity;
605 }
606 
607 enum BLFileOpenFlags
608 {
609     BL_FILE_OPEN_NO_FLAGS = 0u,
610     BL_FILE_OPEN_READ = 0x00000001u,
611     BL_FILE_OPEN_WRITE = 0x00000002u,
612     BL_FILE_OPEN_RW = 0x00000003u,
613     BL_FILE_OPEN_CREATE = 0x00000004u,
614     BL_FILE_OPEN_DELETE = 0x00000008u,
615     BL_FILE_OPEN_TRUNCATE = 0x00000010u,
616     BL_FILE_OPEN_READ_EXCLUSIVE = 0x10000000u,
617     BL_FILE_OPEN_WRITE_EXCLUSIVE = 0x20000000u,
618     BL_FILE_OPEN_RW_EXCLUSIVE = 0x30000000u,
619     BL_FILE_OPEN_CREATE_EXCLUSIVE = 0x40000000u,
620     BL_FILE_OPEN_DELETE_EXCLUSIVE = 0x80000000u,
621     BL_FILE_OPEN_FORCE_UINT = 0xFFFFFFFFu
622 }
623 
624 enum BLFileSeekType
625 {
626     BL_FILE_SEEK_SET = 0,
627     BL_FILE_SEEK_CUR = 1,
628     BL_FILE_SEEK_END = 2,
629     BL_FILE_SEEK_MAX_VALUE = 3,
630     BL_FILE_SEEK_FORCE_UINT = 0xFFFFFFFFu
631 }
632 
633 enum BLFileReadFlags
634 {
635     BL_FILE_READ_NO_FLAGS = 0u,
636     BL_FILE_READ_MMAP_ENABLED = 0x00000001u,
637     BL_FILE_READ_MMAP_AVOID_SMALL = 0x00000002u,
638     BL_FILE_READ_MMAP_NO_FALLBACK = 0x00000008u,
639     BL_FILE_READ_FORCE_UINT = 0xFFFFFFFFu
640 }
641 
642 struct BLFileCore
643 {
644     intptr_t handle;
645 }
646 
647 version(BindBlend2D_Static) BLResult blFileInit(BLFileCore* self);
648 version(BindBlend2D_Static) BLResult blFileReset(BLFileCore* self);
649 version(BindBlend2D_Static) BLResult blFileOpen(BLFileCore* self, const(char)* fileName, BLFileOpenFlags openFlags);
650 version(BindBlend2D_Static) BLResult blFileClose(BLFileCore* self);
651 version(BindBlend2D_Static) BLResult blFileSeek(BLFileCore* self, long offset, BLFileSeekType seekType, long* positionOut);
652 version(BindBlend2D_Static) BLResult blFileRead(BLFileCore* self, void* buffer, size_t n, size_t* bytesReadOut);
653 version(BindBlend2D_Static) BLResult blFileWrite(BLFileCore* self, const(void)* buffer, size_t n, size_t* bytesWrittenOut);
654 version(BindBlend2D_Static) BLResult blFileTruncate(BLFileCore* self, long maxSize);
655 version(BindBlend2D_Static) BLResult blFileGetSize(BLFileCore* self, ulong* fileSizeOut);
656 version(BindBlend2D_Static) BLResult blFileSystemReadFile(const(char)* fileName, BLArrayCore* dst, size_t maxSize, BLFileReadFlags readFlags);
657 version(BindBlend2D_Static) BLResult blFileSystemWriteFile(const(char)* fileName, const(void)* data, size_t size, size_t* bytesWrittenOut);
658 
659 enum BLGeometryDirection
660 {
661     BL_GEOMETRY_DIRECTION_NONE = 0,
662     BL_GEOMETRY_DIRECTION_CW = 1,
663     BL_GEOMETRY_DIRECTION_CCW = 2,
664     BL_GEOMETRY_DIRECTION_FORCE_UINT = 0xFFFFFFFFu
665 }
666 
667 enum BLGeometryType
668 {
669     BL_GEOMETRY_TYPE_NONE = 0,
670     BL_GEOMETRY_TYPE_BOXI = 1,
671     BL_GEOMETRY_TYPE_BOXD = 2,
672     BL_GEOMETRY_TYPE_RECTI = 3,
673     BL_GEOMETRY_TYPE_RECTD = 4,
674     BL_GEOMETRY_TYPE_CIRCLE = 5,
675     BL_GEOMETRY_TYPE_ELLIPSE = 6,
676     BL_GEOMETRY_TYPE_ROUND_RECT = 7,
677     BL_GEOMETRY_TYPE_ARC = 8,
678     BL_GEOMETRY_TYPE_CHORD = 9,
679     BL_GEOMETRY_TYPE_PIE = 10,
680     BL_GEOMETRY_TYPE_LINE = 11,
681     BL_GEOMETRY_TYPE_TRIANGLE = 12,
682     BL_GEOMETRY_TYPE_POLYLINEI = 13,
683     BL_GEOMETRY_TYPE_POLYLINED = 14,
684     BL_GEOMETRY_TYPE_POLYGONI = 15,
685     BL_GEOMETRY_TYPE_POLYGOND = 16,
686     BL_GEOMETRY_TYPE_ARRAY_VIEW_BOXI = 17,
687     BL_GEOMETRY_TYPE_ARRAY_VIEW_BOXD = 18,
688     BL_GEOMETRY_TYPE_ARRAY_VIEW_RECTI = 19,
689     BL_GEOMETRY_TYPE_ARRAY_VIEW_RECTD = 20,
690     BL_GEOMETRY_TYPE_PATH = 21,
691     BL_GEOMETRY_TYPE_MAX_VALUE = 21,
692     BL_GEOMETRY_TYPE_SIMPLE_LAST = BL_GEOMETRY_TYPE_TRIANGLE,
693     BL_GEOMETRY_TYPE_FORCE_UINT = 0xFFFFFFFFu
694 }
695 
696 enum BLFillRule
697 {
698     BL_FILL_RULE_NON_ZERO = 0,
699     BL_FILL_RULE_EVEN_ODD = 1,
700     BL_FILL_RULE_MAX_VALUE = 1,
701     BL_FILL_RULE_FORCE_UINT = 0xFFFFFFFFu
702 }
703 
704 enum BLHitTest
705 {
706     BL_HIT_TEST_IN = 0,
707     BL_HIT_TEST_PART = 1,
708     BL_HIT_TEST_OUT = 2,
709     BL_HIT_TEST_INVALID = 0xFFFFFFFFu,
710     BL_HIT_TEST_FORCE_UINT = 0xFFFFFFFFu
711 }
712 
713 struct BLPointI
714 {
715     int x;
716     int y;
717 }
718 
719 struct BLSizeI
720 {
721     int w;
722     int h;
723 }
724 
725 struct BLBoxI
726 {
727     int x0;
728     int y0;
729     int x1;
730     int y1;
731 }
732 
733 struct BLRectI
734 {
735     int x;
736     int y;
737     int w;
738     int h;
739 }
740 
741 struct BLPoint
742 {
743     double x;
744     double y;
745 }
746 
747 struct BLSize
748 {
749     double w;
750     double h;
751 }
752 
753 struct BLBox
754 {
755     double x0;
756     double y0;
757     double x1;
758     double y1;
759 }
760 
761 struct BLRect
762 {
763     double x;
764     double y;
765     double w;
766     double h;
767 }
768 
769 struct BLLine
770 {
771     double x0;
772     double y0;
773     double x1;
774     double y1;
775 }
776 
777 struct BLTriangle
778 {
779     double x0;
780     double y0;
781     double x1;
782     double y1;
783     double x2;
784     double y2;
785 }
786 
787 struct BLRoundRect
788 {
789     double x;
790     double y;
791     double w;
792     double h;
793     double rx;
794     double ry;
795 }
796 
797 struct BLCircle
798 {
799     double cx;
800     double cy;
801     double r;
802 }
803 
804 struct BLEllipse
805 {
806     double cx;
807     double cy;
808     double rx;
809     double ry;
810 }
811 
812 struct BLArc
813 {
814     double cx;
815     double cy;
816     double rx;
817     double ry;
818     double start;
819     double sweep;
820 }
821 
822 enum BLOrientation
823 {
824     BL_ORIENTATION_HORIZONTAL = 0,
825     BL_ORIENTATION_VERTICAL = 1,
826     BL_ORIENTATION_MAX_VALUE = 1,
827     BL_ORIENTATION_FORCE_UINT = 0xFFFFFFFFu
828 }
829 
830 enum BLGlyphPlacementType
831 {
832     BL_GLYPH_PLACEMENT_TYPE_NONE = 0,
833     BL_GLYPH_PLACEMENT_TYPE_ADVANCE_OFFSET = 1,
834     BL_GLYPH_PLACEMENT_TYPE_DESIGN_UNITS = 2,
835     BL_GLYPH_PLACEMENT_TYPE_USER_UNITS = 3,
836     BL_GLYPH_PLACEMENT_TYPE_ABSOLUTE_UNITS = 4,
837     BL_GLYPH_PLACEMENT_TYPE_MAX_VALUE = 4,
838     BL_GLYPH_PLACEMENT_TYPE_FORCE_UINT = 0xFFFFFFFFu
839 }
840 
841 enum BLGlyphRunFlags
842 {
843     BL_GLYPH_RUN_NO_FLAGS = 0u,
844     BL_GLYPH_RUN_FLAG_UCS4_CONTENT = 0x10000000u,
845     BL_GLYPH_RUN_FLAG_INVALID_TEXT = 0x20000000u,
846     BL_GLYPH_RUN_FLAG_UNDEFINED_GLYPHS = 0x40000000u,
847     BL_GLYPH_RUN_FLAG_INVALID_FONT_DATA = 0x80000000u,
848     BL_GLYPH_RUN_FLAG_FORCE_UINT = 0xFFFFFFFFu
849 }
850 
851 enum BLFontDataFlags
852 {
853     BL_FONT_DATA_NO_FLAGS = 0u,
854     BL_FONT_DATA_FLAG_COLLECTION = 0x00000001u,
855     BL_FONT_DATA_FLAG_FORCE_UINT = 0xFFFFFFFFu
856 }
857 
858 enum BLFontFaceType
859 {
860     BL_FONT_FACE_TYPE_NONE = 0,
861     BL_FONT_FACE_TYPE_OPENTYPE = 1,
862     BL_FONT_FACE_TYPE_MAX_VALUE = 1,
863     BL_FONT_FACE_TYPE_FORCE_UINT = 0xFFFFFFFFu
864 }
865 
866 enum BLFontFaceFlags
867 {
868     BL_FONT_FACE_NO_FLAGS = 0u,
869     BL_FONT_FACE_FLAG_TYPOGRAPHIC_NAMES = 0x00000001u,
870     BL_FONT_FACE_FLAG_TYPOGRAPHIC_METRICS = 0x00000002u,
871     BL_FONT_FACE_FLAG_CHAR_TO_GLYPH_MAPPING = 0x00000004u,
872     BL_FONT_FACE_FLAG_HORIZONTAL_METIRCS = 0x00000010u,
873     BL_FONT_FACE_FLAG_VERTICAL_METRICS = 0x00000020u,
874     BL_FONT_FACE_FLAG_HORIZONTAL_KERNING = 0x00000040u,
875     BL_FONT_FACE_FLAG_VERTICAL_KERNING = 0x00000080u,
876     BL_FONT_FACE_FLAG_OPENTYPE_FEATURES = 0x00000100u,
877     BL_FONT_FACE_FLAG_PANOSE_DATA = 0x00000200u,
878     BL_FONT_FACE_FLAG_UNICODE_COVERAGE = 0x00000400u,
879     BL_FONT_FACE_FLAG_BASELINE_Y_EQUALS_0 = 0x00001000u,
880     BL_FONT_FACE_FLAG_LSB_POINT_X_EQUALS_0 = 0x00002000u,
881     BL_FONT_FACE_FLAG_VARIATION_SEQUENCES = 0x10000000u,
882     BL_FONT_FACE_FLAG_OPENTYPE_VARIATIONS = 0x20000000u,
883     BL_FONT_FACE_FLAG_SYMBOL_FONT = 0x40000000u,
884     BL_FONT_FACE_FLAG_LAST_RESORT_FONT = 0x80000000u,
885     BL_FONT_FACE_FLAG_FORCE_UINT = 0xFFFFFFFFu
886 }
887 
888 enum BLFontFaceDiagFlags
889 {
890     BL_FONT_FACE_DIAG_NO_FLAGS = 0u,
891     BL_FONT_FACE_DIAG_WRONG_NAME_DATA = 0x00000001u,
892     BL_FONT_FACE_DIAG_FIXED_NAME_DATA = 0x00000002u,
893     BL_FONT_FACE_DIAG_WRONG_KERN_DATA = 0x00000004u,
894     BL_FONT_FACE_DIAG_FIXED_KERN_DATA = 0x00000008u,
895     BL_FONT_FACE_DIAG_WRONG_CMAP_DATA = 0x00000010u,
896     BL_FONT_FACE_DIAG_WRONG_CMAP_FORMAT = 0x00000020u,
897     BL_FONT_FACE_DIAG_WRONG_GDEF_DATA = 0x00000100u,
898     BL_FONT_FACE_DIAG_WRONG_GPOS_DATA = 0x00000400u,
899     BL_FONT_FACE_DIAG_WRONG_GSUB_DATA = 0x00001000u,
900     BL_FONT_FACE_DIAG_FORCE_UINT = 0xFFFFFFFFu
901 }
902 
903 enum BLFontOutlineType
904 {
905     BL_FONT_OUTLINE_TYPE_NONE = 0,
906     BL_FONT_OUTLINE_TYPE_TRUETYPE = 1,
907     BL_FONT_OUTLINE_TYPE_CFF = 2,
908     BL_FONT_OUTLINE_TYPE_CFF2 = 3,
909     BL_FONT_OUTLINE_TYPE_MAX_VALUE = 3,
910     BL_FONT_OUTLINE_TYPE_FORCE_UINT = 0xFFFFFFFFu
911 }
912 
913 enum BLFontStretch
914 {
915     BL_FONT_STRETCH_ULTRA_CONDENSED = 1,
916     BL_FONT_STRETCH_EXTRA_CONDENSED = 2,
917     BL_FONT_STRETCH_CONDENSED = 3,
918     BL_FONT_STRETCH_SEMI_CONDENSED = 4,
919     BL_FONT_STRETCH_NORMAL = 5,
920     BL_FONT_STRETCH_SEMI_EXPANDED = 6,
921     BL_FONT_STRETCH_EXPANDED = 7,
922     BL_FONT_STRETCH_EXTRA_EXPANDED = 8,
923     BL_FONT_STRETCH_ULTRA_EXPANDED = 9,
924     BL_FONT_STRETCH_MAX_VALUE = 9,
925     BL_FONT_STRETCH_FORCE_UINT = 0xFFFFFFFFu
926 }
927 
928 enum BLFontStyle
929 {
930     BL_FONT_STYLE_NORMAL = 0,
931     BL_FONT_STYLE_OBLIQUE = 1,
932     BL_FONT_STYLE_ITALIC = 2,
933     BL_FONT_STYLE_MAX_VALUE = 2,
934     BL_FONT_STYLE_FORCE_UINT = 0xFFFFFFFFu
935 }
936 
937 enum BLFontWeight
938 {
939     BL_FONT_WEIGHT_THIN = 100,
940     BL_FONT_WEIGHT_EXTRA_LIGHT = 200,
941     BL_FONT_WEIGHT_LIGHT = 300,
942     BL_FONT_WEIGHT_SEMI_LIGHT = 350,
943     BL_FONT_WEIGHT_NORMAL = 400,
944     BL_FONT_WEIGHT_MEDIUM = 500,
945     BL_FONT_WEIGHT_SEMI_BOLD = 600,
946     BL_FONT_WEIGHT_BOLD = 700,
947     BL_FONT_WEIGHT_EXTRA_BOLD = 800,
948     BL_FONT_WEIGHT_BLACK = 900,
949     BL_FONT_WEIGHT_EXTRA_BLACK = 950,
950     BL_FONT_WEIGHT_FORCE_UINT = 0xFFFFFFFFu
951 }
952 
953 enum BLFontStringId
954 {
955     BL_FONT_STRING_ID_COPYRIGHT_NOTICE = 0,
956     BL_FONT_STRING_ID_FAMILY_NAME = 1,
957     BL_FONT_STRING_ID_SUBFAMILY_NAME = 2,
958     BL_FONT_STRING_ID_UNIQUE_IDENTIFIER = 3,
959     BL_FONT_STRING_ID_FULL_NAME = 4,
960     BL_FONT_STRING_ID_VERSION_STRING = 5,
961     BL_FONT_STRING_ID_POST_SCRIPT_NAME = 6,
962     BL_FONT_STRING_ID_TRADEMARK = 7,
963     BL_FONT_STRING_ID_MANUFACTURER_NAME = 8,
964     BL_FONT_STRING_ID_DESIGNER_NAME = 9,
965     BL_FONT_STRING_ID_DESCRIPTION = 10,
966     BL_FONT_STRING_ID_VENDOR_URL = 11,
967     BL_FONT_STRING_ID_DESIGNER_URL = 12,
968     BL_FONT_STRING_ID_LICENSE_DESCRIPTION = 13,
969     BL_FONT_STRING_ID_LICENSE_INFO_URL = 14,
970     BL_FONT_STRING_ID_RESERVED = 15,
971     BL_FONT_STRING_ID_TYPOGRAPHIC_FAMILY_NAME = 16,
972     BL_FONT_STRING_ID_TYPOGRAPHIC_SUBFAMILY_NAME = 17,
973     BL_FONT_STRING_ID_COMPATIBLE_FULL_NAME = 18,
974     BL_FONT_STRING_ID_SAMPLE_TEXT = 19,
975     BL_FONT_STRING_ID_POST_SCRIPT_CID_NAME = 20,
976     BL_FONT_STRING_ID_WWS_FAMILY_NAME = 21,
977     BL_FONT_STRING_ID_WWS_SUBFAMILY_NAME = 22,
978     BL_FONT_STRING_ID_LIGHT_BACKGROUND_PALETTE = 23,
979     BL_FONT_STRING_ID_DARK_BACKGROUND_PALETTE = 24,
980     BL_FONT_STRING_ID_VARIATIONS_POST_SCRIPT_PREFIX = 25,
981     BL_FONT_STRING_ID_COMMON_MAX_VALUE = 26,
982     BL_FONT_STRING_ID_CUSTOM_START_INDEX = 255,
983     BL_FONT_STRING_ID_FORCE_UINT = 0xFFFFFFFFu
984 }
985 
986 enum BLFontUnicodeCoverageIndex
987 {
988     BL_FONT_UC_INDEX_BASIC_LATIN = 0,
989     BL_FONT_UC_INDEX_LATIN1_SUPPLEMENT = 1,
990     BL_FONT_UC_INDEX_LATIN_EXTENDED_A = 2,
991     BL_FONT_UC_INDEX_LATIN_EXTENDED_B = 3,
992     BL_FONT_UC_INDEX_IPA_EXTENSIONS = 4,
993     BL_FONT_UC_INDEX_SPACING_MODIFIER_LETTERS = 5,
994     BL_FONT_UC_INDEX_COMBINING_DIACRITICAL_MARKS = 6,
995     BL_FONT_UC_INDEX_GREEK_AND_COPTIC = 7,
996     BL_FONT_UC_INDEX_COPTIC = 8,
997     BL_FONT_UC_INDEX_CYRILLIC = 9,
998     BL_FONT_UC_INDEX_ARMENIAN = 10,
999     BL_FONT_UC_INDEX_HEBREW = 11,
1000     BL_FONT_UC_INDEX_VAI = 12,
1001     BL_FONT_UC_INDEX_ARABIC = 13,
1002     BL_FONT_UC_INDEX_NKO = 14,
1003     BL_FONT_UC_INDEX_DEVANAGARI = 15,
1004     BL_FONT_UC_INDEX_BENGALI = 16,
1005     BL_FONT_UC_INDEX_GURMUKHI = 17,
1006     BL_FONT_UC_INDEX_GUJARATI = 18,
1007     BL_FONT_UC_INDEX_ORIYA = 19,
1008     BL_FONT_UC_INDEX_TAMIL = 20,
1009     BL_FONT_UC_INDEX_TELUGU = 21,
1010     BL_FONT_UC_INDEX_KANNADA = 22,
1011     BL_FONT_UC_INDEX_MALAYALAM = 23,
1012     BL_FONT_UC_INDEX_THAI = 24,
1013     BL_FONT_UC_INDEX_LAO = 25,
1014     BL_FONT_UC_INDEX_GEORGIAN = 26,
1015     BL_FONT_UC_INDEX_BALINESE = 27,
1016     BL_FONT_UC_INDEX_HANGUL_JAMO = 28,
1017     BL_FONT_UC_INDEX_LATIN_EXTENDED_ADDITIONAL = 29,
1018     BL_FONT_UC_INDEX_GREEK_EXTENDED = 30,
1019     BL_FONT_UC_INDEX_GENERAL_PUNCTUATION = 31,
1020     BL_FONT_UC_INDEX_SUPERSCRIPTS_AND_SUBSCRIPTS = 32,
1021     BL_FONT_UC_INDEX_CURRENCY_SYMBOLS = 33,
1022     BL_FONT_UC_INDEX_COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS = 34,
1023     BL_FONT_UC_INDEX_LETTERLIKE_SYMBOLS = 35,
1024     BL_FONT_UC_INDEX_NUMBER_FORMS = 36,
1025     BL_FONT_UC_INDEX_ARROWS = 37,
1026     BL_FONT_UC_INDEX_MATHEMATICAL_OPERATORS = 38,
1027     BL_FONT_UC_INDEX_MISCELLANEOUS_TECHNICAL = 39,
1028     BL_FONT_UC_INDEX_CONTROL_PICTURES = 40,
1029     BL_FONT_UC_INDEX_OPTICAL_CHARACTER_RECOGNITION = 41,
1030     BL_FONT_UC_INDEX_ENCLOSED_ALPHANUMERICS = 42,
1031     BL_FONT_UC_INDEX_BOX_DRAWING = 43,
1032     BL_FONT_UC_INDEX_BLOCK_ELEMENTS = 44,
1033     BL_FONT_UC_INDEX_GEOMETRIC_SHAPES = 45,
1034     BL_FONT_UC_INDEX_MISCELLANEOUS_SYMBOLS = 46,
1035     BL_FONT_UC_INDEX_DINGBATS = 47,
1036     BL_FONT_UC_INDEX_CJK_SYMBOLS_AND_PUNCTUATION = 48,
1037     BL_FONT_UC_INDEX_HIRAGANA = 49,
1038     BL_FONT_UC_INDEX_KATAKANA = 50,
1039     BL_FONT_UC_INDEX_BOPOMOFO = 51,
1040     BL_FONT_UC_INDEX_HANGUL_COMPATIBILITY_JAMO = 52,
1041     BL_FONT_UC_INDEX_PHAGS_PA = 53,
1042     BL_FONT_UC_INDEX_ENCLOSED_CJK_LETTERS_AND_MONTHS = 54,
1043     BL_FONT_UC_INDEX_CJK_COMPATIBILITY = 55,
1044     BL_FONT_UC_INDEX_HANGUL_SYLLABLES = 56,
1045     BL_FONT_UC_INDEX_NON_PLANE = 57,
1046     BL_FONT_UC_INDEX_PHOENICIAN = 58,
1047     BL_FONT_UC_INDEX_CJK_UNIFIED_IDEOGRAPHS = 59,
1048     BL_FONT_UC_INDEX_PRIVATE_USE_PLANE0 = 60,
1049     BL_FONT_UC_INDEX_CJK_STROKES = 61,
1050     BL_FONT_UC_INDEX_ALPHABETIC_PRESENTATION_FORMS = 62,
1051     BL_FONT_UC_INDEX_ARABIC_PRESENTATION_FORMS_A = 63,
1052     BL_FONT_UC_INDEX_COMBINING_HALF_MARKS = 64,
1053     BL_FONT_UC_INDEX_VERTICAL_FORMS = 65,
1054     BL_FONT_UC_INDEX_SMALL_FORM_VARIANTS = 66,
1055     BL_FONT_UC_INDEX_ARABIC_PRESENTATION_FORMS_B = 67,
1056     BL_FONT_UC_INDEX_HALFWIDTH_AND_FULLWIDTH_FORMS = 68,
1057     BL_FONT_UC_INDEX_SPECIALS = 69,
1058     BL_FONT_UC_INDEX_TIBETAN = 70,
1059     BL_FONT_UC_INDEX_SYRIAC = 71,
1060     BL_FONT_UC_INDEX_THAANA = 72,
1061     BL_FONT_UC_INDEX_SINHALA = 73,
1062     BL_FONT_UC_INDEX_MYANMAR = 74,
1063     BL_FONT_UC_INDEX_ETHIOPIC = 75,
1064     BL_FONT_UC_INDEX_CHEROKEE = 76,
1065     BL_FONT_UC_INDEX_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS = 77,
1066     BL_FONT_UC_INDEX_OGHAM = 78,
1067     BL_FONT_UC_INDEX_RUNIC = 79,
1068     BL_FONT_UC_INDEX_KHMER = 80,
1069     BL_FONT_UC_INDEX_MONGOLIAN = 81,
1070     BL_FONT_UC_INDEX_BRAILLE_PATTERNS = 82,
1071     BL_FONT_UC_INDEX_YI_SYLLABLES_AND_RADICALS = 83,
1072     BL_FONT_UC_INDEX_TAGALOG_HANUNOO_BUHID_TAGBANWA = 84,
1073     BL_FONT_UC_INDEX_OLD_ITALIC = 85,
1074     BL_FONT_UC_INDEX_GOTHIC = 86,
1075     BL_FONT_UC_INDEX_DESERET = 87,
1076     BL_FONT_UC_INDEX_MUSICAL_SYMBOLS = 88,
1077     BL_FONT_UC_INDEX_MATHEMATICAL_ALPHANUMERIC_SYMBOLS = 89,
1078     BL_FONT_UC_INDEX_PRIVATE_USE_PLANE_15_16 = 90,
1079     BL_FONT_UC_INDEX_VARIATION_SELECTORS = 91,
1080     BL_FONT_UC_INDEX_TAGS = 92,
1081     BL_FONT_UC_INDEX_LIMBU = 93,
1082     BL_FONT_UC_INDEX_TAI_LE = 94,
1083     BL_FONT_UC_INDEX_NEW_TAI_LUE = 95,
1084     BL_FONT_UC_INDEX_BUGINESE = 96,
1085     BL_FONT_UC_INDEX_GLAGOLITIC = 97,
1086     BL_FONT_UC_INDEX_TIFINAGH = 98,
1087     BL_FONT_UC_INDEX_YIJING_HEXAGRAM_SYMBOLS = 99,
1088     BL_FONT_UC_INDEX_SYLOTI_NAGRI = 100,
1089     BL_FONT_UC_INDEX_LINEAR_B_SYLLABARY_AND_IDEOGRAMS = 101,
1090     BL_FONT_UC_INDEX_ANCIENT_GREEK_NUMBERS = 102,
1091     BL_FONT_UC_INDEX_UGARITIC = 103,
1092     BL_FONT_UC_INDEX_OLD_PERSIAN = 104,
1093     BL_FONT_UC_INDEX_SHAVIAN = 105,
1094     BL_FONT_UC_INDEX_OSMANYA = 106,
1095     BL_FONT_UC_INDEX_CYPRIOT_SYLLABARY = 107,
1096     BL_FONT_UC_INDEX_KHAROSHTHI = 108,
1097     BL_FONT_UC_INDEX_TAI_XUAN_JING_SYMBOLS = 109,
1098     BL_FONT_UC_INDEX_CUNEIFORM = 110,
1099     BL_FONT_UC_INDEX_COUNTING_ROD_NUMERALS = 111,
1100     BL_FONT_UC_INDEX_SUNDANESE = 112,
1101     BL_FONT_UC_INDEX_LEPCHA = 113,
1102     BL_FONT_UC_INDEX_OL_CHIKI = 114,
1103     BL_FONT_UC_INDEX_SAURASHTRA = 115,
1104     BL_FONT_UC_INDEX_KAYAH_LI = 116,
1105     BL_FONT_UC_INDEX_REJANG = 117,
1106     BL_FONT_UC_INDEX_CHAM = 118,
1107     BL_FONT_UC_INDEX_ANCIENT_SYMBOLS = 119,
1108     BL_FONT_UC_INDEX_PHAISTOS_DISC = 120,
1109     BL_FONT_UC_INDEX_CARIAN_LYCIAN_LYDIAN = 121,
1110     BL_FONT_UC_INDEX_DOMINO_AND_MAHJONG_TILES = 122,
1111     BL_FONT_UC_INDEX_INTERNAL_USAGE_123 = 123,
1112     BL_FONT_UC_INDEX_INTERNAL_USAGE_124 = 124,
1113     BL_FONT_UC_INDEX_INTERNAL_USAGE_125 = 125,
1114     BL_FONT_UC_INDEX_INTERNAL_USAGE_126 = 126,
1115     BL_FONT_UC_INDEX_INTERNAL_USAGE_127 = 127,
1116     BL_FONT_UC_INDEX_MAX_VALUE = 128,
1117     BL_FONT_UC_INDEX_FORCE_UINT = 0xFFFFFFFFu
1118 }
1119 
1120 enum BLTextDirection
1121 {
1122     BL_TEXT_DIRECTION_LTR = 0,
1123     BL_TEXT_DIRECTION_RTL = 1,
1124     BL_TEXT_DIRECTION_MAX_VALUE = 1,
1125     BL_TEXT_DIRECTION_FORCE_UINT = 0xFFFFFFFFu
1126 }
1127 
1128 struct BLGlyphInfo
1129 {
1130     uint cluster;
1131     uint[2] reserved;
1132 }
1133 
1134 struct BLGlyphPlacement
1135 {
1136     BLPointI placement;
1137     BLPointI advance;
1138 }
1139 
1140 struct BLGlyphMappingState
1141 {
1142     size_t glyphCount;
1143     size_t undefinedFirst;
1144     size_t undefinedCount;
1145 }
1146 
1147 struct BLGlyphOutlineSinkInfo
1148 {
1149     size_t glyphIndex;
1150     size_t contourCount;
1151 }
1152 
1153 struct BLGlyphRun
1154 {
1155     void* glyphData;
1156     void* placementData;
1157     size_t size;
1158     ubyte glyphSize;
1159     ubyte placementType;
1160     byte glyphAdvance;
1161     byte placementAdvance;
1162     uint flags;
1163 }
1164 
1165 struct BLFontFaceInfo
1166 {
1167     ubyte faceType;
1168     ubyte outlineType;
1169     ushort glyphCount;
1170     uint revision;
1171     uint faceIndex;
1172     uint faceFlags;
1173     uint diagFlags;
1174     uint[3] reserved;
1175 }
1176 
1177 struct BLFontQueryProperties
1178 {
1179     uint style;
1180     uint weight;
1181     uint stretch;
1182 }
1183 
1184 struct BLFontTable
1185 {
1186     const(ubyte)* data;
1187     size_t size;
1188 }
1189 
1190 struct BLFontFeatureItem
1191 {
1192     BLTag tag;
1193     uint value;
1194 }
1195 
1196 struct BLFontVariationItem
1197 {
1198     BLTag tag;
1199     float value;
1200 }
1201 
1202 struct BLFontUnicodeCoverage
1203 {
1204     uint[4] data;
1205 }
1206 
1207 struct BLFontPanose
1208 {
1209     union
1210     {
1211         ubyte[10] data;
1212         ubyte familyKind;
1213 
1214         struct _Anonymous_0
1215         {
1216             ubyte familyKind;
1217             ubyte serifStyle;
1218             ubyte weight;
1219             ubyte proportion;
1220             ubyte contrast;
1221             ubyte strokeVariation;
1222             ubyte armStyle;
1223             ubyte letterform;
1224             ubyte midline;
1225             ubyte xHeight;
1226         }
1227 
1228         _Anonymous_0 text;
1229 
1230         struct _Anonymous_1
1231         {
1232             ubyte familyKind;
1233             ubyte toolKind;
1234             ubyte weight;
1235             ubyte spacing;
1236             ubyte aspectRatio;
1237             ubyte contrast;
1238             ubyte topology;
1239             ubyte form;
1240             ubyte finials;
1241             ubyte xAscent;
1242         }
1243 
1244         _Anonymous_1 script;
1245 
1246         struct _Anonymous_2
1247         {
1248             ubyte familyKind;
1249             ubyte decorativeClass;
1250             ubyte weight;
1251             ubyte aspect;
1252             ubyte contrast;
1253             ubyte serifVariant;
1254             ubyte treatment;
1255             ubyte lining;
1256             ubyte topology;
1257             ubyte characterRange;
1258         }
1259 
1260         _Anonymous_2 decorative;
1261 
1262         struct _Anonymous_3
1263         {
1264             ubyte familyKind;
1265             ubyte symbolKind;
1266             ubyte weight;
1267             ubyte spacing;
1268             ubyte aspectRatioAndContrast;
1269             ubyte aspectRatio94;
1270             ubyte aspectRatio119;
1271             ubyte aspectRatio157;
1272             ubyte aspectRatio163;
1273             ubyte aspectRatio211;
1274         }
1275 
1276         _Anonymous_3 symbol;
1277     }
1278 }
1279 
1280 struct BLFontMatrix
1281 {
1282     union
1283     {
1284         double[4] m;
1285 
1286         struct
1287         {
1288             double m00;
1289             double m01;
1290             double m10;
1291             double m11;
1292         }
1293     }
1294 }
1295 
1296 struct BLFontMetrics
1297 {
1298     float size;
1299 
1300     union
1301     {
1302         struct
1303         {
1304             float ascent;
1305             float vAscent;
1306             float descent;
1307             float vDescent;
1308         }
1309 
1310         struct
1311         {
1312             float[2] ascentByOrientation;
1313             float[2] descentByOrientation;
1314         }
1315     }
1316 
1317     float lineGap;
1318     float xHeight;
1319     float capHeight;
1320     float xMin;
1321     float yMin;
1322     float xMax;
1323     float yMax;
1324     float underlinePosition;
1325     float underlineThickness;
1326     float strikethroughPosition;
1327     float strikethroughThickness;
1328 }
1329 
1330 struct BLFontDesignMetrics
1331 {
1332     int unitsPerEm;
1333     int lowestPPEM;
1334     int lineGap;
1335     int xHeight;
1336     int capHeight;
1337 
1338     union
1339     {
1340         struct
1341         {
1342             int ascent;
1343             int vAscent;
1344             int descent;
1345             int vDescent;
1346             int hMinLSB;
1347             int vMinLSB;
1348             int hMinTSB;
1349             int vMinTSB;
1350             int hMaxAdvance;
1351             int vMaxAdvance;
1352         }
1353 
1354         struct
1355         {
1356             int[2] ascentByOrientation;
1357             int[2] descentByOrientation;
1358             int[2] minLSBByOrientation;
1359             int[2] minTSBByOrientation;
1360             int[2] maxAdvanceByOrientation;
1361         }
1362     }
1363 
1364     BLBoxI glyphBoundingBox;
1365     int underlinePosition;
1366     int underlineThickness;
1367     int strikethroughPosition;
1368     int strikethroughThickness;
1369 }
1370 
1371 struct BLTextMetrics
1372 {
1373     BLPoint advance;
1374     BLPoint leadingBearing;
1375     BLPoint trailingBearing;
1376     BLBox boundingBox;
1377 }
1378 
1379 version(BindBlend2D_Static) BLResult blStringInit(BLStringCore* self);
1380 version(BindBlend2D_Static) BLResult blStringInitMove(BLStringCore* self, BLStringCore* other);
1381 version(BindBlend2D_Static) BLResult blStringInitWeak(BLStringCore* self, const(BLStringCore)* other);
1382 version(BindBlend2D_Static) BLResult blStringInitWithData(BLStringCore* self, const(char)* str, size_t size);
1383 version(BindBlend2D_Static) BLResult blStringDestroy(BLStringCore* self);
1384 version(BindBlend2D_Static) BLResult blStringReset(BLStringCore* self);
1385 version(BindBlend2D_Static) const(char)* blStringGetData(const(BLStringCore)* self);
1386 version(BindBlend2D_Static) size_t blStringGetSize(const(BLStringCore)* self);
1387 version(BindBlend2D_Static) size_t blStringGetCapacity(const(BLStringCore)* self);
1388 version(BindBlend2D_Static) BLResult blStringClear(BLStringCore* self);
1389 version(BindBlend2D_Static) BLResult blStringShrink(BLStringCore* self);
1390 version(BindBlend2D_Static) BLResult blStringReserve(BLStringCore* self, size_t n);
1391 version(BindBlend2D_Static) BLResult blStringResize(BLStringCore* self, size_t n, char fill);
1392 version(BindBlend2D_Static) BLResult blStringMakeMutable(BLStringCore* self, char** dataOut);
1393 version(BindBlend2D_Static) BLResult blStringModifyOp(BLStringCore* self, BLModifyOp op, size_t n, char** dataOut);
1394 version(BindBlend2D_Static) BLResult blStringInsertOp(BLStringCore* self, size_t index, size_t n, char** dataOut);
1395 version(BindBlend2D_Static) BLResult blStringAssignMove(BLStringCore* self, BLStringCore* other);
1396 version(BindBlend2D_Static) BLResult blStringAssignWeak(BLStringCore* self, const(BLStringCore)* other);
1397 version(BindBlend2D_Static) BLResult blStringAssignDeep(BLStringCore* self, const(BLStringCore)* other);
1398 version(BindBlend2D_Static) BLResult blStringAssignData(BLStringCore* self, const(char)* str, size_t n);
1399 version(BindBlend2D_Static) BLResult blStringApplyOpChar(BLStringCore* self, BLModifyOp op, char c, size_t n);
1400 version(BindBlend2D_Static) BLResult blStringApplyOpData(BLStringCore* self, BLModifyOp op, const(char)* str, size_t n);
1401 version(BindBlend2D_Static) BLResult blStringApplyOpString(BLStringCore* self, BLModifyOp op, const(BLStringCore)* other);
1402 version(BindBlend2D_Static) BLResult blStringApplyOpFormat(BLStringCore* self, BLModifyOp op, const(char)* fmt, ...);
1403 version(BindBlend2D_Static) BLResult blStringApplyOpFormatV(BLStringCore* self, BLModifyOp op, const(char)* fmt, va_list ap);
1404 version(BindBlend2D_Static) BLResult blStringInsertChar(BLStringCore* self, size_t index, char c, size_t n);
1405 version(BindBlend2D_Static) BLResult blStringInsertData(BLStringCore* self, size_t index, const(char)* str, size_t n);
1406 version(BindBlend2D_Static) BLResult blStringInsertString(BLStringCore* self, size_t index, const(BLStringCore)* other);
1407 version(BindBlend2D_Static) BLResult blStringRemoveIndex(BLStringCore* self, size_t index);
1408 version(BindBlend2D_Static) BLResult blStringRemoveRange(BLStringCore* self, size_t rStart, size_t rEnd);
1409 version(BindBlend2D_Static) bool blStringEquals(const(BLStringCore)* a, const(BLStringCore)* b);
1410 version(BindBlend2D_Static) bool blStringEqualsData(const(BLStringCore)* self, const(char)* str, size_t n);
1411 version(BindBlend2D_Static) int blStringCompare(const(BLStringCore)* a, const(BLStringCore)* b);
1412 version(BindBlend2D_Static) int blStringCompareData(const(BLStringCore)* self, const(char)* str, size_t n);
1413 
1414 struct BLStringCore
1415 {
1416     BLObjectDetail _d;
1417 }
1418 
1419 struct BLStringImpl
1420 {
1421     size_t size;
1422     size_t capacity;
1423 }
1424 
1425 version(BindBlend2D_Static) BLResult blFontDataInit(BLFontDataCore* self);
1426 version(BindBlend2D_Static) BLResult blFontDataInitMove(BLFontDataCore* self, BLFontDataCore* other);
1427 version(BindBlend2D_Static) BLResult blFontDataInitWeak(BLFontDataCore* self, const(BLFontDataCore)* other);
1428 version(BindBlend2D_Static) BLResult blFontDataDestroy(BLFontDataCore* self);
1429 version(BindBlend2D_Static) BLResult blFontDataReset(BLFontDataCore* self);
1430 version(BindBlend2D_Static) BLResult blFontDataAssignMove(BLFontDataCore* self, BLFontDataCore* other);
1431 version(BindBlend2D_Static) BLResult blFontDataAssignWeak(BLFontDataCore* self, const(BLFontDataCore)* other);
1432 version(BindBlend2D_Static) BLResult blFontDataCreateFromFile(BLFontDataCore* self, const(char)* fileName, BLFileReadFlags readFlags);
1433 version(BindBlend2D_Static) BLResult blFontDataCreateFromDataArray(BLFontDataCore* self, const(BLArrayCore)* dataArray);
1434 version(BindBlend2D_Static) BLResult blFontDataCreateFromData(BLFontDataCore* self, const(void)* data, size_t dataSize, BLDestroyExternalDataFunc destroyFunc, void* userData);
1435 version(BindBlend2D_Static) bool blFontDataEquals(const(BLFontDataCore)* a, const(BLFontDataCore)* b);
1436 version(BindBlend2D_Static) BLResult blFontDataListTags(const(BLFontDataCore)* self, uint faceIndex, BLArrayCore* dst);
1437 version(BindBlend2D_Static) size_t blFontDataQueryTables(const(BLFontDataCore)* self, uint faceIndex, BLFontTable* dst, const(BLTag)* tags, size_t count);
1438 
1439 struct BLFontDataCore
1440 {
1441     BLObjectDetail _d;
1442 }
1443 
1444 struct BLFontDataVirt
1445 {
1446     BLObjectVirtBase base;
1447     BLResult function(const(BLFontDataImpl)* impl, uint faceIndex, BLArrayCore* out_) listTags;
1448     size_t function(const(BLFontDataImpl)* impl, uint faceIndex, BLFontTable* dst, const(BLTag)* tags, size_t n) queryTables;
1449 }
1450 
1451 struct BLFontDataImpl
1452 {
1453     const(BLFontDataVirt)* virt;
1454     ubyte faceType;
1455     uint faceCount;
1456     uint flags;
1457 }
1458 
1459 struct BLGlyphBufferImpl
1460 {
1461     union
1462     {
1463         struct
1464         {
1465             uint* content;
1466             BLGlyphPlacement* placementData;
1467             size_t size;
1468             uint reserved;
1469             uint flags;
1470         }
1471 
1472         BLGlyphRun glyphRun;
1473     }
1474 
1475     BLGlyphInfo* infoData;
1476 }
1477 
1478 struct BLGlyphBufferCore
1479 {
1480     BLGlyphBufferImpl* impl;
1481 }
1482 
1483 version(BindBlend2D_Static) BLResult blGlyphBufferInit(BLGlyphBufferCore* self);
1484 version(BindBlend2D_Static) BLResult blGlyphBufferInitMove(BLGlyphBufferCore* self, BLGlyphBufferCore* other);
1485 version(BindBlend2D_Static) BLResult blGlyphBufferDestroy(BLGlyphBufferCore* self);
1486 version(BindBlend2D_Static) BLResult blGlyphBufferReset(BLGlyphBufferCore* self);
1487 version(BindBlend2D_Static) BLResult blGlyphBufferClear(BLGlyphBufferCore* self);
1488 version(BindBlend2D_Static) size_t blGlyphBufferGetSize(const(BLGlyphBufferCore)* self);
1489 version(BindBlend2D_Static) uint blGlyphBufferGetFlags(const(BLGlyphBufferCore)* self);
1490 version(BindBlend2D_Static) const(BLGlyphRun)* blGlyphBufferGetGlyphRun(const(BLGlyphBufferCore)* self);
1491 version(BindBlend2D_Static) const(uint)* blGlyphBufferGetContent(const(BLGlyphBufferCore)* self);
1492 version(BindBlend2D_Static) const(BLGlyphInfo)* blGlyphBufferGetInfoData(const(BLGlyphBufferCore)* self);
1493 version(BindBlend2D_Static) const(BLGlyphPlacement)* blGlyphBufferGetPlacementData(const(BLGlyphBufferCore)* self);
1494 version(BindBlend2D_Static) BLResult blGlyphBufferSetText(BLGlyphBufferCore* self, const(void)* textData, size_t size, BLTextEncoding encoding);
1495 version(BindBlend2D_Static) BLResult blGlyphBufferSetGlyphs(BLGlyphBufferCore* self, const(uint)* glyphData, size_t size);
1496 version(BindBlend2D_Static) BLResult blGlyphBufferSetGlyphsFromStruct(BLGlyphBufferCore* self, const(void)* glyphData, size_t size, size_t glyphIdSize, intptr_t glyphIdAdvance);
1497 
1498 enum BLPathCmd
1499 {
1500     BL_PATH_CMD_MOVE = 0,
1501     BL_PATH_CMD_ON = 1,
1502     BL_PATH_CMD_QUAD = 2,
1503     BL_PATH_CMD_CUBIC = 3,
1504     BL_PATH_CMD_CLOSE = 4,
1505     BL_PATH_CMD_MAX_VALUE = 4,
1506     BL_PATH_CMD_FORCE_UINT = 0xFFFFFFFFu
1507 }
1508 
1509 enum BLPathCmdExtra
1510 {
1511     BL_PATH_CMD_PRESERVE = 0xFFFFFFFFu
1512 }
1513 
1514 enum BLPathFlags
1515 {
1516     BL_PATH_NO_FLAGS = 0u,
1517     BL_PATH_FLAG_EMPTY = 0x00000001u,
1518     BL_PATH_FLAG_MULTIPLE = 0x00000002u,
1519     BL_PATH_FLAG_QUADS = 0x00000004u,
1520     BL_PATH_FLAG_CUBICS = 0x00000008u,
1521     BL_PATH_FLAG_INVALID = 0x40000000u,
1522     BL_PATH_FLAG_DIRTY = 0x80000000u,
1523     BL_PATH_FLAG_FORCE_UINT = 0xFFFFFFFFu
1524 }
1525 
1526 enum BLPathReverseMode
1527 {
1528     BL_PATH_REVERSE_MODE_COMPLETE = 0,
1529     BL_PATH_REVERSE_MODE_SEPARATE = 1,
1530     BL_PATH_REVERSE_MODE_MAX_VALUE = 1,
1531     BL_PATH_REVERSE_MODE_FORCE_UINT = 0xFFFFFFFFu
1532 }
1533 
1534 enum BLStrokeJoin
1535 {
1536     BL_STROKE_JOIN_MITER_CLIP = 0,
1537     BL_STROKE_JOIN_MITER_BEVEL = 1,
1538     BL_STROKE_JOIN_MITER_ROUND = 2,
1539     BL_STROKE_JOIN_BEVEL = 3,
1540     BL_STROKE_JOIN_ROUND = 4,
1541     BL_STROKE_JOIN_MAX_VALUE = 4,
1542     BL_STROKE_JOIN_FORCE_UINT = 0xFFFFFFFFu
1543 }
1544 
1545 enum BLStrokeCapPosition
1546 {
1547     BL_STROKE_CAP_POSITION_START = 0,
1548     BL_STROKE_CAP_POSITION_END = 1,
1549     BL_STROKE_CAP_POSITION_MAX_VALUE = 1,
1550     BL_STROKE_CAP_POSITION_FORCE_UINT = 0xFFFFFFFFu
1551 }
1552 
1553 enum BLStrokeCap
1554 {
1555     BL_STROKE_CAP_BUTT = 0,
1556     BL_STROKE_CAP_SQUARE = 1,
1557     BL_STROKE_CAP_ROUND = 2,
1558     BL_STROKE_CAP_ROUND_REV = 3,
1559     BL_STROKE_CAP_TRIANGLE = 4,
1560     BL_STROKE_CAP_TRIANGLE_REV = 5,
1561     BL_STROKE_CAP_MAX_VALUE = 5,
1562     BL_STROKE_CAP_FORCE_UINT = 0xFFFFFFFFu
1563 }
1564 
1565 enum BLStrokeTransformOrder
1566 {
1567     BL_STROKE_TRANSFORM_ORDER_AFTER = 0,
1568     BL_STROKE_TRANSFORM_ORDER_BEFORE = 1,
1569     BL_STROKE_TRANSFORM_ORDER_MAX_VALUE = 1,
1570     BL_STROKE_TRANSFORM_ORDER_FORCE_UINT = 0xFFFFFFFFu
1571 }
1572 
1573 enum BLFlattenMode
1574 {
1575     BL_FLATTEN_MODE_DEFAULT = 0,
1576     BL_FLATTEN_MODE_RECURSIVE = 1,
1577     BL_FLATTEN_MODE_MAX_VALUE = 1,
1578     BL_FLATTEN_MODE_FORCE_UINT = 0xFFFFFFFFu
1579 }
1580 
1581 enum BLOffsetMode
1582 {
1583     BL_OFFSET_MODE_DEFAULT = 0,
1584     BL_OFFSET_MODE_ITERATIVE = 1,
1585     BL_OFFSET_MODE_MAX_VALUE = 1,
1586     BL_OFFSET_MODE_FORCE_UINT = 0xFFFFFFFFu
1587 }
1588 
1589 struct BLApproximationOptions
1590 {
1591     ubyte flattenMode;
1592     ubyte offsetMode;
1593     ubyte[6] reservedFlags;
1594     double flattenTolerance;
1595     double simplifyTolerance;
1596     double offsetParameter;
1597 }
1598 
1599 struct BLPathView
1600 {
1601     const(ubyte)* commandData;
1602     const(BLPoint)* vertexData;
1603     size_t size;
1604 }
1605 
1606 extern __gshared const BLApproximationOptions blDefaultApproximationOptions;
1607 
1608 alias BLPathSinkFunc = uint function(BLPathCore* path, const(void)* info, void* closure);
1609 
1610 version(BindBlend2D_Static) BLResult blPathInit(BLPathCore* self);
1611 version(BindBlend2D_Static) BLResult blPathInitMove(BLPathCore* self, BLPathCore* other);
1612 version(BindBlend2D_Static) BLResult blPathInitWeak(BLPathCore* self, const(BLPathCore)* other);
1613 version(BindBlend2D_Static) BLResult blPathDestroy(BLPathCore* self);
1614 version(BindBlend2D_Static) BLResult blPathReset(BLPathCore* self);
1615 version(BindBlend2D_Static) size_t blPathGetSize(const(BLPathCore)* self);
1616 version(BindBlend2D_Static) size_t blPathGetCapacity(const(BLPathCore)* self);
1617 version(BindBlend2D_Static) const(ubyte)* blPathGetCommandData(const(BLPathCore)* self);
1618 version(BindBlend2D_Static) const(BLPoint)* blPathGetVertexData(const(BLPathCore)* self);
1619 version(BindBlend2D_Static) BLResult blPathClear(BLPathCore* self);
1620 version(BindBlend2D_Static) BLResult blPathShrink(BLPathCore* self);
1621 version(BindBlend2D_Static) BLResult blPathReserve(BLPathCore* self, size_t n);
1622 version(BindBlend2D_Static) BLResult blPathModifyOp(BLPathCore* self, BLModifyOp op, size_t n, ubyte** cmdDataOut, BLPoint** vtxDataOut);
1623 version(BindBlend2D_Static) BLResult blPathAssignMove(BLPathCore* self, BLPathCore* other);
1624 version(BindBlend2D_Static) BLResult blPathAssignWeak(BLPathCore* self, const(BLPathCore)* other);
1625 version(BindBlend2D_Static) BLResult blPathAssignDeep(BLPathCore* self, const(BLPathCore)* other);
1626 version(BindBlend2D_Static) BLResult blPathSetVertexAt(BLPathCore* self, size_t index, uint cmd, double x, double y);
1627 version(BindBlend2D_Static) BLResult blPathMoveTo(BLPathCore* self, double x0, double y0);
1628 version(BindBlend2D_Static) BLResult blPathLineTo(BLPathCore* self, double x1, double y1);
1629 version(BindBlend2D_Static) BLResult blPathPolyTo(BLPathCore* self, const(BLPoint)* poly, size_t count);
1630 version(BindBlend2D_Static) BLResult blPathQuadTo(BLPathCore* self, double x1, double y1, double x2, double y2);
1631 version(BindBlend2D_Static) BLResult blPathCubicTo(BLPathCore* self, double x1, double y1, double x2, double y2, double x3, double y3);
1632 version(BindBlend2D_Static) BLResult blPathSmoothQuadTo(BLPathCore* self, double x2, double y2);
1633 version(BindBlend2D_Static) BLResult blPathSmoothCubicTo(BLPathCore* self, double x2, double y2, double x3, double y3);
1634 version(BindBlend2D_Static) BLResult blPathArcTo(BLPathCore* self, double x, double y, double rx, double ry, double start, double sweep, bool forceMoveTo);
1635 version(BindBlend2D_Static) BLResult blPathArcQuadrantTo(BLPathCore* self, double x1, double y1, double x2, double y2);
1636 version(BindBlend2D_Static) BLResult blPathEllipticArcTo(BLPathCore* self, double rx, double ry, double xAxisRotation, bool largeArcFlag, bool sweepFlag, double x1, double y1);
1637 version(BindBlend2D_Static) BLResult blPathClose(BLPathCore* self);
1638 version(BindBlend2D_Static) BLResult blPathAddGeometry(BLPathCore* self, BLGeometryType geometryType, const(void)* geometryData, const(BLMatrix2D)* m, BLGeometryDirection dir);
1639 version(BindBlend2D_Static) BLResult blPathAddBoxI(BLPathCore* self, const(BLBoxI)* box, BLGeometryDirection dir);
1640 version(BindBlend2D_Static) BLResult blPathAddBoxD(BLPathCore* self, const(BLBox)* box, BLGeometryDirection dir);
1641 version(BindBlend2D_Static) BLResult blPathAddRectI(BLPathCore* self, const(BLRectI)* rect, BLGeometryDirection dir);
1642 version(BindBlend2D_Static) BLResult blPathAddRectD(BLPathCore* self, const(BLRect)* rect, BLGeometryDirection dir);
1643 version(BindBlend2D_Static) BLResult blPathAddPath(BLPathCore* self, const(BLPathCore)* other, const(BLRange)* range);
1644 version(BindBlend2D_Static) BLResult blPathAddTranslatedPath(BLPathCore* self, const(BLPathCore)* other, const(BLRange)* range, const(BLPoint)* p);
1645 version(BindBlend2D_Static) BLResult blPathAddTransformedPath(BLPathCore* self, const(BLPathCore)* other, const(BLRange)* range, const(BLMatrix2D)* m);
1646 version(BindBlend2D_Static) BLResult blPathAddReversedPath(BLPathCore* self, const(BLPathCore)* other, const(BLRange)* range, BLPathReverseMode reverseMode);
1647 version(BindBlend2D_Static) BLResult blPathAddStrokedPath(BLPathCore* self, const(BLPathCore)* other, const(BLRange)* range, const(BLStrokeOptionsCore)* options, const(BLApproximationOptions)* approx);
1648 version(BindBlend2D_Static) BLResult blPathRemoveRange(BLPathCore* self, const(BLRange)* range);
1649 version(BindBlend2D_Static) BLResult blPathTranslate(BLPathCore* self, const(BLRange)* range, const(BLPoint)* p);
1650 version(BindBlend2D_Static) BLResult blPathTransform(BLPathCore* self, const(BLRange)* range, const(BLMatrix2D)* m);
1651 version(BindBlend2D_Static) BLResult blPathFitTo(BLPathCore* self, const(BLRange)* range, const(BLRect)* rect, uint fitFlags);
1652 version(BindBlend2D_Static) bool blPathEquals(const(BLPathCore)* a, const(BLPathCore)* b);
1653 version(BindBlend2D_Static) BLResult blPathGetInfoFlags(const(BLPathCore)* self, uint* flagsOut);
1654 version(BindBlend2D_Static) BLResult blPathGetControlBox(const(BLPathCore)* self, BLBox* boxOut);
1655 version(BindBlend2D_Static) BLResult blPathGetBoundingBox(const(BLPathCore)* self, BLBox* boxOut);
1656 version(BindBlend2D_Static) BLResult blPathGetFigureRange(const(BLPathCore)* self, size_t index, BLRange* rangeOut);
1657 version(BindBlend2D_Static) BLResult blPathGetLastVertex(const(BLPathCore)* self, BLPoint* vtxOut);
1658 version(BindBlend2D_Static) BLResult blPathGetClosestVertex(const(BLPathCore)* self, const(BLPoint)* p, double maxDistance, size_t* indexOut, double* distanceOut);
1659 version(BindBlend2D_Static) BLHitTest blPathHitTest(const(BLPathCore)* self, const(BLPoint)* p, BLFillRule fillRule);
1660 version(BindBlend2D_Static) BLResult blStrokeOptionsInit(BLStrokeOptionsCore* self);
1661 version(BindBlend2D_Static) BLResult blStrokeOptionsInitMove(BLStrokeOptionsCore* self, BLStrokeOptionsCore* other);
1662 version(BindBlend2D_Static) BLResult blStrokeOptionsInitWeak(BLStrokeOptionsCore* self, const(BLStrokeOptionsCore)* other);
1663 version(BindBlend2D_Static) BLResult blStrokeOptionsDestroy(BLStrokeOptionsCore* self);
1664 version(BindBlend2D_Static) BLResult blStrokeOptionsReset(BLStrokeOptionsCore* self);
1665 version(BindBlend2D_Static) BLResult blStrokeOptionsAssignMove(BLStrokeOptionsCore* self, BLStrokeOptionsCore* other);
1666 version(BindBlend2D_Static) BLResult blStrokeOptionsAssignWeak(BLStrokeOptionsCore* self, const(BLStrokeOptionsCore)* other);
1667 
1668 struct BLPathCore
1669 {
1670     BLObjectDetail _d;
1671 }
1672 
1673 struct BLStrokeOptionsCore
1674 {
1675     union
1676     {
1677         struct
1678         {
1679             ubyte startCap;
1680             ubyte endCap;
1681             ubyte join;
1682             ubyte transformOrder;
1683             ubyte[4] reserved;
1684         }
1685 
1686         ubyte[2] caps;
1687         ulong hints;
1688     }
1689 
1690     double width;
1691     double miterLimit;
1692     double dashOffset;
1693     BLArrayCore dashArray;
1694 }
1695 
1696 struct BLPathImpl
1697 {
1698     union
1699     {
1700         struct
1701         {
1702             ubyte* commandData;
1703             BLPoint* vertexData;
1704             size_t size;
1705         }
1706 
1707         BLPathView view;
1708     }
1709 
1710     size_t capacity;
1711     uint flags;
1712 }
1713 
1714 version(BindBlend2D_Static) BLResult blFontFaceInit(BLFontFaceCore* self);
1715 version(BindBlend2D_Static) BLResult blFontFaceInitMove(BLFontFaceCore* self, BLFontFaceCore* other);
1716 version(BindBlend2D_Static) BLResult blFontFaceInitWeak(BLFontFaceCore* self, const(BLFontFaceCore)* other);
1717 version(BindBlend2D_Static) BLResult blFontFaceDestroy(BLFontFaceCore* self);
1718 version(BindBlend2D_Static) BLResult blFontFaceReset(BLFontFaceCore* self);
1719 version(BindBlend2D_Static) BLResult blFontFaceAssignMove(BLFontFaceCore* self, BLFontFaceCore* other);
1720 version(BindBlend2D_Static) BLResult blFontFaceAssignWeak(BLFontFaceCore* self, const(BLFontFaceCore)* other);
1721 version(BindBlend2D_Static) bool blFontFaceEquals(const(BLFontFaceCore)* a, const(BLFontFaceCore)* b);
1722 version(BindBlend2D_Static) BLResult blFontFaceCreateFromFile(BLFontFaceCore* self, const(char)* fileName, BLFileReadFlags readFlags);
1723 version(BindBlend2D_Static) BLResult blFontFaceCreateFromData(BLFontFaceCore* self, const(BLFontDataCore)* fontData, uint faceIndex);
1724 version(BindBlend2D_Static) BLResult blFontFaceGetFaceInfo(const(BLFontFaceCore)* self, BLFontFaceInfo* out_);
1725 version(BindBlend2D_Static) BLResult blFontFaceGetScriptTags(const(BLFontFaceCore)* self, BLArrayCore* out_);
1726 version(BindBlend2D_Static) BLResult blFontFaceGetFeatureTags(const(BLFontFaceCore)* self, BLArrayCore* out_);
1727 version(BindBlend2D_Static) BLResult blFontFaceGetDesignMetrics(const(BLFontFaceCore)* self, BLFontDesignMetrics* out_);
1728 version(BindBlend2D_Static) BLResult blFontFaceGetUnicodeCoverage(const(BLFontFaceCore)* self, BLFontUnicodeCoverage* out_);
1729 version(BindBlend2D_Static) BLResult blFontFaceGetCharacterCoverage(const(BLFontFaceCore)* self, BLBitSetCore* out_);
1730 
1731 struct BLFontFaceCore
1732 {
1733     BLObjectDetail _d;
1734 }
1735 
1736 struct BLFontFaceVirt
1737 {
1738     BLObjectVirtBase base;
1739 }
1740 
1741 struct BLFontFaceImpl
1742 {
1743     const(BLFontFaceVirt)* virt;
1744     ushort weight;
1745     ubyte stretch;
1746     ubyte style;
1747     BLFontFaceInfo faceInfo;
1748     BLUniqueId uniqueId;
1749     BLFontDataCore data;
1750     BLStringCore fullName;
1751     BLStringCore familyName;
1752     BLStringCore subfamilyName;
1753     BLStringCore postScriptName;
1754     BLArrayCore scriptTags;
1755     BLArrayCore featureTags;
1756     BLFontDesignMetrics designMetrics;
1757     BLFontUnicodeCoverage unicodeCoverage;
1758     BLFontPanose panose;
1759 }
1760 
1761 extern __gshared const uint BL_FONT_FEATURE_INVALID_VALUE;
1762 
1763 struct BLFontFeatureSettingsView
1764 {
1765     const(BLFontFeatureItem)* data;
1766     size_t size;
1767     BLFontFeatureItem[12] ssoData;
1768 }
1769 
1770 version(BindBlend2D_Static) BLResult blFontFeatureSettingsInit(BLFontFeatureSettingsCore* self);
1771 version(BindBlend2D_Static) BLResult blFontFeatureSettingsInitMove(BLFontFeatureSettingsCore* self, BLFontFeatureSettingsCore* other);
1772 version(BindBlend2D_Static) BLResult blFontFeatureSettingsInitWeak(BLFontFeatureSettingsCore* self, const(BLFontFeatureSettingsCore)* other);
1773 version(BindBlend2D_Static) BLResult blFontFeatureSettingsDestroy(BLFontFeatureSettingsCore* self);
1774 version(BindBlend2D_Static) BLResult blFontFeatureSettingsReset(BLFontFeatureSettingsCore* self);
1775 version(BindBlend2D_Static) BLResult blFontFeatureSettingsClear(BLFontFeatureSettingsCore* self);
1776 version(BindBlend2D_Static) BLResult blFontFeatureSettingsShrink(BLFontFeatureSettingsCore* self);
1777 version(BindBlend2D_Static) BLResult blFontFeatureSettingsAssignMove(BLFontFeatureSettingsCore* self, BLFontFeatureSettingsCore* other);
1778 version(BindBlend2D_Static) BLResult blFontFeatureSettingsAssignWeak(BLFontFeatureSettingsCore* self, const(BLFontFeatureSettingsCore)* other);
1779 version(BindBlend2D_Static) size_t blFontFeatureSettingsGetSize(const(BLFontFeatureSettingsCore)* self);
1780 version(BindBlend2D_Static) size_t blFontFeatureSettingsGetCapacity(const(BLFontFeatureSettingsCore)* self);
1781 version(BindBlend2D_Static) BLResult blFontFeatureSettingsGetView(const(BLFontFeatureSettingsCore)* self, BLFontFeatureSettingsView* out_);
1782 version(BindBlend2D_Static) bool blFontFeatureSettingsHasKey(const(BLFontFeatureSettingsCore)* self, BLTag key);
1783 version(BindBlend2D_Static) uint blFontFeatureSettingsGetKey(const(BLFontFeatureSettingsCore)* self, BLTag key);
1784 version(BindBlend2D_Static) BLResult blFontFeatureSettingsSetKey(BLFontFeatureSettingsCore* self, BLTag key, uint value);
1785 version(BindBlend2D_Static) BLResult blFontFeatureSettingsRemoveKey(BLFontFeatureSettingsCore* self, BLTag key);
1786 version(BindBlend2D_Static) bool blFontFeatureSettingsEquals(const(BLFontFeatureSettingsCore)* a, const(BLFontFeatureSettingsCore)* b);
1787 
1788 struct BLFontFeatureSettingsCore
1789 {
1790     BLObjectDetail _d;
1791 }
1792 
1793 struct BLFontFeatureSettingsImpl
1794 {
1795     BLFontFeatureItem* data;
1796     size_t size;
1797     size_t capacity;
1798 }
1799 
1800 struct BLFontVariationSettingsView
1801 {
1802     const(BLFontVariationItem)* data;
1803     size_t size;
1804     BLFontVariationItem[3] ssoData;
1805 }
1806 
1807 version(BindBlend2D_Static) BLResult blFontVariationSettingsInit(BLFontVariationSettingsCore* self);
1808 version(BindBlend2D_Static) BLResult blFontVariationSettingsInitMove(BLFontVariationSettingsCore* self, BLFontVariationSettingsCore* other);
1809 version(BindBlend2D_Static) BLResult blFontVariationSettingsInitWeak(BLFontVariationSettingsCore* self, const(BLFontVariationSettingsCore)* other);
1810 version(BindBlend2D_Static) BLResult blFontVariationSettingsDestroy(BLFontVariationSettingsCore* self);
1811 version(BindBlend2D_Static) BLResult blFontVariationSettingsReset(BLFontVariationSettingsCore* self);
1812 version(BindBlend2D_Static) BLResult blFontVariationSettingsClear(BLFontVariationSettingsCore* self);
1813 version(BindBlend2D_Static) BLResult blFontVariationSettingsShrink(BLFontVariationSettingsCore* self);
1814 version(BindBlend2D_Static) BLResult blFontVariationSettingsAssignMove(BLFontVariationSettingsCore* self, BLFontVariationSettingsCore* other);
1815 version(BindBlend2D_Static) BLResult blFontVariationSettingsAssignWeak(BLFontVariationSettingsCore* self, const(BLFontVariationSettingsCore)* other);
1816 version(BindBlend2D_Static) size_t blFontVariationSettingsGetSize(const(BLFontVariationSettingsCore)* self);
1817 version(BindBlend2D_Static) size_t blFontVariationSettingsGetCapacity(const(BLFontVariationSettingsCore)* self);
1818 version(BindBlend2D_Static) BLResult blFontVariationSettingsGetView(const(BLFontVariationSettingsCore)* self, BLFontVariationSettingsView* out_);
1819 version(BindBlend2D_Static) bool blFontVariationSettingsHasKey(const(BLFontVariationSettingsCore)* self, BLTag key);
1820 version(BindBlend2D_Static) float blFontVariationSettingsGetKey(const(BLFontVariationSettingsCore)* self, BLTag key);
1821 version(BindBlend2D_Static) BLResult blFontVariationSettingsSetKey(BLFontVariationSettingsCore* self, BLTag key, float value);
1822 version(BindBlend2D_Static) BLResult blFontVariationSettingsRemoveKey(BLFontVariationSettingsCore* self, BLTag key);
1823 version(BindBlend2D_Static) bool blFontVariationSettingsEquals(const(BLFontVariationSettingsCore)* a, const(BLFontVariationSettingsCore)* b);
1824 
1825 struct BLFontVariationSettingsCore
1826 {
1827     BLObjectDetail _d;
1828 }
1829 
1830 struct BLFontVariationSettingsImpl
1831 {
1832     BLFontVariationItem* data;
1833     size_t size;
1834     size_t capacity;
1835 }
1836 
1837 version(BindBlend2D_Static) BLResult blFontInit(BLFontCore* self);
1838 version(BindBlend2D_Static) BLResult blFontInitMove(BLFontCore* self, BLFontCore* other);
1839 version(BindBlend2D_Static) BLResult blFontInitWeak(BLFontCore* self, const(BLFontCore)* other);
1840 version(BindBlend2D_Static) BLResult blFontDestroy(BLFontCore* self);
1841 version(BindBlend2D_Static) BLResult blFontReset(BLFontCore* self);
1842 version(BindBlend2D_Static) BLResult blFontAssignMove(BLFontCore* self, BLFontCore* other);
1843 version(BindBlend2D_Static) BLResult blFontAssignWeak(BLFontCore* self, const(BLFontCore)* other);
1844 version(BindBlend2D_Static) bool blFontEquals(const(BLFontCore)* a, const(BLFontCore)* b);
1845 version(BindBlend2D_Static) BLResult blFontCreateFromFace(BLFontCore* self, const(BLFontFaceCore)* face, float size);
1846 version(BindBlend2D_Static) float blFontGetSize(const(BLFontCore)* self);
1847 version(BindBlend2D_Static) BLResult blFontSetSize(BLFontCore* self, float size);
1848 version(BindBlend2D_Static) BLResult blFontGetMetrics(const(BLFontCore)* self, BLFontMetrics* out_);
1849 version(BindBlend2D_Static) BLResult blFontGetMatrix(const(BLFontCore)* self, BLFontMatrix* out_);
1850 version(BindBlend2D_Static) BLResult blFontGetDesignMetrics(const(BLFontCore)* self, BLFontDesignMetrics* out_);
1851 version(BindBlend2D_Static) BLResult blFontGetFeatureSettings(const(BLFontCore)* self, BLFontFeatureSettingsCore* out_);
1852 version(BindBlend2D_Static) BLResult blFontSetFeatureSettings(BLFontCore* self, const(BLFontFeatureSettingsCore)* featureSettings);
1853 version(BindBlend2D_Static) BLResult blFontResetFeatureSettings(BLFontCore* self);
1854 version(BindBlend2D_Static) BLResult blFontShape(const(BLFontCore)* self, BLGlyphBufferCore* gb);
1855 version(BindBlend2D_Static) BLResult blFontMapTextToGlyphs(const(BLFontCore)* self, BLGlyphBufferCore* gb, BLGlyphMappingState* stateOut);
1856 version(BindBlend2D_Static) BLResult blFontPositionGlyphs(const(BLFontCore)* self, BLGlyphBufferCore* gb, uint positioningFlags);
1857 version(BindBlend2D_Static) BLResult blFontApplyKerning(const(BLFontCore)* self, BLGlyphBufferCore* gb);
1858 version(BindBlend2D_Static) BLResult blFontApplyGSub(const(BLFontCore)* self, BLGlyphBufferCore* gb, const(BLBitSetCore)* lookups);
1859 version(BindBlend2D_Static) BLResult blFontApplyGPos(const(BLFontCore)* self, BLGlyphBufferCore* gb, const(BLBitSetCore)* lookups);
1860 version(BindBlend2D_Static) BLResult blFontGetTextMetrics(const(BLFontCore)* self, BLGlyphBufferCore* gb, BLTextMetrics* out_);
1861 version(BindBlend2D_Static) BLResult blFontGetGlyphBounds(const(BLFontCore)* self, const(uint)* glyphData, intptr_t glyphAdvance, BLBoxI* out_, size_t count);
1862 version(BindBlend2D_Static) BLResult blFontGetGlyphAdvances(const(BLFontCore)* self, const(uint)* glyphData, intptr_t glyphAdvance, BLGlyphPlacement* out_, size_t count);
1863 version(BindBlend2D_Static) BLResult blFontGetGlyphOutlines(const(BLFontCore)* self, uint glyphId, const(BLMatrix2D)* userMatrix, BLPathCore* out_, BLPathSinkFunc sink, void* closure);
1864 version(BindBlend2D_Static) BLResult blFontGetGlyphRunOutlines(const(BLFontCore)* self, const(BLGlyphRun)* glyphRun, const(BLMatrix2D)* userMatrix, BLPathCore* out_, BLPathSinkFunc sink, void* closure);
1865 
1866 struct BLFontCore
1867 {
1868     BLObjectDetail _d;
1869 }
1870 
1871 struct BLFontImpl
1872 {
1873     BLFontFaceCore face;
1874     ushort weight;
1875     ubyte stretch;
1876     ubyte style;
1877     uint reserved;
1878     BLFontMetrics metrics;
1879     BLFontMatrix matrix;
1880     BLFontFeatureSettingsCore featureSettings;
1881     BLFontVariationSettingsCore variationSettings;
1882 }
1883 
1884 enum BLFormat
1885 {
1886     BL_FORMAT_NONE = 0,
1887     BL_FORMAT_PRGB32 = 1,
1888     BL_FORMAT_XRGB32 = 2,
1889     BL_FORMAT_A8 = 3,
1890     BL_FORMAT_MAX_VALUE = 3,
1891     BL_FORMAT_RESERVED_COUNT = 16,
1892     BL_FORMAT_FORCE_UINT = 0xFFFFFFFFu
1893 }
1894 
1895 enum BLFormatFlags
1896 {
1897     BL_FORMAT_NO_FLAGS = 0u,
1898     BL_FORMAT_FLAG_RGB = 0x00000001u,
1899     BL_FORMAT_FLAG_ALPHA = 0x00000002u,
1900     BL_FORMAT_FLAG_RGBA = 0x00000003u,
1901     BL_FORMAT_FLAG_LUM = 0x00000004u,
1902     BL_FORMAT_FLAG_LUMA = 0x00000006u,
1903     BL_FORMAT_FLAG_INDEXED = 0x00000010u,
1904     BL_FORMAT_FLAG_PREMULTIPLIED = 0x00000100u,
1905     BL_FORMAT_FLAG_BYTE_SWAP = 0x00000200u,
1906     BL_FORMAT_FLAG_BYTE_ALIGNED = 0x00010000u,
1907     BL_FORMAT_FLAG_UNDEFINED_BITS = 0x00020000u,
1908     BL_FORMAT_FLAG_LE = (1234 == 1234) ? cast(uint) 0 : cast(uint) BL_FORMAT_FLAG_BYTE_SWAP,
1909     BL_FORMAT_FLAG_BE = (1234 == 4321) ? cast(uint) 0 : cast(uint) BL_FORMAT_FLAG_BYTE_SWAP,
1910     BL_FORMAT_FLAG_FORCE_UINT = 0xFFFFFFFFu
1911 }
1912 
1913 version(BindBlend2D_Static) BLResult blFormatInfoQuery(BLFormatInfo* self, BLFormat format);
1914 version(BindBlend2D_Static) BLResult blFormatInfoSanitize(BLFormatInfo* self);
1915 
1916 struct BLFormatInfo
1917 {
1918     uint depth;
1919     uint flags;
1920 
1921     union
1922     {
1923         struct
1924         {
1925             ubyte[4] sizes;
1926             ubyte[4] shifts;
1927         }
1928 
1929         struct
1930         {
1931             ubyte rSize;
1932             ubyte gSize;
1933             ubyte bSize;
1934             ubyte aSize;
1935             ubyte rShift;
1936             ubyte gShift;
1937             ubyte bShift;
1938             ubyte aShift;
1939         }
1940 
1941         BLRgba32* palette;
1942     }
1943 }
1944 
1945 extern __gshared const(BLFormatInfo)[BL_FORMAT_RESERVED_COUNT] blFormatInfo;
1946 
1947 enum BLImageCodecFeatures
1948 {
1949     BL_IMAGE_CODEC_NO_FEATURES = 0u,
1950     BL_IMAGE_CODEC_FEATURE_READ = 0x00000001u,
1951     BL_IMAGE_CODEC_FEATURE_WRITE = 0x00000002u,
1952     BL_IMAGE_CODEC_FEATURE_LOSSLESS = 0x00000004u,
1953     BL_IMAGE_CODEC_FEATURE_LOSSY = 0x00000008u,
1954     BL_IMAGE_CODEC_FEATURE_MULTI_FRAME = 0x00000010u,
1955     BL_IMAGE_CODEC_FEATURE_IPTC = 0x10000000u,
1956     BL_IMAGE_CODEC_FEATURE_EXIF = 0x20000000u,
1957     BL_IMAGE_CODEC_FEATURE_XMP = 0x40000000u,
1958     BL_IMAGE_CODEC_FEATURE_FORCE_UINT = 0xFFFFFFFFu
1959 }
1960 
1961 version(BindBlend2D_Static) BLResult blImageCodecInit(BLImageCodecCore* self);
1962 version(BindBlend2D_Static) BLResult blImageCodecInitMove(BLImageCodecCore* self, BLImageCodecCore* other);
1963 version(BindBlend2D_Static) BLResult blImageCodecInitWeak(BLImageCodecCore* self, const(BLImageCodecCore)* other);
1964 version(BindBlend2D_Static) BLResult blImageCodecInitByName(BLImageCodecCore* self, const(char)* name, size_t size, const(BLArrayCore)* codecs);
1965 version(BindBlend2D_Static) BLResult blImageCodecDestroy(BLImageCodecCore* self);
1966 version(BindBlend2D_Static) BLResult blImageCodecReset(BLImageCodecCore* self);
1967 version(BindBlend2D_Static) BLResult blImageCodecAssignMove(BLImageCodecCore* self, BLImageCodecCore* other);
1968 version(BindBlend2D_Static) BLResult blImageCodecAssignWeak(BLImageCodecCore* self, const(BLImageCodecCore)* other);
1969 version(BindBlend2D_Static) BLResult blImageCodecFindByName(BLImageCodecCore* self, const(char)* name, size_t size, const(BLArrayCore)* codecs);
1970 version(BindBlend2D_Static) BLResult blImageCodecFindByExtension(BLImageCodecCore* self, const(char)* name, size_t size, const(BLArrayCore)* codecs);
1971 version(BindBlend2D_Static) BLResult blImageCodecFindByData(BLImageCodecCore* self, const(void)* data, size_t size, const(BLArrayCore)* codecs);
1972 version(BindBlend2D_Static) uint blImageCodecInspectData(const(BLImageCodecCore)* self, const(void)* data, size_t size);
1973 version(BindBlend2D_Static) BLResult blImageCodecCreateDecoder(const(BLImageCodecCore)* self, BLImageDecoderCore* dst);
1974 version(BindBlend2D_Static) BLResult blImageCodecCreateEncoder(const(BLImageCodecCore)* self, BLImageEncoderCore* dst);
1975 version(BindBlend2D_Static) BLResult blImageCodecArrayInitBuiltInCodecs(BLArrayCore* self);
1976 version(BindBlend2D_Static) BLResult blImageCodecArrayAssignBuiltInCodecs(BLArrayCore* self);
1977 version(BindBlend2D_Static) BLResult blImageCodecAddToBuiltIn(const(BLImageCodecCore)* codec);
1978 version(BindBlend2D_Static) BLResult blImageCodecRemoveFromBuiltIn(const(BLImageCodecCore)* codec);
1979 
1980 struct BLImageCodecCore
1981 {
1982     BLObjectDetail _d;
1983 }
1984 
1985 struct BLImageCodecVirt
1986 {
1987     BLObjectVirtBase base;
1988     uint function(const(BLImageCodecImpl)* impl, const(ubyte)* data, size_t size) inspectData;
1989     BLResult function(const(BLImageCodecImpl)* impl, BLImageDecoderCore* dst) createDecoder;
1990     BLResult function(const(BLImageCodecImpl)* impl, BLImageEncoderCore* dst) createEncoder;
1991 }
1992 
1993 struct BLImageCodecImpl
1994 {
1995     const(BLImageCodecVirt)* virt;
1996     BLStringCore name;
1997     BLStringCore vendor;
1998     BLStringCore mimeType;
1999     BLStringCore extensions;
2000     uint features;
2001 }
2002 
2003 enum BLImageInfoFlags
2004 {
2005     BL_IMAGE_INFO_FLAG_NO_FLAGS = 0u,
2006     BL_IMAGE_INFO_FLAG_PROGRESSIVE = 0x00000001u,
2007     BL_IMAGE_INFO_FLAG_FORCE_UINT = 0xFFFFFFFFu
2008 }
2009 
2010 enum BLImageScaleFilter
2011 {
2012     BL_IMAGE_SCALE_FILTER_NONE = 0,
2013     BL_IMAGE_SCALE_FILTER_NEAREST = 1,
2014     BL_IMAGE_SCALE_FILTER_BILINEAR = 2,
2015     BL_IMAGE_SCALE_FILTER_BICUBIC = 3,
2016     BL_IMAGE_SCALE_FILTER_BELL = 4,
2017     BL_IMAGE_SCALE_FILTER_GAUSS = 5,
2018     BL_IMAGE_SCALE_FILTER_HERMITE = 6,
2019     BL_IMAGE_SCALE_FILTER_HANNING = 7,
2020     BL_IMAGE_SCALE_FILTER_CATROM = 8,
2021     BL_IMAGE_SCALE_FILTER_BESSEL = 9,
2022     BL_IMAGE_SCALE_FILTER_SINC = 10,
2023     BL_IMAGE_SCALE_FILTER_LANCZOS = 11,
2024     BL_IMAGE_SCALE_FILTER_BLACKMAN = 12,
2025     BL_IMAGE_SCALE_FILTER_MITCHELL = 13,
2026     BL_IMAGE_SCALE_FILTER_USER = 14,
2027     BL_IMAGE_SCALE_FILTER_MAX_VALUE = 14,
2028     BL_IMAGE_SCALE_FILTER_FORCE_UINT = 0xFFFFFFFFu
2029 }
2030 
2031 alias BLImageScaleUserFunc = uint function(double* dst, const(double)* tArray, size_t n, const(void)* data);
2032 
2033 struct BLImageData
2034 {
2035     void* pixelData;
2036     intptr_t stride;
2037     BLSizeI size;
2038     uint format;
2039     uint flags;
2040 }
2041 
2042 struct BLImageInfo
2043 {
2044     BLSizeI size;
2045     BLSize density;
2046     uint flags;
2047     ushort depth;
2048     ushort planeCount;
2049     ulong frameCount;
2050     char[16] format;
2051     char[16] compression;
2052 }
2053 
2054 struct BLImageScaleOptions
2055 {
2056     BLImageScaleUserFunc userFunc;
2057     void* userData;
2058     double radius;
2059 
2060     union
2061     {
2062         double[3] data;
2063 
2064         struct _Anonymous_4
2065         {
2066             double b;
2067             double c;
2068         }
2069 
2070         _Anonymous_4 mitchell;
2071     }
2072 }
2073 
2074 version(BindBlend2D_Static) BLResult blImageInit(BLImageCore* self);
2075 version(BindBlend2D_Static) BLResult blImageInitMove(BLImageCore* self, BLImageCore* other);
2076 version(BindBlend2D_Static) BLResult blImageInitWeak(BLImageCore* self, const(BLImageCore)* other);
2077 version(BindBlend2D_Static) BLResult blImageInitAs(BLImageCore* self, int w, int h, BLFormat format);
2078 version(BindBlend2D_Static) BLResult blImageInitAsFromData(BLImageCore* self, int w, int h, BLFormat format, void* pixelData, intptr_t stride, BLDestroyExternalDataFunc destroyFunc, void* userData);
2079 version(BindBlend2D_Static) BLResult blImageDestroy(BLImageCore* self);
2080 version(BindBlend2D_Static) BLResult blImageReset(BLImageCore* self);
2081 version(BindBlend2D_Static) BLResult blImageAssignMove(BLImageCore* self, BLImageCore* other);
2082 version(BindBlend2D_Static) BLResult blImageAssignWeak(BLImageCore* self, const(BLImageCore)* other);
2083 version(BindBlend2D_Static) BLResult blImageAssignDeep(BLImageCore* self, const(BLImageCore)* other);
2084 version(BindBlend2D_Static) BLResult blImageCreate(BLImageCore* self, int w, int h, BLFormat format);
2085 version(BindBlend2D_Static) BLResult blImageCreateFromData(BLImageCore* self, int w, int h, BLFormat format, void* pixelData, intptr_t stride, BLDestroyExternalDataFunc destroyFunc, void* userData);
2086 version(BindBlend2D_Static) BLResult blImageGetData(const(BLImageCore)* self, BLImageData* dataOut);
2087 version(BindBlend2D_Static) BLResult blImageMakeMutable(BLImageCore* self, BLImageData* dataOut);
2088 version(BindBlend2D_Static) BLResult blImageConvert(BLImageCore* self, BLFormat format);
2089 version(BindBlend2D_Static) bool blImageEquals(const(BLImageCore)* a, const(BLImageCore)* b);
2090 version(BindBlend2D_Static) BLResult blImageScale(BLImageCore* dst, const(BLImageCore)* src, const(BLSizeI)* size, uint filter, const(BLImageScaleOptions)* options);
2091 version(BindBlend2D_Static) BLResult blImageReadFromFile(BLImageCore* self, const(char)* fileName, const(BLArrayCore)* codecs);
2092 version(BindBlend2D_Static) BLResult blImageReadFromData(BLImageCore* self, const(void)* data, size_t size, const(BLArrayCore)* codecs);
2093 version(BindBlend2D_Static) BLResult blImageWriteToFile(const(BLImageCore)* self, const(char)* fileName, const(BLImageCodecCore)* codec);
2094 version(BindBlend2D_Static) BLResult blImageWriteToData(const(BLImageCore)* self, BLArrayCore* dst, const(BLImageCodecCore)* codec);
2095 
2096 struct BLImageCore
2097 {
2098     BLObjectDetail _d;
2099 }
2100 
2101 struct BLImageImpl
2102 {
2103     void* pixelData;
2104     intptr_t stride;
2105     BLSizeI size;
2106     ubyte format;
2107     ubyte flags;
2108     ushort depth;
2109     ubyte[4] reserved;
2110 }
2111 
2112 alias BLMapPointDArrayFunc = uint function(const(void)* ctx, BLPoint* dst, const(BLPoint)* src, size_t count);
2113 
2114 enum BLMatrix2DType
2115 {
2116     BL_MATRIX2D_TYPE_IDENTITY = 0,
2117     BL_MATRIX2D_TYPE_TRANSLATE = 1,
2118     BL_MATRIX2D_TYPE_SCALE = 2,
2119     BL_MATRIX2D_TYPE_SWAP = 3,
2120     BL_MATRIX2D_TYPE_AFFINE = 4,
2121     BL_MATRIX2D_TYPE_INVALID = 5,
2122     BL_MATRIX2D_TYPE_MAX_VALUE = 5,
2123     BL_MATRIX2D_TYPE_FORCE_UINT = 0xFFFFFFFFu
2124 }
2125 
2126 enum BLMatrix2DValue
2127 {
2128     BL_MATRIX2D_VALUE_00 = 0,
2129     BL_MATRIX2D_VALUE_01 = 1,
2130     BL_MATRIX2D_VALUE_10 = 2,
2131     BL_MATRIX2D_VALUE_11 = 3,
2132     BL_MATRIX2D_VALUE_20 = 4,
2133     BL_MATRIX2D_VALUE_21 = 5,
2134     BL_MATRIX2D_VALUE_MAX_VALUE = 5,
2135     BL_MATRIX2D_VALUE_FORCE_UINT = 0xFFFFFFFFu
2136 }
2137 
2138 enum BLMatrix2DOp
2139 {
2140     BL_MATRIX2D_OP_RESET = 0,
2141     BL_MATRIX2D_OP_ASSIGN = 1,
2142     BL_MATRIX2D_OP_TRANSLATE = 2,
2143     BL_MATRIX2D_OP_SCALE = 3,
2144     BL_MATRIX2D_OP_SKEW = 4,
2145     BL_MATRIX2D_OP_ROTATE = 5,
2146     BL_MATRIX2D_OP_ROTATE_PT = 6,
2147     BL_MATRIX2D_OP_TRANSFORM = 7,
2148     BL_MATRIX2D_OP_POST_TRANSLATE = 8,
2149     BL_MATRIX2D_OP_POST_SCALE = 9,
2150     BL_MATRIX2D_OP_POST_SKEW = 10,
2151     BL_MATRIX2D_OP_POST_ROTATE = 11,
2152     BL_MATRIX2D_OP_POST_ROTATE_PT = 12,
2153     BL_MATRIX2D_OP_POST_TRANSFORM = 13,
2154     BL_MATRIX2D_OP_MAX_VALUE = 13,
2155     BL_MATRIX2D_OP_FORCE_UINT = 0xFFFFFFFFu
2156 }
2157 
2158 version(BindBlend2D_Static) BLResult blMatrix2DSetIdentity(BLMatrix2D* self);
2159 version(BindBlend2D_Static) BLResult blMatrix2DSetTranslation(BLMatrix2D* self, double x, double y);
2160 version(BindBlend2D_Static) BLResult blMatrix2DSetScaling(BLMatrix2D* self, double x, double y);
2161 version(BindBlend2D_Static) BLResult blMatrix2DSetSkewing(BLMatrix2D* self, double x, double y);
2162 version(BindBlend2D_Static) BLResult blMatrix2DSetRotation(BLMatrix2D* self, double angle, double cx, double cy);
2163 version(BindBlend2D_Static) BLResult blMatrix2DApplyOp(BLMatrix2D* self, BLMatrix2DOp opType, const(void)* opData);
2164 version(BindBlend2D_Static) BLResult blMatrix2DInvert(BLMatrix2D* dst, const(BLMatrix2D)* src);
2165 version(BindBlend2D_Static) BLMatrix2DType blMatrix2DGetType(const(BLMatrix2D)* self);
2166 version(BindBlend2D_Static) BLResult blMatrix2DMapPointDArray(const(BLMatrix2D)* self, BLPoint* dst, const(BLPoint)* src, size_t count);
2167 extern __gshared BLMapPointDArrayFunc[6] blMatrix2DMapPointDArrayFuncs;
2168 
2169 struct BLMatrix2D
2170 {
2171     union
2172     {
2173         double[6] m;
2174 
2175         struct
2176         {
2177             double m00;
2178             double m01;
2179             double m10;
2180             double m11;
2181             double m20;
2182             double m21;
2183         }
2184     }
2185 }
2186 
2187 struct BLRgba32
2188 {
2189     uint value;
2190 }
2191 
2192 struct BLRgba64
2193 {
2194     ulong value;
2195 }
2196 
2197 struct BLRgba
2198 {
2199     float r;
2200     float g;
2201     float b;
2202     float a;
2203 }
2204 
2205 struct BLVarCore
2206 {
2207     BLObjectDetail _d;
2208 }
2209 
2210 version(BindBlend2D_Static) BLResult blVarInitType(BLUnknown* self, BLObjectType type);
2211 version(BindBlend2D_Static) BLResult blVarInitNull(BLUnknown* self);
2212 version(BindBlend2D_Static) BLResult blVarInitBool(BLUnknown* self, bool value);
2213 version(BindBlend2D_Static) BLResult blVarInitInt32(BLUnknown* self, int value);
2214 version(BindBlend2D_Static) BLResult blVarInitInt64(BLUnknown* self, long value);
2215 version(BindBlend2D_Static) BLResult blVarInitUInt32(BLUnknown* self, uint value);
2216 version(BindBlend2D_Static) BLResult blVarInitUInt64(BLUnknown* self, ulong value);
2217 version(BindBlend2D_Static) BLResult blVarInitDouble(BLUnknown* self, double value);
2218 version(BindBlend2D_Static) BLResult blVarInitRgba(BLUnknown* self, const(BLRgba)* rgba);
2219 version(BindBlend2D_Static) BLResult blVarInitRgba32(BLUnknown* self, uint rgba32);
2220 version(BindBlend2D_Static) BLResult blVarInitRgba64(BLUnknown* self, ulong rgba64);
2221 version(BindBlend2D_Static) BLResult blVarInitMove(BLUnknown* self, BLUnknown* other);
2222 version(BindBlend2D_Static) BLResult blVarInitWeak(BLUnknown* self, const(BLUnknown)* other);
2223 version(BindBlend2D_Static) BLResult blVarDestroy(BLUnknown* self);
2224 version(BindBlend2D_Static) BLResult blVarReset(BLUnknown* self);
2225 version(BindBlend2D_Static) BLResult blVarAssignNull(BLUnknown* self);
2226 version(BindBlend2D_Static) BLResult blVarAssignBool(BLUnknown* self, bool value);
2227 version(BindBlend2D_Static) BLResult blVarAssignInt32(BLUnknown* self, int value);
2228 version(BindBlend2D_Static) BLResult blVarAssignInt64(BLUnknown* self, long value);
2229 version(BindBlend2D_Static) BLResult blVarAssignUInt32(BLUnknown* self, uint value);
2230 version(BindBlend2D_Static) BLResult blVarAssignUInt64(BLUnknown* self, ulong value);
2231 version(BindBlend2D_Static) BLResult blVarAssignDouble(BLUnknown* self, double value);
2232 version(BindBlend2D_Static) BLResult blVarAssignRgba(BLUnknown* self, const(BLRgba)* rgba);
2233 version(BindBlend2D_Static) BLResult blVarAssignRgba32(BLUnknown* self, uint rgba32);
2234 version(BindBlend2D_Static) BLResult blVarAssignRgba64(BLUnknown* self, ulong rgba64);
2235 version(BindBlend2D_Static) BLResult blVarAssignMove(BLUnknown* self, BLUnknown* other);
2236 version(BindBlend2D_Static) BLResult blVarAssignWeak(BLUnknown* self, const(BLUnknown)* other);
2237 version(BindBlend2D_Static) BLObjectType blVarGetType(const(BLUnknown)* self);
2238 version(BindBlend2D_Static) BLResult blVarToBool(const(BLUnknown)* self, bool* out_);
2239 version(BindBlend2D_Static) BLResult blVarToInt32(const(BLUnknown)* self, int* out_);
2240 version(BindBlend2D_Static) BLResult blVarToInt64(const(BLUnknown)* self, long* out_);
2241 version(BindBlend2D_Static) BLResult blVarToUInt32(const(BLUnknown)* self, uint* out_);
2242 version(BindBlend2D_Static) BLResult blVarToUInt64(const(BLUnknown)* self, ulong* out_);
2243 version(BindBlend2D_Static) BLResult blVarToDouble(const(BLUnknown)* self, double* out_);
2244 version(BindBlend2D_Static) BLResult blVarToRgba(const(BLUnknown)* self, BLRgba* out_);
2245 version(BindBlend2D_Static) BLResult blVarToRgba32(const(BLUnknown)* self, uint* out_);
2246 version(BindBlend2D_Static) BLResult blVarToRgba64(const(BLUnknown)* self, ulong* out_);
2247 version(BindBlend2D_Static) bool blVarEquals(const(BLUnknown)* a, const(BLUnknown)* b);
2248 version(BindBlend2D_Static) bool blVarEqualsNull(const(BLUnknown)* self);
2249 version(BindBlend2D_Static) bool blVarEqualsBool(const(BLUnknown)* self, bool value);
2250 version(BindBlend2D_Static) bool blVarEqualsInt64(const(BLUnknown)* self, long value);
2251 version(BindBlend2D_Static) bool blVarEqualsUInt64(const(BLUnknown)* self, ulong value);
2252 version(BindBlend2D_Static) bool blVarEqualsDouble(const(BLUnknown)* self, double value);
2253 version(BindBlend2D_Static) bool blVarStrictEquals(const(BLUnknown)* a, const(BLUnknown)* b);
2254 
2255 enum BLContextType
2256 {
2257     BL_CONTEXT_TYPE_NONE = 0,
2258     BL_CONTEXT_TYPE_DUMMY = 1,
2259     BL_CONTEXT_TYPE_RASTER = 3,
2260     BL_CONTEXT_TYPE_MAX_VALUE = 3,
2261     BL_CONTEXT_TYPE_FORCE_UINT = 0xFFFFFFFFu
2262 }
2263 
2264 enum BLContextHint
2265 {
2266     BL_CONTEXT_HINT_RENDERING_QUALITY = 0,
2267     BL_CONTEXT_HINT_GRADIENT_QUALITY = 1,
2268     BL_CONTEXT_HINT_PATTERN_QUALITY = 2,
2269     BL_CONTEXT_HINT_MAX_VALUE = 7,
2270     BL_CONTEXT_HINT_FORCE_UINT = 0xFFFFFFFFu
2271 }
2272 
2273 enum BLContextOpType
2274 {
2275     BL_CONTEXT_OP_TYPE_FILL = 0,
2276     BL_CONTEXT_OP_TYPE_STROKE = 1,
2277     BL_CONTEXT_OP_TYPE_MAX_VALUE = 1,
2278     BL_CONTEXT_OP_TYPE_FORCE_UINT = 0xFFFFFFFFu
2279 }
2280 
2281 enum BLContextFlushFlags
2282 {
2283     BL_CONTEXT_FLUSH_NO_FLAGS = 0u,
2284     BL_CONTEXT_FLUSH_SYNC = 0x80000000u,
2285     BL_CONTEXT_FLUSH_FORCE_UINT = 0xFFFFFFFFu
2286 }
2287 
2288 enum BLContextCreateFlags
2289 {
2290     BL_CONTEXT_CREATE_NO_FLAGS = 0u,
2291     BL_CONTEXT_CREATE_FLAG_DISABLE_JIT = 0x00000001u,
2292     BL_CONTEXT_CREATE_FLAG_FALLBACK_TO_SYNC = 0x00100000u,
2293     BL_CONTEXT_CREATE_FLAG_ISOLATED_THREAD_POOL = 0x01000000u,
2294     BL_CONTEXT_CREATE_FLAG_ISOLATED_JIT_RUNTIME = 0x02000000u,
2295     BL_CONTEXT_CREATE_FLAG_ISOLATED_JIT_LOGGING = 0x04000000u,
2296     BL_CONTEXT_CREATE_FLAG_OVERRIDE_CPU_FEATURES = 0x08000000u,
2297     BL_CONTEXT_CREATE_FLAG_FORCE_UINT = 0xFFFFFFFFu
2298 }
2299 
2300 enum BLContextErrorFlags
2301 {
2302     BL_CONTEXT_ERROR_NO_FLAGS = 0u,
2303     BL_CONTEXT_ERROR_FLAG_INVALID_VALUE = 0x00000001u,
2304     BL_CONTEXT_ERROR_FLAG_INVALID_STATE = 0x00000002u,
2305     BL_CONTEXT_ERROR_FLAG_INVALID_GEOMETRY = 0x00000004u,
2306     BL_CONTEXT_ERROR_FLAG_INVALID_GLYPH = 0x00000008u,
2307     BL_CONTEXT_ERROR_FLAG_INVALID_FONT = 0x00000010u,
2308     BL_CONTEXT_ERROR_FLAG_THREAD_POOL_EXHAUSTED = 0x20000000u,
2309     BL_CONTEXT_ERROR_FLAG_OUT_OF_MEMORY = 0x40000000u,
2310     BL_CONTEXT_ERROR_FLAG_UNKNOWN_ERROR = 0x80000000u,
2311     BL_CONTEXT_ERROR_FLAG_FORCE_UINT = 0xFFFFFFFFu
2312 }
2313 
2314 enum BLClipMode
2315 {
2316     BL_CLIP_MODE_ALIGNED_RECT = 0,
2317     BL_CLIP_MODE_UNALIGNED_RECT = 1,
2318     BL_CLIP_MODE_MASK = 2,
2319     BL_CLIP_MODE_COUNT = 3,
2320     BL_CLIP_MODE_FORCE_UINT = 0xFFFFFFFFu
2321 }
2322 
2323 enum BLCompOp
2324 {
2325     BL_COMP_OP_SRC_OVER = 0,
2326     BL_COMP_OP_SRC_COPY = 1,
2327     BL_COMP_OP_SRC_IN = 2,
2328     BL_COMP_OP_SRC_OUT = 3,
2329     BL_COMP_OP_SRC_ATOP = 4,
2330     BL_COMP_OP_DST_OVER = 5,
2331     BL_COMP_OP_DST_COPY = 6,
2332     BL_COMP_OP_DST_IN = 7,
2333     BL_COMP_OP_DST_OUT = 8,
2334     BL_COMP_OP_DST_ATOP = 9,
2335     BL_COMP_OP_XOR = 10,
2336     BL_COMP_OP_CLEAR = 11,
2337     BL_COMP_OP_PLUS = 12,
2338     BL_COMP_OP_MINUS = 13,
2339     BL_COMP_OP_MODULATE = 14,
2340     BL_COMP_OP_MULTIPLY = 15,
2341     BL_COMP_OP_SCREEN = 16,
2342     BL_COMP_OP_OVERLAY = 17,
2343     BL_COMP_OP_DARKEN = 18,
2344     BL_COMP_OP_LIGHTEN = 19,
2345     BL_COMP_OP_COLOR_DODGE = 20,
2346     BL_COMP_OP_COLOR_BURN = 21,
2347     BL_COMP_OP_LINEAR_BURN = 22,
2348     BL_COMP_OP_LINEAR_LIGHT = 23,
2349     BL_COMP_OP_PIN_LIGHT = 24,
2350     BL_COMP_OP_HARD_LIGHT = 25,
2351     BL_COMP_OP_SOFT_LIGHT = 26,
2352     BL_COMP_OP_DIFFERENCE = 27,
2353     BL_COMP_OP_EXCLUSION = 28,
2354     BL_COMP_OP_MAX_VALUE = 28,
2355     BL_COMP_OP_FORCE_UINT = 0xFFFFFFFFu
2356 }
2357 
2358 enum BLGradientQuality
2359 {
2360     BL_GRADIENT_QUALITY_NEAREST = 0,
2361     BL_GRADIENT_QUALITY_MAX_VALUE = 0,
2362     BL_GRADIENT_QUALITY_FORCE_UINT = 0xFFFFFFFFu
2363 }
2364 
2365 enum BLPatternQuality
2366 {
2367     BL_PATTERN_QUALITY_NEAREST = 0,
2368     BL_PATTERN_QUALITY_BILINEAR = 1,
2369     BL_PATTERN_QUALITY_MAX_VALUE = 1,
2370     BL_PATTERN_QUALITY_FORCE_UINT = 0xFFFFFFFFu
2371 }
2372 
2373 enum BLRenderingQuality
2374 {
2375     BL_RENDERING_QUALITY_ANTIALIAS = 0,
2376     BL_RENDERING_QUALITY_MAX_VALUE = 0,
2377     BL_RENDERING_QUALITY_FORCE_UINT = 0xFFFFFFFFu
2378 }
2379 
2380 struct BLContextCreateInfo
2381 {
2382     uint flags;
2383     uint threadCount;
2384     uint cpuFeatures;
2385     uint commandQueueLimit;
2386     uint[4] reserved;
2387 }
2388 
2389 struct BLContextCookie
2390 {
2391     ulong[2] data;
2392 }
2393 
2394 struct BLContextHints
2395 {
2396     union
2397     {
2398         struct
2399         {
2400             ubyte renderingQuality;
2401             ubyte gradientQuality;
2402             ubyte patternQuality;
2403         }
2404 
2405         ubyte[8] hints;
2406     }
2407 }
2408 
2409 struct BLContextCore
2410 {
2411     BLObjectDetail _d;
2412 }
2413 
2414 version(BindBlend2D_Static) BLResult blContextInit(BLContextCore* self);
2415 version(BindBlend2D_Static) BLResult blContextInitMove(BLContextCore* self, BLContextCore* other);
2416 version(BindBlend2D_Static) BLResult blContextInitWeak(BLContextCore* self, const(BLContextCore)* other);
2417 version(BindBlend2D_Static) BLResult blContextInitAs(BLContextCore* self, BLImageCore* image, const(BLContextCreateInfo)* cci);
2418 version(BindBlend2D_Static) BLResult blContextDestroy(BLContextCore* self);
2419 version(BindBlend2D_Static) BLResult blContextReset(BLContextCore* self);
2420 version(BindBlend2D_Static) BLResult blContextAssignMove(BLContextCore* self, BLContextCore* other);
2421 version(BindBlend2D_Static) BLResult blContextAssignWeak(BLContextCore* self, const(BLContextCore)* other);
2422 version(BindBlend2D_Static) BLContextType blContextGetType(const(BLContextCore)* self);
2423 version(BindBlend2D_Static) BLResult blContextGetTargetSize(const(BLContextCore)* self, BLSize* targetSizeOut);
2424 version(BindBlend2D_Static) BLImageCore* blContextGetTargetImage(const(BLContextCore)* self);
2425 version(BindBlend2D_Static) BLResult blContextBegin(BLContextCore* self, BLImageCore* image, const(BLContextCreateInfo)* cci);
2426 version(BindBlend2D_Static) BLResult blContextEnd(BLContextCore* self);
2427 version(BindBlend2D_Static) BLResult blContextFlush(BLContextCore* self, BLContextFlushFlags flags);
2428 version(BindBlend2D_Static) BLResult blContextSave(BLContextCore* self, BLContextCookie* cookie);
2429 version(BindBlend2D_Static) BLResult blContextRestore(BLContextCore* self, const(BLContextCookie)* cookie);
2430 version(BindBlend2D_Static) BLResult blContextGetMetaMatrix(const(BLContextCore)* self, BLMatrix2D* m);
2431 version(BindBlend2D_Static) BLResult blContextGetUserMatrix(const(BLContextCore)* self, BLMatrix2D* m);
2432 version(BindBlend2D_Static) BLResult blContextUserToMeta(BLContextCore* self);
2433 version(BindBlend2D_Static) BLResult blContextMatrixOp(BLContextCore* self, BLMatrix2DOp opType, const(void)* opData);
2434 version(BindBlend2D_Static) uint blContextGetHint(const(BLContextCore)* self, BLContextHint hintType);
2435 version(BindBlend2D_Static) BLResult blContextSetHint(BLContextCore* self, BLContextHint hintType, uint value);
2436 version(BindBlend2D_Static) BLResult blContextGetHints(const(BLContextCore)* self, BLContextHints* hintsOut);
2437 version(BindBlend2D_Static) BLResult blContextSetHints(BLContextCore* self, const(BLContextHints)* hints);
2438 version(BindBlend2D_Static) BLResult blContextSetFlattenMode(BLContextCore* self, BLFlattenMode mode);
2439 version(BindBlend2D_Static) BLResult blContextSetFlattenTolerance(BLContextCore* self, double tolerance);
2440 version(BindBlend2D_Static) BLResult blContextSetApproximationOptions(BLContextCore* self, const(BLApproximationOptions)* options);
2441 version(BindBlend2D_Static) BLCompOp blContextGetCompOp(const(BLContextCore)* self);
2442 version(BindBlend2D_Static) BLResult blContextSetCompOp(BLContextCore* self, BLCompOp compOp);
2443 version(BindBlend2D_Static) double blContextGetGlobalAlpha(const(BLContextCore)* self);
2444 version(BindBlend2D_Static) BLResult blContextSetGlobalAlpha(BLContextCore* self, double alpha);
2445 version(BindBlend2D_Static) double blContextGetFillAlpha(const(BLContextCore)* self);
2446 version(BindBlend2D_Static) BLResult blContextSetFillAlpha(BLContextCore* self, double alpha);
2447 version(BindBlend2D_Static) BLResult blContextGetFillStyle(const(BLContextCore)* self, BLVarCore* varOut);
2448 version(BindBlend2D_Static) BLResult blContextSetFillStyle(BLContextCore* self, const(BLUnknown)* var);
2449 version(BindBlend2D_Static) BLResult blContextSetFillStyleRgba(BLContextCore* self, const(BLRgba)* rgba);
2450 version(BindBlend2D_Static) BLResult blContextSetFillStyleRgba32(BLContextCore* self, uint rgba32);
2451 version(BindBlend2D_Static) BLResult blContextSetFillStyleRgba64(BLContextCore* self, ulong rgba64);
2452 version(BindBlend2D_Static) BLFillRule blContextGetFillRule(const(BLContextCore)* self);
2453 version(BindBlend2D_Static) BLResult blContextSetFillRule(BLContextCore* self, BLFillRule fillRule);
2454 version(BindBlend2D_Static) double blContextGetStrokeAlpha(const(BLContextCore)* self);
2455 version(BindBlend2D_Static) BLResult blContextSetStrokeAlpha(BLContextCore* self, double alpha);
2456 version(BindBlend2D_Static) BLResult blContextGetStrokeStyle(const(BLContextCore)* self, BLVarCore* varOut);
2457 version(BindBlend2D_Static) BLResult blContextSetStrokeStyle(BLContextCore* self, const(BLUnknown)* var);
2458 version(BindBlend2D_Static) BLResult blContextSetStrokeStyleRgba(BLContextCore* self, const(BLRgba)* rgba);
2459 version(BindBlend2D_Static) BLResult blContextSetStrokeStyleRgba32(BLContextCore* self, uint rgba32);
2460 version(BindBlend2D_Static) BLResult blContextSetStrokeStyleRgba64(BLContextCore* self, ulong rgba64);
2461 version(BindBlend2D_Static) double blContextGetStrokeWidth(const(BLContextCore)* self);
2462 version(BindBlend2D_Static) BLResult blContextSetStrokeWidth(BLContextCore* self, double width);
2463 version(BindBlend2D_Static) double blContextGetStrokeMiterLimit(const(BLContextCore)* self);
2464 version(BindBlend2D_Static) BLResult blContextSetStrokeMiterLimit(BLContextCore* self, double miterLimit);
2465 version(BindBlend2D_Static) BLStrokeCap blContextGetStrokeCap(const(BLContextCore)* self, BLStrokeCapPosition position);
2466 version(BindBlend2D_Static) BLResult blContextSetStrokeCap(BLContextCore* self, BLStrokeCapPosition position, BLStrokeCap strokeCap);
2467 version(BindBlend2D_Static) BLResult blContextSetStrokeCaps(BLContextCore* self, BLStrokeCap strokeCap);
2468 version(BindBlend2D_Static) BLStrokeJoin blContextGetStrokeJoin(const(BLContextCore)* self);
2469 version(BindBlend2D_Static) BLResult blContextSetStrokeJoin(BLContextCore* self, BLStrokeJoin strokeJoin);
2470 version(BindBlend2D_Static) BLStrokeTransformOrder blContextGetStrokeTransformOrder(const(BLContextCore)* self);
2471 version(BindBlend2D_Static) BLResult blContextSetStrokeTransformOrder(BLContextCore* self, BLStrokeTransformOrder transformOrder);
2472 version(BindBlend2D_Static) double blContextGetStrokeDashOffset(const(BLContextCore)* self);
2473 version(BindBlend2D_Static) BLResult blContextSetStrokeDashOffset(BLContextCore* self, double dashOffset);
2474 version(BindBlend2D_Static) BLResult blContextGetStrokeDashArray(const(BLContextCore)* self, BLArrayCore* dashArrayOut);
2475 version(BindBlend2D_Static) BLResult blContextSetStrokeDashArray(BLContextCore* self, const(BLArrayCore)* dashArray);
2476 version(BindBlend2D_Static) BLResult blContextGetStrokeOptions(const(BLContextCore)* self, BLStrokeOptionsCore* options);
2477 version(BindBlend2D_Static) BLResult blContextSetStrokeOptions(BLContextCore* self, const(BLStrokeOptionsCore)* options);
2478 version(BindBlend2D_Static) BLResult blContextClipToRectI(BLContextCore* self, const(BLRectI)* rect);
2479 version(BindBlend2D_Static) BLResult blContextClipToRectD(BLContextCore* self, const(BLRect)* rect);
2480 version(BindBlend2D_Static) BLResult blContextRestoreClipping(BLContextCore* self);
2481 version(BindBlend2D_Static) BLResult blContextClearAll(BLContextCore* self);
2482 version(BindBlend2D_Static) BLResult blContextClearRectI(BLContextCore* self, const(BLRectI)* rect);
2483 version(BindBlend2D_Static) BLResult blContextClearRectD(BLContextCore* self, const(BLRect)* rect);
2484 version(BindBlend2D_Static) BLResult blContextFillAll(BLContextCore* self);
2485 version(BindBlend2D_Static) BLResult blContextFillRectI(BLContextCore* self, const(BLRectI)* rect);
2486 version(BindBlend2D_Static) BLResult blContextFillRectD(BLContextCore* self, const(BLRect)* rect);
2487 version(BindBlend2D_Static) BLResult blContextFillPathD(BLContextCore* self, const(BLPathCore)* path);
2488 version(BindBlend2D_Static) BLResult blContextFillGeometry(BLContextCore* self, BLGeometryType geometryType, const(void)* geometryData);
2489 version(BindBlend2D_Static) BLResult blContextFillTextI(BLContextCore* self, const(BLPointI)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding);
2490 version(BindBlend2D_Static) BLResult blContextFillTextD(BLContextCore* self, const(BLPoint)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding);
2491 version(BindBlend2D_Static) BLResult blContextFillGlyphRunI(BLContextCore* self, const(BLPointI)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun);
2492 version(BindBlend2D_Static) BLResult blContextFillGlyphRunD(BLContextCore* self, const(BLPoint)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun);
2493 version(BindBlend2D_Static) BLResult blContextFillMaskI(BLContextCore* self, const(BLPointI)* pt, const(BLImageCore)* mask, const(BLRectI)* maskArea);
2494 version(BindBlend2D_Static) BLResult blContextFillMaskD(BLContextCore* self, const(BLPoint)* pt, const(BLImageCore)* mask, const(BLRectI)* maskArea);
2495 version(BindBlend2D_Static) BLResult blContextStrokeRectI(BLContextCore* self, const(BLRectI)* rect);
2496 version(BindBlend2D_Static) BLResult blContextStrokeRectD(BLContextCore* self, const(BLRect)* rect);
2497 version(BindBlend2D_Static) BLResult blContextStrokePathD(BLContextCore* self, const(BLPathCore)* path);
2498 version(BindBlend2D_Static) BLResult blContextStrokeGeometry(BLContextCore* self, BLGeometryType geometryType, const(void)* geometryData);
2499 version(BindBlend2D_Static) BLResult blContextStrokeTextI(BLContextCore* self, const(BLPointI)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding);
2500 version(BindBlend2D_Static) BLResult blContextStrokeTextD(BLContextCore* self, const(BLPoint)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding);
2501 version(BindBlend2D_Static) BLResult blContextStrokeGlyphRunI(BLContextCore* self, const(BLPointI)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun);
2502 version(BindBlend2D_Static) BLResult blContextStrokeGlyphRunD(BLContextCore* self, const(BLPoint)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun);
2503 version(BindBlend2D_Static) BLResult blContextBlitImageI(BLContextCore* self, const(BLPointI)* pt, const(BLImageCore)* img, const(BLRectI)* imgArea);
2504 version(BindBlend2D_Static) BLResult blContextBlitImageD(BLContextCore* self, const(BLPoint)* pt, const(BLImageCore)* img, const(BLRectI)* imgArea);
2505 version(BindBlend2D_Static) BLResult blContextBlitScaledImageI(BLContextCore* self, const(BLRectI)* rect, const(BLImageCore)* img, const(BLRectI)* imgArea);
2506 version(BindBlend2D_Static) BLResult blContextBlitScaledImageD(BLContextCore* self, const(BLRect)* rect, const(BLImageCore)* img, const(BLRectI)* imgArea);
2507 
2508 struct BLContextState
2509 {
2510     BLImageCore* targetImage;
2511     BLSize targetSize;
2512     BLContextHints hints;
2513     ubyte compOp;
2514     ubyte fillRule;
2515     ubyte[2] styleType;
2516     ubyte[4] reserved;
2517     BLApproximationOptions approximationOptions;
2518     double globalAlpha;
2519     double[2] styleAlpha;
2520     BLStrokeOptionsCore strokeOptions;
2521     BLMatrix2D metaMatrix;
2522     BLMatrix2D userMatrix;
2523     size_t savedStateCount;
2524 }
2525 
2526 struct BLContextVirt
2527 {
2528     BLObjectVirtBase base;
2529     BLResult function(BLContextImpl* impl, BLContextFlushFlags flags) flush;
2530     BLResult function(BLContextImpl* impl, BLContextCookie* cookie) save;
2531     BLResult function(BLContextImpl* impl, const(BLContextCookie)* cookie) restore;
2532     BLResult function(BLContextImpl* impl, BLMatrix2DOp opType, const(void)* opData) matrixOp;
2533     BLResult function(BLContextImpl* impl) userToMeta;
2534     BLResult function(BLContextImpl* impl, BLContextHint hintType, uint value) setHint;
2535     BLResult function(BLContextImpl* impl, const(BLContextHints)* hints) setHints;
2536     BLResult function(BLContextImpl* impl, BLFlattenMode mode) setFlattenMode;
2537     BLResult function(BLContextImpl* impl, double tolerance) setFlattenTolerance;
2538     BLResult function(BLContextImpl* impl, const(BLApproximationOptions)* options) setApproximationOptions;
2539     BLResult function(BLContextImpl* impl, BLCompOp compOp) setCompOp;
2540     BLResult function(BLContextImpl* impl, double alpha) setGlobalAlpha;
2541     BLResult function(BLContextImpl* impl, double alpha)[2] setStyleAlpha;
2542     BLResult function(const(BLContextImpl)* impl, BLVarCore* out_)[2] getStyle;
2543     BLResult function(BLContextImpl* impl, const(BLUnknown)* var)[2] setStyle;
2544     BLResult function(BLContextImpl* impl, const(BLRgba)* rgba)[2] setStyleRgba;
2545     BLResult function(BLContextImpl* impl, uint rgba32)[2] setStyleRgba32;
2546     BLResult function(BLContextImpl* impl, ulong rgba64)[2] setStyleRgba64;
2547     BLResult function(BLContextImpl* impl, BLFillRule fillRule) setFillRule;
2548     BLResult function(BLContextImpl* impl, double width) setStrokeWidth;
2549     BLResult function(BLContextImpl* impl, double miterLimit) setStrokeMiterLimit;
2550     BLResult function(BLContextImpl* impl, BLStrokeCapPosition position, BLStrokeCap strokeCap) setStrokeCap;
2551     BLResult function(BLContextImpl* impl, BLStrokeCap strokeCap) setStrokeCaps;
2552     BLResult function(BLContextImpl* impl, BLStrokeJoin strokeJoin) setStrokeJoin;
2553     BLResult function(BLContextImpl* impl, double dashOffset) setStrokeDashOffset;
2554     BLResult function(BLContextImpl* impl, const(BLArrayCore)* dashArray) setStrokeDashArray;
2555     BLResult function(BLContextImpl* impl, BLStrokeTransformOrder transformOrder) setStrokeTransformOrder;
2556     BLResult function(BLContextImpl* impl, const(BLStrokeOptionsCore)* options) setStrokeOptions;
2557     BLResult function(BLContextImpl* impl, const(BLRectI)* rect) clipToRectI;
2558     BLResult function(BLContextImpl* impl, const(BLRect)* rect) clipToRectD;
2559     BLResult function(BLContextImpl* impl) restoreClipping;
2560     BLResult function(BLContextImpl* impl) clearAll;
2561     BLResult function(BLContextImpl* impl, const(BLRectI)* rect) clearRectI;
2562     BLResult function(BLContextImpl* impl, const(BLRect)* rect) clearRectD;
2563     BLResult function(BLContextImpl* impl) fillAll;
2564     BLResult function(BLContextImpl* impl, const(BLRectI)* rect) fillRectI;
2565     BLResult function(BLContextImpl* impl, const(BLRect)* rect) fillRectD;
2566     BLResult function(BLContextImpl* impl, const(BLPathCore)* path) fillPathD;
2567     BLResult function(BLContextImpl* impl, BLGeometryType geometryType, const(void)* geometryData) fillGeometry;
2568     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding) fillTextI;
2569     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding) fillTextD;
2570     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun) fillGlyphRunI;
2571     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun) fillGlyphRunD;
2572     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLImageCore)* mask, const(BLRectI)* maskArea) fillMaskI;
2573     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLImageCore)* mask, const(BLRectI)* maskArea) fillMaskD;
2574     BLResult function(BLContextImpl* impl, const(BLRectI)* rect) strokeRectI;
2575     BLResult function(BLContextImpl* impl, const(BLRect)* rect) strokeRectD;
2576     BLResult function(BLContextImpl* impl, const(BLPathCore)* path) strokePathD;
2577     BLResult function(BLContextImpl* impl, BLGeometryType geometryType, const(void)* geometryData) strokeGeometry;
2578     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding) strokeTextI;
2579     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLFontCore)* font, const(void)* text, size_t size, BLTextEncoding encoding) strokeTextD;
2580     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun) strokeGlyphRunI;
2581     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLFontCore)* font, const(BLGlyphRun)* glyphRun) strokeGlyphRunD;
2582     BLResult function(BLContextImpl* impl, const(BLPointI)* pt, const(BLImageCore)* img, const(BLRectI)* imgArea) blitImageI;
2583     BLResult function(BLContextImpl* impl, const(BLPoint)* pt, const(BLImageCore)* img, const(BLRectI)* imgArea) blitImageD;
2584     BLResult function(BLContextImpl* impl, const(BLRectI)* rect, const(BLImageCore)* img, const(BLRectI)* imgArea) blitScaledImageI;
2585     BLResult function(BLContextImpl* impl, const(BLRect)* rect, const(BLImageCore)* img, const(BLRectI)* imgArea) blitScaledImageD;
2586 }
2587 
2588 struct BLContextImpl
2589 {
2590     const(BLContextVirt)* virt;
2591     const(BLContextState)* state;
2592     uint contextType;
2593 }
2594 
2595 struct BLFontManagerCore
2596 {
2597     BLObjectDetail _d;
2598 }
2599 
2600 version(BindBlend2D_Static) BLResult blFontManagerInit(BLFontManagerCore* self);
2601 version(BindBlend2D_Static) BLResult blFontManagerInitMove(BLFontManagerCore* self, BLFontManagerCore* other);
2602 version(BindBlend2D_Static) BLResult blFontManagerInitWeak(BLFontManagerCore* self, const(BLFontManagerCore)* other);
2603 version(BindBlend2D_Static) BLResult blFontManagerInitNew(BLFontManagerCore* self);
2604 version(BindBlend2D_Static) BLResult blFontManagerDestroy(BLFontManagerCore* self);
2605 version(BindBlend2D_Static) BLResult blFontManagerReset(BLFontManagerCore* self);
2606 version(BindBlend2D_Static) BLResult blFontManagerAssignMove(BLFontManagerCore* self, BLFontManagerCore* other);
2607 version(BindBlend2D_Static) BLResult blFontManagerAssignWeak(BLFontManagerCore* self, const(BLFontManagerCore)* other);
2608 version(BindBlend2D_Static) BLResult blFontManagerCreate(BLFontManagerCore* self);
2609 version(BindBlend2D_Static) size_t blFontManagerGetFaceCount(const(BLFontManagerCore)* self);
2610 version(BindBlend2D_Static) size_t blFontManagerGetFamilyCount(const(BLFontManagerCore)* self);
2611 version(BindBlend2D_Static) bool blFontManagerHasFace(const(BLFontManagerCore)* self, const(BLFontFaceCore)* face);
2612 version(BindBlend2D_Static) BLResult blFontManagerAddFace(BLFontManagerCore* self, const(BLFontFaceCore)* face);
2613 version(BindBlend2D_Static) BLResult blFontManagerQueryFace(const(BLFontManagerCore)* self, const(char)* name, size_t nameSize, const(BLFontQueryProperties)* properties, BLFontFaceCore* out_);
2614 version(BindBlend2D_Static) BLResult blFontManagerQueryFacesByFamilyName(const(BLFontManagerCore)* self, const(char)* name, size_t nameSize, BLArrayCore* out_);
2615 version(BindBlend2D_Static) bool blFontManagerEquals(const(BLFontManagerCore)* a, const(BLFontManagerCore)* b);
2616 
2617 struct BLFontManagerVirt
2618 {
2619     BLObjectVirtBase base;
2620 }
2621 
2622 struct BLFontManagerImpl
2623 {
2624     const(BLFontManagerVirt)* virt;
2625 }
2626 
2627 enum BLGradientType
2628 {
2629     BL_GRADIENT_TYPE_LINEAR = 0,
2630     BL_GRADIENT_TYPE_RADIAL = 1,
2631     BL_GRADIENT_TYPE_CONICAL = 2,
2632     BL_GRADIENT_TYPE_MAX_VALUE = 2,
2633     BL_GRADIENT_TYPE_FORCE_UINT = 0xFFFFFFFFu
2634 }
2635 
2636 enum BLGradientValue
2637 {
2638     BL_GRADIENT_VALUE_COMMON_X0 = 0,
2639     BL_GRADIENT_VALUE_COMMON_Y0 = 1,
2640     BL_GRADIENT_VALUE_COMMON_X1 = 2,
2641     BL_GRADIENT_VALUE_COMMON_Y1 = 3,
2642     BL_GRADIENT_VALUE_RADIAL_R0 = 4,
2643     BL_GRADIENT_VALUE_CONICAL_ANGLE = 2,
2644     BL_GRADIENT_VALUE_MAX_VALUE = 5,
2645     BL_GRADIENT_VALUE_FORCE_UINT = 0xFFFFFFFFu
2646 }
2647 
2648 struct BLGradientStop
2649 {
2650     double offset;
2651     BLRgba64 rgba;
2652 }
2653 
2654 struct BLLinearGradientValues
2655 {
2656     double x0;
2657     double y0;
2658     double x1;
2659     double y1;
2660 }
2661 
2662 struct BLRadialGradientValues
2663 {
2664     double x0;
2665     double y0;
2666     double x1;
2667     double y1;
2668     double r0;
2669 }
2670 
2671 struct BLConicalGradientValues
2672 {
2673     double x0;
2674     double y0;
2675     double angle;
2676 }
2677 
2678 struct BLGradientCore
2679 {
2680     BLObjectDetail _d;
2681 }
2682 
2683 version(BindBlend2D_Static) BLResult blGradientInit(BLGradientCore* self);
2684 version(BindBlend2D_Static) BLResult blGradientInitMove(BLGradientCore* self, BLGradientCore* other);
2685 version(BindBlend2D_Static) BLResult blGradientInitWeak(BLGradientCore* self, const(BLGradientCore)* other);
2686 version(BindBlend2D_Static) BLResult blGradientInitAs(BLGradientCore* self, BLGradientType type, const(void)* values, BLExtendMode extendMode, const(BLGradientStop)* stops, size_t n, const(BLMatrix2D)* m);
2687 version(BindBlend2D_Static) BLResult blGradientDestroy(BLGradientCore* self);
2688 version(BindBlend2D_Static) BLResult blGradientReset(BLGradientCore* self);
2689 version(BindBlend2D_Static) BLResult blGradientAssignMove(BLGradientCore* self, BLGradientCore* other);
2690 version(BindBlend2D_Static) BLResult blGradientAssignWeak(BLGradientCore* self, const(BLGradientCore)* other);
2691 version(BindBlend2D_Static) BLResult blGradientCreate(BLGradientCore* self, BLGradientType type, const(void)* values, BLExtendMode extendMode, const(BLGradientStop)* stops, size_t n, const(BLMatrix2D)* m);
2692 version(BindBlend2D_Static) BLResult blGradientShrink(BLGradientCore* self);
2693 version(BindBlend2D_Static) BLResult blGradientReserve(BLGradientCore* self, size_t n);
2694 version(BindBlend2D_Static) BLGradientType blGradientGetType(const(BLGradientCore)* self);
2695 version(BindBlend2D_Static) BLResult blGradientSetType(BLGradientCore* self, BLGradientType type);
2696 version(BindBlend2D_Static) BLExtendMode blGradientGetExtendMode(const(BLGradientCore)* self);
2697 version(BindBlend2D_Static) BLResult blGradientSetExtendMode(BLGradientCore* self, BLExtendMode extendMode);
2698 version(BindBlend2D_Static) double blGradientGetValue(const(BLGradientCore)* self, size_t index);
2699 version(BindBlend2D_Static) BLResult blGradientSetValue(BLGradientCore* self, size_t index, double value);
2700 version(BindBlend2D_Static) BLResult blGradientSetValues(BLGradientCore* self, size_t index, const(double)* values, size_t n);
2701 version(BindBlend2D_Static) size_t blGradientGetSize(const(BLGradientCore)* self);
2702 version(BindBlend2D_Static) size_t blGradientGetCapacity(const(BLGradientCore)* self);
2703 version(BindBlend2D_Static) const(BLGradientStop)* blGradientGetStops(const(BLGradientCore)* self);
2704 version(BindBlend2D_Static) BLResult blGradientResetStops(BLGradientCore* self);
2705 version(BindBlend2D_Static) BLResult blGradientAssignStops(BLGradientCore* self, const(BLGradientStop)* stops, size_t n);
2706 version(BindBlend2D_Static) BLResult blGradientAddStopRgba32(BLGradientCore* self, double offset, uint argb32);
2707 version(BindBlend2D_Static) BLResult blGradientAddStopRgba64(BLGradientCore* self, double offset, ulong argb64);
2708 version(BindBlend2D_Static) BLResult blGradientRemoveStop(BLGradientCore* self, size_t index);
2709 version(BindBlend2D_Static) BLResult blGradientRemoveStopByOffset(BLGradientCore* self, double offset, uint all);
2710 version(BindBlend2D_Static) BLResult blGradientRemoveStopsByIndex(BLGradientCore* self, size_t rStart, size_t rEnd);
2711 version(BindBlend2D_Static) BLResult blGradientRemoveStopsByOffset(BLGradientCore* self, double offsetMin, double offsetMax);
2712 version(BindBlend2D_Static) BLResult blGradientReplaceStopRgba32(BLGradientCore* self, size_t index, double offset, uint rgba32);
2713 version(BindBlend2D_Static) BLResult blGradientReplaceStopRgba64(BLGradientCore* self, size_t index, double offset, ulong rgba64);
2714 version(BindBlend2D_Static) size_t blGradientIndexOfStop(const(BLGradientCore)* self, double offset);
2715 version(BindBlend2D_Static) BLResult blGradientApplyMatrixOp(BLGradientCore* self, BLMatrix2DOp opType, const(void)* opData);
2716 version(BindBlend2D_Static) bool blGradientEquals(const(BLGradientCore)* a, const(BLGradientCore)* b);
2717 
2718 struct BLGradientImpl
2719 {
2720     BLGradientStop* stops;
2721     size_t size;
2722     size_t capacity;
2723     ubyte gradientType;
2724     ubyte extendMode;
2725     ubyte matrixType;
2726     ubyte[1] reserved;
2727     BLMatrix2D matrix;
2728 
2729     union
2730     {
2731         double[6] values;
2732         BLLinearGradientValues linear;
2733         BLRadialGradientValues radial;
2734         BLConicalGradientValues conical;
2735     }
2736 }
2737 
2738 version(BindBlend2D_Static) BLResult blImageDecoderInit(BLImageDecoderCore* self);
2739 version(BindBlend2D_Static) BLResult blImageDecoderInitMove(BLImageDecoderCore* self, BLImageDecoderCore* other);
2740 version(BindBlend2D_Static) BLResult blImageDecoderInitWeak(BLImageDecoderCore* self, const(BLImageDecoderCore)* other);
2741 version(BindBlend2D_Static) BLResult blImageDecoderDestroy(BLImageDecoderCore* self);
2742 version(BindBlend2D_Static) BLResult blImageDecoderReset(BLImageDecoderCore* self);
2743 version(BindBlend2D_Static) BLResult blImageDecoderAssignMove(BLImageDecoderCore* self, BLImageDecoderCore* other);
2744 version(BindBlend2D_Static) BLResult blImageDecoderAssignWeak(BLImageDecoderCore* self, const(BLImageDecoderCore)* other);
2745 version(BindBlend2D_Static) BLResult blImageDecoderRestart(BLImageDecoderCore* self);
2746 version(BindBlend2D_Static) BLResult blImageDecoderReadInfo(BLImageDecoderCore* self, BLImageInfo* infoOut, const(ubyte)* data, size_t size);
2747 version(BindBlend2D_Static) BLResult blImageDecoderReadFrame(BLImageDecoderCore* self, BLImageCore* imageOut, const(ubyte)* data, size_t size);
2748 
2749 struct BLImageDecoderVirt
2750 {
2751     BLObjectVirtBase base;
2752     BLResult function(BLImageDecoderImpl* impl) restart;
2753     BLResult function(BLImageDecoderImpl* impl, BLImageInfo* infoOut, const(ubyte)* data, size_t size) readInfo;
2754     BLResult function(BLImageDecoderImpl* impl, BLImageCore* imageOut, const(ubyte)* data, size_t size) readFrame;
2755 }
2756 
2757 struct BLImageDecoderImpl
2758 {
2759     const(BLImageDecoderVirt)* virt;
2760     BLImageCodecCore codec;
2761     BLResult lastResult;
2762     void* handle;
2763     ulong frameIndex;
2764     size_t bufferIndex;
2765 }
2766 
2767 struct BLImageDecoderCore
2768 {
2769     BLObjectDetail _d;
2770 }
2771 
2772 version(BindBlend2D_Static) BLResult blImageEncoderInit(BLImageEncoderCore* self);
2773 version(BindBlend2D_Static) BLResult blImageEncoderInitMove(BLImageEncoderCore* self, BLImageEncoderCore* other);
2774 version(BindBlend2D_Static) BLResult blImageEncoderInitWeak(BLImageEncoderCore* self, const(BLImageEncoderCore)* other);
2775 version(BindBlend2D_Static) BLResult blImageEncoderDestroy(BLImageEncoderCore* self);
2776 version(BindBlend2D_Static) BLResult blImageEncoderReset(BLImageEncoderCore* self);
2777 version(BindBlend2D_Static) BLResult blImageEncoderAssignMove(BLImageEncoderCore* self, BLImageEncoderCore* other);
2778 version(BindBlend2D_Static) BLResult blImageEncoderAssignWeak(BLImageEncoderCore* self, const(BLImageEncoderCore)* other);
2779 version(BindBlend2D_Static) BLResult blImageEncoderRestart(BLImageEncoderCore* self);
2780 version(BindBlend2D_Static) BLResult blImageEncoderWriteFrame(BLImageEncoderCore* self, BLArrayCore* dst, const(BLImageCore)* image);
2781 
2782 struct BLImageEncoderVirt
2783 {
2784     BLObjectVirtBase base;
2785     BLResult function(BLImageEncoderImpl* impl) restart;
2786     BLResult function(BLImageEncoderImpl* impl, BLArrayCore* dst, const(BLImageCore)* image) writeFrame;
2787 }
2788 
2789 struct BLImageEncoderImpl
2790 {
2791     const(BLImageEncoderVirt)* virt;
2792     BLImageCodecCore codec;
2793     BLResult lastResult;
2794     void* handle;
2795     ulong frameIndex;
2796     size_t bufferIndex;
2797 }
2798 
2799 struct BLImageEncoderCore
2800 {
2801     BLObjectDetail _d;
2802 }
2803 
2804 version(BindBlend2D_Static) BLResult blPatternInit(BLPatternCore* self);
2805 version(BindBlend2D_Static) BLResult blPatternInitMove(BLPatternCore* self, BLPatternCore* other);
2806 version(BindBlend2D_Static) BLResult blPatternInitWeak(BLPatternCore* self, const(BLPatternCore)* other);
2807 version(BindBlend2D_Static) BLResult blPatternInitAs(BLPatternCore* self, const(BLImageCore)* image, const(BLRectI)* area, BLExtendMode extendMode, const(BLMatrix2D)* m);
2808 version(BindBlend2D_Static) BLResult blPatternDestroy(BLPatternCore* self);
2809 version(BindBlend2D_Static) BLResult blPatternReset(BLPatternCore* self);
2810 version(BindBlend2D_Static) BLResult blPatternAssignMove(BLPatternCore* self, BLPatternCore* other);
2811 version(BindBlend2D_Static) BLResult blPatternAssignWeak(BLPatternCore* self, const(BLPatternCore)* other);
2812 version(BindBlend2D_Static) BLResult blPatternAssignDeep(BLPatternCore* self, const(BLPatternCore)* other);
2813 version(BindBlend2D_Static) BLResult blPatternCreate(BLPatternCore* self, const(BLImageCore)* image, const(BLRectI)* area, BLExtendMode extendMode, const(BLMatrix2D)* m);
2814 version(BindBlend2D_Static) BLResult blPatternGetImage(const(BLPatternCore)* self, BLImageCore* image);
2815 version(BindBlend2D_Static) BLResult blPatternSetImage(BLPatternCore* self, const(BLImageCore)* image, const(BLRectI)* area);
2816 version(BindBlend2D_Static) BLResult blPatternResetImage(BLPatternCore* self);
2817 version(BindBlend2D_Static) BLResult blPatternGetArea(const(BLPatternCore)* self, BLRectI* areaOut);
2818 version(BindBlend2D_Static) BLResult blPatternSetArea(BLPatternCore* self, const(BLRectI)* area);
2819 version(BindBlend2D_Static) BLExtendMode blPatternGetExtendMode(const(BLPatternCore)* self);
2820 version(BindBlend2D_Static) BLResult blPatternSetExtendMode(BLPatternCore* self, BLExtendMode extendMode);
2821 version(BindBlend2D_Static) BLMatrix2DType blPatternGetMatrixType(const(BLPatternCore)* self);
2822 version(BindBlend2D_Static) BLResult blPatternGetMatrix(const(BLPatternCore)* self, BLMatrix2D* matrixOut);
2823 version(BindBlend2D_Static) BLResult blPatternApplyMatrixOp(BLPatternCore* self, BLMatrix2DOp opType, const(void)* opData);
2824 version(BindBlend2D_Static) bool blPatternEquals(const(BLPatternCore)* a, const(BLPatternCore)* b);
2825 
2826 struct BLPatternCore
2827 {
2828     BLObjectDetail _d;
2829 }
2830 
2831 struct BLPatternImpl
2832 {
2833     BLImageCore image;
2834     BLRectI area;
2835     BLMatrix2D matrix;
2836 }
2837 
2838 alias BLPixelConverterFunc = uint function(const(BLPixelConverterCore)* self, ubyte* dstData, intptr_t dstStride, const(ubyte)* srcData, intptr_t srcStride, uint w, uint h, const(BLPixelConverterOptions)* options);
2839 
2840 enum BLPixelConverterCreateFlags
2841 {
2842     BL_PIXEL_CONVERTER_CREATE_NO_FLAGS = 0u,
2843     BL_PIXEL_CONVERTER_CREATE_FLAG_DONT_COPY_PALETTE = 0x00000001u,
2844     BL_PIXEL_CONVERTER_CREATE_FLAG_ALTERABLE_PALETTE = 0x00000002u,
2845     BL_PIXEL_CONVERTER_CREATE_FLAG_NO_MULTI_STEP = 0x00000004u,
2846     BL_PIXEL_CONVERTER_CREATE_FLAG_FORCE_UINT = 0xFFFFFFFFu
2847 }
2848 
2849 struct BLPixelConverterOptions
2850 {
2851     BLPointI origin;
2852     size_t gap;
2853 }
2854 
2855 struct BLPixelConverterCore
2856 {
2857     union
2858     {
2859         struct
2860         {
2861             BLPixelConverterFunc convertFunc;
2862             ubyte internalFlags;
2863         }
2864 
2865         ubyte[80] data;
2866     }
2867 }
2868 
2869 version(BindBlend2D_Static) BLResult blPixelConverterInit(BLPixelConverterCore* self);
2870 version(BindBlend2D_Static) BLResult blPixelConverterInitWeak(BLPixelConverterCore* self, const(BLPixelConverterCore)* other);
2871 version(BindBlend2D_Static) BLResult blPixelConverterDestroy(BLPixelConverterCore* self);
2872 version(BindBlend2D_Static) BLResult blPixelConverterReset(BLPixelConverterCore* self);
2873 version(BindBlend2D_Static) BLResult blPixelConverterAssign(BLPixelConverterCore* self, const(BLPixelConverterCore)* other);
2874 version(BindBlend2D_Static) BLResult blPixelConverterCreate(BLPixelConverterCore* self, const(BLFormatInfo)* dstInfo, const(BLFormatInfo)* srcInfo, BLPixelConverterCreateFlags createFlags);
2875 version(BindBlend2D_Static) BLResult blPixelConverterConvert(const(BLPixelConverterCore)* self, void* dstData, intptr_t dstStride, const(void)* srcData, intptr_t srcStride, uint w, uint h, const(BLPixelConverterOptions)* options);
2876 
2877 version(BindBlend2D_Static) BLResult blRandomReset(BLRandom* self, ulong seed);
2878 version(BindBlend2D_Static) uint blRandomNextUInt32(BLRandom* self);
2879 version(BindBlend2D_Static) ulong blRandomNextUInt64(BLRandom* self);
2880 version(BindBlend2D_Static) double blRandomNextDouble(BLRandom* self);
2881 
2882 struct BLRandom
2883 {
2884     ulong[2] data;
2885 }
2886 
2887 enum BLRuntimeLimits
2888 {
2889     BL_RUNTIME_MAX_IMAGE_SIZE = 65535,
2890     BL_RUNTIME_MAX_THREAD_COUNT = 32
2891 }
2892 
2893 enum BLRuntimeInfoType
2894 {
2895     BL_RUNTIME_INFO_TYPE_BUILD = 0,
2896     BL_RUNTIME_INFO_TYPE_SYSTEM = 1,
2897     BL_RUNTIME_INFO_TYPE_RESOURCE = 2,
2898     BL_RUNTIME_INFO_TYPE_MAX_VALUE = 2,
2899     BL_RUNTIME_INFO_TYPE_FORCE_UINT = 0xFFFFFFFFu
2900 }
2901 
2902 enum BLRuntimeBuildType
2903 {
2904     BL_RUNTIME_BUILD_TYPE_DEBUG = 0,
2905     BL_RUNTIME_BUILD_TYPE_RELEASE = 1,
2906     BL_RUNTIME_BUILD_TYPE_FORCE_UINT = 0xFFFFFFFFu
2907 }
2908 
2909 enum BLRuntimeCpuArch
2910 {
2911     BL_RUNTIME_CPU_ARCH_UNKNOWN = 0,
2912     BL_RUNTIME_CPU_ARCH_X86 = 1,
2913     BL_RUNTIME_CPU_ARCH_ARM = 2,
2914     BL_RUNTIME_CPU_ARCH_MIPS = 3,
2915     BL_RUNTIME_CPU_ARCH_FORCE_UINT = 0xFFFFFFFFu
2916 }
2917 
2918 enum BLRuntimeCpuFeatures
2919 {
2920     BL_RUNTIME_CPU_FEATURE_X86_SSE2 = 0x00000001u,
2921     BL_RUNTIME_CPU_FEATURE_X86_SSE3 = 0x00000002u,
2922     BL_RUNTIME_CPU_FEATURE_X86_SSSE3 = 0x00000004u,
2923     BL_RUNTIME_CPU_FEATURE_X86_SSE4_1 = 0x00000008u,
2924     BL_RUNTIME_CPU_FEATURE_X86_SSE4_2 = 0x00000010u,
2925     BL_RUNTIME_CPU_FEATURE_X86_AVX = 0x00000020u,
2926     BL_RUNTIME_CPU_FEATURE_X86_AVX2 = 0x00000040u,
2927     BL_RUNTIME_CPU_FEATURE_FORCE_UINT = 0xFFFFFFFFu
2928 }
2929 
2930 enum BLRuntimeCleanupFlags
2931 {
2932     BL_RUNTIME_CLEANUP_NO_FLAGS = 0u,
2933     BL_RUNTIME_CLEANUP_OBJECT_POOL = 0x00000001u,
2934     BL_RUNTIME_CLEANUP_ZEROED_POOL = 0x00000002u,
2935     BL_RUNTIME_CLEANUP_THREAD_POOL = 0x00000010u,
2936     BL_RUNTIME_CLEANUP_EVERYTHING = 0xFFFFFFFFu,
2937     BL_RUNTIME_CLEANUP_FLAG_FORCE_UINT = 0xFFFFFFFFu
2938 }
2939 
2940 struct BLRuntimeBuildInfo
2941 {
2942     uint majorVersion;
2943     uint minorVersion;
2944     uint patchVersion;
2945     uint buildType;
2946     uint baselineCpuFeatures;
2947     uint supportedCpuFeatures;
2948     uint maxImageSize;
2949     uint maxThreadCount;
2950     uint[2] reserved;
2951     char[32] compilerInfo;
2952 }
2953 
2954 struct BLRuntimeSystemInfo
2955 {
2956     uint cpuArch;
2957     uint cpuFeatures;
2958     uint coreCount;
2959     uint threadCount;
2960     uint threadStackSize;
2961     uint removed;
2962     uint allocationGranularity;
2963     uint[5] reserved;
2964 }
2965 
2966 struct BLRuntimeResourceInfo
2967 {
2968     size_t vmUsed;
2969     size_t vmReserved;
2970     size_t vmOverhead;
2971     size_t vmBlockCount;
2972     size_t zmUsed;
2973     size_t zmReserved;
2974     size_t zmOverhead;
2975     size_t zmBlockCount;
2976     size_t dynamicPipelineCount;
2977     size_t[7] reserved;
2978 }
2979 
2980 version(BindBlend2D_Static) BLResult blRuntimeInit();
2981 version(BindBlend2D_Static) BLResult blRuntimeShutdown();
2982 version(BindBlend2D_Static) BLResult blRuntimeCleanup(BLRuntimeCleanupFlags cleanupFlags);
2983 version(BindBlend2D_Static) BLResult blRuntimeQueryInfo(BLRuntimeInfoType infoType, void* infoOut);
2984 version(BindBlend2D_Static) BLResult blRuntimeMessageOut(const(char)* msg);
2985 version(BindBlend2D_Static) BLResult blRuntimeMessageFmt(const(char)* fmt, ...);
2986 version(BindBlend2D_Static) BLResult blRuntimeMessageVFmt(const(char)* fmt, va_list ap);
2987 //BLResult blResultFromWinError(uint e);
2988 
2989 version(BindBlend2D_Static) version(Windows) BLResult blResultFromWinError(uint e);
2990 version(BindBlend2D_Static) version(Posix) BLResult blResultFromPosixError(int e);