misc/libfreetype/src/autofit/aflatin.c
author koda
Sat, 06 Aug 2011 07:09:30 +0200
changeset 5505 a55aab592950
parent 5172 88f2e05288ba
permissions -rw-r--r--
Ditch the renderer system in sdl1.3 and use the 'old fashioned' sdl/opengl context. This gives us more flexibility and less problem in receiving video events (expecially on mobile platform) as well as not having to care to reset the gl context every time sdl interferes. This is a major sdl1.3 update so it should be tested with care (working great on ios)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     1
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     2
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     3
/*  aflatin.c                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     4
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     5
/*    Auto-fitter hinting routines for latin script (body).                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     6
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     7
/*  Copyright 2003-2011 by                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     8
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     9
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    10
/*  This file is part of the FreeType project, and may only be used,       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    11
/*  modified, and distributed under the terms of the FreeType project      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    12
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    13
/*  this file you indicate that you have read the license and              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    14
/*  understand and accept it fully.                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    15
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    16
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    17
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    18
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    19
#include <ft2build.h>
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    20
#include FT_ADVANCES_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    21
#include FT_INTERNAL_DEBUG_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    22
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    23
#include "aflatin.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    24
#include "aferrors.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    25
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    26
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    27
#ifdef AF_CONFIG_OPTION_USE_WARPER
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    28
#include "afwarp.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    29
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    30
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    31
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    32
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    33
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    34
  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    35
  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    36
  /* messages during execution.                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    37
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    38
#undef  FT_COMPONENT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    39
#define FT_COMPONENT  trace_aflatin
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    40
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    41
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    42
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    43
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    44
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    45
  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    46
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    47
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    48
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    49
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    50
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    51
  /* Find segments and links, compute all stem widths, and initialize */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    52
  /* standard width and height for the glyph with given charcode.     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    53
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    54
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    55
  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    56
                                FT_Face          face,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    57
                                FT_ULong         charcode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    58
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    59
    /* scan the array of segments in each direction */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    60
    AF_GlyphHintsRec  hints[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    61
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    62
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    63
    af_glyph_hints_init( hints, face->memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    64
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    65
    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    66
    metrics->axis[AF_DIMENSION_VERT].width_count = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    67
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    68
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    69
      FT_Error             error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    70
      FT_UInt              glyph_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    71
      int                  dim;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    72
      AF_LatinMetricsRec   dummy[1];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    73
      AF_Scaler            scaler = &dummy->root.scaler;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    74
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    75
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    76
      glyph_index = FT_Get_Char_Index( face, charcode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    77
      if ( glyph_index == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    78
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    79
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    80
      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    81
      if ( error || face->glyph->outline.n_points <= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    82
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    83
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    84
      FT_ZERO( dummy );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    85
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    86
      dummy->units_per_em = metrics->units_per_em;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    87
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    88
      scaler->x_scale = 0x10000L;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    89
      scaler->y_scale = 0x10000L;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    90
      scaler->x_delta = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    91
      scaler->y_delta = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    92
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    93
      scaler->face        = face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    94
      scaler->render_mode = FT_RENDER_MODE_NORMAL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    95
      scaler->flags       = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    96
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    97
      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    98
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    99
      error = af_glyph_hints_reload( hints, &face->glyph->outline );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   100
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   101
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   102
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   103
      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   104
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   105
        AF_LatinAxis  axis    = &metrics->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   106
        AF_AxisHints  axhints = &hints->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   107
        AF_Segment    seg, limit, link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   108
        FT_UInt       num_widths = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   109
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   110
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   111
        error = af_latin_hints_compute_segments( hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   112
                                                 (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   113
        if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   114
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   115
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   116
        af_latin_hints_link_segments( hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   117
                                      (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   118
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   119
        seg   = axhints->segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   120
        limit = seg + axhints->num_segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   121
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   122
        for ( ; seg < limit; seg++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   123
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   124
          link = seg->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   125
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   126
          /* we only consider stem segments there! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   127
          if ( link && link->link == seg && link > seg )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   128
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   129
            FT_Pos  dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   130
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   131
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   132
            dist = seg->pos - link->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   133
            if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   134
              dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   135
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   136
            if ( num_widths < AF_LATIN_MAX_WIDTHS )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   137
              axis->widths[num_widths++].org = dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   138
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   139
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   140
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   141
        af_sort_widths( num_widths, axis->widths );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   142
        axis->width_count = num_widths;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   143
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   144
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   145
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   146
      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   147
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   148
        AF_LatinAxis  axis = &metrics->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   149
        FT_Pos        stdw;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   150
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   151
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   152
        stdw = ( axis->width_count > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   153
                 ? axis->widths[0].org
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   154
                 : AF_LATIN_CONSTANT( metrics, 50 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   155
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   156
        /* let's try 20% of the smallest width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   157
        axis->edge_distance_threshold = stdw / 5;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   158
        axis->standard_width          = stdw;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   159
        axis->extra_light             = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   160
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   161
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   162
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   163
    af_glyph_hints_done( hints );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   164
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   165
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   166
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   167
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   168
#define AF_LATIN_MAX_TEST_CHARACTERS  12
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   169
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   171
  static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES]
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   172
                                       [AF_LATIN_MAX_TEST_CHARACTERS + 1] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   173
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   174
    "THEZOCQS",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   175
    "HEZLOCUS",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   176
    "fijkdbh",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   177
    "xzroesc",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   178
    "xzroesc",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   179
    "pqgjy"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   180
  };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   181
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   182
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   183
  /* Find all blue zones.  Flat segments give the reference points, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   184
  /* round segments the overshoot positions.                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   186
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   187
  af_latin_metrics_init_blues( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   188
                               FT_Face          face )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   189
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   190
    FT_Pos        flats [AF_LATIN_MAX_TEST_CHARACTERS];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   191
    FT_Pos        rounds[AF_LATIN_MAX_TEST_CHARACTERS];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   192
    FT_Int        num_flats;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   193
    FT_Int        num_rounds;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   194
    FT_Int        bb;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   195
    AF_LatinBlue  blue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   196
    FT_Error      error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   197
    AF_LatinAxis  axis  = &metrics->axis[AF_DIMENSION_VERT];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   198
    FT_GlyphSlot  glyph = face->glyph;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   199
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   200
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   201
    /* we compute the blues simply by loading each character from the    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   202
    /* `af_latin_blue_chars[blues]' string, then finding its top-most or */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   203
    /* bottom-most points (depending on `AF_IS_TOP_BLUE')                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   204
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   205
    FT_TRACE5(( "blue zones computation\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   206
    FT_TRACE5(( "------------------------------------------------\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   207
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   208
    for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   209
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   210
      const char*  p     = af_latin_blue_chars[bb];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   211
      const char*  limit = p + AF_LATIN_MAX_TEST_CHARACTERS;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   212
      FT_Pos*      blue_ref;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   213
      FT_Pos*      blue_shoot;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   214
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   215
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   216
      FT_TRACE5(( "blue %3d: ", bb ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   217
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   218
      num_flats  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   219
      num_rounds = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   220
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   221
      for ( ; p < limit && *p; p++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   222
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   223
        FT_UInt     glyph_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   224
        FT_Pos      best_y;                            /* same as points.y */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   225
        FT_Int      best_point, best_first, best_last;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   226
        FT_Vector*  points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   227
        FT_Bool     round = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   228
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   229
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   230
        FT_TRACE5(( "'%c'", *p ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   231
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   232
        /* load the character in the face -- skip unknown or empty ones */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   233
        glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   234
        if ( glyph_index == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   235
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   236
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   237
        error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   238
        if ( error || glyph->outline.n_points <= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   239
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   240
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   241
        /* now compute min or max point indices and coordinates */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   242
        points      = glyph->outline.points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   243
        best_point  = -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   244
        best_y      = 0;  /* make compiler happy */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   245
        best_first  = 0;  /* ditto */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   246
        best_last   = 0;  /* ditto */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   247
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   248
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   249
          FT_Int  nn;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   250
          FT_Int  first = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   251
          FT_Int  last  = -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   252
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   253
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   254
          for ( nn = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   255
                nn < glyph->outline.n_contours;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   256
                first = last + 1, nn++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   257
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   258
            FT_Int  old_best_point = best_point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   259
            FT_Int  pp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   260
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   261
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   262
            last = glyph->outline.contours[nn];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   263
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   264
            /* Avoid single-point contours since they are never rasterized. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   265
            /* In some fonts, they correspond to mark attachment points     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   266
            /* which are way outside of the glyph's real outline.           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   267
            if ( last <= first )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   268
              continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   269
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   270
            if ( AF_LATIN_IS_TOP_BLUE( bb ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   271
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   272
              for ( pp = first; pp <= last; pp++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   273
                if ( best_point < 0 || points[pp].y > best_y )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   274
                {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   275
                  best_point = pp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   276
                  best_y     = points[pp].y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   277
                }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   278
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   279
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   280
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   281
              for ( pp = first; pp <= last; pp++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   282
                if ( best_point < 0 || points[pp].y < best_y )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   283
                {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   284
                  best_point = pp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   285
                  best_y     = points[pp].y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   286
                }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   287
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   288
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   289
            if ( best_point != old_best_point )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   290
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   291
              best_first = first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   292
              best_last  = last;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   293
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   294
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   295
          FT_TRACE5(( "%5d", best_y ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   296
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   297
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   298
        /* now check whether the point belongs to a straight or round   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   299
        /* segment; we first need to find in which contour the extremum */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   300
        /* lies, then inspect its previous and next points              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   301
        if ( best_point >= 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   302
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   303
          FT_Int  prev, next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   304
          FT_Pos  dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   305
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   306
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   307
          /* now look for the previous and next points that are not on the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   308
          /* same Y coordinate.  Threshold the `closeness'...              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   309
          prev = best_point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   310
          next = prev;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   311
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   312
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   313
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   314
            if ( prev > best_first )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   315
              prev--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   316
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   317
              prev = best_last;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   318
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   319
            dist = points[prev].y - best_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   320
            if ( dist < -5 || dist > 5 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   321
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   322
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   323
          } while ( prev != best_point );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   324
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   325
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   326
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   327
            if ( next < best_last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   328
              next++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   329
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   330
              next = best_first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   331
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   332
            dist = points[next].y - best_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   333
            if ( dist < -5 || dist > 5 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   334
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   335
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   336
          } while ( next != best_point );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   337
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   338
          /* now set the `round' flag depending on the segment's kind */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   339
          round = FT_BOOL(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   340
            FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   341
            FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   342
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   343
          FT_TRACE5(( "%c ", round ? 'r' : 'f' ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   344
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   345
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   346
        if ( round )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   347
          rounds[num_rounds++] = best_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   348
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   349
          flats[num_flats++]   = best_y;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   350
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   351
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   352
      FT_TRACE5(( "\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   353
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   354
      if ( num_flats == 0 && num_rounds == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   355
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   356
        /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   357
         *  we couldn't find a single glyph to compute this blue zone,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   358
         *  we will simply ignore it then
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   359
         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   360
        FT_TRACE5(( "empty\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   361
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   362
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   363
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   364
      /* we have computed the contents of the `rounds' and `flats' tables, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   365
      /* now determine the reference and overshoot position of the blue -- */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   366
      /* we simply take the median value after a simple sort               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   367
      af_sort_pos( num_rounds, rounds );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   368
      af_sort_pos( num_flats,  flats );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   369
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   370
      blue       = &axis->blues[axis->blue_count];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   371
      blue_ref   = &blue->ref.org;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   372
      blue_shoot = &blue->shoot.org;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   373
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   374
      axis->blue_count++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   375
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   376
      if ( num_flats == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   377
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   378
        *blue_ref   =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   379
        *blue_shoot = rounds[num_rounds / 2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   380
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   381
      else if ( num_rounds == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   382
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   383
        *blue_ref   =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   384
        *blue_shoot = flats[num_flats / 2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   385
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   386
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   387
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   388
        *blue_ref   = flats[num_flats / 2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   389
        *blue_shoot = rounds[num_rounds / 2];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   390
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   391
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   392
      /* there are sometimes problems: if the overshoot position of top     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   393
      /* zones is under its reference position, or the opposite for bottom  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   394
      /* zones.  We must thus check everything there and correct the errors */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   395
      if ( *blue_shoot != *blue_ref )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   396
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   397
        FT_Pos   ref      = *blue_ref;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   398
        FT_Pos   shoot    = *blue_shoot;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   399
        FT_Bool  over_ref = FT_BOOL( shoot > ref );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   400
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   401
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   402
        if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   403
          *blue_ref   =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   404
          *blue_shoot = ( shoot + ref ) / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   405
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   406
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   407
      blue->flags = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   408
      if ( AF_LATIN_IS_TOP_BLUE( bb ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   409
        blue->flags |= AF_LATIN_BLUE_TOP;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   410
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   411
      /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   412
       * The following flag is used later to adjust the y and x scales
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   413
       * in order to optimize the pixel grid alignment of the top of small
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   414
       * letters.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   415
       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   416
      if ( bb == AF_LATIN_BLUE_SMALL_TOP )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   417
        blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   418
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   419
      FT_TRACE5(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   420
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   421
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   422
    return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   423
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   424
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   425
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   426
  /* Check whether all ASCII digits have the same advance width. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   427
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   428
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   429
  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   430
                                 FT_Face          face )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   431
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   432
    FT_UInt   i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   433
    FT_Bool   started = 0, same_width = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   434
    FT_Fixed  advance, old_advance = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   435
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   436
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   437
    /* digit `0' is 0x30 in all supported charmaps */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   438
    for ( i = 0x30; i <= 0x39; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   439
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   440
      FT_UInt  glyph_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   441
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   442
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   443
      glyph_index = FT_Get_Char_Index( face, i );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   444
      if ( glyph_index == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   445
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   446
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   447
      if ( FT_Get_Advance( face, glyph_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   448
                           FT_LOAD_NO_SCALE         |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   449
                           FT_LOAD_NO_HINTING       |
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   450
                           FT_LOAD_IGNORE_TRANSFORM,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   451
                           &advance ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   452
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   453
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   454
      if ( started )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   455
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   456
        if ( advance != old_advance )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   457
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   458
          same_width = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   459
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   460
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   461
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   462
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   463
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   464
        old_advance = advance;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   465
        started     = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   466
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   467
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   468
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   469
    metrics->root.digits_have_same_width = same_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   470
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   471
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   472
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   473
  /* Initialize global metrics. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   474
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   475
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   476
  af_latin_metrics_init( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   477
                         FT_Face          face )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   478
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   479
    FT_Error    error = AF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   480
    FT_CharMap  oldmap = face->charmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   481
    FT_UInt     ee;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   483
    static const FT_Encoding  latin_encodings[] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   484
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   485
      FT_ENCODING_UNICODE,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   486
      FT_ENCODING_APPLE_ROMAN,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   487
      FT_ENCODING_ADOBE_STANDARD,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   488
      FT_ENCODING_ADOBE_LATIN_1,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   489
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   490
      FT_ENCODING_NONE  /* end of list */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   491
    };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   492
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   493
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   494
    metrics->units_per_em = face->units_per_EM;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   495
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   496
    /* do we have a latin charmap in there? */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   497
    for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   498
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   499
      error = FT_Select_Charmap( face, latin_encodings[ee] );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   500
      if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   501
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   502
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   503
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   504
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   505
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   506
      /* For now, compute the standard width and height from the `o'. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   507
      af_latin_metrics_init_widths( metrics, face, 'o' );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   508
      af_latin_metrics_init_blues( metrics, face );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   509
      af_latin_metrics_check_digits( metrics, face );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   510
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   511
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   512
    FT_Set_Charmap( face, oldmap );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   513
    return AF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   514
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   515
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   516
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   517
  /* Adjust scaling value, then scale and shift widths   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   518
  /* and blue zones (if applicable) for given dimension. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   519
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   520
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   521
  af_latin_metrics_scale_dim( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   522
                              AF_Scaler        scaler,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   523
                              AF_Dimension     dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   524
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   525
    FT_Fixed      scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   526
    FT_Pos        delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   527
    AF_LatinAxis  axis;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   528
    FT_UInt       nn;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   529
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   530
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   531
    if ( dim == AF_DIMENSION_HORZ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   532
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   533
      scale = scaler->x_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   534
      delta = scaler->x_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   535
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   536
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   537
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   538
      scale = scaler->y_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   539
      delta = scaler->y_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   540
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   541
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   542
    axis = &metrics->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   543
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   544
    if ( axis->org_scale == scale && axis->org_delta == delta )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   545
      return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   546
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   547
    axis->org_scale = scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   548
    axis->org_delta = delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   549
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   550
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   551
     * correct X and Y scale to optimize the alignment of the top of small
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   552
     * letters to the pixel grid
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   553
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   554
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   555
      AF_LatinAxis  Axis = &metrics->axis[AF_DIMENSION_VERT];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   556
      AF_LatinBlue  blue = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   557
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   558
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   559
      for ( nn = 0; nn < Axis->blue_count; nn++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   560
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   561
        if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   562
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   563
          blue = &Axis->blues[nn];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   564
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   565
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   566
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   567
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   568
      if ( blue )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   569
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   570
        FT_Pos  scaled = FT_MulFix( blue->shoot.org, scaler->y_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   571
        FT_Pos  fitted = ( scaled + 40 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   572
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   573
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   574
        if ( scaled != fitted )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   575
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   576
#if 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   577
          if ( dim == AF_DIMENSION_HORZ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   578
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   579
            if ( fitted < scaled )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   580
              scale -= scale / 50;  /* scale *= 0.98 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   581
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   582
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   583
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   584
          if ( dim == AF_DIMENSION_VERT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   585
            scale = FT_MulDiv( scale, fitted, scaled );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   586
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   587
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   588
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   589
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   590
    axis->scale = scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   591
    axis->delta = delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   592
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   593
    if ( dim == AF_DIMENSION_HORZ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   594
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   595
      metrics->root.scaler.x_scale = scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   596
      metrics->root.scaler.x_delta = delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   597
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   598
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   599
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   600
      metrics->root.scaler.y_scale = scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   601
      metrics->root.scaler.y_delta = delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   602
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   603
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   604
    /* scale the widths */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   605
    for ( nn = 0; nn < axis->width_count; nn++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   606
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   607
      AF_Width  width = axis->widths + nn;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   608
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   609
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   610
      width->cur = FT_MulFix( width->org, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   611
      width->fit = width->cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   612
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   613
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   614
    /* an extra-light axis corresponds to a standard width that is */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   615
    /* smaller than 0.75 pixels                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   616
    axis->extra_light =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   617
      (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   618
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   619
    if ( dim == AF_DIMENSION_VERT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   620
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   621
      /* scale the blue zones */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   622
      for ( nn = 0; nn < axis->blue_count; nn++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   623
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   624
        AF_LatinBlue  blue = &axis->blues[nn];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   625
        FT_Pos        dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   626
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   627
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   628
        blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   629
        blue->ref.fit   = blue->ref.cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   630
        blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   631
        blue->shoot.fit = blue->shoot.cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   632
        blue->flags    &= ~AF_LATIN_BLUE_ACTIVE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   633
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   634
        /* a blue zone is only active if it is less than 3/4 pixels tall */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   635
        dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   636
        if ( dist <= 48 && dist >= -48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   637
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   638
          FT_Pos  delta1, delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   639
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   640
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   641
          delta1 = blue->shoot.org - blue->ref.org;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   642
          delta2 = delta1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   643
          if ( delta1 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   644
            delta2 = -delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   645
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   646
          delta2 = FT_MulFix( delta2, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   647
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   648
          if ( delta2 < 32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   649
            delta2 = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   650
          else if ( delta2 < 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   651
            delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   652
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   653
            delta2 = FT_PIX_ROUND( delta2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   654
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   655
          if ( delta1 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   656
            delta2 = -delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   657
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   658
          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   659
          blue->shoot.fit = blue->ref.fit + delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   660
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   661
          blue->flags |= AF_LATIN_BLUE_ACTIVE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   662
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   663
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   664
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   665
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   666
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   667
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   668
  /* Scale global values in both directions. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   669
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   670
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   671
  af_latin_metrics_scale( AF_LatinMetrics  metrics,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   672
                          AF_Scaler        scaler )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   673
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   674
    metrics->root.scaler.render_mode = scaler->render_mode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   675
    metrics->root.scaler.face        = scaler->face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   676
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   677
    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   678
    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   679
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   680
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   681
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   682
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   683
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   684
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   685
  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   686
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   687
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   688
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   689
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   690
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   691
  /* Walk over all contours and compute its segments. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   692
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   693
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   694
  af_latin_hints_compute_segments( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   695
                                   AF_Dimension   dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   696
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   697
    AF_AxisHints   axis          = &hints->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   698
    FT_Memory      memory        = hints->memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   699
    FT_Error       error         = AF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   700
    AF_Segment     segment       = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   701
    AF_SegmentRec  seg0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   702
    AF_Point*      contour       = hints->contours;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   703
    AF_Point*      contour_limit = contour + hints->num_contours;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   704
    AF_Direction   major_dir, segment_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   705
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   706
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   707
    FT_ZERO( &seg0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   708
    seg0.score = 32000;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   709
    seg0.flags = AF_EDGE_NORMAL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   710
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   711
    major_dir   = (AF_Direction)FT_ABS( axis->major_dir );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   712
    segment_dir = major_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   713
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   714
    axis->num_segments = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   715
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   716
    /* set up (u,v) in each point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   717
    if ( dim == AF_DIMENSION_HORZ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   718
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   719
      AF_Point  point = hints->points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   720
      AF_Point  limit = point + hints->num_points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   721
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   722
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   723
      for ( ; point < limit; point++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   724
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   725
        point->u = point->fx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   726
        point->v = point->fy;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   727
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   728
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   729
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   730
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   731
      AF_Point  point = hints->points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   732
      AF_Point  limit = point + hints->num_points;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   733
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   734
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   735
      for ( ; point < limit; point++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   736
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   737
        point->u = point->fy;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   738
        point->v = point->fx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   739
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   740
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   741
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   742
    /* do each contour separately */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   743
    for ( ; contour < contour_limit; contour++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   744
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   745
      AF_Point  point   =  contour[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   746
      AF_Point  last    =  point->prev;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   747
      int       on_edge =  0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   748
      FT_Pos    min_pos =  32000;  /* minimum segment pos != min_coord */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   749
      FT_Pos    max_pos = -32000;  /* maximum segment pos != max_coord */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   750
      FT_Bool   passed;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   751
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   752
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   753
      if ( point == last )  /* skip singletons -- just in case */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   754
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   755
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   756
      if ( FT_ABS( last->out_dir )  == major_dir &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   757
           FT_ABS( point->out_dir ) == major_dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   758
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   759
        /* we are already on an edge, try to locate its start */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   760
        last = point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   761
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   762
        for (;;)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   763
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   764
          point = point->prev;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   765
          if ( FT_ABS( point->out_dir ) != major_dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   766
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   767
            point = point->next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   768
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   769
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   770
          if ( point == last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   771
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   772
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   773
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   774
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   775
      last   = point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   776
      passed = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   777
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   778
      for (;;)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   779
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   780
        FT_Pos  u, v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   781
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   782
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   783
        if ( on_edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   784
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   785
          u = point->u;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   786
          if ( u < min_pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   787
            min_pos = u;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   788
          if ( u > max_pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   789
            max_pos = u;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   790
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   791
          if ( point->out_dir != segment_dir || point == last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   792
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   793
            /* we are just leaving an edge; record a new segment! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   794
            segment->last = point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   795
            segment->pos  = (FT_Short)( ( min_pos + max_pos ) >> 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   796
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   797
            /* a segment is round if either its first or last point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   798
            /* is a control point                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   799
            if ( ( segment->first->flags | point->flags ) &
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   800
                 AF_FLAG_CONTROL                          )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   801
              segment->flags |= AF_EDGE_ROUND;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   802
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   803
            /* compute segment size */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   804
            min_pos = max_pos = point->v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   805
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   806
            v = segment->first->v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   807
            if ( v < min_pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   808
              min_pos = v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   809
            if ( v > max_pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   810
              max_pos = v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   811
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   812
            segment->min_coord = (FT_Short)min_pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   813
            segment->max_coord = (FT_Short)max_pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   814
            segment->height    = (FT_Short)( segment->max_coord -
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   815
                                             segment->min_coord );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   816
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   817
            on_edge = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   818
            segment = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   819
            /* fallthrough */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   820
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   821
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   822
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   823
        /* now exit if we are at the start/end point */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   824
        if ( point == last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   825
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   826
          if ( passed )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   827
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   828
          passed = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   829
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   830
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   831
        if ( !on_edge && FT_ABS( point->out_dir ) == major_dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   832
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   833
          /* this is the start of a new segment! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   834
          segment_dir = (AF_Direction)point->out_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   835
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   836
          /* clear all segment fields */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   837
          error = af_axis_hints_new_segment( axis, memory, &segment );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   838
          if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   839
            goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   840
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   841
          segment[0]        = seg0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   842
          segment->dir      = (FT_Char)segment_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   843
          min_pos = max_pos = point->u;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   844
          segment->first    = point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   845
          segment->last     = point;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   846
          segment->contour  = contour;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   847
          on_edge           = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   848
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   849
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   850
        point = point->next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   851
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   852
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   853
    } /* contours */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   854
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   855
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   856
    /* now slightly increase the height of segments when this makes */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   857
    /* sense -- this is used to better detect and ignore serifs     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   858
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   859
      AF_Segment  segments     = axis->segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   860
      AF_Segment  segments_end = segments + axis->num_segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   861
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   862
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   863
      for ( segment = segments; segment < segments_end; segment++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   864
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   865
        AF_Point  first   = segment->first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   866
        AF_Point  last    = segment->last;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   867
        FT_Pos    first_v = first->v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   868
        FT_Pos    last_v  = last->v;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   869
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   870
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   871
        if ( first == last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   872
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   873
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   874
        if ( first_v < last_v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   875
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   876
          AF_Point  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   877
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   878
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   879
          p = first->prev;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   880
          if ( p->v < first_v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   881
            segment->height = (FT_Short)( segment->height +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   882
                                          ( ( first_v - p->v ) >> 1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   883
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   884
          p = last->next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   885
          if ( p->v > last_v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   886
            segment->height = (FT_Short)( segment->height +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   887
                                          ( ( p->v - last_v ) >> 1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   888
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   889
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   890
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   891
          AF_Point  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   892
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   893
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   894
          p = first->prev;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   895
          if ( p->v > first_v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   896
            segment->height = (FT_Short)( segment->height +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   897
                                          ( ( p->v - first_v ) >> 1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   898
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   899
          p = last->next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   900
          if ( p->v < last_v )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   901
            segment->height = (FT_Short)( segment->height +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   902
                                          ( ( last_v - p->v ) >> 1 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   903
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   904
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   905
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   906
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   907
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   908
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   909
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   910
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   911
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   912
  /* Link segments to form stems and serifs. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   914
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   915
  af_latin_hints_link_segments( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   916
                                AF_Dimension   dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   917
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   918
    AF_AxisHints  axis          = &hints->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   919
    AF_Segment    segments      = axis->segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   920
    AF_Segment    segment_limit = segments + axis->num_segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   921
    FT_Pos        len_threshold, len_score;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   922
    AF_Segment    seg1, seg2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   923
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   924
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   925
    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   926
    if ( len_threshold == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   927
      len_threshold = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   928
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   929
    len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   930
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   931
    /* now compare each segment to the others */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   932
    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   933
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   934
      /* the fake segments are introduced to hint the metrics -- */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   935
      /* we must never link them to anything                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   936
      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   937
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   938
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   939
      /* search for stems having opposite directions, */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   940
      /* with seg1 to the `left' of seg2              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   941
      for ( seg2 = segments; seg2 < segment_limit; seg2++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   942
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   943
        FT_Pos  pos1 = seg1->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   944
        FT_Pos  pos2 = seg2->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   945
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   946
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   947
        if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   948
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   949
          /* compute distance between the two segments */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   950
          FT_Pos  dist = pos2 - pos1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   951
          FT_Pos  min  = seg1->min_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   952
          FT_Pos  max  = seg1->max_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   953
          FT_Pos  len, score;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   954
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   955
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   956
          if ( min < seg2->min_coord )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   957
            min = seg2->min_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   958
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   959
          if ( max > seg2->max_coord )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   960
            max = seg2->max_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   961
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   962
          /* compute maximum coordinate difference of the two segments */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   963
          len = max - min;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   964
          if ( len >= len_threshold )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   965
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   966
            /* small coordinate differences cause a higher score, and     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   967
            /* segments with a greater distance cause a higher score also */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   968
            score = dist + len_score / len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   969
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   970
            /* and we search for the smallest score */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   971
            /* of the sum of the two values         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   972
            if ( score < seg1->score )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   973
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   974
              seg1->score = score;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   975
              seg1->link  = seg2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   976
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   977
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   978
            if ( score < seg2->score )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   979
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   980
              seg2->score = score;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   981
              seg2->link  = seg1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   982
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   983
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   984
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   985
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   986
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   987
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   988
    /* now compute the `serif' segments, cf. explanations in `afhints.h' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   989
    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   990
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   991
      seg2 = seg1->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   992
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   993
      if ( seg2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   994
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   995
        if ( seg2->link != seg1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   996
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   997
          seg1->link  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   998
          seg1->serif = seg2->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   999
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1000
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1001
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1002
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1003
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1004
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1005
  /* Link segments to edges, using feature analysis for selection. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1006
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1007
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1008
  af_latin_hints_compute_edges( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1009
                                AF_Dimension   dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1010
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1011
    AF_AxisHints  axis   = &hints->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1012
    FT_Error      error  = AF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1013
    FT_Memory     memory = hints->memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1014
    AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1015
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1016
    AF_Segment    segments      = axis->segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1017
    AF_Segment    segment_limit = segments + axis->num_segments;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1018
    AF_Segment    seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1019
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1020
    AF_Direction  up_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1021
    FT_Fixed      scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1022
    FT_Pos        edge_distance_threshold;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1023
    FT_Pos        segment_length_threshold;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1024
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1025
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1026
    axis->num_edges = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1027
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1028
    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1029
                                         : hints->y_scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1030
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1031
    up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1032
                                          : AF_DIR_RIGHT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1033
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1034
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1035
     *  We ignore all segments that are less than 1 pixel in length
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1036
     *  to avoid many problems with serif fonts.  We compute the
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1037
     *  corresponding threshold in font units.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1038
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1039
    if ( dim == AF_DIMENSION_HORZ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1040
        segment_length_threshold = FT_DivFix( 64, hints->y_scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1041
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1042
        segment_length_threshold = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1043
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1044
    /*********************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1045
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1046
    /* We begin by generating a sorted table of edges for the current    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1047
    /* direction.  To do so, we simply scan each segment and try to find */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1048
    /* an edge in our table that corresponds to its position.            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1049
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1050
    /* If no edge is found, we create and insert a new edge in the       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1051
    /* sorted table.  Otherwise, we simply add the segment to the edge's */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1052
    /* list which gets processed in the second step to compute the       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1053
    /* edge's properties.                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1054
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1055
    /* Note that the table of edges is sorted along the segment/edge     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1056
    /* position.                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1057
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1058
    /*********************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1059
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1060
    /* assure that edge distance threshold is at least 0.25px */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1061
    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1062
                                         scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1063
    if ( edge_distance_threshold > 64 / 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1064
      edge_distance_threshold = 64 / 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1065
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1066
    edge_distance_threshold = FT_DivFix( edge_distance_threshold,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1067
                                         scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1068
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1069
    for ( seg = segments; seg < segment_limit; seg++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1070
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1071
      AF_Edge  found = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1072
      FT_Int   ee;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1073
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1074
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1075
      if ( seg->height < segment_length_threshold )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1076
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1077
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1078
      /* A special case for serif edges: If they are smaller than */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1079
      /* 1.5 pixels we ignore them.                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1080
      if ( seg->serif                                     &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1081
           2 * seg->height < 3 * segment_length_threshold )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1082
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1083
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1084
      /* look for an edge corresponding to the segment */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1085
      for ( ee = 0; ee < axis->num_edges; ee++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1086
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1087
        AF_Edge  edge = axis->edges + ee;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1088
        FT_Pos   dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1089
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1090
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1091
        dist = seg->pos - edge->fpos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1092
        if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1093
          dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1094
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1095
        if ( dist < edge_distance_threshold && edge->dir == seg->dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1096
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1097
          found = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1098
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1099
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1100
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1101
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1102
      if ( !found )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1103
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1104
        AF_Edge  edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1105
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1106
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1107
        /* insert a new edge in the list and */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1108
        /* sort according to the position    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1109
        error = af_axis_hints_new_edge( axis, seg->pos,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1110
                                        (AF_Direction)seg->dir,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1111
                                        memory, &edge );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1112
        if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1113
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1114
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1115
        /* add the segment to the new edge's list */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1116
        FT_ZERO( edge );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1117
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1118
        edge->first    = seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1119
        edge->last     = seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1120
        edge->dir      = seg->dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1121
        edge->fpos     = seg->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1122
        edge->opos     = FT_MulFix( seg->pos, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1123
        edge->pos      = edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1124
        seg->edge_next = seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1125
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1126
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1127
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1128
        /* if an edge was found, simply add the segment to the edge's */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1129
        /* list                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1130
        seg->edge_next         = found->first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1131
        found->last->edge_next = seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1132
        found->last            = seg;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1133
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1134
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1135
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1136
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1137
    /*********************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1138
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1139
    /* Good, we will now compute each edge's properties according to     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1140
    /* the segments found on its position.  Basically, these are         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1141
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1142
    /*  - the edge's main direction                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1143
    /*  - stem edge, serif edge or both (which defaults to stem then)    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1144
    /*  - rounded edge, straight or both (which defaults to straight)    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1145
    /*  - link for edge                                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1146
    /*                                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1147
    /*********************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1148
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1149
    /* first of all, set the `edge' field in each segment -- this is */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1150
    /* required in order to compute edge links                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1151
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1152
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1153
     * Note that removing this loop and setting the `edge' field of each
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1154
     * segment directly in the code above slows down execution speed for
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1155
     * some reasons on platforms like the Sun.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1156
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1157
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1158
      AF_Edge  edges      = axis->edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1159
      AF_Edge  edge_limit = edges + axis->num_edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1160
      AF_Edge  edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1161
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1162
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1163
      for ( edge = edges; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1164
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1165
        seg = edge->first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1166
        if ( seg )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1167
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1168
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1169
            seg->edge = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1170
            seg       = seg->edge_next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1171
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1172
          } while ( seg != edge->first );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1173
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1174
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1175
      /* now compute each edge properties */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1176
      for ( edge = edges; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1177
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1178
        FT_Int  is_round    = 0;  /* does it contain round segments?    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1179
        FT_Int  is_straight = 0;  /* does it contain straight segments? */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1180
#if 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1181
        FT_Pos  ups         = 0;  /* number of upwards segments         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1182
        FT_Pos  downs       = 0;  /* number of downwards segments       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1183
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1184
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1186
        seg = edge->first;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1187
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1188
        do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1189
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1190
          FT_Bool  is_serif;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1191
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1192
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1193
          /* check for roundness of segment */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1194
          if ( seg->flags & AF_EDGE_ROUND )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1195
            is_round++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1196
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1197
            is_straight++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1198
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1199
#if 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1200
          /* check for segment direction */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1201
          if ( seg->dir == up_dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1202
            ups   += seg->max_coord - seg->min_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1203
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1204
            downs += seg->max_coord - seg->min_coord;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1205
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1206
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1207
          /* check for links -- if seg->serif is set, then seg->link must */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1208
          /* be ignored                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1209
          is_serif = (FT_Bool)( seg->serif               &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1210
                                seg->serif->edge         &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1211
                                seg->serif->edge != edge );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1213
          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1214
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1215
            AF_Edge     edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1216
            AF_Segment  seg2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1217
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1218
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1219
            edge2 = edge->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1220
            seg2  = seg->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1221
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1222
            if ( is_serif )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1223
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1224
              seg2  = seg->serif;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1225
              edge2 = edge->serif;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1226
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1227
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1228
            if ( edge2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1229
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1230
              FT_Pos  edge_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1231
              FT_Pos  seg_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1232
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1233
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1234
              edge_delta = edge->fpos - edge2->fpos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1235
              if ( edge_delta < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1236
                edge_delta = -edge_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1237
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1238
              seg_delta = seg->pos - seg2->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1239
              if ( seg_delta < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1240
                seg_delta = -seg_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1241
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1242
              if ( seg_delta < edge_delta )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1243
                edge2 = seg2->edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1244
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1245
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1246
              edge2 = seg2->edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1247
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1248
            if ( is_serif )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1249
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1250
              edge->serif   = edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1251
              edge2->flags |= AF_EDGE_SERIF;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1252
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1253
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1254
              edge->link  = edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1255
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1256
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1257
          seg = seg->edge_next;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1258
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1259
        } while ( seg != edge->first );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1260
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1261
        /* set the round/straight flags */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1262
        edge->flags = AF_EDGE_NORMAL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1263
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1264
        if ( is_round > 0 && is_round >= is_straight )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1265
          edge->flags |= AF_EDGE_ROUND;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1266
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1267
#if 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1268
        /* set the edge's main direction */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1269
        edge->dir = AF_DIR_NONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1270
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1271
        if ( ups > downs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1272
          edge->dir = (FT_Char)up_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1273
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1274
        else if ( ups < downs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1275
          edge->dir = (FT_Char)-up_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1276
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1277
        else if ( ups == downs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1278
          edge->dir = 0;  /* both up and down! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1279
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1280
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1281
        /* get rid of serifs if link is set                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1282
        /* XXX: This gets rid of many unpleasant artefacts! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1283
        /*      Example: the `c' in cour.pfa at size 13     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1284
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1285
        if ( edge->serif && edge->link )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1286
          edge->serif = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1287
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1288
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1289
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1290
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1291
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1292
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1293
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1294
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1295
  /* Detect segments and edges for given dimension. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1296
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1297
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1298
  af_latin_hints_detect_features( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1299
                                  AF_Dimension   dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1300
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1301
    FT_Error  error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1302
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1303
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1304
    error = af_latin_hints_compute_segments( hints, dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1305
    if ( !error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1306
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1307
      af_latin_hints_link_segments( hints, dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1308
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1309
      error = af_latin_hints_compute_edges( hints, dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1310
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1311
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1312
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1313
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1314
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1315
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1316
  /* Compute all edges which lie within blue zones. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1317
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1318
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1319
  af_latin_hints_compute_blue_edges( AF_GlyphHints    hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1320
                                     AF_LatinMetrics  metrics )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1321
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1322
    AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1323
    AF_Edge       edge       = axis->edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1324
    AF_Edge       edge_limit = edge + axis->num_edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1325
    AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1326
    FT_Fixed      scale      = latin->scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1327
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1328
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1329
    /* compute which blue zones are active, i.e. have their scaled */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1330
    /* size < 3/4 pixels                                           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1331
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1332
    /* for each horizontal edge search the blue zone which is closest */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1333
    for ( ; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1334
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1335
      FT_Int    bb;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1336
      AF_Width  best_blue = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1337
      FT_Pos    best_dist;  /* initial threshold */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1338
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1339
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1340
      /* compute the initial threshold as a fraction of the EM size */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1341
      /* (the value 40 is heuristic)                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1342
      best_dist = FT_MulFix( metrics->units_per_em / 40, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1343
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1344
      /* assure a minimum distance of 0.5px */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1345
      if ( best_dist > 64 / 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1346
        best_dist = 64 / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1347
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1348
      for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1349
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1350
        AF_LatinBlue  blue = latin->blues + bb;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1351
        FT_Bool       is_top_blue, is_major_dir;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1352
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1353
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1354
        /* skip inactive blue zones (i.e., those that are too large) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1355
        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1356
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1357
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1358
        /* if it is a top zone, check for right edges -- if it is a bottom */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1359
        /* zone, check for left edges                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1360
        /*                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1361
        /* of course, that's for TrueType                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1362
        is_top_blue  = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1363
        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1364
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1365
        /* if it is a top zone, the edge must be against the major    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1366
        /* direction; if it is a bottom zone, it must be in the major */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1367
        /* direction                                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1368
        if ( is_top_blue ^ is_major_dir )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1369
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1370
          FT_Pos  dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1371
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1372
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1373
          /* first of all, compare it to the reference position */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1374
          dist = edge->fpos - blue->ref.org;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1375
          if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1376
            dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1377
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1378
          dist = FT_MulFix( dist, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1379
          if ( dist < best_dist )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1380
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1381
            best_dist = dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1382
            best_blue = &blue->ref;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1383
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1384
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1385
          /* now compare it to the overshoot position and check whether */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1386
          /* the edge is rounded, and whether the edge is over the      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1387
          /* reference position of a top zone, or under the reference   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1388
          /* position of a bottom zone                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1389
          if ( edge->flags & AF_EDGE_ROUND && dist != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1390
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1391
            FT_Bool  is_under_ref = FT_BOOL( edge->fpos < blue->ref.org );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1392
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1393
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1394
            if ( is_top_blue ^ is_under_ref )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1395
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1396
              dist = edge->fpos - blue->shoot.org;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1397
              if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1398
                dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1399
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1400
              dist = FT_MulFix( dist, scale );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1401
              if ( dist < best_dist )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1402
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1403
                best_dist = dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1404
                best_blue = &blue->shoot;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1405
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1406
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1407
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1408
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1409
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1410
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1411
      if ( best_blue )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1412
        edge->blue_edge = best_blue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1413
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1414
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1415
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1416
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1417
  /* Initalize hinting engine. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1418
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1419
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1420
  af_latin_hints_init( AF_GlyphHints    hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1421
                       AF_LatinMetrics  metrics )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1422
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1423
    FT_Render_Mode  mode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1424
    FT_UInt32       scaler_flags, other_flags;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1425
    FT_Face         face = metrics->root.scaler.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1426
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1427
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1428
    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1429
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1430
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1431
     *  correct x_scale and y_scale if needed, since they may have
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1432
     *  been modified by `af_latin_metrics_scale_dim' above
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1433
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1434
    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1435
    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1436
    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1437
    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1438
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1439
    /* compute flags depending on render mode, etc. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1440
    mode = metrics->root.scaler.render_mode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1441
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1442
#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1443
    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1444
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1445
      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1446
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1447
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1448
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1449
    scaler_flags = hints->scaler_flags;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1450
    other_flags  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1451
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1452
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1453
     *  We snap the width of vertical stems for the monochrome and
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1454
     *  horizontal LCD rendering targets only.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1455
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1456
    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1457
      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1458
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1459
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1460
     *  We snap the width of horizontal stems for the monochrome and
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1461
     *  vertical LCD rendering targets only.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1462
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1463
    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1464
      other_flags |= AF_LATIN_HINTS_VERT_SNAP;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1465
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1466
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1467
     *  We adjust stems to full pixels only if we don't use the `light' mode.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1468
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1469
    if ( mode != FT_RENDER_MODE_LIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1470
      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1471
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1472
    if ( mode == FT_RENDER_MODE_MONO )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1473
      other_flags |= AF_LATIN_HINTS_MONO;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1474
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1475
    /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1476
     *  In `light' hinting mode we disable horizontal hinting completely.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1477
     *  We also do it if the face is italic.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1478
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1479
    if ( mode == FT_RENDER_MODE_LIGHT                      ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1480
         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1481
      scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1483
    hints->scaler_flags = scaler_flags;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1484
    hints->other_flags  = other_flags;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1485
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1486
    return AF_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1487
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1488
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1489
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1490
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1491
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1492
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1493
  /*****        L A T I N   G L Y P H   G R I D - F I T T I N G        *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1494
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1495
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1496
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1497
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1498
  /* Snap a given width in scaled coordinates to one of the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1499
  /* current standard widths.                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1500
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1501
  static FT_Pos
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1502
  af_latin_snap_width( AF_Width  widths,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1503
                       FT_Int    count,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1504
                       FT_Pos    width )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1505
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1506
    int     n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1507
    FT_Pos  best      = 64 + 32 + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1508
    FT_Pos  reference = width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1509
    FT_Pos  scaled;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1510
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1511
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1512
    for ( n = 0; n < count; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1513
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1514
      FT_Pos  w;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1515
      FT_Pos  dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1516
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1517
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1518
      w = widths[n].cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1519
      dist = width - w;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1520
      if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1521
        dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1522
      if ( dist < best )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1523
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1524
        best      = dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1525
        reference = w;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1526
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1527
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1528
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1529
    scaled = FT_PIX_ROUND( reference );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1530
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1531
    if ( width >= reference )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1532
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1533
      if ( width < scaled + 48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1534
        width = reference;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1535
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1536
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1537
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1538
      if ( width > scaled - 48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1539
        width = reference;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1540
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1541
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1542
    return width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1543
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1544
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1545
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1546
  /* Compute the snapped width of a given stem, ignoring very thin ones. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1547
  /* There is a lot of voodoo in this function; changing the hard-coded  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1548
  /* parameters influence the whole hinting process.                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1549
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1550
  static FT_Pos
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1551
  af_latin_compute_stem_width( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1552
                               AF_Dimension   dim,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1553
                               FT_Pos         width,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1554
                               AF_Edge_Flags  base_flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1555
                               AF_Edge_Flags  stem_flags )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1556
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1557
    AF_LatinMetrics  metrics  = (AF_LatinMetrics) hints->metrics;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1558
    AF_LatinAxis     axis     = & metrics->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1559
    FT_Pos           dist     = width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1560
    FT_Int           sign     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1561
    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1562
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1563
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1564
    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1565
         axis->extra_light                       )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1566
      return width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1567
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1568
    if ( dist < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1569
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1570
      dist = -width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1571
      sign = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1572
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1573
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1574
    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1575
         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1576
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1577
      /* smooth hinting process: very lightly quantize the stem width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1578
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1579
      /* leave the widths of serifs alone */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1580
      if ( ( stem_flags & AF_EDGE_SERIF ) &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1581
           vertical                       &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1582
           ( dist < 3 * 64 )              )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1583
        goto Done_Width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1584
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1585
      else if ( base_flags & AF_EDGE_ROUND )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1586
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1587
        if ( dist < 80 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1588
          dist = 64;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1589
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1590
      else if ( dist < 56 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1591
        dist = 56;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1592
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1593
      if ( axis->width_count > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1594
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1595
        FT_Pos  delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1596
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1597
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1598
        /* compare to standard width */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1599
        delta = dist - axis->widths[0].cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1600
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1601
        if ( delta < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1602
          delta = -delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1603
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1604
        if ( delta < 40 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1605
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1606
          dist = axis->widths[0].cur;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1607
          if ( dist < 48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1608
            dist = 48;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1609
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1610
          goto Done_Width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1611
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1612
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1613
        if ( dist < 3 * 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1614
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1615
          delta  = dist & 63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1616
          dist  &= -64;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1617
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1618
          if ( delta < 10 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1619
            dist += delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1620
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1621
          else if ( delta < 32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1622
            dist += 10;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1623
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1624
          else if ( delta < 54 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1625
            dist += 54;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1626
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1627
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1628
            dist += delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1629
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1630
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1631
          dist = ( dist + 32 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1632
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1633
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1634
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1635
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1636
      /* strong hinting process: snap the stem width to integer pixels */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1637
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1638
      FT_Pos  org_dist = dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1639
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1640
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1641
      dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1642
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1643
      if ( vertical )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1644
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1645
        /* in the case of vertical hinting, always round */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1646
        /* the stem heights to integer pixels            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1647
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1648
        if ( dist >= 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1649
          dist = ( dist + 16 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1650
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1651
          dist = 64;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1652
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1653
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1654
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1655
        if ( AF_LATIN_HINTS_DO_MONO( hints ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1656
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1657
          /* monochrome horizontal hinting: snap widths to integer pixels */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1658
          /* with a different threshold                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1659
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1660
          if ( dist < 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1661
            dist = 64;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1662
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1663
            dist = ( dist + 32 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1664
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1665
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1666
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1667
          /* for horizontal anti-aliased hinting, we adopt a more subtle */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1668
          /* approach: we strengthen small stems, round stems whose size */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1669
          /* is between 1 and 2 pixels to an integer, otherwise nothing  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1670
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1671
          if ( dist < 48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1672
            dist = ( dist + 64 ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1673
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1674
          else if ( dist < 128 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1675
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1676
            /* We only round to an integer width if the corresponding */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1677
            /* distortion is less than 1/4 pixel.  Otherwise this     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1678
            /* makes everything worse since the diagonals, which are  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1679
            /* not hinted, appear a lot bolder or thinner than the    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1680
            /* vertical stems.                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1681
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1682
            FT_Pos  delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1683
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1684
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1685
            dist = ( dist + 22 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1686
            delta = dist - org_dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1687
            if ( delta < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1688
              delta = -delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1689
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1690
            if (delta >= 16)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1691
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1692
              dist = org_dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1693
              if ( dist < 48 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1694
                dist = ( dist + 64 ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1695
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1696
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1697
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1698
            /* round otherwise to prevent color fringes in LCD mode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1699
            dist = ( dist + 32 ) & ~63;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1700
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1701
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1702
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1703
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1704
  Done_Width:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1705
    if ( sign )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1706
      dist = -dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1707
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1708
    return dist;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1709
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1710
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1711
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1712
  /* Align one stem edge relative to the previous stem edge. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1713
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1714
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1715
  af_latin_align_linked_edge( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1716
                              AF_Dimension   dim,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1717
                              AF_Edge        base_edge,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1718
                              AF_Edge        stem_edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1719
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1720
    FT_Pos  dist = stem_edge->opos - base_edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1721
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1722
    FT_Pos  fitted_width = af_latin_compute_stem_width(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1723
                             hints, dim, dist,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1724
                             (AF_Edge_Flags)base_edge->flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1725
                             (AF_Edge_Flags)stem_edge->flags );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1726
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1727
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1728
    stem_edge->pos = base_edge->pos + fitted_width;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1729
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1730
    FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f),"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1731
                " dist was %.2f, now %.2f\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1732
                stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1733
                stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1734
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1735
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1736
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1737
  /* Shift the coordinates of the `serif' edge by the same amount */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1738
  /* as the corresponding `base' edge has been moved already.     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1739
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1740
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1741
  af_latin_align_serif_edge( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1742
                             AF_Edge        base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1743
                             AF_Edge        serif )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1744
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1745
    FT_UNUSED( hints );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1746
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1747
    serif->pos = base->pos + ( serif->opos - base->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1748
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1749
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1750
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1751
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1752
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1753
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1754
  /****                                                                 ****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1755
  /****                    E D G E   H I N T I N G                      ****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1756
  /****                                                                 ****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1757
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1758
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1759
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1760
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1761
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1762
  /* The main grid-fitting routine. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1763
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1764
  FT_LOCAL_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1765
  af_latin_hint_edges( AF_GlyphHints  hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1766
                       AF_Dimension   dim )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1767
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1768
    AF_AxisHints  axis       = &hints->axis[dim];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1769
    AF_Edge       edges      = axis->edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1770
    AF_Edge       edge_limit = edges + axis->num_edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1771
    FT_PtrDist    n_edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1772
    AF_Edge       edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1773
    AF_Edge       anchor     = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1774
    FT_Int        has_serifs = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1775
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1776
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1777
    /* we begin by aligning all stems relative to the blue zone */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1778
    /* if needed -- that's only for horizontal edges            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1779
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1780
    if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1781
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1782
      for ( edge = edges; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1783
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1784
        AF_Width  blue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1785
        AF_Edge   edge1, edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1786
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1787
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1788
        if ( edge->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1789
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1790
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1791
        blue  = edge->blue_edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1792
        edge1 = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1793
        edge2 = edge->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1794
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1795
        if ( blue )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1796
          edge1 = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1797
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1798
        else if ( edge2 && edge2->blue_edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1799
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1800
          blue  = edge2->blue_edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1801
          edge1 = edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1802
          edge2 = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1803
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1804
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1805
        if ( !edge1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1806
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1807
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1808
        FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f),"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1809
                    " was (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1810
                    edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1811
                    edge1->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1812
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1813
        edge1->pos    = blue->fit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1814
        edge1->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1815
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1816
        if ( edge2 && !edge2->blue_edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1817
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1818
          af_latin_align_linked_edge( hints, dim, edge1, edge2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1819
          edge2->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1820
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1821
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1822
        if ( !anchor )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1823
          anchor = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1824
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1825
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1826
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1827
    /* now we align all stem edges, trying to maintain the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1828
    /* relative order of stems in the glyph                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1829
    for ( edge = edges; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1830
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1831
      AF_Edge  edge2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1832
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1833
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1834
      if ( edge->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1835
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1836
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1837
      /* skip all non-stem edges */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1838
      edge2 = edge->link;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1839
      if ( !edge2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1840
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1841
        has_serifs++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1842
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1843
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1845
      /* now align the stem */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1846
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1847
      /* this should not happen, but it's better to be safe */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1848
      if ( edge2->blue_edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1849
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1850
        FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1851
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1852
        af_latin_align_linked_edge( hints, dim, edge2, edge );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1853
        edge->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1854
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1855
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1856
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1857
      if ( !anchor )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1858
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1859
        FT_Pos  org_len, org_center, cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1860
        FT_Pos  cur_pos1, error1, error2, u_off, d_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1861
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1862
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1863
        org_len = edge2->opos - edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1864
        cur_len = af_latin_compute_stem_width(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1865
                    hints, dim, org_len,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1866
                    (AF_Edge_Flags)edge->flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1867
                    (AF_Edge_Flags)edge2->flags );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1868
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1869
        /* some voodoo to specially round edges for small stem widths */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1870
        if ( cur_len <= 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1871
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1872
          u_off = 32;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1873
          d_off = 32;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1874
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1875
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1876
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1877
          u_off = 38;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1878
          d_off = 26;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1879
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1880
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1881
        if ( cur_len < 96 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1882
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1883
          org_center = edge->opos + ( org_len >> 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1884
          cur_pos1   = FT_PIX_ROUND( org_center );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1885
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1886
          error1 = org_center - ( cur_pos1 - u_off );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1887
          if ( error1 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1888
            error1 = -error1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1889
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1890
          error2 = org_center - ( cur_pos1 + d_off );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1891
          if ( error2 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1892
            error2 = -error2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1893
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1894
          if ( error1 < error2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1895
            cur_pos1 -= u_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1896
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1897
            cur_pos1 += d_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1898
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1899
          edge->pos  = cur_pos1 - cur_len / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1900
          edge2->pos = edge->pos + cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1901
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1902
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1903
          edge->pos = FT_PIX_ROUND( edge->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1904
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1905
        FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1906
                    " snapped to (%.2f) (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1907
                    edge - edges, edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1908
                    edge2 - edges, edge2->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1909
                    edge->pos / 64.0, edge2->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1910
        anchor = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1911
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1912
        edge->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1914
        af_latin_align_linked_edge( hints, dim, edge, edge2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1915
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1916
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1917
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1918
        FT_Pos  org_pos, org_len, org_center, cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1919
        FT_Pos  cur_pos1, cur_pos2, delta1, delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1920
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1921
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1922
        org_pos    = anchor->pos + ( edge->opos - anchor->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1923
        org_len    = edge2->opos - edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1924
        org_center = org_pos + ( org_len >> 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1925
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1926
        cur_len = af_latin_compute_stem_width(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1927
                    hints, dim, org_len,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1928
                    (AF_Edge_Flags)edge->flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1929
                    (AF_Edge_Flags)edge2->flags );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1930
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1931
        if ( edge2->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1932
          edge->pos = edge2->pos - cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1933
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1934
        else if ( cur_len < 96 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1935
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1936
          FT_Pos  u_off, d_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1937
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1938
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1939
          cur_pos1 = FT_PIX_ROUND( org_center );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1940
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1941
          if (cur_len <= 64 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1942
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1943
            u_off = 32;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1944
            d_off = 32;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1945
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1946
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1947
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1948
            u_off = 38;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1949
            d_off = 26;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1950
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1951
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1952
          delta1 = org_center - ( cur_pos1 - u_off );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1953
          if ( delta1 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1954
            delta1 = -delta1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1955
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1956
          delta2 = org_center - ( cur_pos1 + d_off );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1957
          if ( delta2 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1958
            delta2 = -delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1959
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1960
          if ( delta1 < delta2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1961
            cur_pos1 -= u_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1962
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1963
            cur_pos1 += d_off;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1964
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1965
          edge->pos  = cur_pos1 - cur_len / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1966
          edge2->pos = cur_pos1 + cur_len / 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1967
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1968
          FT_TRACE5(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1969
                      " snapped to (%.2f) and (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1970
                      edge - edges, edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1971
                      edge2 - edges, edge2->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1972
                      edge->pos / 64.0, edge2->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1973
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1974
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1975
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1976
          org_pos    = anchor->pos + ( edge->opos - anchor->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1977
          org_len    = edge2->opos - edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1978
          org_center = org_pos + ( org_len >> 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1979
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1980
          cur_len    = af_latin_compute_stem_width(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1981
                         hints, dim, org_len,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1982
                         (AF_Edge_Flags)edge->flags,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1983
                         (AF_Edge_Flags)edge2->flags );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1984
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1985
          cur_pos1 = FT_PIX_ROUND( org_pos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1986
          delta1   = cur_pos1 + ( cur_len >> 1 ) - org_center;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1987
          if ( delta1 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1988
            delta1 = -delta1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1989
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1990
          cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1991
          delta2   = cur_pos2 + ( cur_len >> 1 ) - org_center;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1992
          if ( delta2 < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1993
            delta2 = -delta2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1994
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1995
          edge->pos  = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1996
          edge2->pos = edge->pos + cur_len;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1997
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1998
          FT_TRACE5(( "STEM: %d (opos=%.2f) to %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1999
                      " snapped to (%.2f) and (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2000
                      edge - edges, edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2001
                      edge2 - edges, edge2->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2002
                      edge->pos / 64.0, edge2->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2003
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2004
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2005
        edge->flags  |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2006
        edge2->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2007
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2008
        if ( edge > edges && edge->pos < edge[-1].pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2009
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2010
          FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2011
                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2012
          edge->pos = edge[-1].pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2013
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2014
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2015
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2016
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2017
    /* make sure that lowercase m's maintain their symmetry */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2018
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2019
    /* In general, lowercase m's have six vertical edges if they are sans */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2020
    /* serif, or twelve if they are with serifs.  This implementation is  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2021
    /* based on that assumption, and seems to work very well with most    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2022
    /* faces.  However, if for a certain face this assumption is not      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2023
    /* true, the m is just rendered like before.  In addition, any stem   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2024
    /* correction will only be applied to symmetrical glyphs (even if the */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2025
    /* glyph is not an m), so the potential for unwanted distortion is    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2026
    /* relatively low.                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2027
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2028
    /* We don't handle horizontal edges since we can't easily assure that */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2029
    /* the third (lowest) stem aligns with the base line; it might end up */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2030
    /* one pixel higher or lower.                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2031
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2032
    n_edges = edge_limit - edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2033
    if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2034
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2035
      AF_Edge  edge1, edge2, edge3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2036
      FT_Pos   dist1, dist2, span, delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2037
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2038
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2039
      if ( n_edges == 6 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2040
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2041
        edge1 = edges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2042
        edge2 = edges + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2043
        edge3 = edges + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2044
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2045
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2046
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2047
        edge1 = edges + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2048
        edge2 = edges + 5;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2049
        edge3 = edges + 9;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2050
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2051
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2052
      dist1 = edge2->opos - edge1->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2053
      dist2 = edge3->opos - edge2->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2054
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2055
      span = dist1 - dist2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2056
      if ( span < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2057
        span = -span;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2058
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2059
      if ( span < 8 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2060
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2061
        delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2062
        edge3->pos -= delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2063
        if ( edge3->link )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2064
          edge3->link->pos -= delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2065
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2066
        /* move the serifs along with the stem */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2067
        if ( n_edges == 12 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2068
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2069
          ( edges + 8 )->pos -= delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2070
          ( edges + 11 )->pos -= delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2071
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2072
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2073
        edge3->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2074
        if ( edge3->link )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2075
          edge3->link->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2076
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2077
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2078
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2079
    if ( has_serifs || !anchor )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2080
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2081
      /*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2082
       *  now hint the remaining edges (serifs and single) in order
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2083
       *  to complete our processing
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2084
       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2085
      for ( edge = edges; edge < edge_limit; edge++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2086
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2087
        FT_Pos  delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2088
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2089
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2090
        if ( edge->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2091
          continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2092
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2093
        delta = 1000;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2094
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2095
        if ( edge->serif )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2096
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2097
          delta = edge->serif->opos - edge->opos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2098
          if ( delta < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2099
            delta = -delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2100
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2101
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2102
        if ( delta < 64 + 16 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2103
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2104
          af_latin_align_serif_edge( hints, edge->serif, edge );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2105
          FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2106
                      " aligned to (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2107
                      edge - edges, edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2108
                      edge->serif - edges, edge->serif->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2109
                      edge->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2110
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2111
        else if ( !anchor )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2112
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2113
          FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2114
                      " snapped to (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2115
                      edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2116
          edge->pos = FT_PIX_ROUND( edge->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2117
          anchor    = edge;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2118
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2119
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2120
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2121
          AF_Edge  before, after;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2122
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2123
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2124
          for ( before = edge - 1; before >= edges; before-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2125
            if ( before->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2126
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2127
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2128
          for ( after = edge + 1; after < edge_limit; after++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2129
            if ( after->flags & AF_EDGE_DONE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2130
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2131
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2132
          if ( before >= edges && before < edge   &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2133
               after < edge_limit && after > edge )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2134
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2135
            if ( after->opos == before->opos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2136
              edge->pos = before->pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2137
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2138
              edge->pos = before->pos +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2139
                          FT_MulDiv( edge->opos - before->opos,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2140
                                     after->pos - before->pos,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2141
                                     after->opos - before->opos );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2142
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2143
            FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2144
                        " from %d (opos=%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2145
                        edge - edges, edge->opos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2146
                        edge->pos / 64.0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2147
                        before - edges, before->opos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2148
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2149
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2150
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2151
            edge->pos = anchor->pos +
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2152
                        ( ( edge->opos - anchor->opos + 16 ) & ~31 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2153
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2154
            FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2155
                        " snapped to (%.2f)\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2156
                        edge - edges, edge->opos / 64.0, edge->pos / 64.0 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2157
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2158
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2159
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2160
        edge->flags |= AF_EDGE_DONE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2161
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2162
        if ( edge > edges && edge->pos < edge[-1].pos )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2163
          edge->pos = edge[-1].pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2164
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2165
        if ( edge + 1 < edge_limit        &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2166
             edge[1].flags & AF_EDGE_DONE &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2167
             edge->pos > edge[1].pos      )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2168
          edge->pos = edge[1].pos;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2169
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2170
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2171
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2173
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2174
  /* Apply the complete hinting algorithm to a latin glyph. */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2175
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2176
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2177
  af_latin_hints_apply( AF_GlyphHints    hints,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2178
                        FT_Outline*      outline,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2179
                        AF_LatinMetrics  metrics )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2180
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2181
    FT_Error  error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2182
    int       dim;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2183
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2184
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2185
    error = af_glyph_hints_reload( hints, outline );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2186
    if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2187
      goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2188
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2189
    /* analyze glyph outline */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2190
#ifdef AF_CONFIG_OPTION_USE_WARPER
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2191
    if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2192
         AF_HINTS_DO_HORIZONTAL( hints )                          )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2193
#else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2194
    if ( AF_HINTS_DO_HORIZONTAL( hints ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2195
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2196
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2197
      error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2198
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2199
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2200
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2201
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2202
    if ( AF_HINTS_DO_VERTICAL( hints ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2203
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2204
      error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2205
      if ( error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2206
        goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2207
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2208
      af_latin_hints_compute_blue_edges( hints, metrics );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2209
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2210
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2211
    /* grid-fit the outline */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2212
    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2213
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2214
#ifdef AF_CONFIG_OPTION_USE_WARPER
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2215
      if ( dim == AF_DIMENSION_HORZ                                 &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2216
           metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2217
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2218
        AF_WarperRec  warper;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2219
        FT_Fixed      scale;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2220
        FT_Pos        delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2221
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2222
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2223
        af_warper_compute( &warper, hints, (AF_Dimension)dim,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2224
                           &scale, &delta );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2225
        af_glyph_hints_scale_dim( hints, (AF_Dimension)dim,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2226
                                  scale, delta );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2227
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2228
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2229
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2230
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2231
      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2232
           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2233
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2234
        af_latin_hint_edges( hints, (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2235
        af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2236
        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2237
        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2238
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2239
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2240
    af_glyph_hints_save( hints, outline );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2241
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2242
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2243
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2244
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2245
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2246
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2247
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2248
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2249
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2250
  /*****              L A T I N   S C R I P T   C L A S S              *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2251
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2252
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2253
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2254
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2255
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2256
  /* XXX: this should probably fine tuned to differentiate better between */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2257
  /*      scripts...                                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2258
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2259
  static const AF_Script_UniRangeRec  af_latin_uniranges[] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2260
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2261
    AF_UNIRANGE_REC(  0x0020UL,  0x007FUL ),  /* Basic Latin (no control chars) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2262
    AF_UNIRANGE_REC(  0x00A0UL,  0x00FFUL ),  /* Latin-1 Supplement (no control chars) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2263
    AF_UNIRANGE_REC(  0x0100UL,  0x017FUL ),  /* Latin Extended-A */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2264
    AF_UNIRANGE_REC(  0x0180UL,  0x024FUL ),  /* Latin Extended-B */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2265
    AF_UNIRANGE_REC(  0x0250UL,  0x02AFUL ),  /* IPA Extensions */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2266
    AF_UNIRANGE_REC(  0x02B0UL,  0x02FFUL ),  /* Spacing Modifier Letters */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2267
    AF_UNIRANGE_REC(  0x0300UL,  0x036FUL ),  /* Combining Diacritical Marks */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2268
    AF_UNIRANGE_REC(  0x0370UL,  0x03FFUL ),  /* Greek and Coptic */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2269
    AF_UNIRANGE_REC(  0x0400UL,  0x04FFUL ),  /* Cyrillic */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2270
    AF_UNIRANGE_REC(  0x0500UL,  0x052FUL ),  /* Cyrillic Supplement */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2271
    AF_UNIRANGE_REC(  0x1D00UL,  0x1D7FUL ),  /* Phonetic Extensions */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2272
    AF_UNIRANGE_REC(  0x1D80UL,  0x1DBFUL ),  /* Phonetic Extensions Supplement */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2273
    AF_UNIRANGE_REC(  0x1DC0UL,  0x1DFFUL ),  /* Combining Diacritical Marks Supplement */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2274
    AF_UNIRANGE_REC(  0x1E00UL,  0x1EFFUL ),  /* Latin Extended Additional */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2275
    AF_UNIRANGE_REC(  0x1F00UL,  0x1FFFUL ),  /* Greek Extended */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2276
    AF_UNIRANGE_REC(  0x2000UL,  0x206FUL ),  /* General Punctuation */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2277
    AF_UNIRANGE_REC(  0x2070UL,  0x209FUL ),  /* Superscripts and Subscripts */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2278
    AF_UNIRANGE_REC(  0x20A0UL,  0x20CFUL ),  /* Currency Symbols */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2279
    AF_UNIRANGE_REC(  0x2150UL,  0x218FUL ),  /* Number Forms */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2280
    AF_UNIRANGE_REC(  0x2460UL,  0x24FFUL ),  /* Enclosed Alphanumerics */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2281
    AF_UNIRANGE_REC(  0x2C60UL,  0x2C7FUL ),  /* Latin Extended-C */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2282
    AF_UNIRANGE_REC(  0x2DE0UL,  0x2DFFUL ),  /* Cyrillic Extended-A */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2283
    AF_UNIRANGE_REC(  0xA640UL,  0xA69FUL ),  /* Cyrillic Extended-B */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2284
    AF_UNIRANGE_REC(  0xA720UL,  0xA7FFUL ),  /* Latin Extended-D */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2285
    AF_UNIRANGE_REC(  0xFB00UL,  0xFB06UL ),  /* Alphab. Present. Forms (Latin Ligs) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2286
    AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ),  /* Mathematical Alphanumeric Symbols */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2287
    AF_UNIRANGE_REC(       0UL,       0UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2288
  };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2289
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2290
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2291
  AF_DEFINE_SCRIPT_CLASS(af_latin_script_class,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2292
    AF_SCRIPT_LATIN,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2293
    af_latin_uniranges,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2294
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2295
    sizeof( AF_LatinMetricsRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2296
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2297
    (AF_Script_InitMetricsFunc) af_latin_metrics_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2298
    (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2299
    (AF_Script_DoneMetricsFunc) NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2300
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2301
    (AF_Script_InitHintsFunc)   af_latin_hints_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2302
    (AF_Script_ApplyHintsFunc)  af_latin_hints_apply
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2303
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2304
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2305
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2306
/* END */