forked from KolibriOS/kolibrios
Rustem Gimadutdinov (rgimad)
1c00c160a2
git-svn-id: svn://kolibrios.org@8734 a494cfbc-eb01-0410-851d-a64ba20cac60
125 lines
3.4 KiB
PHP
125 lines
3.4 KiB
PHP
; draw main window
|
|
align 4
|
|
proc draw_main_window stdcall
|
|
DEBUGF DBG_INFO, "draw_main_window() start\n"
|
|
mcall 12, 1 ; notify about draw beginning
|
|
mcall 48, 3, sys_colors, sizeof.system_colors
|
|
|
|
mov edx, [sys_colors.work] ; background color
|
|
or edx, 0x74000000 ; window type
|
|
; DEBUGF DBG_INFO, "mainwindow w, h = %u, %u", GFX_COLS*GFX_PIX_SIZE + 8, GFX_ROWS*GFX_PIX_SIZE + 28
|
|
mcall 0, <50, GFX_COLS*GFX_PIX_SIZE + 9>, <50, GFX_ROWS*GFX_PIX_SIZE + 28>, , , main_window_title ;
|
|
|
|
stdcall draw_screen
|
|
|
|
mcall 12, 2 ; notify about draw ending
|
|
DEBUGF DBG_INFO, "draw_main_window() end\n"
|
|
ret
|
|
endp
|
|
|
|
; draw screen
|
|
align 4
|
|
proc draw_screen stdcall
|
|
pushad
|
|
locals
|
|
row_ind dd ?
|
|
col_ind dd ?
|
|
color dd ?
|
|
endl
|
|
|
|
xor esi, esi
|
|
.loop1:
|
|
cmp esi, GFX_SIZE
|
|
jae .loop1_end
|
|
xor edx, edx
|
|
mov eax, esi
|
|
mov ecx, GFX_COLS
|
|
div ecx ; eax = row index, edx = col index
|
|
mov dword [row_ind], eax
|
|
mov dword [col_ind], edx
|
|
mov dword [color], COLOR_CELL ; white
|
|
cmp byte [esi + gfx], 0 ; check if cell is 0 or not 0
|
|
jne @f
|
|
mov dword [color], COLOR_BACK ; black
|
|
@@:
|
|
mov ebx, dword [col_ind]
|
|
imul ebx, GFX_PIX_SIZE ; now ebx - x coord of rect
|
|
mov ecx, dword [row_ind]
|
|
imul ecx, GFX_PIX_SIZE ; now ecx - y coord of rect
|
|
mov edx, dword [color]
|
|
stdcall imgbuf_draw_rect, ebx, ecx, edx
|
|
|
|
inc esi
|
|
jmp .loop1
|
|
|
|
.loop1_end:
|
|
stdcall imgbuf_send_to_window
|
|
popad
|
|
ret
|
|
endp
|
|
|
|
; copy imgbuf contents to the emulator window
|
|
align 4
|
|
proc imgbuf_send_to_window stdcall
|
|
DEBUGF DBG_INFO, "sending to window...\n"
|
|
push eax ebx ecx edx
|
|
mov eax, 7
|
|
mov ebx, dword [imgbuf_ptr]
|
|
mov ecx, IMGBUF_WIDTH
|
|
shl ecx, 16
|
|
add ecx, IMGBUF_HEIGHT
|
|
xor edx, edx
|
|
int 0x40
|
|
pop edx ecx ebx eax
|
|
ret
|
|
endp
|
|
|
|
|
|
; in internal buffer draw rect filled with given color at position (rect_x, rect_y) within window
|
|
align 4
|
|
proc imgbuf_draw_rect stdcall, rect_x: dword, rect_y: dword, rect_color: dword
|
|
DEBUGF DBG_INFO, "imgbuf_draw_rect(%u, %u, %x)\n", [rect_x], [rect_y], [rect_color]
|
|
push eax ebx ecx edx esi edi ebp
|
|
|
|
mov ebx, dword [rect_y]
|
|
imul ebx, IMGBUF_WIDTH
|
|
add ebx, dword [rect_x] ; now ebx - index of first pixel of rect
|
|
|
|
mov edi, dword [imgbuf_ptr]
|
|
mov ebp, dword [rect_color]
|
|
|
|
xor ecx, ecx
|
|
.for_i:
|
|
cmp ecx, GFX_PIX_SIZE
|
|
jae .ret
|
|
|
|
xor edx, edx
|
|
.for_j:
|
|
cmp edx, GFX_PIX_SIZE
|
|
jae .for_j_end
|
|
|
|
mov esi, edx
|
|
|
|
add edx, ebx
|
|
mov eax, ecx
|
|
imul eax, IMGBUF_WIDTH
|
|
add edx, eax ; now edx is index of edx'th pixel of ecx'th row of rect
|
|
|
|
lea edx, [edx*3]
|
|
add edx, edi
|
|
|
|
mov dword [edx], ebp ; put color to pixel
|
|
|
|
mov edx, esi
|
|
inc edx
|
|
jmp .for_j
|
|
.for_j_end:
|
|
|
|
inc ecx
|
|
jmp .for_i
|
|
|
|
.ret:
|
|
pop ebp edi esi edx ecx ebx eax
|
|
ret
|
|
endp
|