]> git.sur5r.net Git - cc65/blobdiff - libsrc/tgi/tgi_gettextwidth.s
Renamed tgi_textheight -> tgi_gettextheight, tgi_textwidth -> tgi_gettextwidth
[cc65] / libsrc / tgi / tgi_gettextwidth.s
diff --git a/libsrc/tgi/tgi_gettextwidth.s b/libsrc/tgi/tgi_gettextwidth.s
new file mode 100644 (file)
index 0000000..9b39fb6
--- /dev/null
@@ -0,0 +1,103 @@
+;
+; Ullrich von Bassewitz, 2009-10-30
+;
+
+
+        .include        "tgi-kernel.inc"
+        .include        "tgi-vectorfont.inc"
+        .include        "zeropage.inc"
+
+        .import         _strlen, _toascii
+        .import         umul8x16r16
+
+;-----------------------------------------------------------------------------
+; Aliases for zero page locations
+
+Width   := ptr1
+WTab    := ptr2
+Text    := ptr3
+
+
+
+;-----------------------------------------------------------------------------
+; unsigned __fastcall__ tgi_gettextwidth (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_gettextwidth         
+
+        ldy     _tgi_font
+        bne     @L1                     ; Jump if vector font
+
+; Return the width of the string for the bitmap font
+
+        ldy     _tgi_charwidth
+        sta     ptr1
+        jsr     _strlen
+        jsr     umul8x16r16
+        ldy     _tgi_textscalew+2       ; Get rounded scale factor
+        sty     ptr1
+        jmp     umul8x16r16
+
+; 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
+
+
+