From 6cfd41681fec17dfff1bcadfcaa2e146605a41a4 Mon Sep 17 00:00:00 2001 From: Parth Wazurkar Date: Thu, 12 Jul 2018 17:00:18 +0530 Subject: [PATCH] [gf] Fixes. * Make even with `parthw-cleaned' branch. --- src/gf/gfdrivr.c | 110 ++++++++++++++++++++++++----------------------- src/gf/gflib.c | 58 ++++++++++++++++--------- 2 files changed, 94 insertions(+), 74 deletions(-) diff --git a/src/gf/gfdrivr.c b/src/gf/gfdrivr.c index 0c8717d4c..df38e4b8f 100644 --- a/src/gf/gfdrivr.c +++ b/src/gf/gfdrivr.c @@ -133,8 +133,8 @@ FT_CALLBACK_DEF( void ) GF_Face_Done( FT_Face gfface ) /* GF_Face */ { - GF_Face face = (GF_Face)gfface; - FT_Memory memory= FT_FACE_MEMORY( gfface ); + GF_Face face = (GF_Face)gfface; + FT_Memory memory; if ( !face ) @@ -142,7 +142,10 @@ memory = FT_FACE_MEMORY( face ); - gf_free_font( gfface, memory ); + gf_free_font( face ); + + FT_FREE( gfface->available_sizes ); + } @@ -154,20 +157,19 @@ 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" )); /* load font */ error = gf_load_font( stream, memory, &go ); - if ( FT_ERR_EQ( error, Unknown_File_Format ) ) { FT_TRACE2(( " not a GF file\n" )); @@ -176,14 +178,15 @@ else if ( error ) goto Exit; + /* we have a gf font: let's construct the face object */ face->gf_glyph = go ; /* sanity check */ if ( !face->gf_glyph->bm_table ) { - FT_TRACE2(( "bitmaps not allocated\n" )); + FT_TRACE2(( "glyph bitmaps not allocated\n" )); error = FT_THROW( Invalid_File_Format ); - goto Fail; + goto Exit; } /* GF cannot have multiple faces in a single font file. @@ -218,15 +221,15 @@ if(go->bm_table[i].bitmap != NULL) count++; } - gfface->num_glyphs = (FT_Long)count;printf("count is %d", count); + 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 ) { FT_ERROR(( "GF_Face_Init: glyphs not allocated\n" )); error = FT_THROW( Invalid_File_Format ); - goto Fail; + goto Exit; } gfface->num_fixed_sizes = 1; @@ -237,64 +240,61 @@ 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 ; } -printf("Hi I am here5\n"); - /* Charmaps */ + /* 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 ); if ( error ) - goto Fail; -printf("Hi I am here completed GF_Face_Init1\n"); + goto Exit; } if ( go->code_max < go->code_min ) { FT_TRACE2(( "invalid number of glyphs\n" )); error = FT_THROW( Invalid_File_Format ); - goto Fail; + goto Exit; } -printf("Hi I am here6\n"); - Fail: - GF_Face_Done( gfface ); Exit: - printf("Hi I am here completed GF_Face_Init2 %ld\n",gfface->num_glyphs); return error; + + Fail: + GF_Face_Done( gfface ); + return FT_THROW( Unknown_File_Format ); } FT_CALLBACK_DEF( FT_Error ) 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; @@ -321,7 +321,7 @@ printf("Hi I am here6\n"); 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; @@ -348,8 +348,11 @@ printf("Hi I am here6\n"); FT_Face face = FT_FACE( gf ); FT_Error error = FT_Err_Ok; FT_Bitmap* bitmap = &slot->bitmap; - GF_BitmapRec bm ; + GF_BitmapRec bm; GF_Glyph go; + FT_Int ascent; + + go = gf->gf_glyph; FT_UNUSED( load_flags ); @@ -359,8 +362,6 @@ printf("Hi I am here6\n"); goto Exit; } - go = gf->gf_glyph; - if ( !go || glyph_index >= (FT_UInt)( face->num_glyphs ) ) { @@ -387,13 +388,13 @@ printf("Hi I am here6\n"); 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; + bitmap->width = bm.bbx_width; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - bitmap->pitch = bm.raster ; /* Prelimiary */ if ( !bm.raster ) { FT_TRACE2(( "invalid bitmap width\n" )); @@ -401,19 +402,22 @@ printf("Hi I am here6\n"); goto Exit; } + 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); slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = bm.off_x ; /* Prelimiary */ - slot->bitmap_top = bm.off_y ; /* Prelimiary */ + slot->bitmap_left = bm.off_x ; + slot->bitmap_top = ascent ; - 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->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 ); diff --git a/src/gf/gflib.c b/src/gf/gflib.c index 8729290fa..c425401d5 100644 --- a/src/gf/gflib.c +++ b/src/gf/gflib.c @@ -121,7 +121,7 @@ unsigned char bit_table[] = { unsigned char *ptr; FT_Error error = FT_Err_Ok; - switch (d= READ_UINT1( stream )) + switch (READ_UINT1( stream )) { case GF_BOC: if ( FT_STREAM_SKIP( 4 ) ) @@ -158,6 +158,7 @@ unsigned char bit_table[] = { return -1; } + /* allocate and build bitmap */ if ((bm->bitmap = (unsigned char*)malloc(h*((w+7)/8))) == NULL) { error = FT_THROW( Invalid_File_Format ); @@ -165,7 +166,7 @@ unsigned char bit_table[] = { } memset(bm->bitmap, 0, h*((w+7)/8)); - bm->raster = (w+7)/8; + bm->raster = (FT_UInt)(w+7)/8; bm->bbx_width = w; bm->bbx_height = h; bm->off_x = -min_m; @@ -276,7 +277,7 @@ unsigned char bit_table[] = { INT4 min_m, max_m, min_n, max_n; INT4 w; UINT4 code; - long dx, dy; + FT_UInt dx, dy; long ptr_post, ptr_p, ptr, optr; int bc, ec, nchars, i; FT_Error error = FT_Err_Ok; @@ -289,6 +290,8 @@ unsigned char bit_table[] = { /* fseek(fp, -1, SEEK_END); */ if( FT_STREAM_SEEK( stream->size - 1 ) ) goto Exit; + if( FT_STREAM_SEEK( stream->size - 1 ) ) + goto Exit; while ( READ_UINT1( stream ) == 223) { @@ -297,6 +300,7 @@ unsigned char bit_table[] = { /* fseek(fp, -2, SEEK_CUR); */ } + if( FT_STREAM_SEEK( stream->pos -1 ) ) goto Exit; d= READ_UINT1( stream ); @@ -304,10 +308,11 @@ unsigned char bit_table[] = { if (d != GF_ID) { FT_ERROR(( "gf_load_font: missing GF_ID(131) field\n" )); - error = FT_THROW( Invalid_File_Format ); + error = FT_THROW( Unknown_File_Format ); goto Exit; } - FT_TRACE2(( "gf_load_font: GF_ID(131) found " )); + + FT_TRACE2(( "gf_load_font: GF_ID(131) found\n" )); /* fseek(fp, -6, SEEK_CUR); */ if(FT_STREAM_SEEK( stream->pos -6 )) @@ -317,9 +322,10 @@ unsigned char bit_table[] = { if (READ_UINT1( stream ) != GF_POST_POST) { FT_ERROR(( "gf_load_font: missing GF_POST_POST(249) field\n" )); - error = FT_THROW( Invalid_File_Format ); + error = FT_THROW( Unknown_File_Format ); goto Exit; } + FT_TRACE2(( "gf_load_font: GF_POST_POST(249) found\n" )); /* read pointer to post instr. */ @@ -329,7 +335,7 @@ unsigned char bit_table[] = { if (ptr_post == -1) { FT_ERROR(( "gf_load_font: invalid postamble pointer\n" )); - error = FT_THROW( Invalid_File_Format ); + error = FT_THROW( Unknown_File_Format ); goto Exit; } @@ -341,7 +347,7 @@ unsigned char bit_table[] = { if (READ_UINT1( stream ) != GF_POST) { FT_ERROR(( "gf_load_font: missing GF_POST(248) field\n" )); - error = FT_THROW( Invalid_File_Format ); + error = FT_THROW( Unknown_File_Format ); goto Exit; } FT_TRACE2(( "gf_load_font: GF Postamble found\n" )); @@ -361,6 +367,11 @@ unsigned char bit_table[] = { min_n = READ_INT4( stream ); max_n = READ_INT4( stream ); + if( ptr_p < 0 ) + { + FT_ERROR(( "gf_load_font: invalid pointer in postamble\n" )); + goto Exit; + } #if 0 gptr = ftell(fp); #endif @@ -438,21 +449,21 @@ unsigned char bit_table[] = { { case GF_CHAR_LOC: code = READ_UINT1( stream ); - dx = (double)READ_INT4( stream )/(double)(1<<16); - dy = (double)READ_INT4( stream )/(double)(1<<16); + dx = (FT_UInt)READ_INT4( stream )/(FT_UInt)(1<<16); + dy = (FT_UInt)READ_INT4( stream )/(FT_UInt)(1<<16); w = READ_INT4( stream ); ptr = READ_INT4( stream ); break; case GF_CHAR_LOC0: code = READ_UINT1( stream ); - dx = (double)READ_INT1( stream ); - dy = (double)0; + dx = (FT_UInt)READ_INT1( stream ); + dy = (FT_UInt)0; w = READ_INT4( stream ); ptr = READ_INT4( stream ); break; default: FT_ERROR(( "gf_load_font: missing character locators in postamble\n" )); - error = FT_THROW( Invalid_File_Format ); + error = FT_THROW( Unknown_File_Format ); goto Exit; } @@ -476,7 +487,6 @@ unsigned char bit_table[] = { return error; Exit: - printf("*ERROR\n"); if (go != NULL) { FT_FREE(go->bm_table); @@ -487,16 +497,22 @@ unsigned char bit_table[] = { FT_LOCAL_DEF( void ) - gf_free_font( FT_Face gfface, FT_Memory memory ) + gf_free_font( GF_Face face ) { - GF_Face gf = (GF_Face)gfface; - GF_Glyph go; - go = gf->gf_glyph; - if (go != NULL) + FT_Memory memory = FT_FACE( face )->memory; + GF_Glyph go = face->gf_glyph; + FT_UInt nchars = FT_FACE( face )->num_glyphs,i; + + if ( !go ) + return; + + if( go->bm_table ) { - FT_FREE(go->bm_table); - FT_FREE(go); + for (i = 0; i < nchars; i++) + FT_FREE(go->bm_table[i].bitmap); } + FT_FREE(go->bm_table); + FT_FREE(go); }