235,7 → 235,7 |
|
push eax |
|
stdcall img._.resize_data, eax, [_width], [_height] |
stdcall img._resize_data, eax, [_width], [_height] |
or eax, eax |
jz .error.2 |
|
267,47 → 267,34 |
endp |
|
;;================================================================================================;; |
proc img.count _img ;/////////////////////////////////////////////////////////////////////////////;; |
proc img._resize_data _img, _width, _height ;/////////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
;? Get number of images in the list (e.g. in animated GIF file) ;; |
;? --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;> _img = pointer to image ;; |
;> --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;< eax = -1 (fail) / >0 (ok) ;; |
;< --- TBD --- ;; |
;;================================================================================================;; |
push ecx edx |
mov edx, [_img] |
stdcall img._.validate, edx |
push ebx |
mov ebx, [_img] |
mov eax, [_height] |
imul eax, [_width] |
shl eax, 2 |
invoke mem.realloc, [ebx + Image.Data], eax |
or eax, eax |
jnz .error |
jz .error |
|
@@: mov eax, [edx + Image.Previous] |
or eax, eax |
jz @f |
mov edx, eax |
jmp @b |
mov [ebx + Image.Data], eax |
push [_width] |
pop [ebx + Image.Width] |
push [_height] |
pop [ebx + Image.Height] |
|
@@: xor ecx, ecx |
@@: inc ecx |
mov eax, [edx + Image.Next] |
or eax, eax |
jz .exit |
mov edx, eax |
jmp @b |
|
.exit: |
mov eax, ecx |
pop edx ecx |
ret |
|
.error: |
or eax, -1 |
pop edx ecx |
pop ebx |
ret |
endp |
|
;;//// image processing //////////////////////////////////////////////////////////////////////////;; |
|
;;================================================================================================;; |
proc img.lock_bits _img, _start_line, _end_line ;/////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
334,13 → 321,14 |
ret |
endp |
|
;;//// image processing //////////////////////////////////////////////////////////////////////////;; |
|
;;================================================================================================;; |
proc img.flip _img, _flip_kind ;//////////////////////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
;? Flip image ;; |
;? --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;> _img = pointer to image ;; |
;> _flip_kind = one of FLIP_* constants ;; |
;> --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;< eax = false / true ;; |
;;================================================================================================;; |
359,8 → 347,6 |
shl eax, 2 |
mov [scanline_len], eax |
|
push esi |
|
test [_flip_kind], FLIP_VERTICAL |
jz .dont_flip_vert |
|
374,52 → 360,28 |
push ecx |
|
mov ecx, [scanline_len] |
shr ecx, 2 |
@@: lodsd |
xchg eax, [edi] |
mov [esi - 4], eax |
add edi, 4 |
dec ecx |
add ecx, -4 |
jnz @b |
|
pop ecx |
mov eax, [scanline_len] |
shl eax, 1 |
sub edi, eax |
|
pop ecx |
dec ecx |
jnz .next_line_vert |
|
.dont_flip_vert: |
|
pop esi |
|
test [_flip_kind], FLIP_HORIZONTAL |
jz .exit |
|
mov ecx, [esi + Image.Height] |
mov esi, [esi + Image.Data] |
lea edi, [esi - 4] |
add edi, [scanline_len] |
;TODO: horz flip code |
|
.next_line_horz: |
push ecx esi edi |
|
mov ecx, [scanline_len] |
shr ecx, 3 |
@@: mov eax, [esi] |
xchg eax, [edi] |
mov [esi], eax |
add esi, 4 |
add edi, -4 |
dec ecx |
jnz @b |
|
pop edi esi ecx |
add esi, [scanline_len] |
add edi, [scanline_len] |
dec ecx |
jnz .next_line_horz |
|
.exit: |
xor eax, eax |
inc eax |
432,182 → 394,7 |
ret |
endp |
|
;;================================================================================================;; |
proc img.rotate _img, _rotate_kind ;//////////////////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
;? Rotate image ;; |
;;------------------------------------------------------------------------------------------------;; |
;> _img = pointer to image ;; |
;> _rotate_kind = one of ROTATE_* constants ;; |
;;------------------------------------------------------------------------------------------------;; |
;< eax = false / true ;; |
;;================================================================================================;; |
locals |
scanline_len_old dd ? |
scanline_len_new dd ? |
scanline_pixels_new dd ? |
line_buffer dd ? |
pixels_ptr dd ? |
endl |
|
mov [line_buffer], 0 |
|
push ebx esi edi |
stdcall img._.validate, [_img] |
or eax, eax |
jnz .error |
|
cmp [_rotate_kind], ROTATE_90_CCW |
je .rotate_ccw_low |
cmp [_rotate_kind], ROTATE_90_CW |
je .rotate_cw_low |
cmp [_rotate_kind], ROTATE_180 |
je .flip |
jmp .exit |
|
.rotate_ccw_low: |
mov ebx, [_img] |
mov eax, [ebx + Image.Height] |
mov [scanline_pixels_new], eax |
shl eax, 2 |
mov [scanline_len_new], eax |
|
invoke mem.alloc, eax |
or eax, eax |
jz .error |
mov [line_buffer], eax |
|
mov ecx, [ebx + Image.Width] |
lea eax, [ecx * 4] |
mov [scanline_len_old], eax |
|
mov eax, [scanline_len_new] |
imul eax, ecx |
add eax, [ebx + Image.Data] |
mov [pixels_ptr], eax |
|
.next_column_ccw_low: |
dec ecx |
jz .exchange_dims |
push ecx |
|
mov edx, [scanline_len_old] |
add [scanline_len_old], -4 |
|
mov ecx, [scanline_pixels_new] |
mov esi, [ebx + Image.Data] |
mov edi, [line_buffer] |
@@: mov eax, [esi] |
stosd |
add esi, edx |
dec ecx |
jnz @b |
|
mov eax, [scanline_pixels_new] |
mov edi, [ebx + Image.Data] |
lea esi, [edi + 4] |
mov edx, [scanline_len_old] |
shr edx, 2 |
@@: mov ecx, edx |
rep movsd |
add esi, 4 |
dec eax |
jnz @b |
|
mov eax, [scanline_len_new] |
sub [pixels_ptr], eax |
mov ecx, [scanline_pixels_new] |
mov esi, [line_buffer] |
mov edi, [pixels_ptr] |
rep movsd |
|
pop ecx |
jmp .next_column_ccw_low |
|
.rotate_cw_low: |
mov ebx, [_img] |
mov eax, [ebx + Image.Height] |
mov [scanline_pixels_new], eax |
shl eax, 2 |
mov [scanline_len_new], eax |
|
invoke mem.alloc, eax |
or eax, eax |
jz .error |
mov [line_buffer], eax |
|
mov ecx, [ebx + Image.Width] |
lea eax, [ecx * 4] |
mov [scanline_len_old], eax |
|
mov eax, [scanline_len_new] |
imul eax, ecx |
add eax, [ebx + Image.Data] |
mov [pixels_ptr], eax |
|
.next_column_cw_low: |
dec ecx |
js .exchange_dims |
push ecx |
|
mov edx, [scanline_len_old] |
add [scanline_len_old], -4 |
|
mov ecx, [scanline_pixels_new] |
mov esi, [pixels_ptr] |
add esi, -4 |
mov edi, [line_buffer] |
@@: mov eax, [esi] |
stosd |
sub esi, edx |
dec ecx |
jnz @b |
|
mov eax, [scanline_pixels_new] |
dec eax |
mov edi, [ebx + Image.Data] |
add edi, [scanline_len_old] |
lea esi, [edi + 4] |
mov edx, [scanline_len_old] |
shr edx, 2 |
@@: mov ecx, edx |
rep movsd |
add esi, 4 |
dec eax |
jnz @b |
|
mov eax, [scanline_len_new] |
sub [pixels_ptr], eax |
mov ecx, [scanline_pixels_new] |
mov esi, [line_buffer] |
mov edi, [pixels_ptr] |
rep movsd |
|
pop ecx |
jmp .next_column_cw_low |
|
.flip: |
jmp .exit |
|
.exchange_dims: |
push [ebx + Image.Width] [ebx + Image.Height] |
pop [ebx + Image.Width] [ebx + Image.Height] |
|
.exit: |
invoke mem.free, [line_buffer] |
xor eax, eax |
inc eax |
pop edi esi ebx |
ret |
|
.error: |
invoke mem.free, [line_buffer] |
xor eax, eax |
pop edi esi ebx |
ret |
endp |
|
|
;;================================================================================================;; |
;;////////////////////////////////////////////////////////////////////////////////////////////////;; |
;;================================================================================================;; |
665,36 → 452,7 |
ret |
endp |
|
;;================================================================================================;; |
proc img._.resize_data _img, _width, _height ;////////////////////////////////////////////////////;; |
;;------------------------------------------------------------------------------------------------;; |
;? --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;> --- TBD --- ;; |
;;------------------------------------------------------------------------------------------------;; |
;< --- TBD --- ;; |
;;================================================================================================;; |
push ebx |
mov ebx, [_img] |
mov eax, [_height] |
imul eax, [_width] |
shl eax, 2 |
invoke mem.realloc, [ebx + Image.Data], eax |
or eax, eax |
jz .error |
|
mov [ebx + Image.Data], eax |
push [_width] |
pop [ebx + Image.Width] |
push [_height] |
pop [ebx + Image.Height] |
|
.error: |
pop ebx |
ret |
endp |
|
|
;;================================================================================================;; |
;;////////////////////////////////////////////////////////////////////////////////////////////////;; |
;;================================================================================================;; |
739,8 → 497,5 |
img.encode , 'img.encode' , \ |
img.create , 'img.create' , \ |
img.destroy , 'img.destroy' , \ |
img.count , 'img.count' , \ |
img.lock_bits , 'img.lock_bits' , \ |
img.unlock_bits , 'img.unlock_bits' , \ |
img.flip , 'img.flip' , \ |
img.rotate , 'img.rotate' |
img.unlock_bits , 'img.unlock_bits' |