 |
DrawStrWidthP |
Function (ROM Call 0x3EE) |
Returns the width of the first len characters of a string.
DrawStrWidthP returns the length in pixels of the first len characters of the string str displayed with font Font.
The difference between DrawStrWidthP and DrawStrWidth is that DrawStrWidth gives the length in pixels of the full string str displayed with font Font.
Be careful: len must be less or equal to strlen (str)
!
This function is interesting only for the F_4x6
font; for the F_6x8 and
F_8x10 fonts, DrawStrWidthP will return
6*len and 8*len, respectively.
Also, using
DrawStrWidthP (str, strlen (str), font);
is slower than using
DrawStrWidth (str, font);
Example:
// This line is equivalent to:
// printf_xy (0, 0, "%hu", DrawStrWidth ("DEFGHIJK", F_4x6));
printf_xy (0, 0, "%hu",
DrawStrWidthP ("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + 3, 8, F_4x6));
On AMS versions lower than 2.00, you can emulate DrawStrWidthP with:
unsigned short DrawStrWidthP(const char *str, short len, short Font)
{
char s[len+1];
short i;
// Calling memcpy is slower than copying the string by-hand...
for (i = 0; i < len; i++)
s[i] = str[i];
s[len] = 0;
return DrawStrWidth (s, font);
}
or the following assembly code provided by Lionel Debroux:
unsigned short DrawStrWidthP(register const char *str asm("a0"), register short len asm("d0"), register short Font asm("d2"));
asm("DrawStrWidthP:
move.w %d0,%d1
beq.s __end_DrawStrWidthP__
btst #0,%d0
beq.s __allocate_on_the_stack_DSWP__
addq.w #1,%d1
__allocate_on_the_stack_DSWP__:
suba.w %d1,%sp
movea.l %sp,%a1
subq.w #1,%d0
__loop_copy_DrawStrWidthP__:
move.b (%a0)+,(%a1)+
dbf %d0,__loop_copy_DrawStrWidthP__
clr.b (%a1)
addq.w #8,%d1
move.w %d1,-(%sp) | save d1 (DrawStrWidth can destroy it)...
move.w %d2,-(%sp)
pea 4(%sp)
movea.l 0xC8.w,%a0
movea.l 0x197*4(%a0),%a0 | DrawStrWidth
jsr (%a0)
adda.w 6(%sp),%sp
__end_DrawStrWidthP__:
rts
");
The C function is about 1% slower than the original implementation.
The assembly implementation is faster.
Uses: sf_width
Used by: Dialog, WinStrXYWrap
See also: DrawStrWidth