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

📄 afloader.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
        gloader->current.num_subglyphs = num_subglyphs;        num_base_subgs                 = gloader->base.num_subglyphs;        /* now, read each subglyph independently */        for ( nn = 0; nn < num_subglyphs; nn++ )        {          FT_Vector  pp1, pp2;          FT_Pos     x, y;          FT_UInt    num_points, num_new_points, num_base_points;          /* gloader.current.subglyphs can change during glyph loading due */          /* to re-allocation -- we must recompute the current subglyph on */          /* each iteration                                                */          subglyph = gloader->base.subglyphs + num_base_subgs + nn;          pp1 = loader->pp1;          pp2 = loader->pp2;          num_base_points = gloader->base.outline.n_points;          error = af_loader_load_g( loader, scaler, subglyph->index,                                    load_flags, depth + 1 );          if ( error )            goto Exit;          /* recompute subglyph pointer */          subglyph = gloader->base.subglyphs + num_base_subgs + nn;          if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS )          {            pp1 = loader->pp1;            pp2 = loader->pp2;          }          else          {            loader->pp1 = pp1;            loader->pp2 = pp2;          }          num_points     = gloader->base.outline.n_points;          num_new_points = num_points - num_base_points;          /* now perform the transform required for this subglyph */          if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE    |                                   FT_SUBGLYPH_FLAG_XY_SCALE |                                   FT_SUBGLYPH_FLAG_2X2      ) )          {            FT_Vector*  cur   = gloader->base.outline.points +                                num_base_points;            FT_Vector*  limit = cur + num_new_points;            for ( ; cur < limit; cur++ )              FT_Vector_Transform( cur, &subglyph->transform );          }          /* apply offset */          if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) )          {            FT_Int      k = subglyph->arg1;            FT_UInt     l = subglyph->arg2;            FT_Vector*  p1;            FT_Vector*  p2;            if ( start_point + k >= num_base_points         ||                               l >= (FT_UInt)num_new_points )            {              error = AF_Err_Invalid_Composite;              goto Exit;            }            l += num_base_points;            /* for now, only use the current point coordinates;    */            /* we may consider another approach in the near future */            p1 = gloader->base.outline.points + start_point + k;            p2 = gloader->base.outline.points + start_point + l;            x = p1->x - p2->x;            y = p1->y - p2->y;          }          else          {            x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta;            y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta;            x = FT_PIX_ROUND( x );            y = FT_PIX_ROUND( y );          }          {            FT_Outline  dummy = gloader->base.outline;            dummy.points  += num_base_points;            dummy.n_points = (short)num_new_points;            FT_Outline_Translate( &dummy, x, y );          }        }      }      break;    default:      /* we don't support other formats (yet?) */      error = AF_Err_Unimplemented_Feature;    }  Hint_Metrics:    if ( depth == 0 )    {      FT_BBox    bbox;      FT_Vector  vvector;      vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX;      vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY;      vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale );      vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale );      /* transform the hinted outline if needed */      if ( loader->transformed )      {        FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix );        FT_Vector_Transform( &vvector, &loader->trans_matrix );      }      /* we must translate our final outline by -pp1.x and compute */      /* the new metrics                                           */      if ( loader->pp1.x )        FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 );      FT_Outline_Get_CBox( &gloader->base.outline, &bbox );      bbox.xMin = FT_PIX_FLOOR( bbox.xMin );      bbox.yMin = FT_PIX_FLOOR( bbox.yMin );      bbox.xMax = FT_PIX_CEIL(  bbox.xMax );      bbox.yMax = FT_PIX_CEIL(  bbox.yMax );      slot->metrics.width        = bbox.xMax - bbox.xMin;      slot->metrics.height       = bbox.yMax - bbox.yMin;      slot->metrics.horiBearingX = bbox.xMin;      slot->metrics.horiBearingY = bbox.yMax;      slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x );      slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y );      /* for mono-width fonts (like Andale, Courier, etc.) we need */      /* to keep the original rounded advance width                */#if 0      if ( !FT_IS_FIXED_WIDTH( slot->face ) )        slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;      else        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,                                               x_scale );#else      if ( !FT_IS_FIXED_WIDTH( slot->face ) )      {        /* non-spacing glyphs must stay as-is */        if ( slot->metrics.horiAdvance )          slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;      }      else      {        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,                                               metrics->scaler.x_scale );        /* Set delta values to 0.  Otherwise code that uses them is */        /* going to ruin the fixed advance width.                   */        slot->lsb_delta = 0;        slot->rsb_delta = 0;      }#endif      slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance,                                              metrics->scaler.y_scale );      slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance );      slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance );      /* now copy outline into glyph slot */      FT_GlyphLoader_Rewind( internal->loader );      error = FT_GlyphLoader_CopyPoints( internal->loader, gloader );      if ( error )        goto Exit;      slot->outline = internal->loader->base.outline;      slot->format  = FT_GLYPH_FORMAT_OUTLINE;    }#ifdef DEBUG_HINTER    af_debug_hinter = hinter;#endif  Exit:    return error;  }  FT_LOCAL_DEF( FT_Error )  af_loader_load_glyph( AF_Loader  loader,                        FT_Face    face,                        FT_UInt    gindex,                        FT_UInt32  load_flags )  {    FT_Error      error;    FT_Size       size = face->size;    AF_ScalerRec  scaler;    if ( !size )      return AF_Err_Invalid_Argument;    FT_ZERO( &scaler );    scaler.face    = face;    scaler.x_scale = size->metrics.x_scale;    scaler.x_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */    scaler.y_scale = size->metrics.y_scale;    scaler.y_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */    scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );    scaler.flags       = 0;  /* XXX: fix this */    error = af_loader_reset( loader, face );    if ( !error )    {      AF_ScriptMetrics  metrics;      error = af_face_globals_get_metrics( loader->globals, gindex,                                           &metrics );      if ( !error )      {        loader->metrics = metrics;        if ( metrics->clazz->script_metrics_scale )          metrics->clazz->script_metrics_scale( metrics, &scaler );        else          metrics->scaler = scaler;        load_flags |=  FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;        load_flags &= ~FT_LOAD_RENDER;        error = metrics->clazz->script_hints_init( &loader->hints, metrics );        if ( error )          goto Exit;        error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 );      }    }  Exit:    return error;  }/* END */

⌨️ 快捷键说明

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