2000-10-31 23:13:54 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* ftcsbits.c */
|
|
|
|
/* */
|
|
|
|
/* FreeType sbits manager (body). */
|
|
|
|
/* */
|
2006-03-20 17:55:32 +01:00
|
|
|
/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006 by */
|
2000-10-31 23:13:54 +01:00
|
|
|
/* 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. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2000-12-08 17:17:16 +01:00
|
|
|
|
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_CACHE_H
|
* include/freetype/cache/ftccache.h,
include/freetype/cache/ftccmap.h,
include/freetype/cache/ftcglyph.h
include/freetype/cache/ftcimage.h
include/freetype/cache/ftcmanag.h
include/freetype/cache/ftcmru.h
include/freetype/cache/ftcsbits.h:
removing these header files from the public include directory.
* include/freetype/config/ftheader.h:
changing the definition of FT_CACHE_INTERNAL_XXX_H macros to
redirect to FT_CACHE_H instead
* src/cache/ftcbasic.c, src/cache/ftccache.c, src/cache/ftccache.h,
src/cache/ftccback.h, src/cache/ftccmap.c, src/cache/ftcglyph.c,
src/cache/ftcglyph.h, src/cache/ftcimage.c, src/cache/ftcimage.h,
src/cache/ftcmanag.c, src/cache/ftcmanag.h, src/cache/ftcmru.c,
src/cache/ftcmru.h, src/cache/ftcsbits.c, src/cache/ftcsbits.h:
modifications to prevent using the FT_CACHE_INTERNAL_XXX_H macros,
and grab the headers in 'src/cache' instead (see below).
2006-03-20 13:10:24 +01:00
|
|
|
#include "ftcsbits.h"
|
2000-12-08 17:17:16 +01:00
|
|
|
#include FT_INTERNAL_OBJECTS_H
|
|
|
|
#include FT_INTERNAL_DEBUG_H
|
|
|
|
#include FT_ERRORS_H
|
2000-10-29 01:34:45 +02:00
|
|
|
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
#include "ftccback.h"
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
#include "ftcerror.h"
|
|
|
|
|
2000-10-31 23:13:54 +01:00
|
|
|
|
2001-12-05 16:59:33 +01:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** SBIT CACHE NODES *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
2000-10-28 15:17:11 +02:00
|
|
|
|
|
|
|
|
2001-10-26 18:58:27 +02:00
|
|
|
static FT_Error
|
2001-12-05 16:59:33 +01:00
|
|
|
ftc_sbit_copy_bitmap( FTC_SBit sbit,
|
|
|
|
FT_Bitmap* bitmap,
|
|
|
|
FT_Memory memory )
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
|
|
|
FT_Error error;
|
2001-10-26 18:58:27 +02:00
|
|
|
FT_Int pitch = bitmap->pitch;
|
2000-10-28 15:17:11 +02:00
|
|
|
FT_ULong size;
|
|
|
|
|
2000-10-31 23:13:54 +01:00
|
|
|
|
2000-10-28 15:17:11 +02:00
|
|
|
if ( pitch < 0 )
|
|
|
|
pitch = -pitch;
|
|
|
|
|
2001-10-26 18:58:27 +02:00
|
|
|
size = (FT_ULong)( pitch * bitmap->rows );
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2002-03-22 14:52:37 +01:00
|
|
|
if ( !FT_ALLOC( sbit->buffer, size ) )
|
|
|
|
FT_MEM_COPY( sbit->buffer, bitmap->buffer, size );
|
2000-10-28 15:17:11 +02:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-06-09 23:07:49 +02:00
|
|
|
FT_LOCAL_DEF( void )
|
|
|
|
ftc_snode_free( FTC_Node ftcsnode,
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_Cache cache )
|
2001-12-05 16:59:33 +01:00
|
|
|
{
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode snode = (FTC_SNode)ftcsnode;
|
2002-09-08 23:29:11 +02:00
|
|
|
FTC_SBit sbit = snode->sbits;
|
2003-12-19 22:23:58 +01:00
|
|
|
FT_UInt count = snode->count;
|
2001-12-05 16:59:33 +01:00
|
|
|
FT_Memory memory = cache->memory;
|
|
|
|
|
|
|
|
|
|
|
|
for ( ; count > 0; sbit++, count-- )
|
2002-03-22 14:52:37 +01:00
|
|
|
FT_FREE( sbit->buffer );
|
2001-12-05 16:59:33 +01:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_GNode_Done( FTC_GNODE( snode ), cache );
|
|
|
|
|
|
|
|
FT_FREE( snode );
|
2001-12-05 16:59:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
[!FTC_INLINE]: Compile conditionally.
* src/cache/ftccache.h: Updated.
* src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_GCache_Init, FTC_GCache_Done): Commented out.
(FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftcglyph.h: Updated.
* src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_INode_Weight): Commented out.
* src/cache/ftcimage.h: Updated.
* src/cache/ftmanag.c (FTC_Manager_Compress,
FTC_Manager_RegisterCache, FTC_Manager_FlushN):
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftmanag.h: Updated.
* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
(FTC_SNode_Weight): Commented out.
* src/cache/ftcsbits.h: Updated.
2006-03-22 16:30:41 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode_Free( FTC_SNode snode,
|
|
|
|
FTC_Cache cache )
|
|
|
|
{
|
2004-06-12 15:21:20 +02:00
|
|
|
ftc_snode_free( FTC_NODE( snode ), cache );
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
* builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk
(CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove
-fno-strict-aliasing.
Say you have `(Foo*)x' and want to assign, pass, or return it as
`(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler
would warn you that type casting incompatible pointer types breaks
strict-aliasing. The solution is to cast to `(void*)' instead which
is the generic pointer type, so the compiler knows that it should
make no strict-aliasing assumption on `x'. But the problem with
`(void*)x' is that seems like in C++, unlike C, `void*' is not a
generic pointer type and assigning `void*' to `Bar*' without a cast
causes an error. The solution is to cast to `Bar*' too, with
`(Bar*)(void*)x' as the result -- this is what the patch does.
* include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP),
include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove
cast on lvalue, use a temporary pointer instead.
Cast temporarily to (void*) to not break strict aliasing.
* include/freetype/internal/ftmemory.h (FT_MEM_ALLOC,
FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE),
src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*)
to not break strict aliasing.
* src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information.
* builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing.
* src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c --
it is currently loaded from ttsbit.c.
Other formatting.
2005-05-23 23:33:02 +02:00
|
|
|
/*
|
|
|
|
* This function tries to load a small bitmap within a given FTC_SNode.
|
|
|
|
* Note that it returns a non-zero error code _only_ in the case of
|
|
|
|
* out-of-memory condition. For all other errors (e.g., corresponding
|
|
|
|
* to a bad font file), this function will mark the sbit as `unavailable'
|
|
|
|
* and return a value of 0.
|
|
|
|
*
|
|
|
|
* You should also read the comment within the @ftc_snode_compare
|
|
|
|
* function below to see how out-of-memory is handled during a lookup.
|
|
|
|
*/
|
2001-10-26 18:58:27 +02:00
|
|
|
static FT_Error
|
2003-12-26 08:26:08 +01:00
|
|
|
ftc_snode_load( FTC_SNode snode,
|
|
|
|
FTC_Manager manager,
|
|
|
|
FT_UInt gindex,
|
|
|
|
FT_ULong *asize )
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
2003-12-26 08:26:08 +01:00
|
|
|
FT_Error error;
|
|
|
|
FTC_GNode gnode = FTC_GNODE( snode );
|
|
|
|
FTC_Family family = gnode->family;
|
|
|
|
FT_Memory memory = manager->memory;
|
|
|
|
FT_Face face;
|
|
|
|
FTC_SBit sbit;
|
|
|
|
FTC_SFamilyClass clazz;
|
2001-12-20 18:49:10 +01:00
|
|
|
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2003-12-21 02:41:32 +01:00
|
|
|
if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count )
|
2001-10-26 18:58:27 +02:00
|
|
|
{
|
2003-12-19 22:23:58 +01:00
|
|
|
FT_ERROR(( "ftc_snode_load: invalid glyph index" ));
|
2001-10-26 18:58:27 +02:00
|
|
|
return FTC_Err_Invalid_Argument;
|
|
|
|
}
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
sbit = snode->sbits + ( gindex - gnode->gindex );
|
|
|
|
clazz = (FTC_SFamilyClass)family->clazz;
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
sbit->buffer = 0;
|
|
|
|
|
|
|
|
error = clazz->family_load_glyph( family, gindex, manager, &face );
|
|
|
|
if ( error )
|
|
|
|
goto BadGlyph;
|
2001-12-05 16:59:33 +01:00
|
|
|
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
2003-12-19 22:23:58 +01:00
|
|
|
FT_Int temp;
|
|
|
|
FT_GlyphSlot slot = face->glyph;
|
|
|
|
FT_Bitmap* bitmap = &slot->bitmap;
|
|
|
|
FT_Int xadvance, yadvance;
|
2000-10-31 21:42:18 +01:00
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
|
2001-10-26 18:58:27 +02:00
|
|
|
{
|
2003-12-26 08:26:08 +01:00
|
|
|
FT_ERROR(( "%s: glyph loaded didn't return a bitmap!\n",
|
2003-12-19 22:23:58 +01:00
|
|
|
"ftc_snode_load" ));
|
|
|
|
goto BadGlyph;
|
|
|
|
}
|
2000-10-31 21:42:18 +01:00
|
|
|
|
2004-02-14 00:48:39 +01:00
|
|
|
/* Check that our values fit into 8-bit containers! */
|
2003-12-19 22:23:58 +01:00
|
|
|
/* If this is not the case, our bitmap is too large */
|
|
|
|
/* and we will leave it as `missing' with sbit.buffer = 0 */
|
2000-10-31 23:13:54 +01:00
|
|
|
|
|
|
|
#define CHECK_CHAR( d ) ( temp = (FT_Char)d, temp == d )
|
|
|
|
#define CHECK_BYTE( d ) ( temp = (FT_Byte)d, temp == d )
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
/* horizontal advance in pixels */
|
2004-07-13 00:54:09 +02:00
|
|
|
xadvance = ( slot->advance.x + 32 ) >> 6;
|
|
|
|
yadvance = ( slot->advance.y + 32 ) >> 6;
|
2003-12-19 22:23:58 +01:00
|
|
|
|
|
|
|
if ( !CHECK_BYTE( bitmap->rows ) ||
|
|
|
|
!CHECK_BYTE( bitmap->width ) ||
|
|
|
|
!CHECK_CHAR( bitmap->pitch ) ||
|
|
|
|
!CHECK_CHAR( slot->bitmap_left ) ||
|
|
|
|
!CHECK_CHAR( slot->bitmap_top ) ||
|
|
|
|
!CHECK_CHAR( xadvance ) ||
|
|
|
|
!CHECK_CHAR( yadvance ) )
|
|
|
|
goto BadGlyph;
|
|
|
|
|
|
|
|
sbit->width = (FT_Byte)bitmap->width;
|
|
|
|
sbit->height = (FT_Byte)bitmap->rows;
|
|
|
|
sbit->pitch = (FT_Char)bitmap->pitch;
|
|
|
|
sbit->left = (FT_Char)slot->bitmap_left;
|
|
|
|
sbit->top = (FT_Char)slot->bitmap_top;
|
|
|
|
sbit->xadvance = (FT_Char)xadvance;
|
|
|
|
sbit->yadvance = (FT_Char)yadvance;
|
|
|
|
sbit->format = (FT_Byte)bitmap->pixel_mode;
|
|
|
|
sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1);
|
|
|
|
|
|
|
|
/* copy the bitmap into a new buffer -- ignore error */
|
|
|
|
error = ftc_sbit_copy_bitmap( sbit, bitmap, memory );
|
|
|
|
|
|
|
|
/* now, compute size */
|
|
|
|
if ( asize )
|
2004-03-05 10:26:24 +01:00
|
|
|
*asize = FT_ABS( sbit->pitch ) * sbit->height;
|
2003-12-19 22:23:58 +01:00
|
|
|
|
|
|
|
} /* glyph loading successful */
|
|
|
|
|
|
|
|
/* ignore the errors that might have occurred -- */
|
|
|
|
/* we mark unloaded glyphs with `sbit.buffer == 0' */
|
2004-04-15 18:09:31 +02:00
|
|
|
/* and `width == 255', `height == 0' */
|
2003-12-19 22:23:58 +01:00
|
|
|
/* */
|
|
|
|
if ( error && error != FTC_Err_Out_Of_Memory )
|
|
|
|
{
|
|
|
|
BadGlyph:
|
|
|
|
sbit->width = 255;
|
|
|
|
sbit->height = 0;
|
|
|
|
sbit->buffer = NULL;
|
|
|
|
error = 0;
|
2004-04-15 18:09:31 +02:00
|
|
|
if ( asize )
|
|
|
|
*asize = 0;
|
2000-10-28 15:17:11 +02:00
|
|
|
}
|
|
|
|
|
2001-10-26 18:58:27 +02:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
[!FTC_INLINE]: Compile conditionally.
* src/cache/ftccache.h: Updated.
* src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_GCache_Init, FTC_GCache_Done): Commented out.
(FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftcglyph.h: Updated.
* src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_INode_Weight): Commented out.
* src/cache/ftcimage.h: Updated.
* src/cache/ftmanag.c (FTC_Manager_Compress,
FTC_Manager_RegisterCache, FTC_Manager_FlushN):
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftmanag.h: Updated.
* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
(FTC_SNode_Weight): Commented out.
* src/cache/ftcsbits.h: Updated.
2006-03-22 16:30:41 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_SNode_New( FTC_SNode *psnode,
|
|
|
|
FTC_GQuery gquery,
|
|
|
|
FTC_Cache cache )
|
2001-10-26 18:58:27 +02:00
|
|
|
{
|
2003-12-19 22:23:58 +01:00
|
|
|
FT_Memory memory = cache->memory;
|
|
|
|
FT_Error error;
|
|
|
|
FTC_SNode snode = NULL;
|
|
|
|
FT_UInt gindex = gquery->gindex;
|
|
|
|
FTC_Family family = gquery->family;
|
2001-12-05 02:22:05 +01:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_SFamilyClass clazz = FTC_CACHE__SFAMILY_CLASS( cache );
|
|
|
|
FT_UInt total;
|
2001-12-20 18:49:10 +01:00
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
total = clazz->family_get_count( family, cache->manager );
|
|
|
|
if ( total == 0 || gindex >= total )
|
|
|
|
{
|
|
|
|
error = FT_Err_Invalid_Argument;
|
|
|
|
goto Exit;
|
|
|
|
}
|
2001-10-26 18:58:27 +02:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
if ( !FT_NEW( snode ) )
|
|
|
|
{
|
2003-12-26 08:26:08 +01:00
|
|
|
FT_UInt count, start;
|
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE );
|
2003-12-19 22:23:58 +01:00
|
|
|
count = total - start;
|
|
|
|
if ( count > FTC_SBIT_ITEMS_PER_NODE )
|
|
|
|
count = FTC_SBIT_ITEMS_PER_NODE;
|
2000-10-31 23:13:54 +01:00
|
|
|
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_GNode_Init( FTC_GNODE( snode ), start, family );
|
|
|
|
|
|
|
|
snode->count = count;
|
|
|
|
|
|
|
|
error = ftc_snode_load( snode,
|
|
|
|
cache->manager,
|
|
|
|
gindex,
|
|
|
|
NULL );
|
|
|
|
if ( error )
|
|
|
|
{
|
|
|
|
FTC_SNode_Free( snode, cache );
|
|
|
|
snode = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Exit:
|
|
|
|
*psnode = snode;
|
2000-10-28 15:17:11 +02:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Adjust parameters and return types
to prototypes given in header files from include/freetype/cache.
Use casts to proper types locally.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove
casts.
* src/cache/ftccback.h: Adjust parameters and return types to
prototypes given in header files from include/freetype/cache.
* src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new,
ftc_inode_weight): Adjust parameters and return types to prototypes
given in header files from include/freetype/cache. Use casts to
proper types locally.
* src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new,
ftc_snode_weight, ftc_snode_compare): Adjust parameters and return
types to prototypes given in header files from
include/freetype/cache. Use casts to proper types locally.
* src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new,
ftc_cmap_node_weight, ftc_cmap_node_compare,
ftc_cmap_node_remove_faceid): Adjust parameters and return types to
prototypes given in header files from include/freetype/cache. Use
casts to proper types locally.
(ftc_cmap_cache_class): Remove casts.
* src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init,
ftc_gcache_done): Adjust parameters and return types to prototypes
given in header files from include/freetype/cache. Use casts to
proper types locally.
* src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare,
ftc_size_node_init, ftc_size_node_reset,
ftc_size_node_compare_faceid, ftc_face_node_init,
ftc_face_node_done, ftc_face_node_compare: Adjust parameters and
return types to prototypes given in header files from
include/freetype/cache. Use casts to proper types locally.
(ftc_size_list_class, ftc_face_list_class): Remove casts.
* src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done):
Use FT_Module as parameter and do a cast to FT_AutoHinter locally.
(autohint_module_class): Remove casts.
* src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy,
ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init,
ft_outline_glyph_done, ft_outline_glyph_copy,
ft_outline_glyph_transform, ft_outline_glyph_bbox,
ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast
to FT_XXXGlyph locally.
Use FT_CALLBACK_DEF throughout.
(ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts.
* src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done,
bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter
and do a cast to BDF_CMap locally.
(bdf_cmap_class): Remove casts.
2004-05-17 11:25:04 +02:00
|
|
|
ftc_snode_new( FTC_Node *ftcpsnode,
|
|
|
|
FT_Pointer ftcgquery,
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
FTC_Cache cache )
|
|
|
|
{
|
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Adjust parameters and return types
to prototypes given in header files from include/freetype/cache.
Use casts to proper types locally.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove
casts.
* src/cache/ftccback.h: Adjust parameters and return types to
prototypes given in header files from include/freetype/cache.
* src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new,
ftc_inode_weight): Adjust parameters and return types to prototypes
given in header files from include/freetype/cache. Use casts to
proper types locally.
* src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new,
ftc_snode_weight, ftc_snode_compare): Adjust parameters and return
types to prototypes given in header files from
include/freetype/cache. Use casts to proper types locally.
* src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new,
ftc_cmap_node_weight, ftc_cmap_node_compare,
ftc_cmap_node_remove_faceid): Adjust parameters and return types to
prototypes given in header files from include/freetype/cache. Use
casts to proper types locally.
(ftc_cmap_cache_class): Remove casts.
* src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init,
ftc_gcache_done): Adjust parameters and return types to prototypes
given in header files from include/freetype/cache. Use casts to
proper types locally.
* src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare,
ftc_size_node_init, ftc_size_node_reset,
ftc_size_node_compare_faceid, ftc_face_node_init,
ftc_face_node_done, ftc_face_node_compare: Adjust parameters and
return types to prototypes given in header files from
include/freetype/cache. Use casts to proper types locally.
(ftc_size_list_class, ftc_face_list_class): Remove casts.
* src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done):
Use FT_Module as parameter and do a cast to FT_AutoHinter locally.
(autohint_module_class): Remove casts.
* src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy,
ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init,
ft_outline_glyph_done, ft_outline_glyph_copy,
ft_outline_glyph_transform, ft_outline_glyph_bbox,
ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast
to FT_XXXGlyph locally.
Use FT_CALLBACK_DEF throughout.
(ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts.
* src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done,
bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter
and do a cast to BDF_CMap locally.
(bdf_cmap_class): Remove casts.
2004-05-17 11:25:04 +02:00
|
|
|
FTC_SNode *psnode = (FTC_SNode*)ftcpsnode;
|
|
|
|
FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
|
|
|
|
|
|
|
|
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
return FTC_SNode_New( psnode, gquery, cache );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-06-09 23:07:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_ULong )
|
|
|
|
ftc_snode_weight( FTC_Node ftcsnode,
|
|
|
|
FTC_Cache cache )
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode snode = (FTC_SNode)ftcsnode;
|
2003-12-19 22:23:58 +01:00
|
|
|
FT_UInt count = snode->count;
|
|
|
|
FTC_SBit sbit = snode->sbits;
|
|
|
|
FT_Int pitch;
|
|
|
|
FT_ULong size;
|
2000-10-28 15:17:11 +02:00
|
|
|
|
2004-06-09 23:07:49 +02:00
|
|
|
FT_UNUSED( cache );
|
2000-10-31 23:13:54 +01:00
|
|
|
|
2004-06-12 15:21:20 +02:00
|
|
|
|
2003-12-25 21:15:51 +01:00
|
|
|
FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE );
|
* include/freetype/ftcache.h,
include/freetype/cache/ftcmanag.h,
include/freetype/cache/ftccache.h,
include/freetype/cache/ftcmanag.h,
include/freetype/cache/ftcmru.h (added),
include/freetype/cache/ftlru.h (removed),
include/freetype/cache/ftcsbits.h,
include/freetype/cache/ftcimage.h,
include/freetype/cache/ftcglyph.h,
src/cache/ftcmru.c,
src/cache/ftcmanag.c,
src/cache/ftccache.c,
src/cache/ftcglyph.c,
src/cache/ftcimage.c,
src/cache/ftcsbits.c,
src/cache/ftccmap.c,
src/cache/ftcbasic.c (added),
src/cache/ftclru.c (removed):
*Complete* rewrite of the cache sub-system to "solve" the
following points:
- all public APIs have been moved to FT_CACHE_H, everything
under "include/freetype/cache" is only needed by client
applications that want to implement their own caches
- a new function named FTC_Manager_RemoveFaceID to deal
with the uninstallation of FaceIDs
- the image and sbit cache are now abstract classes, that
can be extended much more easily by client applications
- better performance in certain areas. Further optimizations
to come shortly anyway...
- the FTC_CMapCache_Lookup function has changed its signature,
charmaps can now only be retrieved by index
- FTC_Manager_Lookup_Face => FTC_Manager_LookupFace
FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in
private header for the moment)
2003-12-22 22:53:37 +01:00
|
|
|
|
2000-10-31 23:13:54 +01:00
|
|
|
/* the node itself */
|
2001-12-20 18:49:10 +01:00
|
|
|
size = sizeof ( *snode );
|
2001-06-28 19:49:10 +02:00
|
|
|
|
2000-10-29 01:34:45 +02:00
|
|
|
for ( ; count > 0; count--, sbit++ )
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
2000-10-31 23:13:54 +01:00
|
|
|
if ( sbit->buffer )
|
2000-10-28 15:17:11 +02:00
|
|
|
{
|
2000-10-29 01:34:45 +02:00
|
|
|
pitch = sbit->pitch;
|
2000-10-31 23:13:54 +01:00
|
|
|
if ( pitch < 0 )
|
2000-10-29 01:34:45 +02:00
|
|
|
pitch = -pitch;
|
2000-10-31 21:42:18 +01:00
|
|
|
|
2000-10-29 01:34:45 +02:00
|
|
|
/* add the size of a given glyph image */
|
|
|
|
size += pitch * sbit->height;
|
2000-10-28 15:17:11 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
[!FTC_INLINE]: Compile conditionally.
* src/cache/ftccache.h: Updated.
* src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_GCache_Init, FTC_GCache_Done): Commented out.
(FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftcglyph.h: Updated.
* src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_INode_Weight): Commented out.
* src/cache/ftcimage.h: Updated.
* src/cache/ftmanag.c (FTC_Manager_Compress,
FTC_Manager_RegisterCache, FTC_Manager_FlushN):
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftmanag.h: Updated.
* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
(FTC_SNode_Weight): Commented out.
* src/cache/ftcsbits.h: Updated.
2006-03-22 16:30:41 +01:00
|
|
|
#if 0
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( FT_ULong )
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode_Weight( FTC_SNode snode )
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
{
|
2004-06-12 15:21:20 +02:00
|
|
|
return ftc_snode_weight( FTC_NODE( snode ), NULL );
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
}
|
|
|
|
|
* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
[!FTC_INLINE]: Compile conditionally.
* src/cache/ftccache.h: Updated.
* src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_GCache_Init, FTC_GCache_Done): Commented out.
(FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftcglyph.h: Updated.
* src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_INode_Weight): Commented out.
* src/cache/ftcimage.h: Updated.
* src/cache/ftmanag.c (FTC_Manager_Compress,
FTC_Manager_RegisterCache, FTC_Manager_FlushN):
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftmanag.h: Updated.
* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
(FTC_SNode_Weight): Commented out.
* src/cache/ftcsbits.h: Updated.
2006-03-22 16:30:41 +01:00
|
|
|
#endif /* 0 */
|
|
|
|
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
|
2004-06-09 23:07:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Bool )
|
|
|
|
ftc_snode_compare( FTC_Node ftcsnode,
|
|
|
|
FT_Pointer ftcgquery,
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_Cache cache )
|
2001-10-26 18:58:27 +02:00
|
|
|
{
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode snode = (FTC_SNode)ftcsnode;
|
|
|
|
FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
|
|
|
|
FTC_GNode gnode = FTC_GNODE( snode );
|
|
|
|
FT_UInt gindex = gquery->gindex;
|
|
|
|
FT_Bool result;
|
2003-12-26 08:26:08 +01:00
|
|
|
|
2001-12-20 18:49:10 +01:00
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
result = FT_BOOL( gnode->family == gquery->family &&
|
|
|
|
(FT_UInt)( gindex - gnode->gindex ) < snode->count );
|
2001-10-26 18:58:27 +02:00
|
|
|
if ( result )
|
|
|
|
{
|
|
|
|
/* check if we need to load the glyph bitmap now */
|
2003-12-19 22:23:58 +01:00
|
|
|
FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex );
|
2001-12-20 18:49:10 +01:00
|
|
|
|
2001-12-05 02:22:05 +01:00
|
|
|
|
* builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk
(CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove
-fno-strict-aliasing.
Say you have `(Foo*)x' and want to assign, pass, or return it as
`(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler
would warn you that type casting incompatible pointer types breaks
strict-aliasing. The solution is to cast to `(void*)' instead which
is the generic pointer type, so the compiler knows that it should
make no strict-aliasing assumption on `x'. But the problem with
`(void*)x' is that seems like in C++, unlike C, `void*' is not a
generic pointer type and assigning `void*' to `Bar*' without a cast
causes an error. The solution is to cast to `Bar*' too, with
`(Bar*)(void*)x' as the result -- this is what the patch does.
* include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP),
include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove
cast on lvalue, use a temporary pointer instead.
Cast temporarily to (void*) to not break strict aliasing.
* include/freetype/internal/ftmemory.h (FT_MEM_ALLOC,
FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE),
src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*)
to not break strict aliasing.
* src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information.
* builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing.
* src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c --
it is currently loaded from ttsbit.c.
Other formatting.
2005-05-23 23:33:02 +02:00
|
|
|
/*
|
|
|
|
* The following code illustrates what to do when you want to
|
|
|
|
* perform operations that may fail within a lookup function.
|
|
|
|
*
|
|
|
|
* Here, we want to load a small bitmap on-demand; we thus
|
|
|
|
* need to call the `ftc_snode_load' function which may return
|
|
|
|
* a non-zero error code only when we are out of memory (OOM).
|
|
|
|
*
|
|
|
|
* The correct thing to do is to use @FTC_CACHE_TRYLOOP and
|
|
|
|
* @FTC_CACHE_TRYLOOP_END in order to implement a retry loop
|
|
|
|
* that is capable of flushing the cache incrementally when
|
|
|
|
* an OOM errors occur.
|
|
|
|
*
|
|
|
|
* However, we need to `lock' the node before this operation to
|
|
|
|
* prevent it from being flushed within the loop.
|
|
|
|
*
|
* include/freetype/cache/ftccache.h,
include/freetype/cache/ftccmap.h,
include/freetype/cache/ftcglyph.h
include/freetype/cache/ftcimage.h
include/freetype/cache/ftcmanag.h
include/freetype/cache/ftcmru.h
include/freetype/cache/ftcsbits.h:
removing these header files from the public include directory.
* include/freetype/config/ftheader.h:
changing the definition of FT_CACHE_INTERNAL_XXX_H macros to
redirect to FT_CACHE_H instead
* src/cache/ftcbasic.c, src/cache/ftccache.c, src/cache/ftccache.h,
src/cache/ftccback.h, src/cache/ftccmap.c, src/cache/ftcglyph.c,
src/cache/ftcglyph.h, src/cache/ftcimage.c, src/cache/ftcimage.h,
src/cache/ftcmanag.c, src/cache/ftcmanag.h, src/cache/ftcmru.c,
src/cache/ftcmru.h, src/cache/ftcsbits.c, src/cache/ftcsbits.h:
modifications to prevent using the FT_CACHE_INTERNAL_XXX_H macros,
and grab the headers in 'src/cache' instead (see below).
2006-03-20 13:10:24 +01:00
|
|
|
* When we exit the loop, we unlock the node, then check the `error'
|
* builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk
(CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove
-fno-strict-aliasing.
Say you have `(Foo*)x' and want to assign, pass, or return it as
`(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler
would warn you that type casting incompatible pointer types breaks
strict-aliasing. The solution is to cast to `(void*)' instead which
is the generic pointer type, so the compiler knows that it should
make no strict-aliasing assumption on `x'. But the problem with
`(void*)x' is that seems like in C++, unlike C, `void*' is not a
generic pointer type and assigning `void*' to `Bar*' without a cast
causes an error. The solution is to cast to `Bar*' too, with
`(Bar*)(void*)x' as the result -- this is what the patch does.
* include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP),
include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove
cast on lvalue, use a temporary pointer instead.
Cast temporarily to (void*) to not break strict aliasing.
* include/freetype/internal/ftmemory.h (FT_MEM_ALLOC,
FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE),
src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*)
to not break strict aliasing.
* src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information.
* builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing.
* src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c --
it is currently loaded from ttsbit.c.
Other formatting.
2005-05-23 23:33:02 +02:00
|
|
|
* variable. If it is non-zero, this means that the cache was
|
|
|
|
* completely flushed and that no usable memory was found to load
|
|
|
|
* the bitmap.
|
|
|
|
*
|
|
|
|
* We then prefer to return a value of 0 (i.e., NO MATCH). This
|
|
|
|
* ensures that the caller will try to allocate a new node.
|
|
|
|
* This operation consequently _fail_ and the lookup function
|
|
|
|
* returns the appropriate OOM error code.
|
|
|
|
*
|
|
|
|
* Note that `buffer == NULL && width == 255' is a hack used to
|
|
|
|
* tag `unavailable' bitmaps in the array. We should never try
|
|
|
|
* to load these.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2001-10-26 18:58:27 +02:00
|
|
|
if ( sbit->buffer == NULL && sbit->width != 255 )
|
|
|
|
{
|
|
|
|
FT_ULong size;
|
2005-05-23 15:04:53 +02:00
|
|
|
FT_Error error;
|
2001-12-05 02:22:05 +01:00
|
|
|
|
2001-12-20 18:49:10 +01:00
|
|
|
|
* builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk
(CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove
-fno-strict-aliasing.
Say you have `(Foo*)x' and want to assign, pass, or return it as
`(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler
would warn you that type casting incompatible pointer types breaks
strict-aliasing. The solution is to cast to `(void*)' instead which
is the generic pointer type, so the compiler knows that it should
make no strict-aliasing assumption on `x'. But the problem with
`(void*)x' is that seems like in C++, unlike C, `void*' is not a
generic pointer type and assigning `void*' to `Bar*' without a cast
causes an error. The solution is to cast to `Bar*' too, with
`(Bar*)(void*)x' as the result -- this is what the patch does.
* include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP),
include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove
cast on lvalue, use a temporary pointer instead.
Cast temporarily to (void*) to not break strict aliasing.
* include/freetype/internal/ftmemory.h (FT_MEM_ALLOC,
FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE),
src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*)
to not break strict aliasing.
* src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information.
* builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing.
* src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c --
it is currently loaded from ttsbit.c.
Other formatting.
2005-05-23 23:33:02 +02:00
|
|
|
ftcsnode->ref_count++; /* lock node to prevent flushing */
|
|
|
|
/* in retry loop */
|
|
|
|
|
|
|
|
FTC_CACHE_TRYLOOP( cache )
|
2003-12-19 22:23:58 +01:00
|
|
|
{
|
2005-05-23 15:04:53 +02:00
|
|
|
error = ftc_snode_load( snode, cache->manager, gindex, &size );
|
2003-12-19 22:23:58 +01:00
|
|
|
}
|
2005-05-23 15:04:53 +02:00
|
|
|
FTC_CACHE_TRYLOOP_END();
|
|
|
|
|
|
|
|
ftcsnode->ref_count--; /* unlock the node */
|
|
|
|
|
|
|
|
if ( error )
|
|
|
|
result = 0;
|
|
|
|
else
|
|
|
|
cache->manager->cur_weight += size;
|
2001-10-26 18:58:27 +02:00
|
|
|
}
|
|
|
|
}
|
2001-12-05 02:22:05 +01:00
|
|
|
|
2001-10-26 18:58:27 +02:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2003-12-26 08:26:08 +01:00
|
|
|
|
* src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
[!FTC_INLINE]: Compile conditionally.
* src/cache/ftccache.h: Updated.
* src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_GCache_Init, FTC_GCache_Done): Commented out.
(FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftcglyph.h: Updated.
* src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
s/FT_EXPORT/FT_LOCAL/.
(FTC_INode_Weight): Commented out.
* src/cache/ftcimage.h: Updated.
* src/cache/ftmanag.c (FTC_Manager_Compress,
FTC_Manager_RegisterCache, FTC_Manager_FlushN):
s/FT_EXPORT/FT_LOCAL/.
* src/cache/ftmanag.h: Updated.
* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
(FTC_SNode_Weight): Commented out.
* src/cache/ftcsbits.h: Updated.
2006-03-22 16:30:41 +01:00
|
|
|
FT_LOCAL_DEF( FT_Bool )
|
2004-06-09 23:07:49 +02:00
|
|
|
FTC_SNode_Compare( FTC_SNode snode,
|
|
|
|
FTC_GQuery gquery,
|
|
|
|
FTC_Cache cache )
|
|
|
|
{
|
2004-06-12 15:21:20 +02:00
|
|
|
return ftc_snode_compare( FTC_NODE( snode ), gquery, cache );
|
Fix callback functions in cache module.
* src/cache/ftccback.h: New file for callback declarations.
* src/cache/ftcbasic.c (ftc_basic_family_compare,
ftc_basic_family_init, ftc_basic_family_get_count,
ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
(ftc_basic_image_family_class, ftc_basic_image_cache_class,
ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
* src/cache/ftccache.c: Include ftccback.h.
(ftc_cache_init, ftc_cache_done): New wrapper functions which use
FT_LOCAL_DEF.
* src/cache/ftccmap.c: Include ftccback.h.
(ftc_cmap_cache_class): Use local wrapper functions.
* src/cache/ftcglyph.c: Include ftccback.h.
(ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcimage.c: Include ftccback.h.
(ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
functions which use FT_LOCAL_DEF.
* src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
Use FT_CALLBACK_TABLE_DEF.
* src/cache;/ftcsbits.c: Include ftccback.h.
(ftc_snode_free, ftc_snode_new, ftc_snode_weight,
ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
* src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
2004-02-17 19:41:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-10-31 23:13:54 +01:00
|
|
|
/* END */
|