forked from KolibriOS/kolibrios
301 lines
6.1 KiB
NASM
301 lines
6.1 KiB
NASM
|
;*****************************************************************************
|
||
|
; Rotate 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.
|
||
|
;*****************************************************************************
|
||
|
; Rotate 32b, 24b, 16b, 8b
|
||
|
|
||
|
format MS COFF
|
||
|
|
||
|
public EXPORTS
|
||
|
|
||
|
section '.flat' code readable align 16
|
||
|
|
||
|
;include 'macros.inc'
|
||
|
include '../../../../macros.inc'
|
||
|
;---------------------------------------------------------------------
|
||
|
START:
|
||
|
pushad
|
||
|
mov [pointer],eax
|
||
|
; ebx - direction
|
||
|
; 1 - clockwise, 2 - counter clockwise
|
||
|
; 3 - Left&Right, 4 - Up&Down
|
||
|
mov [direction],ebx
|
||
|
mov eax,[eax+4]
|
||
|
mov [image_file],eax
|
||
|
|
||
|
mov esi,[eax+28]
|
||
|
add esi,eax
|
||
|
; mov ecx,[eax+32]
|
||
|
; xor ebx,ebx
|
||
|
; mov [raw_area],ebx
|
||
|
mov ebx,[eax+12]
|
||
|
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+4]
|
||
|
imul ebx,[bytes_to_pixel]
|
||
|
mov [size_x],ebx
|
||
|
mov ebx,[eax+8]
|
||
|
imul ebx,[bytes_to_pixel]
|
||
|
mov [size_y],ebx
|
||
|
|
||
|
call .get_memory
|
||
|
|
||
|
cmp [direction],1
|
||
|
jne @f
|
||
|
call .clockwise
|
||
|
jmp .end
|
||
|
@@:
|
||
|
cmp [direction],2
|
||
|
jne @f
|
||
|
call .counter_clockwise
|
||
|
jmp .end
|
||
|
@@:
|
||
|
cmp [direction],3
|
||
|
jne @f
|
||
|
call .Left_Right
|
||
|
jmp .end
|
||
|
@@:
|
||
|
cmp [direction],4
|
||
|
jne .exit
|
||
|
call .Up_Down
|
||
|
.end:
|
||
|
xchg esi,edi
|
||
|
mov ecx,[image_file]
|
||
|
mov eax,[ecx+4]
|
||
|
imul eax,[bytes_to_pixel]
|
||
|
imul eax,[ecx+8]
|
||
|
|
||
|
mov ecx,eax
|
||
|
cld
|
||
|
rep movsb
|
||
|
|
||
|
mov ecx,[raw_area]
|
||
|
mcall 68,13
|
||
|
;---------------------------------------------------------------------
|
||
|
.ret_ok:
|
||
|
cmp [direction],1
|
||
|
jne @f
|
||
|
call .XY_data_exchange
|
||
|
jmp .exit
|
||
|
@@:
|
||
|
cmp [direction],2
|
||
|
jne .exit
|
||
|
call .XY_data_exchange
|
||
|
.exit:
|
||
|
popad
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.XY_data_exchange:
|
||
|
mov ecx,[image_file]
|
||
|
mov eax,[ecx+4]
|
||
|
mov ebx,[ecx+8]
|
||
|
mov [ecx+8],eax
|
||
|
mov [ecx+4],ebx
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.clockwise:
|
||
|
push edi esi
|
||
|
|
||
|
add edi,[size_y]
|
||
|
sub edi,[bytes_to_pixel]
|
||
|
.y:
|
||
|
push edi
|
||
|
push ebx
|
||
|
.x:
|
||
|
call ebp
|
||
|
add edi,[size_y]
|
||
|
dec ebx
|
||
|
jnz .x
|
||
|
|
||
|
pop ebx
|
||
|
pop edi
|
||
|
|
||
|
sub edi,[bytes_to_pixel]
|
||
|
dec ecx
|
||
|
jnz .y
|
||
|
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.counter_clockwise:
|
||
|
push edi esi
|
||
|
|
||
|
mov eax,[eax+4]
|
||
|
dec eax
|
||
|
imul eax,[size_y]
|
||
|
add edi,eax
|
||
|
.y1:
|
||
|
push edi
|
||
|
push ebx
|
||
|
.x1:
|
||
|
call ebp
|
||
|
sub edi,[size_y]
|
||
|
dec ebx
|
||
|
jnz .x1
|
||
|
|
||
|
pop ebx
|
||
|
pop edi
|
||
|
|
||
|
add edi,[bytes_to_pixel]
|
||
|
dec ecx
|
||
|
jnz .y1
|
||
|
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.Left_Right:
|
||
|
push edi esi
|
||
|
add edi,[size_x]
|
||
|
.y2:
|
||
|
push edi
|
||
|
push ebx
|
||
|
.x2:
|
||
|
sub edi,[bytes_to_pixel]
|
||
|
call ebp
|
||
|
dec ebx
|
||
|
jnz .x2
|
||
|
|
||
|
pop ebx
|
||
|
pop edi
|
||
|
|
||
|
add edi,[size_x]
|
||
|
dec ecx
|
||
|
jnz .y2
|
||
|
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.Up_Down:
|
||
|
push edi esi
|
||
|
|
||
|
mov eax,[eax+8]
|
||
|
dec eax
|
||
|
imul eax,[size_x]
|
||
|
add edi,eax
|
||
|
.y3:
|
||
|
push edi
|
||
|
push ebx
|
||
|
.x3:
|
||
|
call ebp
|
||
|
add edi,[bytes_to_pixel]
|
||
|
dec ebx
|
||
|
jnz .x3
|
||
|
|
||
|
pop ebx
|
||
|
pop edi
|
||
|
|
||
|
sub edi,[size_x]
|
||
|
dec ecx
|
||
|
jnz .y3
|
||
|
|
||
|
pop esi edi
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.32:
|
||
|
cld
|
||
|
lodsd
|
||
|
mov [edi],eax
|
||
|
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.24:
|
||
|
cld
|
||
|
lodsw
|
||
|
mov [edi],ax
|
||
|
lodsb
|
||
|
mov [edi+2],al
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.16:
|
||
|
cld
|
||
|
lodsw
|
||
|
mov [edi],ax
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.8:
|
||
|
cld
|
||
|
lodsb
|
||
|
mov [edi],al
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
.get_memory:
|
||
|
mov ecx,[eax+4]
|
||
|
imul ecx,[eax+8]
|
||
|
imul ecx,[bytes_to_pixel]
|
||
|
push eax
|
||
|
mcall 68,12
|
||
|
mov [raw_area],eax
|
||
|
mov edi,eax
|
||
|
pop eax
|
||
|
mov ebx,[eax+4]
|
||
|
mov ecx,[eax+8]
|
||
|
ret
|
||
|
;---------------------------------------------------------------------
|
||
|
align 16
|
||
|
EXPORTS:
|
||
|
dd szStart, START
|
||
|
dd szVersion, 0x00010001
|
||
|
dd 0
|
||
|
|
||
|
szStart db 'START',0
|
||
|
szVersion db 'version',0
|
||
|
|
||
|
pointer dd 0
|
||
|
image_file dd 0
|
||
|
direction dd 0
|
||
|
size_x dd 0
|
||
|
size_y dd 0
|
||
|
bytes_to_pixel dd 0
|
||
|
;delta dd 0
|
||
|
;resolution dd 0
|
||
|
;compression dd 0
|
||
|
raw_area dd 0
|