sdl_pixels.odin 10.0 KB

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