misc/libfreetype/src/type42/t42drivr.c
changeset 9372 915436ff64ab
parent 9371 f3840de881bd
child 9373 b769a8e38cbd
equal deleted inserted replaced
9371:f3840de881bd 9372:915436ff64ab
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  t42drivr.c                                                             */
       
     4 /*                                                                         */
       
     5 /*    High-level Type 42 driver interface (body).                          */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2002, 2003, 2004, 2006, 2007, 2009 by Roberto Alameda.       */
       
     8 /*                                                                         */
       
     9 /*  This file is part of the FreeType project, and may only be used,       */
       
    10 /*  modified, and distributed under the terms of the FreeType project      */
       
    11 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
       
    12 /*  this file you indicate that you have read the license and              */
       
    13 /*  understand and accept it fully.                                        */
       
    14 /*                                                                         */
       
    15 /***************************************************************************/
       
    16 
       
    17 
       
    18   /*************************************************************************/
       
    19   /*                                                                       */
       
    20   /* This driver implements Type42 fonts as described in the               */
       
    21   /* Technical Note #5012 from Adobe, with these limitations:              */
       
    22   /*                                                                       */
       
    23   /* 1) CID Fonts are not currently supported.                             */
       
    24   /* 2) Incremental fonts making use of the GlyphDirectory keyword         */
       
    25   /*    will be loaded, but the rendering will be using the TrueType       */
       
    26   /*    tables.                                                            */
       
    27   /* 3) As for Type1 fonts, CDevProc is not supported.                     */
       
    28   /* 4) The Metrics dictionary is not supported.                           */
       
    29   /* 5) AFM metrics are not supported.                                     */
       
    30   /*                                                                       */
       
    31   /* In other words, this driver supports Type42 fonts derived from        */
       
    32   /* TrueType fonts in a non-CID manner, as done by usual conversion       */
       
    33   /* programs.                                                             */
       
    34   /*                                                                       */
       
    35   /*************************************************************************/
       
    36 
       
    37 
       
    38 #include "t42drivr.h"
       
    39 #include "t42objs.h"
       
    40 #include "t42error.h"
       
    41 #include FT_INTERNAL_DEBUG_H
       
    42 
       
    43 #include FT_SERVICE_XFREE86_NAME_H
       
    44 #include FT_SERVICE_GLYPH_DICT_H
       
    45 #include FT_SERVICE_POSTSCRIPT_NAME_H
       
    46 #include FT_SERVICE_POSTSCRIPT_INFO_H
       
    47 
       
    48 #undef  FT_COMPONENT
       
    49 #define FT_COMPONENT  trace_t42
       
    50 
       
    51 
       
    52   /*
       
    53    *
       
    54    *  GLYPH DICT SERVICE
       
    55    *
       
    56    */
       
    57 
       
    58   static FT_Error
       
    59   t42_get_glyph_name( T42_Face    face,
       
    60                       FT_UInt     glyph_index,
       
    61                       FT_Pointer  buffer,
       
    62                       FT_UInt     buffer_max )
       
    63   {
       
    64     FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
       
    65 
       
    66     return T42_Err_Ok;
       
    67   }
       
    68 
       
    69 
       
    70   static FT_UInt
       
    71   t42_get_name_index( T42_Face    face,
       
    72                       FT_String*  glyph_name )
       
    73   {
       
    74     FT_Int      i;
       
    75     FT_String*  gname;
       
    76 
       
    77 
       
    78     for ( i = 0; i < face->type1.num_glyphs; i++ )
       
    79     {
       
    80       gname = face->type1.glyph_names[i];
       
    81 
       
    82       if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) )
       
    83         return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
       
    84     }
       
    85 
       
    86     return 0;
       
    87   }
       
    88 
       
    89 
       
    90   static const FT_Service_GlyphDictRec  t42_service_glyph_dict =
       
    91   {
       
    92     (FT_GlyphDict_GetNameFunc)  t42_get_glyph_name,
       
    93     (FT_GlyphDict_NameIndexFunc)t42_get_name_index
       
    94   };
       
    95 
       
    96 
       
    97   /*
       
    98    *
       
    99    *  POSTSCRIPT NAME SERVICE
       
   100    *
       
   101    */
       
   102 
       
   103   static const char*
       
   104   t42_get_ps_font_name( T42_Face  face )
       
   105   {
       
   106     return (const char*)face->type1.font_name;
       
   107   }
       
   108 
       
   109 
       
   110   static const FT_Service_PsFontNameRec  t42_service_ps_font_name =
       
   111   {
       
   112     (FT_PsName_GetFunc)t42_get_ps_font_name
       
   113   };
       
   114 
       
   115 
       
   116   /*
       
   117    *
       
   118    *  POSTSCRIPT INFO SERVICE
       
   119    *
       
   120    */
       
   121 
       
   122   static FT_Error
       
   123   t42_ps_get_font_info( FT_Face          face,
       
   124                         PS_FontInfoRec*  afont_info )
       
   125   {
       
   126     *afont_info = ((T42_Face)face)->type1.font_info;
       
   127 
       
   128     return T42_Err_Ok;
       
   129   }
       
   130 
       
   131 
       
   132   static FT_Error
       
   133   t42_ps_get_font_extra( FT_Face           face,
       
   134                          PS_FontExtraRec*  afont_extra )
       
   135   {
       
   136     *afont_extra = ((T42_Face)face)->type1.font_extra;
       
   137 
       
   138     return T42_Err_Ok;
       
   139   }
       
   140 
       
   141 
       
   142   static FT_Int
       
   143   t42_ps_has_glyph_names( FT_Face  face )
       
   144   {
       
   145     FT_UNUSED( face );
       
   146 
       
   147     return 1;
       
   148   }
       
   149 
       
   150 
       
   151   static FT_Error
       
   152   t42_ps_get_font_private( FT_Face         face,
       
   153                            PS_PrivateRec*  afont_private )
       
   154   {
       
   155     *afont_private = ((T42_Face)face)->type1.private_dict;
       
   156 
       
   157     return T42_Err_Ok;
       
   158   }
       
   159 
       
   160 
       
   161   static const FT_Service_PsInfoRec  t42_service_ps_info =
       
   162   {
       
   163     (PS_GetFontInfoFunc)   t42_ps_get_font_info,
       
   164     (PS_GetFontExtraFunc)   t42_ps_get_font_extra,
       
   165     (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,
       
   166     (PS_GetFontPrivateFunc)t42_ps_get_font_private
       
   167   };
       
   168 
       
   169 
       
   170   /*
       
   171    *
       
   172    *  SERVICE LIST
       
   173    *
       
   174    */
       
   175 
       
   176   static const FT_ServiceDescRec  t42_services[] =
       
   177   {
       
   178     { FT_SERVICE_ID_GLYPH_DICT,           &t42_service_glyph_dict },
       
   179     { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name },
       
   180     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t42_service_ps_info },
       
   181     { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_42 },
       
   182     { NULL, NULL }
       
   183   };
       
   184 
       
   185 
       
   186   static FT_Module_Interface
       
   187   T42_Get_Interface( FT_Driver         driver,
       
   188                      const FT_String*  t42_interface )
       
   189   {
       
   190     FT_UNUSED( driver );
       
   191 
       
   192     return ft_service_list_lookup( t42_services, t42_interface );
       
   193   }
       
   194 
       
   195 
       
   196   const FT_Driver_ClassRec  t42_driver_class =
       
   197   {
       
   198     {
       
   199       FT_MODULE_FONT_DRIVER       |
       
   200       FT_MODULE_DRIVER_SCALABLE   |
       
   201 #ifdef TT_USE_BYTECODE_INTERPRETER
       
   202       FT_MODULE_DRIVER_HAS_HINTER,
       
   203 #else
       
   204       0,
       
   205 #endif
       
   206 
       
   207       sizeof ( T42_DriverRec ),
       
   208 
       
   209       "type42",
       
   210       0x10000L,
       
   211       0x20000L,
       
   212 
       
   213       0,    /* format interface */
       
   214 
       
   215       (FT_Module_Constructor)T42_Driver_Init,
       
   216       (FT_Module_Destructor) T42_Driver_Done,
       
   217       (FT_Module_Requester)  T42_Get_Interface,
       
   218     },
       
   219 
       
   220     sizeof ( T42_FaceRec ),
       
   221     sizeof ( T42_SizeRec ),
       
   222     sizeof ( T42_GlyphSlotRec ),
       
   223 
       
   224     (FT_Face_InitFunc)        T42_Face_Init,
       
   225     (FT_Face_DoneFunc)        T42_Face_Done,
       
   226     (FT_Size_InitFunc)        T42_Size_Init,
       
   227     (FT_Size_DoneFunc)        T42_Size_Done,
       
   228     (FT_Slot_InitFunc)        T42_GlyphSlot_Init,
       
   229     (FT_Slot_DoneFunc)        T42_GlyphSlot_Done,
       
   230 
       
   231 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
       
   232     ft_stub_set_char_sizes,
       
   233     ft_stub_set_pixel_sizes,
       
   234 #endif
       
   235     (FT_Slot_LoadFunc)        T42_GlyphSlot_Load,
       
   236 
       
   237     (FT_Face_GetKerningFunc)  0,
       
   238     (FT_Face_AttachFunc)      0,
       
   239 
       
   240     (FT_Face_GetAdvancesFunc) 0,
       
   241     (FT_Size_RequestFunc)     T42_Size_Request,
       
   242     (FT_Size_SelectFunc)      T42_Size_Select
       
   243   };
       
   244 
       
   245 
       
   246 /* END */