freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] parthw-pk-vf 18a923c 1/2: [vf] Add `vf_driver_class' functio


From: Parth Wazurkar
Subject: [freetype2] parthw-pk-vf 18a923c 1/2: [vf] Add `vf_driver_class' functions.
Date: Wed, 19 Dec 2018 07:24:16 -0500 (EST)

branch: parthw-pk-vf
commit 18a923c03959ce6f696cfdd12ed406cdd450df20
Author: Parth Wazurkar <address@hidden>
Commit: Parth Wazurkar <address@hidden>

    [vf] Add `vf_driver_class' functions.
    
    Note: Does not compile.
---
 src/vf/vfdrivr.c | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 245 insertions(+), 6 deletions(-)

diff --git a/src/vf/vfdrivr.c b/src/vf/vfdrivr.c
index 56ab9b3..1b54e01 100644
--- a/src/vf/vfdrivr.c
+++ b/src/vf/vfdrivr.c
@@ -21,6 +21,9 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_OBJECTS_H
 #include FT_TRUETYPE_IDS_H
+#include FT_INTERNAL_TFM_H
+
+#include FT_SERVICE_VF_H
 #include FT_SERVICE_FONT_FORMAT_H
 
 
@@ -133,7 +136,17 @@
   FT_CALLBACK_DEF( void )
   VF_Face_Done( FT_Face        vfface )         /* VF_Face */
   {
-    /* TO-DO */
+    VF_Face    face = (VF_Face) vfface;
+    FT_Memory  memory;
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( vfface->available_sizes );
+
+    vf_free_font( face );
   }
 
 
@@ -144,21 +157,184 @@
                   FT_Int         num_params,
                   FT_Parameter*  params )
   {
-    /* TO-DO */
+    VF_Face     face   = (VF_Face) vfface;
+    FT_Error    error  = FT_Err_Ok;
+    FT_Memory   memory = FT_FACE_MEMORY( face );
+
+    TFM_Service tfm;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    face->tfm = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), "tfm" );
+
+    tfm = (TFM_Service) face->tfm;
+    if ( !tfm )
+    {
+      FT_ERROR(( "vf_Face_Init: cannot access `tfm' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+
+    FT_TRACE2(( "VF driver\n" ));
+
+    /* load font */
+    error = vf_read_info( stream, memory, &go );
+
+    if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+    {
+      FT_TRACE2(( "  not a vf file\n" ));
+      goto Fail;
+    }
+    else if ( error )
+      goto Exit;
+
+    /* we have a vf font: let's construct the face object */
+
+    /* sanity check */
+
+    /* we now need to fill the root FT_Face fields */
+    /* with relevant information                   */
+
+    vfface->num_faces       = 1;
+    vfface->face_index      = 0;
+    vfface->face_flags     |= FT_FACE_FLAG_FIXED_SIZES |
+                             FT_FACE_FLAG_HORIZONTAL ;
+    /*
+     * XXX: TO-DO: vfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+     */
+
+    vfface->family_name     = NULL;
+    vfface->num_glyphs      = (FT_Long) 999; /* TO-DO*/
+
+    FT_TRACE4(( "  number of glyphs: allocated %d\n", vfface->num_glyphs ));
+
+    if ( vfface->num_glyphs <= 0 )
+    {
+      FT_ERROR(( "vf_Face_Init: glyphs not allocated\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    vfface->num_fixed_sizes = 1;
+    if ( FT_NEW_ARRAY( vfface->available_sizes, 1 ) )
+      goto Exit;
+
+    {
+      FT_Bitmap_Size*  bsize = vfface->available_sizes;
+      FT_UShort        x_res, y_res;
+
+      /* Add Dummy values */
+      /* To be modified   */
+      bsize->height = (FT_Short) 999 ;
+      bsize->width  = (FT_Short) 999 ;
+      bsize->size   = (FT_Pos)   999 ;
+
+
+      bsize->y_ppem = (FT_Pos) 999 ;
+      bsize->x_ppem = (FT_Pos) 999 ;
+    }
+
+    /* set up charmap */
+    {
+      /* FT_Bool     unicode_charmap ; */
+
+      /*
+       * XXX: TO-DO
+       * Currently the unicode_charmap is set to `0'
+       * The functionality of extracting coding scheme
+       * will be added.
+      */
+    }
+
+    /* Charmaps */
+    {
+      FT_CharMapRec  charmap;
+      FT_Bool        unicode_charmap = 0;
+
+      charmap.face        = FT_FACE( face );
+      charmap.encoding    = FT_ENCODING_NONE;
+      charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
+      charmap.encoding_id = TT_APPLE_ID_DEFAULT;
+
+      if( unicode_charmap )
+      {
+        /* Unicode Charmap */
+        charmap.encoding    = FT_ENCODING_UNICODE;
+        charmap.platform_id = TT_PLATFORM_MICROSOFT;
+        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+      }
+
+      error = FT_CMap_New( &vf_cmap_class, NULL, &charmap, NULL );
+
+      if ( error )
+        goto Exit;
+    }
+
+  Exit:
+    return error;
+
+  Fail:
+    vf_Face_Done( vfface );
+    return FT_THROW( Unknown_File_Format );
   }
 
+
   FT_CALLBACK_DEF( FT_Error )
   VF_Size_Select(  FT_Size   size,
                    FT_ULong  strike_index )
   {
-    /* TO-DO */
+    VF_Face     face  = (VF_Face)size->face;
+
+    FT_UNUSED( strike_index );
+
+    FT_Select_Metrics( size->face, 0 );
+
+    /* Add Dummy values */
+    /* To be modified   */
+
+    size->metrics.ascender    = 999 * 64;
+    size->metrics.descender   = 999 * 64;
+    size->metrics.max_advance = 999 * 64;
+
+    return FT_Err_Ok;
   }
 
   FT_CALLBACK_DEF( FT_Error )
   VF_Size_Request( FT_Size          size,
                    FT_Size_Request  req )
   {
-    /* TO-DO */
+    VF_Face           face    = (VF_Face) size->face;
+    FT_Bitmap_Size*   bsize   = size->face->available_sizes;
+    FT_Error          error   = FT_ERR( Invalid_Pixel_Size );
+    FT_Long           height;
+
+
+    height = FT_REQUEST_HEIGHT( req );
+    height = ( height + 32 ) >> 6;
+
+    switch ( req->type )
+    {
+    case FT_SIZE_REQUEST_TYPE_NOMINAL:
+      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )
+        error = FT_Err_Ok;
+      break;
+
+    case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+      if ( height == 999 ) /* TO-DO */
+        error = FT_Err_Ok;
+      break;
+
+    default:
+      error = FT_THROW( Unimplemented_Feature );
+      break;
+    }
+
+    if ( error )
+      return error;
+    else
+      return VF_Size_Select( size, 0 );
   }
 
 
@@ -169,7 +345,70 @@
                    FT_UInt       glyph_index,
                    FT_Int32      load_flags )
   {
-    /* TO-DO */
+    VF_Face      vf     = (VF_Face) FT_SIZE_FACE( size );
+    FT_Face      face   = FT_FACE ( vf );
+    FT_Error     error  = FT_Err_Ok;
+    FT_Bitmap*   bitmap = &slot->bitmap;
+
+    FT_UNUSED( load_flags );
+
+    if ( !face )
+    {
+      error = FT_THROW( Invalid_Face_Handle );
+      goto Exit;
+    }
+
+
+    /* slot, bitmap => freetype, bm => gflib */
+
+    bitmap->rows       = 999; /* TO-DO */
+    bitmap->width      = 999; /* TO-DO */
+    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+
+    bitmap->pitch = (FT_Int) 999 ; /* TO-DO */
+
+    /* 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-DO */
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = 999 ; /* TO-DO */
+    slot->bitmap_top  = 999 ; /* TO-DO */
+
+    slot->metrics.horiAdvance  = (FT_Pos) 999 * 64; /* TO-DO */
+    slot->metrics.horiBearingX = (FT_Pos) 999 * 64; /* TO-DO */
+    slot->metrics.horiBearingY = (FT_Pos) 999 * 64; /* TO-DO */
+    slot->metrics.width        = (FT_Pos) ( 999 * 64 ); /* TO-DO */
+    slot->metrics.height       = (FT_Pos) ( 999 * 64 ); /* TO-DO */
+
+    ft_synthesize_vertical_metrics( &slot->metrics, 999 * 64 ); /* TO-DO */
+
+  Exit:
+    return error;
+  }
+
+
+ /*
+  *
+  * SERVICES LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  vf_services[] =
+  {
+    { FT_SERVICE_ID_VF,          NULL },
+    { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_VF },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  vf_driver_requester( FT_Module    module,
+                       const char*  name )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( vf_services, name );
   }
 
 
@@ -189,7 +428,7 @@
 
       NULL,                     /* FT_Module_Constructor  module_init   */
       NULL,                     /* FT_Module_Destructor   module_done   */
-      NULL                      /* FT_Module_Requester    get_interface */
+      vf_driver_requester       /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( VF_FaceRec ),



reply via email to

[Prev in Thread] Current Thread [Next in Thread]