1
0
Fork 0
forked from len0rd/rockbox

Greg Haerr's font patch 3:

Rotates the font bitmaps only once at font_init() time, with some source
cleanup to rockbox standards.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2284 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Daniel Stenberg 2002-09-13 06:37:49 +00:00
parent 48c23501e9
commit 0a1c22128f
2 changed files with 77 additions and 41 deletions

View file

@ -49,6 +49,10 @@ struct corefont sysfonts[MAXFONTS] = {
{ NULL, NULL }, /* no FONT_MP3*/ { NULL, NULL }, /* no FONT_MP3*/
}; };
static void rotate_font_bits(PMWCFONT pf);
static void rotleft(unsigned char *dst, MWIMAGEBITS *src, unsigned int width,
unsigned int height);
void void
font_init(void) font_init(void)
{ {
@ -62,6 +66,10 @@ font_init(void)
DEBUGF("Font load failed: %s\n", cfp->diskname); DEBUGF("Font load failed: %s\n", cfp->diskname);
#endif #endif
} }
/* one-time rotate font bits to rockbox format*/
if (cfp->pf && cfp->pf->height)
rotate_font_bits(cfp->pf);
} }
} }
@ -107,7 +115,6 @@ lcd_getstringsize(unsigned char *str, int font, int *w, int *h)
int width = 0; int width = 0;
while((ch = *str++)) { while((ch = *str++)) {
/* check input range*/ /* check input range*/
if (ch < pf->firstchar || ch >= pf->firstchar+pf->size) if (ch < pf->firstchar || ch >= pf->firstchar+pf->size)
ch = pf->defaultchar; ch = pf->defaultchar;
@ -122,6 +129,70 @@ lcd_getstringsize(unsigned char *str, int font, int *w, int *h)
return width; return width;
} }
/*
* Put a string at specified bit position
*/
//FIXME rename font_putsxy?
void
lcd_putsxy(int x, int y, unsigned char *str, int font)
{
int ch;
PMWCFONT pf = getfont(font);
while (((ch = *str++) != '\0')) {
MWIMAGEBITS *bits;
int width;
/* check input range*/
if (ch < pf->firstchar || ch >= pf->firstchar+pf->size)
ch = pf->defaultchar;
ch -= pf->firstchar;
/* get proportional width and glyph bits*/
width = pf->width? pf->width[ch]: pf->maxwidth;
if(x + width > LCD_WIDTH)
break;
bits = pf->bits + (pf->offset? pf->offset[ch]: (pf->height * ch));
lcd_bitmap((unsigned char *)bits, x, y, width, pf->height, true);
x += width;
}
}
/* convert font bitmap data inplace to rockbox format*/
static void
rotate_font_bits(PMWCFONT pf)
{
int i;
int defaultchar = pf->defaultchar - pf->firstchar;
int did_defaultchar = 0;
unsigned char buf[256];
for (i=0; i<pf->size; ++i) {
MWIMAGEBITS *bits = pf->bits +
(pf->offset? pf->offset[i]: (pf->height * i));
int width = pf->width? pf->width[i]: pf->maxwidth;
int src_bytes = MWIMAGE_BYTES(width) * pf->height;
/*
* Due to the way the offset map works,
* non-mapped characters are mapped to the default
* character, and shouldn't be rotated twice.
*/
if (i == defaultchar) {
if (did_defaultchar)
continue;
did_defaultchar = 1;
}
/* rotate left for lcd_bitmap function input*/
rotleft(buf, bits, width, pf->height);
/* copy back into original location*/
memcpy(bits, buf, src_bytes);
}
}
/* /*
* Take an MWIMAGEBITS bitmap and convert to Rockbox format. * Take an MWIMAGEBITS bitmap and convert to Rockbox format.
* Used for converting font glyphs for the time being. * Used for converting font glyphs for the time being.
@ -147,7 +218,7 @@ rotleft(unsigned char *dst, MWIMAGEBITS *src, unsigned int width,
src_words = MWIMAGE_WORDS(width) * height; src_words = MWIMAGE_WORDS(width) * height;
/* clear background*/ /* clear background*/
memset(dst, 0, dst_linelen*height); memset(dst, 0, dst_linelen*width);
for (i=0; i < src_words; i++) { for (i=0; i < src_words; i++) {
MWIMAGEBITS srcmap; /* current src input bit*/ MWIMAGEBITS srcmap; /* current src input bit*/
@ -178,45 +249,9 @@ rotleft(unsigned char *dst, MWIMAGEBITS *src, unsigned int width,
/* input column j becomes output row*/ /* input column j becomes output row*/
dst[j*dst_linelen + dst_col] |= dstmap; dst[j*dst_linelen + dst_col] |= dstmap;
} }
//printf((bit & src[i])? "*": "."); /*debugf((bit & src[i])? "*": ".");*/
} }
//printf("\n"); /*debugf("\n");*/
}
}
/*
* Put a string at specified bit position
*/
//FIXME rename font_putsxy?
void
lcd_putsxy(int x, int y, unsigned char *str, int font)
{
int ch;
unsigned char *src;
PMWCFONT pf = getfont(font);
while (((ch = *str++) != '\0')) {
MWIMAGEBITS *bits;
int width;
unsigned char outbuf[256];
/* check input range*/
if (ch < pf->firstchar || ch >= pf->firstchar+pf->size)
ch = pf->defaultchar;
ch -= pf->firstchar;
/* get proportional width and glyph bits*/
width = pf->width? pf->width[ch]: pf->maxwidth;
if(x + width > LCD_WIDTH)
break;
bits = pf->bits + (pf->offset? pf->offset[ch]: (pf->height * ch));
/* rotate left for lcd_bitmap function input*/
rotleft(outbuf, bits, width, pf->height);
src = outbuf;
lcd_bitmap (src, x, y, width, pf->height, true);
x += width;
} }
} }
#endif /* HAVE_LCD_BITMAP */ #endif /* HAVE_LCD_BITMAP */
@ -224,5 +259,6 @@ lcd_putsxy(int x, int y, unsigned char *str, int font)
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* local variables: * local variables:
* eval: (load-file "rockbox-mode.el") * eval: (load-file "rockbox-mode.el")
* vim: et sw=4 ts=4 sts=4 tw=78
* end: * end:
*/ */

View file

@ -70,7 +70,7 @@
/* MWIMAGEBITS helper macros*/ /* MWIMAGEBITS helper macros*/
#define MWIMAGE_WORDS(x) (((x)+15)/16) /* image size in words*/ #define MWIMAGE_WORDS(x) (((x)+15)/16) /* image size in words*/
#define MWIMAGE_BYTES(x) (((x)+7)/8) /* image size in bytes*/ #define MWIMAGE_BYTES(x) (MWIMAGE_WORDS(x)*sizeof(MWIMAGEBITS))
#define MWIMAGE_BITSPERIMAGE (sizeof(MWIMAGEBITS) * 8) #define MWIMAGE_BITSPERIMAGE (sizeof(MWIMAGEBITS) * 8)
#define MWIMAGE_BITVALUE(n) ((MWIMAGEBITS) (((MWIMAGEBITS) 1) << (n))) #define MWIMAGE_BITVALUE(n) ((MWIMAGEBITS) (((MWIMAGEBITS) 1) << (n)))
#define MWIMAGE_FIRSTBIT (MWIMAGE_BITVALUE(MWIMAGE_BITSPERIMAGE - 1)) #define MWIMAGE_FIRSTBIT (MWIMAGE_BITVALUE(MWIMAGE_BITSPERIMAGE - 1))