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 }