init: 自 zomaintain/backend/rdplib 平移独立成库; module path 从上游 github.com/nakagami/grdp 改为 git.zeroonesoft.cn/golib/rdplib
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
//go:build !arm64
|
||||
|
||||
package rdpgfx
|
||||
|
||||
import "unsafe"
|
||||
|
||||
// ictToBGRA converts n pixels from YCbCr (ICT) to BGRA and writes them into
|
||||
// dst (which must hold ≥ 4*n bytes). Processing n pixels in [8]int32 arrays
|
||||
// with a scalar inner loop.
|
||||
func ictToBGRA(yRow, cbRow, crRow []int16, dst []byte, n int) {
|
||||
const batch = 8
|
||||
full := (n / batch) * batch
|
||||
for base := 0; base < full; base += batch {
|
||||
var yv, cb, cr [batch]int32
|
||||
for k := range batch {
|
||||
yv[k] = int32(yRow[base+k])
|
||||
cb[k] = int32(cbRow[base+k])
|
||||
cr[k] = int32(crRow[base+k])
|
||||
}
|
||||
for k := range batch {
|
||||
ys := (yv[k] + 4096) << 16
|
||||
bv := uint32(max(0, min((cb[k]*115992+ys)>>21, 255)))
|
||||
gv := uint32(max(0, min((ys-cb[k]*22527-cr[k]*46819)>>21, 255)))
|
||||
rv := uint32(max(0, min((cr[k]*91916+ys)>>21, 255)))
|
||||
*(*uint32)(unsafe.Pointer(&dst[(base+k)*4])) = bv | gv<<8 | rv<<16 | 0xFF000000
|
||||
}
|
||||
}
|
||||
for col := full; col < n; col++ {
|
||||
yv := int32(yRow[col])
|
||||
cb := int32(cbRow[col])
|
||||
cr := int32(crRow[col])
|
||||
ys := (yv + 4096) << 16
|
||||
bv := uint32(max(0, min((cb*115992+ys)>>21, 255)))
|
||||
gv := uint32(max(0, min((ys-cb*22527-cr*46819)>>21, 255)))
|
||||
rv := uint32(max(0, min((cr*91916+ys)>>21, 255)))
|
||||
*(*uint32)(unsafe.Pointer(&dst[col*4])) = bv | gv<<8 | rv<<16 | 0xFF000000
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user