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  }