tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ftcglyph.c (4979B)


      1 /****************************************************************************
      2 *
      3 * ftcglyph.c
      4 *
      5 *   FreeType Glyph Image (FT_Glyph) cache (body).
      6 *
      7 * Copyright (C) 2000-2025 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/internal/ftobjs.h>
     20 #include <freetype/ftcache.h>
     21 #include "ftcglyph.h"
     22 #include <freetype/fterrors.h>
     23 
     24 #include "ftccback.h"
     25 #include "ftcerror.h"
     26 
     27 
     28  /* create a new chunk node, setting its cache index and ref count */
     29  FT_LOCAL_DEF( void )
     30  FTC_GNode_Init( FTC_GNode   gnode,
     31                  FT_UInt     gindex,
     32                  FTC_Family  family )
     33  {
     34    gnode->family = family;
     35    gnode->gindex = gindex;
     36    family->num_nodes++;
     37  }
     38 
     39 
     40  FT_LOCAL_DEF( void )
     41  FTC_GNode_UnselectFamily( FTC_GNode  gnode,
     42                            FTC_Cache  cache )
     43  {
     44    FTC_Family  family = gnode->family;
     45 
     46 
     47    gnode->family = NULL;
     48    if ( family && --family->num_nodes == 0 )
     49      FTC_FAMILY_FREE( family, cache );
     50  }
     51 
     52 
     53  FT_LOCAL_DEF( void )
     54  FTC_GNode_Done( FTC_GNode  gnode,
     55                  FTC_Cache  cache )
     56  {
     57    /* finalize the node */
     58    gnode->gindex = 0;
     59 
     60    FTC_GNode_UnselectFamily( gnode, cache );
     61  }
     62 
     63 
     64  FT_LOCAL_DEF( FT_Bool )
     65  ftc_gnode_compare( FTC_Node    ftcgnode,
     66                     FT_Pointer  ftcgquery,
     67                     FTC_Cache   cache,
     68                     FT_Bool*    list_changed )
     69  {
     70    FTC_GNode   gnode  = (FTC_GNode)ftcgnode;
     71    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
     72    FT_UNUSED( cache );
     73 
     74 
     75    if ( list_changed )
     76      *list_changed = FALSE;
     77    return FT_BOOL( gnode->family == gquery->family &&
     78                    gnode->gindex == gquery->gindex );
     79  }
     80 
     81 
     82  /*************************************************************************/
     83  /*************************************************************************/
     84  /*****                                                               *****/
     85  /*****                      CHUNK SETS                               *****/
     86  /*****                                                               *****/
     87  /*************************************************************************/
     88  /*************************************************************************/
     89 
     90  FT_LOCAL_DEF( void )
     91  FTC_Family_Init( FTC_Family  family,
     92                   FTC_Cache   cache )
     93  {
     94    FTC_GCacheClass  clazz = FTC_CACHE_GCACHE_CLASS( cache );
     95 
     96 
     97    family->clazz     = clazz->family_class;
     98    family->num_nodes = 0;
     99    family->cache     = cache;
    100  }
    101 
    102 
    103  FT_LOCAL_DEF( FT_Error )
    104  ftc_gcache_init( FTC_Cache  cache )
    105  {
    106    FTC_GCache  gcache = (FTC_GCache)cache;
    107    FT_Error    error;
    108 
    109 
    110    error = FTC_Cache_Init( cache );
    111    if ( !error )
    112    {
    113      FTC_GCacheClass   clazz = (FTC_GCacheClass)cache->org_class;
    114 
    115      FTC_MruList_Init( &gcache->families,
    116                        clazz->family_class,
    117                        0,  /* no maximum here! */
    118                        cache,
    119                        cache->memory );
    120    }
    121 
    122    return error;
    123  }
    124 
    125 
    126 #if 0
    127 
    128  FT_LOCAL_DEF( FT_Error )
    129  FTC_GCache_Init( FTC_GCache  gcache )
    130  {
    131    return ftc_gcache_init( FTC_CACHE( gcache ) );
    132  }
    133 
    134 #endif /* 0 */
    135 
    136 
    137  FT_LOCAL_DEF( void )
    138  ftc_gcache_done( FTC_Cache  cache )
    139  {
    140    FTC_GCache  gcache = (FTC_GCache)cache;
    141 
    142 
    143    FTC_Cache_Done( cache );
    144    FTC_MruList_Done( &gcache->families );
    145  }
    146 
    147 
    148 #if 0
    149 
    150  FT_LOCAL_DEF( void )
    151  FTC_GCache_Done( FTC_GCache  gcache )
    152  {
    153    ftc_gcache_done( FTC_CACHE( gcache ) );
    154  }
    155 
    156 #endif /* 0 */
    157 
    158 
    159  FT_LOCAL_DEF( FT_Error )
    160  FTC_GCache_New( FTC_Manager       manager,
    161                  FTC_GCacheClass   clazz,
    162                  FTC_GCache       *acache )
    163  {
    164    return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
    165                                      (FTC_Cache*)acache );
    166  }
    167 
    168 
    169 #ifndef FTC_INLINE
    170 
    171  FT_LOCAL_DEF( FT_Error )
    172  FTC_GCache_Lookup( FTC_GCache   gcache,
    173                     FT_Offset    hash,
    174                     FT_UInt      gindex,
    175                     FTC_GQuery   query,
    176                     FTC_Node    *anode )
    177  {
    178    FT_Error  error;
    179 
    180 
    181    query->gindex = gindex;
    182 
    183    FTC_MRULIST_LOOKUP( &gcache->families, query, query->family, error );
    184    if ( !error )
    185    {
    186      FTC_Family  family = query->family;
    187 
    188 
    189      /* prevent the family from being destroyed too early when an        */
    190      /* out-of-memory condition occurs during glyph node initialization. */
    191      family->num_nodes++;
    192 
    193      error = FTC_Cache_Lookup( FTC_CACHE( gcache ), hash, query, anode );
    194 
    195      if ( --family->num_nodes == 0 )
    196        FTC_FAMILY_FREE( family, FTC_CACHE( gcache ) );
    197    }
    198    return error;
    199  }
    200 
    201 #endif /* !FTC_INLINE */
    202 
    203 
    204 /* END */