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:
parent
48c23501e9
commit
0a1c22128f
2 changed files with 77 additions and 41 deletions
116
firmware/font.c
116
firmware/font.c
|
@ -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:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue