You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
7.0 KiB
251 lines
7.0 KiB
;-----------------------------------------------------------------------------
|
|
;
|
|
; This file contains the output buffer color reading routines for Blending.
|
|
;
|
|
; Have pBits passed in as eax for now. Color value returned in mm1.
|
|
; returns 16 bits for each color channel, but only lower eight are used. This is
|
|
; so that the I can use pmullw multiplies in the blending code.
|
|
;
|
|
; These routines could all loose the punpck instruction by shifting to the correct
|
|
; location. This wouldnt save alot but it could be done. Texread rouines
|
|
; could not do that because of colorkey case.
|
|
;
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
|
|
include(`texread.mh')dnl
|
|
|
|
.586
|
|
.model flat
|
|
.code
|
|
|
|
INCLUDE iammx.inc
|
|
INCLUDE offs_acp.inc
|
|
|
|
|
|
texreadVars()
|
|
; Names are read LSB to MSB, so B5G6R5 means five bits of blue starting
|
|
; at the LSB, then six bits of green, then five bits of red.
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B8G8R8
|
|
;
|
|
; Reads output buffer in BGR-888 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B8G8R8(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B8G8R8
|
|
_MMX_BufRead_B8G8R8:
|
|
;PUINT32 pSurface = (PUINT32)pBits;
|
|
movzx edx, byte ptr [eax+1]
|
|
or dh, byte ptr [eax+2]
|
|
movzx eax, byte ptr [eax]
|
|
shl edx, 8
|
|
or edx, eax
|
|
|
|
;return *pSurface | 0xff000000;
|
|
or edx, 0ff000000h
|
|
movd mm1, edx
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking
|
|
punpcklbw mm1, mm2
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B8G8R8X8
|
|
;
|
|
; Reads output buffer in BGR-888x format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B8G8R8X8(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B8G8R8X8
|
|
_MMX_BufRead_B8G8R8X8:
|
|
;PUINT32 pSurface = (PUINT32)pBits;
|
|
movd mm1, dword ptr [eax]
|
|
|
|
;return *pSurface | 0xff000000;
|
|
por mm1, MMWORD PTR SetAlphaTo0xFF
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking
|
|
punpcklbw mm1, mm2
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B8G8R8A8
|
|
;
|
|
; Reads output in BGRA-8888 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B8G8R8A8(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B8G8R8A8
|
|
_MMX_BufRead_B8G8R8A8:
|
|
|
|
;PUINT32 pSurface = (PUINT32)pBits;
|
|
movd mm1, dword ptr [eax]
|
|
|
|
;return *pSurface;
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking
|
|
punpcklbw mm1, mm2
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B5G6R5
|
|
;
|
|
; Reads output in BGR-565 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B5G6R5(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B5G6R5
|
|
_MMX_BufRead_B5G6R5:
|
|
|
|
;UINT16 uPixel = *(PUINT16)pBits;
|
|
movzx eax, word ptr [eax]
|
|
|
|
;D3DCOLOR Color = RGBA_MAKE(( uPixel >> 8 ) & 0xf8,
|
|
; (( uPixel >> 3) & 0xfc ),
|
|
; (( uPixel << 3) & 0xf8 ),
|
|
; 0xff);
|
|
movd mm1, eax ; Make two more copies of input color
|
|
movq mm2, mm1 ; Could possibly use eax to shift blue.
|
|
|
|
pand mm1, MaskGreen565to888 ; MaskGreen565to888 is in memory
|
|
psllq mm2, RedShift565to888 ; RedShift should be an immediate
|
|
|
|
pand mm2, MaskRed565to888 ; MaskRed565to888 in memory.
|
|
psllq mm1, GreenShift565to888
|
|
|
|
shl eax, BlueShift565to888
|
|
por mm1, mm2
|
|
|
|
and eax, MaskBlue565to888
|
|
movd mm2, eax
|
|
|
|
por mm1, SetAlphato0xFF
|
|
por mm1, mm2
|
|
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking.
|
|
punpcklbw mm1, mm2
|
|
|
|
;return Color;
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B5G5R5
|
|
;
|
|
; Reads output in BGR-555 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B5G5R5(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B5G5R5
|
|
_MMX_BufRead_B5G5R5:
|
|
|
|
;UINT16 uPixel = *(PUINT16)pBits;
|
|
movzx eax, word ptr [eax]
|
|
|
|
;D3DCOLOR Color = RGBA_MAKE(( uPixel >> 7 ) & 0xf8,
|
|
; (( uPixel >> 2) & 0xf8 ),
|
|
; (( uPixel << 3) & 0xf8 ),
|
|
; 0xff);
|
|
movd mm1, eax ; Make two more copies of input color
|
|
movq mm2, mm1
|
|
|
|
pand mm1, MaskGreen555to888 ; MaskGreen555to888 is in memory
|
|
psllq mm2, RedShift555to888 ; RedShift should be an immediate
|
|
|
|
pand mm2, MaskRed555to888 ; MaskRed555to888 in memory.
|
|
psllq mm1, GreenShift555to888
|
|
|
|
shl eax, BlueShift555to888
|
|
por mm1, mm2
|
|
|
|
and eax, MaskBlue555to888
|
|
movd mm2, eax
|
|
|
|
por mm1, SetAlphato0xFF
|
|
por mm1, mm2
|
|
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking
|
|
punpcklbw mm1, mm2
|
|
|
|
;return Color;
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_B5G5R5A1
|
|
;
|
|
; Reads output in BGRA-1555 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_B5G5R5A1(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_B5G5R5A1
|
|
_MMX_BufRead_B5G5R5A1:
|
|
|
|
;UINT16 iPixel = *(PINT16)pBits;
|
|
movzx eax, word ptr [eax]
|
|
|
|
;D3DCOLOR Color = RGBA_MAKE(( iPixel >> 7 ) & 0xf8,
|
|
; (( iPixel >> 2) & 0xf8 ),
|
|
; (( iPixel << 3) & 0xf8 ),
|
|
; (iPixel >> 15) & 0xff);
|
|
movd mm1, eax ; Make two more copies of input color
|
|
movq mm2, mm1
|
|
mov edx, eax
|
|
|
|
pand mm1, MaskAlpha1555to8888 ; MaskAlpha1555to8888 is in memory
|
|
psllq mm2, RedShift1555to8888 ; RedShift should be an immediate
|
|
|
|
pand mm2, MaskRed1555to8888 ; MaskRed1555to8888 in memory.
|
|
psllq mm1, AlphaShift1555to8888 ; shift bit to top of dword
|
|
|
|
psrad mm1, 7 ; copy bit to upper 8 bits.
|
|
shl eax, BlueShift1555to8888
|
|
por mm1, mm2
|
|
shl edx, GreenShift1555to8888
|
|
and eax, MaskBlue1555to8888
|
|
movd mm2, eax
|
|
por mm1, mm2
|
|
and edx, MaskGreen1555to8888
|
|
movd mm2, edx
|
|
por mm1, mm2
|
|
|
|
pxor mm2, mm2 ; Zero out mm1 for unpacking
|
|
punpcklbw mm1, mm2
|
|
|
|
;return Color;
|
|
ret
|
|
;}
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; Read_Palette8
|
|
;
|
|
; Reads output buffer in Palette8 format.
|
|
;
|
|
;-----------------------------------------------------------------------------
|
|
;D3DCOLOR Read_Palette8(PUINT8 pBits)
|
|
;{
|
|
PUBLIC _MMX_BufRead_Palette8
|
|
_MMX_BufRead_Palette8:
|
|
; Always return 0.
|
|
; ATTENTION - This is not correct. But We assume Palette8 format will
|
|
; normally not be used for alpha blending.
|
|
pxor mm1, mm1
|
|
ret
|
|
;}
|
|
|
|
END
|