kolibrios/programs/develop/libraries/TinyGL/asm_fork/image_util.asm

263 lines
6.0 KiB
NASM
Raw Normal View History

;include 'zgl.inc'
align 16
proc gl_resizeImage uses ecx edi esi, dest:dword, xsize_dest:dword, ysize_dest:dword,\
src:dword, xsize_src:dword, ysize_src:dword
;сжатие по ширине
mov edi,[xsize_src]
cmp edi,[xsize_dest]
jle @f
stdcall img_rgb24_wresize, [src],edi,[ysize_src],[xsize_dest]
mov edi,[xsize_dest]
@@:
;сжатие по высоте
mov ecx,[ysize_src]
cmp ecx,[ysize_dest]
jle @f
stdcall img_rgb24_hresize, [src],edi,ecx,[ysize_dest]
mov ecx,[ysize_dest]
@@:
;копирование сжатой текстуры
imul ecx,edi
mov edi,[dest]
mov esi,[src]
imul ecx,3
rep movsb
ret
endp
;description:
; сжатие изображения по ширине (размеры буфера не меняются)
;input:
; data_rgb - pointer to rgb data
; size_w - width img in pixels
; size_h - height img in pixels
; size_w_new - new width img in pixels
align 16
proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword
locals
pr dd 0
pg dd 0
pb dd 0
img_n dd ? ;указатель на данные нового изображения
lines dd ?
endl
pushad
;eax - delta for inp. img
;ebx - delta for outp. img
;esi - pointer to data_rgb
mov esi,[data_rgb]
mov [img_n],esi
mov eax,[size_h]
mov [lines],eax
align 4
.cycyle_0:
mov eax,[size_w_new]
mov ecx,[size_w]
mov ebx,ecx
align 4
.cycyle_1:
cmp eax,ebx
jg .else_0
;копируемый пиксель максимально влияет на результат
;накапливаем rgb для интерполяции пикселей
mov edx,[size_w_new]
movzx edi,byte[esi]
imul edi,edx
add [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
add [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
add [pr],edi
cmp eax,ebx
je .d2_add
jmp .if_0_end
.else_0:
;копируемый пиксель попадет на границу пикселей
mov edx,ebx
sub edx,eax
add edx,[size_w_new]
movzx edi,byte[esi]
imul edi,edx
add [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
add [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
add [pr],edi
;сохраняем готовое rgb
.d2_add:
push eax
mov edi,[img_n]
mov eax,[pb]
xor edx,edx
div dword[size_w] ;eax /= [size_w]
stosb
mov eax,[pg]
xor edx,edx
div dword[size_w] ;eax /= [size_w]
stosb
mov eax,[pr]
xor edx,edx
div dword[size_w] ;eax /= [size_w]
stosb
pop eax
add dword[img_n],3 ;next pixel
;обновляем rgb для нового пикселя
mov edx,eax
sub edx,ebx
movzx edi,byte[esi]
imul edi,edx
mov [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
mov [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
mov [pr],edi
add ebx,[size_w]
.if_0_end:
add eax,[size_w_new]
add esi,3 ;next pixel
dec ecx
jnz .cycyle_1
dec dword[lines]
jnz .cycyle_0
popad
ret
endp
;description:
; сжатие изображения по высоте (размеры буфера не меняются)
;input:
; data_rgb - pointer to rgb data
; size_w - width img in pixels
; size_h - height img in pixels
; size_h_new - new height img in pixels
align 16
proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword
locals
pr dd 0
pg dd 0
pb dd 0
img_n dd ? ;указатель на данные нового изображения
cols dd ?
lin_b dd ? ;размер линии изображения в байтах
data_n dd ? ;указатель на данные для нового столбца пикселей
endl
pushad
;eax - delta for inp. img
;ebx - delta for outp. img
;esi - pointer to data_rgb
mov esi,[data_rgb]
mov [data_n],esi
mov eax,[size_w]
mov [cols],eax
lea eax,[eax+eax*2]
mov [lin_b],eax
align 4
.cycyle_0:
mov eax,[size_h_new]
mov ecx,[size_h]
mov ebx,ecx
mov esi,[data_n]
mov [img_n],esi
add dword[data_n],3 ;переход на следующий столбец пикселей
align 4
.cycyle_1:
cmp eax,ebx
jg .else_0
;копируемый пиксель максимально влияет на результат
;накапливаем rgb для интерполяции пикселей
mov edx,[size_h_new]
movzx edi,byte[esi]
imul edi,edx
add [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
add [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
add [pr],edi
cmp eax,ebx
je .d2_add
jmp .if_0_end
.else_0:
;копируемый пиксель попадет на границу пикселей
mov edx,ebx
sub edx,eax
add edx,[size_h_new]
movzx edi,byte[esi]
imul edi,edx
add [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
add [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
add [pr],edi
;сохраняем готовое rgb
.d2_add:
push eax
mov edi,[img_n]
mov eax,[pb]
xor edx,edx
div dword[size_h] ;eax /= [size_h]
stosb
mov eax,[pg]
xor edx,edx
div dword[size_h] ;eax /= [size_h]
stosb
mov eax,[pr]
xor edx,edx
div dword[size_h] ;eax /= [size_h]
stosb
pop eax
mov edx,[lin_b]
add dword[img_n],edx ;next pixel
;обновляем rgb для нового пикселя
mov edx,eax
sub edx,ebx
movzx edi,byte[esi]
imul edi,edx
mov [pb],edi
movzx edi,byte[esi+1]
imul edi,edx
mov [pg],edi
movzx edi,byte[esi+2]
imul edi,edx
mov [pr],edi
add ebx,[size_h]
.if_0_end:
add eax,[size_h_new]
add esi,[lin_b] ;next pixel
dec ecx
jnz .cycyle_1
dec dword[cols]
jnz .cycyle_0
popad
ret
endp
align 4
proc gl_getPervPowerOfTwo uses ebx, n:dword
mov ebx,[n]
mov eax,(1 shl ZB_POINT_TEXEL_SIZE) ;max size
cmp ebx,eax
jge .set
@@:
shr eax,1
cmp ebx,eax
jl @b
cmp eax,8 ;min size
jge .set
mov eax,8
.set:
ret
endp