kolibrios/programs/develop/libraries/libs-dev/libgfx/libgfx.asm
Evgeny Grechnikov (Diamond) f705611d81 * libs-dev: style of exported names changed, ini.get_int -> ini_get_int
* programs which use libs-dev updated accordingly
* libimg: support for .ico and .cur files (icons and cursors)
* kiv: show many different images in one file in one row

git-svn-id: svn://kolibrios.org@1102 a494cfbc-eb01-0410-851d-a64ba20cac60
2009-06-03 21:12:49 +00:00

443 lines
25 KiB
NASM

;;================================================================================================;;
;;//// libgfx.asm //// (c) mike.dld, 2006-2008 ///////////////////////////////////////////////////;;
;;================================================================================================;;
;; ;;
;; 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/>. ;;
;; ;;
;;================================================================================================;;
format MS COFF
public @EXPORT as 'EXPORTS'
include '../../../../proc32.inc'
include '../../../../macros.inc'
purge section;mov,add,sub
include 'libgfx_p.inc'
section '.flat' code readable align 16
mem.alloc dd ?
mem.free dd ?
mem.realloc dd ?
dll.load dd ?
;;================================================================================================;;
proc lib_init ;///////////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? Library entry point (called after library load) ;;
;;------------------------------------------------------------------------------------------------;;
;> eax = pointer to memory allocation routine ;;
;> ebx = pointer to memory freeing routine ;;
;> ecx = pointer to memory reallocation routine ;;
;> edx = pointer to library loading routine ;;
;;------------------------------------------------------------------------------------------------;;
;< eax = 1 (fail) / 0 (ok) (library initialization result) ;;
;;================================================================================================;;
mov [mem.alloc], eax
mov [mem.free], ebx
mov [mem.realloc], ecx
mov [dll.load], edx
xor eax,eax
ret
endp
;;================================================================================================;;
proc gfx.open _open? ;////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push ebx ecx
xor ecx, ecx
cmp byte[_open?], 0
je .lp1
mov eax, 12
mov ebx, 1
int 0x40
jmp @f
.lp1: or ecx, GFX_FLAG_DONT_CLOSE
@@: invoke mem.alloc, sizeof.AGfxContext
xor ebx,ebx
mov [eax + AGfxContext.Flags], ecx
mov [eax + AGfxContext.NullPoint.X], ebx
mov [eax + AGfxContext.NullPoint.Y], ebx
mov [eax + AGfxContext.Caret.X], ebx
mov [eax + AGfxContext.Caret.Y], ebx
mov [eax + AGfxContext.Pen.Color], ebx
mov [eax + AGfxContext.Brush.Color], 0x00FFFFFF
pop ecx ebx
ret
endp
;;================================================================================================;;
proc gfx.close _ctx ;/////////////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ebx
mov ebx, [_ctx]
mov ebx, [ebx + AGfxContext.Flags]
invoke mem.free, [_ctx]
test ebx, GFX_FLAG_DONT_CLOSE
jnz @f
mov eax, 12
mov ebx, 2
int 0x40
@@: pop ebx eax
ret
endp
;;================================================================================================;;
proc gfx.pen.color _ctx, _color ;/////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_ctx]
push [_color]
pop [eax + AGfxContext.Pen.Color]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.brush.color _ctx, _color ;///////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_ctx]
push [_color]
pop [eax + AGfxContext.Brush.Color]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.pixel _ctx, _x, _y ;/////////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ebx ecx edx
mov eax, 1
mov ebx, [_x]
mov ecx, [_y]
mov edx, [_ctx]
mov edx, [edx + AGfxContext.Pen.Color]
int 0x40
pop edx ecx ebx eax
ret
endp
;;================================================================================================;;
proc gfx.move.to _ctx, _x, _y ;///////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_ctx]
push [_x] [_y]
pop [eax + AGfxContext.Caret.Y] [eax+AGfxContext.Caret.X]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.line.to _ctx, _x, _y ;///////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_ctx]
stdcall gfx.line, eax, [eax + AGfxContext.Caret.X], [eax + AGfxContext.Caret.Y], [_x], [_y]
pop eax
stdcall gfx.move.to, [_ctx], [_x], [_y]
ret
endp
;;================================================================================================;;
proc gfx.line _ctx, _x1, _y1, _x2, _y2 ;//////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ebx ecx edx
mov eax, 38
mov ebx, [_x1 - 2]
mov bx, word[_x2]
mov ecx, [_y1 - 2]
mov cx, word[_y2]
mov edx, [_ctx]
mov edx, [edx + AGfxContext.Pen.Color]
int 0x40
pop edx ecx ebx eax
stdcall gfx.move.to, [_ctx], [_x2], [_y2]
ret
endp
;;================================================================================================;;
proc gfx.polyline _ctx, _points, _count ;/////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ecx
mov eax, [_points]
stdcall gfx.move.to, [_ctx], [eax + 0], [eax + 4]
mov ecx, [_count]
dec ecx
add eax, 8
stdcall gfx.polyline.to, [_ctx], eax, ecx
pop ecx eax
ret
endp
;;================================================================================================;;
proc gfx.polyline.to _ctx, _points, _count ;//////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ecx
mov eax, [_points]
mov ecx, [_count]
@@: stdcall gfx.line.to, [_ctx], [eax + 0], [eax + 4]
add eax, 8
loop @b
pop ecx eax
ret
endp
;;================================================================================================;;
proc gfx.fillrect _ctx, _x1, _y1, _x2, _y2 ;//////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax ebx ecx edx
mov eax, 13
mov ebx, [_x1 - 2]
mov bx, word[_x2]
sub bx, word[_x1]
inc bx
mov ecx, [_y1 - 2]
mov cx, word[_y2]
sub cx, word[_y1]
inc cx
mov edx, [_ctx]
mov edx, [edx + AGfxContext.Brush.Color]
int 0x40
pop edx ecx ebx eax
ret
endp
;;================================================================================================;;
proc gfx.fillrect.ex _ctx, _rect ;////////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_rect]
stdcall gfx.fillrect, [_ctx], [eax + ARect.Left], [eax + ARect.Top], \
[eax + ARect.Right], [eax + ARect.Bottom]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.framerect _ctx, _x1, _y1, _x2, _y2 ;/////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
stdcall gfx.move.to, [_ctx], [_x1], [_y1]
stdcall gfx.line.to, [_ctx], [_x2], [_y1]
stdcall gfx.line.to, [_ctx], [_x2], [_y2]
stdcall gfx.line.to, [_ctx], [_x1], [_y2]
stdcall gfx.line.to, [_ctx], [_x1], [_y1]
pop edx ecx ebx eax
ret
endp
;;================================================================================================;;
proc gfx.framerect.ex _ctx, _rect ;///////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_rect]
stdcall gfx.framerect, [_ctx], [eax + ARect.Left], [eax + ARect.Top], \
[eax + ARect.Right], [eax + ARect.Bottom]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.rectangle _ctx, _x1, _y1, _x2, _y2 ;/////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
stdcall gfx.framerect, [_ctx], [_x1], [_y1], [_x2], [_y2]
push [_y2] [_x2] [_y1] [_x1]
inc dword[esp + 0x00]
inc dword[esp + 0x04]
dec dword[esp + 0x08]
dec dword[esp + 0x0C]
stdcall gfx.fillrect, [_ctx]
ret
endp
;;================================================================================================;;
proc gfx.rectangle.ex _ctx, _rect ;///////////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
push eax
mov eax, [_rect]
stdcall gfx.rectangle, [_ctx], [eax + ARect.Left], [eax + ARect.Top], \
[eax + ARect.Right], [eax + ARect.Bottom]
pop eax
ret
endp
;;================================================================================================;;
proc gfx.text _ctx, _text, _len, _x, _y ;/////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
ret
endp
;;================================================================================================;;
proc gfx.text.width _ctx, _text, _len ;///////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
ret
endp
;;================================================================================================;;
proc gfx.text.height _ctx, _text, _len ;//////////////////////////////////////////////////////////;;
;;------------------------------------------------------------------------------------------------;;
;? --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;> --- TBD --- ;;
;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;;
;;================================================================================================;;
ret
endp
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
;! Exported functions section ;;
;;================================================================================================;;
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
;;================================================================================================;;
align 16
@EXPORT:
export \
lib_init , 'lib_init' , \
0x00020002 , 'version' , \
gfx.open , 'gfx_open' , \
gfx.close , 'gfx_close' , \
gfx.pen.color , 'gfx_pen_color' , \
gfx.brush.color , 'gfx_brush_color' , \
gfx.pixel , 'gfx_pixel' , \
gfx.move.to , 'gfx_move_to' , \
gfx.line.to , 'gfx_line_to' , \
gfx.line , 'gfx_line' , \
gfx.polyline , 'gfx_polyline' , \
gfx.polyline.to , 'gfx_polyline_to' , \
gfx.fillrect , 'gfx_fillrect' , \
gfx.fillrect.ex , 'gfx_fillrect_ex' , \
gfx.framerect , 'gfx_framerect' , \
gfx.framerect.ex , 'gfx_framerect_ex' , \
gfx.rectangle , 'gfx_rectangle' , \
gfx.rectangle.ex , 'gfx_rectangle_ex'