git-svn-id: svn://kolibrios.org@879 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge)
2008-10-16 12:00:10 +00:00
parent e50ee3e947
commit b3fee1b5e7
10 changed files with 756 additions and 340 deletions
-122
View File
@@ -1,122 +0,0 @@
SRV_GETVERSION equ 0
SOLID_FILL equ 1
LINE2P equ 2
io.handle equ esp
io.code equ esp+4
io.input equ esp+8
io.inp_size equ esp+12
io.output equ esp+16
io.out_size equ esp+20
IOSIZE equ 24
; retval
; ebx= service version
; eax= error code
; 0= no error
; -1= common error
align 4
init_HDraw:
mov eax, 68
mov ebx, 16
mov ecx, szHDraw
int 0x40
mov [HDraw], eax
test eax, eax
jz .fail
push 0 ;storage for version
mov eax, esp
xor ebx, ebx
push 4 ;.out_size
push eax ;.output
push ebx ;.inp_size
push ebx ;.input
push SRV_GETVERSION ;.code
push [HDraw] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, IOSIZE
pop ebx ;version
ret
.fail:
or eax, -1
ret
; param
; eax= color
; ebx= x
; ecx= y
; edx= w
; esi= h
; retval
; eax= error code
align 4
solid_fill:
push esi
push edx
push ecx
push ebx
push eax
xor eax, eax
mov ebx, esp ;FILL
push eax ;.out_size
push eax ;.output
push 5 ;.inp_size
push ebx ;.input
push SOLID_FILL ;.code
push [HDraw] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, (IOSIZE+5*4) ;io_control+FILL
ret
align 4
line2p:
push esi ;y2
push edx ;x2
push ecx ;y1
push ebx ;x1
push eax ;color
xor eax, eax
mov ebx, esp ;LINE2P
push eax ;.out_size
push eax ;.output
push 5 ;.inp_size
push ebx ;.input
push LINE2P ;.code
push [HDraw] ;.handle
mov eax, 68
mov ebx, 17
mov ecx, esp
int 0x40
add esp, (IOSIZE+5*4) ;io_control+LINE2P
ret
align 4
HDraw rd 1
szHDraw db 'HDRAW',0
@@ -0,0 +1,260 @@
REQ_DLL_VER = 1
DLL_ENTRY = 1
HS_HORIZONTAL = 0
HS_VERTICAL = 1
HS_FDIAGONAL = 2
HS_BDIAGONAL = 3
HS_CROSS = 4
HS_DIAGCROSS = 5
SCR_PIXMAP = -1
PX_MEM_SYSTEM = 0
PX_MEM_LOCAL = 1
PX_MEM_GART = 2
PX_MEM_MASK = 3
ARGB32 = ((32 shl 24) or (2 shl 16) or 0x8888)
macro CreateHatch hatch, bkcolor, fcolor
{
pushd fcolor
pushd bkcolor
pushd hatch
call [imp_CreateHatch]
add esp, 3*4
}
macro DestroyBrush brush
{
pushd brush
call [imp_DestroyBrush]
add esp, 4
}
macro CreatePixmap width, height, format, flags
{
pushd flags
pushd format
pushd height
pushd width
call [imp_CreatePixmap]
add esp, 4*4
}
macro DestroyPixmap pixmap
{
pushd pixmap
call [imp_DestroyPixmap]
add esp, 4
};
macro LockPixmap pixmap
{
pushd pixmap
call [imp_LockPixmap]
add esp, 4
}
macro UnlockPixmap pixmap
{
pushd pixmap
call [imp_UnlockPixmap]
add esp, 4
}
macro ClearPixmap pixmap, color
{
pushd color
pushd pixmap
call [imp_ClearPixmap]
add esp, 2*4
}
macro Line pixmap, x0,y0,x1,y1,color
{
pushd color
pushd y1
pushd x1
pushd y0
pushd x0
pushd pixmap
call [imp_Line]
add esp, 6*4
};
macro DrawRect pixmap,x,y,w,h,color,border
{
pushd border
pushd color
pushd h
pushd w
pushd y
pushd x
pushd pixmap
call [imp_DrawRect]
add esp, 7*4
}
macro FillRect pixmap,x,y,w,h,brush,border
{
pushd border
pushd brush
pushd h
pushd w
pushd y
pushd x
pushd pixmap
call [imp_FillRect]
add esp, 7*4
}
macro Blit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h
{
pushd h
pushd w
pushd srcy
pushd srcx
pushd srcpix
pushd dsty
pushd dstx
pushd dstpix
call [imp_Blit]
add esp, 8*4
}
macro TransparentBlit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h, key
{
pushd key
pushd h
pushd w
pushd srcy
pushd srcx
pushd srcpix
pushd dsty
pushd dstx
pushd dstpix
call [imp_TransparentBlit]
add esp, 9*4
}
szPxlib db '/rd/1/lib/pixlib.obj',0
szStart db 'START',0
szVersion db 'version',0
szCreatePixmap db 'CreatePixmap',0
szDestroyPixmap db 'DestroyPixmap',0
szLockPixmap db 'LockPixmap',0
szUnlockPixmap db 'UnlockPixmap',0
szGetPixmapPitch db 'GetPixmapPitch',0
szCreateHatch db 'CreateHatch',0
szCreateMonoBrush db 'CreateMonoBrush',0
szDestroyBrush db 'DestroyBrush',0
szClearPixmap db 'ClearPixmap',0
szLine db 'Line',0
szDrawRect db 'DrawRect',0
szFillRect db 'FillRect',0
szBlit db 'Blit',0
szTransparentBlit db 'TransparentBlit',0
align 4
px_import:
imp_start dd szStart
imp_ver dd szVersion
imp_CreatePixmap dd szCreatePixmap
imp_DestroyPixmap dd szDestroyPixmap
imp_LockPixmap dd szLockPixmap
imp_UnlockPixmap dd szUnlockPixmap
imp_GetPixmapPitch dd szGetPixmapPitch
imp_CreateHatch dd szCreateHatch
imp_CreateMonoBrush dd szCreateMonoBrush
imp_DestroyBrush dd szDestroyBrush
imp_ClearPixmap dd szClearPixmap
imp_Line dd szLine
imp_DrawRect dd szDrawRect
imp_FillRect dd szFillRect
imp_Blit dd szBlit
imp_TransparentBlit dd szTransparentBlit
dd 0
;szBlockClip db 'BlockClip',0
;szLineClip db 'LineClip',0
;imp_BlockClip dd szBlockClip
;imp_LineClip dd szLineClip
align 4
load_pxlib:
mov eax, 68
mov ebx, 19
mov ecx, szPxlib
int 0x40
test eax, eax
jz .fail
mov edx, eax
mov esi, px_import
.import_loop:
lodsd
test eax, eax
jz .import_done
push edx
.import_find:
mov ebx, [edx]
test ebx, ebx
jz .fail ;import_not_found
push eax
@@:
mov cl, [eax]
cmp cl, [ebx]
jnz .import_find_next
test cl, cl
jz .import_found
inc eax
inc ebx
jmp @b
.import_find_next:
pop eax
add edx, 8
jmp .import_find
.import_found:
pop eax
mov eax, [edx+4]
mov [esi-4], eax
pop edx
jmp .import_loop
.import_done:
cmp word [imp_ver], REQ_DLL_VER
jb .fail
cmp word [imp_ver+2], REQ_DLL_VER
ja .fail
push DLL_ENTRY
call [imp_start]
test eax, eax
jz .fail
ret
.fail:
xor eax, eax
ret
@@ -0,0 +1,224 @@
typedef unsigned int u32_t;
typedef unsignet int handle;
typedef unsigned int color_t;
handle CreateHatchBrush(int hatch, color_t bkcolor, color_t fcolor);
Создать штрихованную кисть размером 8х8 пикселей
hatch тип штриховки
bkcolor цвет "0"
fcolor цвет "1"
Возвращаемое значение: логический номер кисти или 0
handle CreateMonoBrush(color_t bkcolor, color_t fcolor,
u32_t bmp0, u32_t bmp1);
Создать монохромную кисть размером 8х8 пикселей
bkcolor цвет "0"
fcolor цвет "1"
bmp0 bmp1 монохромный битмап 8х8 пикселей
Возвращаемое значение: логический номер кисти или 0
void DestroyBrush(handle brush);
Уничтожить кисть.
brush логический номер кисти.
Кисть должна быть создана вызовом CreateHatchBrush или CreateMonoBrush
handle CreatePixmap(unsigned width, unsigned height, u32_t format, u32_t flags);
Создать битмап
width ширина в пикселях. Максимум 2048
height высота в пикселях. Максимум 2048
format формат пикселей. Сейчас поддерживается только ARGB32
flags дополнительные флаги:
PX_MEM_SYSTEM = 0 битмап в системной памяти
PX_MEM_LOCAL = 1 битмап в локальной видеопамяти
PX_MEM_GART = 2 зарезервировано
остальные биты зарезервированы и должны быть 0
Возвращаемое значение: логический номер битмапа в случае успеха или 0
int DestroyPixmap( handle pixmap)
Уничтожить битмап.
pixmap логический номер битмапа.
Битмап должен быть создан CreatePixmap.
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int ClearPixmap(handle pixmap, color_t color)
Заполняет битмап указанным цветом;
pixmap логический номер битмапа. SCR_PIXMAP для первичного экрана.
color цвет в формате ARGB32
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int Line(handle pixmap, int x0, int y0, int x1, int y1, color_t color)
Нарисовать сплошную линию указаного цвета толщиной в 1 пиксель.
pixmap логический номер битмапа в который будет производится отрисовка.
SCR_PIXMAP для первичного экрана
x0,y0 x1,y1 координаты начальной и конечной точек линиии
color цвет в формате ARGB32
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int DrawRect(handle pixmap, int xorg, int yorg,
int width, int height,
color_t dst_color, color_t border)
Нарисовать сплошной прямоугльник указаного цвета c окантовкой.
pixmap логический номер битмапа в который будет производится отрисовка.
SCR_PIXMAP для первичного экрана
xorg,yorg координаты левого верхнего угла прямоугольника в пикселях
width ширина прямоугольника в пикселях
height высота прямоугольника в пикселях
color цвет прямоугольника в формате ARGB32
border цвет окантовки в формате ARGB32. Толщина окантовки 1 пиксел.
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int FillRect(handle pixmap, int xorg, int yorg,
int width, int height,
brush_t *brush, color_t border)
Нарисовать прямоугольник используя кисть
pixmap логический номер битмапа в который будет производится отрисовка.
SCR_PIXMAP для первичного экрана
xorg,yorg координаты левого верхнего угла прямоугольника в пикселях
width ширина прямоугольника в пикселях
height высота прямоугольника в пикселях
brush монохромная кисть размером 8х8 пикселей
border цвет окантовки в формате ARGB32. Толщина окантовки 1 пиксел.
Окантовка не рисуется если альфа компонен цвета равен 0.
Кисть должна быть создана CreateHatch или CreateMonoBrush.
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int Blit(handle dst_pixmap, int dst_x, int dst_y,
handle src_pixmap, int src_x, int src_y,
int width, int height)
Скопировать прямоугольную область пикселей.
dst_pixmap логический номер битмапа в который будет производится
копирование. SCR_PIXMAP для первичного экрана.
dst_x, dst_y координаты левого верхнего угла области назначения
src_pixmap логический номер битмапа - источника пикселей.
SCR_PIXMAP для первичного экрана.
src_x,src_y координаты левого верхнего угла копируемой области
width ширина копируемой области
height высота копируемой области
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
int TransparentBlit(handle dst_pixmap, int dst_x, int dst_y,
handle src_pixmap, int src_x, int src_y,
int width, int height, color_t key)
Скопировать прямоугольную область пикселей используя прозрачный цвет.
dst_pixmap логический номер битмапа в который будет производится
копирование. SCR_PIXMAP для первичного экрана.
dst_x, dst_y координаты левого верхнего угла области назначения
src_pixmap логический номер битмапа - источника пикселей.
SCR_PIXMAP для первичного экрана.
src_x,src_y координаты левого верхнего угла копируемой области
width ширина копируемой области
height высота копируемой области
key прозрачный цвет в формате ARGB32
Функция не копирует пиксели цвет которых совпадает с key.
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.