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

📄 ftglyph.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  ftglyph.c                                                              *//*                                                                         *//*    FreeType convenience functions to handle glyphs (body).              *//*                                                                         *//*  Copyright 1996-2001, 2002, 2003, 2004, 2005 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.                                        *//*                                                                         *//***************************************************************************/  /*************************************************************************/  /*                                                                       */  /*  This file contains the definition of several convenience functions   */  /*  that can be used by client applications to easily retrieve glyph     */  /*  bitmaps and outlines from a given face.                              */  /*                                                                       */  /*  These functions should be optional if you are writing a font server  */  /*  or text layout engine on top of FreeType.  However, they are pretty  */  /*  handy for many other simple uses of the library.                     */  /*                                                                       */  /*************************************************************************/#include <ft2build.h>#include FT_GLYPH_H#include FT_OUTLINE_H#include FT_BITMAP_H#include FT_INTERNAL_OBJECTS_H  /*************************************************************************/  /*                                                                       */  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */  /* messages during execution.                                            */  /*                                                                       */#undef  FT_COMPONENT#define FT_COMPONENT  trace_glyph  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****   Convenience functions                                         ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  /* documentation is in ftglyph.h */  FT_EXPORT_DEF( void )  FT_Matrix_Multiply( const FT_Matrix*  a,                      FT_Matrix        *b )  {    FT_Fixed  xx, xy, yx, yy;    if ( !a || !b )      return;    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );    b->xx = xx;  b->xy = xy;    b->yx = yx;  b->yy = yy;  }  /* documentation is in ftglyph.h */  FT_EXPORT_DEF( FT_Error )  FT_Matrix_Invert( FT_Matrix*  matrix )  {    FT_Pos  delta, xx, yy;    if ( !matrix )      return FT_Err_Invalid_Argument;    /* compute discriminant */    delta = FT_MulFix( matrix->xx, matrix->yy ) -            FT_MulFix( matrix->xy, matrix->yx );    if ( !delta )      return FT_Err_Invalid_Argument;  /* matrix can't be inverted */    matrix->xy = - FT_DivFix( matrix->xy, delta );    matrix->yx = - FT_DivFix( matrix->yx, delta );    xx = matrix->xx;    yy = matrix->yy;    matrix->xx = FT_DivFix( yy, delta );    matrix->yy = FT_DivFix( xx, delta );    return FT_Err_Ok;  }  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****   FT_BitmapGlyph support                                        ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  FT_CALLBACK_DEF( FT_Error )  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,                        FT_GlyphSlot  slot )  {    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;    FT_Error        error   = FT_Err_Ok;    FT_Library      library = FT_GLYPH( glyph )->library;    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )    {      error = FT_Err_Invalid_Glyph_Format;      goto Exit;    }    glyph->left = slot->bitmap_left;    glyph->top  = slot->bitmap_top;    /* do lazy copying whenever possible */    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )    {      glyph->bitmap = slot->bitmap;      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;    }    else    {      FT_Bitmap_New( &glyph->bitmap );      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );    }  Exit:    return error;  }  FT_CALLBACK_DEF( FT_Error )  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,                        FT_Glyph  bitmap_target )  {    FT_Library      library = bitmap_source->library;    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;    target->left = source->left;    target->top  = source->top;    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );  }  FT_CALLBACK_DEF( void )  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )  {    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;    FT_Library      library = FT_GLYPH( glyph )->library;    FT_Bitmap_Done( library, &glyph->bitmap );  }  FT_CALLBACK_DEF( void )  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,                        FT_BBox*  cbox )  {    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;    cbox->xMin = glyph->left << 6;    cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );    cbox->yMax = glyph->top << 6;    cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );  }  FT_CALLBACK_TABLE_DEF  const FT_Glyph_Class  ft_bitmap_glyph_class =  {    sizeof ( FT_BitmapGlyphRec ),    FT_GLYPH_FORMAT_BITMAP,    ft_bitmap_glyph_init,    ft_bitmap_glyph_done,    ft_bitmap_glyph_copy,    0,                          /* FT_Glyph_TransformFunc */    ft_bitmap_glyph_bbox,    0                           /* FT_Glyph_PrepareFunc   */  };  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****   FT_OutlineGlyph support                                       ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/  FT_CALLBACK_DEF( FT_Error )  ft_outline_glyph_init( FT_Glyph      outline_glyph,                         FT_GlyphSlot  slot )  {    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;    FT_Error         error   = FT_Err_Ok;    FT_Library       library = FT_GLYPH( glyph )->library;    FT_Outline*      source  = &slot->outline;    FT_Outline*      target  = &glyph->outline;    /* check format in glyph slot */    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )    {      error = FT_Err_Invalid_Glyph_Format;      goto Exit;    }    /* allocate new outline */    error = FT_Outline_New( library, source->n_points, source->n_contours,                            &glyph->outline );    if ( error )      goto Exit;    FT_Outline_Copy( source, target );  Exit:    return error;  }  FT_CALLBACK_DEF( void )  ft_outline_glyph_done( FT_Glyph  outline_glyph )  {    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );  }  FT_CALLBACK_DEF( FT_Error )  ft_outline_glyph_copy( FT_Glyph  outline_source,                         FT_Glyph  outline_target )  {    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;    FT_Error         error;    FT_Library       library = FT_GLYPH( source )->library;    error = FT_Outline_New( library, source->outline.n_points,                            source->outline.n_contours, &target->outline );    if ( !error )      FT_Outline_Copy( &source->outline, &target->outline );    return error;  }  FT_CALLBACK_DEF( void )  ft_outline_glyph_transform( FT_Glyph          outline_glyph,                              const FT_Matrix*  matrix,                              const FT_Vector*  delta )  {    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;    if ( matrix )      FT_Outline_Transform( &glyph->outline, matrix );    if ( delta )      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );  }  FT_CALLBACK_DEF( void )  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,                         FT_BBox*  bbox )  {    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;    FT_Outline_Get_CBox( &glyph->outline, bbox );  }  FT_CALLBACK_DEF( FT_Error )  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,                            FT_GlyphSlot  slot )  {    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;    slot->format         = FT_GLYPH_FORMAT_OUTLINE;    slot->outline        = glyph->outline;    slot->outline.flags &= ~FT_OUTLINE_OWNER;    return FT_Err_Ok;  }  FT_CALLBACK_TABLE_DEF  const FT_Glyph_Class  ft_outline_glyph_class =  {    sizeof ( FT_OutlineGlyphRec ),    FT_GLYPH_FORMAT_OUTLINE,    ft_outline_glyph_init,    ft_outline_glyph_done,    ft_outline_glyph_copy,    ft_outline_glyph_transform,    ft_outline_glyph_bbox,    ft_outline_glyph_prepare  };  /*************************************************************************/  /*************************************************************************/  /****                                                                 ****/  /****   FT_Glyph class and API                                        ****/  /****                                                                 ****/  /*************************************************************************/  /*************************************************************************/

⌨️ 快捷键说明

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