kolibrios-gitea/programs/develop/libraries/libs-dev/libimg/wbmp/wbmp.asm
Ivan Baravy d8340e0c31 libimg: wbmp support (easy programming example)
git-svn-id: svn://kolibrios.org@2392 a494cfbc-eb01-0410-851d-a64ba20cac60
2012-02-23 22:49:04 +00:00

181 lines
8.6 KiB
NASM

;;================================================================================================;;
;;//// wbmp.asm //// (c) dunkaist, 2011-2012 /////////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; This file is part of Common development libraries (Libs-Dev). ;;
;; ;;
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
;; of the License, or (at your option) any later version. ;;
;; ;;
;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without ;;
;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;
;; Lesser General Public License for more details. ;;
;; ;;
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev. ;;
;; If not, see <http://www.gnu.org/licenses/>. ;;
;; ;;
;;================================================================================================;;
;; ;;
;; References: ;;
;; 1. WAP WAE Specification ;;
;; http://www.wapforum.org/what/technical/SPEC-WAESpec-19990524.pdf ;;
;; 2. "Converting a BMP picture to WBMP format" ;;
;; by Sajjitha Gunawardana ;;
;; http://www.codeproject.com/KB/graphics/bmp_to_wbmp_converter.aspx ;;
;; ;;
;;================================================================================================;;
;include 'wbmp.inc' ; wbmp is too simple, so we do not need any *.inc files
;;================================================================================================;;
proc img.is.wbmp _data, _length ;/////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Determine if raw data could be decoded (is in wbmp format) ;;
;;------------------------------------------------------------------------------------------------;;
;> _data = raw data as read from file/stream ;;
;> _length = data length ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = false / true ;;
;;================================================================================================;;
push esi
mov esi, [_data]
lodsw
test ax, ax ; two first bytes of any wbmp file are zeros, check this signature
jnz .is_not_wbmp
; but two byte signature is not enough to be sure it is wbmp file
; let's calculate the whole image size and compare it with [_length]
; calculate width first. you can read how this number is stored in wbmp format specification (see "References" above)
xor eax, eax
@@:
shl eax, 7
lodsb
sal al, 1
jc @b
shr eax, 1
add eax, 7
shr eax, 3
mov ecx, eax
; calculate height
xor eax, eax
@@:
shl eax, 7
lodsb
sal al, 1
jc @b
shr eax, 1
imul eax, ecx ; image_size = width*height
; raw file consists of a header and data. our image_size is the size of data only
sub esi, [_data] ; get header size
add eax, esi
cmp eax, [_length]
je .is_wbmp
.is_not_wbmp: ; return 0
pop esi
xor eax, eax
ret
.is_wbmp: ; return 1
pop esi
xor eax, eax
inc eax
ret
endp
;;================================================================================================;;
proc img.decode.wbmp _data, _length, _options ;///////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Decode data into image if it contains correctly formed raw data in wbmp format ;;
;;------------------------------------------------------------------------------------------------;;
;> _data = raw data as read from file/stream ;;
;> _length = data length ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) or pointer to image ;;
;;================================================================================================;;
push ebx edx esi edi
mov esi, [_data]
lodsw
xor eax, eax
@@:
shl eax, 7
lodsb
sal al, 1
jc @b
shr eax, 1
mov ebx, eax
xor eax, eax
@@:
shl eax, 7
lodsb
sal al, 1
jc @b
shr eax, 1
mov edx, eax
push ebx ecx edx
stdcall img.create, ebx, edx, Image.bpp1
pop edx ecx ebx
test eax, eax
jz .quit
mov edi, [eax + Image.Palette]
mov [edi], dword 0xff000000
mov [edi + 4], dword 0xffffffff
add ebx, 7
shr ebx, 3
imul ebx, edx
mov ecx, ebx
mov edi, [eax + Image.Data]
rep movsb
.quit:
pop edi esi edx ebx
ret
endp
;;================================================================================================;;
proc img.encode.wbmp _img, _p_length, _options ;//////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Encode image into raw data in wbmp format ;;
;;------------------------------------------------------------------------------------------------;;
;> _img = pointer to image ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 0 (error) or pointer to encoded data ;;
;< _p_length = encoded data length ;;
;;================================================================================================;;
xor eax, eax
ret
endp
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;! Below are private procs you should never call directly from your code ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;! Below is private data you should never use directly from your code ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;