⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 afhints.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 3 页
字号:
  }  FT_LOCAL_DEF( void )  af_glyph_hints_save( AF_GlyphHints  hints,                       FT_Outline*    outline )  {    AF_Point    point = hints->points;    AF_Point    limit = point + hints->num_points;    FT_Vector*  vec   = outline->points;    char*       tag   = outline->tags;    for ( ; point < limit; point++, vec++, tag++ )    {      vec->x = point->x;      vec->y = point->y;      if ( point->flags & AF_FLAG_CONIC )        tag[0] = FT_CURVE_TAG_CONIC;      else if ( point->flags & AF_FLAG_CUBIC )        tag[0] = FT_CURVE_TAG_CUBIC;      else        tag[0] = FT_CURVE_TAG_ON;    }  }  /****************************************************************   *   *                     EDGE POINT GRID-FITTING   *   ****************************************************************/  FT_LOCAL_DEF( void )  af_glyph_hints_align_edge_points( AF_GlyphHints  hints,                                    AF_Dimension   dim )  {    AF_AxisHints  axis       = & hints->axis[dim];    AF_Edge       edges      = axis->edges;    AF_Edge       edge_limit = edges + axis->num_edges;    AF_Edge       edge;    for ( edge = edges; edge < edge_limit; edge++ )    {      /* move the points of each segment     */      /* in each edge to the edge's position */      AF_Segment  seg = edge->first;      do      {        AF_Point  point = seg->first;        for (;;)        {          if ( dim == AF_DIMENSION_HORZ )          {            point->x      = edge->pos;            point->flags |= AF_FLAG_TOUCH_X;          }          else          {            point->y      = edge->pos;            point->flags |= AF_FLAG_TOUCH_Y;          }          if ( point == seg->last )            break;          point = point->next;        }        seg = seg->edge_next;      } while ( seg != edge->first );    }  }  /****************************************************************   *   *                    STRONG POINT INTERPOLATION   *   ****************************************************************/  /* hint the strong points -- this is equivalent to the TrueType `IP' */  /* hinting instruction                                               */  FT_LOCAL_DEF( void )  af_glyph_hints_align_strong_points( AF_GlyphHints  hints,                                      AF_Dimension   dim )  {    AF_Point      points      = hints->points;    AF_Point      point_limit = points + hints->num_points;    AF_AxisHints  axis        = &hints->axis[dim];    AF_Edge       edges       = axis->edges;    AF_Edge       edge_limit  = edges + axis->num_edges;    AF_Flags      touch_flag;    if ( dim == AF_DIMENSION_HORZ )      touch_flag = AF_FLAG_TOUCH_X;    else      touch_flag  = AF_FLAG_TOUCH_Y;    if ( edges < edge_limit )    {      AF_Point  point;      AF_Edge   edge;      for ( point = points; point < point_limit; point++ )      {        FT_Pos  u, ou, fu;  /* point position */        FT_Pos  delta;        if ( point->flags & touch_flag )          continue;        /* if this point is candidate to weak interpolation, we       */        /* interpolate it after all strong points have been processed */        if (  ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) &&             !( point->flags & AF_FLAG_INFLECTION )         )          continue;        if ( dim == AF_DIMENSION_VERT )        {          u  = point->fy;          ou = point->oy;        }        else        {          u  = point->fx;          ou = point->ox;        }        fu = u;        /* is the point before the first edge? */        edge  = edges;        delta = edge->fpos - u;        if ( delta >= 0 )        {          u = edge->pos - ( edge->opos - ou );          goto Store_Point;        }        /* is the point after the last edge? */        edge  = edge_limit - 1;        delta = u - edge->fpos;        if ( delta >= 0 )        {          u = edge->pos + ( ou - edge->opos );          goto Store_Point;        }        {          FT_UInt  min, max, mid;          FT_Pos   fpos;          /* find enclosing edges */          min = 0;          max = edge_limit - edges;          while ( min < max )          {            mid  = ( max + min ) >> 1;            edge = edges + mid;            fpos = edge->fpos;            if ( u < fpos )              max = mid;            else if ( u > fpos )              min = mid + 1;            else            {              /* we are on the edge */              u = edge->pos;              goto Store_Point;            }          }          {            AF_Edge  before = edges + min - 1;            AF_Edge  after  = edges + min + 0;            /* assert( before && after && before != after ) */            if ( before->scale == 0 )              before->scale = FT_DivFix( after->pos - before->pos,                                         after->fpos - before->fpos );            u = before->pos + FT_MulFix( fu - before->fpos,                                         before->scale );          }        }      Store_Point:        /* save the point position */        if ( dim == AF_DIMENSION_HORZ )          point->x = u;        else          point->y = u;        point->flags |= touch_flag;      }    }  }  /****************************************************************   *   *                    WEAK POINT INTERPOLATION   *   ****************************************************************/  static void  af_iup_shift( AF_Point  p1,                AF_Point  p2,                AF_Point  ref )  {    AF_Point  p;    FT_Pos    delta = ref->u - ref->v;    for ( p = p1; p < ref; p++ )      p->u = p->v + delta;    for ( p = ref + 1; p <= p2; p++ )      p->u = p->v + delta;  }  static void  af_iup_interp( AF_Point  p1,                 AF_Point  p2,                 AF_Point  ref1,                 AF_Point  ref2 )  {    AF_Point  p;    FT_Pos    u;    FT_Pos    v1 = ref1->v;    FT_Pos    v2 = ref2->v;    FT_Pos    d1 = ref1->u - v1;    FT_Pos    d2 = ref2->u - v2;    if ( p1 > p2 )      return;    if ( v1 == v2 )    {      for ( p = p1; p <= p2; p++ )      {        u = p->v;        if ( u <= v1 )          u += d1;        else          u += d2;        p->u = u;      }      return;    }    if ( v1 < v2 )    {      for ( p = p1; p <= p2; p++ )      {        u = p->v;        if ( u <= v1 )          u += d1;        else if ( u >= v2 )          u += d2;        else          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );        p->u = u;      }    }    else    {      for ( p = p1; p <= p2; p++ )      {        u = p->v;        if ( u <= v2 )          u += d2;        else if ( u >= v1 )          u += d1;        else          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );        p->u = u;      }    }  }  FT_LOCAL_DEF( void )  af_glyph_hints_align_weak_points( AF_GlyphHints  hints,                                    AF_Dimension   dim )  {    AF_Point   points        = hints->points;    AF_Point   point_limit   = points + hints->num_points;    AF_Point*  contour       = hints->contours;    AF_Point*  contour_limit = contour + hints->num_contours;    AF_Flags   touch_flag;    AF_Point   point;    AF_Point   end_point;    AF_Point   first_point;    /* PASS 1: Move segment points to edge positions */    if ( dim == AF_DIMENSION_HORZ )    {      touch_flag = AF_FLAG_TOUCH_X;      for ( point = points; point < point_limit; point++ )      {        point->u = point->x;        point->v = point->ox;      }    }    else    {      touch_flag = AF_FLAG_TOUCH_Y;      for ( point = points; point < point_limit; point++ )      {        point->u = point->y;        point->v = point->oy;      }    }    point = points;    for ( ; contour < contour_limit; contour++ )    {      point       = *contour;      end_point   = point->prev;      first_point = point;      while ( point <= end_point && !( point->flags & touch_flag ) )        point++;      if ( point <= end_point )      {        AF_Point  first_touched = point;        AF_Point  cur_touched   = point;        point++;        while ( point <= end_point )        {          if ( point->flags & touch_flag )          {            /* we found two successive touched points; we interpolate */            /* all contour points between them                        */            af_iup_interp( cur_touched + 1, point - 1,                           cur_touched, point );            cur_touched = point;          }          point++;        }        if ( cur_touched == first_touched )        {          /* this is a special case: only one point was touched in the */          /* contour; we thus simply shift the whole contour           */          af_iup_shift( first_point, end_point, cur_touched );        }        else        {          /* now interpolate after the last touched point to the end */          /* of the contour                                          */          af_iup_interp( cur_touched + 1, end_point,                         cur_touched, first_touched );          /* if the first contour point isn't touched, interpolate */          /* from the contour start to the first touched point     */          if ( first_touched > points )            af_iup_interp( first_point, first_touched - 1,                           cur_touched, first_touched );        }      }    }    /* now save the interpolated values back to x/y */    if ( dim == AF_DIMENSION_HORZ )    {      for ( point = points; point < point_limit; point++ )        point->x = point->u;    }    else    {      for ( point = points; point < point_limit; point++ )        point->y = point->u;    }  }#ifdef AF_USE_WARPER  FT_LOCAL_DEF( void )  af_glyph_hints_scale_dim( AF_GlyphHints  hints,                            AF_Dimension   dim,                            FT_Fixed       scale,                            FT_Pos         delta )  {    AF_Point  points       = hints->points;    AF_Point  points_limit = points + hints->num_points;    AF_Point  point;    if ( dim == AF_DIMENSION_HORZ )    {      for ( point = points; point < points_limit; point++ )        point->x = FT_MulFix( point->fx, scale ) + delta;    }    else    {      for ( point = points; point < points_limit; point++ )        point->y = FT_MulFix( point->fy, scale ) + delta;    }  }#endif /* AF_USE_WARPER *//* END */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -