diff options
author | Ole Loots <ole@monochrom.net> | 2012-01-03 23:05:27 +0000 |
---|---|---|
committer | Ole Loots <ole@monochrom.net> | 2012-01-03 23:05:27 +0000 |
commit | 5cdfd5a08689b92986ade030d7bea21de19ff1c8 (patch) | |
tree | 122c963f0117fba8eb4ab413a008a245fe609857 | |
parent | 08e2052c091541f82d902e7e687f2b51cf627bab (diff) | |
download | netsurf-5cdfd5a08689b92986ade030d7bea21de19ff1c8.tar.gz netsurf-5cdfd5a08689b92986ade030d7bea21de19ff1c8.tar.bz2 |
It's now possible to render fonts in monochrom mode.
svn path=/trunk/netsurf/; revision=13371
-rwxr-xr-x | atari/plot/font_freetype.c | 144 |
1 files changed, 115 insertions, 29 deletions
diff --git a/atari/plot/font_freetype.c b/atari/plot/font_freetype.c index 77819f5e8..c328a47fa 100755 --- a/atari/plot/font_freetype.c +++ b/atari/plot/font_freetype.c @@ -56,7 +56,14 @@ static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle, size_t *char_offset, int *actual_x );
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 MFDB tmp;
+static int tmp_mfdb_size; static bool init = false;
@@ -152,7 +159,7 @@ static void ft_fill_scalar(const plot_font_style_t *fstyle, FTC_Scaler srec) }
srec->face_id = (FTC_FaceID)font_faces[selected_face];
- srec->width = srec->height = (fstyle->size * 64) / FONT_SIZE_SCALE;
+ srec->width = srec->height = (fstyle->size * 64) / FONT_SIZE_SCALE; srec->pixel = 0;
srec->x_res = srec->y_res = 72;
}
@@ -176,7 +183,6 @@ static FT_Glyph ft_getglyph(const plot_font_style_t *fstyle, uint32_t ucs4) glyph_index,
&glyph,
NULL);
-
return glyph;
}
@@ -273,12 +279,6 @@ static bool ft_font_init(void) "fonts/fantasy.ttf",
DEJAVU_PATH"DejaVuSerifCondensed-Bold.ttf");
- /* set the default render mode */
- if (option_atari_font_monochrom == true)
- ft_load_type = FT_LOAD_MONOCHROME;
- else
- ft_load_type = 0;
-
return true;
}
@@ -368,6 +368,7 @@ static int pixel_pos( FONT_PLOTTER self, const plot_font_style_t *fstyle, *char_offset = nxtchr;
return ( 1 );
}
+ static void draw_glyph8(FONT_PLOTTER self, GRECT * loc, uint8_t * pixdata, int pitch, uint32_t colour)
{
@@ -416,7 +417,80 @@ 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, 0);
-}
+} + +static void draw_glyph1(FONT_PLOTTER self, 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;
+
+ x = loc->g_x;
+ y = loc->g_y;
+ w = loc->g_w;
+ h = loc->g_h;
+
+ clip.g_x = self->plotter->clipping.x0;
+ clip.g_y = self->plotter->clipping.y0;
+ clip.g_w = self->plotter->clipping.x1 - self->plotter->clipping.x0;
+ clip.g_h = self->plotter->clipping.y1 - self->plotter->clipping.y0;
+
+ 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;
+
+ if (h > loc->g_h)
+ h = loc->g_h;
+
+ if (w > loc->g_w)
+ w = loc->g_w; + + int stride = MFDB_STRIDE( w );
+ if( tmp.fd_addr == NULL || tmp_mfdb_size < MFDB_SIZE( 1, stride, h) ){ + tmp_mfdb_size = init_mfdb( 1, w, h, MFDB_FLAG_STAND | MFDB_FLAG_ZEROMEM, &tmp );
+ } else {
+ void * buf = tmp.fd_addr;
+ int size = init_mfdb( 1, w, h, MFDB_FLAG_STAND | MFDB_FLAG_NOALLOC, &tmp );
+ tmp.fd_addr = buf;
+ memset( tmp.fd_addr, 0, size );
+ } + short * buf; + for( yloop = 0; yloop < h; yloop++) { + fntd = pixdata + (pitch * (yloop+yoff))+(xoff>>3); + buf = tmp.fd_addr; + buf += (tmp.fd_wdwidth*yloop);
+ for ( xloop = 0, bitm = (1<<(7-(xoff%8))); xloop < w; xloop++, bitm=(bitm>>1) ) { + if( (*fntd & bitm) != 0 ){ + short whichbit = (1<<(15-(xloop%16)));
+ buf[xloop>>4] = ((buf[xloop>>4])|(whichbit)); + } + if( bitm == 1 ) { + fntd++; + bitm = 128; + } + }
+ } + if( app.nplanes > 8 ){
+ 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 ); + } else { + unsigned char c = RGB_TO_VDI(colour); + self->plotter->plot_mfdb( self->plotter, loc, &tmp, c, PLOT_FLAG_TRANS ); + } + +} + + + static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t length,
const plot_font_style_t *fstyle )
@@ -427,17 +501,18 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng FT_BitmapGlyph bglyph;
GRECT loc; uint32_t c = fstyle->foreground ;
- /* in -> BGR */
- /* out -> ARGB */
+ /* in -> BGR */ + /* out -> ARGB */ c = ABGR_TO_RGB(c); -
+ while (nxtchr < length) {
ucs4 = utf8_to_ucs4(text + nxtchr, length - nxtchr);
nxtchr = utf8_next(text, length, nxtchr);
glyph = ft_getglyph(fstyle, ucs4);
- if (glyph == NULL)
- continue;
+ if (glyph == NULL){
+ continue; + }
if (glyph->format == FT_GLYPH_FORMAT_BITMAP) {
bglyph = (FT_BitmapGlyph)glyph;
@@ -446,24 +521,20 @@ static int text( FONT_PLOTTER self, int x, int y, const char *text, size_t leng loc.g_w = bglyph->bitmap.width;
loc.g_h = bglyph->bitmap.rows; - if (bglyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO) {
- assert( 1 == 0 );
- } else {
- if( loc.g_w > 0) {
- draw_glyph8( self,
- &loc,
- bglyph->bitmap.buffer,
- bglyph->bitmap.pitch,
- c
- );
- }
+ if( loc.g_w > 0) {
+ self->draw_glyph( self,
+ &loc,
+ bglyph->bitmap.buffer,
+ bglyph->bitmap.pitch,
+ fstyle->foreground
+ );
}
}
x += glyph->advance.x >> 16;
}
return( 0 );
-}
+} int ctor_font_plotter_freetype( FONT_PLOTTER self )
@@ -472,7 +543,18 @@ int ctor_font_plotter_freetype( FONT_PLOTTER self ) self->str_width = str_width;
self->str_split = str_split;
self->pixel_pos = pixel_pos;
- self->text = text;
+ self->text = text; + + /* set the default render mode */ + if( (self->flags & FONTPLOT_FLAG_MONOGLYPH) != 0 ){ + ft_load_type = FT_LOAD_MONOCHROME; + self->draw_glyph = draw_glyph1; + } + else{ + ft_load_type = 0; + self->draw_glyph = draw_glyph8; + } +
LOG(("%s: %s\n", (char*)__FILE__, __FUNCTION__));
if( !init ) {
ft_font_init();
@@ -488,7 +570,11 @@ static int dtor( FONT_PLOTTER self ) {
ft_font_finalise();
if( fontbmp == NULL )
- bitmap_destroy( fontbmp );
+ bitmap_destroy( fontbmp ); +
+ if( tmp.fd_addr != NULL ){
+ free( tmp.fd_addr );
+ }
return( 1 );
} |