(root)/
freetype-2.13.2/
src/
cache/
ftcimage.c
       1  /****************************************************************************
       2   *
       3   * ftcimage.c
       4   *
       5   *   FreeType Image cache (body).
       6   *
       7   * Copyright (C) 2000-2023 by
       8   * David Turner, Robert Wilhelm, and Werner Lemberg.
       9   *
      10   * This file is part of the FreeType project, and may only be used,
      11   * modified, and distributed under the terms of the FreeType project
      12   * license, LICENSE.TXT.  By continuing to use, modify, or distribute
      13   * this file you indicate that you have read the license and
      14   * understand and accept it fully.
      15   *
      16   */
      17  
      18  
      19  #include <freetype/ftcache.h>
      20  #include "ftcimage.h"
      21  #include <freetype/internal/ftmemory.h>
      22  #include <freetype/internal/ftobjs.h>
      23  
      24  #include "ftccback.h"
      25  #include "ftcerror.h"
      26  
      27  
      28    /* finalize a given glyph image node */
      29    FT_LOCAL_DEF( void )
      30    ftc_inode_free( FTC_Node   ftcinode,
      31                    FTC_Cache  cache )
      32    {
      33      FTC_INode  inode = (FTC_INode)ftcinode;
      34      FT_Memory  memory = cache->memory;
      35  
      36  
      37      if ( inode->glyph )
      38      {
      39        FT_Done_Glyph( inode->glyph );
      40        inode->glyph = NULL;
      41      }
      42  
      43      FTC_GNode_Done( FTC_GNODE( inode ), cache );
      44      FT_FREE( inode );
      45    }
      46  
      47  
      48    FT_LOCAL_DEF( void )
      49    FTC_INode_Free( FTC_INode  inode,
      50                    FTC_Cache  cache )
      51    {
      52      ftc_inode_free( FTC_NODE( inode ), cache );
      53    }
      54  
      55  
      56    /* initialize a new glyph image node */
      57    FT_LOCAL_DEF( FT_Error )
      58    FTC_INode_New( FTC_INode   *pinode,
      59                   FTC_GQuery   gquery,
      60                   FTC_Cache    cache )
      61    {
      62      FT_Memory  memory = cache->memory;
      63      FT_Error   error;
      64      FTC_INode  inode  = NULL;
      65  
      66  
      67      if ( !FT_QNEW( inode ) )
      68      {
      69        FTC_GNode         gnode  = FTC_GNODE( inode );
      70        FTC_Family        family = gquery->family;
      71        FT_UInt           gindex = gquery->gindex;
      72        FTC_IFamilyClass  clazz  = FTC_CACHE_IFAMILY_CLASS( cache );
      73  
      74  
      75        /* initialize its inner fields */
      76        FTC_GNode_Init( gnode, gindex, family );
      77        inode->glyph = NULL;
      78  
      79        /* we will now load the glyph image */
      80        error = clazz->family_load_glyph( family, gindex, cache,
      81                                          &inode->glyph );
      82        if ( error )
      83        {
      84          FTC_INode_Free( inode, cache );
      85          inode = NULL;
      86        }
      87      }
      88  
      89      *pinode = inode;
      90      return error;
      91    }
      92  
      93  
      94    FT_LOCAL_DEF( FT_Error )
      95    ftc_inode_new( FTC_Node   *ftcpinode,
      96                   FT_Pointer  ftcgquery,
      97                   FTC_Cache   cache )
      98    {
      99      FTC_INode  *pinode = (FTC_INode*)ftcpinode;
     100      FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
     101  
     102  
     103      return FTC_INode_New( pinode, gquery, cache );
     104    }
     105  
     106  
     107    FT_LOCAL_DEF( FT_Offset )
     108    ftc_inode_weight( FTC_Node   ftcinode,
     109                      FTC_Cache  ftccache )
     110    {
     111      FTC_INode  inode = (FTC_INode)ftcinode;
     112      FT_Offset  size  = 0;
     113      FT_Glyph   glyph = inode->glyph;
     114  
     115      FT_UNUSED( ftccache );
     116  
     117  
     118      switch ( glyph->format )
     119      {
     120      case FT_GLYPH_FORMAT_BITMAP:
     121        {
     122          FT_BitmapGlyph  bitg;
     123  
     124  
     125          bitg = (FT_BitmapGlyph)glyph;
     126          size = bitg->bitmap.rows * (FT_Offset)FT_ABS( bitg->bitmap.pitch ) +
     127                 sizeof ( *bitg );
     128        }
     129        break;
     130  
     131      case FT_GLYPH_FORMAT_OUTLINE:
     132        {
     133          FT_OutlineGlyph  outg;
     134  
     135  
     136          outg = (FT_OutlineGlyph)glyph;
     137          size = (FT_Offset)outg->outline.n_points *
     138                   ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +
     139                 (FT_Offset)outg->outline.n_contours * sizeof ( FT_Short ) +
     140                 sizeof ( *outg );
     141        }
     142        break;
     143  
     144      default:
     145        ;
     146      }
     147  
     148      size += sizeof ( *inode );
     149      return size;
     150    }
     151  
     152  
     153  #if 0
     154  
     155    FT_LOCAL_DEF( FT_Offset )
     156    FTC_INode_Weight( FTC_INode  inode )
     157    {
     158      return ftc_inode_weight( FTC_NODE( inode ), NULL );
     159    }
     160  
     161  #endif /* 0 */
     162  
     163  
     164  /* END */