56 lines
1.9 KiB
Go
56 lines
1.9 KiB
Go
//go:build !amd64 && !arm64
|
|
|
|
package pdu
|
|
|
|
// ycoCgToBGRANoSub converts count pixels from YCoCg planes to interleaved BGRA,
|
|
// assuming no chroma subsampling and no alpha plane override.
|
|
// pixels must have capacity >= count*4.
|
|
func ycoCgToBGRANoSub(pixels, yPlane, coPlane, cgPlane []byte, count int, shift uint8) {
|
|
i := 0
|
|
for ; i+4 <= count; i += 4 {
|
|
off := i * 4
|
|
|
|
yVal := int16(yPlane[i])
|
|
coVal := int16(int8(byte(int16(coPlane[i]) << shift)))
|
|
cgVal := int16(int8(byte(int16(cgPlane[i]) << shift)))
|
|
pixels[off] = clampByte(yVal - coVal - cgVal)
|
|
pixels[off+1] = clampByte(yVal + cgVal)
|
|
pixels[off+2] = clampByte(yVal + coVal - cgVal)
|
|
pixels[off+3] = 0xFF
|
|
|
|
yVal = int16(yPlane[i+1])
|
|
coVal = int16(int8(byte(int16(coPlane[i+1]) << shift)))
|
|
cgVal = int16(int8(byte(int16(cgPlane[i+1]) << shift)))
|
|
pixels[off+4] = clampByte(yVal - coVal - cgVal)
|
|
pixels[off+5] = clampByte(yVal + cgVal)
|
|
pixels[off+6] = clampByte(yVal + coVal - cgVal)
|
|
pixels[off+7] = 0xFF
|
|
|
|
yVal = int16(yPlane[i+2])
|
|
coVal = int16(int8(byte(int16(coPlane[i+2]) << shift)))
|
|
cgVal = int16(int8(byte(int16(cgPlane[i+2]) << shift)))
|
|
pixels[off+8] = clampByte(yVal - coVal - cgVal)
|
|
pixels[off+9] = clampByte(yVal + cgVal)
|
|
pixels[off+10] = clampByte(yVal + coVal - cgVal)
|
|
pixels[off+11] = 0xFF
|
|
|
|
yVal = int16(yPlane[i+3])
|
|
coVal = int16(int8(byte(int16(coPlane[i+3]) << shift)))
|
|
cgVal = int16(int8(byte(int16(cgPlane[i+3]) << shift)))
|
|
pixels[off+12] = clampByte(yVal - coVal - cgVal)
|
|
pixels[off+13] = clampByte(yVal + cgVal)
|
|
pixels[off+14] = clampByte(yVal + coVal - cgVal)
|
|
pixels[off+15] = 0xFF
|
|
}
|
|
for ; i < count; i++ {
|
|
yVal := int16(yPlane[i])
|
|
coVal := int16(int8(byte(int16(coPlane[i]) << shift)))
|
|
cgVal := int16(int8(byte(int16(cgPlane[i]) << shift)))
|
|
off := i * 4
|
|
pixels[off] = clampByte(yVal - coVal - cgVal)
|
|
pixels[off+1] = clampByte(yVal + cgVal)
|
|
pixels[off+2] = clampByte(yVal + coVal - cgVal)
|
|
pixels[off+3] = 0xFF
|
|
}
|
|
}
|