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

📄 afloader.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  afloader.c                                                             *//*                                                                         *//*    Auto-fitter glyph loading routines (body).                           *//*                                                                         *//*  Copyright 2003, 2004, 2005, 2006, 2007 by                              *//*  David Turner, Robert Wilhelm, and Werner Lemberg.                      *//*                                                                         *//*  This file is part of the FreeType project, and may only be used,       *//*  modified, and distributed under the terms of the FreeType project      *//*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     *//*  this file you indicate that you have read the license and              *//*  understand and accept it fully.                                        *//*                                                                         *//***************************************************************************/#include "afloader.h"#include "afhints.h"#include "afglobal.h"#include "aflatin.h"#include "aferrors.h"  FT_LOCAL_DEF( FT_Error )  af_loader_init( AF_Loader  loader,                  FT_Memory  memory )  {    FT_ZERO( loader );    af_glyph_hints_init( &loader->hints, memory );#ifdef AF_DEBUG    _af_debug_hints = &loader->hints;#endif    return FT_GlyphLoader_New( memory, &loader->gloader );  }  FT_LOCAL_DEF( FT_Error )  af_loader_reset( AF_Loader  loader,                   FT_Face    face )  {    FT_Error  error = AF_Err_Ok;    loader->face    = face;    loader->globals = (AF_FaceGlobals)face->autohint.data;    FT_GlyphLoader_Rewind( loader->gloader );    if ( loader->globals == NULL )    {      error = af_face_globals_new( face, &loader->globals );      if ( !error )      {        face->autohint.data =          (FT_Pointer)loader->globals;        face->autohint.finalizer =          (FT_Generic_Finalizer)af_face_globals_free;      }    }    return error;  }  FT_LOCAL_DEF( void )  af_loader_done( AF_Loader  loader )  {    af_glyph_hints_done( &loader->hints );    loader->face    = NULL;    loader->globals = NULL;#ifdef AF_DEBUG    _af_debug_hints = NULL;#endif    FT_GlyphLoader_Done( loader->gloader );    loader->gloader = NULL;  }  static FT_Error  af_loader_load_g( AF_Loader  loader,                    AF_Scaler  scaler,                    FT_UInt    glyph_index,                    FT_Int32   load_flags,                    FT_UInt    depth )  {    FT_Error          error;    FT_Face           face     = loader->face;    FT_GlyphLoader    gloader  = loader->gloader;    AF_ScriptMetrics  metrics  = loader->metrics;    AF_GlyphHints     hints    = &loader->hints;    FT_GlyphSlot      slot     = face->glyph;    FT_Slot_Internal  internal = slot->internal;    error = FT_Load_Glyph( face, glyph_index, load_flags );    if ( error )      goto Exit;    loader->transformed = internal->glyph_transformed;    if ( loader->transformed )    {      FT_Matrix  inverse;      loader->trans_matrix = internal->glyph_matrix;      loader->trans_delta  = internal->glyph_delta;      inverse = loader->trans_matrix;      FT_Matrix_Invert( &inverse );      FT_Vector_Transform( &loader->trans_delta, &inverse );    }    /* set linear metrics */    slot->linearHoriAdvance = slot->metrics.horiAdvance;    slot->linearVertAdvance = slot->metrics.vertAdvance;    switch ( slot->format )    {    case FT_GLYPH_FORMAT_OUTLINE:      /* translate the loaded glyph when an internal transform is needed */      if ( loader->transformed )        FT_Outline_Translate( &slot->outline,                              loader->trans_delta.x,                              loader->trans_delta.y );      /* copy the outline points in the loader's current               */      /* extra points which is used to keep original glyph coordinates */      error = FT_GLYPHLOADER_CHECK_POINTS( gloader,                                           slot->outline.n_points + 4,                                           slot->outline.n_contours );      if ( error )        goto Exit;      FT_ARRAY_COPY( gloader->current.outline.points,                     slot->outline.points,                     slot->outline.n_points );      FT_ARRAY_COPY( gloader->current.outline.contours,                     slot->outline.contours,                     slot->outline.n_contours );      FT_ARRAY_COPY( gloader->current.outline.tags,                     slot->outline.tags,                     slot->outline.n_points );      gloader->current.outline.n_points   = slot->outline.n_points;      gloader->current.outline.n_contours = slot->outline.n_contours;      /* compute original horizontal phantom points (and ignore */      /* vertical ones)                                         */      loader->pp1.x = hints->x_delta;      loader->pp1.y = hints->y_delta;      loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance,                                 hints->x_scale ) + hints->x_delta;      loader->pp2.y = hints->y_delta;      /* be sure to check for spacing glyphs */      if ( slot->outline.n_points == 0 )        goto Hint_Metrics;      /* now load the slot image into the auto-outline and run the */      /* automatic hinting process                                 */      metrics->clazz->script_hints_apply( hints,                                          &gloader->current.outline,                                          metrics );      /* we now need to hint the metrics according to the change in */      /* width/positioning that occurred during the hinting process */      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT )      {        FT_Pos        old_advance, old_rsb, old_lsb, new_lsb;        FT_Pos        pp1x_uh, pp2x_uh;        AF_AxisHints  axis  = &hints->axis[AF_DIMENSION_HORZ];        AF_Edge       edge1 = axis->edges;         /* leftmost edge  */        AF_Edge       edge2 = edge1 +                              axis->num_edges - 1; /* rightmost edge */        if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) )        {          old_advance = loader->pp2.x - loader->pp1.x;          old_rsb     = loader->pp2.x - edge2->opos;          old_lsb     = edge1->opos;          new_lsb     = edge1->pos;          /* remember unhinted values to later account */          /* for rounding errors                       */          pp1x_uh = new_lsb    - old_lsb;          pp2x_uh = edge2->pos + old_rsb;          /* prefer too much space over too little space */          /* for very small sizes                        */          if ( old_lsb < 24 )            pp1x_uh -= 8;          if ( old_rsb < 24 )            pp2x_uh += 8;          loader->pp1.x = FT_PIX_ROUND( pp1x_uh );          loader->pp2.x = FT_PIX_ROUND( pp2x_uh );          if ( loader->pp1.x >= new_lsb && old_lsb > 0 )            loader->pp1.x -= 64;          if ( loader->pp2.x <= edge2->pos && old_rsb > 0 )            loader->pp2.x += 64;          slot->lsb_delta = loader->pp1.x - pp1x_uh;          slot->rsb_delta = loader->pp2.x - pp2x_uh;        }        else        {          FT_Pos   pp1x = loader->pp1.x;          FT_Pos   pp2x = loader->pp2.x;          loader->pp1.x = FT_PIX_ROUND( pp1x );          loader->pp2.x = FT_PIX_ROUND( pp2x );          slot->lsb_delta = loader->pp1.x - pp1x;          slot->rsb_delta = loader->pp2.x - pp2x;        }      }      else      {        FT_Pos   pp1x = loader->pp1.x;        FT_Pos   pp2x = loader->pp2.x;        loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta );        loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta );        slot->lsb_delta = loader->pp1.x - pp1x;        slot->rsb_delta = loader->pp2.x - pp2x;      }      /* good, we simply add the glyph to our loader's base */      FT_GlyphLoader_Add( gloader );      break;    case FT_GLYPH_FORMAT_COMPOSITE:      {        FT_UInt      nn, num_subglyphs = slot->num_subglyphs;        FT_UInt      num_base_subgs, start_point;        FT_SubGlyph  subglyph;        start_point = gloader->base.outline.n_points;        /* first of all, copy the subglyph descriptors in the glyph loader */        error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs );        if ( error )          goto Exit;        FT_ARRAY_COPY( gloader->current.subglyphs,                       slot->subglyphs,                       num_subglyphs );

⌨️ 快捷键说明

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