@@ -98,7 +98,7 @@ func (c YCbCr) RGBA() (uint32, uint32, uint32, uint32) {
98
98
// fmt.Printf("0x%04x 0x%04x 0x%04x\n", r0, g0, b0)
99
99
// fmt.Printf("0x%04x 0x%04x 0x%04x\n", r1, g1, b1)
100
100
// prints:
101
- // 0x7e18 0x808e 0x7db9
101
+ // 0x7e18 0x808d 0x7db9
102
102
// 0x7e7e 0x8080 0x7d7d
103
103
104
104
yy1 := int32 (c .Y ) * 0x10100 // Convert 0x12 to 0x121200.
@@ -144,13 +144,33 @@ type NYCbCrA struct {
144
144
A uint8
145
145
}
146
146
147
- func (c NYCbCrA ) RGBA () (r , g , b , a uint32 ) {
148
- r8 , g8 , b8 := YCbCrToRGB (c .Y , c .Cb , c .Cr )
149
- a = uint32 (c .A ) * 0x101
150
- r = uint32 (r8 ) * 0x101 * a / 0xffff
151
- g = uint32 (g8 ) * 0x101 * a / 0xffff
152
- b = uint32 (b8 ) * 0x101 * a / 0xffff
153
- return
147
+ func (c NYCbCrA ) RGBA () (uint32 , uint32 , uint32 , uint32 ) {
148
+ // The first part of this method is the same as YCbCr.RGBA.
149
+ yy1 := int32 (c .Y ) * 0x10100 // Convert 0x12 to 0x121200.
150
+ cb1 := int32 (c .Cb ) - 128
151
+ cr1 := int32 (c .Cr ) - 128
152
+ r := (yy1 + 91881 * cr1 ) >> 8
153
+ g := (yy1 - 22554 * cb1 - 46802 * cr1 ) >> 8
154
+ b := (yy1 + 116130 * cb1 ) >> 8
155
+ if r < 0 {
156
+ r = 0
157
+ } else if r > 0xffff {
158
+ r = 0xffff
159
+ }
160
+ if g < 0 {
161
+ g = 0
162
+ } else if g > 0xffff {
163
+ g = 0xffff
164
+ }
165
+ if b < 0 {
166
+ b = 0
167
+ } else if b > 0xffff {
168
+ b = 0xffff
169
+ }
170
+
171
+ // The second part of this method applies the alpha.
172
+ a := uint32 (c .A ) * 0x101
173
+ return uint32 (r ) * a / 0xffff , uint32 (g ) * a / 0xffff , uint32 (b ) * a / 0xffff , a
154
174
}
155
175
156
176
// NYCbCrAModel is the Model for non-alpha-premultiplied Y'CbCr-with-alpha
0 commit comments