forked from KolibriOS/kolibrios
d8e9ce1559
git-svn-id: svn://kolibrios.org@1 a494cfbc-eb01-0410-851d-a64ba20cac60
389 lines
9.2 KiB
PHP
389 lines
9.2 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]
|
|
; imul eax, [0x90000+bmp_header.width]
|
|
; imul eax, 3
|
|
; add eax, raw_data ; now eax points to the last line of image
|
|
|
|
; mov ecx, [eax]
|
|
; mov [_coloroutborder], ecx
|
|
; mov [_colorborder], ecx
|
|
; sub eax, 2*3
|
|
; mov ecx, [eax]
|
|
; mov [_colorframe], ecx
|
|
|
|
|
|
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]
|
|
mov ebx,[_refleft]
|
|
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
|
|
|
|
mov ebx,[_refbase]
|
|
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
|
|
mov ebx,[_refoper]
|
|
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
|
|
|
|
|