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

📄 ftoutln.c

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 C
字号:
/***************************************************************************//*                                                                         *//*  ftoutln.c                                                              *//*                                                                         *//*    FreeType outline management (body).                                  *//*                                                                         *//*  Copyright 1996-1999 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.                                        *//*                                                                         *//***************************************************************************/  /*************************************************************************/  /*                                                                       */  /* All functions are declared in freetype.h.                             */  /*                                                                       */  /*************************************************************************/#include <freetype.h>#include <ftconfig.h>#include <ftobjs.h>#include <ftimage.h>#include <ftoutln.h>  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Outline_Copy                                                    */  /*                                                                       */  /* <Description>                                                         */  /*    Copies an outline into another one.  Both objects must have the    */  /*    same sizes (number of points & number of contours) when this       */  /*    function is called.                                                */  /*                                                                       */  /* <Input>                                                               */  /*    source :: A handle to the source outline.                          */  /*    target :: A handle to the target outline.                          */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  BASE_FUNC  FT_Error  FT_Outline_Copy( FT_Outline*  source,                             FT_Outline*  target )  {    FT_Int  is_owner;        if ( !source            || !target            ||         source->n_points   != target->n_points   ||         source->n_contours != target->n_contours )      return FT_Err_Invalid_Argument;    MEM_Copy( target->points, source->points,              source->n_points * 2 * sizeof ( FT_Pos ) );    MEM_Copy( target->tags, source->tags,              source->n_points * sizeof ( FT_Byte ) );    MEM_Copy( target->contours, source->contours,              source->n_contours * sizeof ( FT_Short ) );    /* copy all flags, except the "ft_outline_owner" one */    is_owner = target->flags & ft_outline_owner;    target->flags = source->flags;        target->flags &= ~ft_outline_owner;    target->flags |= is_owner;    return FT_Err_Ok;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Outline_Get_Bitmap                                              */  /*                                                                       */  /* <Description>                                                         */  /*    Renders an outline within a bitmap.  The outline's image is simply */  /*    or-ed to the target bitmap.                                        */  /*                                                                       */  /*                                                                       */  /* <Input>                                                               */  /*    library :: A handle to a FreeType library object.                  */  /*    outline :: A pointer to the source outline descriptor.             */  /*    map     :: A pointer to the target bitmap descriptor.              */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  /* <MT-Note>                                                             */  /*    YES.  Rendering is synchronized, so that concurrent calls to the   */  /*    scan-line converter will be serialized.                            */  /*                                                                       */  /* <Note>                                                                */  /*    This function does NOT CREATE the bitmap, it only renders an       */  /*    outline image within the one you pass to it!                       */  /*                                                                       */  /*    It will use the raster correponding to the default glyph format.   */  /*                                                                       */  BASE_FUNC  FT_Error  FT_Outline_Get_Bitmap( FT_Library   library,                                   FT_Outline*  outline,                                   FT_Bitmap*   map )  {    FT_Error          error;    FT_Glyph_Format*  format;    error  = FT_Err_Invalid_Glyph_Format;    format = FT_Get_Glyph_Format( library, ft_glyph_format_outline );    if (!format) goto Exit;    error = FT_Err_Invalid_Glyph_Format;    if (!format->raster) goto Exit;    error = format->raster_interface->render( format->raster, outline, map );  Exit:    return error;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Outline_Transform                                               */  /*                                                                       */  /* <Description>                                                         */  /*    Applies a simple 2x2 matrix to all of an outline's points.  Useful */  /*    for applying rotations, slanting, flipping, etc.                   */  /*                                                                       */  /* <Input>                                                               */  /*    outline :: A pointer to the target outline descriptor.             */  /*    matrix  :: A pointer to the transformation matrix.                 */  /*                                                                       */  /* <MT-Note>                                                             */  /*    Yes.                                                               */  /*                                                                       */  /* <Note>                                                                */  /*    You can use FT_Outline_Translate() if you need to translate the    */  /*    outline's points.                                                  */  /*                                                                       */  BASE_FUNC  void  FT_Outline_Transform( FT_Outline*  outline,                              FT_Matrix*   matrix )  {    FT_UShort   n;    FT_Vector*  vec;    vec = outline->points;    for ( n = 0; n < outline->n_points; n++ )    {      FT_Pos  x, y;      x = FT_MulFix( vec->x, matrix->xx ) +          FT_MulFix( vec->y, matrix->xy );      y = FT_MulFix( vec->x, matrix->yx ) +          FT_MulFix( vec->y, matrix->yy );      vec->x = x;      vec->y = y;      vec++;    }  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Vector_Transform                                                */  /*                                                                       */  /* <Description>                                                         */  /*    Transforms a single vector through a 2x2 matrix.                   */  /*                                                                       */  /* <InOut>                                                               */  /*    x      :: The horizontal vector coordinate.                        */  /*    y      :: The vertical vector coordinate.                          */  /*                                                                       */  /* <Input>                                                               */  /*    matrix :: A pointer to the source 2x2 matrix.                      */  /*                                                                       */  /* <MT-Note>                                                             */  /*    Yes.                                                               */  /*                                                                       */  BASE_FUNC  void  FT_Vector_Transform( FT_Pos*     x,                             FT_Pos*     y,                             FT_Matrix*  matrix )  {    FT_Pos xz, yz;    xz = FT_MulFix( *x, matrix->xx ) +         FT_MulFix( *y, matrix->xy );    yz = FT_MulFix( *x, matrix->yx ) +         FT_MulFix( *y, matrix->yy );    *x = xz;    *y = yz;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Matrix_Multiply                                                 */  /*                                                                       */  /* <Description>                                                         */  /*    Performs the matrix operation `b = a*b'.                           */  /*                                                                       */  /* <Input>                                                               */  /*    a :: A pointer to matrix `a'.                                      */  /*                                                                       */  /* <InOut>                                                               */  /*    b :: A pointer to matrix `b'.                                      */  /*                                                                       */  /* <MT-Note>                                                             */  /*    Yes.                                                               */  /*                                                                       */  BASE_FUNC  void  FT_Matrix_Multiply( FT_Matrix*  a,                            FT_Matrix*  b )  {    FT_Fixed  xx, xy, yx, yy;    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;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    FT_Matrix_Invert                                                   */  /*                                                                       */  /* <Description>                                                         */  /*    Inverts a 2x2 matrix.  Returns an error if it can't be inverted.   */  /*                                                                       */  /* <InOut>                                                               */  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */  /*              case of error.                                           */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  /* <MT-Note>                                                             */  /*    Yes.                                                               */  /*                                                                       */  BASE_FUNC  FT_Error  FT_Matrix_Invert( FT_Matrix*  matrix )  {    FT_Pos  delta, xx, yy;    /* 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;  }/* END */

⌨️ 快捷键说明

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