]> git.sur5r.net Git - cc65/blobdiff - libsrc/tgi/tgi_textwidth.s
syschdir by Stefan Haubenthal
[cc65] / libsrc / tgi / tgi_textwidth.s
index 0c04ed94a50ce5b65c20cc04ac8505ae15ff7830..477510d8e40449a396afad09350d024831430977 100644 (file)
@@ -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);
 ; 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
 
+
+