Home | History | Annotate | Download | only in base
      1 /****************************************************************************
      2  *
      3  * ftpsprop.c
      4  *
      5  *   Get and set properties of PostScript drivers (body).
      6  *   See `ftdriver.h' for available properties.
      7  *
      8  * Copyright 2017-2018 by
      9  * David Turner, Robert Wilhelm, and Werner Lemberg.
     10  *
     11  * This file is part of the FreeType project, and may only be used,
     12  * modified, and distributed under the terms of the FreeType project
     13  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
     14  * this file you indicate that you have read the license and
     15  * understand and accept it fully.
     16  *
     17  */
     18 
     19 
     20 #include <ft2build.h>
     21 #include FT_DRIVER_H
     22 #include FT_INTERNAL_DEBUG_H
     23 #include FT_INTERNAL_POSTSCRIPT_AUX_H
     24 #include FT_INTERNAL_OBJECTS_H
     25 #include FT_INTERNAL_POSTSCRIPT_PROPS_H
     26 
     27 
     28   /**************************************************************************
     29    *
     30    * The macro FT_COMPONENT is used in trace mode.  It is an implicit
     31    * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
     32    * messages during execution.
     33    */
     34 #undef  FT_COMPONENT
     35 #define FT_COMPONENT  trace_psprops
     36 
     37 
     38   FT_BASE_CALLBACK_DEF( FT_Error )
     39   ps_property_set( FT_Module    module,         /* PS_Driver */
     40                    const char*  property_name,
     41                    const void*  value,
     42                    FT_Bool      value_is_string )
     43   {
     44     FT_Error   error  = FT_Err_Ok;
     45     PS_Driver  driver = (PS_Driver)module;
     46 
     47 #ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
     48     FT_UNUSED( value_is_string );
     49 #endif
     50 
     51 
     52     if ( !ft_strcmp( property_name, "darkening-parameters" ) )
     53     {
     54       FT_Int*  darken_params;
     55       FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
     56 
     57 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
     58       FT_Int   dp[8];
     59 
     60 
     61       if ( value_is_string )
     62       {
     63         const char*  s = (const char*)value;
     64         char*        ep;
     65         int          i;
     66 
     67 
     68         /* eight comma-separated numbers */
     69         for ( i = 0; i < 7; i++ )
     70         {
     71           dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
     72           if ( *ep != ',' || s == ep )
     73             return FT_THROW( Invalid_Argument );
     74 
     75           s = ep + 1;
     76         }
     77 
     78         dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
     79         if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
     80           return FT_THROW( Invalid_Argument );
     81 
     82         darken_params = dp;
     83       }
     84       else
     85 #endif
     86         darken_params = (FT_Int*)value;
     87 
     88       x1 = darken_params[0];
     89       y1 = darken_params[1];
     90       x2 = darken_params[2];
     91       y2 = darken_params[3];
     92       x3 = darken_params[4];
     93       y3 = darken_params[5];
     94       x4 = darken_params[6];
     95       y4 = darken_params[7];
     96 
     97       if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
     98            y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
     99            x1 > x2  || x2 > x3  || x3 > x4              ||
    100            y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
    101         return FT_THROW( Invalid_Argument );
    102 
    103       driver->darken_params[0] = x1;
    104       driver->darken_params[1] = y1;
    105       driver->darken_params[2] = x2;
    106       driver->darken_params[3] = y2;
    107       driver->darken_params[4] = x3;
    108       driver->darken_params[5] = y3;
    109       driver->darken_params[6] = x4;
    110       driver->darken_params[7] = y4;
    111 
    112       return error;
    113     }
    114 
    115     else if ( !ft_strcmp( property_name, "hinting-engine" ) )
    116     {
    117 #if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \
    118     defined( T1_CONFIG_OPTION_OLD_ENGINE  )
    119       const char*  module_name = module->clazz->module_name;
    120 #endif
    121 
    122 
    123 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
    124       if ( value_is_string )
    125       {
    126         const char*  s = (const char*)value;
    127 
    128 
    129         if ( !ft_strcmp( s, "adobe" ) )
    130           driver->hinting_engine = FT_HINTING_ADOBE;
    131 
    132 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
    133         else if ( !ft_strcmp( module_name, "cff" ) &&
    134                   !ft_strcmp( s, "freetype" )      )
    135           driver->hinting_engine = FT_HINTING_FREETYPE;
    136 #endif
    137 
    138 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
    139         else if ( ( !ft_strcmp( module_name, "type1" ) ||
    140                     !ft_strcmp( module_name, "t1cid" ) ) &&
    141                   !ft_strcmp( s, "freetype" )            )
    142           driver->hinting_engine = FT_HINTING_FREETYPE;
    143 #endif
    144 
    145         else
    146           return FT_THROW( Invalid_Argument );
    147       }
    148       else
    149 #endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
    150       {
    151         FT_UInt*  hinting_engine = (FT_UInt*)value;
    152 
    153 
    154         if ( *hinting_engine == FT_HINTING_ADOBE
    155 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
    156              || ( *hinting_engine == FT_HINTING_FREETYPE &&
    157                   !ft_strcmp( module_name, "cff" )       )
    158 #endif
    159 #ifdef T1_CONFIG_OPTION_OLD_ENGINE
    160              || ( *hinting_engine == FT_HINTING_FREETYPE &&
    161                   ( !ft_strcmp( module_name, "type1" ) ||
    162                     !ft_strcmp( module_name, "t1cid" ) ) )
    163 #endif
    164            )
    165           driver->hinting_engine = *hinting_engine;
    166         else
    167           error = FT_ERR( Unimplemented_Feature );
    168 
    169         return error;
    170       }
    171     }
    172 
    173     else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
    174     {
    175 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
    176       if ( value_is_string )
    177       {
    178         const char*  s   = (const char*)value;
    179         long         nsd = ft_strtol( s, NULL, 10 );
    180 
    181 
    182         if ( !nsd )
    183           driver->no_stem_darkening = FALSE;
    184         else
    185           driver->no_stem_darkening = TRUE;
    186       }
    187       else
    188 #endif
    189       {
    190         FT_Bool*  no_stem_darkening = (FT_Bool*)value;
    191 
    192 
    193         driver->no_stem_darkening = *no_stem_darkening;
    194       }
    195 
    196       return error;
    197     }
    198 
    199     else if ( !ft_strcmp( property_name, "random-seed" ) )
    200     {
    201       FT_Int32  random_seed;
    202 
    203 
    204 #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
    205       if ( value_is_string )
    206       {
    207         const char*  s = (const char*)value;
    208 
    209 
    210         random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
    211       }
    212       else
    213 #endif
    214         random_seed = *(FT_Int32*)value;
    215 
    216       if ( random_seed < 0 )
    217         random_seed = 0;
    218 
    219       driver->random_seed = random_seed;
    220 
    221       return error;
    222     }
    223 
    224     FT_TRACE0(( "ps_property_set: missing property `%s'\n",
    225                 property_name ));
    226     return FT_THROW( Missing_Property );
    227   }
    228 
    229 
    230   FT_BASE_CALLBACK_DEF( FT_Error )
    231   ps_property_get( FT_Module    module,         /* PS_Driver */
    232                    const char*  property_name,
    233                    void*        value )
    234   {
    235     FT_Error   error  = FT_Err_Ok;
    236     PS_Driver  driver = (PS_Driver)module;
    237 
    238 
    239     if ( !ft_strcmp( property_name, "darkening-parameters" ) )
    240     {
    241       FT_Int*  darken_params = driver->darken_params;
    242       FT_Int*  val           = (FT_Int*)value;
    243 
    244 
    245       val[0] = darken_params[0];
    246       val[1] = darken_params[1];
    247       val[2] = darken_params[2];
    248       val[3] = darken_params[3];
    249       val[4] = darken_params[4];
    250       val[5] = darken_params[5];
    251       val[6] = darken_params[6];
    252       val[7] = darken_params[7];
    253 
    254       return error;
    255     }
    256 
    257     else if ( !ft_strcmp( property_name, "hinting-engine" ) )
    258     {
    259       FT_UInt   hinting_engine    = driver->hinting_engine;
    260       FT_UInt*  val               = (FT_UInt*)value;
    261 
    262 
    263       *val = hinting_engine;
    264 
    265       return error;
    266     }
    267 
    268     else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
    269     {
    270       FT_Bool   no_stem_darkening = driver->no_stem_darkening;
    271       FT_Bool*  val               = (FT_Bool*)value;
    272 
    273 
    274       *val = no_stem_darkening;
    275 
    276       return error;
    277     }
    278 
    279     FT_TRACE0(( "ps_property_get: missing property `%s'\n",
    280                 property_name ));
    281     return FT_THROW( Missing_Property );
    282   }
    283 
    284 
    285 /* END */
    286