Edit

kc3-lang/freetype/src/base/ftpsprop.c

Branch :

  • Show log

    Commit

  • Author : Alexei Podtelezhnikov
    Date : 2024-01-27 11:11:22
    Hash : 47574f7e
    Message : Update all copyright notices.

  • src/base/ftpsprop.c
  • /****************************************************************************
     *
     * ftpsprop.c
     *
     *   Get and set properties of PostScript drivers (body).
     *   See `ftdriver.h' for available properties.
     *
     * Copyright (C) 2017-2024 by
     * David Turner, Robert Wilhelm, and Werner Lemberg.
     *
     * This file is part of the FreeType project, and may only be used,
     * modified, and distributed under the terms of the FreeType project
     * license, LICENSE.TXT.  By continuing to use, modify, or distribute
     * this file you indicate that you have read the license and
     * understand and accept it fully.
     *
     */
    
    
    #include <freetype/ftdriver.h>
    #include <freetype/internal/ftdebug.h>
    #include <freetype/internal/psaux.h>
    #include <freetype/internal/ftobjs.h>
    #include <freetype/internal/ftpsprop.h>
    
    
      /**************************************************************************
       *
       * The macro FT_COMPONENT is used in trace mode.  It is an implicit
       * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
       * messages during execution.
       */
    #undef  FT_COMPONENT
    #define FT_COMPONENT  psprops
    
    
      FT_BASE_CALLBACK_DEF( FT_Error )
      ps_property_set( FT_Module    module,         /* PS_Driver */
                       const char*  property_name,
                       const void*  value,
                       FT_Bool      value_is_string )
      {
        FT_Error   error  = FT_Err_Ok;
        PS_Driver  driver = (PS_Driver)module;
    
    #ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
        FT_UNUSED( value_is_string );
    #endif
    
    
        if ( !ft_strcmp( property_name, "darkening-parameters" ) )
        {
          FT_Int*  darken_params;
          FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
    
    #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
          FT_Int   dp[8];
    
    
          if ( value_is_string )
          {
            const char*  s = (const char*)value;
            char*        ep;
            int          i;
    
    
            /* eight comma-separated numbers */
            for ( i = 0; i < 7; i++ )
            {
              dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
              if ( *ep != ',' || s == ep )
                return FT_THROW( Invalid_Argument );
    
              s = ep + 1;
            }
    
            dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
            if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
              return FT_THROW( Invalid_Argument );
    
            darken_params = dp;
          }
          else
    #endif
            darken_params = (FT_Int*)value;
    
          x1 = darken_params[0];
          y1 = darken_params[1];
          x2 = darken_params[2];
          y2 = darken_params[3];
          x3 = darken_params[4];
          y3 = darken_params[5];
          x4 = darken_params[6];
          y4 = darken_params[7];
    
          if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
               y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
               x1 > x2  || x2 > x3  || x3 > x4              ||
               y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
            return FT_THROW( Invalid_Argument );
    
          driver->darken_params[0] = x1;
          driver->darken_params[1] = y1;
          driver->darken_params[2] = x2;
          driver->darken_params[3] = y2;
          driver->darken_params[4] = x3;
          driver->darken_params[5] = y3;
          driver->darken_params[6] = x4;
          driver->darken_params[7] = y4;
    
          return error;
        }
    
        else if ( !ft_strcmp( property_name, "hinting-engine" ) )
        {
    #if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \
        defined( T1_CONFIG_OPTION_OLD_ENGINE  )
          const char*  module_name = module->clazz->module_name;
    #endif
    
    
    #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
          if ( value_is_string )
          {
            const char*  s = (const char*)value;
    
    
            if ( !ft_strcmp( s, "adobe" ) )
              driver->hinting_engine = FT_HINTING_ADOBE;
    
    #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
            else if ( !ft_strcmp( module_name, "cff" ) &&
                      !ft_strcmp( s, "freetype" )      )
              driver->hinting_engine = FT_HINTING_FREETYPE;
    #endif
    
    #ifdef T1_CONFIG_OPTION_OLD_ENGINE
            else if ( ( !ft_strcmp( module_name, "type1" ) ||
                        !ft_strcmp( module_name, "t1cid" ) ) &&
                      !ft_strcmp( s, "freetype" )            )
              driver->hinting_engine = FT_HINTING_FREETYPE;
    #endif
    
            else
              return FT_THROW( Invalid_Argument );
          }
          else
    #endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
          {
            FT_UInt*  hinting_engine = (FT_UInt*)value;
    
    
            if ( *hinting_engine == FT_HINTING_ADOBE
    #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
                 || ( *hinting_engine == FT_HINTING_FREETYPE &&
                      !ft_strcmp( module_name, "cff" )       )
    #endif
    #ifdef T1_CONFIG_OPTION_OLD_ENGINE
                 || ( *hinting_engine == FT_HINTING_FREETYPE &&
                      ( !ft_strcmp( module_name, "type1" ) ||
                        !ft_strcmp( module_name, "t1cid" ) ) )
    #endif
               )
              driver->hinting_engine = *hinting_engine;
            else
              error = FT_ERR( Unimplemented_Feature );
          }
    
          return error;
        }
    
        else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
        {
    #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
          if ( value_is_string )
          {
            const char*  s   = (const char*)value;
            long         nsd = ft_strtol( s, NULL, 10 );
    
    
            if ( !nsd )
              driver->no_stem_darkening = FALSE;
            else
              driver->no_stem_darkening = TRUE;
          }
          else
    #endif
          {
            FT_Bool*  no_stem_darkening = (FT_Bool*)value;
    
    
            driver->no_stem_darkening = *no_stem_darkening;
          }
    
          return error;
        }
    
        else if ( !ft_strcmp( property_name, "random-seed" ) )
        {
          FT_Int32  random_seed;
    
    
    #ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
          if ( value_is_string )
          {
            const char*  s = (const char*)value;
    
    
            random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
          }
          else
    #endif
            random_seed = *(FT_Int32*)value;
    
          if ( random_seed < 0 )
            random_seed = 0;
    
          driver->random_seed = random_seed;
    
          return error;
        }
    
        FT_TRACE2(( "ps_property_set: missing property `%s'\n",
                    property_name ));
        return FT_THROW( Missing_Property );
      }
    
    
      FT_BASE_CALLBACK_DEF( FT_Error )
      ps_property_get( FT_Module    module,         /* PS_Driver */
                       const char*  property_name,
                       void*        value )
      {
        FT_Error   error  = FT_Err_Ok;
        PS_Driver  driver = (PS_Driver)module;
    
    
        if ( !ft_strcmp( property_name, "darkening-parameters" ) )
        {
          FT_Int*  darken_params = driver->darken_params;
          FT_Int*  val           = (FT_Int*)value;
    
    
          val[0] = darken_params[0];
          val[1] = darken_params[1];
          val[2] = darken_params[2];
          val[3] = darken_params[3];
          val[4] = darken_params[4];
          val[5] = darken_params[5];
          val[6] = darken_params[6];
          val[7] = darken_params[7];
    
          return error;
        }
    
        else if ( !ft_strcmp( property_name, "hinting-engine" ) )
        {
          FT_UInt   hinting_engine    = driver->hinting_engine;
          FT_UInt*  val               = (FT_UInt*)value;
    
    
          *val = hinting_engine;
    
          return error;
        }
    
        else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
        {
          FT_Bool   no_stem_darkening = driver->no_stem_darkening;
          FT_Bool*  val               = (FT_Bool*)value;
    
    
          *val = no_stem_darkening;
    
          return error;
        }
    
        FT_TRACE2(( "ps_property_get: missing property `%s'\n",
                    property_name ));
        return FT_THROW( Missing_Property );
      }
    
    
    /* END */