1 module skia.GRDefinitions; 2 3 import skia.Definitions; 4 import skia.EnumMappings; 5 import skia.Exceptions; 6 import skia.MathTypes; 7 import skia.SkiaApi; 8 9 alias GRBackendObject = void*; 10 11 // struct GRBackendRenderTargetDesc : IEquatable<GRBackendRenderTargetDesc> 12 struct GRBackendRenderTargetDesc { 13 // int Width { get; set; } 14 // int Height { get; set; } 15 // GRPixelConfig Config { get; set; } 16 // GRSurfaceOrigin Origin { get; set; } 17 // int SampleCount { get; set; } 18 // int StencilBits { get; set; } 19 // GRBackendObject RenderTargetHandle { get; set; } 20 int Width; 21 int Height; 22 GRPixelConfig Config; 23 GRSurfaceOrigin Origin; 24 int SampleCount; 25 int StencilBits; 26 GRBackendObject RenderTargetHandle; 27 28 const SKSizeI Size() { 29 return SKSizeI(Width, Height); 30 } 31 32 const SKRectI Rect() { 33 return SKRectI(0, 0, Width, Height); 34 } 35 36 // const bool Equals(GRBackendRenderTargetDesc obj) { 37 // return Width == obj.Width && Height == obj.Height && Config == obj.Config 38 // && Origin == obj.Origin && SampleCount == obj.SampleCount 39 // && StencilBits == obj.StencilBits && RenderTargetHandle == obj.RenderTargetHandle; 40 // } 41 42 // const override bool Equals (object obj) 43 // { 44 // return obj is GRBackendRenderTargetDesc f && Equals (f); 45 // } 46 47 // static bool operator == (GRBackendRenderTargetDesc left, GRBackendRenderTargetDesc right) 48 // { 49 // return left.Equals (right); 50 // } 51 52 // static bool operator != (GRBackendRenderTargetDesc left, GRBackendRenderTargetDesc right) 53 // { 54 // return !left.Equals (right); 55 // } 56 57 // const override int GetHashCode () 58 // { 59 // auto hash = new HashCode (); 60 // hash.Add (Width); 61 // hash.Add (Height); 62 // hash.Add (Config); 63 // hash.Add (Origin); 64 // hash.Add (SampleCount); 65 // hash.Add (StencilBits); 66 // hash.Add (RenderTargetHandle); 67 // return hash.ToHashCode (); 68 // } 69 } 70 71 enum GRGlBackendState : uint { 72 None = 0, 73 RenderTarget = 1 << 0, 74 TextureBinding = 1 << 1, 75 View = 1 << 2, // scissor and viewport 76 Blend = 1 << 3, 77 MSAAEnable = 1 << 4, 78 Vertex = 1 << 5, 79 Stencil = 1 << 6, 80 PixelStore = 1 << 7, 81 Program = 1 << 8, 82 FixedFunction = 1 << 9, 83 Misc = 1 << 10, 84 PathRendering = 1 << 11, 85 All = 0xffff 86 } 87 88 enum GRBackendState : uint { 89 None = 0, 90 All = 0xffffffff, 91 } 92 93 struct GRGlFramebufferInfo { 94 // unsigned int fFBOID 95 private uint fFBOID; 96 uint FramebufferObjectId() { 97 return fFBOID; 98 } 99 100 void FramebufferObjectId(uint value) { 101 fFBOID = value; 102 } 103 104 // unsigned int fFormat 105 private uint fFormat; 106 uint Format() { 107 return fFormat; 108 } 109 110 void Format(uint value) { 111 fFormat = value; 112 } 113 114 // override bool opEquals(Object obj) { 115 // GRGlFramebufferInfo pp = cast(GRGlFramebufferInfo) obj; 116 // if (pp is null) 117 // return false; 118 // return fFBOID == obj.fFBOID && fFormat == obj.fFormat; 119 // } 120 121 // override size_t toHash() @trusted nothrow { 122 // return hashOf(fFBOID) + hashOf(fFormat); 123 // } 124 125 this(uint fboId) { 126 fFBOID = fboId; 127 fFormat = 0; 128 } 129 130 this(uint fboId, uint format) { 131 fFBOID = fboId; 132 fFormat = format; 133 } 134 } 135 136 struct GRGlTextureInfo { 137 // unsigned int fTarget 138 private uint fTarget; 139 uint Target() { 140 return fTarget; 141 } 142 143 void Target(uint value) { 144 fTarget = value; 145 } 146 147 // unsigned int fID 148 private uint fID; 149 uint Id() { 150 return fID; 151 } 152 153 void Id(uint value) { 154 fID = value; 155 } 156 157 // unsigned int fFormat 158 private uint fFormat; 159 uint Format() { 160 return fFormat; 161 } 162 163 void Format(uint value) { 164 fFormat = value; 165 } 166 167 // override bool opEquals(Object obj) { 168 // GRGlTextureInfo pp = cast(GRGlTextureInfo) obj; 169 // if (pp is null) 170 // return false; 171 // return fTarget == obj.fTarget && fID == obj.fID && fFormat == obj.fFormat; 172 // } 173 174 // override size_t toHash() @trusted nothrow { 175 // return hashOf(fTarget) + hashOf(fID) + hashOf(fFormat); 176 // } 177 178 this(uint target, uint id) { 179 fTarget = target; 180 fID = id; 181 fFormat = 0; 182 } 183 184 this(uint target, uint id, uint format) { 185 fTarget = target; 186 fID = id; 187 fFormat = format; 188 } 189 } 190 191 enum GRBackendTextureDescFlags { 192 None = 0, 193 RenderTarget = 1, 194 } 195 196 struct GRBackendTextureDesc // : IEquatable<GRBackendTextureDesc> 197 { 198 GRBackendTextureDescFlags Flags; // { get; set; } 199 GRSurfaceOrigin Origin; // { get; set; } 200 int Width; // { get; set; } 201 int Height; // { get; set; } 202 GRPixelConfig Config; // { get; set; } 203 int SampleCount; //{ get; set; } 204 GRBackendObject TextureHandle; // { get; set; } 205 206 const SKSizeI Size() { 207 return SKSizeI(Width, Height); 208 } 209 210 const SKRectI Rect() { 211 return SKRectI(0, 0, Width, Height); 212 } 213 214 // const bool Equals (GRBackendTextureDesc obj) => 215 // Flags == obj.Flags && 216 // Origin == obj.Origin && 217 // Width == obj.Width && 218 // Height == obj.Height && 219 // Config == obj.Config && 220 // SampleCount == obj.SampleCount && 221 // TextureHandle == obj.TextureHandle; 222 223 // const override bool Equals (object obj) => 224 // obj is GRBackendTextureDesc f && Equals (f); 225 226 // static bool operator == (GRBackendTextureDesc left, GRBackendTextureDesc right) => 227 // left.Equals (right); 228 229 // static bool operator != (GRBackendTextureDesc left, GRBackendTextureDesc right) => 230 // !left.Equals (right); 231 232 // const override int GetHashCode () 233 // { 234 // auto hash == new HashCode (); 235 // hash.Add (Flags); 236 // hash.Add (Origin); 237 // hash.Add (Width); 238 // hash.Add (Height); 239 // hash.Add (Config); 240 // hash.Add (SampleCount); 241 // hash.Add (TextureHandle); 242 // return hash.ToHashCode (); 243 // } 244 } 245 246 247 // struct GRGlBackendTextureDesc : IEquatable<GRGlBackendTextureDesc> 248 struct GRGlBackendTextureDesc { 249 // GRBackendTextureDescFlags Flags { get; set; } 250 // GRSurfaceOrigin Origin { get; set; } 251 // int Width { get; set; } 252 // int Height { get; set; } 253 // GRPixelConfig Config { get; set; } 254 // int SampleCount { get; set; } 255 // GRGlTextureInfo TextureHandle { get; set; } 256 GRBackendTextureDescFlags Flags; //{ get; set; } 257 GRSurfaceOrigin Origin; //{ get; set; } 258 int Width; // { get; set; } 259 int Height; // { get; set; } 260 GRPixelConfig Config; // { get; set; } 261 int SampleCount; // { get; set; } 262 GRGlTextureInfo TextureHandle; //{ get; set; } 263 264 const SKSizeI Size() { 265 return SKSizeI(Width, Height); 266 } 267 268 const SKRectI Rect() { 269 return SKRectI(0, 0, Width, Height); 270 } 271 272 const bool Equals(GRGlBackendTextureDesc obj) { 273 return Flags == obj.Flags && Origin == obj.Origin && Width == obj.Width 274 && Height == obj.Height && Config == obj.Config 275 && SampleCount == obj.SampleCount && TextureHandle == obj.TextureHandle; 276 } 277 278 // const override bool Equals (object obj) 279 // { 280 // return obj is GRGlBackendTextureDesc f && Equals (f); 281 // } 282 283 // static bool operator == (GRGlBackendTextureDesc left, GRGlBackendTextureDesc right) 284 // { 285 // return left.Equals (right); 286 // } 287 288 // static bool operator != (GRGlBackendTextureDesc left, GRGlBackendTextureDesc right) 289 // { 290 // return !left.Equals (right); 291 // } 292 293 // const override int GetHashCode() { 294 // auto hash = new HashCode(); 295 // hash.Add(Flags); 296 // hash.Add(Origin); 297 // hash.Add(Width); 298 // hash.Add(Height); 299 // hash.Add(Config); 300 // hash.Add(SampleCount); 301 // hash.Add(TextureHandle); 302 // return hash.ToHashCode(); 303 // } 304 } 305 306 307 308 alias ToGlSizedFormat = SkiaExtensions.ToGlSizedFormat; 309 alias ToColorType = SkiaExtensions.ToColorType; 310 311 class SkiaExtensions { 312 // static uint ToGlSizedFormat (this SKColorType colorType) 313 static uint ToGlSizedFormat(SKColorType colorType) { 314 switch (colorType) { 315 case SKColorType.Unknown: 316 return 0; 317 case SKColorType.Alpha8: 318 return GRGlSizedFormat.ALPHA8; 319 case SKColorType.Gray8: 320 return GRGlSizedFormat.LUMINANCE8; 321 case SKColorType.Rgb565: 322 return GRGlSizedFormat.RGB565; 323 case SKColorType.Argb4444: 324 return GRGlSizedFormat.RGBA4; 325 case SKColorType.Rgba8888: 326 return GRGlSizedFormat.RGBA8; 327 case SKColorType.Rgb888x: 328 return GRGlSizedFormat.RGB8; 329 case SKColorType.Bgra8888: 330 return GRGlSizedFormat.BGRA8; 331 case SKColorType.Rgba1010102: 332 return GRGlSizedFormat.RGB10_A2; 333 case SKColorType.AlphaF16: 334 return GRGlSizedFormat.R16F; 335 case SKColorType.RgbaF16: 336 return GRGlSizedFormat.RGBA16F; 337 case SKColorType.RgbaF16Clamped: 338 return GRGlSizedFormat.RGBA16F; 339 case SKColorType.Alpha16: 340 return GRGlSizedFormat.R16; 341 case SKColorType.Rg1616: 342 return GRGlSizedFormat.RG16; 343 case SKColorType.Rgba16161616: 344 return GRGlSizedFormat.RGBA16; 345 case SKColorType.RgF16: 346 return GRGlSizedFormat.RG16F; 347 case SKColorType.Rg88: 348 return GRGlSizedFormat.RG8; 349 case SKColorType.Rgb101010x: 350 return 0; 351 case SKColorType.RgbaF32: 352 return 0; 353 default: 354 throw new ArgumentOutOfRangeException(colorType.stringof); 355 } 356 } 357 358 // static uint ToGlSizedFormat (this GRPixelConfig config) 359 static uint ToGlSizedFormat(GRPixelConfig config) { 360 switch (config) { 361 case GRPixelConfig.Unknown: 362 return 0; 363 case GRPixelConfig.Alpha8: 364 return GRGlSizedFormat.ALPHA8; 365 case GRPixelConfig.Alpha8AsAlpha: 366 return GRGlSizedFormat.ALPHA8; 367 case GRPixelConfig.Alpha8AsRed: 368 return GRGlSizedFormat.ALPHA8; 369 case GRPixelConfig.Gray8: 370 return GRGlSizedFormat.LUMINANCE8; 371 case GRPixelConfig.Gray8AsLum: 372 return GRGlSizedFormat.LUMINANCE8; 373 case GRPixelConfig.Gray8AsRed: 374 return GRGlSizedFormat.LUMINANCE8; 375 case GRPixelConfig.Rgb565: 376 return GRGlSizedFormat.RGB565; 377 case GRPixelConfig.Rgba4444: 378 return GRGlSizedFormat.RGBA4; 379 case GRPixelConfig.Rgba8888: 380 return GRGlSizedFormat.RGBA8; 381 case GRPixelConfig.Rgb888: 382 return GRGlSizedFormat.RGB8; 383 case GRPixelConfig.Rgb888x: 384 return GRGlSizedFormat.RGBA8; 385 case GRPixelConfig.Rg88: 386 return GRGlSizedFormat.RG8; 387 case GRPixelConfig.Bgra8888: 388 return GRGlSizedFormat.BGRA8; 389 case GRPixelConfig.Srgba8888: 390 return GRGlSizedFormat.SRGB8_ALPHA8; 391 case GRPixelConfig.Rgba1010102: 392 return GRGlSizedFormat.RGB10_A2; 393 case GRPixelConfig.AlphaHalf: 394 return GRGlSizedFormat.R16F; 395 case GRPixelConfig.AlphaHalfAsLum: 396 return GRGlSizedFormat.LUMINANCE16F; 397 case GRPixelConfig.AlphaHalfAsRed: 398 return GRGlSizedFormat.R16F; 399 case GRPixelConfig.RgbaHalf: 400 return GRGlSizedFormat.RGBA16F; 401 case GRPixelConfig.RgbaHalfClamped: 402 return GRGlSizedFormat.RGBA16F; 403 case GRPixelConfig.RgbEtc1: 404 return GRGlSizedFormat.COMPRESSED_ETC1_RGB8; 405 case GRPixelConfig.Alpha16: 406 return GRGlSizedFormat.R16; 407 case GRPixelConfig.Rg1616: 408 return GRGlSizedFormat.RG16; 409 case GRPixelConfig.Rgba16161616: 410 return GRGlSizedFormat.RGBA16; 411 case GRPixelConfig.RgHalf: 412 return GRGlSizedFormat.RG16F; 413 default: 414 throw new ArgumentOutOfRangeException(config.stringof); 415 } 416 } 417 418 // static GRPixelConfig ToPixelConfig (this SKColorType colorType) 419 static GRPixelConfig ToPixelConfig(SKColorType colorType) { 420 switch (colorType) { 421 case SKColorType.Unknown: 422 return GRPixelConfig.Unknown; 423 case SKColorType.Alpha8: 424 return GRPixelConfig.Alpha8; 425 case SKColorType.Gray8: 426 return GRPixelConfig.Gray8; 427 case SKColorType.Rgb565: 428 return GRPixelConfig.Rgb565; 429 case SKColorType.Argb4444: 430 return GRPixelConfig.Rgba4444; 431 case SKColorType.Rgba8888: 432 return GRPixelConfig.Rgba8888; 433 case SKColorType.Rgb888x: 434 return GRPixelConfig.Rgb888; 435 case SKColorType.Bgra8888: 436 return GRPixelConfig.Bgra8888; 437 case SKColorType.Rgba1010102: 438 return GRPixelConfig.Rgba1010102; 439 case SKColorType.AlphaF16: 440 return GRPixelConfig.AlphaHalf; 441 case SKColorType.RgbaF16: 442 return GRPixelConfig.RgbaHalf; 443 case SKColorType.RgbaF16Clamped: 444 return GRPixelConfig.RgbaHalfClamped; 445 case SKColorType.Alpha16: 446 return GRPixelConfig.Alpha16; 447 case SKColorType.Rg1616: 448 return GRPixelConfig.Rg1616; 449 case SKColorType.Rgba16161616: 450 return GRPixelConfig.Rgba16161616; 451 case SKColorType.RgF16: 452 return GRPixelConfig.RgHalf; 453 case SKColorType.Rg88: 454 return GRPixelConfig.Rg88; 455 case SKColorType.Rgb101010x: 456 return GRPixelConfig.Unknown; 457 case SKColorType.RgbaF32: 458 return GRPixelConfig.Unknown; 459 default: 460 throw new ArgumentOutOfRangeException(colorType.stringof); 461 } 462 } 463 464 // static SKColorType ToColorType (this GRPixelConfig config) 465 static SKColorType ToColorType(GRPixelConfig config) { 466 switch (config) { 467 case GRPixelConfig.Unknown: 468 return SKColorType.Unknown; 469 case GRPixelConfig.Alpha8: 470 return SKColorType.Alpha8; 471 case GRPixelConfig.Gray8: 472 return SKColorType.Gray8; 473 case GRPixelConfig.Rgb565: 474 return SKColorType.Rgb565; 475 case GRPixelConfig.Rgba4444: 476 return SKColorType.Argb4444; 477 case GRPixelConfig.Rgba8888: 478 return SKColorType.Rgba8888; 479 case GRPixelConfig.Rgb888: 480 return SKColorType.Rgb888x; 481 case GRPixelConfig.Bgra8888: 482 return SKColorType.Bgra8888; 483 case GRPixelConfig.Srgba8888: 484 return SKColorType.Rgba8888; 485 case GRPixelConfig.Rgba1010102: 486 return SKColorType.Rgba1010102; 487 case GRPixelConfig.AlphaHalf: 488 return SKColorType.AlphaF16; 489 case GRPixelConfig.RgbaHalf: 490 return SKColorType.RgbaF16; 491 case GRPixelConfig.Alpha8AsAlpha: 492 return SKColorType.Alpha8; 493 case GRPixelConfig.Alpha8AsRed: 494 return SKColorType.Alpha8; 495 case GRPixelConfig.AlphaHalfAsLum: 496 return SKColorType.AlphaF16; 497 case GRPixelConfig.AlphaHalfAsRed: 498 return SKColorType.AlphaF16; 499 case GRPixelConfig.Gray8AsLum: 500 return SKColorType.Gray8; 501 case GRPixelConfig.Gray8AsRed: 502 return SKColorType.Gray8; 503 case GRPixelConfig.RgbaHalfClamped: 504 return SKColorType.RgbaF16Clamped; 505 case GRPixelConfig.Alpha16: 506 return SKColorType.Alpha16; 507 case GRPixelConfig.Rg1616: 508 return SKColorType.Rg1616; 509 case GRPixelConfig.Rgba16161616: 510 return SKColorType.Rgba16161616; 511 case GRPixelConfig.RgHalf: 512 return SKColorType.RgF16; 513 case GRPixelConfig.Rg88: 514 return SKColorType.Rg88; 515 case GRPixelConfig.Rgb888x: 516 return SKColorType.Rgb888x; 517 case GRPixelConfig.RgbEtc1: 518 return SKColorType.Rgb888x; 519 default: 520 throw new ArgumentOutOfRangeException(config.stringof); 521 } 522 } 523 524 } 525 526 struct GRGlSizedFormat { 527 // Unsized formats 528 enum STENCIL_INDEX = 0x1901; 529 enum DEPTH_COMPONENT = 0x1902; 530 enum DEPTH_STENCIL = 0x84F9; 531 enum RED = 0x1903; 532 enum RED_INTEGER = 0x8D94; 533 enum GREEN = 0x1904; 534 enum BLUE = 0x1905; 535 enum ALPHA = 0x1906; 536 enum LUMINANCE = 0x1909; 537 enum LUMINANCE_ALPHA = 0x190A; 538 enum RG_INTEGER = 0x8228; 539 enum RGB = 0x1907; 540 enum RGB_INTEGER = 0x8D98; 541 enum SRGB = 0x8C40; 542 enum RGBA = 0x1908; 543 enum RG = 0x8227; 544 enum SRGB_ALPHA = 0x8C42; 545 enum RGBA_INTEGER = 0x8D99; 546 enum BGRA = 0x80E1; 547 548 // Stencil index sized formats 549 enum STENCIL_INDEX4 = 0x8D47; 550 enum STENCIL_INDEX8 = 0x8D48; 551 enum STENCIL_INDEX16 = 0x8D49; 552 553 // Depth component sized formats 554 enum DEPTH_COMPONENT16 = 0x81A5; 555 556 // Depth stencil sized formats 557 enum DEPTH24_STENCIL8 = 0x88F0; 558 559 // Red sized formats 560 enum R8 = 0x8229; 561 enum R16 = 0x822A; 562 enum R16F = 0x822D; 563 enum R32F = 0x822E; 564 565 // Red integer sized formats 566 enum R8I = 0x8231; 567 enum R8UI = 0x8232; 568 enum R16I = 0x8233; 569 enum R16UI = 0x8234; 570 enum R32I = 0x8235; 571 enum R32UI = 0x8236; 572 573 // Luminance sized formats 574 enum LUMINANCE8 = 0x8040; 575 enum LUMINANCE16F = 0x881E; 576 577 // Alpha sized formats 578 enum ALPHA8 = 0x803C; 579 enum ALPHA16 = 0x803E; 580 enum ALPHA16F = 0x881C; 581 enum ALPHA32F = 0x8816; 582 583 // Alpha integer sized formats 584 enum ALPHA8I = 0x8D90; 585 enum ALPHA8UI = 0x8D7E; 586 enum ALPHA16I = 0x8D8A; 587 enum ALPHA16UI = 0x8D78; 588 enum ALPHA32I = 0x8D84; 589 enum ALPHA32UI = 0x8D72; 590 591 // RG sized formats 592 enum RG8 = 0x822B; 593 enum RG16 = 0x822C; 594 //enum R16F = 0x822D; 595 //enum R32F = 0x822E; 596 enum RG16F = 0x822F; 597 598 // RG sized integer formats 599 enum RG8I = 0x8237; 600 enum RG8UI = 0x8238; 601 enum RG16I = 0x8239; 602 enum RG16UI = 0x823A; 603 enum RG32I = 0x823B; 604 enum RG32UI = 0x823C; 605 606 // RGB sized formats 607 enum RGB5 = 0x8050; 608 enum RGB565 = 0x8D62; 609 enum RGB8 = 0x8051; 610 enum SRGB8 = 0x8C41; 611 612 // RGB integer sized formats 613 enum RGB8I = 0x8D8F; 614 enum RGB8UI = 0x8D7D; 615 enum RGB16I = 0x8D89; 616 enum RGB16UI = 0x8D77; 617 enum RGB32I = 0x8D83; 618 enum RGB32UI = 0x8D71; 619 620 // RGBA sized formats 621 enum RGBA4 = 0x8056; 622 enum RGB5_A1 = 0x8057; 623 enum RGBA8 = 0x8058; 624 enum RGB10_A2 = 0x8059; 625 enum SRGB8_ALPHA8 = 0x8C43; 626 enum RGBA16F = 0x881A; 627 enum RGBA32F = 0x8814; 628 enum RG32F = 0x8230; 629 enum RGBA16 = 0x805B; 630 631 // RGBA integer sized formats 632 enum RGBA8I = 0x8D8E; 633 enum RGBA8UI = 0x8D7C; 634 enum RGBA16I = 0x8D88; 635 enum RGBA16UI = 0x8D76; 636 enum RGBA32I = 0x8D82; 637 enum RGBA32UI = 0x8D70; 638 639 // BGRA sized formats 640 enum BGRA8 = 0x93A1; 641 642 // Compressed texture sized formats 643 enum COMPRESSED_ETC1_RGB8 = 0x8D64; 644 }