1 module skia.Definitions;
2 
3 import skia.Exceptions;
4 import skia.MathTypes;
5 import skia.SKColor;
6 
7 import std.conv;
8 import std.datetime;
9 import std.typecons;
10 
11 alias DataWriter = void delegate(const(ubyte)[] data);
12 
13 alias NullableFloat = Nullable!float;
14 
15 enum SKCodecOrigin
16 {
17 	TopLeft = 1,
18 	TopRight = 2,
19 	BottomRight = 3,
20 	BottomLeft = 4,
21 	LeftTop = 5,
22 	RightTop = 6,
23 	RightBottom = 7,
24 	LeftBottom = 8,
25 }
26 
27 enum SKEncoding
28 {
29 	Utf8 = 0,
30 	Utf16 = 1,
31 	Utf32 = 2,
32 }
33 
34 enum SKFontStyleWeight
35 {
36 	Invisible = 0,
37 	Thin = 100,
38 	ExtraLight = 200,
39 	Light = 300,
40 	Normal = 400,
41 	Medium = 500,
42 	SemiBold = 600,
43 	Bold = 700,
44 	ExtraBold = 800,
45 	Black = 900,
46 	ExtraBlack = 1000,
47 }
48 
49 enum SKFontStyleWidth
50 {
51 	UltraCondensed = 1,
52 	ExtraCondensed = 2,
53 	Condensed = 3,
54 	SemiCondensed = 4,
55 	Normal = 5,
56 	SemiExpanded = 6,
57 	Expanded = 7,
58 	ExtraExpanded = 8,
59 	UltraExpanded = 9,
60 }
61 
62 enum SKColorType
63 {
64 	Unknown = 0,
65 	Alpha8 = 1,
66 	Rgb565 = 2,
67 	Argb4444 = 3,
68 	Rgba8888 = 4,
69 	Rgb888x = 5,
70 	Bgra8888 = 6,
71 	Rgba1010102 = 7,
72 	Rgb101010x = 8,
73 	Gray8 = 9,
74 	RgbaF16 = 10,
75 	RgbaF16Clamped = 11,
76 	RgbaF32 = 12,
77 	Rg88 = 13,
78 	AlphaF16 = 14,
79 	RgF16 = 15,
80 	Alpha16 = 16,
81 	Rg1616 = 17,
82 	Rgba16161616 = 18,
83 }
84 
85 
86 enum SKColorTypeNative {
87 	// UNKNOWN_SK_COLORTYPE = 0
88 	Unknown = 0,
89 	// ALPHA_8_SK_COLORTYPE = 1
90 	Alpha8 = 1,
91 	// RGB_565_SK_COLORTYPE = 2
92 	Rgb565 = 2,
93 	// ARGB_4444_SK_COLORTYPE = 3
94 	Argb4444 = 3,
95 	// RGBA_8888_SK_COLORTYPE = 4
96 	Rgba8888 = 4,
97 	// RGB_888X_SK_COLORTYPE = 5
98 	Rgb888x = 5,
99 	// BGRA_8888_SK_COLORTYPE = 6
100 	Bgra8888 = 6,
101 	// RGBA_1010102_SK_COLORTYPE = 7
102 	Rgba1010102 = 7,
103 	// RGB_101010X_SK_COLORTYPE = 8
104 	Rgb101010x = 8,
105 	// GRAY_8_SK_COLORTYPE = 9
106 	Gray8 = 9,
107 	// RGBA_F16_NORM_SK_COLORTYPE = 10
108 	RgbaF16Norm = 10,
109 	// RGBA_F16_SK_COLORTYPE = 11
110 	RgbaF16 = 11,
111 	// RGBA_F32_SK_COLORTYPE = 12
112 	RgbaF32 = 12,
113 	// R8G8_UNORM_SK_COLORTYPE = 13
114 	R8g8Unorm = 13,
115 	// A16_FLOAT_SK_COLORTYPE = 14
116 	A16Float = 14,
117 	// R16G16_FLOAT_SK_COLORTYPE = 15
118 	R16g16Float = 15,
119 	// A16_UNORM_SK_COLORTYPE = 16
120 	A16Unorm = 16,
121 	// R16G16_UNORM_SK_COLORTYPE = 17
122 	R16g16Unorm = 17,
123 	// R16G16B16A16_UNORM_SK_COLORTYPE = 18
124 	R16g16b16a16Unorm = 18,
125 }
126 
127 enum SKPixelGeometry {
128 	// UNKNOWN_SK_PIXELGEOMETRY = 0
129 	Unknown = 0,
130 	// RGB_H_SK_PIXELGEOMETRY = 1
131 	RgbHorizontal = 1,
132 	// BGR_H_SK_PIXELGEOMETRY = 2
133 	BgrHorizontal = 2,
134 	// RGB_V_SK_PIXELGEOMETRY = 3
135 	RgbVertical = 3,
136 	// BGR_V_SK_PIXELGEOMETRY = 4
137 	BgrVertical = 4,
138 }
139 
140 bool IsBgr (SKPixelGeometry pg)
141 {
142 	return pg == SKPixelGeometry.BgrHorizontal || pg == SKPixelGeometry.BgrVertical;
143 }
144 
145 bool IsRgb (SKPixelGeometry pg)
146 {
147 	return pg == SKPixelGeometry.RgbHorizontal || pg == SKPixelGeometry.RgbVertical;
148 }
149 
150 bool IsVertical (SKPixelGeometry pg)
151 {
152 	return pg == SKPixelGeometry.BgrVertical || pg == SKPixelGeometry.RgbVertical;
153 }
154 
155 bool IsHorizontal (SKPixelGeometry pg)
156 {
157 	return pg == SKPixelGeometry.BgrHorizontal || pg == SKPixelGeometry.RgbHorizontal;
158 }
159 
160 
161 enum SKTextEncoding {
162 	// UTF8_SK_TEXT_ENCODING = 0
163 	Utf8 = 0,
164 	// UTF16_SK_TEXT_ENCODING = 1
165 	Utf16 = 1,
166 	// UTF32_SK_TEXT_ENCODING = 2
167 	Utf32 = 2,
168 	// GLYPH_ID_SK_TEXT_ENCODING = 3
169 	GlyphId = 3,
170 }
171 
172 SKTextEncoding ToTextEncoding (SKEncoding encoding)
173 {
174 	switch(encoding)
175 	{
176 		case SKEncoding.Utf8: return SKTextEncoding.Utf8;
177 		case SKEncoding.Utf16: return SKTextEncoding.Utf16;
178 		case SKEncoding.Utf32: return SKTextEncoding.Utf32;
179 		default:
180 			throw new ArgumentOutOfRangeException (to!string (encoding));
181 	}
182 }
183 
184 SKEncoding ToEncoding (SKTextEncoding encoding)
185 {
186 	switch(encoding)
187 	{
188 		case SKTextEncoding.Utf8: return SKEncoding.Utf8;
189 		case SKTextEncoding.Utf16: return SKEncoding.Utf16;
190 		case SKTextEncoding.Utf32: return SKEncoding.Utf32;
191 		default:
192 			throw new ArgumentOutOfRangeException (to!string (encoding));
193 	}
194 }
195 
196 // SkImageInfo.cpp - SkColorTypeBytesPerPixel
197 int GetBytesPerPixel (SKColorType colorType)
198 {
199 	switch(colorType)
200 	{
201 		// 0
202 		case SKColorType.Unknown : return 0;
203 		// 1
204 		case SKColorType.Alpha8 : return 1;
205 		case SKColorType.Gray8 : return 1;
206 		// 2
207 		case SKColorType.Rgb565 : return 2;
208 		case SKColorType.Argb4444 : return 2;
209 		case SKColorType.Rg88 : return 2;
210 		case SKColorType.Alpha16 : return 2;
211 		case SKColorType.AlphaF16 : return 2;
212 		// 4
213 		case SKColorType.Bgra8888 : return 4;
214 		case SKColorType.Rgba8888 : return 4;
215 		case SKColorType.Rgb888x : return 4;
216 		case SKColorType.Rgba1010102 : return 4;
217 		case SKColorType.Rgb101010x : return 4;
218 		case SKColorType.Rg1616 : return 4;
219 		case SKColorType.RgF16 : return 4;
220 		// 8
221 		case SKColorType.RgbaF16Clamped : return 8;
222 		case SKColorType.RgbaF16 : return 8;
223 		case SKColorType.Rgba16161616 : return 8;
224 		// 16
225 		case SKColorType.RgbaF32 : return 16;
226 		//
227 		default:
228 			throw new ArgumentOutOfRangeException (to!string (colorType));
229 	}
230 }
231 
232 
233 enum SKAlphaType {
234 	// UNKNOWN_SK_ALPHATYPE = 0
235 	Unknown = 0,
236 	// OPAQUE_SK_ALPHATYPE = 1
237 	Opaque = 1,
238 	// PREMUL_SK_ALPHATYPE = 2
239 	Premul = 2,
240 	// UNPREMUL_SK_ALPHATYPE = 3
241 	Unpremul = 3,
242 }
243 
244 /**
245  * 
246  */
247 // SkImageInfo.cpp - SkColorTypeValidateAlphaType
248 static SKAlphaType GetAlphaType (SKColorType colorType, SKAlphaType alphaType = SKAlphaType.Premul)
249 {
250 	switch (colorType) {
251 		case SKColorType.Unknown:
252 			alphaType = SKAlphaType.Unknown;
253 			break;
254 
255 		// opaque or premul
256 		case SKColorType.Alpha8:
257 		case SKColorType.Alpha16:
258 		case SKColorType.AlphaF16:
259 			if (SKAlphaType.Unpremul == alphaType) {
260 				alphaType = SKAlphaType.Premul;
261 			}
262 			break;
263 
264 		// any
265 		case SKColorType.Argb4444:
266 		case SKColorType.Rgba8888:
267 		case SKColorType.Bgra8888:
268 		case SKColorType.Rgba1010102:
269 		case SKColorType.RgbaF16Clamped:
270 		case SKColorType.RgbaF16:
271 		case SKColorType.RgbaF32:
272 		case SKColorType.Rgba16161616:
273 			break;
274 
275 		// opaque
276 		case SKColorType.Gray8:
277 		case SKColorType.Rg88:
278 		case SKColorType.Rg1616:
279 		case SKColorType.RgF16:
280 		case SKColorType.Rgb565:
281 		case SKColorType.Rgb888x:
282 		case SKColorType.Rgb101010x:
283 			alphaType = SKAlphaType.Opaque;
284 			break;
285 
286 		default:
287 			throw new ArgumentOutOfRangeException (to!string (colorType));
288 	}
289 
290 	return alphaType;
291 }
292 
293 
294 enum SKSurfacePropsFlags {
295 	// NONE_SK_SURFACE_PROPS_FLAGS = 0
296 	None = 0,
297 	// USE_DEVICE_INDEPENDENT_FONTS_SK_SURFACE_PROPS_FLAGS = 1 << 0
298 	UseDeviceIndependentFonts = 1,
299 }
300 
301 
302 /**
303  * 
304  */
305 struct SKSurfaceProps // : IEquatable<SKSurfaceProps>
306 {
307 	SKPixelGeometry PixelGeometry; // { readonly get; set; }
308 	SKSurfacePropsFlags Flags; // { readonly get; set; }
309 
310 	// const bool Equals (SKSurfaceProps obj) =>
311 	// 	PixelGeometry == obj.PixelGeometry &&
312 	// 	Flags == obj.Flags;
313 
314 	// const override bool Equals (object obj) =>
315 	// 	obj is SKSurfaceProps f && Equals (f);
316 
317 	// static bool operator == (SKSurfaceProps left, SKSurfaceProps right) =>
318 	// 	left.Equals (right);
319 
320 	// static bool operator != (SKSurfaceProps left, SKSurfaceProps right) =>
321 	// 	!left.Equals (right);
322 
323 	// const override int GetHashCode ()
324 	// {
325 	// 	var hash = new HashCode ();
326 	// 	hash.Add (PixelGeometry);
327 	// 	hash.Add (Flags);
328 	// 	return hash.ToHashCode ();
329 	// }
330 }
331 
332 
333 enum SKZeroInitialized {
334 	// YES_SK_CODEC_ZERO_INITIALIZED = 0
335 	Yes = 0,
336 	// NO_SK_CODEC_ZERO_INITIALIZED = 1
337 	No = 1,
338 }
339 
340 
341 enum SKTransferFunctionBehavior
342 {
343 	Ignore = 1,
344 	Respect = 0,
345 }
346 
347 
348 struct SKCodecOptions // : IEquatable<SKCodecOptions>
349 {
350 	enum SKCodecOptions Default = SKCodecOptions (SKZeroInitialized.No);
351 
352 
353 	this (SKZeroInitialized zeroInitialized)
354 	{
355 		ZeroInitialized = zeroInitialized;
356 		// Subset = null;
357 		FrameIndex = 0;
358 		PriorFrame = -1;
359 	}
360 	this (SKZeroInitialized zeroInitialized, SKRectI subset)
361 	{
362 		ZeroInitialized = zeroInitialized;
363 		Subset = subset;
364 		FrameIndex = 0;
365 		PriorFrame = -1;
366 	}
367 	this (SKRectI subset)
368 	{
369 		ZeroInitialized = SKZeroInitialized.No;
370 		Subset = subset;
371 		FrameIndex = 0;
372 		PriorFrame = -1;
373 	}
374 	this (int frameIndex)
375 	{
376 		ZeroInitialized = SKZeroInitialized.No;
377 		Subset = Nullable!(SKRectI).init;
378 		FrameIndex = frameIndex;
379 		PriorFrame = -1;
380 	}
381 	this (int frameIndex, int priorFrame)
382 	{
383 		ZeroInitialized = SKZeroInitialized.No;
384 		// Subset = null;
385 		FrameIndex = frameIndex;
386 		PriorFrame = priorFrame;
387 	}
388 
389 	SKZeroInitialized ZeroInitialized; // { readonly get; set; }
390 	Nullable!SKRectI Subset; // { readonly get; set; }
391 	bool HasSubset() { return !Subset.isNull; }
392 	int FrameIndex; //{ readonly get; set; }
393 	int PriorFrame; // { readonly get; set; }
394 
395 	SKTransferFunctionBehavior PremulBehavior() {
396 		return SKTransferFunctionBehavior.Respect;
397 	}
398 
399 	// const bool Equals (SKCodecOptions obj) =>
400 	// 	ZeroInitialized == obj.ZeroInitialized &&
401 	// 	Subset == obj.Subset &&
402 	// 	FrameIndex == obj.FrameIndex &&
403 	// 	PriorFrame == obj.PriorFrame;
404 
405 	// const override bool Equals (object obj) =>
406 	// 	obj is SKCodecOptions f && Equals (f);
407 
408 	// static bool operator == (SKCodecOptions left, SKCodecOptions right) =>
409 	// 	left.Equals (right);
410 
411 	// static bool operator != (SKCodecOptions left, SKCodecOptions right) =>
412 	// 	!left.Equals (right);
413 
414 	// const override int GetHashCode ()
415 	// {
416 	// 	var hash = new HashCode ();
417 	// 	hash.Add (ZeroInitialized);
418 	// 	hash.Add (Subset);
419 	// 	hash.Add (FrameIndex);
420 	// 	hash.Add (PriorFrame);
421 	// 	return hash.ToHashCode ();
422 	// }
423 }
424 
425 /**
426  * 
427  */
428 // struct SKFontMetrics
429 // {
430 // 	private enum uint flagsUnderlineThicknessIsValid = (1U << 0);
431 // 	private enum uint flagsUnderlinePositionIsValid = (1U << 1);
432 // 	private enum uint flagsStrikeoutThicknessIsValid = (1U << 2);
433 // 	private enum uint flagsStrikeoutPositionIsValid = (1U << 3);
434 
435 // 	float Top() { return fTop; }
436 
437 // 	float Ascent() { return fAscent; }
438 
439 // 	float Descent() { return fDescent; }
440 
441 // 	float Bottom() { return fBottom; }
442 
443 // 	float Leading() { return fLeading; }
444 
445 // 	float AverageCharacterWidth() { return fAvgCharWidth; }
446 
447 // 	float MaxCharacterWidth() { return fMaxCharWidth; }
448 
449 // 	float XMin() { return fXMin; }
450 
451 // 	float XMax() { return fXMax; }
452 
453 // 	float XHeight() { return fXHeight; }
454 
455 // 	float CapHeight() { return fCapHeight; }
456 
457 // 	Nullable!float UnderlineThickness() { return GetIfValid (fUnderlineThickness, flagsUnderlineThicknessIsValid); }
458 // 	Nullable!float UnderlinePosition() { return GetIfValid (fUnderlinePosition, flagsUnderlinePositionIsValid); }
459 // 	Nullable!float StrikeoutThickness() { return GetIfValid (fStrikeoutThickness, flagsStrikeoutThicknessIsValid); }
460 // 	Nullable!float StrikeoutPosition() { return GetIfValid (fStrikeoutPosition, flagsStrikeoutPositionIsValid); }
461 
462 // 	private Nullable!float GetIfValid (float value, uint flag) 
463 // 	{
464 // 		return (fFlags & flag) == flag ? value : NullableFloat.init;
465 // 	}
466 // }
467 
468 /**
469  * 
470  */
471 struct SKLattice // : IEquatable<SKLattice>
472 {
473 	int[] XDivs; //  { readonly get; set; }
474 	int[] YDivs; //  { readonly get; set; }
475 	SKLatticeRectType[] RectTypes; //  { readonly get; set; }
476 	Nullable!SKRectI  Bounds; //  { readonly get; set; }
477 	SKColor[] Colors; //  { readonly get; set; }
478 
479 	// bool Equals (SKLattice obj) 
480 	// {
481 	// 	return
482 	// 	XDivs == obj.XDivs &&
483 	// 	YDivs == obj.YDivs &&
484 	// 	RectTypes == obj.RectTypes &&
485 	// 	Bounds == obj.Bounds &&
486 	// 	Colors == obj.Colors;
487 	// }
488 
489 	// override bool Equals (object obj) =>
490 	// 	obj is SKLattice f && Equals (f);
491 
492 	// static bool operator == (SKLattice left, SKLattice right) =>
493 	// 	left.Equals (right);
494 
495 	// static bool operator != (SKLattice left, SKLattice right) =>
496 	// 	!left.Equals (right);
497 
498 	// override int GetHashCode ()
499 	// {
500 	// 	var hash = new HashCode ();
501 	// 	hash.Add (XDivs);
502 	// 	hash.Add (YDivs);
503 	// 	hash.Add (RectTypes);
504 	// 	hash.Add (Bounds);
505 	// 	hash.Add (Colors);
506 	// 	return hash.ToHashCode ();
507 	// }
508 }
509 
510 
511 /**
512  * 
513  */
514 struct SKDocumentPdfMetadata // : IEquatable<SKDocumentPdfMetadata>
515 {
516 	enum float DefaultRasterDpi = 72.0f;
517 	enum int DefaultEncodingQuality = 101;
518 
519 	enum SKDocumentPdfMetadata Default = SKDocumentPdfMetadata (DefaultRasterDpi, false, DefaultEncodingQuality);
520 
521 	private this(float rasterDpi, bool pdfA, int encodingQuality)
522 	{
523 		RasterDpi = rasterDpi;
524 		PdfA = pdfA;
525 		EncodingQuality = encodingQuality;
526 	}
527 
528 	this(float rasterDpi)
529 	{
530 		Title = null;
531 		Author = null;
532 		Subject = null;
533 		Keywords = null;
534 		Creator = null;
535 		Producer = null;
536 		// Creation = null;
537 		// Modified = null;
538 		RasterDpi = rasterDpi;
539 		PdfA = false;
540 		EncodingQuality = DefaultEncodingQuality;
541 	}
542 
543 	this(int encodingQuality)
544 	{
545 		Title = null;
546 		Author = null;
547 		Subject = null;
548 		Keywords = null;
549 		Creator = null;
550 		Producer = null;
551 		// Creation = null;
552 		// Modified = null;
553 		RasterDpi = DefaultRasterDpi;
554 		PdfA = false;
555 		EncodingQuality = encodingQuality;
556 	}
557 
558 	this(float rasterDpi, int encodingQuality)
559 	{
560 		Title = null;
561 		Author = null;
562 		Subject = null;
563 		Keywords = null;
564 		Creator = null;
565 		Producer = null;
566 		// Creation = null;
567 		// Modified = null;
568 		RasterDpi = rasterDpi;
569 		PdfA = false;
570 		EncodingQuality = encodingQuality;
571 	}
572 
573 	string Title; //  { readonly get; set; }
574 	string Author; //  { readonly get; set; }
575 	string Subject; //  { readonly get; set; }
576 	string Keywords; //  { readonly get; set; }
577 	string Creator; //  { readonly get; set; }
578 	string Producer; //  { readonly get; set; }
579 	Nullable!SysTime Creation; //  { readonly get; set; }
580 	Nullable!SysTime Modified; //  { readonly get; set; }
581 	float RasterDpi; //  { readonly get; set; }
582 	bool PdfA; //  { readonly get; set; }
583 	int EncodingQuality; //  { readonly get; set; }
584 
585 	// const bool Equals (SKDocumentPdfMetadata obj) =>
586 	// 	Title == obj.Title &&
587 	// 	Author == obj.Author &&
588 	// 	Subject == obj.Subject &&
589 	// 	Keywords == obj.Keywords &&
590 	// 	Creator == obj.Creator &&
591 	// 	Producer == obj.Producer &&
592 	// 	Creation == obj.Creation &&
593 	// 	Modified == obj.Modified &&
594 	// 	RasterDpi == obj.RasterDpi &&
595 	// 	PdfA == obj.PdfA &&
596 	// 	EncodingQuality == obj.EncodingQuality;
597 
598 	// const override bool Equals (object obj) =>
599 	// 	obj is SKDocumentPdfMetadata f && Equals (f);
600 
601 	// static bool operator == (SKDocumentPdfMetadata left, SKDocumentPdfMetadata right) =>
602 	// 	left.Equals (right);
603 
604 	// static bool operator != (SKDocumentPdfMetadata left, SKDocumentPdfMetadata right) =>
605 	// 	!left.Equals (right);
606 
607 	// const override int GetHashCode ()
608 	// {
609 	// 	var hash = new HashCode ();
610 	// 	hash.Add (Title);
611 	// 	hash.Add (Author);
612 	// 	hash.Add (Subject);
613 	// 	hash.Add (Keywords);
614 	// 	hash.Add (Creator);
615 	// 	hash.Add (Producer);
616 	// 	hash.Add (Creation);
617 	// 	hash.Add (Modified);
618 	// 	hash.Add (RasterDpi);
619 	// 	hash.Add (PdfA);
620 	// 	hash.Add (EncodingQuality);
621 	// 	return hash.ToHashCode ();
622 	// }
623 }
624 
625 enum SKColorSpaceFlags
626 {
627 	None = 0,
628 	NonLinearBlending = 0x1,
629 }
630 
631 
632 enum SKLatticeRectType {
633 	// DEFAULT_SK_LATTICE_RECT_TYPE = 0
634 	Default = 0,
635 	// TRANSPARENT_SK_LATTICE_RECT_TYPE = 1
636 	Transparent = 1,
637 	// FIXED_COLOR_SK_LATTICE_RECT_TYPE = 2
638 	FixedColor = 2,
639 }
640 
641 
642 enum SKPath1DPathEffectStyle {
643 	// TRANSLATE_SK_PATH_EFFECT_1D_STYLE = 0
644 	Translate = 0,
645 	// ROTATE_SK_PATH_EFFECT_1D_STYLE = 1
646 	Rotate = 1,
647 	// MORPH_SK_PATH_EFFECT_1D_STYLE = 2
648 	Morph = 2,
649 }
650 
651 enum SKTrimPathEffectMode {
652 	// NORMAL_SK_PATH_EFFECT_TRIM_MODE = 0
653 	Normal = 0,
654 	// INVERTED_SK_PATH_EFFECT_TRIM_MODE = 1
655 	Inverted = 1,
656 }
657 
658 /**
659  * 
660  */
661 struct SKImageInfoNative {
662 	// sk_colorspace_t* colorspace
663 	void* colorspace;
664 
665 	// int32_t width
666 	int width;
667 
668 	// int32_t height
669 	int height;
670 
671 	// sk_colortype_t colorType
672 	SKColorTypeNative colorType;
673 
674 	// sk_alphatype_t alphaType
675 	SKAlphaType alphaType;
676 
677 	// const bool Equals (SKImageInfoNative obj) {
678 	// 	return colorspace == obj.colorspace && width == obj.width && height == obj.height && colorType == obj.colorType && alphaType == obj.alphaType
679 	// }
680 
681 	// const override bool Equals (object obj) {
682 	// 	return obj is SKImageInfoNative f && Equals (f)
683 	// }
684 
685 	// static bool operator == (SKImageInfoNative left, SKImageInfoNative right) {
686 	// 	return left.Equals (right)
687 	// }
688 
689 	// static bool operator != (SKImageInfoNative left, SKImageInfoNative right) {
690 	// 	return !left.Equals (right)
691 	// }
692 
693 	// const override int GetHashCode ()
694 	// {
695 	// 	var hash = new HashCode ();
696 	// 	hash.Add (colorspace);
697 	// 	hash.Add (width);
698 	// 	hash.Add (height);
699 	// 	hash.Add (colorType);
700 	// 	hash.Add (alphaType);
701 	// 	return hash.ToHashCode ();
702 	// }
703 
704 
705   	// static void UpdateNative (ref SKImageInfo managed, ref SKImageInfoNative native)
706 	// {
707 	// 	SKColorSpace colorSpace = managed.ColorSpace;
708 	// 	if(colorSpace !is null && colorSpace.Handle() !is null) {
709 	// 		native.colorspace = cast(sk_colorspace_t*)colorSpace.Handle();
710 	// 	} else {
711 	// 		native.colorspace = null;
712 	// 	}
713 
714 	// 	// native.colorspace = managed.ColorSpace?.Handle ?? null;
715 	// 	native.width = managed.Width;
716 	// 	native.height = managed.Height;
717 	// 	native.colorType = managed.ColorType.ToNative ();
718 	// 	native.alphaType = managed.AlphaType;
719 	// }
720 
721 	// static SKImageInfoNative FromManaged (ref SKImageInfo managed)
722 	// {
723 	// 	SKImageInfoNative imageInfo;
724 
725 	// 	SKColorSpace colorSpace = managed.ColorSpace;
726 	// 	if(colorSpace !is null && colorSpace.Handle() !is null) {
727 	// 		imageInfo.colorspace = cast(sk_colorspace_t*)colorSpace.Handle();
728 	// 	} else {
729 	// 		imageInfo.colorspace = null;
730 	// 	}
731 	// 	imageInfo.width = managed.Width;
732 	// 	imageInfo.height = managed.Height;
733 	// 	imageInfo.colorType = managed.ColorType.ToNative ();
734 	// 	imageInfo.alphaType = managed.AlphaType;
735 
736 	// 	return imageInfo;
737 	// }
738 
739 	// static SKImageInfo ToManaged (ref SKImageInfoNative native)
740 	// {
741 	// 	SKImageInfo imageInfo;
742 
743 	// 	imageInfo.ColorSpace = SKColorSpace.GetObject (native.colorspace);
744 	// 	imageInfo.Width = native.width;
745 	// 	imageInfo.Height = native.height;
746 	// 	imageInfo.ColorType = native.colorType.FromNative ();
747 	// 	imageInfo.AlphaType = native.alphaType;
748 
749 	// 	return imageInfo;
750 	// }
751 
752 }