kolibrios/kernel/trunk/gui/skincode.inc
Marat Zakiyanov (Mario79) 333b0bbae6 1) Parallel processing of mouses: PS2, COM1, COM2
2) Detection PS2 mouse.
3) Switching FPU in PM with reset.
4) Click on the application button - works only if during release of a up-button mouse the cursor is on the button application. Realization Victor Alberto Gil Hanla (vhanla). Version 1.1
5) Return of focus (activated window) on previous application at completion of the active application
6) Change skin of header of windows type 4, at loss and return of focus (activated window).

git-svn-id: svn://kolibrios.org@33 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-01-06 11:46:26 +00:00

460 lines
11 KiB
PHP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; WINDOW SKIN for MenuetOS ;;
;; ;;
;; entryway@bkg.lt ;;
;; ;;
;; Bugfixes & upgrades by ;;
;; Samuel Rodriguez Perez ;;
;; Xeoda@ciberirmandade.org ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include "skindata.inc"
virtual at 0
bmp_header:
.type rw 1 ; "BM" signature
.filesize rd 1 ; size of the file
.reserved rd 1 ; zero
.offbits rd 1 ; pointer to image data
;----------------
.headsize rd 1 ; usually 40 bytes for image header
.width rd 1
.height rd 1
.planes rw 1 ; usually 1
.bitcount rw 1 ; currently 24 bits/pixel (0x18)
.compress rd 1 ; zero
.sizeimage rd 1 ; x*y*(bitcount/8)
.unused rd 4 ; these bits aren't used by MeOS
bmp_data:
end virtual
virtual at 0x778000
_bmp_bpl dd ? ; bytes per line
_bmp_dpl dd ? ; dwords per line
_bmp_zb dd ? ; bytes filled by zeroes at the end of a scanline
align 32
raw_data:
end virtual
bmp2raw:
; esi = to bmp data (source)
; edi = to raw data (destination)
cmp [esi+bmp_header.type],'BM' ; check if bmp file is really loaded
jne .finish
mov edx,esi
mov eax,[edx+bmp_header.width]
imul eax,3
push eax
test eax,11b
jz @f
add eax,4
@@:
shr eax,2
mov [_bmp_dpl],eax
shl eax,2
mov [_bmp_bpl],eax
pop ebx
sub eax,ebx
mov [_bmp_zb],eax
add esi,bmp_data
mov eax,[_bmp_bpl]
imul eax,[edx+bmp_header.height]
add esi,eax
mov ebx,[edx+bmp_header.height] ; ebx = y
cld
.y_begin:
sub esi,[_bmp_bpl]
push esi
mov ecx,[_bmp_dpl]
rep movsd
pop esi
sub edi,[_bmp_zb]
dec ebx
jne .y_begin
.finish:
ret
; BMP support by Ivan Poddubny
; 1) load LEFT.BMP
; a) _skinleftw = bmp_width
; b) _skinleft = 0
; c) _refleft = 0x778000
; d) convert
; 2) load BASE.BMP
; a) _skinbasew = bmp_width
; b) _skinbase = _skinleftw
; c) _refbase = _refleft+sizeof(left_raw_converted)
; d) convert
; 3) load OPER.BMP
; a) _skinoper = minus width from bmp file
; b) _skinoperw = width from bmp file
; c) _refoper = _refbase+sizeof(oper_raw_converted)
; d) convert
; 4) set height
load_bmp_file:
; eax = pointer to filename
mov ebx, 1
or ecx, -1
mov edx, 0x90000
mov esi, 12
call fileread
ret
load_default_skin:
pushad
mov eax, _fileleft
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinleftw], eax
mov [_skinleft], 0
mov edi, raw_data
mov [_refleft], edi
mov esi, 0x90000
call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _filebase
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinbasew], eax
mov eax, [_skinleftw]
mov [_skinbase], eax
pop eax
add eax, [_refleft]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
; save base address
mov [_refbase], eax
; convert
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _fileoper
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinoperw], eax
neg eax
mov [_skinoper], eax
pop eax
add eax, [_refbase]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
mov [_refoper], eax
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [0x90000+bmp_header.height]
mov [_skinh], eax
popad
ret
load_default_skin_1:
pushad
mov eax, _fileleft_1
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinleftw], eax
mov [_skinleft_1], 0
mov edi, raw_data+1000h
mov [_refleft_1], edi
mov esi, 0x90000
call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _filebase_1
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinbasew], eax
mov eax, [_skinleftw]
mov [_skinbase], eax
pop eax
add eax, [_refleft_1]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
; save base address
mov [_refbase_1], eax
; convert
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [_bmp_bpl]
imul eax, [0x90000+bmp_header.height]
push eax
mov eax, _fileoper_1
call load_bmp_file
mov eax, [0x90000+bmp_header.width]
mov [_skinoperw], eax
neg eax
mov [_skinoper], eax
pop eax
add eax, [_refbase_1]
; align to 32-byte boundary
test eax, 11111b
jz @f
shr eax, 5
inc eax
shl eax, 5
@@:
mov [_refoper_1], eax
mov edi, eax
mov esi, 0x90000
call bmp2raw
mov eax, [0x90000+bmp_header.height]
mov [_skinh], eax
popad
ret
drawwindow_IV:
pusha
push edx
mov edi,[esp] ; RECTANGLE
mov eax,[edi+0]
shl eax,16
mov ax,[edi+0]
add ax,[edi+8]
mov ebx,[edi+4]
shl ebx,16
mov bx,[edi+4]
add bx,[edi+12]
; mov esi,[edi+24]
; shr esi,1
; and esi,0x007f7f7f
mov esi,[_coloroutborder]
call draw_rectangle
mov ecx,3
_dw3l:
add eax,1*65536-1
add ebx,1*65536-1
test ax,ax
js no_skin_add_button
test bx,bx
js no_skin_add_button
mov esi,[_colorframe] ;[edi+24]
call draw_rectangle
dec ecx
jnz _dw3l
mov esi,[_colorborder]
add eax,1*65536-1
add ebx,1*65536-1
test ax,ax
js no_skin_add_button
test bx,bx
js no_skin_add_button
call draw_rectangle
mov esi,[esp]
mov eax,[esi+8] ; window width
mov edx,[_skinleft]
shl edx,16
mov ecx,[_skinleftw]
shl ecx,16
add ecx,[_skinh]
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refleft]
jmp no_aw_3
@@:
mov ebx,[_refleft_1]
no_aw_3:
call sys_putimage
mov esi,[esp]
mov eax,[esi+8]
sub eax,[_skinleftw]
sub eax,[_skinoperw]
cmp eax,[_skinbase]
jng non_base
xor edx,edx
mov ebx,[_skinbasew]
div ebx
inc eax
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refbase]
jmp no_aw_2
@@:
mov ebx,[_refbase_1]
no_aw_2:
mov ecx,[_skinbasew]
shl ecx,16
add ecx,[_skinh]
mov edx,[_skinbase]
sub edx,[_skinbasew]
shl edx,16
baseskinloop:
shr edx,16
add edx,[_skinbasew]
shl edx,16
push eax ebx ecx edx
call sys_putimage
pop edx ecx ebx eax
dec eax
jnz baseskinloop
non_base:
mov esi,[esp]
mov edx,[esi+8]
sub edx,[_skinoperw]
inc edx
shl edx,16
cmp [aw_yes],1
; cmp [esp+32+4+2], word 1
jne @f
mov ebx,[_refoper]
jmp no_aw_1
@@:
mov ebx,[_refoper_1]
no_aw_1:
mov ecx,[_skinoperw]
shl ecx,16
add ecx,[_skinh]
call sys_putimage
mov esi,[esp]
mov edx,[esi+04] ; WORK AREA
add edx,21+5
mov ebx,[esi+04]
add ebx,[esi+12]
cmp edx,ebx
jg _noinside2
mov eax,5
mov ebx,[_skinh]
mov ecx,[esi+8]
mov edx,[esi+12]
sub ecx,4
sub edx,4
mov edi,[esi+16]
call [drawbar]
_noinside2:
mov edi,[0xfe88]
movzx eax,word [edi]
cmp eax,1000
jge no_skin_add_button
inc eax
mov [edi],ax
shl eax,4
add eax,edi
mov bx,[0x3000]
mov [eax],bx
add eax,2 ; save button id number
mov bx,1
mov [eax],bx
add eax,2 ; x start
mov ebx,[esp]
mov ebx,[ebx+8]
cmp [_buttonCx],0
jg _bCx_at_right
mov ebx,[_buttonCw] ; ebx will be 0 in next instruction
_bCx_at_right:
sub ebx,[_buttonCw]
sub ebx,[_buttonCx]
mov [eax],bx
add eax,2 ; x size
mov ebx,[_buttonCw]
mov [eax],bx
add eax,2 ; y start
mov ebx,[_buttonCy]
mov [eax],bx
add eax,2 ; y size
mov ebx,[_buttonCh]
mov [eax],bx
;* minimize button
mov edi,[0xfe88]
movzx eax,word [edi]
cmp eax,1000
jge no_skin_add_button
inc eax
mov [edi],ax
shl eax,4
add eax,edi
mov bx,[0x3000]
mov [eax],bx
add eax,2 ; save button id number
mov bx,65535 ;999
mov [eax],bx
add eax,2 ; x start
mov ebx,[esp]
mov ebx,[ebx+8]
cmp [_buttonMx],0
jg _bMx_at_right
mov ebx,[_buttonMw] ; ebx will be 0 in next instruction
_bMx_at_right:
sub ebx,[_buttonMw]
sub ebx,[_buttonMx]
mov [eax],bx
add eax,2 ; x size
mov ebx,[_buttonMw]
mov [eax],bx
add eax,2 ; y start
mov ebx,[_buttonMy]
mov [eax],bx
add eax,2 ; y size
mov ebx,[_buttonMh]
mov [eax],bx
;* minimize button
no_skin_add_button:
add esp,4
popa
ret