X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libsrc%2Ftgi%2Ftgi_textwidth.s;h=477510d8e40449a396afad09350d024831430977;hb=84b1e343b5c538aadc6116d0cb603a49fde4fe86;hp=0c04ed94a50ce5b65c20cc04ac8505ae15ff7830;hpb=763fe0b802b736a671eb65ffcb0969c42b4f83d3;p=cc65 diff --git a/libsrc/tgi/tgi_textwidth.s b/libsrc/tgi/tgi_textwidth.s index 0c04ed94a..477510d8e 100644 --- a/libsrc/tgi/tgi_textwidth.s +++ b/libsrc/tgi/tgi_textwidth.s @@ -4,8 +4,20 @@ .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 + - .import _strlen, pushax, tosumula0 ;----------------------------------------------------------------------------- ; unsigned __fastcall__ tgi_textwidth (const char* s); @@ -16,12 +28,75 @@ ; 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 - jsr pushax + sta ptr1 + stx ptr1+1 lda _tgi_charwidth - jmp tosumula0 + 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 + +