misc/libfreetype/src/cid/cidobjs.c
changeset 9431 0f5961910e27
parent 9357 a501f5ec7b34
parent 9429 7a97a554ac80
child 9433 f0a8ac191839
equal deleted inserted replaced
9357:a501f5ec7b34 9431:0f5961910e27
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  cidobjs.c                                                              */
       
     4 /*                                                                         */
       
     5 /*    CID objects manager (body).                                          */
       
     6 /*                                                                         */
       
     7 /*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by       */
       
     8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
       
     9 /*                                                                         */
       
    10 /*  This file is part of the FreeType project, and may only be used,       */
       
    11 /*  modified, and distributed under the terms of the FreeType project      */
       
    12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
       
    13 /*  this file you indicate that you have read the license and              */
       
    14 /*  understand and accept it fully.                                        */
       
    15 /*                                                                         */
       
    16 /***************************************************************************/
       
    17 
       
    18 
       
    19 #include <ft2build.h>
       
    20 #include FT_INTERNAL_DEBUG_H
       
    21 #include FT_INTERNAL_STREAM_H
       
    22 
       
    23 #include "cidgload.h"
       
    24 #include "cidload.h"
       
    25 
       
    26 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
       
    27 #include FT_INTERNAL_POSTSCRIPT_AUX_H
       
    28 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
       
    29 
       
    30 #include "ciderrs.h"
       
    31 
       
    32 
       
    33   /*************************************************************************/
       
    34   /*                                                                       */
       
    35   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
       
    36   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
       
    37   /* messages during execution.                                            */
       
    38   /*                                                                       */
       
    39 #undef  FT_COMPONENT
       
    40 #define FT_COMPONENT  trace_cidobjs
       
    41 
       
    42 
       
    43   /*************************************************************************/
       
    44   /*                                                                       */
       
    45   /*                            SLOT  FUNCTIONS                            */
       
    46   /*                                                                       */
       
    47   /*************************************************************************/
       
    48 
       
    49   FT_LOCAL_DEF( void )
       
    50   cid_slot_done( FT_GlyphSlot  slot )
       
    51   {
       
    52     slot->internal->glyph_hints = 0;
       
    53   }
       
    54 
       
    55 
       
    56   FT_LOCAL_DEF( FT_Error )
       
    57   cid_slot_init( FT_GlyphSlot  slot )
       
    58   {
       
    59     CID_Face          face;
       
    60     PSHinter_Service  pshinter;
       
    61 
       
    62 
       
    63     face     = (CID_Face)slot->face;
       
    64     pshinter = (PSHinter_Service)face->pshinter;
       
    65 
       
    66     if ( pshinter )
       
    67     {
       
    68       FT_Module  module;
       
    69 
       
    70 
       
    71       module = FT_Get_Module( slot->face->driver->root.library,
       
    72                               "pshinter" );
       
    73       if ( module )
       
    74       {
       
    75         T1_Hints_Funcs  funcs;
       
    76 
       
    77 
       
    78         funcs = pshinter->get_t1_funcs( module );
       
    79         slot->internal->glyph_hints = (void*)funcs;
       
    80       }
       
    81     }
       
    82 
       
    83     return 0;
       
    84   }
       
    85 
       
    86 
       
    87   /*************************************************************************/
       
    88   /*                                                                       */
       
    89   /*                           SIZE  FUNCTIONS                             */
       
    90   /*                                                                       */
       
    91   /*************************************************************************/
       
    92 
       
    93 
       
    94   static PSH_Globals_Funcs
       
    95   cid_size_get_globals_funcs( CID_Size  size )
       
    96   {
       
    97     CID_Face          face     = (CID_Face)size->root.face;
       
    98     PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
       
    99     FT_Module         module;
       
   100 
       
   101 
       
   102     module = FT_Get_Module( size->root.face->driver->root.library,
       
   103                             "pshinter" );
       
   104     return ( module && pshinter && pshinter->get_globals_funcs )
       
   105            ? pshinter->get_globals_funcs( module )
       
   106            : 0;
       
   107   }
       
   108 
       
   109 
       
   110   FT_LOCAL_DEF( void )
       
   111   cid_size_done( FT_Size  cidsize )         /* CID_Size */
       
   112   {
       
   113     CID_Size  size = (CID_Size)cidsize;
       
   114 
       
   115 
       
   116     if ( cidsize->internal )
       
   117     {
       
   118       PSH_Globals_Funcs  funcs;
       
   119 
       
   120 
       
   121       funcs = cid_size_get_globals_funcs( size );
       
   122       if ( funcs )
       
   123         funcs->destroy( (PSH_Globals)cidsize->internal );
       
   124 
       
   125       cidsize->internal = 0;
       
   126     }
       
   127   }
       
   128 
       
   129 
       
   130   FT_LOCAL_DEF( FT_Error )
       
   131   cid_size_init( FT_Size  cidsize )     /* CID_Size */
       
   132   {
       
   133     CID_Size           size  = (CID_Size)cidsize;
       
   134     FT_Error           error = CID_Err_Ok;
       
   135     PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
       
   136 
       
   137 
       
   138     if ( funcs )
       
   139     {
       
   140       PSH_Globals   globals;
       
   141       CID_Face      face = (CID_Face)cidsize->face;
       
   142       CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;
       
   143       PS_Private    priv = &dict->private_dict;
       
   144 
       
   145 
       
   146       error = funcs->create( cidsize->face->memory, priv, &globals );
       
   147       if ( !error )
       
   148         cidsize->internal = (FT_Size_Internal)(void*)globals;
       
   149     }
       
   150 
       
   151     return error;
       
   152   }
       
   153 
       
   154 
       
   155   FT_LOCAL( FT_Error )
       
   156   cid_size_request( FT_Size          size,
       
   157                     FT_Size_Request  req )
       
   158   {
       
   159     PSH_Globals_Funcs  funcs;
       
   160 
       
   161 
       
   162     FT_Request_Metrics( size->face, req );
       
   163 
       
   164     funcs = cid_size_get_globals_funcs( (CID_Size)size );
       
   165 
       
   166     if ( funcs )
       
   167       funcs->set_scale( (PSH_Globals)size->internal,
       
   168                         size->metrics.x_scale,
       
   169                         size->metrics.y_scale,
       
   170                         0, 0 );
       
   171 
       
   172     return CID_Err_Ok;
       
   173   }
       
   174 
       
   175 
       
   176   /*************************************************************************/
       
   177   /*                                                                       */
       
   178   /*                           FACE  FUNCTIONS                             */
       
   179   /*                                                                       */
       
   180   /*************************************************************************/
       
   181 
       
   182   /*************************************************************************/
       
   183   /*                                                                       */
       
   184   /* <Function>                                                            */
       
   185   /*    cid_face_done                                                      */
       
   186   /*                                                                       */
       
   187   /* <Description>                                                         */
       
   188   /*    Finalizes a given face object.                                     */
       
   189   /*                                                                       */
       
   190   /* <Input>                                                               */
       
   191   /*    face :: A pointer to the face object to destroy.                   */
       
   192   /*                                                                       */
       
   193   FT_LOCAL_DEF( void )
       
   194   cid_face_done( FT_Face  cidface )         /* CID_Face */
       
   195   {
       
   196     CID_Face      face = (CID_Face)cidface;
       
   197     FT_Memory     memory;
       
   198     CID_FaceInfo  cid;
       
   199     PS_FontInfo   info;
       
   200 
       
   201 
       
   202     if ( !face )
       
   203       return;
       
   204 
       
   205     cid    = &face->cid;
       
   206     info   = &cid->font_info;
       
   207     memory = cidface->memory;
       
   208 
       
   209     /* release subrs */
       
   210     if ( face->subrs )
       
   211     {
       
   212       FT_Int  n;
       
   213 
       
   214 
       
   215       for ( n = 0; n < cid->num_dicts; n++ )
       
   216       {
       
   217         CID_Subrs  subr = face->subrs + n;
       
   218 
       
   219 
       
   220         if ( subr->code )
       
   221         {
       
   222           FT_FREE( subr->code[0] );
       
   223           FT_FREE( subr->code );
       
   224         }
       
   225       }
       
   226 
       
   227       FT_FREE( face->subrs );
       
   228     }
       
   229 
       
   230     /* release FontInfo strings */
       
   231     FT_FREE( info->version );
       
   232     FT_FREE( info->notice );
       
   233     FT_FREE( info->full_name );
       
   234     FT_FREE( info->family_name );
       
   235     FT_FREE( info->weight );
       
   236 
       
   237     /* release font dictionaries */
       
   238     FT_FREE( cid->font_dicts );
       
   239     cid->num_dicts = 0;
       
   240 
       
   241     /* release other strings */
       
   242     FT_FREE( cid->cid_font_name );
       
   243     FT_FREE( cid->registry );
       
   244     FT_FREE( cid->ordering );
       
   245 
       
   246     cidface->family_name = 0;
       
   247     cidface->style_name  = 0;
       
   248 
       
   249     FT_FREE( face->binary_data );
       
   250     FT_FREE( face->cid_stream );
       
   251   }
       
   252 
       
   253 
       
   254   /*************************************************************************/
       
   255   /*                                                                       */
       
   256   /* <Function>                                                            */
       
   257   /*    cid_face_init                                                      */
       
   258   /*                                                                       */
       
   259   /* <Description>                                                         */
       
   260   /*    Initializes a given CID face object.                               */
       
   261   /*                                                                       */
       
   262   /* <Input>                                                               */
       
   263   /*    stream     :: The source font stream.                              */
       
   264   /*                                                                       */
       
   265   /*    face_index :: The index of the font face in the resource.          */
       
   266   /*                                                                       */
       
   267   /*    num_params :: Number of additional generic parameters.  Ignored.   */
       
   268   /*                                                                       */
       
   269   /*    params     :: Additional generic parameters.  Ignored.             */
       
   270   /*                                                                       */
       
   271   /* <InOut>                                                               */
       
   272   /*    face       :: The newly built face object.                         */
       
   273   /*                                                                       */
       
   274   /* <Return>                                                              */
       
   275   /*    FreeType error code.  0 means success.                             */
       
   276   /*                                                                       */
       
   277   FT_LOCAL_DEF( FT_Error )
       
   278   cid_face_init( FT_Stream      stream,
       
   279                  FT_Face        cidface,        /* CID_Face */
       
   280                  FT_Int         face_index,
       
   281                  FT_Int         num_params,
       
   282                  FT_Parameter*  params )
       
   283   {
       
   284     CID_Face          face = (CID_Face)cidface;
       
   285     FT_Error          error;
       
   286     PSAux_Service     psaux;
       
   287     PSHinter_Service  pshinter;
       
   288 
       
   289     FT_UNUSED( num_params );
       
   290     FT_UNUSED( params );
       
   291     FT_UNUSED( stream );
       
   292 
       
   293 
       
   294     cidface->num_faces = 1;
       
   295 
       
   296     psaux = (PSAux_Service)face->psaux;
       
   297     if ( !psaux )
       
   298     {
       
   299       psaux = (PSAux_Service)FT_Get_Module_Interface(
       
   300                 FT_FACE_LIBRARY( face ), "psaux" );
       
   301 
       
   302       face->psaux = psaux;
       
   303     }
       
   304 
       
   305     pshinter = (PSHinter_Service)face->pshinter;
       
   306     if ( !pshinter )
       
   307     {
       
   308       pshinter = (PSHinter_Service)FT_Get_Module_Interface(
       
   309                    FT_FACE_LIBRARY( face ), "pshinter" );
       
   310 
       
   311       face->pshinter = pshinter;
       
   312     }
       
   313 
       
   314     /* open the tokenizer; this will also check the font format */
       
   315     if ( FT_STREAM_SEEK( 0 ) )
       
   316       goto Exit;
       
   317 
       
   318     error = cid_face_open( face, face_index );
       
   319     if ( error )
       
   320       goto Exit;
       
   321 
       
   322     /* if we just wanted to check the format, leave successfully now */
       
   323     if ( face_index < 0 )
       
   324       goto Exit;
       
   325 
       
   326     /* check the face index */
       
   327     /* XXX: handle CID fonts with more than a single face */
       
   328     if ( face_index != 0 )
       
   329     {
       
   330       FT_ERROR(( "cid_face_init: invalid face index\n" ));
       
   331       error = CID_Err_Invalid_Argument;
       
   332       goto Exit;
       
   333     }
       
   334 
       
   335     /* now load the font program into the face object */
       
   336 
       
   337     /* initialize the face object fields */
       
   338 
       
   339     /* set up root face fields */
       
   340     {
       
   341       CID_FaceInfo  cid  = &face->cid;
       
   342       PS_FontInfo   info = &cid->font_info;
       
   343 
       
   344 
       
   345       cidface->num_glyphs   = cid->cid_count;
       
   346       cidface->num_charmaps = 0;
       
   347 
       
   348       cidface->face_index = face_index;
       
   349       cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
       
   350                             FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
       
   351                             FT_FACE_FLAG_HINTER;      /* has native hinter */
       
   352 
       
   353       if ( info->is_fixed_pitch )
       
   354         cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
       
   355 
       
   356       /* XXX: TODO: add kerning with .afm support */
       
   357 
       
   358       /* get style name -- be careful, some broken fonts only */
       
   359       /* have a /FontName dictionary entry!                   */
       
   360       cidface->family_name = info->family_name;
       
   361       /* assume "Regular" style if we don't know better */
       
   362       cidface->style_name = (char *)"Regular";
       
   363       if ( cidface->family_name )
       
   364       {
       
   365         char*  full   = info->full_name;
       
   366         char*  family = cidface->family_name;
       
   367 
       
   368 
       
   369         if ( full )
       
   370         {
       
   371           while ( *full )
       
   372           {
       
   373             if ( *full == *family )
       
   374             {
       
   375               family++;
       
   376               full++;
       
   377             }
       
   378             else
       
   379             {
       
   380               if ( *full == ' ' || *full == '-' )
       
   381                 full++;
       
   382               else if ( *family == ' ' || *family == '-' )
       
   383                 family++;
       
   384               else
       
   385               {
       
   386                 if ( !*family )
       
   387                   cidface->style_name = full;
       
   388                 break;
       
   389               }
       
   390             }
       
   391           }
       
   392         }
       
   393       }
       
   394       else
       
   395       {
       
   396         /* do we have a `/FontName'? */
       
   397         if ( cid->cid_font_name )
       
   398           cidface->family_name = cid->cid_font_name;
       
   399       }
       
   400 
       
   401       /* compute style flags */
       
   402       cidface->style_flags = 0;
       
   403       if ( info->italic_angle )
       
   404         cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
       
   405       if ( info->weight )
       
   406       {
       
   407         if ( !ft_strcmp( info->weight, "Bold"  ) ||
       
   408              !ft_strcmp( info->weight, "Black" ) )
       
   409           cidface->style_flags |= FT_STYLE_FLAG_BOLD;
       
   410       }
       
   411 
       
   412       /* no embedded bitmap support */
       
   413       cidface->num_fixed_sizes = 0;
       
   414       cidface->available_sizes = 0;
       
   415 
       
   416       cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;
       
   417       cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;
       
   418       /* no `U' suffix here to 0xFFFF! */
       
   419       cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
       
   420       cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
       
   421 
       
   422       if ( !cidface->units_per_EM )
       
   423         cidface->units_per_EM = 1000;
       
   424 
       
   425       cidface->ascender  = (FT_Short)( cidface->bbox.yMax );
       
   426       cidface->descender = (FT_Short)( cidface->bbox.yMin );
       
   427 
       
   428       cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
       
   429       if ( cidface->height < cidface->ascender - cidface->descender )
       
   430         cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
       
   431 
       
   432       cidface->underline_position  = (FT_Short)info->underline_position;
       
   433       cidface->underline_thickness = (FT_Short)info->underline_thickness;
       
   434     }
       
   435 
       
   436   Exit:
       
   437     return error;
       
   438   }
       
   439 
       
   440 
       
   441   /*************************************************************************/
       
   442   /*                                                                       */
       
   443   /* <Function>                                                            */
       
   444   /*    cid_driver_init                                                    */
       
   445   /*                                                                       */
       
   446   /* <Description>                                                         */
       
   447   /*    Initializes a given CID driver object.                             */
       
   448   /*                                                                       */
       
   449   /* <Input>                                                               */
       
   450   /*    driver :: A handle to the target driver object.                    */
       
   451   /*                                                                       */
       
   452   /* <Return>                                                              */
       
   453   /*    FreeType error code.  0 means success.                             */
       
   454   /*                                                                       */
       
   455   FT_LOCAL_DEF( FT_Error )
       
   456   cid_driver_init( FT_Module  driver )
       
   457   {
       
   458     FT_UNUSED( driver );
       
   459 
       
   460     return CID_Err_Ok;
       
   461   }
       
   462 
       
   463 
       
   464   /*************************************************************************/
       
   465   /*                                                                       */
       
   466   /* <Function>                                                            */
       
   467   /*    cid_driver_done                                                    */
       
   468   /*                                                                       */
       
   469   /* <Description>                                                         */
       
   470   /*    Finalizes a given CID driver.                                      */
       
   471   /*                                                                       */
       
   472   /* <Input>                                                               */
       
   473   /*    driver :: A handle to the target CID driver.                       */
       
   474   /*                                                                       */
       
   475   FT_LOCAL_DEF( void )
       
   476   cid_driver_done( FT_Module  driver )
       
   477   {
       
   478     FT_UNUSED( driver );
       
   479   }
       
   480 
       
   481 
       
   482 /* END */