kolibrios-gitea/programs/media/zsea/plugins/scaling/scaling.asm

544 lines
10 KiB
NASM
Raw Normal View History

;*****************************************************************************
; Scaling RAW image plugin - for zSea image viewer
; Copyright (c) 2009 - 2011, Marat Zakiyanov aka Mario79, aka Mario
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; * Neither the name of the <organization> nor the
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
; Scaling 32b, 24b, 16b, 8b
format MS COFF
public EXPORTS
section '.flat' code readable align 16
;include 'macros.inc'
include '../../../../macros.inc'
;---------------------------------------------------------------------
START:
pushad
mov eax,dword [esp+60] ; eax - crop size
mov ebx,eax
and eax,0xffff
shr ebx,16
mov [crop_x],ebx
mov [crop_y],eax
mov edi,dword [esp+56] ; edi - background color
mov esi,dword [esp+52] ; esi - filtering
mov edx,dword [esp+48] ; edx - scaling mode
mov ecx,dword [esp+44] ; ecx - start_coordinates
mov ebx,dword [esp+40] ; ebx - new_size
mov eax,dword [esp+36] ; eax - convert data table
mov [pointer],eax
test bx,bx
jnz @f
inc bx
@@:
ror ebx,16
test bx,bx
jnz @f
inc bx
@@:
rol ebx,16
mov [new_size],ebx
mov [start_coordinates],ecx
mov [scaling_mode],edx
mov [filtering],esi
mov [background_color],edi
mov eax,[eax+4]
mov [image_file],eax
mov esi,[eax+28]
add esi,eax
mov ebx,[eax+20]
add ebx,eax
mov [palette],ebx
mov ebx,[eax+12]
mov [resolution],ebx
cmp ebx,32
jne @f
mov ebp,dword START.32
jmp .1
@@:
cmp ebx,24
jne @f
mov ebp,dword START.24
jmp .1
@@:
cmp ebx,16
jne @f
mov ebp,dword START.16
jmp .1
@@:
cmp ebx,15
jne @f
inc ebx
mov ebp,dword START.16
jmp .1
@@:
cmp ebx,8
jne @f
mov ebp,dword START.8
@@:
.1:
shr ebx,3
mov [bytes_to_pixel],ebx
mov ebx,[eax+8]
mov [y],ebx
mov ebx,[eax+4]
mov [x],ebx
imul ebx,[bytes_to_pixel]
mov [size_x],ebx
mov eax,[crop_y]
test eax,eax
jz @f
mov [y],eax
@@:
mov eax,[crop_x]
test eax,eax
jz @f
mov [x],eax
@@:
mov eax,100
shl eax,12
mov ebx,[scaling_mode]
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
mov [scaling_delta],eax
call .get_memory
call .scaling
;---------------------------------------------------------------------
.ret_ok:
mcall 68,13,[area_for_x]
mov ebx,[pointer]
mov eax,[raw_area]
mov [ebx+20],eax ; store RAW pointer
; movzx eax,word [new_size.x1]
; mov [ebx+24],esi ;eax
; movzx eax,word [new_size.y1]
; mov [ebx+28],eax
; mov eax,[size_x]
; mov [ebx+32],eax
; mov eax,[bytes_to_pixel]
; mov [ebx+36],eax
; mov eax,[x]
; mov [ebx+40],eax
; mov eax,[y]
; mov [ebx+44],eax
.exit:
popad
ret 28
;---------------------------------------------------------------------
align 4
.scaling:
xor eax,eax
mov ax,[start_coordinates.y]
imul eax,[size_x]
add esi,eax
xor eax,eax
mov ax,[start_coordinates.x]
imul eax,[bytes_to_pixel]
add esi,eax
xor eax,eax
dec eax
mov [temp_y],eax
xor ecx,ecx
align 4
.y_2:
xor ebx,ebx
;-------------------------
align 4
.x_2:
call ebp
inc ebx
cmp bx,[new_size.x1]
jb .x_2
;-------------------------
inc ecx
cmp cx,[new_size.y1]
jb .y_2
ret
;---------------------------------------------------------------------
align 4
.32:
push ecx ebx
call .calculate_pixel
mov eax,[ecx]
call .check_filtering_32
pop ebx ecx
cld
stosd
ret
;---------------------------------------------------------------------
align 4
.24:
push ecx ebx
call .calculate_pixel
mov eax,[ecx]
call .check_filtering_24
cld
stosw
shr eax,16
pop ebx ecx
cld
stosb
ret
;---------------------------------------------------------------------
align 4
.16:
push ecx ebx
call .calculate_pixel
xor eax,eax
mov ax,[ecx]
call .check_filtering_16
pop ebx ecx
cld
stosw
ret
;---------------------------------------------------------------------
align 4
.8:
push ecx ebx
call .calculate_pixel
cmp [filtering],0
jne @f
mov al,[ecx]
pop ebx ecx
cld
stosb
ret
@@:
call .check_filtering_8
cld
stosw
shr eax,16
pop ebx ecx
cld
stosb
ret
;---------------------------------------------------------------------
align 4
.calculate_pixel:
test ecx,ecx
jz .offset_x
;.offset_y:
mov eax,ecx
mov ecx,[temp_y]
cmp eax,ecx
jne .new_y
mov eax,[temp_y_offset]
mov ecx,eax
jmp .offset_x
;--------------------------------
align 4
.new_y:
mov [temp_y],eax
mov ebx,[scaling_mode]
test ebx,ebx
jz @f
imul eax,[scaling_delta]
;--------------------------------
push ebx
mov ebx,eax
shr eax,12
and ebx,0xFFF
shl ebx,7 ;multiply 128
shr ebx,12
mov [next_pixel_y],ebx
pop ebx
;--------------------------------
jmp .ex_1
;--------------------------------
align 4
@@:
imul eax,dword [y]
;--------------------------------
align 4
@@:
mov bx,word [new_size.y1]
;--------------------------------
align 4
.y_div:
test ebx,ebx
jnz @f
inc ebx
;--------------------------------
align 4
@@:
xor edx,edx
div ebx
;--------------------------------
push eax
mov eax,edx
shl eax,7 ;multiply 128
xor edx,edx
div ebx
mov [next_pixel_y],eax
pop eax
;--------------------------------
align 4
.ex_1:
mov [temp_y1],eax
imul eax,[size_x]
mov [temp_y_offset],eax
mov ecx,eax
align 4
.offset_x:
test ebx,ebx
jz .finish
mov eax,[esp+4] ;ebx
mov edx,[esp+8]
test edx,edx
jz .continue
shl eax,3
add eax,[area_for_x]
mov edx,[eax+4]
mov [next_pixel_x],edx
mov eax,[eax]
jmp .ex_3
;--------------------------------
align 4
.continue:
mov ebx,[scaling_mode]
test ebx,ebx
jz @f
imul eax,[scaling_delta]
;--------------------------------
mov ebx,eax
shr eax,12
and ebx,0xFFF
shl ebx,7 ;multiply 128
shr ebx,12
mov [next_pixel_x],ebx
;--------------------------------
jmp .ex_2
;--------------------------------
align 4
@@:
imul eax,dword [x]
;--------------------------------
align 4
@@:
mov bx,word [new_size.x1]
;--------------------------------
align 4
.x_div:
test ebx,ebx
jnz @f
inc ebx
align 4
@@:
xor edx,edx
div ebx
;--------------------------------
push eax
mov eax,edx
shl eax,7 ;multiply 128
xor edx,edx
div ebx
mov [next_pixel_x],eax
pop eax
;--------------------------------
align 4
.ex_2:
mov edx,[bytes_to_pixel]
mov ebx,eax
xor eax,eax
align 4
@@:
add eax,ebx
dec edx
jnz @r
mov ebx,[esp+4]
shl ebx,3
add ebx,[area_for_x]
mov [ebx],eax
mov edx,[next_pixel_x]
mov [ebx+4],edx
align 4
.ex_3:
mov [temp_x1],eax
add ecx,eax
align 4
.finish:
add ecx,esi
ret
;---------------------------------------------------------------------
align 4
.get_memory:
xor ecx,ecx
mov cx,[new_size.x1]
shl ecx,3
mcall 68,12
mov [area_for_x],eax
xor ecx,ecx
mov ebx,[new_size]
mov cx,bx
shr ebx,16
imul ecx,ebx ;[eax+8]
mov eax,[bytes_to_pixel]
cmp eax,1
jne @f
mov eax,3
@@:
imul ecx,eax
mov edx,ecx
add ecx,44
mov eax,[image_file]
add ecx,[eax+24] ;palette area size
mcall 68,12
mov [raw_area],eax
mov edi,eax
; create RAW header
push esi
mov esi,[image_file]
mov ecx,44/4
cld
rep movsd ;copy the 3 first dword for the structure of RAW
mov edi,[raw_area]
movzx eax,word [new_size.x1]
mov [edi+4],eax
movzx eax,word [new_size.y1]
mov [edi+8],eax
mov [edi+32],edx ;rgb area size
xor eax,eax
mov [edi+36],eax ;transparency area pointer
mov [edi+40],eax ;transparency area size
cmp [filtering],eax ;0 or 1
je @f
mov [edi+20],eax ;palette area pointer
mov [edi+24],eax ;palette area size
mov [edi+28],dword 44 ;rgb area pointer
cmp [edi+12],dword 8 ;overall depth of the pixel
ja .not_overall_depth_8
mov [edi+12],dword 24 ;overall depth of the pixel
mov [edi+16],word 8 ;channel depth of the pixel
.not_overall_depth_8:
add edi,44
jmp .end
@@:
mov eax,[edi+24]
add edi,44
test eax,eax ;palette area is present?
jz @f
sub esi,44
mov ecx,[esi+24]
shr ecx,2
add esi,[esi+20]
cld
rep movsd ;copy palette area
@@:
.end:
pop esi
ret
;---------------------------------------------------------------------
include 'b_filter.inc'
;---------------------------------------------------------------------
align 4
EXPORTS:
dd szStart, START
dd szVersion, 0x00010003
dd 0
szStart db 'START',0
szVersion db 'version',0
align 4
pointer dd 0
image_file dd 0
new_size:
.y1: dw 0
.x1: dw 0
x: dd 0
y: dd 0
crop_x dd 0
crop_y dd 0
size_x dd 0
bytes_to_pixel dd 0
start_coordinates:
.y dw 0
.x dw 0
scaling_mode dd 0
raw_area dd 0
scaling_delta dd 0
area_for_x dd 0
temp_y dd 0
temp_y_offset dd 0
resolution dd 0
filtering dd 0
next_pixel_y dd 0
next_pixel_x dd 0
temp_y1 dd 0
temp_x1 dd 0
B_sample dd 0
G_sample dd 0
R_sample dd 0
B_sample_1 dd 0
G_sample_1 dd 0
R_sample_1 dd 0
palette dd 0
background_color dd 0