/kernel/branches/Kolibri-acpi/gui/charUni.mt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Deleted: svn:mime-type |
-application/octet-stream |
\ No newline at end of property |
/kernel/branches/Kolibri-acpi/gui/char.mt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/kernel/branches/Kolibri-acpi/gui/mouse.inc |
---|
9,9 → 9,9 |
include 'mousepointer.inc' |
;================================ |
;/////// public functions /////// |
;================================ |
;============================================================================== |
;///// public functions /////////////////////////////////////////////////////// |
;============================================================================== |
mouse.LEFT_BUTTON_FLAG = 0001b |
mouse.RIGHT_BUTTON_FLAG = 0010b |
36,10 → 36,14 |
mouse.WINDOW_RESIZE_E_FLAG |
align 4 |
;----------------------------------------------------------------- |
mouse_check_events: |
; Check if mouse buttons state or cursor position has changed |
;------------------------------------------------------------------------------ |
mouse_check_events: ;////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Check if mouse buttons state or cursor position has changed and call |
;? appropriate handlers |
;------------------------------------------------------------------------------ |
push eax ebx |
mov al, [BTN_DOWN] |
mov bl, [mouse.state.buttons] |
and al, mouse.BUTTONS_MASK |
59,8 → 63,8 |
; yes it is, activate window user is pointing at, if needed |
call mouse._.activate_sys_window_under_cursor |
; NOTE: this code wouldn't be necessary if we knew |
; that window did already redraw itself after call above |
; NOTE: this code wouldn't be necessary if we knew window did |
; already redraw itself after call above |
or eax, eax |
jnz .exit |
158,9 → 162,9 |
jnz mouse._.middle_button_press_handler |
jmp mouse._.middle_button_release_handler |
;=============================== |
;////// private functions ////// |
;=============================== |
;============================================================================== |
;///// private functions ////////////////////////////////////////////////////// |
;============================================================================== |
uglobal |
mouse.state: |
168,7 → 172,7 |
.buttons db ? |
; NOTE: since there's no unique and lifetime-constant button identifiers, |
; we are using two dwords to identify each of them: |
; we're using two dwords to identify each of them: |
; * pbid - process slot (high 8 bits) and button id (low 24 bits) pack |
; * coord - left (high 16 bits) and top (low 16 bits) coordinates pack |
align 4 |
187,25 → 191,12 |
.action db ? |
endg |
iglobal |
fl_moving db 0 |
rb 3 |
endg |
align 4 |
;----------------------------------------------------------------- |
mouse._.left_button_press_handler: |
; Called when left mouse button has been pressed down |
bts word [BTN_DOWN], 8 |
mov eax, [timer_ticks] |
mov ebx, eax |
xchg ebx, [mouse.active_sys_window.last_ticks] |
sub eax, ebx |
movzx ebx, [mouse_doubleclick_delay] |
cmp eax, ebx |
jg @f |
bts dword [BTN_DOWN], 24 |
@@: |
;------------------------------------------------------------------------------ |
mouse._.left_button_press_handler: ;/////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when left mouse button has been pressed down |
;------------------------------------------------------------------------------ |
test [mouse.state.buttons], not mouse.LEFT_BUTTON_FLAG |
jnz .exit |
219,8 → 210,12 |
test dl, mouse.WINDOW_MOVE_FLAG |
jz @f |
bt dword [BTN_DOWN], 24 |
jnc @f |
mov eax, [timer_ticks] |
mov ebx, eax |
xchg ebx, [mouse.active_sys_window.last_ticks] |
sub eax, ebx |
cmp eax, 50 |
jg @f |
mov [mouse.active_sys_window.last_ticks], 0 |
call sys_window_maximize_handler |
259,6 → 254,9 |
call .calculate_e_delta |
.call_window_handler: |
; mov eax, mouse.active_sys_window.old_box |
; call sys_window_start_moving_handler |
.exit: |
ret |
289,10 → 287,11 |
ret |
align 4 |
;----------------------------------------------------------------- |
mouse._.left_button_release_handler: |
; Called when left mouse button has been released |
bts dword [BTN_DOWN], 16 |
;------------------------------------------------------------------------------ |
mouse._.left_button_release_handler: ;///////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when left mouse button has been released |
;------------------------------------------------------------------------------ |
xor esi, esi |
xchg esi, [mouse.active_sys_window.pslot] |
or esi, esi |
311,38 → 310,60 |
.exit: |
and [mouse.active_sys_window.action], 0 |
mov [fl_moving], 0 |
ret |
mouse._.right_button_press_handler: |
bts word [BTN_DOWN], 9 |
align 4 |
;------------------------------------------------------------------------------ |
mouse._.right_button_press_handler: ;////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when right mouse button has been pressed down |
;------------------------------------------------------------------------------ |
test [mouse.state.buttons], not mouse.RIGHT_BUTTON_FLAG |
jnz @f |
jnz .exit |
call mouse._.find_sys_window_under_cursor |
call mouse._.check_sys_window_actions |
test al, mouse.WINDOW_MOVE_FLAG |
jz @f |
jmp sys_window_rollup_handler |
jz .exit |
mouse._.right_button_release_handler: |
bts dword [BTN_DOWN], 17 |
@@: |
call sys_window_rollup_handler |
.exit: |
ret |
mouse._.middle_button_press_handler: |
bts word [BTN_DOWN], 10 |
align 4 |
;------------------------------------------------------------------------------ |
mouse._.right_button_release_handler: ;//////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when right mouse button has been released |
;------------------------------------------------------------------------------ |
ret |
mouse._.middle_button_release_handler: |
bts dword [BTN_DOWN], 18 |
align 4 |
;------------------------------------------------------------------------------ |
mouse._.middle_button_press_handler: ;///////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when middle mouse button has been pressed down |
;------------------------------------------------------------------------------ |
ret |
align 4 |
;----------------------------------------------------------------- |
mouse._.move_handler: |
; Called when cursor has been moved |
;------------------------------------------------------------------------------ |
mouse._.middle_button_release_handler: ;/////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when middle mouse button has been released |
;------------------------------------------------------------------------------ |
ret |
align 4 |
;------------------------------------------------------------------------------ |
mouse._.move_handler: ;//////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Called when cursor has been moved |
;------------------------------------------------------------------------------ |
;> eax = old x coord |
;> ebx = old y coord |
;------------------------------------------------------------------------------ |
cmp [mouse.active_sys_button.pbid], 0 |
jnz .exit |
486,19 → 507,6 |
pop esi |
je .exit |
test [fl_moving], 1 |
jnz @f |
mov [fl_moving], 1 |
push edi |
mov edi, esi |
shl edi, 5 |
add edi, WDATA.box + window_data |
call window._.draw_negative_box |
pop edi |
@@: |
mov [mouse.active_sys_window.last_ticks], 0 |
call sys_window_moving_handler |
506,12 → 514,15 |
ret |
align 4 |
;----------------------------------------------------------------- |
mouse._.find_sys_window_under_cursor: |
; Find system window object which is currently visible on screen |
; and has mouse cursor within its bounds |
;------------------------------------------------------------------------------ |
mouse._.find_sys_window_under_cursor: ;//////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Find system window object which is currently visible on screen and has |
;? mouse cursor within its bounds |
;------------------------------------------------------------------------------ |
;< esi = process slot |
;< edi = pointer to WDATA struct |
;------------------------------------------------------------------------------ |
mov esi, [mouse.state.pos.y] |
mov esi, [d_width_calc_area + esi*4] |
524,8 → 535,11 |
ret |
align 4 |
;----------------------------------------------------------------- |
mouse._.activate_sys_window_under_cursor: |
;------------------------------------------------------------------------------ |
mouse._.activate_sys_window_under_cursor: ;//////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
; activate and redraw window under cursor (if necessary) |
call mouse._.find_sys_window_under_cursor |
movzx esi, word[WIN_STACK + esi * 2] |
533,12 → 547,15 |
jmp waredraw |
align 4 |
;----------------------------------------------------------------- |
mouse._.find_sys_button_under_cursor: |
; Find system button object which is currently visible on screen |
; and has mouse cursor within its bounds |
;------------------------------------------------------------------------------ |
mouse._.find_sys_button_under_cursor: ;//////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Find system button object which is currently visible on screen and has |
;? mouse cursor within its bounds |
;------------------------------------------------------------------------------ |
;< eax = pack[8(process slot), 24(button id)] or 0 |
;< ebx = pack[16(button x coord), 16(button y coord)] |
;------------------------------------------------------------------------------ |
push ecx edx esi edi |
call mouse._.find_sys_window_under_cursor |
595,9 → 612,13 |
ret |
align 4 |
;----------------------------------------------------------------- |
mouse._.check_sys_window_actions: |
;------------------------------------------------------------------------------ |
mouse._.check_sys_window_actions: ;//////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;< eax = action flags or 0 |
;------------------------------------------------------------------------------ |
; is window movable? |
test byte[edi + WDATA.cl_titlebar + 3], 0x01 |
jnz .no_action |
617,7 → 638,7 |
; no there isn't, can it be resized then? |
mov dl, [edi + WDATA.fl_wstyle] |
and dl, 0x0f |
; NOTE: dangerous optimization, revise if window types changed |
; NOTE: dangerous optimization, revise if window types changed; |
; this currently implies only types 2 and 3 could be resized |
test dl, 2 |
jz .no_action |
/kernel/branches/Kolibri-acpi/gui/font.inc |
---|
7,823 → 7,230 |
$Revision$ |
;------------------------------------------------------------------------------ |
align 4 |
dtext_asciiz_esi: ; for skins title out |
push eax |
xor eax, eax |
inc eax |
jmp dtext.1 |
;------------------------------------------------------------------------------ |
align 4 |
dtext: |
; edx -> string |
; esi = number of characters |
; ebx = output coordinates XXXXYYYY h |
; ecx = char color and flags flRRGGBB h |
; fl = ZBFFRSSS b |
; Z=1: edx -> zero terminated string, esi = ? |
; B=1: fill background with color eax |
; R=1: edi -> user area for redirect |
; FF=3: UTF-8 8x16, FF=2: UTF-16LE 8x16 |
; FF=1: cp866 8x16, FF=0: cp866 6x9 |
; SSS = (font multiplier)-1 |
; edi=1: force output |
and eax, 0xFFFFFF |
bt ecx, 30 |
jc @f |
; ebx x & y |
; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB ) |
; X = ABnnb: |
; nn = font |
; A = 0 <=> output esi characters; otherwise output ASCIIZ string |
; B = 1 <=> fill background with color eax |
; edx start of text |
; edi 1 force or user area for redirect |
push eax |
xor eax, eax |
dec eax |
@@: |
pushd 0 0 0 eax |
movsx eax, bx |
sar ebx, 16 |
push eax ebx edi |
bt ecx, 27 |
jc .redirect |
mov ebp, [_display.width] |
xor edi, edi |
jmp @f |
.ret: |
add esp, 28 |
ret |
.redirect: |
mov ebp, [edi] |
add edi, 8 |
@@: |
shl ebp, 2 |
imul eax, ebp |
shl ebx, 2 |
add eax, ebx |
js .ret |
add edi, eax |
mov eax, ecx |
mov ebx, ecx |
;-------------------------------------- |
align 4 |
.1: |
pushad |
movsx eax, bx ; eax=y |
sar ebx, 16 ; ebx=x |
xchg eax, ebx ; eax=x, ebx=y |
cmp esi, 255 |
jb .loop |
mov esi, 255 |
;-------------------------------------- |
align 4 |
.loop: |
test ecx, ecx |
jns @f |
mov esi, 256 |
@@: |
shr ecx, 24 |
and cl, 7 |
inc ecx |
push ebp ecx esi |
mov esi, edx |
or eax, 0xFF000000 |
bt ebx, 27 |
jc .bufferReady |
mov eax, 9 |
test ebx, 0x30000000 |
jz @f |
add eax, 7 |
@@: |
imul eax, ecx |
mov [esp+32], eax |
imul ebp, eax |
stdcall kernel_alloc, ebp |
mov ecx, ebp |
shr ecx, 2 |
mov [esp+36], eax |
sub edi, eax |
mov edx, eax |
mov eax, [esp+24] |
cmp eax, -1 |
jnz @f |
mov [esp+28], edi |
@@: |
mov edi, edx |
rep stosd |
mov edi, edx |
mov eax, ebx |
and eax, 0xFFFFFF |
.bufferReady: |
mov ebp, eax |
xor edx, edx |
bt ebx, 29 |
jc @f |
bt ebx, 28 |
jc .draw866toUni |
jmp .draw866 |
@@: |
bt ebx, 28 |
jc .drawUTF8 |
js .test_asciiz |
; ebp = font color |
; esi -> string |
; edi -> buffer |
dec esi |
js .end |
; Stack map: |
; char counter +0 |
fontMultiplier = 4 |
widthX = 8 |
; edi +12 |
; X +16 |
; Y +20 |
; background +24 |
deltaToScreen = 28 |
; temp buffer height +32 |
; temp buffer pointer +36 |
jmp @f |
;-------------------------------------- |
align 4 |
.test_asciiz: |
cmp byte [edx], 0 |
jz .end |
.drawUTF16: |
dec dword [esp] |
js .done |
movzx ebx, word [esi] |
test ebx, ebx |
jz .done |
inc esi |
inc esi |
cmp bx, 1419 |
jc @f |
xor ebx, ebx |
@@: |
pushd esi edi 16 |
shl ebx, 4 |
add ebx, fontUni |
mov esi, [esp+12+fontMultiplier] |
call drawChar |
imul esi, 8*4 |
pop edi |
pop edi |
add edi, esi |
pop esi |
jmp .drawUTF16 |
cmp byte [esp+28], 1 |
jne @f |
.drawUTF8: |
dec dword [esp] |
js .done |
dec esi |
js .end |
;-------------------------------------- |
align 4 |
@@: |
movzx ebx, byte [esi] |
inc esi |
test bl, bl |
jz .done |
jns .valid |
shl bx, 10 |
jnc @b |
mov bl, [esi] |
test bl, bl |
jns @b |
shl bl, 2 |
jc @b |
shr bh, 2 |
shr bx, 2 |
inc esi |
cmp bx, 1419 |
jc .valid |
shl bh, 4 |
jns @f |
.tail: |
mov bl, [esi] |
shl bl, 1 |
jnc @b |
js @b |
inc esi |
shl bh, 1 |
js .tail |
@@: |
xor ebx, ebx |
.valid: |
pushd esi edi 16 |
shl ebx, 4 |
add ebx, fontUni |
mov esi, [esp+12+fontMultiplier] |
call drawChar |
imul esi, 8*4 |
pop edi |
pop edi |
add edi, esi |
pop esi |
jmp .drawUTF8 |
inc edx |
pushad |
movzx edx, byte [edx-1] |
test ecx, 0x10000000 |
jnz .font2 |
.draw866: |
dec dword [esp] |
js .done |
movzx ebx, byte [esi] |
test ebx, ebx |
jz .done |
inc esi |
pushd esi edi 9 |
lea ebx, [ebx*8+ebx+font1] |
mov esi, [esp+12+fontMultiplier] |
call drawChar |
imul esi, 6*4 |
pop edi |
pop edi |
add edi, esi |
pop esi |
jmp .draw866 |
mov esi, 9 |
lea ebp, [FONT_I+8*edx+edx] |
;-------------------------------------- |
align 4 |
.symloop1: |
mov dl, byte [ebp] |
or dl, 1 shl 6 |
;-------------------------------------- |
align 4 |
.pixloop1: |
shr dl, 1 |
jz .pixloop1end |
.draw866toUni: |
dec dword [esp] |
js .done |
movzx eax, byte [esi] |
test eax, eax |
jz .done |
call ansi2uni_char |
shl eax, 4 |
lea ebx, [eax+fontUni] |
inc esi |
pushd esi edi 16 |
mov esi, [esp+12+fontMultiplier] |
call drawChar |
imul esi, 8*4 |
pop edi |
pop edi |
add edi, esi |
pop esi |
jmp .draw866toUni |
jnc .nopix |
.done: |
mov ecx, edi |
pop eax eax eax esi edx ebx ebp ebp ebp |
mov edi, [esp] |
test edi, edi |
jnz @f |
pop eax |
ret |
@@: ; redraw from buffer to screen |
push eax |
sub ecx, edi |
shr ecx, 2 |
add edx, ecx |
inc ecx |
push ecx |
push edi |
.drawPicture: |
mov eax, -1 |
repz scasd |
jcxz @f |
mov eax, edx |
sub eax, ecx |
push ecx |
mov ecx, [edi-4] |
xchg esi, edi |
call __sys_putpixel |
xchg esi, edi |
pop ecx |
jmp .drawPicture |
@@: |
pop edi |
mov ecx, [esp] |
add edi, [esp+4] |
inc ebx |
push edi |
dec ebp |
jnz .drawPicture |
add esp, 12 |
call kernel_free |
ret |
test ecx, 0x08000000 ; redirect the output to the user area |
jz @f |
; scaling/smoothing algorithm |
drawChar: |
; ebp = font color |
; esi = font multiplier |
; edi -> buffer |
; ebx -> char data |
mov dl, [ebx] |
.raw: |
bsf eax, edx |
jz .nextRaw |
imul eax, esi |
shl eax, 2 |
push edi |
add edi, eax |
mov ecx, esi |
dec esi |
jnz .square |
mov [edi], ebp |
inc esi |
cmp [fontSmoothing], 0 |
jz .nextPixel |
.checkLeftSM: ; smoothing |
bsf eax, edx |
dec eax |
js .checkRightSM |
bt [ebx], eax |
jc .checkRightSM |
dec eax |
js .checkLeftDownSM |
bt [ebx], eax |
jc .checkRightSM |
.checkLeftDownSM: |
inc eax |
bt [ebx+1], eax |
jnc .checkLeftUpSM |
inc eax |
bt [ebx+1], eax |
jnc @f |
bt [ebx-1], eax |
jc .checkRightSM |
dec eax |
dec eax |
js @f |
bt [ebx+1], eax |
jnc @f |
inc eax |
.checkLeftUpSM: |
bt [ebx-1], eax |
jnc .checkRightSM |
inc eax |
bt [ebx-1], eax |
jnc @f |
bt [ebx+1], eax |
jc .checkRightSM |
dec eax |
dec eax |
js @f |
bt [ebx-1], eax |
jc .checkRightSM |
call draw_text_to_user_area |
jmp .pixloop1cont |
;-------------------------------------- |
align 4 |
@@: |
mov ecx, [esp+20+deltaToScreen] |
mov eax, [edi-4] |
test ecx, ecx |
jz @f |
pusha |
lea ebx, [edi+ecx-4] |
shr ebx, 2 |
call syscall_getpixel |
popa |
@@: |
push ebx edx |
mov ebx, ebp |
xor ecx, ecx |
cmp [fontSmoothing], 1 |
jnz .subpixelLeft |
call antiAliasing |
jmp @f |
.subpixelLeft: |
mov cl, bl |
lea edx, [ecx*8+ecx] |
lea edx, [ecx*2+edx] |
mov cl, al |
lea ecx, [ecx*4+ecx] |
add edx, ecx |
shr edx, 4 |
mov al, dl |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
; call [putpixel] |
call __sys_putpixel |
jmp .pixloop1cont |
;-------------------------------------- |
align 4 |
.nopix: |
test ecx, 0x40000000 |
jz .pixloop1cont |
xor ecx, ecx |
mov cl, ah |
lea edx, [ecx*8+ecx] |
lea edx, [ecx*2+edx] |
mov cl, bh |
lea ecx, [ecx*4+ecx] |
add edx, ecx |
shr edx, 4 |
mov ah, dl |
push ecx |
mov ecx, [esp+4+20h+20h] |
rol eax, 16 |
rol ebx, 16 |
xor ecx, ecx |
mov cl, al |
mov edx, ecx |
shl ecx, 3 |
sub ecx, edx |
mov dl, bl |
add ecx, edx |
shr ecx, 3 |
mov al, cl |
rol eax, 16 |
@@: |
mov [edi-4], eax |
pop edx ebx |
.checkRightSM: |
bsf eax, edx |
inc eax |
bt [ebx], eax |
jc .nextPixel |
inc eax |
bt [ebx], eax |
jc .nextPixel |
dec eax |
.checkRightDownSM: |
bt [ebx+1], eax |
jnc .checkRightUpSM |
dec eax |
bt [ebx+1], eax |
jnc @f |
bt [ebx-1], eax |
jc .nextPixel |
inc eax |
inc eax |
bt [ebx+1], eax |
jnc @f |
dec eax |
.checkRightUpSM: |
bt [ebx-1], eax |
jnc .nextPixel |
dec eax |
bt [ebx-1], eax |
jnc @f |
bt [ebx+1], eax |
jc .nextPixel |
inc eax |
inc eax |
bt [ebx-1], eax |
jc .nextPixel |
@@: |
mov ecx, [esp+20+deltaToScreen] |
mov eax, [edi+4] |
test ecx, ecx |
test ecx, 0x08000000 ; redirect the output to the user area |
jz @f |
pusha |
lea ebx, [edi+ecx+4] |
shr ebx, 2 |
call syscall_getpixel |
popa |
@@: |
push ebx edx |
mov ebx, ebp |
xor ecx, ecx |
cmp [fontSmoothing], 1 |
jnz .subpixelRight |
call antiAliasing |
jmp @f |
.subpixelRight: |
mov cl, al |
mov edx, ecx |
shl ecx, 3 |
sub ecx, edx |
mov dl, bl |
add ecx, edx |
shr ecx, 3 |
mov al, cl |
xor ecx, ecx |
mov cl, ah |
lea edx, [ecx*8+ecx] |
lea edx, [ecx*2+edx] |
mov cl, bh |
lea ecx, [ecx*4+ecx] |
add edx, ecx |
shr edx, 4 |
mov ah, dl |
rol ebx, 16 |
rol eax, 16 |
xor ecx, ecx |
mov cl, bl |
lea edx, [ecx*8+ecx] |
lea edx, [ecx*2+edx] |
mov cl, al |
lea ecx, [ecx*4+ecx] |
add edx, ecx |
shr edx, 4 |
mov al, dl |
rol eax, 16 |
call draw_text_to_user_area |
pop ecx |
jmp .pixloop1cont |
;-------------------------------------- |
align 4 |
@@: |
mov [edi+4], eax |
pop edx ebx |
jmp .nextPixel |
.square: ; scaling |
mov eax, esi |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
dec ecx |
jnz .square |
inc esi |
mov edi, [esp] |
.checkLeft: |
bsf eax, edx |
dec eax |
js .checkRight |
bt [ebx], eax |
jc .checkRight |
.checkLeftDown: |
bt [ebx+1], eax |
jnc .checkLeftUp |
mov ecx, eax |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
; call [putpixel] |
call __sys_putpixel |
pop ecx |
;-------------------------------------- |
align 4 |
.pixloop1cont: |
inc eax |
bt [ebx+1], eax |
jc @f |
bt [ebx-1], eax |
jnc .downRightLow |
bt [ebx-2], eax |
jc .downRightLow |
dec eax |
bt [ebx-1], eax |
jc .downRightLow |
dec eax |
js .downRightHigh |
bt [ebx-2], eax |
jc .downRightLow |
jmp .downRightHigh |
@@: |
bt [ebx-1], eax |
jc .checkLeftUp |
dec eax |
dec eax |
js .downRightLow |
bt [ebx+1], eax |
jc .checkLeftUp |
.downRightLow: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
jmp .pixloop1 |
;-------------------------------------- |
align 4 |
.pixloop1end: |
sub eax, 6 |
inc ebx |
inc ebp |
dec esi |
mov eax, [esp+20+widthX] |
imul eax, esi |
add edi, eax |
add edi, 4 |
mov ecx, esi |
dec ecx |
.drawDownRight: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
add edi, 4 |
dec ecx |
jns .drawDownRight |
inc esi |
mov edi, [esp] |
jmp .checkLeftUp |
jnz .symloop1 |
.downRightHigh: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
dec esi |
mov eax, [esp+20+widthX] |
imul eax, esi |
add edi, eax |
add edi, 4 |
mov ecx, esi |
dec ecx |
.drawDownRightHigh: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
add edi, 4 |
dec ecx |
jns .drawDownRightHigh |
inc esi |
mov edi, [esp] |
.checkLeftUp: |
bsf eax, edx |
dec eax |
bt [ebx-1], eax |
jnc .checkRight |
mov ecx, eax |
inc eax |
bt [ebx-1], eax |
jc @f |
bt [ebx+1], eax |
jnc .upRightLow |
bt [ebx+2], eax |
jc .upRightLow |
dec eax |
bt [ebx+1], eax |
jc .upRightLow |
dec eax |
js .upRightHigh |
bt [ebx+2], eax |
jc .upRightLow |
jmp .upRightHigh |
popad |
add eax, 6 |
jmp .loop |
;-------------------------------------- |
align 4 |
.font2: |
add edx, edx |
lea ebp, [FONT_II+4*edx+edx+1] |
push 9 |
movzx esi, byte [ebp-1] |
;-------------------------------------- |
align 4 |
.symloop2: |
mov dl, byte [ebp] |
push esi |
;-------------------------------------- |
align 4 |
.pixloop2: |
shr dl, 1 |
jnc .nopix2 |
@@: |
bt [ebx+1], eax |
jc .checkRight |
dec eax |
dec eax |
js .upRightLow |
bt [ebx-1], eax |
jc .checkRight |
.upRightLow: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
add edi, 4 |
mov ecx, esi |
dec ecx |
dec ecx |
.drawUpRight: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
add edi, 4 |
dec ecx |
jns .drawUpRight |
mov edi, [esp] |
jmp .checkRight |
test ecx, 0x08000000 ; redirect the output to the user area |
jz @f |
.upRightHigh: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
add edi, 4 |
mov ecx, esi |
dec ecx |
dec ecx |
.drawUpRightHigh: |
mov eax, ecx |
call draw_text_to_user_area |
jmp .pixloop2cont |
;-------------------------------------- |
align 4 |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
add edi, 4 |
dec ecx |
jns .drawUpRightHigh |
mov edi, [esp] |
.checkRight: |
bsf eax, edx |
inc eax |
bt [ebx], eax |
jc .nextPixel |
.checkRightDown: |
bt [ebx+1], eax |
jnc .checkRightUp |
mov ecx, eax |
dec eax |
bt [ebx+1], eax |
jc @f |
bt [ebx-1], eax |
jnc .downLeftLow |
bt [ebx-2], eax |
jc .downLeftLow |
inc eax |
bt [ebx-1], eax |
jc .downLeftLow |
inc eax |
bt [ebx-2], eax |
jc .downLeftLow |
jmp .downLeftHigh |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
; call [putpixel] |
call __sys_putpixel |
jmp .pixloop2cont |
;-------------------------------------- |
align 4 |
.nopix2: |
test ecx, 0x40000000 |
jz .pixloop2cont |
@@: |
bt [ebx-1], eax |
jc .checkRightUp |
inc eax |
inc eax |
bt [ebx+1], eax |
jc .checkRightUp |
.downLeftLow: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
dec esi |
mov eax, [esp+20+widthX] |
imul eax, esi |
add edi, eax |
mov ecx, esi |
dec ecx |
.drawDownLeft: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
dec ecx |
jns .drawDownLeft |
inc esi |
mov edi, [esp] |
jmp .checkRightUp |
push ecx |
mov ecx, [esp+12+20h+20h] |
.downLeftHigh: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
dec esi |
mov eax, [esp+20+widthX] |
imul eax, esi |
add edi, eax |
mov ecx, esi |
dec ecx |
.drawDownLeftHigh: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
sub edi, [esp+20+widthX] |
dec ecx |
jns .drawDownLeftHigh |
inc esi |
mov edi, [esp] |
.checkRightUp: |
bsf eax, edx |
inc eax |
bt [ebx-1], eax |
jnc .nextPixel |
mov ecx, eax |
dec eax |
bt [ebx-1], eax |
jc @f |
bt [ebx+1], eax |
jnc .upLeftLow |
bt [ebx+2], eax |
jc .upLeftLow |
inc eax |
bt [ebx+1], eax |
jc .upLeftLow |
inc eax |
bt [ebx+2], eax |
jc .upLeftLow |
jmp .upLeftHigh |
test ecx, 0x08000000 ; redirect the output to the user area |
jz @f |
call draw_text_to_user_area |
pop ecx |
jmp .pixloop2cont |
;-------------------------------------- |
align 4 |
@@: |
bt [ebx+1], eax |
jc .nextPixel |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
; call [putpixel] |
call __sys_putpixel |
pop ecx |
;-------------------------------------- |
align 4 |
.pixloop2cont: |
inc eax |
inc eax |
bt [ebx-1], eax |
jc .nextPixel |
.upLeftLow: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
mov ecx, esi |
dec ecx |
dec ecx |
.drawUpLeft: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
dec ecx |
jns .drawUpLeft |
jmp .nextPixel |
dec esi |
jnz .pixloop2 |
.upLeftHigh: |
imul ecx, esi |
shl ecx, 2 |
add edi, ecx |
mov ecx, esi |
dec ecx |
dec ecx |
.drawUpLeftHigh: |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
mov eax, ecx |
@@: |
mov [edi+eax*4], ebp |
dec eax |
jns @b |
add edi, [esp+20+widthX] |
dec ecx |
jns .drawUpLeftHigh |
.nextPixel: |
bsf eax, edx |
btr edx, eax |
pop edi |
jmp .raw |
.nextRaw: |
pop esi |
sub eax, esi |
inc ebx |
mov eax, [esp+16+widthX] |
imul eax, esi |
add edi, eax |
dec dword [esp+4] |
jnz drawChar |
ret |
inc ebp |
dec dword [esp] |
jnz .symloop2 |
antiAliasing: |
mov bp, 3 |
@@: |
mov cl, al |
mov dl, bl |
lea ecx, [ecx*2+ecx] |
add ecx, edx |
shr ecx, 2 |
mov al, cl |
ror eax, 8 |
ror ebx, 8 |
dec bp |
jnz @b |
ror eax, 8 |
ror ebx, 8 |
mov ebp, ebx |
pop eax |
add dword [esp+28], esi |
popad |
jmp .loop |
;-------------------------------------- |
align 4 |
.end: |
popad |
pop eax |
ret |
fontSmoothing db 2 ; = 0, 1 or 2 |
fontSize db 0 ; user mode setting |
font1: |
;------------------------------------------------------------------------------ |
; eax = x coordinate |
; ebx = y coordinate |
; ecx = ?? RR GG BB |
; edi = user area |
align 4 |
draw_text_to_user_area: |
pushad |
imul ebx, [edi+0] |
add eax, ebx |
shl eax, 2 |
add eax, edi |
add eax, 8 |
and ecx, 0xffffff |
or ecx, 0xff000000 ; not transparent |
mov [eax], ecx ; store pixel |
popad |
ret |
;------------------------------------------------------------------------------ |
align 4 |
FONT_I: |
if lang eq sp |
file 'char_sp.mt' |
else if lang eq et |
831,5 → 238,14 |
else |
file 'char.mt' |
end if |
fontUni: |
file 'charUni.mt' |
;------------------------------------------------------------------------------ |
align 4 |
FONT_II: |
if lang eq sp |
file 'char2_sp.mt' |
else if lang eq et |
file 'char2_et.mt' |
else |
file 'char2.mt' |
end if |
;------------------------------------------------------------------------------ |
/kernel/branches/Kolibri-acpi/gui/window.inc |
---|
30,9 → 30,12 |
draw_limits RECT |
endg |
align 4 |
;------------------------------------------------------------------------------ |
syscall_draw_window: ;///// system function 0 ///////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description>. |
;------------------------------------------------------------------------------ |
mov eax, edx |
shr eax, 24 |
and al, 0x0f |
50,14 → 53,18 |
call drawwindow_I |
jmp window._.draw_window_caption.2 |
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
; type II - only reserve area, no draw |
; call sys_window_mouse |
; call [draw_pointer] |
call __sys_draw_pointer |
jmp .exit |
;-------------------------------------- |
align 4 |
@@: |
dec al |
jnz @f |
65,9 → 72,11 |
; type III - new style |
call drawwindow_III |
jmp window._.draw_window_caption.2 |
; type IV & V - skinned window (resizable & not) |
;-------------------------------------- |
align 4 |
@@: |
; type IV & V - skinned window (resizable & not) |
mov eax, [TASK_COUNT] |
movzx eax, word[WIN_POS + eax * 2] |
cmp eax, [CURRENT_TASK] |
77,9 → 86,12 |
call drawwindow_IV |
jmp window._.draw_window_caption.2 |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_display_settings: ;///// system function 48 /////////////////////////// |
;------------------------------------------------------------------------------ |
;; Redraw screen: |
122,44 → 134,42 |
;< ebx = 8 |
;< ecx = pointer to FileInfoBlock struct |
;> eax = FS error code |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Get font smoothing: |
;< ebx = 9 |
;> eax = 0 — off, 1 — on, 2 — subpixel |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Set font smoothing: |
;< ebx = 10 |
;< ecx = 0 — off, 1 — on, 2 — subpixel |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Get font size: |
;< ebx = 11 |
;> eax = height in pixels |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Set font size: |
;< ebx = 12 |
;< ecx = height in pixels |
;------------------------------------------------------------------------------ |
cmp ebx, .sizeof.ftable / 4 |
ja @f |
jmp [.ftable + ebx * 4] |
;-------------------------------------- |
align 4 |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.00: |
xor eax, eax |
inc ebx |
cmp [windowtypechanged], ebx |
jne @f |
jne .exit |
mov [windowtypechanged], eax |
jmp syscall_display_settings._.redraw_whole_screen |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.01: |
and ecx, 1 |
cmp ecx, [buttontype] |
je @f |
je .exit |
mov [buttontype], ecx |
mov [windowtypechanged], ebx |
@@: |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.02: |
dec ebx |
mov esi, ecx |
173,6 → 183,7 |
mov [windowtypechanged], ebx |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.03: |
mov edi, ecx |
cmp edx, 192 |
184,11 → 195,13 |
rep movsb |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.04: |
mov eax, [_skinh] |
mov [esp + 32], eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.05: |
mov eax, [screen_workarea.left - 2] |
mov ax, word[screen_workarea.right] |
198,8 → 211,10 |
mov [esp + 20], eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.06: |
xor esi, esi |
mov edi, [_display.width] |
dec edi |
mov eax, ecx |
211,13 → 226,19 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.left], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.right], ebx |
;-------------------------------------- |
align 4 |
.check_horizontal: |
mov edi, [_display.height] |
dec edi |
230,58 → 251,54 |
or eax, eax |
jge @f |
xor eax, eax |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.top], eax |
cmp ebx, edi |
jle @f |
mov ebx, edi |
;-------------------------------------- |
align 4 |
@@: |
mov [screen_workarea.bottom], ebx |
;-------------------------------------- |
align 4 |
.check_if_redraw_needed: |
or esi, esi |
jz @f |
jz .exit |
call repos_windows |
jmp syscall_display_settings._.calculate_whole_screen |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.07: |
mov eax, [_skinmargins + 0] |
mov [esp + 32], eax |
mov eax, [_skinmargins + 4] |
mov [esp + 20], eax |
@@: |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings.08: |
mov ebx, ecx |
call read_skin_file |
mov [esp + 32], eax |
test eax, eax |
jnz @b |
jnz .exit |
call syscall_display_settings._.calculate_whole_screen |
jmp syscall_display_settings._.redraw_whole_screen |
;------------------------------------------------------------------------------ |
syscall_display_settings.09: |
xor eax, eax |
mov al, [fontSmoothing] |
mov [esp + 32], eax |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
syscall_display_settings.10: |
mov [fontSmoothing], cl |
ret |
;------------------------------------------------------------------------------ |
syscall_display_settings.11: |
xor eax, eax |
mov al, [fontSize] |
mov [esp + 32], eax |
ret |
;------------------------------------------------------------------------------ |
syscall_display_settings.12: |
mov [fontSize], cl |
ret |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.calculate_whole_screen: |
xor eax, eax |
xor ebx, ebx |
291,6 → 308,7 |
dec edx |
jmp calculatescreen |
;------------------------------------------------------------------------------ |
align 4 |
syscall_display_settings._.redraw_whole_screen: |
xor eax, eax |
mov [draw_limits.left], eax |
304,6 → 322,8 |
mov eax, window_data |
jmp redrawscreen |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
syscall_set_window_shape: ;///// system function 50 /////////////////////////// |
;------------------------------------------------------------------------------ |
;; Set window shape address: |
386,20 → 406,59 |
call window._.set_window_box |
add esp, sizeof.BOX |
; NOTE: do we really need this? to be reworked |
; mov byte[DONT_DRAW_MOUSE], 0 ; mouse pointer |
; mov byte[MOUSE_BACKGROUND], 0 ; no mouse under |
; mov byte[MOUSE_DOWN], 0 ; react to mouse up/down |
; NOTE: do we really need this? to be reworked |
; call [draw_pointer] |
;-------------------------------------- |
align 4 |
.exit: |
ret |
;------------------------------------------------------------------------------ |
syscall_window_settings: ;///// system function 71 //////////////////////////// |
align 4 |
;------------------------------------------------------------------------------ |
syscall_window_settings: ;///// system function 71 ///////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
dec ebx ; subfunction #1 - set window caption |
jnz .exit_fail |
; NOTE: only window owner thread can set its caption, |
; so there's no parameter for PID/TID |
mov edi, [CURRENT_TASK] |
shl edi, 5 |
mov [edi * 8 + SLOT_BASE + APPDATA.wnd_caption], ecx |
or [edi + window_data + WDATA.fl_wstyle], WSTYLE_HASCAPTION |
jmp window._.draw_window_caption |
call window._.draw_window_caption |
xor eax, eax ; eax = 0 (success) |
ret |
; .get_window_caption: |
; dec eax ; subfunction #2 - get window caption |
; jnz .exit_fail |
; not implemented yet |
;-------------------------------------- |
align 4 |
.exit_fail: |
xor eax, eax |
inc eax ; eax = 1 (fail) |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
set_window_defaults: ;///////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
mov byte [window_data + 0x20 + WDATA.cl_titlebar + 3], 1 ; desktop is not movable |
push eax ecx |
xor eax, eax |
418,7 → 477,6 |
pop ecx eax |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
calculatescreen: ;///////////////////////////////////////////////////////////// |
444,21 → 502,12 |
cmp ebp, 1 |
jbe .exit |
push eax ;for num layout |
push edx ecx ebx eax |
mov dword[esp+10h], ZPOS_DESKTOP |
;-------------------------------------- |
align 4 |
.layout: |
mov esi, 1 ; = num in window stack |
mov ebp, [TASK_COUNT] |
;-------------------------------------- |
align 4 |
.next_window: |
movzx edi, word[WIN_POS + esi * 2] |
shl edi, 5 ;size of TASKDATA and WDATA = 32 bytes |
shl edi, 5 |
cmp [CURRENT_TASK + edi + TASKDATA.state], TSTATE_FREE |
je .skip_window |
467,10 → 516,6 |
test [edi + WDATA.fl_wstate], WSTATE_MINIMIZED |
jnz .skip_window |
mov eax, [esp+10h] |
cmp [edi + WDATA.z_modif], al |
jne .skip_window |
mov eax, [edi + WDATA.box.left] |
cmp eax, [esp + RECT.right] |
jg .skip_window |
520,18 → 565,8 |
inc esi |
dec ebp |
jnz .next_window |
;--------------------------------------------- |
inc dword[esp+10h] |
cmp dword[esp+10h], ZPOS_ALWAYS_TOP |
jle .layout |
;--------------------------------------------- |
mov esi, [TASK_COUNT] |
movzx edi, word[WIN_POS + esi * 2] |
shl edi, 5 |
add edi, window_data |
pop eax ebx ecx edx |
pop ebp ;del num layout |
;-------------------------------------- |
align 4 |
.exit: |
984,9 → 1019,6 |
mov edi, [TASK_COUNT] |
movzx esi, word[WIN_POS + edi * 2] |
call window._.set_screen |
call window._.set_top_wnd |
inc [_display.mask_seqno] |
popad |
1156,11 → 1188,6 |
add ecx, eax |
add edx, ebx |
call ebp |
cmp ebp, window._.set_screen |
jne @f |
call window._.set_top_wnd |
@@: |
inc [_display.mask_seqno] |
;-------------------------------------- |
align 4 |
1347,15 → 1374,6 |
shl edi, 5 |
add edi, window_data |
test [fl_moving], 1 |
jz @f |
push edi |
mov edi, ebx |
call window._.draw_negative_box |
pop edi |
@@: |
mov eax, ebx |
mov bl, [edi + WDATA.fl_wstate] |
call window._.set_window_box |
1382,7 → 1400,7 |
iglobal |
FuncTable syscall_display_settings, ftable, \ |
00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12 |
00, 01, 02, 03, 04, 05, 06, 07, 08 |
align 4 |
window_topleft dd \ |
1493,6 → 1511,7 |
call memmove |
mov eax, ebx |
mov ebx, esi |
call window._.check_window_position |
call window._.set_window_clientbox |
call window._.invalidate_screen |
1599,21 → 1618,30 |
mov eax, [CURRENT_TASK] |
shl eax, 5 |
add eax, window_data |
; save window colors |
mov [eax + WDATA.cl_workarea], edx |
mov [eax + WDATA.cl_titlebar], esi |
mov [eax + WDATA.cl_frames], edi |
mov edi, eax |
; Was it already defined before? |
; was it already defined before? |
test [edi + WDATA.fl_wdrawn], 1 |
jnz .set_client_box |
; No, it wasn't. After first draw_window we need redraw mouse necessarily! |
or [edi + WDATA.fl_wdrawn], 1 |
; After first draw_window we need redraw mouse necessarily! |
; Otherwise the user can see cursor specified by f.37.5 from another window. |
; He will be really unhappy! Usually, he will be enraged! |
or [edi + WDATA.fl_wdrawn], 1 |
; He will be really unhappy! He is terrible in rage - usually he throws stones! |
mov [redrawmouse_unconditional], 1 |
call wakeup_osloop |
; performing initial window definition |
; NOTE: commented out since doesn't provide necessary functionality |
; anyway, to be reworked |
; mov eax, [timer_ticks] ; [0xfdf0] |
; add eax, 100 |
; mov [new_window_starting], eax |
; no it wasn't, performing initial window definition |
movzx eax, bx |
mov [edi + WDATA.box.width], eax |
movzx eax, cx |
2268,8 → 2296,6 |
or edx, edx |
jz .exit |
mov ebp, [edi + window_data + WDATA.box.left - 2] |
mov bp, word[edi + window_data + WDATA.box.top] |
movzx eax, [edi + window_data + WDATA.fl_wstyle] |
and al, 0x0F |
cmp al, 3 |
2281,17 → 2307,30 |
;-------------------------------------- |
align 4 |
.skinned: |
mov ebp, [edi + window_data + WDATA.box.left - 2] |
mov bp, word[edi + window_data + WDATA.box.top] |
movzx eax, word[edi + window_data + WDATA.box.width] |
sub ax, [_skinmargins.left] |
sub ax, [_skinmargins.right] |
push edx |
cwde |
cdq |
mov ebx, 6 |
idiv ebx |
pop edx |
or eax, eax |
js .exit |
mov esi, eax |
mov ebx, dword[_skinmargins.left - 2] |
mov bx, word[_skinh] |
sub bx, [_skinmargins.bottom] |
sub bx, [_skinmargins.top] |
sar bx, 1 |
adc bx, 0 |
add bx, [_skinmargins.top] |
sub bx, 8 |
add bx, -3 |
add ebx, ebp |
jmp .dodraw |
;-------------------------------------- |
align 4 |
2298,29 → 2337,36 |
.not_skinned: |
cmp al, 1 |
je .exit |
mov ebp, [edi + window_data + WDATA.box.left - 2] |
mov bp, word[edi + window_data + WDATA.box.top] |
movzx eax, word[edi + window_data + WDATA.box.width] |
sub eax, 16 |
push edx |
cwde |
cdq |
mov ebx, 6 |
idiv ebx |
pop edx |
or eax, eax |
js .exit |
mov ebx, 80002h |
.dodraw: |
shr eax, 3 |
mov esi, eax |
mov ebx, 0x00080007 |
add ebx, ebp |
;-------------------------------------- |
align 4 |
.dodraw: |
mov ecx, [common_colours + 16] |
mov al, 1 |
cmp byte [edx], 4 |
jnc @f |
mov al, [edx] |
test al, al |
jz .exit |
inc edx |
@@: |
shl eax, 28 |
or ecx, eax |
or ecx, 0x80000000 |
xor edi, edi |
call dtext |
call dtext_asciiz_esi |
;-------------------------------------- |
align 4 |
.exit: |
jmp __sys_draw_pointer |
; call [draw_pointer] |
call __sys_draw_pointer |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
2380,153 → 2426,3 |
mov [ecx+RECT.bottom], edx |
ret |
;------------------------------------------------------------------------------ |
align 4 |
;------------------------------------------------------------------------------ |
window._.redraw_top_wnd: ;//////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? redraw all windows one above the window |
;------------------------------------------------------------------------------ |
;> eax = left |
;> ebx = top |
;> ecx = right |
;> edx = bottom |
;> esi = process number |
;! corrupted edi |
;------------------------------------------------------------------------------ |
push 0 |
jmp window._.set_top_wnd.go |
align 4 |
;------------------------------------------------------------------------------ |
window._.set_top_wnd: ;//////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? call set_screen for all windows one above the window |
;------------------------------------------------------------------------------ |
;> eax = left |
;> ebx = top |
;> ecx = right |
;> edx = bottom |
;> esi = process number |
;! corrupted edi |
;------------------------------------------------------------------------------ |
push 1 |
.go: |
push esi |
pushfd |
cli |
push ebp |
mov ebp, [TASK_COUNT] |
cmp ebp, 1 |
jbe .exit |
shl esi, 5 |
cmp [esi + window_data + WDATA.z_modif], ZPOS_ALWAYS_TOP |
je .exit |
push eax ;for num layout |
push edx ecx ebx eax |
movsx eax, byte [esi + window_data + WDATA.z_modif] |
inc eax |
mov dword[esp+10h], eax |
;-------------------------------------- |
align 4 |
.layout: |
mov esi, 1 ; = num in window stack |
mov ebp, [TASK_COUNT] |
;-------------------------------------- |
align 4 |
.next_window: |
movzx edi, word[WIN_POS + esi * 2] |
shl edi, 5 ;size of TASKDATA and WDATA = 32 bytes |
cmp [CURRENT_TASK + edi + TASKDATA.state], TSTATE_FREE |
je .skip_window |
add edi, window_data |
test [edi + WDATA.fl_wstate], WSTATE_MINIMIZED |
jnz .skip_window |
mov eax, [esp+10h] |
cmp [edi + WDATA.z_modif], al |
jne .skip_window |
mov eax, [edi + WDATA.box.left] |
cmp eax, [esp + RECT.right] |
jg .skip_window |
mov ebx, [edi + WDATA.box.top] |
cmp ebx, [esp + RECT.bottom] |
jg .skip_window |
mov ecx, [edi + WDATA.box.width] |
add ecx, eax |
cmp ecx, [esp + RECT.left] |
jl .skip_window |
mov edx, [edi + WDATA.box.height] |
add edx, ebx |
cmp edx, [esp + RECT.top] |
jl .skip_window |
cmp eax, [esp + RECT.left] |
jae @f |
mov eax, [esp + RECT.left] |
;-------------------------------------- |
align 4 |
@@: |
cmp ebx, [esp + RECT.top] |
jae @f |
mov ebx, [esp + RECT.top] |
;-------------------------------------- |
align 4 |
@@: |
cmp ecx, [esp + RECT.right] |
jbe @f |
mov ecx, [esp + RECT.right] |
;-------------------------------------- |
align 4 |
@@: |
cmp edx, [esp + RECT.bottom] |
jbe @f |
mov edx, [esp + RECT.bottom] |
;-------------------------------------- |
align 4 |
@@: |
cmp dword[esp+32], 0 |
je .set_fl_redraw |
push esi |
movzx esi, word[WIN_POS + esi * 2] |
call window._.set_screen |
pop esi |
jmp @f |
.set_fl_redraw: |
mov [edi + WDATA.fl_redraw], 1 ;set redraw flag |
@@: |
;-------------------------------------- |
align 4 |
.skip_window: |
inc esi |
dec ebp |
jnz .next_window |
;-------------------------------------- |
inc dword[esp+10h] |
cmp byte[esp+10h], ZPOS_ALWAYS_TOP |
jle .layout |
;------------------------------------- |
pop eax ebx ecx edx |
pop ebp ;del num layout |
;------------------------------------- |
align 4 |
.exit: |
pop ebp |
popfd |
pop esi |
add esp, 4 ;dword for 0/1 - set_screen/fl_redraw |
ret |
/kernel/branches/Kolibri-acpi/gui/char2_et.mt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/kernel/branches/Kolibri-acpi/gui/char2_sp.mt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/kernel/branches/Kolibri-acpi/gui/char2.mt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |