Small font plotter speedup by reducing function calls in a draw glyph loop.

svn path=/trunk/netsurf/; revision=13888
This commit is contained in:
Ole Loots 2012-04-24 20:47:38 +00:00
parent e7104b4462
commit 68cd53ee66
1 changed files with 59 additions and 62 deletions

View File

@ -41,10 +41,6 @@ typedef struct ftc_faceid_s {
int cidx; /* character map index for unicode */
} ftc_faceid_t;
static struct bitmap * fontbmp;
static ftc_faceid_t *font_faces[FONT_FACE_COUNT];
static int dtor( FONT_PLOTTER self );
static int str_width( FONT_PLOTTER self,const plot_font_style_t *fstyle,
const char * str, size_t length, int * width );
@ -57,14 +53,19 @@ static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,
static int text( FONT_PLOTTER self, int x, int y, const char *text,
size_t length, const plot_font_style_t *fstyle );
static void draw_glyph8(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata,
int pitch, uint32_t colour);
static void draw_glyph1(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata,
int pitch, uint32_t colour);
static void draw_glyph8(FONT_PLOTTER self, GRECT *clip, GRECT * loc,
uint8_t * pixdata, int pitch, uint32_t colour);
static void draw_glyph1(FONT_PLOTTER self, GRECT * clip, GRECT * loc,
uint8_t * pixdata, int pitch, uint32_t colour);
static ftc_faceid_t *font_faces[FONT_FACE_COUNT];
static MFDB tmp;
static int tmp_mfdb_size;
static bool init = false;
static struct bitmap * fontbmp;
static size_t fontbmp_stride;
static int fontbmp_allocated_height;
static int fontbmp_allocated_width;
@ -370,51 +371,39 @@ static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle,
}
static void draw_glyph8(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour)
static void draw_glyph8(FONT_PLOTTER self, GRECT * clip, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour)
{
GRECT clip;
uint32_t * linebuf;
uint32_t fontpix;
size_t bmpstride;
int xloop,yloop,xoff,yoff;
int x,y,w,h;
struct rect clipping;
x = loc->g_x;
y = loc->g_y;
w = loc->g_w;
h = loc->g_h;
self->plotter->get_clip( self->plotter, &clipping );
clip.g_x = clipping.x0;
clip.g_y = clipping.y0;
clip.g_w = (clipping.x1 - clipping.x0)+1;
clip.g_h = (clipping.y1 - clipping.y0)+1;
if( !rc_intersect( &clip, loc ) ){
if( !rc_intersect( clip, loc ) ){
return;
}
assert( loc->g_w > 0 );
assert( loc->g_h > 0 );
xoff = loc->g_x - x;
yoff = loc->g_y - y;
assert( loc->g_h <= h );
assert( loc->g_w <= w );
if (h > loc->g_h)
h = loc->g_h;
h = loc->g_h;
w = loc->g_w;
assert( h <= fontbmp_allocated_height );
assert( w <= fontbmp_allocated_width );
if (w > loc->g_w)
w = loc->g_w;
fontbmp = bitmap_realloc( w, h,
fontbmp->bpp, w * fontbmp->bpp,
BITMAP_GROW, fontbmp );
assert( fontbmp );
assert( fontbmp->pixdata );
bmpstride = bitmap_get_rowstride(fontbmp);
for( yloop = 0; yloop < h; yloop++) {
linebuf = (uint32_t *)(fontbmp->pixdata + (bmpstride * yloop));
for(xloop = 0; xloop < w; xloop++){
fontbmp->height = h;
fontbmp->width = w;
for( yloop = 0; yloop < MIN(fontbmp_allocated_height, h); yloop++) {
linebuf = (uint32_t *)(fontbmp->pixdata + (fontbmp_stride * yloop));
for(xloop = 0; xloop < MIN(fontbmp_allocated_width, w); xloop++){
fontpix = (uint32_t)(pixdata[(( yoff + yloop ) * pitch) + xloop + xoff]);
linebuf[xloop] = (uint32_t)(colour | fontpix);
}
@ -422,33 +411,22 @@ static void draw_glyph8(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata, int p
self->plotter->bitmap( self->plotter, fontbmp, loc->g_x, loc->g_y, 0, BITMAPF_MONOGLYPH);
}
static void draw_glyph1(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour)
static void draw_glyph1(FONT_PLOTTER self, GRECT * clip, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour)
{
GRECT clip;
int xloop,yloop,xoff,yoff;
int x,y,w,h;
uint8_t bitm;
const uint8_t *fntd;
struct rect clipping;
x = loc->g_x;
y = loc->g_y;
w = loc->g_w;
h = loc->g_h;
self->plotter->get_clip( self->plotter, &clipping );
clip.g_x = clipping.x0;
clip.g_y = clipping.y0;
clip.g_w = (clipping.x1 - clipping.x0)+1;
clip.g_h = (clipping.y1 - clipping.y0)+1;
if( !rc_intersect( &clip, loc ) ){
if( !rc_intersect( clip, loc ) ){
return;
}
assert( loc->g_w > 0 );
assert( loc->g_h > 0 );
xoff = loc->g_x - x;
yoff = loc->g_y - y;
@ -486,22 +464,15 @@ static void draw_glyph1(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata, int p
#ifdef WITH_8BPP_SUPPORT
if( app.nplanes > 8 ){
#endif
unsigned short out[4];
rgb_to_vdi1000( (unsigned char*)&colour, (unsigned short*)&out );
vs_color( self->plotter->vdi_handle, OFFSET_CUSTOM_COLOR, (unsigned short*)&out[0] );
self->plotter->plot_mfdb( self->plotter, loc, &tmp, OFFSET_CUSTOM_COLOR, PLOT_FLAG_TRANS );
#ifdef WITH_8BPP_SUPPORT
} else {
unsigned char c = RGB_TO_VDI(colour);
self->plotter->plot_mfdb( self->plotter, loc, &tmp, c, PLOT_FLAG_TRANS );
self->plotter->plot_mfdb( self->plotter, loc, &tmp, colour, PLOT_FLAG_TRANS );
}
#endif
}
static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length,
const plot_font_style_t *fstyle )
{
@ -509,12 +480,39 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng
size_t nxtchr = 0;
FT_Glyph glyph;
FT_BitmapGlyph bglyph;
GRECT loc;
uint32_t c = fstyle->foreground ;
GRECT loc, clip;
uint32_t c = fstyle->foreground ;
struct rect clipping;
/* in -> BGR */
/* out -> ARGB */
if( !(self->flags & FONTPLOT_FLAG_MONOGLYPH) )
if( !(self->flags & FONTPLOT_FLAG_MONOGLYPH) ){
c = ABGR_TO_RGB(c);
} else {
#ifdef WITH_8BPP_SUPPORT
if( app.nplanes > 8 ){
#endif
unsigned short out[4];
rgb_to_vdi1000( (unsigned char*)&c, (unsigned short*)&out );
vs_color( self->plotter->vdi_handle, OFFSET_CUSTOM_COLOR, (unsigned short*)&out[0] );
#ifdef WITH_8BPP_SUPPORT
} else {
c = RGB_TO_VDI(c);
}
#endif
}
self->plotter->get_clip( self->plotter, &clipping );
clip.g_x = clipping.x0;
clip.g_y = clipping.y0;
clip.g_w = (clipping.x1 - clipping.x0)+1;
clip.g_h = (clipping.y1 - clipping.y0)+1;
fontbmp = bitmap_realloc( clip.g_w, clip.g_h,
4, clip.g_w << 2,
BITMAP_GROW, fontbmp );
fontbmp_stride = bitmap_get_rowstride(fontbmp);
fontbmp_allocated_height = clip.g_h;
fontbmp_allocated_width = clip.g_w;
while (nxtchr < length) {
ucs4 = utf8_to_ucs4(text + nxtchr, length - nxtchr);
@ -534,7 +532,7 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng
if( loc.g_w > 0) {
self->draw_glyph( self,
&loc,
&clip, &loc,
bglyph->bitmap.buffer,
bglyph->bitmap.pitch,
c
@ -542,7 +540,6 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng
}
}
x += glyph->advance.x >> 16;
}
return( 0 );
}