code.witches.io/go/sdl2@v0.1.1/compat/surface.go (about) 1 package compat 2 3 import ( 4 "image/color" 5 ) 6 7 type RGB565 struct { 8 RGB uint16 9 } 10 11 func (c RGB565) RGBA() (r, g, b, a uint32) { 12 r = uint32(c.RGB>>11) & 0x1f 13 r |= r << 8 14 g = uint32(c.RGB>>5) & 0x3f 15 g |= g << 8 16 b = uint32(c.RGB) & 0x1f 17 b |= b << 8 18 return r, g, b, 0xffff 19 } 20 21 var ( 22 RGB565Model color.Model = color.ModelFunc(rgb565Model) 23 ARGB2101010Model color.Model = color.ModelFunc(argb2101010Model) 24 ) 25 26 func rgb565Model(c color.Color) color.Color { 27 if _, ok := c.(RGB565); ok { 28 return c 29 } 30 r, g, b, a := c.RGBA() 31 if a == 0xffff { 32 return RGB565{uint16(r>>11)<<11 | uint16(g>>10)<<5 | uint16(b>>11)} 33 } 34 if a == 0 { 35 return RGB565{0} 36 } 37 r = (r * 0xffff) / a 38 g = (g * 0xffff) / a 39 b = (b * 0xffff) / a 40 return RGB565{uint16(r>>11)<<11 | uint16(g>>10)<<5 | uint16(b>>11)} 41 } 42 43 type ARGB2101010 struct { 44 ARGB uint32 45 } 46 47 func (c ARGB2101010) RGBA() (r, g, b, a uint32) { 48 a = c.ARGB & 0xC0000000 49 a >>= 30 50 a *= 0x55 51 r = c.ARGB & 0x3FF00000 52 r = r>>14 | r>>24 53 r *= a 54 r /= 0xFF 55 g = c.ARGB & 0x000FFC00 56 g = g>>4 | g>>14 57 g *= a 58 g /= 0xFF 59 b = c.ARGB & 0x000003FF 60 b = b<<6 | b>>4 61 b *= a 62 b /= 0xFF 63 a |= a << 8 64 return 65 } 66 67 func argb2101010Model(c color.Color) color.Color { 68 if _, ok := c.(ARGB2101010); ok { 69 return c 70 } 71 r, g, b, a := c.RGBA() 72 if a == 0xffff { 73 return ARGB2101010{0x3<<30 | (r>>6)<<20 | (g>>6)<<10 | (b>>6)<<0} 74 } 75 if a == 0 { 76 return ARGB2101010{0} 77 } 78 r = (r * 0xffff) / a 79 g = (g * 0xffff) / a 80 b = (b * 0xffff) / a 81 return ARGB2101010{(a>>14)<<30 | (r>>6)<<20 | (g>>6)<<10 | (b>>6)<<0} 82 }