diff --git a/kernel/trunk/gui/mouse.inc b/kernel/trunk/gui/mouse.inc index 0de8b38260..2d50d70e7c 100644 --- a/kernel/trunk/gui/mouse.inc +++ b/kernel/trunk/gui/mouse.inc @@ -527,9 +527,12 @@ mouse._.find_sys_window_under_cursor: ;//////////////////////////////////////// ;< esi = process slot ;< edi = pointer to WDATA struct ;------------------------------------------------------------------------------ - mov esi, [Screen_Max_X] - inc esi - imul esi, [mouse.state.pos.y] +; mov esi, [Screen_Max_X] +; inc esi +; imul esi, [mouse.state.pos.y] + mov esi, [mouse.state.pos.y] + mov esi, [d_width_calc_area + esi*4] + add esi, [_WinMapAddress] add esi, [mouse.state.pos.x] movzx esi, byte[esi] diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index c641c79554..83b9c49d82 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -1830,10 +1830,14 @@ align 4 ; get WinMap start push esi - mov edi, [Screen_Max_X] - inc edi - mov esi, edi - imul edi, ebx +; mov edi, [Screen_Max_X] +; inc edi +; mov esi, edi + mov esi, [Screen_Max_X] + inc esi +; imul edi, ebx + mov edi, [d_width_calc_area + ebx*4] + add edi, eax add edi, [_WinMapAddress] pop eax @@ -1874,9 +1878,11 @@ align 4 ; get WinMap start -> ebp push eax - mov eax, [Screen_Max_X] ; screen_sx - inc eax - imul eax, ebx +; mov eax, [Screen_Max_X] ; screen_sx +; inc eax +; imul eax, ebx + mov eax, [d_width_calc_area + ebx*4] + add eax, [esp] add eax, [_WinMapAddress] mov ebp, eax diff --git a/kernel/trunk/hid/mousedrv.inc b/kernel/trunk/hid/mousedrv.inc index a00e3d5a21..62018985bf 100644 --- a/kernel/trunk/hid/mousedrv.inc +++ b/kernel/trunk/hid/mousedrv.inc @@ -110,9 +110,11 @@ save_draw_mouse: push eax push ebx - mov ecx, [Screen_Max_X] - inc ecx - mul ecx +; mov ecx, [Screen_Max_X] +; inc ecx +; mul ecx + mov eax, [d_width_calc_area + eax*4] + add eax, [_WinMapAddress] movzx edx, byte [ebx+eax] shl edx, 8 diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index ffd4156001..0b892c4c82 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -1955,9 +1955,11 @@ restore_default_cursor_before_killing: movzx eax, word [MOUSE_Y] movzx ebx, word [MOUSE_X] - mov ecx, [Screen_Max_X] - inc ecx - mul ecx +; mov ecx, [Screen_Max_X] +; inc ecx +; mul ecx + mov eax, [d_width_calc_area + eax*4] + add eax, [_WinMapAddress] movzx edx, byte [ebx+eax] shl edx, 8 @@ -3083,22 +3085,23 @@ modify_pce: ; check if pixel is allowed to be drawn -checkpixel: - push eax edx +;checkpixel: +; push eax edx - mov edx, [Screen_Max_X] ; screen x size - inc edx - imul edx, ebx - add eax, [_WinMapAddress] - mov dl, [eax+edx]; lea eax, [...] +;; mov edx, [Screen_Max_X] ; screen x size +;; inc edx +;; imul edx, ebx +; mov edx, [d_width_calc_area + ebx*4] +; add eax, [_WinMapAddress] +; mov dl, [eax+edx]; lea eax, [...] - xor ecx, ecx - mov eax, [CURRENT_TASK] - cmp al, dl - setne cl +; xor ecx, ecx +; mov eax, [CURRENT_TASK] +; cmp al, dl +; setne cl - pop edx eax - ret +; pop edx eax +; ret iglobal cpustring db 'CPU',0 @@ -4807,7 +4810,7 @@ paleholder: align 4 calculate_fast_getting_offset_for_WinMapAddress: ; calculate data area for fast getting offset to _WinMapAddress - mov eax, [_display.width] + xor eax, eax mov ecx, [_display.height] inc ecx mov edi, d_width_calc_area diff --git a/kernel/trunk/video/blitter.inc b/kernel/trunk/video/blitter.inc index 859cae2422..a82877726d 100644 --- a/kernel/trunk/video/blitter.inc +++ b/kernel/trunk/video/blitter.inc @@ -340,7 +340,9 @@ blit_32: mov edi, ebp imul edi, [_display.pitch] - imul ebp, [_display.width] +; imul ebp, [_display.width] + mov ebp, [d_width_calc_area + ebp*4] + add ebp, ebx add ebp, [_WinMapAddress] diff --git a/kernel/trunk/video/cursors.inc b/kernel/trunk/video/cursors.inc index dba5370902..a09d09102a 100644 --- a/kernel/trunk/video/cursors.inc +++ b/kernel/trunk/video/cursors.inc @@ -592,7 +592,7 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword mov esi, [hcursor] mov ecx, [x] mov eax, [y] - mov ebx, [BytesPerScanLine] +; mov ebx, [BytesPerScanLine] xor edx, edx sub ecx, [esi+CURSOR.hot_x] @@ -618,7 +618,10 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword sub edx, [y] mov [_dy], edx - mul dword [BytesPerScanLine] +; mul dword [BytesPerScanLine] + mov eax, [d_width_calc_area + eax*4] + lea eax, [eax + eax*2] + lea edx, [LFB_BASE+ecx*3] add edx, eax mov [cur_saved_base], edx @@ -734,7 +737,10 @@ proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword sub edx, [y] mov [_dy], edx - mul dword [BytesPerScanLine] +; mul dword [BytesPerScanLine] + mov eax, [d_width_calc_area + eax*4] + shl eax, 2 + lea edx, [LFB_BASE+eax+ecx*4] mov [cur_saved_base], edx diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc index 911efd5fb7..9a0a159cde 100644 --- a/kernel/trunk/video/vesa20.inc +++ b/kernel/trunk/video/vesa20.inc @@ -61,7 +61,9 @@ Vesa20_getpixel24: jnz @f .no_mouseunder: ;-------------------------------------- - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + lea ebx, [ebx + ebx*2] lea edi, [eax+eax*2]; edi = x*3 add edi, ebx ; edi = x*3+(y*y multiplier) mov ecx, [LFB_BASE+edi] @@ -82,7 +84,9 @@ Vesa20_getpixel32: jnz @f .no_mouseunder: ;-------------------------------------- - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + shl ebx, 2 lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) mov ecx, [LFB_BASE+edi] ;-------------------------------------- @@ -218,16 +222,31 @@ align 4 mov esi, [putimg.pti] ; pointer to screen mov edx, [putimg.abs_cy] - imul edx, [BytesPerScanLine] +; imul edx, [BytesPerScanLine] + + mov edx, [d_width_calc_area + edx*4] + cmp bl, 4 + je .32 + lea edx, [edx+edx*2] + jmp @f +;------------------------------------- +align 4 +.32: + shl edx, 2 +;------------------------------------- +align 4 +@@: mov eax, [putimg.abs_cx] - movzx ebx, byte [ScreenBPP] - shr ebx, 3 +; movzx ebx, byte [ScreenBPP] +; shr ebx, 3 imul eax, ebx add edx, eax ; pointer to pixel map mov eax, [putimg.abs_cy] - imul eax, [Screen_Max_X] - add eax, [putimg.abs_cy] +; imul eax, [Screen_Max_X] +; add eax, [putimg.abs_cy] + mov eax, [d_width_calc_area + eax*4] + add eax, [putimg.abs_cx] add eax, [_WinMapAddress] xchg eax, ebp @@ -557,7 +576,6 @@ __sys_putpixel: ; not forced: mov edx, [d_width_calc_area + ebx*4] - sub edx, [_display.width] add edx, [_WinMapAddress] movzx edx, byte [eax+edx] cmp edx, [CURRENT_TASK] @@ -595,7 +613,10 @@ Vesa20_putpixel24: shl ecx, 16 mov cx, bx - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + lea ebx, [ebx + ebx*2] + lea edi, [eax+eax*2]; edi = x*3 mov eax, [esp+32-8+4] ;-------------------------------------- @@ -620,7 +641,10 @@ Vesa20_putpixel24_new: shl ecx, 16 mov cx, bx - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + lea ebx, [ebx + ebx*2] + lea edi, [eax+eax*2]; edi = x*3 mov eax, [esp+32-8+4] ;-------------------------------------- @@ -662,7 +686,10 @@ Vesa20_putpixel32: shl ecx, 16 mov cx, bx - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + shl ebx, 2 + lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) mov eax, [esp+32-8+4]; eax = color ;-------------------------------------- @@ -686,7 +713,10 @@ Vesa20_putpixel32_new: shl ecx, 16 mov cx, bx - imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier +; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier + mov ebx, [d_width_calc_area + ebx*4] + shl ebx, 2 + lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) mov eax, [esp+32-8+4]; eax = color ;-------------------------------------- @@ -721,9 +751,10 @@ align 4 ;----------------------------------------------------------------------------- align 4 calculate_edi: - mov edi, ebx - imul edi, [Screen_Max_X] - add edi, ebx +; mov edi, ebx +; imul edi, [Screen_Max_X] +; add edi, ebx + mov edi, [d_width_calc_area + ebx*4] add edi, eax ret ;----------------------------------------------------------------------------- @@ -1056,16 +1087,29 @@ align 4 mov [drbar.line_inc_scr], eax ; pointer to screen mov edx, [drbar.abs_cy] - imul edx, [BytesPerScanLine] +; imul edx, [BytesPerScanLine] + + mov edx, [d_width_calc_area + edx*4] + cmp bl, 4 + je .32 + lea edx, [edx+edx*2] + jmp @f +;------------------------------------- +align 4 +.32: + shl edx, 2 +;------------------------------------- +align 4 +@@: mov eax, [drbar.abs_cx] -; movzx ebx, byte [ScreenBPP] -; shr ebx, 3 imul eax, ebx add edx, eax ; pointer to pixel map mov eax, [drbar.abs_cy] - imul eax, [Screen_Max_X] - add eax, [drbar.abs_cy] +; imul eax, [Screen_Max_X] +; add eax, [drbar.abs_cy] + mov eax, [d_width_calc_area + eax*4] + add eax, [drbar.abs_cx] add eax, [_WinMapAddress] xchg eax, ebp @@ -1080,23 +1124,23 @@ align 4 add edx, LFB_BASE ;-------------------------------------- ; get process number - mov ebx, [CURRENT_TASK] + mov ebx, [CURRENT_TASK] ; bl - process num + mov esi, [drbar.real_sy] + mov eax, [drbar.color] ; BBGGRR00 + rol eax, 8 + mov bh, al ; 0x80 drawing gradient bars + ror eax, 8 cmp byte [ScreenBPP], 24 jne draw_bar_end_32 ;-------------------------------------- align 4 draw_bar_end_24: - mov eax, [drbar.color] ;; BBGGRR00 - mov bh, al ;; bh = BB - shr eax, 8 ;; eax = RRGG -; eax - color high RRGG +; eax - color high RRGGBB ; bl - process num -; bh - color low BB ; ecx - temp ; edx - pointer to screen ; esi - counter ; edi - counter - mov esi, [drbar.real_sy] cmp [_display.select_cursor], 0 jne draw_bar_end_24_new ;-------------------------------------- @@ -1109,23 +1153,19 @@ align 4 cmp byte [ebp], bl jne .skip ;-------------------------------------- - push eax - - mov ecx, [drbar.real_sx_and_abs_cx + 4] + mov ecx, [drbar.real_sx_and_abs_cx] sub ecx, edi shl ecx, 16 - add ecx, [drbar.real_sy_and_abs_cy + 4] + add ecx, [drbar.real_sy_and_abs_cy] sub ecx, esi - shl eax, 8 - mov al, bh ; check mouse area for putpixel call check_mouse_area_for_putpixel ; store to real LFB mov [edx], ax shr eax, 16 mov [edx + 2], al - pop eax + mov eax, [drbar.color] ;-------------------------------------- align 4 .skip: @@ -1137,16 +1177,15 @@ align 4 ; add line add edx, [drbar.line_inc_scr] add ebp, [drbar.line_inc_map] -; drawing gradient bars - test eax, 0x00800000 +; drawing gradient bars + test bh, 0x80 jz @f - test bh, bh + test al, al jz @f - dec bh + dec al ;-------------------------------------- align 4 @@: -; dec esi jnz .new_y ;-------------------------------------- @@ -1191,24 +1230,20 @@ align 4 jae .no_mouse_area ;-------------------------------------- ; check mouse area for putpixel - push eax - - shl eax, 8 - mov al, bh - call check_mouse_area_for_putpixel_new.1 -; store to real LFB mov [edx], ax shr eax, 16 mov [edx + 2], al - pop eax + mov eax, [drbar.color] jmp .skip ; store to real LFB ;-------------------------------------- align 4 .no_mouse_area: - mov [edx], bh - mov [edx + 1], ax + mov [edx], ax + ror eax, 16 + mov [edx + 2], al + rol eax, 16 ;-------------------------------------- align 4 .skip: @@ -1220,24 +1255,27 @@ align 4 ; add line add edx, [drbar.line_inc_scr] add ebp, [drbar.line_inc_map] -; drawing gradient bars - test eax, 0x00800000 +; drawing gradient bars + test bh, 0x80 jz @f - test bh, bh + test al, al jz @f - dec bh + dec al ;-------------------------------------- align 4 @@: -; dec esi jnz .new_y jmp draw_bar_end_24.end ;-------------------------------------- align 4 draw_bar_end_32: - mov eax, [drbar.color] ;; BBGGRR00 - mov esi, [drbar.real_sy] +; eax - color high RRGGBB +; bl - process num +; ecx - temp +; edx - pointer to screen +; esi - counter +; edi - counter cmp [_display.select_cursor], 0 jne draw_bar_end_32_new ;-------------------------------------- @@ -1250,19 +1288,17 @@ align 4 cmp byte [ebp], bl jne .skip ;-------------------------------------- - push eax - - mov ecx, [drbar.real_sx_and_abs_cx + 4] + mov ecx, [drbar.real_sx_and_abs_cx] sub ecx, edi shl ecx, 16 - add ecx, [drbar.real_sy_and_abs_cy + 4] + add ecx, [drbar.real_sy_and_abs_cy] sub ecx, esi ; check mouse area for putpixel call check_mouse_area_for_putpixel ; store to real LFB mov [edx], eax - pop eax + mov eax, [drbar.color] ;-------------------------------------- align 4 .skip: @@ -1274,8 +1310,8 @@ align 4 ; add line add edx, [drbar.line_inc_scr] add ebp, [drbar.line_inc_map] -; drawing gradient bars - test eax, 0x80000000 +; drawing gradient bars + test bh, 0x80 jz @f test al, al jz @f @@ -1283,7 +1319,6 @@ align 4 ;-------------------------------------- align 4 @@: -; dec esi jnz .new_y ;-------------------------------------- @@ -1335,10 +1370,9 @@ align 4 jae .no_mouse_area ;-------------------------------------- ; check mouse area for putpixel - push eax call check_mouse_area_for_putpixel_new.1 mov [edx], eax - pop eax + mov eax, [drbar.color] jmp .skip ; store to real LFB ;-------------------------------------- @@ -1356,8 +1390,8 @@ align 4 ; add line add edx, [drbar.line_inc_scr] add ebp, [drbar.line_inc_map] -; drawing gradient bars - test eax, 0x80000000 +; drawing gradient bars + test bh, 0x80 jz @f test al, al jz @f @@ -1365,7 +1399,6 @@ align 4 ;-------------------------------------- align 4 @@: -; dec esi jnz .new_y jmp draw_bar_end_32.end @@ -1381,8 +1414,20 @@ dp2: mov ebp, [draw_data+32+RECT.left] ; x start ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp] ; and LFB data (output for our function) [edi] - mov eax, [BytesPerScanLine] - mul ebx +; mov eax, [BytesPerScanLine] +; mul ebx + mov eax, [d_width_calc_area + ebx*4] + cmp [ScreenBPP], byte 32 + je .32 + lea eax, [eax+eax*2] + jmp @f +;------------------------------------- +align 4 +.32: + shl eax, 2 +;------------------------------------- +align 4 +@@: xchg ebp, eax add ebp, eax add ebp, eax @@ -1514,8 +1559,21 @@ vesa20_drawbackground_stretch: mov ebp, [draw_data+32+RECT.left] ; x start ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp] ; and LFB data (output for our function) [edi] - mov eax, [BytesPerScanLine] - mul ebx +; mov eax, [BytesPerScanLine] +; mul ebx + mov eax, [d_width_calc_area + ebx*4] + cmp [ScreenBPP], byte 32 + je .32 + lea eax, [eax+eax*2] + jmp @f +;------------------------------------- +align 4 +.32: + shl eax, 2 +;------------------------------------- +align 4 +@@: + xchg ebp, eax add ebp, eax add ebp, eax