sdl_pixels.odin 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package sdl2
  2. import "core:c"
  3. when ODIN_OS == "windows" { foreign import lib "SDL2.lib" }
  4. when ODIN_OS == "linux" { foreign import lib "system:SDL2" }
  5. when ODIN_OS == "darwin" { foreign import lib "system:SDL2" }
  6. when ODIN_OS == "freebsd" { foreign import lib "system:SDL2" }
  7. ALPHA_OPAQUE :: 255
  8. ALPHA_TRANSPARENT :: 0
  9. PIXELTYPE_UNKNOWN :: 0
  10. PIXELTYPE_INDEX1 :: 1
  11. PIXELTYPE_INDEX4 :: 2
  12. PIXELTYPE_INDEX8 :: 3
  13. PIXELTYPE_PACKED8 :: 4
  14. PIXELTYPE_PACKED16 :: 5
  15. PIXELTYPE_PACKED32 :: 6
  16. PIXELTYPE_ARRAYU8 :: 7
  17. PIXELTYPE_ARRAYU16 :: 8
  18. PIXELTYPE_ARRAYU32 :: 9
  19. PIXELTYPE_ARRAYF16 :: 10
  20. PIXELTYPE_ARRAYF3 :: 11
  21. BITMAPORDER_NONE :: 0
  22. BITMAPORDER_4321 :: 1
  23. BITMAPORDER_1234 :: 2
  24. PACKEDORDER_NONE :: 0
  25. PACKEDORDER_XRGB :: 1
  26. PACKEDORDER_RGBX :: 2
  27. PACKEDORDER_ARGB :: 3
  28. PACKEDORDER_RGBA :: 4
  29. PACKEDORDER_XBGR :: 5
  30. PACKEDORDER_BGRX :: 6
  31. PACKEDORDER_ABGR :: 7
  32. PACKEDORDER_BGRA :: 8
  33. /** Array component order, low byte -> high byte. */
  34. /* !!! FIXME: in 2.1, make these not overlap differently with
  35. !!! FIXME: SDL_PACKEDORDER_*, so we can simplify SDL_ISPIXELFORMAT_ALPHA */
  36. ARRAYORDER_NONE :: 0
  37. ARRAYORDER_RGB :: 1
  38. ARRAYORDER_RGBA :: 2
  39. ARRAYORDER_ARGB :: 3
  40. ARRAYORDER_BGR :: 4
  41. ARRAYORDER_BGRA :: 5
  42. ARRAYORDER_ABG :: 6
  43. PACKEDLAYOUT_NONE :: 0
  44. PACKEDLAYOUT_332 :: 1
  45. PACKEDLAYOUT_4444 :: 2
  46. PACKEDLAYOUT_1555 :: 3
  47. PACKEDLAYOUT_5551 :: 4
  48. PACKEDLAYOUT_565 :: 5
  49. PACKEDLAYOUT_8888 :: 6
  50. PACKEDLAYOUT_2101010 :: 7
  51. PACKEDLAYOUT_101010 :: 8
  52. DEFINE_PIXELFOURCC :: FOURCC
  53. DEFINE_PIXELFORMAT :: #force_inline proc "c" (type: u8, order: u8, layout, bits, bytes: u8) -> u32 {
  54. return (1 << 28) | (u32(type) << 24) | (u32(order) << 20) | (u32(layout) << 16) | (u32(bits) << 8) | (u32(bytes) << 0)
  55. }
  56. // #define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F)
  57. // #define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F)
  58. // #define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F)
  59. // #define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F)
  60. // #define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF)
  61. // #define SDL_BYTESPERPIXEL(X) \
  62. // (SDL_ISPIXELFORMAT_FOURCC(X) ? \
  63. // ((((X) == SDL_PIXELFORMAT_YUY2) || \
  64. // ((X) == SDL_PIXELFORMAT_UYVY) || \
  65. // ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF))
  66. // #define SDL_ISPIXELFORMAT_INDEXED(format) \
  67. // (!SDL_ISPIXELFORMAT_FOURCC(format) && \
  68. // ((SDL_PIXELTYPE(format) == PIXELTYPE_INDEX1) || \
  69. // (SDL_PIXELTYPE(format) == PIXELTYPE_INDEX4) || \
  70. // (SDL_PIXELTYPE(format) == PIXELTYPE_INDEX8)))
  71. // #define SDL_ISPIXELFORMAT_PACKED(format) \
  72. // (!SDL_ISPIXELFORMAT_FOURCC(format) && \
  73. // ((SDL_PIXELTYPE(format) == PIXELTYPE_PACKED8) || \
  74. // (SDL_PIXELTYPE(format) == PIXELTYPE_PACKED16) || \
  75. // (SDL_PIXELTYPE(format) == PIXELTYPE_PACKED32)))
  76. // #define SDL_ISPIXELFORMAT_ARRAY(format) \
  77. // (!SDL_ISPIXELFORMAT_FOURCC(format) && \
  78. // ((SDL_PIXELTYPE(format) == PIXELTYPE_ARRAYU8) || \
  79. // (SDL_PIXELTYPE(format) == PIXELTYPE_ARRAYU16) || \
  80. // (SDL_PIXELTYPE(format) == PIXELTYPE_ARRAYU32) || \
  81. // (SDL_PIXELTYPE(format) == PIXELTYPE_ARRAYF16) || \
  82. // (SDL_PIXELTYPE(format) == PIXELTYPE_ARRAYF32)))
  83. // #define SDL_ISPIXELFORMAT_ALPHA(format) \
  84. // ((SDL_ISPIXELFORMAT_PACKED(format) && \
  85. // ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \
  86. // (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \
  87. // (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \
  88. // (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \
  89. // (SDL_ISPIXELFORMAT_ARRAY(format) && \
  90. // ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \
  91. // (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \
  92. // (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \
  93. // (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA))))
  94. // /* The flag is set to 1 because 0x1? is not in the printable ASCII range */
  95. // #define SDL_ISPIXELFORMAT_FOURCC(format) \
  96. // ((format) && (SDL_PIXELFLAG(format) != 1))
  97. PixelFormatEnum :: enum u32 {
  98. UNKNOWN = 0,
  99. INDEX1LSB = 1<<28 | PIXELTYPE_INDEX1<<24 | BITMAPORDER_4321<<20 | 0<<16 | 1<<8 | 0<<0,
  100. INDEX1MSB = 1<<28 | PIXELTYPE_INDEX1<<24 | BITMAPORDER_1234<<20 | 0<<16 | 1<<8 | 0<<0,
  101. INDEX4LSB = 1<<28 | PIXELTYPE_INDEX4<<24 | BITMAPORDER_4321<<20 | 0<<16 | 4<<8 | 0<<0,
  102. INDEX4MSB = 1<<28 | PIXELTYPE_INDEX4<<24 | BITMAPORDER_1234<<20 | 0<<16 | 4<<8 | 0<<0,
  103. INDEX8 = 1<<28 | PIXELTYPE_INDEX8<<24 | 0<<20 | 0<<16 | 8<<8 | 1<<0,
  104. RGB332 = 1<<28 | PIXELTYPE_PACKED8<<24 | PACKEDORDER_XRGB<<20 | PACKEDLAYOUT_332<<16 | 8<<8 | 1<<0,
  105. XRGB4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XRGB<<20 | PACKEDLAYOUT_4444<<16 | 12<<8 | 2<<0,
  106. RGB444 = XRGB4444,
  107. XBGR4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XBGR<<20 | PACKEDLAYOUT_4444<<16 | 12<<8 | 2<<0,
  108. BGR444 = XBGR4444,
  109. XRGB1555 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XRGB<<20 | PACKEDLAYOUT_1555<<16 | 15<<8 | 2<<0,
  110. RGB555 = XRGB1555,
  111. XBGR1555 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XBGR<<20 | PACKEDLAYOUT_1555<<16 | 15<<8 | 2<<0,
  112. BGR555 = XBGR1555,
  113. ARGB4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_4444<<16 | 16<<8 | 2<<0,
  114. RGBA4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_RGBA<<20 | PACKEDLAYOUT_4444<<16 | 16<<8 | 2<<0,
  115. ABGR4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_ABGR<<20 | PACKEDLAYOUT_4444<<16 | 16<<8 | 2<<0,
  116. BGRA4444 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_BGRA<<20 | PACKEDLAYOUT_4444<<16 | 16<<8 | 2<<0,
  117. ARGB1555 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_1555<<16 | 16<<8 | 2<<0,
  118. RGBA5551 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_RGBA<<20 | PACKEDLAYOUT_5551<<16 | 16<<8 | 2<<0,
  119. ABGR1555 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_ABGR<<20 | PACKEDLAYOUT_1555<<16 | 16<<8 | 2<<0,
  120. BGRA5551 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_BGRA<<20 | PACKEDLAYOUT_5551<<16 | 16<<8 | 2<<0,
  121. RGB565 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XRGB<<20 | PACKEDLAYOUT_565<<16 | 16<<8 | 2<<0,
  122. BGR565 = 1<<28 | PIXELTYPE_PACKED16<<24 | PACKEDORDER_XBGR<<20 | PACKEDLAYOUT_565<<16 | 16<<8 | 2<<0,
  123. RGB24 = 1<<28 | PIXELTYPE_ARRAYU8<<24 | ARRAYORDER_RGB<<20 | 0<<16 | 24<<8 | 3<<0,
  124. BGR24 = 1<<28 | PIXELTYPE_ARRAYU8<<24 | ARRAYORDER_BGR<<20 | 0<<16 | 24<<8 | 3<<0,
  125. XRGB8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_XRGB<<20 | PACKEDLAYOUT_8888<<16 | 24<<8 | 4<<0,
  126. RGB888 = XRGB8888,
  127. RGBX8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_RGBX<<20 | PACKEDLAYOUT_8888<<16 | 24<<8 | 4<<0,
  128. XBGR8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_XBGR<<20 | PACKEDLAYOUT_8888<<16 | 24<<8 | 4<<0,
  129. BGR888 = XBGR8888,
  130. BGRX8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_BGRX<<20 | PACKEDLAYOUT_8888<<16 | 24<<8 | 4<<0,
  131. ARGB8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_8888<<16 | 32<<8 | 4<<0,
  132. RGBA8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_RGBA<<20 | PACKEDLAYOUT_8888<<16 | 32<<8 | 4<<0,
  133. ABGR8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_ABGR<<20 | PACKEDLAYOUT_8888<<16 | 32<<8 | 4<<0,
  134. BGRA8888 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_BGRA<<20 | PACKEDLAYOUT_8888<<16 | 32<<8 | 4<<0,
  135. ARGB2101010 = 1<<28 | PIXELTYPE_PACKED32<<24 | PACKEDORDER_ARGB<<20 | PACKEDLAYOUT_2101010<<16 | 32<<8 | 4<<0,
  136. /* Aliases for RGBA byte arrays of color data, for the current platform */
  137. RGBA32 = RGBA8888 when ODIN_ENDIAN == "big" else ABGR8888,
  138. ARGB32 = ARGB8888 when ODIN_ENDIAN == "big" else BGRA8888,
  139. BGRA32 = BGRA8888 when ODIN_ENDIAN == "big" else ARGB8888,
  140. ABGR32 = ABGR8888 when ODIN_ENDIAN == "big" else RGBA8888,
  141. YV12 = /**< Planar mode: Y + V + U (3 planes) */
  142. 'Y'<<24 | 'V'<<16 | '1'<<8 | '2'<<0,
  143. IYUV = /**< Planar mode: Y + U + V (3 planes) */
  144. 'I'<<24 | 'Y'<<16 | 'U'<<8 | 'V'<<0,
  145. YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */
  146. 'Y'<<24 | 'U'<<16 | 'Y'<<8 | '2'<<0,
  147. UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */
  148. 'U'<<24 | 'Y'<<16 | 'V'<<8 | 'Y'<<0,
  149. YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */
  150. 'Y'<<24 | 'V'<<16 | 'Y'<<8 | 'U'<<0,
  151. NV12 = /**< Planar mode: Y + U/V interleaved (2 planes) */
  152. 'N'<<24 | 'V'<<16 | '1'<<8 | '2'<<0,
  153. NV21 = /**< Planar mode: Y + V/U interleaved (2 planes) */
  154. 'N'<<24 | 'V'<<16 | '2'<<8 | '1'<<0,
  155. EXTERNAL_OES = /**< Android video texture format */
  156. 'O'<<24 | 'E'<<16 | 'S'<<8 | ' '<<0,
  157. }
  158. Colour :: Color
  159. Color :: struct {
  160. r: u8,
  161. g: u8,
  162. b: u8,
  163. a: u8,
  164. }
  165. Palette :: struct {
  166. ncolors: c.int,
  167. colors: ^Color,
  168. version: u32,
  169. refcount: c.int,
  170. }
  171. PixelFormat :: struct {
  172. format: u32,
  173. palette: ^Palette,
  174. BitsPerPixel: u8,
  175. BytesPerPixel: u8,
  176. padding: [2]u8,
  177. Rmask: u32,
  178. Gmask: u32,
  179. Bmask: u32,
  180. Amask: u32,
  181. Rloss: u8,
  182. Gloss: u8,
  183. Bloss: u8,
  184. Aloss: u8,
  185. Rshift: u8,
  186. Gshift: u8,
  187. Bshift: u8,
  188. Ashift: u8,
  189. refcount: c.int,
  190. next: ^PixelFormat,
  191. }
  192. @(default_calling_convention="c", link_prefix="SDL_")
  193. foreign lib {
  194. GetPixelFormatName :: proc(format: u32) -> cstring ---
  195. PixelFormatEnumToMasks :: proc(format: u32, bpp: ^c.int, Rmask, Gmask, Bmask, Amask: ^u32) -> bool ---
  196. MasksToPixelFormatEnum :: proc(bpp: c.int, Rmask, Gmask, Bmask, Amask: u32) -> u32 ---
  197. AllocFormat :: proc(pixel_format: u32) -> ^PixelFormat ---
  198. FreeFormat :: proc(format: ^PixelFormat) ---
  199. AllocPalette :: proc(ncolors: c.int) -> ^Palette ---
  200. SetPixelFormatPalette :: proc(format: ^PixelFormat, palette: ^Palette) -> c.int ---
  201. SetPaletteColors :: proc(palette: ^Palette, colors: [^]Color, firstcolor, ncolors: c.int) -> c.int ---
  202. FreePalette :: proc(palette: ^Palette) ---
  203. MapRGB :: proc(format: ^PixelFormat, r, g, b: u8) -> u32 ---
  204. MapRGBA :: proc(format: ^PixelFormat, r, g, b, a: u8) -> u32 ---
  205. GetRGB :: proc(pixel: u32, format: ^PixelFormat, r, g, b: ^u8) ---
  206. GetRGBA :: proc(pixel: u32, format: ^PixelFormat, r, g, b, a: ^u8) ---
  207. CalculateGammaRamp :: proc(gamma: f32, ramp: ^[256]u16) ---
  208. }