1
0
mirror of https://github.com/cc65/cc65.git synced 2024-10-30 12:28:25 +00:00
cc65/libsrc/tgi/tgi_textwidth.s

103 lines
2.5 KiB
ArmAsm
Raw Normal View History

;
; Ullrich von Bassewitz, 2009-10-30
;
.include "tgi-kernel.inc"
.include "tgi-vectorfont.inc"
.include "zeropage.inc"
.import _strlen, _toascii
.import umul16x16r32
;-----------------------------------------------------------------------------
; Aliases for zero page locations
Width := ptr1
WTab := ptr2
Text := ptr3
;-----------------------------------------------------------------------------
; unsigned __fastcall__ tgi_textwidth (const char* s);
; /* Calculate the width of the text in pixels according to the current text
; * style.
; */
;
; Result is strlen (s) * tgi_textmagw * tgi_fontsizex
;
.code
.proc _tgi_textwidth
ldy _tgi_font
bne @L1 ; Jump if vector font
; Return the width of the string for the bitmap font
jsr _strlen
sta ptr1
stx ptr1+1
lda _tgi_charwidth
ldx #0
jmp umul16x16r32
; Return the width of the string for the vector font. To save some code, we
; will add up all the character widths and then multiply by the scale factor.
; Since the output routine will scale each single character, the result may
; be slightly different.
@L1: sta Text
stx Text+1 ; Save pointer to string
lda _tgi_vectorfont+1
tax
ora _tgi_vectorfont
beq @L9 ; Return zero if no font
lda _tgi_vectorfont
clc
adc #<(TGI_VECTORFONT::WIDTHS - TGI_VF_FIRSTCHAR)
sta WTab
txa
adc #>(TGI_VECTORFONT::WIDTHS - TGI_VF_FIRSTCHAR)
sta WTab+1
ldy #0
sty Width
sty Width+1 ; Zero the total width
; Sum up the widths of the single characters
@L2: ldy #0
lda (Text),y ; Get next char
beq @L4 ; Bail out if end of text reached
jsr _toascii ; Convert to ascii
tay
lda (WTab),y ; Get width of this char
clc
adc Width
sta Width
bcc @L3
inc Width+1
@L3: inc Text
bne @L2
inc Text+1
bne @L2
; We have the total width now, scale and return it
@L4: lda _tgi_textscalew
ldx _tgi_textscalew+1
jmp tgi_imulround
; Exit point if no font installed
@L9: rts
.endproc