from Mario79: rewritten background image code

git-svn-id: svn://kolibrios.org@469 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-04-24 08:56:03 +00:00
parent 016062e7e6
commit db5fd1e74a
5 changed files with 732 additions and 801 deletions

View File

@ -282,7 +282,6 @@ BUTTON_INFO equ (OS_BASE+0x02C0000)
RESERVED_PORTS equ (OS_BASE+0x02D0000) RESERVED_PORTS equ (OS_BASE+0x02D0000)
IRQ_SAVE equ (OS_BASE+0x02E0000) IRQ_SAVE equ (OS_BASE+0x02E0000)
BOOT_VAR equ (OS_BASE+0x02f0000) BOOT_VAR equ (OS_BASE+0x02f0000)
IMG_BACKGROUND equ (OS_BASE+0x0300000)
WinMapAddress equ (OS_BASE+0x0460000) WinMapAddress equ (OS_BASE+0x0460000)
display_data equ (OS_BASE+0x0460000) display_data equ (OS_BASE+0x0460000)

View File

@ -329,6 +329,8 @@ com1_mouse_detected rb 1
com2_mouse_detected rb 1 com2_mouse_detected rb 1
;* end code - Mario79 ;* end code - Mario79
img_background rd 1
mem_BACKGROUND rd 1
wraw_bacground_select rb 1 wraw_bacground_select rb 1
lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled lba_read_enabled rd 1 ; 0 = disabled , 1 = enabled

View File

@ -500,12 +500,22 @@ high_code:
mov [graph_data_l+4],al mov [graph_data_l+4],al
mov [graph_data_l+7],ah mov [graph_data_l+7],ah
mov [CURRENT_TASK],dword 1 mov [CURRENT_TASK],dword 1
mov [TASK_COUNT],dword 1 mov [TASK_COUNT],dword 1
mov [TASK_BASE],dword TASK_DATA mov [TASK_BASE],dword TASK_DATA
mov [current_slot], SLOT_BASE+256 mov [current_slot], SLOT_BASE+256
; set background
xor eax,eax
inc eax
mov [display_data-12],eax
mov [display_data-8],eax
mov [display_data-4],eax
mov [mem_BACKGROUND],4095
stdcall kernel_alloc, [mem_BACKGROUND]
mov [img_background], eax
;!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!
include 'detect/disks.inc' include 'detect/disks.inc'
;!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -2296,8 +2306,37 @@ sys_background:
mov [display_data-8],ebx mov [display_data-8],ebx
mov [display_data-4],ecx mov [display_data-4],ecx
; mov [bgrchanged],1 ; mov [bgrchanged],1
pushad
; return memory for old background
stdcall kernel_free, [img_background]
; calculate RAW size
xor eax,eax
inc eax
cmp [display_data-8],eax
jae @f
mov [display_data-8],eax
@@:
cmp [display_data-4],eax
jae @f
mov [display_data-4],eax
@@:
mov eax,[display_data-8]
imul eax,[display_data-4]
inc eax
imul eax,3
mov [mem_BACKGROUND],eax
; get memory for new background
stdcall kernel_alloc, [mem_BACKGROUND]
test eax, eax
jz .exit_mem
mov [img_background], eax
.exit_mem:
popad
sbgrr: sbgrr:
ret ret
nosb1: nosb1:
cmp eax,2 ; SET PIXEL cmp eax,2 ; SET PIXEL
@ -2309,7 +2348,12 @@ sys_background:
and edx,0xFF000000 ;255*256*256*256 and edx,0xFF000000 ;255*256*256*256
and ecx,0x00FFFFFF ;255*256*256+255*256+255 and ecx,0x00FFFFFF ;255*256*256+255*256+255
add edx,ecx add edx,ecx
mov [ebx+IMG_BACKGROUND],edx
; mov [ebx+IMG_BACKGROUND],edx
push eax
mov eax,[img_background]
mov [ebx+eax],edx
pop eax
; mov [bgrchanged],1 ; mov [bgrchanged],1
ret ret
nosb2: nosb2:
@ -2342,29 +2386,17 @@ draw_background_temp:
; bughere ; bughere
mov edi, [TASK_BASE] mov edi, [TASK_BASE]
add ebx, [edi+TASKDATA.mem_start] add ebx, [edi+TASKDATA.mem_start]
; mov esi, ebx
; mov edi, ecx
mov eax, ebx mov eax, ebx
mov ebx, ecx mov ebx, ecx
add ecx, edx add ecx, edx
cmp ecx, 0x160000-16 add ebx, [img_background] ;IMG_BACKGROUND
ja .fin
; add edi, 0x300000
add ebx, IMG_BACKGROUND
mov ecx, edx mov ecx, edx
cmp ecx, 0x160000-16
ja .fin
; mov [bgrchanged],1
; cld
; rep movsb
call memmove call memmove
.fin: .fin:
ret ret
nosb5: nosb5:
ret ret
align 4 align 4
sys_getbackground: sys_getbackground:
@ -2380,10 +2412,13 @@ sys_getbackground:
cmp eax,2 ; PIXEL cmp eax,2 ; PIXEL
jnz nogb2 jnz nogb2
mov edx,0x160000-16 ; mov edx,0x160000-16
cmp edx,ebx ; cmp edx,ebx
jbe nogb2 ; jbe nogb2
mov eax, [ebx+IMG_BACKGROUND] ; mov eax, [ebx+IMG_BACKGROUND]
mov eax,[img_background]
mov eax,[ebx+eax]
and eax, 0xFFFFFF and eax, 0xFFFFFF
mov [esp+36],eax mov [esp+36],eax
ret ret
@ -3533,12 +3568,12 @@ calculatebackground: ; background
; all black ; all black
mov [display_data-8],dword 4 ; size x ; mov [display_data-8],dword 4 ; size x
mov [display_data-4],dword 2 ; size y ; mov [display_data-4],dword 2 ; size y
mov edi, IMG_BACKGROUND ; set background to black mov edi, [img_background] ;IMG_BACKGROUND ; set background to black
xor eax, eax xor eax, eax
mov ecx, 0x0fff00 / 4 mov ecx, 1023 ;0x0fff00 / 4
cld cld
rep stosd rep stosd

