382 lines
10 KiB
NASM
382 lines
10 KiB
NASM
|
page ,132
|
||
|
;----------------------------Module-Header------------------------------;
|
||
|
; Module Name: SETDI24.ASM
|
||
|
;
|
||
|
; move bits from one DIB format into another. doing color conversion if
|
||
|
; needed.
|
||
|
;
|
||
|
; convert_8_24
|
||
|
; convert_16_24
|
||
|
; convert_24_24
|
||
|
; convert_32_24
|
||
|
;
|
||
|
; NOTES:
|
||
|
;
|
||
|
; AUTHOR: ToddLa (Todd Laney) Microsoft
|
||
|
;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
?PLM=1
|
||
|
?WIN=0
|
||
|
.xlist
|
||
|
include cmacro32.inc
|
||
|
include windows.inc
|
||
|
.list
|
||
|
|
||
|
sBegin Data
|
||
|
sEnd Data
|
||
|
|
||
|
ifndef SEGNAME
|
||
|
SEGNAME equ <_TEXT32>
|
||
|
endif
|
||
|
|
||
|
.386
|
||
|
createSeg %SEGNAME, CodeSeg, word, public, CODE
|
||
|
|
||
|
sBegin CodeSeg
|
||
|
assumes cs,CodeSeg
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;--------------------------------------------------------------------------;
|
||
|
|
||
|
nxtscan macro reg, next_scan, fill_bytes
|
||
|
ifb <fill_bytes>
|
||
|
add e®,next_scan
|
||
|
else
|
||
|
mov eax,e®
|
||
|
add e®,next_scan
|
||
|
cmp ax,reg
|
||
|
sbb eax,eax
|
||
|
and eax,fill_bytes
|
||
|
add e®,eax
|
||
|
endif
|
||
|
endm
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;
|
||
|
; convert_8_24
|
||
|
;
|
||
|
;--------------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc convert_8_24,<FAR,PUBLIC,PASCAL>,<esi,edi,ds>
|
||
|
ParmD dst_ptr ; --> dst.
|
||
|
ParmD dst_offset ; offset to start at
|
||
|
ParmD dst_next_scan ; dst_next_scan.
|
||
|
ParmD dst_fill_bytes ; dst_fill_bytes
|
||
|
ParmD src_ptr ; --> src.
|
||
|
ParmD src_offset ; offset to start at
|
||
|
ParmD src_next_scan ; dst_next_scan.
|
||
|
ParmD pel_count ; pixel count.
|
||
|
ParmD scan_count ; scan count.
|
||
|
ParmD xlat_table ; pixel convert table.
|
||
|
cBegin
|
||
|
xor esi,esi
|
||
|
xor edi,edi
|
||
|
xor ebx,ebx
|
||
|
lfs si,src_ptr
|
||
|
les di,dst_ptr
|
||
|
lds bx,xlat_table
|
||
|
|
||
|
add esi,src_offset
|
||
|
add edi,dst_offset
|
||
|
|
||
|
mov eax,pel_count
|
||
|
sub src_next_scan,eax
|
||
|
add eax,eax
|
||
|
add eax,pel_count
|
||
|
sub dst_next_scan,eax
|
||
|
|
||
|
xor eax,eax
|
||
|
align 4
|
||
|
convert_8_24_start:
|
||
|
mov ecx,pel_count
|
||
|
align 4
|
||
|
convert_8_24_loop:
|
||
|
mov bl,fs:[esi] ; grab a pel
|
||
|
mov edx,[ebx*4] ; convert to 24bpp
|
||
|
mov es:[edi],dl
|
||
|
shr edx,8
|
||
|
mov es:[edi+1],dx
|
||
|
|
||
|
inc esi
|
||
|
add edi,3
|
||
|
dec ecx
|
||
|
jnz short convert_8_24_loop ;; ack
|
||
|
|
||
|
convert_8_24_next:
|
||
|
nxtscan si,src_next_scan
|
||
|
nxtscan di,dst_next_scan,dst_fill_bytes
|
||
|
|
||
|
dec scan_count
|
||
|
jnz short convert_8_24_start
|
||
|
cEnd
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;
|
||
|
; 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
|
||
|
mov 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
|
||
|
mov eax,[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, [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,dh ; F8h
|
||
|
STOSB32
|
||
|
|
||
|
mov al,bh
|
||
|
shl al,3
|
||
|
STOSB32
|
||
|
|
||
|
endm
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;
|
||
|
; convert_16_24
|
||
|
;
|
||
|
;--------------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc convert_16_24,<FAR,PUBLIC,PASCAL>,<esi,edi,ds>
|
||
|
ParmD dst_ptr ; --> dst.
|
||
|
ParmD dst_offset ; offset to start at
|
||
|
ParmD dst_next_scan ; dst_next_scan.
|
||
|
ParmD dst_fill_bytes ; dst_fill_bytes
|
||
|
ParmD src_ptr ; --> src.
|
||
|
ParmD src_offset ; offset to start at
|
||
|
ParmD src_next_scan ; dst_next_scan.
|
||
|
ParmD pel_count ; pixel count.
|
||
|
ParmD scan_count ; scan count.
|
||
|
ParmD xlat_table ; pixel convert table.
|
||
|
cBegin
|
||
|
xor esi,esi
|
||
|
xor edi,edi
|
||
|
lds si,src_ptr
|
||
|
les di,dst_ptr
|
||
|
|
||
|
add esi,src_offset
|
||
|
add edi,dst_offset
|
||
|
|
||
|
and pel_count,not 3 ;;!!!
|
||
|
|
||
|
mov eax,pel_count
|
||
|
add eax,eax
|
||
|
sub src_next_scan,eax
|
||
|
add eax,pel_count
|
||
|
sub dst_next_scan,eax
|
||
|
|
||
|
mov ecx,pel_count
|
||
|
shr ecx,2
|
||
|
mov pel_count,ecx
|
||
|
mov dh,0F8h
|
||
|
align 4
|
||
|
convert_16_24_start:
|
||
|
mov ecx,pel_count
|
||
|
align 4
|
||
|
convert_16_24_loop:
|
||
|
MAP16 0
|
||
|
MAP16 1
|
||
|
MAP16 2
|
||
|
MAP16 3
|
||
|
dec ecx
|
||
|
jnz convert_16_24_loop
|
||
|
|
||
|
convert_16_24_next:
|
||
|
nxtscan si,src_next_scan
|
||
|
nxtscan di,dst_next_scan,dst_fill_bytes
|
||
|
|
||
|
dec scan_count
|
||
|
jnz convert_16_24_start
|
||
|
cEnd
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;
|
||
|
; convert_24_24
|
||
|
;
|
||
|
;--------------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc convert_24_24,<FAR,PUBLIC,PASCAL>,<esi,edi,ds>
|
||
|
ParmD dst_ptr ; --> dst.
|
||
|
ParmD dst_offset ; offset to start at
|
||
|
ParmD dst_next_scan ; dst_next_scan.
|
||
|
ParmD dst_fill_bytes ; dst_fill_bytes
|
||
|
ParmD src_ptr ; --> src.
|
||
|
ParmD src_offset ; offset to start at
|
||
|
ParmD src_next_scan ; dst_next_scan.
|
||
|
ParmD pel_count ; pixel count.
|
||
|
ParmD scan_count ; scan count.
|
||
|
ParmD xlat_table ; pixel convert table.
|
||
|
cBegin
|
||
|
xor esi,esi
|
||
|
xor edi,edi
|
||
|
lds si,src_ptr
|
||
|
les di,dst_ptr
|
||
|
|
||
|
add esi,src_offset
|
||
|
add edi,dst_offset
|
||
|
|
||
|
mov eax,pel_count
|
||
|
add eax,eax
|
||
|
add eax,pel_count
|
||
|
sub dst_next_scan,eax
|
||
|
sub src_next_scan,eax
|
||
|
|
||
|
mov ebx,eax
|
||
|
mov edx,eax
|
||
|
shr ebx,2
|
||
|
and edx,3
|
||
|
align 4
|
||
|
convert_24_24_start:
|
||
|
mov ecx,ebx
|
||
|
rep movs dword ptr es:[edi],dword ptr ds:[esi]
|
||
|
mov ecx,edx
|
||
|
rep movs byte ptr es:[edi],byte ptr ds:[esi]
|
||
|
|
||
|
nxtscan si,src_next_scan
|
||
|
nxtscan di,dst_next_scan,dst_fill_bytes
|
||
|
|
||
|
dec scan_count
|
||
|
jnz short convert_24_24_start
|
||
|
cEnd
|
||
|
|
||
|
;--------------------------------------------------------------------------;
|
||
|
;
|
||
|
; convert_32_24
|
||
|
;
|
||
|
;--------------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc convert_32_24,<FAR,PUBLIC,PASCAL>,<esi,edi,ds>
|
||
|
ParmD dst_ptr ; --> dst.
|
||
|
ParmD dst_offset ; offset to start at
|
||
|
ParmD dst_next_scan ; dst_next_scan.
|
||
|
ParmD dst_fill_bytes ; dst_fill_bytes
|
||
|
ParmD src_ptr ; --> src.
|
||
|
ParmD src_offset ; offset to start at
|
||
|
ParmD src_next_scan ; dst_next_scan.
|
||
|
ParmD pel_count ; pixel count.
|
||
|
ParmD scan_count ; scan count.
|
||
|
ParmD xlat_table ; pixel convert table.
|
||
|
cBegin
|
||
|
xor esi,esi
|
||
|
xor edi,edi
|
||
|
lds si,src_ptr
|
||
|
les di,dst_ptr
|
||
|
|
||
|
add esi,src_offset
|
||
|
add edi,dst_offset
|
||
|
|
||
|
and pel_count,not 3 ; !!!
|
||
|
|
||
|
mov eax,pel_count
|
||
|
add eax,eax
|
||
|
add eax,eax
|
||
|
sub src_next_scan,eax
|
||
|
sub eax,pel_count
|
||
|
sub dst_next_scan,eax
|
||
|
|
||
|
mov ecx,pel_count
|
||
|
shr ecx,2
|
||
|
jz short convert_32_24_exit
|
||
|
mov pel_count,ecx
|
||
|
align 4
|
||
|
convert_32_24_start:
|
||
|
mov ecx,pel_count
|
||
|
align 4
|
||
|
convert_32_24_loop:
|
||
|
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 short convert_32_24_loop
|
||
|
|
||
|
convert_32_24_next:
|
||
|
nxtscan si,src_next_scan
|
||
|
nxtscan di,dst_next_scan,dst_fill_bytes
|
||
|
|
||
|
dec scan_count
|
||
|
jnz short convert_32_24_start
|
||
|
|
||
|
convert_32_24_exit:
|
||
|
|
||
|
cEnd
|
||
|
|
||
|
sEnd CodeSeg
|
||
|
|
||
|
end
|