summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParth Wazurkar <parthwazurkar@gmail.com>2018-07-07 22:21:47 +0530
committerParth Wazurkar <parthwazurkar@gmail.com>2018-07-30 23:47:51 +0530
commit9efa36c8b0657d6b4fe2b672a78bb1763ca8b1ca (patch)
treeda42de89730d2ef83fb1e500342db0d700d8a1d3
parentd0c08730c71b5f7efe48a94d97731e75cc8d5265 (diff)
downloadfreetype2-9efa36c8b0657d6b4fe2b672a78bb1763ca8b1ca.tar.gz
[gf] Use Unicode charmap and modify slot metric values.
* src/gf/gfdrivr.c(GF_Face_Init): Use Unicode charmap and modify FT_Bitmap_Size values. * src/gf/gfdrivr.c(GF_Glyph_Load): Modify FT_GlyphSlot and FT_Bitmap values.
-rw-r--r--src/gf/gfdrivr.c78
1 files changed, 41 insertions, 37 deletions
diff --git a/src/gf/gfdrivr.c b/src/gf/gfdrivr.c
index de156c4c4..cc2aa95ea 100644
--- a/src/gf/gfdrivr.c
+++ b/src/gf/gfdrivr.c
@@ -154,14 +154,14 @@
FT_Parameter* params )
{
GF_Face face = (GF_Face)gfface;
- FT_Error error;
+ FT_Error error = FT_Err_Ok;
FT_Memory memory = FT_FACE_MEMORY( face );
- GF_Glyph go;
+ GF_Glyph go=NULL;
FT_UInt16 i,count;
FT_UNUSED( num_params );
FT_UNUSED( params );
- go=NULL;
+
FT_TRACE2(( "GF driver\n" ));
@@ -175,6 +175,7 @@
else if ( error )
goto Exit;
+ /* we have a gf font: let's construct the face object */
face->gf_glyph = go ;
/* sanity check */
@@ -219,7 +220,7 @@
}
gfface->num_glyphs = (FT_Long)count;
- FT_TRACE4(( " number of glyphs: allocated %d\n",gfface->num_glyphs));
+ FT_TRACE4(( " number of glyphs: allocated %d\n",gfface->num_glyphs ));
if ( gfface->num_glyphs <= 0 )
{
@@ -234,26 +235,27 @@
{
FT_Bitmap_Size* bsize = gfface->available_sizes;
+ FT_UShort x_res, y_res;
- bsize->width = (FT_Short) face->gf_glyph->font_bbx_w ;
bsize->height = (FT_Short) face->gf_glyph->font_bbx_h ;
- bsize->size = (FT_Pos) face->gf_glyph->ds ; /* Preliminary to be checked for 26.6 fractional points*/
+ bsize->width = (FT_Short) face->gf_glyph->font_bbx_w ;
+ bsize->size = (FT_Pos) face->gf_glyph->ds << 6 ;
- /*x_res = ; To be Checked for x_resolution and y_resolution
- y_res = ;*/
+ x_res = toint( go->hppp * 72.27 );
+ y_res = toint( go->vppp * 72.27 );
- bsize->y_ppem = (FT_Pos)face->gf_glyph->font_bbx_yoff ;
- bsize->x_ppem = (FT_Pos)face->gf_glyph->font_bbx_xoff ;
+ bsize->y_ppem = (FT_Pos)(bsize->size/10) << 6 ;
+ bsize->x_ppem = (FT_Pos)bsize->y_ppem ;
}
/* Charmaps */
{
FT_CharMapRec charmap;
- charmap.encoding = FT_ENCODING_NONE;
- /* initial platform/encoding should indicate unset status? */
- charmap.platform_id = TT_PLATFORM_APPLE_UNICODE; /*Preliminary */
- charmap.encoding_id = TT_APPLE_ID_DEFAULT;
+ /* Unicode Charmap */
+ charmap.encoding = FT_ENCODING_UNICODE;
+ charmap.platform_id = TT_PLATFORM_MICROSOFT;
+ charmap.encoding_id = TT_MS_ID_UNICODE_CS;
charmap.face = FT_FACE( face );
error = FT_CMap_New( &gf_cmap_class, NULL, &charmap, NULL );
@@ -261,6 +263,7 @@
if ( error )
goto Fail;
}
+
if ( go->code_max < go->code_min )
{
FT_TRACE2(( "invalid number of glyphs\n" ));
@@ -279,16 +282,15 @@
GF_Size_Select( FT_Size size,
FT_ULong strike_index )
{
- GF_Face face = (GF_Face)size->face;
-
+ GF_Face face = (GF_Face)size->face;
+ GF_Glyph go = face->gf_glyph;
FT_UNUSED( strike_index );
-
FT_Select_Metrics( size->face, 0 );
- size->metrics.ascender = face->gf_glyph->font_bbx_xoff * 64;
- size->metrics.descender = face->gf_glyph->font_bbx_yoff * 64;
- size->metrics.max_advance = face->gf_glyph->font_bbx_w * 64;
+ size->metrics.ascender = (go->font_bbx_h - go->font_bbx_yoff) * 64;
+ size->metrics.descender = -go->font_bbx_yoff * 64;
+ size->metrics.max_advance = go->font_bbx_w * 64;
return FT_Err_Ok;
@@ -315,7 +317,7 @@
break;
case FT_SIZE_REQUEST_TYPE_REAL_DIM:
- if ( height == face->gf_glyph->font_bbx_h ) /* Preliminary */
+ if ( height == face->gf_glyph->font_bbx_h )
error = FT_Err_Ok;
break;
@@ -342,14 +344,14 @@
FT_Face face = FT_FACE( gf );
FT_Error error = FT_Err_Ok;
FT_Bitmap* bitmap = &slot->bitmap;
- GF_BitmapRec bm ;
- GF_Glyph go;
+ GF_BitmapRec bm;
+ GF_Glyph go;
+ FT_Int ascent;
go = gf->gf_glyph;
FT_UNUSED( load_flags );
-
if ( !face )
{
error = FT_THROW( Invalid_Face_Handle );
@@ -382,11 +384,12 @@
goto Exit;
}
- /* slot, bitmap => freetype, glyph => gflib */
+ /* slot, bitmap => freetype, bm => gflib */
bm = gf->gf_glyph->bm_table[glyph_index];
- bitmap->rows = bm.mv_y ; /* Prelimiary */
- bitmap->width = bm.mv_x ; /* Prelimiary */
+ bitmap->rows = bm.bbx_height / go->vppp;
+ bitmap->width = bm.bbx_width / go->hppp;
+ bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
if ( !bm.raster )
{
@@ -395,21 +398,22 @@
goto Exit;
}
- bitmap->pitch = bm.raster ; /* Prelimiary */
+ bitmap->pitch = (int)bm.raster ;
/* note: we don't allocate a new array to hold the bitmap; */
/* we can simply point to it */
- ft_glyphslot_set_bitmap( slot, bm.bitmap ); /* TO CHECK for column and row? like winfont.*/
+ ft_glyphslot_set_bitmap( slot, bm.bitmap );
+ ascent = (bm.bbx_height + bm.off_y) / go->vppp;
slot->format = FT_GLYPH_FORMAT_BITMAP;
- slot->bitmap_left = bm.off_x ; /* Prelimiary */
- slot->bitmap_top = bm.off_y ; /* Prelimiary */
-
- slot->metrics.horiAdvance = (FT_Pos) bm.bbx_width - bm.off_x ; /* Prelimiary */
- slot->metrics.horiBearingX = (FT_Pos) bm.off_x ; /* Prelimiary */
- slot->metrics.horiBearingY = (FT_Pos) bm.off_y ; /* Prelimiary */
- slot->metrics.width = (FT_Pos) ( bitmap->width * 64 ) ; /* Prelimiary */
- slot->metrics.height = (FT_Pos) ( bitmap->rows * 64 ) ; /* Prelimiary */
+ slot->bitmap_left = bm.off_x / go->hppp;
+ slot->bitmap_top = ascent ;
+
+ slot->metrics.horiAdvance = (FT_Pos) bm.mv_x * 64;
+ slot->metrics.horiBearingX = (FT_Pos) bm.off_x * 64;
+ slot->metrics.horiBearingY = (FT_Pos) ascent * 64;
+ slot->metrics.width = (FT_Pos) ( bitmap->width * 64 );
+ slot->metrics.height = (FT_Pos) ( bitmap->rows * 64 );
ft_synthesize_vertical_metrics( &slot->metrics, bm.bbx_height * 64 );