465434cb12
git-svn-id: svn://kolibrios.org@6243 a494cfbc-eb01-0410-851d-a64ba20cac60
263 lines
6.0 KiB
NASM
263 lines
6.0 KiB
NASM
;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 |