Initial
This commit is contained in:
242
remotepsapp/asmutil.asm
Normal file
242
remotepsapp/asmutil.asm
Normal file
@@ -0,0 +1,242 @@
|
||||
INCLUDE ..\COMMON\COMMON.INC
|
||||
INCLUDE ..\COMMON\MATH.INC
|
||||
INCLUDE ..\NNTP\ASMUTIL.INC
|
||||
SMART
|
||||
LOCALS
|
||||
.386
|
||||
.MODEL FLAT
|
||||
.DATA
|
||||
sOutColIterator DD ?
|
||||
JumpTable:
|
||||
TrailZero DD Trail0
|
||||
TrailOne DD Trail1
|
||||
TrailTwo DD Trail2
|
||||
TrailThree DD Trail3
|
||||
|
||||
SIZE_RGB888 EQU 3
|
||||
|
||||
.CODE
|
||||
_resampleClipRow proc near ; short resampleClip(char *lpIn,char *lpOut,DWORD inLen,DWORD outLen)
|
||||
LOCAL sampleFactor:DWORD,runningFactor:DWORD=LocalLength
|
||||
push ebp ; save stack frame
|
||||
mov ebp,esp ; create new stack frame
|
||||
sub esp,LocalLength ; adjust stack for local
|
||||
push esi ; save source index register
|
||||
push edi ; save destination
|
||||
push ebx ; save ebx register
|
||||
mov eax,[ebp+10h] ; move inLen to eax register
|
||||
cmp eax,0000h ; compare inLen to zero
|
||||
jle @@errorExit ; if it's less or equal then exit
|
||||
mov ebx,[ebp+14h] ; move outLen to ebx register
|
||||
cmp ebx,0000h ; compare outLen to zero
|
||||
jle @@errorExit ; if it's less or equal then exit
|
||||
dec eax ; decrement inLen
|
||||
shl eax,10h ; multiply inLen by 65536L
|
||||
divide eax,ebx ; divide ((inLen-1L)*65536L)/outLen
|
||||
mov sampleFactor,eax ; store the factor
|
||||
dec ebx ; ebx has (outLen-1)
|
||||
mov ecx,ebx ; copy (outLen-1) to ecx
|
||||
mov edi,[ebp+0Ch] ; move lpOut to destination index register
|
||||
mov eax,size RGB888 ; move sizeof(RGB888) to eax register
|
||||
multiply eax,ecx ; multiply (outLen-1)*sizeof(RGB888)
|
||||
add edi,eax ; edi=lpOut+(outLen-1L)
|
||||
mov esi,[ebp+08h] ; move lpIn to source index register
|
||||
multiply ecx,sampleFactor ; multiply (outLen-1)*sampleFactor
|
||||
mov runningFactor,eax ; save this into runningFactor
|
||||
@@loopControl: ; loop control sync address
|
||||
cmp ecx,0000h ; make sure we're within boundary
|
||||
jl @@exit ; if not then we exit
|
||||
mov eax,runningFactor ; move last running factor into eax
|
||||
round ; round it off
|
||||
mov ebx,size RGB888 ; get size of RGB888 to ebx register
|
||||
multiply eax,ebx ; multiply running factor by sizeof(RGB888)
|
||||
mov dl,byte ptr[esi+eax] ; copy blue into dl
|
||||
mov byte ptr[edi],dl ; copy blue into target
|
||||
mov dl,byte ptr[esi+eax+1] ; copy green into dl
|
||||
mov byte ptr[edi+1],dl ; copy green into target
|
||||
mov dl,byte ptr[esi+eax+2] ; copy red into dl
|
||||
mov byte ptr[edi+2],dl ; copy red into target
|
||||
mov eax,sampleFactor ; move sampleFactor into eax register
|
||||
sub runningFactor,eax ; subtract from running factor
|
||||
dec ecx ; decrement counter
|
||||
sub edi,size RGB888 ; advance (backwards) along lpOut array
|
||||
jmp @@loopControl ; continue processing
|
||||
@@errorExit: ; error exit return sync address
|
||||
xor ax,ax ; clear ax register on error
|
||||
jmp @@endProcedure ; jump to end procedure
|
||||
@@exit: ; exit sync address
|
||||
mov ax,01h ; set ax register on success
|
||||
@@endProcedure: ; end procedure sync address
|
||||
pop ebx ; restore ebx register
|
||||
pop edi ; restore destination index register
|
||||
pop esi ; restore source index register
|
||||
add esp,LocalLength ; remove locals off stack
|
||||
pop ebp ; restore previous stack frame
|
||||
retn ; return near to caller
|
||||
_resampleClipRow endp
|
||||
_resampleClipCol proc near ; short resampleClip(char *lpIn,char *lpOut,DWORD inLen,DWORD inWidth,DWORD outLen,DWORD outWidth)
|
||||
LOCAL sampleFactor:DWORD,runningFactor:DWORD=LocalLength
|
||||
push ebp ; save stack frame
|
||||
mov ebp,esp ; create new stack frame
|
||||
sub esp,LocalLength ; adjust stack for local
|
||||
push esi ; save source index register
|
||||
push edi ; save destination
|
||||
push ebx ; save ebx register
|
||||
mov edx,[ebp+1Ch] ; move outWidth to edx register
|
||||
mov eax,size RGB888 ; move sizeof(RGB888) to eax register
|
||||
multiply eax,edx ; eax=outWidth*sizeof(RGB888)
|
||||
mov sOutColIterator,eax ; save column iterator
|
||||
mov eax,[ebp+10h] ; move inLen to eax register
|
||||
cmp eax,0000h ; compare inLen to zero
|
||||
jle @@errorExit ; if it's less or equal then exit
|
||||
mov ebx,[ebp+18h] ; move outLen to ebx register
|
||||
cmp ebx,0000h ; compare outLen to zero
|
||||
jle @@errorExit ; if it's less or equal then exit
|
||||
dec eax ; decrement inLen
|
||||
shl eax,10h ; multiply inLen by 65536L
|
||||
divide eax,ebx ; divide ((inLen-1L)*65536L)/outLen
|
||||
mov sampleFactor,eax ; store the factor
|
||||
dec ebx ; ebx has (outLen-1)
|
||||
mov ecx,ebx ; copy (outLen-1) to ecx
|
||||
mov edi,[ebp+0Ch] ; move lpOut to destination index register
|
||||
mov eax,[ebp+1Ch] ; move outWidth to eax register
|
||||
multiply eax,ecx ; multiply (outLen-1)*width
|
||||
mov edx,size RGB888 ; move sizeof(RGB888) to edx
|
||||
multiply eax,edx ; eax has ((outLen-1)*outWidth)*sizeof(RGB888)
|
||||
add edi,eax ; edi=lpOut+((outLen-1)*outWidth)*sizeof(RGB888), points to end of array
|
||||
mov esi,[ebp+08h] ; move lpIn to source index register
|
||||
multiply ecx,sampleFactor ; multiply (outLen-1)*sampleFactor
|
||||
mov runningFactor,eax ; save this into runningFactor
|
||||
@@loopControl: ; loop control sync address
|
||||
cmp ecx,0000h ; make sure we're within boundary
|
||||
jl @@exit ; if not then we exit
|
||||
mov eax,runningFactor ; move last running factor into eax
|
||||
round ; round it off
|
||||
mov edx,[ebp+14h] ; move inWidth to edx register
|
||||
multiply eax,edx ; eax=inWidth*runningFactor
|
||||
mov edx,size RGB888 ; move sizeof(RGB888) to edx register
|
||||
multiply eax,edx ; eax=(inWidth*runningFactor)*sizeof(RGB888)
|
||||
mov dl,byte ptr[esi+eax] ; copy blue into dl
|
||||
mov byte ptr[edi],dl ; copy blue into target
|
||||
mov dl,byte ptr[esi+eax+1] ; copy green into dl
|
||||
mov byte ptr[edi+1],dl ; copy green into target
|
||||
mov dl,byte ptr[esi+eax+2] ; copy red into dl
|
||||
mov byte ptr[edi+2],dl ; copy red into target
|
||||
mov eax,sampleFactor ; move sampleFactor into eax register
|
||||
sub runningFactor,eax ; subtract from running factor
|
||||
dec ecx ; decrement counter
|
||||
sub edi,sOutColIterator ; advance backwards along lpOutArray
|
||||
jmp @@loopControl ; continue processing
|
||||
@@errorExit: ; error exit return sync address
|
||||
xor ax,ax ; clear ax register on error
|
||||
jmp @@endProcedure ; jump to end procedure
|
||||
@@exit: ; exit sync address
|
||||
mov ax,01h ; set ax register on success
|
||||
@@endProcedure: ; end procedure sync address
|
||||
pop ebx ; restore ebx register
|
||||
pop edi ; restore destination index register
|
||||
pop esi ; restore source index register
|
||||
add esp,LocalLength ; remove locals off stack
|
||||
pop ebp ; restore previous stack frame
|
||||
retn ; return near to caller
|
||||
_resampleClipCol endp
|
||||
copy MACRO
|
||||
mov ecx,[ebx].ImageInfo@@mSrcWidthFactor ; move count of bytes into ecx register
|
||||
mov edx,ecx ; move count of bytes into edx register
|
||||
shr ecx,0002h ; divide count of bytes by sizeof(dword)
|
||||
and edx,00003h ; get remainder into edx register
|
||||
repnz movsd ; copy the column (esi->edi)
|
||||
jmp dword ptr[edx*4+JumpTable] ; finish off the remaining bytes
|
||||
Trail0: ; zero trailing bytes sync address
|
||||
jmp @@endCopy ; we're all done
|
||||
Trail1: ; 1 trailing byte sync address
|
||||
mov al,byte ptr[esi] ; move source byte into al register
|
||||
mov byte ptr [edi],al ; ... and copy it over to destination
|
||||
inc esi ; increment source index
|
||||
inc edi ; increment destination
|
||||
jmp @@endCopy ; we're all done
|
||||
Trail2: ; 2 trailing bytes sync address
|
||||
mov ax,word ptr[esi] ; move a word value from source
|
||||
mov word ptr[edi],ax ; move word value into destination
|
||||
add esi,2 ; increment source index
|
||||
add edi,2 ; increment destination index
|
||||
jmp @@endCopy ; we're all done here
|
||||
Trail3: ; 3 trailing bytes sync address
|
||||
mov ax,word ptr[esi] ; move a word value from source
|
||||
mov word ptr[edi],ax ; copy word value to destination
|
||||
mov al,byte ptr[edi+2] ; move next byte to al
|
||||
mov byte ptr[edi+2],al ; copy to destination
|
||||
add esi,3 ; increment source index register
|
||||
add edi,3 ; increment destination index register
|
||||
@@endCopy: ; we're all done here
|
||||
ENDM
|
||||
_setAt proc near ; int setAt(ImageInfo *pImageInfo,DWORD row,DWORD col)
|
||||
push ebp ; save previous stack frame
|
||||
mov ebp,esp ; create new frame
|
||||
push esi ; save source index register
|
||||
push edi ; save destination index register
|
||||
push ebx ; save ebx register
|
||||
mov ebx,[ebp+08h] ; move (ImageInfo*) to ebx register
|
||||
cld ; clear the direction flag
|
||||
mov eax,[ebx].ImageInfo@@mSrcWidth ; move source image width into eax register
|
||||
multiply eax,SIZE_RGB888 ; multiply width by sizeof(RGB888)
|
||||
mov [ebx].ImageInfo@@mSrcWidthFactor,eax ; replace factor into structure
|
||||
mov eax,[ebx].ImageInfo@@mDstWidth ; move destination image width into eax register
|
||||
multiply eax,SIZE_RGB888 ; multiply width by sizeof(RGB888)
|
||||
mov [ebx].ImageInfo@@mDstWidthFactor,eax ; replace factor into structure
|
||||
mov esi,[ebx].ImageInfo@@mSrcRGB888 ; move source RGB888* to source index
|
||||
multiply [ebx].ImageInfo@@mDstRow,[ebx].ImageInfo@@mDstWidth ; multiply source width by source row->eax
|
||||
add eax,[ebx].ImageInfo@@mDstCol ; add in the destination column
|
||||
multiply eax,SIZE_RGB888 ; multiply result by sizeof(RGB888)
|
||||
mov edi,[ebx].ImageInfo@@mDstRGB888 ; move RGB888* to esi
|
||||
add edi,eax ; add in the offset, result to esi
|
||||
@@rowLoop: ; row loop sync address
|
||||
copy ; copy the column
|
||||
mov eax,[ebx].ImageInfo@@mDstWidthFactor ; move destination width factor to eax
|
||||
sub eax,[ebx].ImageInfo@@mSrcWidthFactor ; get difference between source and destination
|
||||
add edi,eax ; add to destination so it sits at next row
|
||||
inc [ebx].ImageInfo@@mSrcRow ; increment source row
|
||||
mov eax,[ebx].ImageInfo@@mSrcRow ; replace row counter
|
||||
cmp eax,[ebx].ImageInfo@@mSrcHeight ; cmp row to image height
|
||||
jl @@rowLoop ; if less then keep going
|
||||
@@imageDone: ; done processing sync address
|
||||
pop ebx ; restore ebx register
|
||||
pop edi ; restore destination index register
|
||||
pop esi ; restore source index register
|
||||
pop ebp ; restore previous stack frame
|
||||
retn ; return near to caller
|
||||
_setAt endp
|
||||
_copyBGRRGB proc near ; void copyBGRRGB(RGB *pRGB,BGR *pBGR,int count,int output_components)
|
||||
push ebp ; save frame
|
||||
mov ebp,esp ; create new frame
|
||||
push ebx ; save ebx register
|
||||
push ecx ; save ecx register
|
||||
push esi ; save source index register
|
||||
push edi ; save destination index register
|
||||
mov ebx,[ebp+14h] ; move output_components to ebx register
|
||||
mov ecx,[ebp+10h] ; move item count to ecx, one item is a single XXX component
|
||||
mov edi,[ebp+08h] ; move pRGB to edi register
|
||||
mov esi,[ebp+0Ch] ; move pBGR to esi register
|
||||
add esi,ebx ; add (output_components) to esi
|
||||
dec esi ; subtract one to get index
|
||||
@@copyLoop: ; copyLoop sync address
|
||||
mov ax,word ptr[esi-1] ; get a word value from source into ax register
|
||||
rol ax,08h ; swap the bytes in this word
|
||||
mov word ptr[edi],ax ; write the word value out to destination
|
||||
mov al,byte ptr[esi-2] ; move source blue component into al
|
||||
mov byte ptr[edi+2],al ; move blue component into destination blue
|
||||
add esi,ebx ; add output_components to esi
|
||||
add edi,SIZE_RGB888 ; increment destination index to next component
|
||||
loopnz @@copyLoop ; continue through count items
|
||||
pop edi ; restore destination index register
|
||||
pop esi ; restore source index register
|
||||
pop ecx ; restore ecx register
|
||||
pop ebx ; restore ebx register
|
||||
pop ebp ; restore previous frame
|
||||
retn ; return near to caller
|
||||
_copyBGRRGB endp
|
||||
public _resampleClipRow
|
||||
public _resampleClipCol
|
||||
public _copyBGRRGB
|
||||
public _setAt
|
||||
END
|
||||
Reference in New Issue
Block a user