kolibrios-gitea/kernel/branches/Kolibri-A/trunk/gui/font.inc
Artem Jerdev (art_zh) ce9ffe8571 Nonscalable Vectorized Fonts: the Parser!
git-svn-id: svn://kolibrios.org@2470 a494cfbc-eb01-0410-851d-a64ba20cac60
2012-03-15 23:11:54 +00:00

514 lines
9.6 KiB
PHP

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
; // Alver 22.06.2008 // {
align 4
dtext_asciiz_esi: ; for skins title out
push eax
xor eax, eax
inc eax
jmp dtext.1
; } \\ Alver \\
align 4
dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
; ebx x & y
; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB )
; X = ABnnb:
; nn = font
; A = 0 <=> output esi characters; otherwise output ASCIIZ string
; B = 1 <=> fill background with color eax
; edx start of text
; edi 1 force
; // Alver 22.06.2008 // {
push eax
xor eax, eax
.1:
; } \\ Alver \\
pushad
call [_display.disable_mouse]
movsx eax, bx ; eax=y
sar ebx, 16 ; ebx=x
xchg eax, ebx ; eax=x, ebx=y
cmp esi, 255
jb .loop
mov esi, 255
.loop:
test ecx, ecx
js .test_asciiz
dec esi
js .end
jmp @f
.test_asciiz:
cmp byte [edx], 0
jz .end
; // Alver 22.06.2008 // {
cmp byte [esp+28], 1 ; was the entry point = dtext.1 ?
jne @f
dec esi
js .end
; } \\ Alver \\
@@:
inc edx
pushad ; esp -= 64 !
movzx edx, byte [edx-1]
test ecx, 0x10000000
jnz .font2
mov esi, 9
lea ebp, [FONT_I+8*edx+edx]
.symloop1:
mov dl, byte [ebp]
or dl, 1 shl 6
.pixloop1:
shr dl, 1
jz .pixloop1end
jnc .nopix
call [putpixel]
jmp .pixloop1cont
.nopix:
test ecx, 0x40000000
jz .pixloop1cont
push ecx
mov ecx, [esp+4+20h+20h] ; original eax?
call [putpixel]
pop ecx
.pixloop1cont:
inc eax
jmp .pixloop1
.pixloop1end:
sub eax, 6
inc ebx
inc ebp
dec esi
jnz .symloop1
popad
add eax, 6
jmp .loop
.font2:
add edx, edx
lea ebp, [FONT_II+4*edx+edx+1]
push 9
movzx esi, byte [ebp-1]
.symloop2:
mov dl, byte [ebp]
push esi
.pixloop2:
shr dl, 1
jnc .nopix2
call [putpixel]
jmp .pixloop2cont
.nopix2:
test ecx, 0x40000000
jz .pixloop2cont
push ecx
mov ecx, [esp+12+20h+20h]
call [putpixel]
pop ecx
.pixloop2cont:
inc eax
dec esi
jnz .pixloop2
pop esi
sub eax, esi
inc ebx
inc ebp
dec dword [esp]
jnz .symloop2
pop eax
add dword [esp+28], esi
popad
jmp .loop
.end:
popad
pop eax ; << // Alver 22.06.2008 // <<
ret
diff10 "old font code size",dtext,$
;=====================================================
; NEW FONTS
;_____________________________________________________
;
align 8
sdsh_data:
diff16 "sdsh_data : ",0,$
include 'fonts/sd_data.asm'
sdsh_code:
; eax = if (bit[31])
; then lower 31 bits points to the user-selected font
; else ax = number of preloaded system font
; ebx = x<<16 + y
; ecx = 0x00RRGGBB
; edx = if (bits[31:8] == 0)
; then dl = single char to write
; else edx= pointer to asciiz-string
diff16 "draw_char : ",0,$
draw_char:
; font test
; bl=y; bh=x
; dl=ascii
movzx eax, bh
movzx ebx, bl
movzx ecx, dl
xor edi, edi
mov ebp, edi
sdsh_draw_char:
; eax = left side X
; ebx = bottom Y
; edi = color 0x0RRGGBB
; ebp = font@
; ecx = ascii, zero-extended to 32bits
push ecx
push edx
push ebp
shl ebp, 4
add ebp, sdsh_data.info
; call ch_checkscreen
; jb .exit
; call ch_checkwin
; jc .exit
mov edx, [ebp + 4] ; chartable addr
mov cx, word[edx + ecx*2] ; tick info
mov edx, ecx
and ecx, 7 ; cl = number of ticks
jz .blank
shr edx, 4 ; offset in the chartable
add edx, sdsh_data.chars ; edx -> the char's ticklist
.next_tick:
call parse_tick
add edx, 2
dec cl
jnz .next_tick
.blank:
.exit:
pop ebp
pop edx
pop ecx
ret
parse_tick:
diff16 "parse_tick : ",0,$
; eax = left side X
; ebx = bottom Y
; edx ->tickinfo
; edi = color 0x0RRGGBB
; ebp = font's header
pushad
mov dx, word[edx]
movzx ecx, dl
test dl, 0xE0 ; ticks #32..255
jz .lntick.short
cmp dl, 0xE0
jae .lntick.long
cmp dl, 0xC0
jae .cstick
.gptick:
push edx
mov cl, dh
shr cl, 3 ; number of origin
mov edx, [ebp+8] ; orig. table
mov ch, byte[edx+ecx] ; orig. coords
pop edx
mov cl, dh
and cl, 7 ; three rotation bits
movzx edx, dl ; dl = gptick#
sub dl, 32
cmp dl, (sdsh_data.v5-sdsh_data.v1)
jae .gptick.2
.gptick.1:
; 1-byte tickgroups .v1-v4:
lea esi, [sdsh_data.v1+edx]
inc dh
sub dl, 2 ; .v1 : 2 ticks only (#32, 33)
jae .gptick.1v2v4
mov dl, dh
mov dh, ch
jmp .draw
.gptick.1v2v4:
; 1-byte tickgroups .v2-v4 : 8 ticks each
inc dh
shr dl, 3
jmp .gptick.done
.gptick.2:
; 2-byte tickgroups .v5-v8: 8 ticks each
sub dl, (sdsh_data.v5-sdsh_data.v1)
cmp dl, (sdsh_data.v9-sdsh_data.v5)
jae .gptick.3
lea esi, [sdsh_data.v5 + edx*2]
mov dh, 5
shr dl, 3
jmp .gptick.done
.gptick.3:
; 3-byte tickgroups .v9-12: 4 ticks each
sub dl, (sdsh_data.v9-sdsh_data.v5)
cmp dl, (sdsh_data.v13-sdsh_data.v9)
jae .gptick.4
lea esi, [sdsh_data.v9 + edx*2 + edx]
mov dh, 9
shr dl, 2
jmp .gptick.done
.gptick.4:
; 4-byte tickgroups .v13-16: 4 ticks each
sub dl, (sdsh_data.v13-sdsh_data.v9)
cmp dl, 16
jae .exit
lea esi, [sdsh_data.v13 + edx*4]
mov dh, 13
shr dl, 2
.gptick.done:
add dl, dh
mov dh, ch ; dh = orig.XY; dl = numvert
jmp .draw ; cl = rotation; esi-> tickfield
.cstick:
and cl, 4
shr cl, 2 ; only one rotational bit
and dl, 3
jz .cstick.0
dec dl
jnz @f
mov dl, 6
jz .cstick.1 ; 8-pix square outline
@@: dec dl
jz .cstick.2
.cstick.3:
mov esi, sdsh_data.cs3 ; 12pix-ring
mov dl, 10
jmp .draw
.cstick.2:
mov dl, 7 ; 9-pix filled square
.cstick.1:
mov esi, sdsh_data.cs2 ; the square tickfield
jmp .draw
.cstick.0:
mov esi, sdsh_data.cs0 ; 4pix-square
mov dl, 2
jmp .draw
.ritick:
test dl, 1
jnz .ritick.1
.ritick.0:
movzx ecx, dh ; y
and cl, 0x0F
sub ebx, ecx
mov cl, dh
shr cl, 4 ; x
add eax, ecx
call ch_putpixel
jmp .exit
.ritick.1:
mov esi, sdsh_data.ri1 ; 8pix-ring
mov dl, 6
jmp .draw
.lntick.short:
test dl, 0x06 ; ticks #0, 1 are reserved for
jz .ritick ; rotational invariants
and dl, 0x07 ; dl = line length
jmp .lntick.both
.lntick.long:
and dl, 0x07
add dl, 8
.lntick.both:
sub dl, 2 ; num_vertice = num_points - 2
and cl, 0x18 ; two (lower) rotation bits
shr cl, 3
mov esi, sdsh_data.blank
.draw:
; cl = rot; dl = numvert; dh = orig.xy
push ecx
movzx ecx, dh ; y
and cl, 0x0F
sub ebx, ecx
mov cl, dh
shr cl, 4 ; x
add eax, ecx
pop ecx
call draw_tick
.gptick.5:
.exit:
popad
ret
diff16 "draw_tick : ",0,$
draw_tick:
; eax = x-origin
; ebx = y-origin
; edi = 0x0RRGGBB
; cl = direction (0..7)
; dl = number of vertice (dl)
; esi -> tick bitfield
pushad
call ch_putpixel ; the point of origin
and ecx, 7
lea ebp, [.move000+ ecx*4]
call ebp ; basic vector
call ch_putpixel
and edx, 15
jz .done ; no vertex (2pix line)
mov esi, dword [esi] ; 15 vertice will easily fit to 1dw
xchg esi, edx
.move_and_draw:
mov ch, dl
and ch, 3
jz .moved
dec ch
jz .1
dec ch
jz .2
.3:
dec cl
.1:
dec cl
jmp .wipe_it
.2:
inc cl
.wipe_it:
and ecx, 7
.moved:
diff16 "moved : ",0,$
lea ebp, [.move000+ ecx*4]
call ebp ; go new way
call ch_putpixel
shr edx, 2
dec esi
jnz .move_and_draw
diff16 "done : ",0,$
.done:
popad
ret
; WARNING! The order matters! ------
align 4
diff16 "move000 : ",0,$
.move000:
inc eax
ret
align 4
.move001:
inc eax
dec ebx
ret
align 4
.move010:
dec ebx
ret
align 4
.move011:
dec eax
dec ebx
ret
align 4
.move100:
dec eax
ret
align 4
.move101:
dec eax
inc ebx
ret
align 4
.move110:
inc ebx
ret
align 4
diff10 "move111-move000 (must be 28!) : ",.move000,$
.move111:
inc eax
inc ebx
ret
;) ---------------
align 4
diff16 "checkscreen : ",0,$
ch_checkscreen:
cmp [Screen_Max_X], eax
jb .getout
cmp [Screen_Max_Y], ebx
.getout:
ret
align 4
diff16 "checkwin : ",0,$
ch_checkwin:
; eax = x coordinate
; ebx = y coordinate
; ebp -> font info
;!destroys ch, edx!
push eax
push ebx
mov ch, byte[CURRENT_TASK]
mov al, byte [ebp] ; char X-width
mov edx, [_display.width] ; screen X-size
imul edx, ebx
add edx, [_WinMapAddress]
add edx, eax
cmp ch, byte [edx]
jne .fail
movzx eax, byte [ebp]
cmp ch, byte [edx+eax]
jne .fail
movzx ebx, byte [ebp+1]
imul ebx, [_display.width]
cmp ch, byte [edx+ebx]
jne .fail
add edx, eax
cmp ch, byte [edx+ebx]
clc
je .done
.fail:
stc ; CF means the charbox is invisible
.done:
pop ebx
pop eax
ret
align 4
diff16 "ch_putpix : ",0,$
ch_putpixel:
; eax = x coordinate
; ebx = y coordinate
; edi = 0x0RRGGBB
push edx
mov edx, ebx
imul edx, [BytesPerScanLine]
lea edx, [edx+eax*4]
mov [LFB_BASE+edx], edi
pop edx
ret
;)
diff10 "new font code size",sdsh_code,$