New font engine in progress

git-svn-id: svn://kolibrios.org@2461 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2012-03-15 01:02:08 +00:00
parent 91f85b6476
commit 30883bfc24
3 changed files with 260 additions and 229 deletions

View File

@ -47,7 +47,7 @@ syscall_entry:
; sti ; sti
push ecx push ecx
xor ecx, ecx xor ecx, ecx
mov cl, al mov cl, al ; keep subfn# in ah
and cl, 7 and cl, 7
call dword [servetable3 + ecx * 4] call dword [servetable3 + ecx * 4]
pop ecx pop ecx

View File

@ -141,6 +141,8 @@ diff10 "old font code size",dtext,$
align 8 align 8
sdsh_data: sdsh_data:
diff16 "sdsh_data : ",0,$
include 'fonts/sd_data.asm' include 'fonts/sd_data.asm'
sdsh_code: sdsh_code:
@ -154,6 +156,8 @@ sdsh_code:
; then dl = single char to write ; then dl = single char to write
; else edx= pointer to asciiz-string ; else edx= pointer to asciiz-string
diff16 "draw_char : ",0,$
draw_char: draw_char:
; font test ; font test
; bl=y; bh=x ; bl=y; bh=x
@ -164,6 +168,7 @@ draw_char:
xor edi, edi xor edi, edi
mov ebp, edi mov ebp, edi
sdsh_draw_char: sdsh_draw_char:
; eax = left side X ; eax = left side X
; ebx = bottom Y ; ebx = bottom Y
@ -175,21 +180,20 @@ sdsh_draw_char:
push ebp push ebp
shl ebp, 4 shl ebp, 4
add ebp, sdsh_data.info add ebp, sdsh_data.info
call ch_checkscreen ; call ch_checkscreen
jb .exit ; jb .exit
call ch_checkwin ; call ch_checkwin
jc .exit ; jc .exit
xor ch, ch
mov edx, [ebp + 4] ; chartable addr mov edx, [ebp + 4] ; chartable addr
mov cx, word[edx + ecx*2] ; tick info mov cx, word[edx + ecx*2] ; tick info
mov edx, ecx mov edx, ecx
and ecx, 7 ; cl = number of ticks and ecx, 7 ; cl = number of ticks
jz .blank jz .blank
shr edx, 4 ; offset in the chartable shr edx, 4 ; offset in the chartable
add edx, [sdsh_data.chars] ; edx -> the char's ticklist add edx, sdsh_data.chars ; edx -> the char's ticklist
.next_tick: .next_tick:
call parse_tick call parse_tick
add edx, 4 add edx, 2
dec cl dec cl
jnz .next_tick jnz .next_tick
.blank: .blank:
@ -201,6 +205,7 @@ sdsh_draw_char:
parse_tick: parse_tick:
diff16 "parse_tick : ",0,$
; eax = left side X ; eax = left side X
; ebx = bottom Y ; ebx = bottom Y
; edx ->tickinfo ; edx ->tickinfo
@ -330,7 +335,7 @@ parse_tick:
add dl, 8 add dl, 8
.lntick.both: .lntick.both:
sub dl, 2 ; num_vertice = num_points - 2 sub dl, 2 ; num_vertice = num_points - 2
and cl, 0x18 ; two rotation bits and cl, 0x18 ; two (lower) rotation bits
shr cl, 3 shr cl, 3
mov esi, sdsh_data.blank mov esi, sdsh_data.blank
.draw: .draw:
@ -350,86 +355,101 @@ parse_tick:
ret ret
diff16 "draw_tick : ",0,$
draw_tick: draw_tick:
; eax = x-origin ; eax = x-origin
; ebx = y-origin ; ebx = y-origin
; edi = 0x0RRGGBB ; edi = 0x0RRGGBB
; cl = direction (0..7) ; cl = direction (0..7)
; dl = number of vertices (dl) ; dl = number of vertice (dl)
; esi -> tick bitfield ; esi -> tick bitfield
pushad pushad
inc dl ; -- that's to count down to 0
call ch_putpixel ; the point of origin call ch_putpixel ; the point of origin
and ecx, 7 and ecx, 7
call [.moves + ecx*4] ; basic vector lea ebp, [.move000+ ecx*4]
call ebp ; basic vector
call ch_putpixel call ch_putpixel
dec dl and edx, 15
jz .done ; 2pix lines only jz .done ; no vertex (2pix line)
mov esi, dword [esi] ; max 16 vertice bitfield limit mov esi, dword [esi] ; 15 vertice will easily fit to 1dw
xchg esi, edx xchg esi, edx
.move_and_draw: .move_and_draw:
mov ch, dl mov ch, dl
and ch, 3 and ch, 3
jz .moved jz .moved
btc ecx, 8 dec ch
jz .1
dec ch
jz .2 jz .2
.3:
dec cl
.1: .1:
dec cl ; right turns (1 and 3) dec cl
and cl, 7 jmp .wipe_it
@@: btc ecx, 9 ; straight angle (3) ?
jc .1
jmp .moved
.2: .2:
inc cl ; left turn (2) inc cl
and cl, 7 .wipe_it:
btc ecx, 9 ; just to zero ah and ecx, 7
.moved: .moved:
call [.moves + ecx*4] ; go new way diff16 "moved : ",0,$
lea ebp, [.move000+ ecx*4]
call ebp ; go new way
call ch_putpixel call ch_putpixel
shr edx, 2 shr edx, 2
dec esi dec esi
jnz .move_and_draw jnz .move_and_draw
diff16 "done : ",0,$
.done: .done:
popad popad
ret ret
; WARNING! The order matters! ------
align 4
diff16 "move000 : ",0,$
.move000: .move000:
inc eax inc eax
ret ret
align 4
.move001: .move001:
inc eax inc eax
dec ebx dec ebx
ret ret
align 4
.move010: .move010:
dec ebx dec ebx
ret ret
align 4
.move011: .move011:
dec eax dec eax
dec ebx dec ebx
ret ret
align 4
.move100: .move100:
dec eax dec eax
ret ret
align 4
.move101: .move101:
dec eax dec eax
inc ebx inc ebx
ret ret
align 4
.move110: .move110:
inc ebx inc ebx
ret ret
align 4
diff10 "move111-move000 (must be 28!) : ",.move000,$
.move111: .move111:
inc eax inc eax
inc ebx inc ebx
ret ret
align 4 ;) ---------------
.moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111
;)
align 4 align 4
diff16 "checkscreen : ",0,$
ch_checkscreen: ch_checkscreen:
cmp [Screen_Max_X], eax cmp [Screen_Max_X], eax
jb .getout jb .getout
@ -438,6 +458,7 @@ ch_checkscreen:
ret ret
align 4 align 4
diff16 "checkwin : ",0,$
ch_checkwin: ch_checkwin:
; eax = x coordinate ; eax = x coordinate
; ebx = y coordinate ; ebx = y coordinate
@ -472,6 +493,7 @@ ch_checkwin:
ret ret
align 4 align 4
diff16 "ch_putpix : ",0,$
ch_putpixel: ch_putpixel:
; eax = x coordinate ; eax = x coordinate
; ebx = y coordinate ; ebx = y coordinate

View File

@ -99,6 +99,9 @@ align 4
db 0x30 ; 30 db 0x30 ; 30
align 4 align 4
diff16 "sdsh_data.tick_table: ",0,$
.tick_table: .tick_table:
.v1: .v1:
; 32 33 ; 32 33
@ -210,6 +213,9 @@ align 4
align 4 align 4
.table0: .table0:
diff16 "sdsh_data.table0: ",0,$
times 33 dw 0 times 33 dw 0
dw (.ch0_33 -.chars)*16 + 2 ; #33 ! dw (.ch0_33 -.chars)*16 + 2 ; #33 !
dw (.ch0_34 -.chars)*16 + 2 ; #34 " dw (.ch0_34 -.chars)*16 + 2 ; #34 "
@ -422,6 +428,9 @@ diff10 "check font0 table size: ", .table0, $
; ---------------------------------------------------- ; ----------------------------------------------------
align 4 align 4
diff16 "sdsh_data.chars: ",0,$
.chars: .chars:
dw 0 dw 0
.ch0_33: ; ! .ch0_33: ; !