View File

@ -220,7 +220,7 @@ vesa12_drawbackground:
push eax push eax
push ebx push ebx
mov esi,IMG_BACKGROUND mov esi,[img_background] ;IMG_BACKGROUND
cmp [WinMapAddress-12],dword 1 ; tiled background cmp [WinMapAddress-12],dword 1 ; tiled background
jne no_vesa12_tiled_bgr jne no_vesa12_tiled_bgr
@ -282,7 +282,7 @@ vesa12_drawbackground:
add esi,eax add esi,eax
add esi,eax add esi,eax
add esi,eax add esi,eax
add esi,IMG_BACKGROUND add esi,[img_background] ;IMG_BACKGROUND
pop ebx pop ebx
pop eax pop eax

View File

@ -57,7 +57,6 @@ Vesa20_getpixel24:
and ecx, 0xffffff and ecx, 0xffffff
ret ret
Vesa20_getpixel32: Vesa20_getpixel32:
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
@ -102,29 +101,25 @@ align 16
; ebp = pointer to 'get' function ; ebp = pointer to 'get' function
; esi = pointer to 'init' function ; esi = pointer to 'init' function
; edi = parameter for 'get' function ; edi = parameter for 'get' function
vesa20_putimage: vesa20_putimage:
pushad pushad
call [disable_mouse] call [disable_mouse]
sub esp, putimg.stack_data sub esp, putimg.stack_data
; save pointer to image ; save pointer to image
mov [putimg.pti], ebx mov [putimg.pti], ebx
; unpack the size ; unpack the size
mov eax, ecx mov eax, ecx
and ecx, 0xFFFF and ecx, 0xFFFF
shr eax, 16 shr eax, 16
mov [putimg.image_sx], eax mov [putimg.image_sx], eax
mov [putimg.image_sy], ecx mov [putimg.image_sy], ecx
; unpack the coordinates ; unpack the coordinates
mov eax, edx mov eax, edx
and edx, 0xFFFF and edx, 0xFFFF
shr eax, 16 shr eax, 16
mov [putimg.image_cx], eax mov [putimg.image_cx], eax
mov [putimg.image_cy], edx mov [putimg.image_cy], edx
; calculate absolute (i.e. screen) coordinates ; calculate absolute (i.e. screen) coordinates
mov eax, [TASK_BASE] mov eax, [TASK_BASE]
mov ebx, [eax-twdw + WDATA.box.left] mov ebx, [eax-twdw + WDATA.box.left]
@ -133,7 +128,6 @@ vesa20_putimage:
mov ebx, [eax-twdw + WDATA.box.top] mov ebx, [eax-twdw + WDATA.box.top]
add ebx, [putimg.image_cy] add ebx, [putimg.image_cy]
mov [putimg.abs_cy], ebx mov [putimg.abs_cy], ebx
; real_sx = MIN(wnd_sx-image_cx, image_sx); ; real_sx = MIN(wnd_sx-image_cx, image_sx);
mov ebx, [eax-twdw + WDATA.box.width] ; ebx = wnd_sx mov ebx, [eax-twdw + WDATA.box.width] ; ebx = wnd_sx
; \begin{diamond}[20.08.2006] ; \begin{diamond}[20.08.2006]
@ -151,7 +145,6 @@ vesa20_putimage:
mov ebx, [putimg.image_sx] mov ebx, [putimg.image_sx]
.end_x: .end_x:
mov [putimg.real_sx], ebx mov [putimg.real_sx], ebx
; init real_sy ; init real_sy
mov ebx, [eax-twdw + WDATA.box.height] ; ebx = wnd_sy mov ebx, [eax-twdw + WDATA.box.height] ; ebx = wnd_sy
; \begin{diamond}[20.08.2006] ; \begin{diamond}[20.08.2006]
@ -168,7 +161,6 @@ vesa20_putimage:
mov ebx, [putimg.image_sy] mov ebx, [putimg.image_sy]
.end_y: .end_y:
mov [putimg.real_sy], ebx mov [putimg.real_sy], ebx
; line increment ; line increment
mov eax, [putimg.image_sx] mov eax, [putimg.image_sx]
sub eax, [putimg.real_sx] sub eax, [putimg.real_sx]
@ -177,13 +169,11 @@ vesa20_putimage:
call esi call esi
add eax, [putimg.arg_0] add eax, [putimg.arg_0]
mov [putimg.line_increment], eax mov [putimg.line_increment], eax
; winmap new line increment ; winmap new line increment
mov eax, [ScreenWidth] mov eax, [ScreenWidth]
inc eax inc eax
sub eax, [putimg.real_sx] sub eax, [putimg.real_sx]
mov [putimg.winmap_newline], eax mov [putimg.winmap_newline], eax
; screen new line increment ; screen new line increment
mov eax, [BytesPerScanLine] mov eax, [BytesPerScanLine]
mov ecx, [putimg.real_sx] mov ecx, [putimg.real_sx]
@ -192,10 +182,8 @@ vesa20_putimage:
imul ecx, ebx imul ecx, ebx
sub eax, ecx sub eax, ecx
mov [putimg.screen_newline], eax mov [putimg.screen_newline], eax
; pointer to image ; pointer to image
mov esi, [putimg.pti] mov esi, [putimg.pti]
; pointer to screen ; pointer to screen
mov edx, [putimg.abs_cy] mov edx, [putimg.abs_cy]
imul edx, [BytesPerScanLine] imul edx, [BytesPerScanLine]
@ -205,7 +193,6 @@ vesa20_putimage:
imul eax, ebx imul eax, ebx
add edx, eax add edx, eax
add edx, [LFBAddress] add edx, [LFBAddress]
; pointer to pixel map ; pointer to pixel map
mov eax, [putimg.abs_cy] mov eax, [putimg.abs_cy]
imul eax, [ScreenWidth] imul eax, [ScreenWidth]
@ -213,23 +200,18 @@ vesa20_putimage:
add eax, [putimg.abs_cx] add eax, [putimg.abs_cx]
add eax, WinMapAddress add eax, WinMapAddress
xchg eax, ebp xchg eax, ebp
; get process number ; get process number
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
cmp byte [ScreenBPP], 32 cmp byte [ScreenBPP], 32
je put_image_end_32 je put_image_end_32
;put_image_end_24: ;put_image_end_24:
mov edi, [putimg.real_sy] mov edi, [putimg.real_sy]
align 4 align 4
.new_line: .new_line:
mov ecx, [putimg.real_sx] mov ecx, [putimg.real_sx]
; push ebp edx ; push ebp edx
align 4 align 4
.new_x: .new_x:
push [putimg.edi] push [putimg.edi]
mov eax, [putimg.ebp+4] mov eax, [putimg.ebp+4]
call eax call eax
@ -240,20 +222,16 @@ vesa20_putimage:
shr eax, 16 shr eax, 16
mov [edx+2], al mov [edx+2], al
.skip: .skip:
; add esi, 3 ;[putimg.source_bpp] ; add esi, 3 ;[putimg.source_bpp]
add edx, 3 add edx, 3
inc ebp inc ebp
dec ecx dec ecx
jnz .new_x jnz .new_x
; pop edx ebp ; pop edx ebp
add esi, [putimg.line_increment] add esi, [putimg.line_increment]
add edx, [putimg.screen_newline] ;[BytesPerScanLine] add edx, [putimg.screen_newline] ;[BytesPerScanLine]
add ebp, [putimg.winmap_newline] ;[ScreenWidth] add ebp, [putimg.winmap_newline] ;[ScreenWidth]
; inc ebp ; inc ebp
dec edi dec edi
jnz .new_line jnz .new_line
.finish: .finish:
@ -266,11 +244,9 @@ put_image_end_32:
align 4 align 4
.new_line: .new_line:
mov ecx, [putimg.real_sx] mov ecx, [putimg.real_sx]
; push ebp edx ; push ebp edx
align 4 align 4
.new_x: .new_x:
push [putimg.edi] push [putimg.edi]
mov eax, [putimg.ebp+4] mov eax, [putimg.ebp+4]
call eax call eax
@ -279,20 +255,16 @@ put_image_end_32:
; mov eax, [esi] ; ecx = RRBBGGRR ; mov eax, [esi] ; ecx = RRBBGGRR
mov [edx], eax mov [edx], eax
.skip: .skip:
; add esi, [putimg.source_bpp] ; add esi, [putimg.source_bpp]
add edx, 4 add edx, 4
inc ebp inc ebp
dec ecx dec ecx
jnz .new_x jnz .new_x
; pop edx ebp ; pop edx ebp
add esi, [putimg.line_increment] add esi, [putimg.line_increment]
add edx, [putimg.screen_newline] ;[BytesPerScanLine] add edx, [putimg.screen_newline] ;[BytesPerScanLine]
add ebp, [putimg.winmap_newline] ;[ScreenWidth] add ebp, [putimg.winmap_newline] ;[ScreenWidth]
; inc ebp ; inc ebp
dec edi dec edi
jnz .new_line jnz .new_line
.finish: .finish:
@ -313,7 +285,6 @@ __sys_putpixel:
; edi = 0x00000001 force ; edi = 0x00000001 force
;;; mov [novesachecksum], dword 0 ;;; mov [novesachecksum], dword 0
pushad pushad
test edi,1 ; force ? test edi,1 ; force ?
jnz .forced jnz .forced
@ -340,15 +311,12 @@ __sys_putpixel:
call dword [PUTPIXEL] ; call the real put_pixel function call dword [PUTPIXEL] ; call the real put_pixel function
.exit: .exit:
popad popad
ret ret
align 4 align 4
Vesa20_putpixel24: Vesa20_putpixel24:
; eax = x ; eax = x
; ebx = y ; ebx = y
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [eax+eax*2] ; edi = x*3 lea edi, [eax+eax*2] ; edi = x*3
mov eax, [esp+32-8+4] mov eax, [esp+32-8+4]
@ -357,25 +325,20 @@ Vesa20_putpixel24:
mov [edi], ax mov [edi], ax
shr eax, 16 shr eax, 16
mov [edi+2], al mov [edi+2], al
ret ret
align 4 align 4
Vesa20_putpixel32: Vesa20_putpixel32:
; eax = x ; eax = x
; ebx = y ; ebx = y
imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier)
mov eax, [esp+32-8+4] ; eax = color mov eax, [esp+32-8+4] ; eax = color
add edi, [LFBAddress] ; ebx = where to put pixel in memory add edi, [LFBAddress] ; ebx = where to put pixel in memory
mov [edi], eax mov [edi], eax
ret ret
;************************************************* ;*************************************************
;align 4 ;align 4
@ -418,12 +381,10 @@ dl_dy equ esp+0
mov bp, bx ; ebp = y2 mov bp, bx ; ebp = y2
shr eax, 16 ; eax = x1 shr eax, 16 ; eax = x1
shr ebx, 16 ; ebx = y1 shr ebx, 16 ; ebx = y1
push eax ; save x1 push eax ; save x1
push ebx ; save y1 push ebx ; save y1
push esi ; save x2 push esi ; save x2
push ebp ; save y2 push ebp ; save y2
; checking x-axis... ; checking x-axis...
sub esi, eax ; esi = x2-x1 sub esi, eax ; esi = x2-x1
push esi ; save y2-y1 push esi ; save y2-y1
@ -436,7 +397,6 @@ dl_dy equ esp+0
.x2lx1: .x2lx1:
neg esi ; get esi absolute value neg esi ; get esi absolute value
.no_vline: .no_vline:
; checking y-axis... ; checking y-axis...
sub ebp, ebx ; ebp = y2-y1 sub ebp, ebx ; ebp = y2-y1
push ebp ; save y2-y1 push ebp ; save y2-y1
@ -445,17 +405,14 @@ dl_dy equ esp+0
mov edx, [dl_x2] ; else (if y1=y2) mov edx, [dl_x2] ; else (if y1=y2)
call hline call hline
jmp .exit jmp .exit
.y2ly1: .y2ly1:
neg ebp ; get ebp absolute value neg ebp ; get ebp absolute value
.no_hline: .no_hline:
cmp ebp, esi cmp ebp, esi
jle .x_rules ; |y2-y1| < |x2-x1| ? jle .x_rules ; |y2-y1| < |x2-x1| ?
cmp [dl_y2], ebx ; make sure y1 is at the begining cmp [dl_y2], ebx ; make sure y1 is at the begining
jge .no_reverse1 jge .no_reverse1
neg dword [dl_dx] neg dword [dl_dx]
mov edx, [dl_x2] mov edx, [dl_x2]
mov [dl_x2], eax mov [dl_x2], eax
@ -463,9 +420,7 @@ dl_dy equ esp+0
mov edx, [dl_y2] mov edx, [dl_y2]
mov [dl_y2], ebx mov [dl_y2], ebx
mov [dl_y1], edx mov [dl_y1], edx
.no_reverse1: .no_reverse1:
mov eax, [dl_dx] mov eax, [dl_dx]
cdq ; extend eax sing to edx cdq ; extend eax sing to edx
shl eax, 16 ; using 16bit fix-point maths shl eax, 16 ; using 16bit fix-point maths
@ -473,13 +428,11 @@ dl_dy equ esp+0
mov edx, ebp ; edx = counter (number of pixels to draw) mov edx, ebp ; edx = counter (number of pixels to draw)
mov ebp, 1 *65536 ; <<16 ; ebp = dy = 1.0 mov ebp, 1 *65536 ; <<16 ; ebp = dy = 1.0
mov esi, eax ; esi = dx mov esi, eax ; esi = dx
jmp .y_rules jmp .y_rules
.x_rules:
.x_rules:
cmp [dl_x2], eax ; make sure x1 is at the begining cmp [dl_x2], eax ; make sure x1 is at the begining
jge .no_reverse2 jge .no_reverse2
neg dword [dl_dy] neg dword [dl_dy]
mov edx, [dl_x2] mov edx, [dl_x2]
mov [dl_x2], eax mov [dl_x2], eax
@ -487,9 +440,7 @@ dl_dy equ esp+0
mov edx, [dl_y2] mov edx, [dl_y2]
mov [dl_y2], ebx mov [dl_y2], ebx
mov [dl_y1], edx mov [dl_y1], edx
.no_reverse2: .no_reverse2:
xor edx, edx xor edx, edx
mov eax, [dl_dy] mov eax, [dl_dy]
cdq ; extend eax sing to edx cdq ; extend eax sing to edx
@ -498,29 +449,22 @@ dl_dy equ esp+0
mov edx, esi ; edx = counter (number of pixels to draw) mov edx, esi ; edx = counter (number of pixels to draw)
mov esi, 1 *65536 ;<< 16 ; esi = dx = 1.0 mov esi, 1 *65536 ;<< 16 ; esi = dx = 1.0
mov ebp, eax ; ebp = dy mov ebp, eax ; ebp = dy
.y_rules: .y_rules:
mov eax, [dl_x1] mov eax, [dl_x1]
mov ebx, [dl_y1] mov ebx, [dl_y1]
shl eax, 16 shl eax, 16
shl ebx, 16 shl ebx, 16
align 4 align 4
.draw: .draw:
push eax ebx push eax ebx
shr eax, 16 shr eax, 16
shr ebx, 16 shr ebx, 16
call [putpixel] call [putpixel]
pop ebx eax pop ebx eax
add ebx, ebp ; y = y+dy add ebx, ebp ; y = y+dy
add eax, esi ; x = x+dx add eax, esi ; x = x+dx
dec edx dec edx
jnz .draw jnz .draw
; force last drawn pixel to be at (x2,y2) ; force last drawn pixel to be at (x2,y2)
mov eax, [dl_x2] mov eax, [dl_x2]
mov ebx, [dl_y2] mov ebx, [dl_y2]
@ -541,7 +485,6 @@ hline:
; ecx = color ; ecx = color
; edi = force ? ; edi = force ?
push eax edx push eax edx
cmp edx, eax ; make sure x2 is above x1 cmp edx, eax ; make sure x2 is above x1
jge @f jge @f
xchg eax, edx xchg eax, edx
@ -551,7 +494,6 @@ hline:
inc eax inc eax
cmp eax, edx cmp eax, edx
jle @b jle @b
pop edx eax pop edx eax
ret ret
@ -564,7 +506,6 @@ vline:
; ecx = color ; ecx = color
; edi = force ? ; edi = force ?
push ebx edx push ebx edx
cmp edx, ebx ; make sure y2 is above y1 cmp edx, ebx ; make sure y2 is above y1
jge @f jge @f
xchg ebx, edx xchg ebx, edx
@ -574,7 +515,6 @@ vline:
inc ebx inc ebx
cmp ebx, edx cmp ebx, edx
jle @b jle @b
pop edx ebx pop edx ebx
ret ret
@ -605,30 +545,23 @@ align 4
; edx ye ; edx ye
; edi color ; edi color
vesa20_drawbar: vesa20_drawbar:
pushad pushad
call [disable_mouse] call [disable_mouse]
sub esp, drbar.stack_data sub esp, drbar.stack_data
mov [drbar.color], edi mov [drbar.color], edi
sub edx, ebx sub edx, ebx
jle .exit ;// mike.dld, 2005-01-29 jle .exit ;// mike.dld, 2005-01-29
sub ecx, eax sub ecx, eax
jle .exit ;// mike.dld, 2005-01-29 jle .exit ;// mike.dld, 2005-01-29
mov [drbar.bar_sy], edx mov [drbar.bar_sy], edx
mov [drbar.bar_sx], ecx mov [drbar.bar_sx], ecx
mov [drbar.bar_cx], eax mov [drbar.bar_cx], eax
mov [drbar.bar_cy], ebx mov [drbar.bar_cy], ebx
mov edi, [TASK_BASE] mov edi, [TASK_BASE]
add eax, [edi-twdw + WDATA.box.left] ; win_cx add eax, [edi-twdw + WDATA.box.left] ; win_cx
add ebx, [edi-twdw + WDATA.box.top] ; win_cy add ebx, [edi-twdw + WDATA.box.top] ; win_cy
mov [drbar.abs_cx], eax mov [drbar.abs_cx], eax
mov [drbar.abs_cy], ebx mov [drbar.abs_cy], ebx
; real_sx = MIN(wnd_sx-bar_cx, bar_sx); ; real_sx = MIN(wnd_sx-bar_cx, bar_sx);
mov ebx, [edi-twdw + WDATA.box.width] ; ebx = wnd_sx mov ebx, [edi-twdw + WDATA.box.width] ; ebx = wnd_sx
; \begin{diamond}[20.08.2006] ; \begin{diamond}[20.08.2006]
@ -642,7 +575,6 @@ vesa20_drawbar:
popad popad
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
@@: @@:
cmp ebx, [drbar.bar_sx] cmp ebx, [drbar.bar_sx]
@ -650,7 +582,6 @@ vesa20_drawbar:
mov ebx, [drbar.bar_sx] mov ebx, [drbar.bar_sx]
.end_x: .end_x:
mov [drbar.real_sx], ebx mov [drbar.real_sx], ebx
; real_sy = MIN(wnd_sy-bar_cy, bar_sy); ; real_sy = MIN(wnd_sy-bar_cy, bar_sy);
mov ebx, [edi-twdw + WDATA.box.height] ; ebx = wnd_sy mov ebx, [edi-twdw + WDATA.box.height] ; ebx = wnd_sy
; \begin{diamond}[20.08.2006] ; \begin{diamond}[20.08.2006]
@ -662,7 +593,6 @@ vesa20_drawbar:
popad popad
xor eax, eax xor eax, eax
inc eax inc eax
ret ret
@@: @@:
cmp ebx, [drbar.bar_sy] cmp ebx, [drbar.bar_sy]
@ -670,13 +600,11 @@ vesa20_drawbar:
mov ebx, [drbar.bar_sy] mov ebx, [drbar.bar_sy]
.end_y: .end_y:
mov [drbar.real_sy], ebx mov [drbar.real_sy], ebx
; line_inc_map ; line_inc_map
mov eax, [ScreenWidth] mov eax, [ScreenWidth]
sub eax, [drbar.real_sx] sub eax, [drbar.real_sx]
inc eax inc eax
mov [drbar.line_inc_map], eax mov [drbar.line_inc_map], eax
; line_inc_scr ; line_inc_scr
mov eax, [drbar.real_sx] mov eax, [drbar.real_sx]
movzx ebx, byte [ScreenBPP] movzx ebx, byte [ScreenBPP]
@ -685,7 +613,6 @@ vesa20_drawbar:
neg eax neg eax
add eax, [BytesPerScanLine] add eax, [BytesPerScanLine]
mov [drbar.line_inc_scr], eax mov [drbar.line_inc_scr], eax
; pointer to screen ; pointer to screen
mov edx, [drbar.abs_cy] mov edx, [drbar.abs_cy]
imul edx, [BytesPerScanLine] imul edx, [BytesPerScanLine]
@ -695,7 +622,6 @@ vesa20_drawbar:
imul eax, ebx imul eax, ebx
add edx, eax add edx, eax
add edx, [LFBAddress] add edx, [LFBAddress]
; pointer to pixel map ; pointer to pixel map
mov eax, [drbar.abs_cy] mov eax, [drbar.abs_cy]
imul eax, [ScreenWidth] imul eax, [ScreenWidth]
@ -703,10 +629,8 @@ vesa20_drawbar:
add eax, [drbar.abs_cx] add eax, [drbar.abs_cx]
add eax, WinMapAddress add eax, WinMapAddress
xchg eax, ebp xchg eax, ebp
; get process number ; get process number
mov ebx, [CURRENT_TASK] mov ebx, [CURRENT_TASK]
cmp byte [ScreenBPP], 24 cmp byte [ScreenBPP], 24
jne draw_bar_end_32 jne draw_bar_end_32
draw_bar_end_24: draw_bar_end_24:
@ -720,31 +644,25 @@ draw_bar_end_24:
; edx - pointer to screen ; edx - pointer to screen
; esi - counter ; esi - counter
; edi - counter ; edi - counter
mov esi, [drbar.real_sy] mov esi, [drbar.real_sy]
align 4 align 4
.new_y: .new_y:
mov edi, [drbar.real_sx] mov edi, [drbar.real_sx]
align 4 align 4
.new_x: .new_x:
cmp byte [ebp], bl cmp byte [ebp], bl
jne .skip jne .skip
mov [edx], bh mov [edx], bh
mov [edx + 1], ax mov [edx + 1], ax
.skip: .skip:
; add pixel ; add pixel
add edx, 3 add edx, 3
inc ebp inc ebp
dec edi dec edi
jnz .new_x jnz .new_x
; add line ; add line
add edx, [drbar.line_inc_scr] add edx, [drbar.line_inc_scr]
add ebp, [drbar.line_inc_map] add ebp, [drbar.line_inc_map]
; <Ivan 15.10.04> drawing gradient bars ; <Ivan 15.10.04> drawing gradient bars
test eax, 0x00800000 test eax, 0x00800000
jz @f jz @f
@ -753,10 +671,8 @@ draw_bar_end_24:
dec bh dec bh
@@: @@:
; </Ivan 15.10.04> ; </Ivan 15.10.04>
dec esi dec esi
jnz .new_y jnz .new_y
add esp, drbar.stack_data add esp, drbar.stack_data
popad popad
xor eax, eax xor eax, eax
@ -764,30 +680,24 @@ ret
draw_bar_end_32: draw_bar_end_32:
mov eax, [drbar.color] ;; BBGGRR00 mov eax, [drbar.color] ;; BBGGRR00
mov esi, [drbar.real_sy] mov esi, [drbar.real_sy]
align 4 align 4
.new_y: .new_y:
mov edi, [drbar.real_sx] mov edi, [drbar.real_sx]
align 4 align 4
.new_x: .new_x:
cmp byte [ebp], bl cmp byte [ebp], bl
jne .skip jne .skip
mov [edx], eax mov [edx], eax
.skip: .skip:
; add pixel ; add pixel
add edx, 4 add edx, 4
inc ebp inc ebp
dec edi dec edi
jnz .new_x jnz .new_x
; add line ; add line
add edx, [drbar.line_inc_scr] add edx, [drbar.line_inc_scr]
add ebp, [drbar.line_inc_map] add ebp, [drbar.line_inc_map]
; <Ivan 15.10.04> drawing gradient bars ; <Ivan 15.10.04> drawing gradient bars
test eax, 0x80000000 test eax, 0x80000000
jz @f jz @f
@ -796,10 +706,8 @@ draw_bar_end_32:
dec al dec al
@@: @@:
; </Ivan 15.10.04> ; </Ivan 15.10.04>
dec esi dec esi
jnz .new_y jnz .new_y
add esp, drbar.stack_data add esp, drbar.stack_data
popad popad
call VGA_draw_bar call VGA_draw_bar
@ -807,7 +715,6 @@ draw_bar_end_32:
mov [EGA_counter],1 mov [EGA_counter],1
ret ret
;voodoodbcplimit: ;voodoodbcplimit:
; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer ; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer
@ -868,75 +775,54 @@ ret
;--------------vbe voodoo ------------------------------------------------ ;--------------vbe voodoo ------------------------------------------------
vesa20_drawbackground_tiled: vesa20_drawbackground_tiled:
call [disable_mouse] call [disable_mouse]
push ebp push ebp
push eax push eax
push ebx push ebx
push ecx push ecx
push edx push edx
mov edx,dword [WinMapAddress-8] ; B mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B add edx,dword [WinMapAddress-8] ; +B
push edx push edx
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin) mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin) mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
mov eax,[BytesPerScanLine] mov eax,[BytesPerScanLine]
mul ebx mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y) xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X add ebp, eax ; +X
add ebp, eax ; +X add ebp, eax ; +X
add ebp, eax ; +X add ebp, eax ; +X
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f jz @f
add ebp,eax ; +X add ebp,eax ; +X
@@: @@:
add ebp,[LFBAddress] ; +LFB add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
dp3: ; MAIN LOOP dp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1) cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
; je ybgp
;
; jmp nbgp
;
; ybgp:
jne nbgp jne nbgp
push eax push eax
push ebx push ebx
mov ecx,dword [WinMapAddress-8] ; B mov ecx,dword [WinMapAddress-8] ; B
xor edx,edx ; edx:=0 xor edx,edx ; edx:=0
div ecx ; Xstart/B div ecx ; Xstart/B
; eax=Int(qn) edx:=Rem ; eax=Int(qn) edx:=Rem
lea esi,[edx+edx*2] ; esi:=edx*3 lea esi,[edx+edx*2] ; esi:=edx*3
mov ecx,dword [WinMapAddress-4] ; ecx:=H mov ecx,dword [WinMapAddress-4] ; ecx:=H
mov eax,[esp+0] ; eax:=Ystart mov eax,[esp+0] ; eax:=Ystart
xor edx,edx ; xor edx,edx ;
div ecx ; Ystart/H div ecx ; Ystart/H
mov eax,edx ; eax:=Rem mov eax,edx ; eax:=Rem
xor edx,edx ; xor edx,edx ;
mov ebx,[esp+8] ; ebx:=B*3 mov ebx,[esp+8] ; ebx:=B*3
mul ebx ; mul ebx ;
add esi,eax ; add esi,eax ;
mov eax,[esi+IMG_BACKGROUND] ; mov eax,[esi+IMG_BACKGROUND]
mov eax,[img_background]
mov eax,[esi+eax]
and eax,0xffffff and eax,0xffffff
xchg edi, ebp xchg edi, ebp
stosw stosw
shr eax,16 shr eax,16
@ -946,35 +832,23 @@ vesa20_drawbackground_tiled:
jz @f jz @f
inc ebp ; +1 inc ebp ; +1
@@: @@:
pop ebx pop ebx
pop eax pop eax
jmp hook1 jmp hook1
nbgp: nbgp:
add ebp,3 ; +3 add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f jz @f
inc ebp ; +1 inc ebp ; +1
@@: @@:
hook1: hook1:
inc edi ; ptrBuffer++ inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3 add esi,3 ; ptrImage+=3
inc eax inc eax
cmp eax,[draw_data+32+RECT.right] ; X > xend? cmp eax,[draw_data+32+RECT.right] ; X > xend?
; jg nodp3
; jmp dp3
;
; nodp3:
jle dp3 jle dp3
mov ebp,[draw_data+32+RECT.left] mov ebp,[draw_data+32+RECT.left]
inc ebx inc ebx
mov eax,[BytesPerScanLine] mov eax,[BytesPerScanLine]
mul ebx mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y) xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
@ -986,21 +860,11 @@ vesa20_drawbackground_tiled:
add ebp,eax ; +X=X*4 add ebp,eax ; +X=X*4
@@: @@:
add ebp,[LFBAddress] ; +LFB add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
cmp ebx,[draw_data+32+RECT.bottom] cmp ebx,[draw_data+32+RECT.bottom]
; jg dp4
;
; jmp dp3
;
; dp4:
jle dp3 jle dp3
add esp,4 add esp,4
pop edx pop edx
pop ecx pop ecx
pop ebx pop ebx
@ -1014,41 +878,33 @@ vesa20_drawbackground_tiled:
vesa20_drawbackground_stretch: vesa20_drawbackground_stretch:
call [disable_mouse] call [disable_mouse]
push ebp push ebp
push eax push eax
push ebx push ebx
push ecx push ecx
push edx push edx
mov edx,dword [WinMapAddress-8] ; B mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B add edx,dword [WinMapAddress-8] ; +B
push edx push edx
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin) mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin) mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
dec ebx
mov eax,[BytesPerScanLine] mov eax,[BytesPerScanLine]
mul ebx mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y) xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X add ebp, eax ; +X
add ebp, eax ; +X add ebp, eax ; +X
add ebp, eax ; +X add ebp, eax ; +X
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f jz @f
add ebp,eax ; +X add ebp,eax ; +X
@@: @@:
add ebp,[LFBAddress] ; +LFB add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
sdp3: ; MAIN LOOP sdp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1) cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
jne snbgp jne snbgp
@ -1070,7 +926,20 @@ shl ecx,16
mov cx,dx mov cx,dx
imul eax, [esp+8] ;8 imul eax, [esp+8] ;8
add esi,eax add esi,eax
mov eax,[esi+IMG_BACKGROUND] ; mov eax,[esi+IMG_BACKGROUND]
mov eax,[img_background]
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
sub eax,3
cmp eax,esi
pop eax
jbe @f
mov eax,[esi+eax]
@@:
push eax push eax
ror ecx,16 ror ecx,16
xor eax,eax xor eax,eax
@ -1083,7 +952,20 @@ div ebx
cmp eax,5 cmp eax,5
pop eax pop eax
jb @f jb @f
mov ebx,[esi+IMG_BACKGROUND+3] ; mov ebx,[esi+IMG_BACKGROUND+3]
mov ebx,[img_background]
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
sub eax,3
cmp eax,esi
pop eax
jbe @f
mov ebx,[esi+ebx+3]
call overlapping_of_points call overlapping_of_points
@@: @@:
push eax push eax
@ -1101,7 +983,16 @@ jb @f
mov ebx,[display_data-8] mov ebx,[display_data-8]
shl ebx,1 shl ebx,1
add ebx,[display_data-8] add ebx,[display_data-8]
add ebx,IMG_BACKGROUND add ebx,[img_background] ;IMG_BACKGROUND
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
cmp eax,esi
pop eax
jbe @f
add ebx,esi add ebx,esi
mov ebx,[ebx] mov ebx,[ebx]
call overlapping_of_points call overlapping_of_points
@ -1162,12 +1053,12 @@ ret
@@: @@:
shook1: shook1:
inc edi ; ptrBuffer++ inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3 add esi,3 ; ptrImage+=3
inc eax inc eax
cmp eax,[draw_data+32+RECT.right] ; X > xend? cmp eax,[draw_data+32+RECT.right] ; X > xend?
jle sdp3 jle sdp3
; jbe sdp3
mov ebp,[draw_data+32+RECT.left] mov ebp,[draw_data+32+RECT.left]
@ -1189,9 +1080,13 @@ ret
call calculate_edi call calculate_edi
; cmp ebx,[ScreenHeight]
; ja @f
cmp ebx,[draw_data+32+RECT.bottom] cmp ebx,[draw_data+32+RECT.bottom]
jle sdp3 jle sdp3
; jbe sdp3
@@:
add esp,4 add esp,4
pop edx pop edx