windows-nt/Source/XPSP1/NT/multimedia/media/avi/drawdib.16/mapa.asm
2020-09-26 16:20:57 +08:00

539 lines
14 KiB
NASM

title mapa.asm
page ,132
?PLM=1 ; PASCAL Calling convention is DEFAULT
?WIN=0 ; Windows calling convention
.xlist
include cmacro32.inc
include windows.inc
.list
; -------------------------------------------------------
; DATA SEGMENT DECLARATIONS
; -------------------------------------------------------
ifndef SEGNAME
SEGNAME equ <_TEXT>
endif
createSeg %SEGNAME, CodeSeg, word, public, CODE
sBegin CodeSeg
.386
assumes cs,CodeSeg
assumes ds,nothing
assumes es,nothing
;--------------------------------------------------------------------------;
;
; STOSB32 - store a byte, every four times doing a STOSD
;
;--------------------------------------------------------------------------;
STOSB32_N = 0
STOSB32 macro
ror eax,8 ; rotate pixel (al) into eax
STOSB32_N = STOSB32_N + 1
if (STOSB32_N mod 4) eq 0
;; stos dword ptr es:[edi]
mov dword ptr es:[edi], eax
add edi,4
endif
endm
;--------------------------------------------------------------------------;
;
; LODSB32 - get a byte, every four times doing a LODSD
;
;--------------------------------------------------------------------------;
LODSB32_N = 0
LODSB32 macro
if (LODSB32_N mod 4) eq 0
;; lods dword ptr ds:[esi]
mov eax,dword ptr ds:[esi]
add esi,4
else
ror eax,8
endif
LODSB32_N = LODSB32_N + 1
endm
;--------------------------------------------------------------------------;
;
; MAP16
;
;--------------------------------------------------------------------------;
MAP16 macro n
if n and 1
shr ebx,16 ; get pel from last time
else
mov ebx, dword ptr ds:[esi] ; grab two pels
add esi,4
endif
;
; BX contains 5:5:5 RGB convert it to a 8:8:8 RGB
;
mov al,bl
shl al,3
STOSB32
shr bx,2
mov al,bl
and al,0F8h
STOSB32
mov al,bh
shl al,3
STOSB32
endm
;--------------------------------------------------------------------------;
;
; Map16to24()
;
; Entry:
; Stack based parameters as described below.
;
; Returns:
; none
;
; Registers Preserved:
; DS,ES,ESI,EDI,EBP
;
;--------------------------------------------------------------------------;
assumes ds,Data
assumes es,nothing
cProc Map16to24,<FAR,PUBLIC,PASCAL>,<>
parmD biDst ;--> BITMAPINFO of dest
parmD lpDst ;--> to destination bits
parmW DstX ;Destination origin - x coordinate
parmW DstY ;Destination origin - y coordinate
parmW DstXE ;x extent of the BLT
parmW DstYE ;y extent of the BLT
parmD biSrc ;--> BITMAPINFO of source
parmD lpSrc ;--> to source bits
parmW SrcX ;Source origin - x coordinate
parmW SrcY ;Source origin - y coordinate
parmD lpDitherTable ;not used
localD SrcWidth ;width of source in bytes
localD DstWidth ;width of dest in bytes
localD SrcInc
localD DstInc
cBegin
push esi
push edi
push ds
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; align everything on four pixel boundries, we realy should
; not do this but should handle the general case instead,
; but hey we are hackers.
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
and DstXE, not 011b
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
mov eax,16 ; source 16
mov ebx,24 ; dest 24
call map_init ; init all the frame variables
jc Map16to24Exit
movzx eax, DstXE ; inner loop expanded by 4
shr eax, 2
jz Map16to24Exit
mov DstXE,ax
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
align 4
Outer16to24Loop:
movzx ecx,DstXE
align 4
Inner16to24Loop:
MAP16 0
MAP16 1
MAP16 2
MAP16 3
dec ecx
jnz Inner16to24Loop
add edi, DstInc
add esi, SrcInc
dec DstYE
jnz Outer16to24Loop
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
Map16to24Exit:
pop ds
pop edi
pop esi
cEnd
;--------------------------------------------------------------------------;
;
; Map32to24()
;
; Entry:
; Stack based parameters as described below.
;
; Returns:
; none
;
; Registers Preserved:
; DS,ES,ESI,EDI,EBP
;
;--------------------------------------------------------------------------;
assumes ds,Data
assumes es,nothing
cProc Map32to24,<FAR,PUBLIC,PASCAL>,<>
parmD biDst ;--> BITMAPINFO of dest
parmD lpDst ;--> to destination bits
parmW DstX ;Destination origin - x coordinate
parmW DstY ;Destination origin - y coordinate
parmW DstXE ;x extent of the BLT
parmW DstYE ;y extent of the BLT
parmD biSrc ;--> BITMAPINFO of source
parmD lpSrc ;--> to source bits
parmW SrcX ;Source origin - x coordinate
parmW SrcY ;Source origin - y coordinate
parmD lpDitherTable ;not used
localD SrcWidth ;width of source in bytes
localD DstWidth ;width of dest in bytes
localD SrcInc
localD DstInc
localW OriginalDstXE
cBegin
push esi
push edi
push ds
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; align everything on four pixel boundries, we realy should
; not do this but should handle the general case instead,
; but hey we are hackers.
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
mov ax, DstXE
mov OriginalDstXE, ax
mov bx, ax
add ax, 011b
and ax, not 011b
mov DstXE, ax
and bx, 011b
jz short @f
dec DstYE ; if the width isn't a multiple of 4, special-
; case the last line.
@@:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
mov eax,32 ; source 32
mov ebx,24 ; dest 24
call map_init ; init all the frame variables
jc Map32to24Exit
movzx eax, DstXE ; inner loop expanded by 4
shr eax, 2
jz short Map32to24Exit
mov DstXE,ax
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
align 4
Outer32to24Loop:
movzx ecx,DstXE
align 4
Inner32to24Loop:
mov eax,[esi] ; eax = XRGB
mov ebx,[esi+4] ; ebx = xrgb
shl eax,8 ; eax = RGB0
shrd eax,ebx,8 ; eax = bRGB
mov es:[edi],eax ; store pels
shl ebx,8 ; ebx = rgb0
mov eax,[esi+8] ; eax = XRGB
shrd ebx,eax,16 ; ebx = GBrg
mov es:[edi+4],ebx ; store pels
shl eax,8 ; eax = RGB0
mov ebx,[esi+12] ; ebx = xrgb
shrd eax,ebx,24 ; eax = rgbR
mov es:[edi+8],eax ; store pels
add esi,16
add edi,12
dec ecx
jnz Inner32to24Loop
add edi, DstInc
add esi, SrcInc
dec DstYE
jnz Outer32to24Loop
; done, but might have to do one more scan line
mov ax, OriginalDstXE
and ax, 011b
jz short Map32to24Exit
movzx ecx,OriginalDstXE
align 4
@@: ; one more scan line to do....
mov eax,[esi] ; eax = XRGB
shl eax,8 ; eax = RGB0
mov es:[edi], ah
shr eax,16 ; eax = 00RG
mov es:[edi+1], ax
add esi,4
add edi,3
dec ecx
jnz @b
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
Map32to24Exit:
pop ds
pop edi
pop esi
cEnd
;--------------------------------------------------------------------------;
;
; map_init
;
; init local frame vars for mapDIB
;
; ENTRY:
; AX - source bpp
; BX - dest bpp
; ss:bp --> mapdib frame
;
; EXIT:
; DS:ESI --> source DIB start x,y
; ES:EDI --> dest DIB start x,y
;
;--------------------------------------------------------------------------;
map_init_error:
stc
ret
map_init proc near
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; validate the DIBs
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
xor edi,edi
xor esi,esi
lds si, biSrc
les di, biDst
movzx ecx, es:[di].biBitCount ; dest must be right
cmp cx, bx
jne map_init_error
mov cx, [si].biBitCount ; source must be 16
cmp cx, ax
jne map_init_error
map_init_bit_depth_ok:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
;
; Set up the initial source pointer
;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
mov eax,[si].biWidth
mul ecx
add eax,31
and eax,not 31
shr eax,3
mov SrcWidth,eax
mov SrcInc,eax
lds si,lpSrc
movzx edx,SrcY
mul edx
add esi,eax
movzx eax,SrcX
mul ecx
shr eax,3
add esi,eax
movzx eax, DstXE ; SrcInc = SrcWidth - DstXE*bits/8
mul ecx
shr eax, 3
sub SrcInc, eax
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
;
; Set up the initial dest pointer
;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
movzx ecx, es:[di].biBitCount
mov eax,es:[di].biWidth
mul ecx
add eax,31
and eax,not 31
shr eax,3
mov DstWidth,eax
mov DstInc,eax
les di,lpDst
movzx edx,DstY
mul edx
add edi,eax
movzx eax,DstX
mul ecx
shr eax,3
add edi,eax
movzx eax, DstXE ; DstInc = DstWidth - DstXE*bits/8
mul ecx
shr eax, 3
sub DstInc, eax
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
map_init_exit:
clc
ret
map_init endp
;--------------------------------------------------------------------------;
;
; HugeToFlat
;
; map a bunch of bitmap bits in "huge" format to "flat" format
;
; this code only works for bitmaps <= 128k
;
; Entry:
; Stack based parameters as described below.
;
; Returns:
; none
;
; Registers Preserved:
; DS,ES,ESI,EDI,EBP
;
;--------------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HugeToFlat,<FAR,PUBLIC,PASCAL>,<>
parmD lpBits ;--> bits
parmD cbBits ;count of bits.
parmD FillBytes ;the fill bytes
cBegin
push esi
push edi
push ds
mov ax,word ptr lpBits[2]
mov ds,ax
mov es,ax
mov eax,FillBytes
mov ecx,cbBits
add ecx,eax
mov esi,00010000h
sub ecx,esi
mov edi,esi
sub edi,eax
shr ecx,2
rep movsd
pop ds
pop edi
pop esi
cEnd
;--------------------------------------------------------------------------;
;
; FlatToHuge
;
; map a bunch of bitmap bits in "flat" format to "huge" format
;
; this code only works for bitmaps <= 128k
;
; Entry:
; Stack based parameters as described below.
;
; Returns:
; none
;
; Registers Preserved:
; DS,ES,ESI,EDI,EBP
;
;--------------------------------------------------------------------------;
assumes ds,Data
assumes es,nothing
cProc FlatToHuge,<FAR,PUBLIC,PASCAL>,<>
parmD lpBits ;--> bits
parmD cbBits ;count of bits.
parmD FillBytes ;the fill bytes
cBegin
push esi
push edi
push ds
mov ax,word ptr lpBits[2]
mov ds,ax
mov es,ax
mov eax,FillBytes
mov ecx,cbBits
add ecx,eax
mov edi,ecx
sub edi,4
mov esi,edi
sub esi,FillBytes
sub ecx,00010000h
std
shr ecx,2
rep movsd
cld
pop ds
pop edi
pop esi
cEnd
sEnd CodeSeg
end