2002-02-22 19:28:11 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
2004-08-29 18:50:09 +02:00
|
|
|
/* ttcmap.c */
|
2002-02-22 19:28:11 +01:00
|
|
|
/* */
|
2004-08-29 18:50:09 +02:00
|
|
|
/* TrueType character mapping table (cmap) support (body). */
|
2002-02-22 19:28:11 +01:00
|
|
|
/* */
|
2007-01-06 08:47:45 +01:00
|
|
|
/* Copyright 2002, 2003, 2004, 2005, 2006, 2007 by */
|
2002-02-22 19:28:11 +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. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_INTERNAL_DEBUG_H
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
|
|
|
|
#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */
|
|
|
|
|
|
|
|
#include FT_INTERNAL_VALIDATE_H
|
2002-03-22 16:02:38 +01:00
|
|
|
#include FT_INTERNAL_STREAM_H
|
2002-02-22 19:28:11 +01:00
|
|
|
#include "ttload.h"
|
2004-08-29 18:50:09 +02:00
|
|
|
#include "ttcmap.h"
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* 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_ttcmap
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
#define TT_PEEK_SHORT FT_PEEK_SHORT
|
|
|
|
#define TT_PEEK_USHORT FT_PEEK_USHORT
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
#define TT_PEEK_UINT24 FT_PEEK_UOFF3
|
2002-03-31 20:48:24 +02:00
|
|
|
#define TT_PEEK_LONG FT_PEEK_LONG
|
|
|
|
#define TT_PEEK_ULONG FT_PEEK_ULONG
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
#define TT_NEXT_SHORT FT_NEXT_SHORT
|
|
|
|
#define TT_NEXT_USHORT FT_NEXT_USHORT
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
#define TT_NEXT_UINT24 FT_NEXT_UOFF3
|
2002-03-31 20:48:24 +02:00
|
|
|
#define TT_NEXT_LONG FT_NEXT_LONG
|
|
|
|
#define TT_NEXT_ULONG FT_NEXT_ULONG
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-02-28 17:10:29 +01:00
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-03-31 20:48:24 +02:00
|
|
|
tt_cmap_init( TT_CMap cmap,
|
|
|
|
FT_Byte* table )
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
cmap->data = table;
|
2005-05-10 00:11:36 +02:00
|
|
|
return SFNT_Err_Ok;
|
2002-03-01 03:26:22 +01:00
|
|
|
}
|
2002-02-28 17:10:29 +01:00
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 0 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 0 */
|
|
|
|
/* length 2 USHORT table length in bytes */
|
|
|
|
/* language 4 USHORT Mac language code */
|
|
|
|
/* glyph_ids 6 BYTE[256] array of glyph indices */
|
|
|
|
/* 262 */
|
|
|
|
/* */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_0
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap0_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte* p = table + 2;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt length = TT_NEXT_USHORT( p );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( table + length > valid->limit || length < 262 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check glyph indices whenever necessary */
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt n, idx;
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
p = table + 6;
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( n = 0; n < 256; n++ )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = *p++;
|
|
|
|
if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap0_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
return char_code < 256 ? table[6 + char_code] : 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-31 20:48:24 +02:00
|
|
|
tt_cmap0_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt32 charcode = *pchar_code;
|
|
|
|
FT_UInt32 result = 0;
|
|
|
|
FT_UInt gindex = 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
table += 6; /* go to glyph ids */
|
2002-03-22 16:02:38 +01:00
|
|
|
while ( ++charcode < 256 )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
gindex = table[charcode];
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
result = charcode;
|
2002-02-22 19:28:11 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
*pchar_code = result;
|
|
|
|
return gindex;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-02-28 17:10:29 +01:00
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap0_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 4;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 0;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap0_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
sizeof ( TT_CMapRec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_InitFunc) tt_cmap_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap0_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap0_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
0,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap0_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap0_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_0 */
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 2 *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** This is used for certain CJK encodings that encode text in a *****/
|
|
|
|
/***** mixed 8/16 bits encoding along the following lines: *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** * Certain byte values correspond to an 8-bit character code *****/
|
|
|
|
/***** (typically in the range 0..127 for ASCII compatibility). *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** * Certain byte values signal the first byte of a 2-byte *****/
|
|
|
|
/***** character code (but these values are also valid as the *****/
|
|
|
|
/***** second byte of a 2-byte character). *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** The following charmap lookup and iteration functions all *****/
|
|
|
|
/***** assume that the value "charcode" correspond to following: *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** - For one byte characters, "charcode" is simply the *****/
|
|
|
|
/***** character code. *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** - For two byte characters, "charcode" is the 2-byte *****/
|
|
|
|
/***** character code in big endian format. More exactly: *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** (charcode >> 8) is the first byte value *****/
|
|
|
|
/***** (charcode & 0xFF) is the second byte value *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** Note that not all values of "charcode" are valid according *****/
|
|
|
|
/***** to these rules, and the function moderately check the *****/
|
|
|
|
/***** arguments. *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 2 */
|
|
|
|
/* length 2 USHORT table length in bytes */
|
|
|
|
/* language 4 USHORT Mac language code */
|
|
|
|
/* keys 6 USHORT[256] sub-header keys */
|
|
|
|
/* subs 518 SUBHEAD[NSUBS] sub-headers array */
|
|
|
|
/* glyph_ids 518+NSUB*8 USHORT[] glyph id array */
|
|
|
|
/* */
|
|
|
|
/* The `keys' table is used to map charcode high-bytes to sub-headers. */
|
|
|
|
/* The value of `NSUBS' is the number of sub-headers defined in the */
|
|
|
|
/* table and is computed by finding the maximum of the `keys' table. */
|
|
|
|
/* */
|
|
|
|
/* Note that for any n, `keys[n]' is a byte offset within the `subs' */
|
|
|
|
/* table, i.e., it is the corresponding sub-header index multiplied */
|
|
|
|
/* by 8. */
|
|
|
|
/* */
|
|
|
|
/* Each sub-header has the following format: */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* first 0 USHORT first valid low-byte */
|
|
|
|
/* count 2 USHORT number of valid low-bytes */
|
|
|
|
/* delta 4 SHORT see below */
|
|
|
|
/* offset 6 USHORT see below */
|
|
|
|
/* */
|
|
|
|
/* A sub-header defines, for each high-byte, the range of valid */
|
|
|
|
/* low-bytes within the charmap. Note that the range defined by `first' */
|
|
|
|
/* and `count' must be completely included in the interval [0..255] */
|
|
|
|
/* according to the specification. */
|
|
|
|
/* */
|
|
|
|
/* If a character code is contained within a given sub-header, then */
|
|
|
|
/* mapping it to a glyph index is done as follows: */
|
|
|
|
/* */
|
|
|
|
/* * The value of `offset' is read. This is a _byte_ distance from the */
|
|
|
|
/* location of the `offset' field itself into a slice of the */
|
|
|
|
/* `glyph_ids' table. Let's call it `slice' (it's a USHORT[] too). */
|
|
|
|
/* */
|
|
|
|
/* * The value `slice[char.lo - first]' is read. If it is 0, there is */
|
|
|
|
/* no glyph for the charcode. Otherwise, the value of `delta' is */
|
|
|
|
/* added to it (modulo 65536) to form a new glyph index. */
|
|
|
|
/* */
|
|
|
|
/* It is up to the validation routine to check that all offsets fall */
|
|
|
|
/* within the glyph ids table (and not within the `subs' table itself or */
|
|
|
|
/* outside of the CMap). */
|
|
|
|
/* */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_2
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap2_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* p = table + 2; /* skip format */
|
|
|
|
FT_UInt length = TT_PEEK_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
FT_UInt n, max_subs;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* keys; /* keys table */
|
|
|
|
FT_Byte* subs; /* sub-headers */
|
|
|
|
FT_Byte* glyph_ids; /* glyph id array */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( table + length > valid->limit || length < 6 + 512 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
keys = table + 6;
|
|
|
|
|
|
|
|
/* parse keys to compute sub-headers count */
|
2002-03-22 16:02:38 +01:00
|
|
|
p = keys;
|
|
|
|
max_subs = 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( n = 0; n < 256; n++ )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt idx = TT_NEXT_USHORT( p );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* value must be multiple of 8 */
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
idx >>= 3;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx > max_subs )
|
|
|
|
max_subs = idx;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_ASSERT( p == table + 518 );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
subs = p;
|
2002-03-31 20:48:24 +02:00
|
|
|
glyph_ids = subs + (max_subs + 1) * 8;
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( glyph_ids > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* parse sub-headers */
|
|
|
|
for ( n = 0; n <= max_subs; n++ )
|
|
|
|
{
|
|
|
|
FT_UInt first_code, code_count, offset;
|
|
|
|
FT_Int delta;
|
|
|
|
FT_Byte* ids;
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
first_code = TT_NEXT_USHORT( p );
|
|
|
|
code_count = TT_NEXT_USHORT( p );
|
|
|
|
delta = TT_NEXT_SHORT( p );
|
|
|
|
offset = TT_NEXT_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check range within 0..255 */
|
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID )
|
|
|
|
{
|
|
|
|
if ( first_code >= 256 || first_code + code_count > 256 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* check offset */
|
|
|
|
if ( offset != 0 )
|
|
|
|
{
|
|
|
|
ids = p - 2 + offset;
|
|
|
|
if ( ids < glyph_ids || ids + code_count*2 > table + length )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_OFFSET;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check glyph ids */
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* limit = p + code_count * 2;
|
|
|
|
FT_UInt idx;
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
for ( ; p < limit; )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = TT_NEXT_USHORT( p );
|
|
|
|
if ( idx != 0 )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = ( idx + delta ) & 0xFFFFU;
|
|
|
|
if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* return sub header corresponding to a given character code */
|
2002-03-31 20:48:24 +02:00
|
|
|
/* NULL on invalid charcode */
|
2002-02-22 19:28:11 +01:00
|
|
|
static FT_Byte*
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap2_get_subheader( FT_Byte* table,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
|
|
|
FT_Byte* result = NULL;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
if ( char_code < 0x10000UL )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt char_lo = (FT_UInt)( char_code & 0xFF );
|
|
|
|
FT_UInt char_hi = (FT_UInt)( char_code >> 8 );
|
|
|
|
FT_Byte* p = table + 6; /* keys table */
|
|
|
|
FT_Byte* subs = table + 518; /* subheaders table */
|
|
|
|
FT_Byte* sub;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
|
|
|
if ( char_hi == 0 )
|
|
|
|
{
|
|
|
|
/* an 8-bit character code -- we use subHeader 0 in this case */
|
2002-03-31 20:48:24 +02:00
|
|
|
/* to test whether the character code is in the charmap */
|
2002-02-22 19:28:11 +01:00
|
|
|
/* */
|
|
|
|
sub = subs; /* jump to first sub-header */
|
|
|
|
|
|
|
|
/* check that the sub-header for this byte is 0, which */
|
|
|
|
/* indicates that it's really a valid one-byte value */
|
|
|
|
/* Otherwise, return 0 */
|
|
|
|
/* */
|
2002-03-31 20:48:24 +02:00
|
|
|
p += char_lo * 2;
|
|
|
|
if ( TT_PEEK_USHORT( p ) != 0 )
|
2002-02-22 19:28:11 +01:00
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* a 16-bit character code */
|
|
|
|
|
2003-12-24 14:37:58 +01:00
|
|
|
/* jump to key entry */
|
|
|
|
p += char_hi * 2;
|
|
|
|
/* jump to sub-header */
|
|
|
|
sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
|
|
|
|
|
|
|
|
/* check that the high byte isn't a valid one-byte value */
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( sub == subs )
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
result = sub;
|
|
|
|
}
|
|
|
|
Exit:
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap2_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
2002-02-22 19:28:11 +01:00
|
|
|
FT_UInt result = 0;
|
|
|
|
FT_Byte* subheader;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
subheader = tt_cmap2_get_subheader( table, char_code );
|
|
|
|
if ( subheader )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* p = subheader;
|
|
|
|
FT_UInt idx = (FT_UInt)(char_code & 0xFF);
|
2002-02-22 19:28:11 +01:00
|
|
|
FT_UInt start, count;
|
|
|
|
FT_Int delta;
|
|
|
|
FT_UInt offset;
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
start = TT_NEXT_USHORT( p );
|
|
|
|
count = TT_NEXT_USHORT( p );
|
|
|
|
delta = TT_NEXT_SHORT ( p );
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
|
|
|
|
|
|
|
idx -= start;
|
|
|
|
if ( idx < count && offset != 0 )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
p += offset + 2 * idx;
|
|
|
|
idx = TT_PEEK_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx != 0 )
|
|
|
|
result = (FT_UInt)( idx + delta ) & 0xFFFFU;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap2_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pcharcode )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt gindex = 0;
|
|
|
|
FT_UInt32 result = 0;
|
|
|
|
FT_UInt32 charcode = *pcharcode + 1;
|
|
|
|
FT_Byte* subheader;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
while ( charcode < 0x10000UL )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
subheader = tt_cmap2_get_subheader( table, charcode );
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( subheader )
|
|
|
|
{
|
|
|
|
FT_Byte* p = subheader;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt start = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt count = TT_NEXT_USHORT( p );
|
|
|
|
FT_Int delta = TT_NEXT_SHORT ( p );
|
|
|
|
FT_UInt offset = TT_PEEK_USHORT( p );
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_UInt char_lo = (FT_UInt)( charcode & 0xFF );
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt pos, idx;
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( offset == 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
goto Next_SubHeader;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( char_lo < start )
|
|
|
|
{
|
|
|
|
char_lo = start;
|
|
|
|
pos = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pos = (FT_UInt)( char_lo - start );
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
p += offset + pos * 2;
|
2003-12-24 02:10:46 +01:00
|
|
|
charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
for ( ; pos < count; pos++, charcode++ )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = TT_NEXT_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx != 0 )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = ( idx + delta ) & 0xFFFFU;
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
result = charcode;
|
2002-02-22 19:28:11 +01:00
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* jump to next sub-header, i.e. higher byte value */
|
|
|
|
Next_SubHeader:
|
2003-12-24 02:10:46 +01:00
|
|
|
charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Exit:
|
2002-03-22 16:02:38 +01:00
|
|
|
*pcharcode = result;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
return gindex;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap2_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 4;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 2;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap2_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
sizeof ( TT_CMapRec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_InitFunc) tt_cmap_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap2_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap2_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
2,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap2_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap2_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_2 */
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 4 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 4 */
|
|
|
|
/* length 2 USHORT table length */
|
|
|
|
/* in bytes */
|
|
|
|
/* language 4 USHORT Mac language code */
|
|
|
|
/* */
|
|
|
|
/* segCountX2 6 USHORT 2*NUM_SEGS */
|
|
|
|
/* searchRange 8 USHORT 2*(1 << LOG_SEGS) */
|
|
|
|
/* entrySelector 10 USHORT LOG_SEGS */
|
|
|
|
/* rangeShift 12 USHORT segCountX2 - */
|
|
|
|
/* searchRange */
|
|
|
|
/* */
|
|
|
|
/* endCount 14 USHORT[NUM_SEGS] end charcode for */
|
|
|
|
/* each segment; last */
|
|
|
|
/* is 0xFFFF */
|
|
|
|
/* */
|
|
|
|
/* pad 14+NUM_SEGS*2 USHORT padding */
|
|
|
|
/* */
|
|
|
|
/* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */
|
|
|
|
/* each segment */
|
|
|
|
/* */
|
|
|
|
/* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */
|
|
|
|
/* segment */
|
|
|
|
/* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */
|
|
|
|
/* each segment; can be */
|
|
|
|
/* zero */
|
|
|
|
/* */
|
|
|
|
/* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph id */
|
|
|
|
/* ranges */
|
|
|
|
/* */
|
|
|
|
/* Character codes are modelled by a series of ordered (increasing) */
|
|
|
|
/* intervals called segments. Each segment has start and end codes, */
|
|
|
|
/* provided by the `startCount' and `endCount' arrays. Segments must */
|
|
|
|
/* not be overlapping and the last segment should always contain the */
|
|
|
|
/* `0xFFFF' endCount. */
|
|
|
|
/* */
|
|
|
|
/* The fields `searchRange', `entrySelector' and `rangeShift' are better */
|
|
|
|
/* ignored (they are traces of over-engineering in the TrueType */
|
|
|
|
/* specification). */
|
|
|
|
/* */
|
|
|
|
/* Each segment also has a signed `delta', as well as an optional offset */
|
|
|
|
/* within the `glyphIds' table. */
|
|
|
|
/* */
|
|
|
|
/* If a segment's idOffset is 0, the glyph index corresponding to any */
|
|
|
|
/* charcode within the segment is obtained by adding the value of */
|
|
|
|
/* `idDelta' directly to the charcode, modulo 65536. */
|
|
|
|
/* */
|
|
|
|
/* Otherwise, a glyph index is taken from the glyph ids sub-array for */
|
|
|
|
/* the segment, and the value of `idDelta' is added to it. */
|
|
|
|
/* */
|
2002-09-25 01:39:58 +02:00
|
|
|
/* */
|
|
|
|
/* Finally, note that certain fonts contain invalid charmaps that */
|
|
|
|
/* contain end=0xFFFF, start=0xFFFF, delta=0x0001, offset=0xFFFF at the */
|
|
|
|
/* of their charmaps (e.g. opens___.ttf which comes with OpenOffice.org) */
|
|
|
|
/* we need special code to deal with them correctly... */
|
|
|
|
/* */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_4
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
typedef struct TT_CMap4Rec_
|
2005-02-28 18:17:47 +01:00
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
TT_CMapRec cmap;
|
|
|
|
FT_UInt32 cur_charcode; /* current charcode */
|
|
|
|
FT_UInt cur_gindex; /* current glyph index */
|
|
|
|
|
|
|
|
FT_UInt num_ranges;
|
|
|
|
FT_UInt cur_range;
|
|
|
|
FT_UInt cur_start;
|
|
|
|
FT_UInt cur_end;
|
|
|
|
FT_Int cur_delta;
|
|
|
|
FT_Byte* cur_values;
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
} TT_CMap4Rec, *TT_CMap4;
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap4_init( TT_CMap4 cmap,
|
|
|
|
FT_Byte* table )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_Byte* p;
|
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
cmap->cmap.data = table;
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
p = table + 6;
|
2005-03-01 03:13:50 +01:00
|
|
|
cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1;
|
2005-11-29 12:32:53 +01:00
|
|
|
cmap->cur_charcode = 0xFFFFFFFFUL;
|
2005-02-28 18:17:47 +01:00
|
|
|
cmap->cur_gindex = 0;
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
return SFNT_Err_Ok;
|
2005-02-28 18:17:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_Int
|
|
|
|
tt_cmap4_set_range( TT_CMap4 cmap,
|
|
|
|
FT_UInt range_index )
|
|
|
|
{
|
|
|
|
FT_Byte* table = cmap->cmap.data;
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_UInt num_ranges = cmap->num_ranges;
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
while ( range_index < num_ranges )
|
|
|
|
{
|
|
|
|
FT_UInt offset;
|
|
|
|
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
p = table + 14 + range_index * 2;
|
|
|
|
cmap->cur_end = FT_PEEK_USHORT( p );
|
|
|
|
|
|
|
|
p += 2 + num_ranges * 2;
|
|
|
|
cmap->cur_start = FT_PEEK_USHORT( p );
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
p += num_ranges * 2;
|
|
|
|
cmap->cur_delta = FT_PEEK_SHORT( p );
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
p += num_ranges * 2;
|
* include/freetype/ftimage.h (FT_Raster_RenderFunc),
include/freetype/ftrender.h (FT_Glyph_TransformFunc,
FT_Renderer_Render_Func, FT_Renderer_TransformFunc),
src/base/ftglyph.c (ft_outline_glyph_transform),
src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render),
src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render),
src/smooth/ftsmooth.c (ft_smooth_transform,
ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Decorate parameters with `const' where
appropriate.
* src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete.
(ft_black_render): Decorate parameters with `const' where
appropriate.
* src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT ->
FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez
<ismail@kde.org.tr>.
2005-05-11 22:04:35 +02:00
|
|
|
offset = FT_PEEK_USHORT( p );
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
if ( offset != 0xFFFFU )
|
2005-02-28 18:17:47 +01:00
|
|
|
{
|
|
|
|
cmap->cur_values = offset ? p + offset : NULL;
|
|
|
|
cmap->cur_range = range_index;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* we skip empty segments */
|
|
|
|
range_index++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* search the index of the charcode next to cmap->cur_charcode; */
|
|
|
|
/* caller should call tt_cmap4_set_range with proper range */
|
|
|
|
/* before calling this function */
|
|
|
|
/* */
|
2005-02-28 18:17:47 +01:00
|
|
|
static void
|
|
|
|
tt_cmap4_next( TT_CMap4 cmap )
|
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_UInt charcode;
|
2007-01-16 07:11:27 +01:00
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( cmap->cur_charcode >= 0xFFFFUL )
|
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
charcode = cmap->cur_charcode + 1;
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode < cmap->cur_start )
|
|
|
|
charcode = cmap->cur_start;
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
for ( ;; )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_Byte* values = cmap->cur_values;
|
|
|
|
FT_UInt end = cmap->cur_end;
|
|
|
|
FT_Int delta = cmap->cur_delta;
|
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
if ( charcode <= end )
|
|
|
|
{
|
|
|
|
if ( values )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_Byte* p = values + 2 * ( charcode - cmap->cur_start );
|
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
do
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_UInt gindex = FT_NEXT_USHORT( p );
|
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
|
2005-02-28 18:17:47 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
|
|
|
cmap->cur_charcode = charcode;
|
|
|
|
cmap->cur_gindex = gindex;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2005-03-01 03:13:50 +01:00
|
|
|
} while ( ++charcode <= end );
|
2005-02-28 18:17:47 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
do
|
|
|
|
{
|
2005-03-01 03:13:50 +01:00
|
|
|
FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
|
|
|
|
|
2005-02-28 18:17:47 +01:00
|
|
|
|
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
|
|
|
cmap->cur_charcode = charcode;
|
|
|
|
cmap->cur_gindex = gindex;
|
|
|
|
return;
|
|
|
|
}
|
2005-03-01 03:13:50 +01:00
|
|
|
} while ( ++charcode <= end );
|
2005-02-28 18:17:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
/* we need to find another range */
|
|
|
|
if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
|
2005-02-28 18:17:47 +01:00
|
|
|
break;
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode < cmap->cur_start )
|
|
|
|
charcode = cmap->cur_start;
|
2005-02-28 18:17:47 +01:00
|
|
|
}
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
Fail:
|
|
|
|
cmap->cur_charcode = 0xFFFFFFFFUL;
|
|
|
|
cmap->cur_gindex = 0;
|
2005-02-28 18:17:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap4_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* p = table + 2; /* skip format */
|
|
|
|
FT_UInt length = TT_NEXT_USHORT( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids;
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_UInt num_segs;
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_Error error = SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-10-07 12:12:43 +02:00
|
|
|
|
* src/pfr/pfrsbit.h, src/pfr/pfrsbit.c, src/pfr/pfrload.c,
src/pfr/pfrgload.c, src/pfr/pfrobjs.c, src/pfr/pfrtypes.h,
Jamfile, src/base/ftobjs.c: adding support for embedded bitmaps to
the PFR driver, and rewriting its kerning loader / handler to use all
kerning pairs in a physical font (and not just the first item).
* src/tools/docmaker/content.py, src/tools/docmaker/sources.py,
src/tools/docmaker/tohtml.py: fixing a few nasty bugs
* src/sfnt/ttcmap0.c: the validator for format 4 sub-tables is
now capable of dealing with invalid "length" fields at the start
of the sub-table. This allows fonts like "mg______.ttf" (i.e.
Marriage) to return accurate charmaps.
2002-10-05 16:57:03 +02:00
|
|
|
if ( length < 16 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* in certain fonts, the `length' field is invalid and goes */
|
|
|
|
/* out of bound. We try to correct this here... */
|
* src/pfr/pfrsbit.h, src/pfr/pfrsbit.c, src/pfr/pfrload.c,
src/pfr/pfrgload.c, src/pfr/pfrobjs.c, src/pfr/pfrtypes.h,
Jamfile, src/base/ftobjs.c: adding support for embedded bitmaps to
the PFR driver, and rewriting its kerning loader / handler to use all
kerning pairs in a physical font (and not just the first item).
* src/tools/docmaker/content.py, src/tools/docmaker/sources.py,
src/tools/docmaker/tohtml.py: fixing a few nasty bugs
* src/sfnt/ttcmap0.c: the validator for format 4 sub-tables is
now capable of dealing with invalid "length" fields at the start
of the sub-table. This allows fonts like "mg______.ttf" (i.e.
Marriage) to return accurate charmaps.
2002-10-05 16:57:03 +02:00
|
|
|
if ( table + length > valid->limit )
|
|
|
|
{
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
FT_INVALID_TOO_SHORT;
|
|
|
|
|
|
|
|
length = (FT_UInt)( valid->limit - table );
|
|
|
|
}
|
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
p = table + 6;
|
2002-03-31 20:48:24 +02:00
|
|
|
num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID )
|
|
|
|
{
|
|
|
|
/* check that we have an even value here */
|
|
|
|
if ( num_segs & 1 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
num_segs /= 2;
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( length < 16 + num_segs * 2 * 4 )
|
|
|
|
FT_INVALID_TOO_SHORT;
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
/* check the search parameters - even though we never use them */
|
|
|
|
/* */
|
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID )
|
|
|
|
{
|
|
|
|
/* check the values of 'searchRange', 'entrySelector', 'rangeShift' */
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt search_range = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt entry_selector = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt range_shift = TT_NEXT_USHORT( p );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( ( search_range | range_shift ) & 1 ) /* must be even values */
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
search_range /= 2;
|
|
|
|
range_shift /= 2;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/* `search range' is the greatest power of 2 that is <= num_segs */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( search_range > num_segs ||
|
|
|
|
search_range * 2 < num_segs ||
|
|
|
|
search_range + range_shift != num_segs ||
|
|
|
|
search_range != ( 1U << entry_selector ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
ends = table + 14;
|
2002-03-31 20:48:24 +02:00
|
|
|
starts = table + 16 + num_segs * 2;
|
|
|
|
deltas = starts + num_segs * 2;
|
|
|
|
offsets = deltas + num_segs * 2;
|
|
|
|
glyph_ids = offsets + num_segs * 2;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check last segment, its end count must be FFFF */
|
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
p = ends + ( num_segs - 1 ) * 2;
|
|
|
|
if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_UInt start, end, offset, n;
|
|
|
|
FT_UInt last_start = 0, last_end = 0;
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Int delta;
|
2007-01-05 14:15:29 +01:00
|
|
|
FT_Byte* p_start = starts;
|
|
|
|
FT_Byte* p_end = ends;
|
|
|
|
FT_Byte* p_delta = deltas;
|
|
|
|
FT_Byte* p_offset = offsets;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( n = 0; n < num_segs; n++ )
|
|
|
|
{
|
2007-01-05 14:15:29 +01:00
|
|
|
p = p_offset;
|
|
|
|
start = TT_NEXT_USHORT( p_start );
|
|
|
|
end = TT_NEXT_USHORT( p_end );
|
|
|
|
delta = TT_NEXT_SHORT( p_delta );
|
|
|
|
offset = TT_NEXT_USHORT( p_offset );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-22 23:37:40 +01:00
|
|
|
if ( start > end )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-05-02 08:50:58 +02:00
|
|
|
/* this test should be performed at default validation level; */
|
|
|
|
/* unfortunately, some popular Asian fonts present overlapping */
|
|
|
|
/* ranges in their charmaps */
|
2002-05-01 10:40:32 +02:00
|
|
|
/* */
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( start <= last_end && n > 0 )
|
2002-05-01 10:40:32 +02:00
|
|
|
{
|
2005-05-10 00:11:36 +02:00
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
2002-05-01 10:40:32 +02:00
|
|
|
FT_INVALID_DATA;
|
2005-05-10 00:11:36 +02:00
|
|
|
else
|
2005-11-29 12:32:53 +01:00
|
|
|
{
|
|
|
|
/* allow overlapping segments, provided their start points */
|
|
|
|
/* and end points, respectively, are in ascending order. */
|
|
|
|
/* */
|
|
|
|
if ( last_start > start || last_end > end )
|
|
|
|
error |= TT_CMAP_FLAG_UNSORTED;
|
|
|
|
else
|
2005-11-30 19:47:49 +01:00
|
|
|
error |= TT_CMAP_FLAG_OVERLAPPING;
|
2005-11-29 12:32:53 +01:00
|
|
|
}
|
2002-05-01 10:40:32 +02:00
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-09-25 01:39:58 +02:00
|
|
|
if ( offset && offset != 0xFFFFU )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
|
|
|
p += offset; /* start of glyph id array */
|
|
|
|
|
|
|
|
/* check that we point within the glyph ids table only */
|
2003-04-23 20:21:48 +02:00
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
|
|
|
if ( p < glyph_ids ||
|
|
|
|
p + ( end - start + 1 ) * 2 > table + length )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( p < glyph_ids ||
|
|
|
|
p + ( end - start + 1 ) * 2 > valid->limit )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
/* check glyph indices within the segment range */
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
2002-09-25 01:39:58 +02:00
|
|
|
FT_UInt i, idx;
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-09-25 01:39:58 +02:00
|
|
|
for ( i = start; i < end; i++ )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = FT_NEXT_USHORT( p );
|
|
|
|
if ( idx != 0 )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
2002-09-25 01:39:58 +02:00
|
|
|
else if ( offset == 0xFFFFU )
|
|
|
|
{
|
|
|
|
/* Some fonts (erroneously?) use a range offset of 0xFFFF */
|
|
|
|
/* to mean missing glyph in cmap table */
|
|
|
|
/* */
|
|
|
|
if ( valid->level >= FT_VALIDATE_PARANOID ||
|
|
|
|
n != num_segs - 1 ||
|
|
|
|
!( start == 0xFFFFU && end == 0xFFFFU && delta == 0x1U ) )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
}
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
last_start = start;
|
2005-11-30 19:47:49 +01:00
|
|
|
last_end = end;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return error;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
static FT_UInt
|
|
|
|
tt_cmap4_char_map_linear( TT_CMap cmap,
|
|
|
|
FT_UInt* pcharcode,
|
|
|
|
FT_Bool next )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_UInt num_segs2, start, end, offset;
|
|
|
|
FT_Int delta;
|
|
|
|
FT_UInt i, num_segs;
|
|
|
|
FT_UInt32 charcode = *pcharcode;
|
2005-11-30 19:47:49 +01:00
|
|
|
FT_UInt gindex = 0;
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_Byte* p;
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
p = cmap->data + 6;
|
|
|
|
num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
num_segs = num_segs2 >> 1;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( !num_segs )
|
|
|
|
return 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( next )
|
|
|
|
charcode++;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* linear search */
|
|
|
|
for ( ; charcode <= 0xFFFFU; charcode++ )
|
|
|
|
{
|
|
|
|
FT_Byte* q;
|
2007-01-16 07:11:27 +01:00
|
|
|
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
p = cmap->data + 14; /* ends table */
|
|
|
|
q = cmap->data + 16 + num_segs2; /* starts table */
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
for ( i = 0; i < num_segs; i++ )
|
|
|
|
{
|
|
|
|
end = TT_NEXT_USHORT( p );
|
|
|
|
start = TT_NEXT_USHORT( q );
|
2002-09-25 01:39:58 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode >= start && charcode <= end )
|
|
|
|
{
|
|
|
|
p = q - 2 + num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( offset == 0xFFFFU )
|
|
|
|
continue;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( offset )
|
|
|
|
{
|
|
|
|
p += offset + ( charcode - start ) * 2;
|
|
|
|
gindex = TT_PEEK_USHORT( p );
|
|
|
|
if ( gindex != 0 )
|
|
|
|
gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
|
2002-05-01 10:40:32 +02:00
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
else
|
|
|
|
gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
|
|
|
|
|
|
|
|
break;
|
2002-05-01 10:40:32 +02:00
|
|
|
}
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( !next || gindex )
|
|
|
|
break;
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( next && gindex )
|
|
|
|
*pcharcode = charcode;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
return gindex;
|
|
|
|
}
|
2002-06-11 01:03:35 +02:00
|
|
|
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
static FT_UInt
|
2005-11-30 19:47:49 +01:00
|
|
|
tt_cmap4_char_map_binary( TT_CMap cmap,
|
|
|
|
FT_UInt* pcharcode,
|
|
|
|
FT_Bool next )
|
2005-11-29 12:32:53 +01:00
|
|
|
{
|
|
|
|
FT_UInt num_segs2, start, end, offset;
|
|
|
|
FT_Int delta;
|
|
|
|
FT_UInt max, min, mid, num_segs;
|
|
|
|
FT_UInt charcode = *pcharcode;
|
2005-11-30 19:47:49 +01:00
|
|
|
FT_UInt gindex = 0;
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_Byte* p;
|
2007-01-16 07:11:27 +01:00
|
|
|
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
p = cmap->data + 6;
|
|
|
|
num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-30 03:39:10 +01:00
|
|
|
if ( !num_segs2 )
|
|
|
|
return 0;
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
num_segs = num_segs2 >> 1;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-30 03:39:10 +01:00
|
|
|
/* make compiler happy */
|
|
|
|
mid = num_segs;
|
|
|
|
end = 0xFFFFU;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( next )
|
|
|
|
charcode++;
|
2002-09-25 01:39:58 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
min = 0;
|
|
|
|
max = num_segs;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* binary search */
|
|
|
|
while ( min < max )
|
|
|
|
{
|
|
|
|
mid = ( min + max ) >> 1;
|
|
|
|
p = cmap->data + 14 + mid * 2;
|
|
|
|
end = TT_PEEK_USHORT( p );
|
|
|
|
p += 2 + num_segs2;
|
|
|
|
start = TT_PEEK_USHORT( p );
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode < start )
|
|
|
|
max = mid;
|
|
|
|
else if ( charcode > end )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
|
|
|
{
|
2005-11-30 19:47:49 +01:00
|
|
|
p += num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* search the first segment containing `charcode' */
|
|
|
|
if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
|
2005-11-29 12:32:53 +01:00
|
|
|
{
|
|
|
|
FT_UInt i;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* call the current segment `max' */
|
|
|
|
max = mid;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( offset == 0xFFFFU )
|
|
|
|
mid = max + 1;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* search in segments before the current segment */
|
2005-11-29 12:32:53 +01:00
|
|
|
for ( i = max ; i > 0; i-- )
|
|
|
|
{
|
2006-09-29 20:22:11 +02:00
|
|
|
FT_UInt prev_end;
|
|
|
|
FT_Byte* old_p;
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-03-01 03:13:50 +01:00
|
|
|
|
2006-09-29 20:22:11 +02:00
|
|
|
old_p = p;
|
|
|
|
p = cmap->data + 14 + ( i - 1 ) * 2;
|
2005-11-29 12:32:53 +01:00
|
|
|
prev_end = TT_PEEK_USHORT( p );
|
2005-02-28 18:17:47 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode > prev_end )
|
2006-09-29 20:22:11 +02:00
|
|
|
{
|
|
|
|
p = old_p;
|
2005-11-29 12:32:53 +01:00
|
|
|
break;
|
2006-09-29 20:22:11 +02:00
|
|
|
}
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
end = prev_end;
|
|
|
|
p += 2 + num_segs2;
|
|
|
|
start = TT_PEEK_USHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2005-05-10 00:11:36 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( offset != 0xFFFFU )
|
|
|
|
mid = i - 1;
|
2005-05-10 00:11:36 +02:00
|
|
|
}
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* no luck */
|
|
|
|
if ( mid == max + 1 )
|
|
|
|
{
|
|
|
|
if ( i != max )
|
|
|
|
{
|
2005-11-30 19:47:49 +01:00
|
|
|
p = cmap->data + 14 + max * 2;
|
|
|
|
end = TT_PEEK_USHORT( p );
|
|
|
|
p += 2 + num_segs2;
|
|
|
|
start = TT_PEEK_USHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2005-11-29 12:32:53 +01:00
|
|
|
}
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
mid = max;
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* search in segments after the current segment */
|
2005-11-29 12:32:53 +01:00
|
|
|
for ( i = max + 1; i < num_segs; i++ )
|
|
|
|
{
|
|
|
|
FT_UInt next_end, next_start;
|
2003-05-07 12:21:13 +02:00
|
|
|
|
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
p = cmap->data + 14 + i * 2;
|
|
|
|
next_end = TT_PEEK_USHORT( p );
|
|
|
|
p += 2 + num_segs2;
|
|
|
|
next_start = TT_PEEK_USHORT( p );
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode < next_start )
|
|
|
|
break;
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
end = next_end;
|
|
|
|
start = next_start;
|
|
|
|
p += num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2005-11-29 12:32:53 +01:00
|
|
|
|
|
|
|
if ( offset != 0xFFFFU )
|
|
|
|
mid = i;
|
|
|
|
}
|
|
|
|
i--;
|
|
|
|
|
|
|
|
/* still no luck */
|
|
|
|
if ( mid == max )
|
2003-05-07 12:21:13 +02:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
mid = i;
|
|
|
|
|
|
|
|
break;
|
2003-05-07 12:21:13 +02:00
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
}
|
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* end, start, delta, and offset are for the i'th segment */
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( mid != i )
|
|
|
|
{
|
2005-11-30 19:47:49 +01:00
|
|
|
p = cmap->data + 14 + mid * 2;
|
|
|
|
end = TT_PEEK_USHORT( p );
|
|
|
|
p += 2 + num_segs2;
|
|
|
|
start = TT_PEEK_USHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
delta = TT_PEEK_SHORT( p );
|
|
|
|
p += num_segs2;
|
|
|
|
offset = TT_PEEK_USHORT( p );
|
2003-05-07 12:21:13 +02:00
|
|
|
}
|
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
else
|
2005-05-10 00:11:36 +02:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( offset == 0xFFFFU )
|
|
|
|
break;
|
2005-05-10 00:11:36 +02:00
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
|
|
|
|
if ( offset )
|
2003-05-07 12:21:13 +02:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
p += offset + ( charcode - start ) * 2;
|
|
|
|
gindex = TT_PEEK_USHORT( p );
|
2005-05-10 00:11:36 +02:00
|
|
|
if ( gindex != 0 )
|
2005-11-29 12:32:53 +01:00
|
|
|
gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
|
2003-05-07 12:21:13 +02:00
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
else
|
|
|
|
gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
|
|
|
|
|
|
|
|
break;
|
2003-05-07 12:21:13 +02:00
|
|
|
}
|
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
|
|
|
|
if ( next )
|
2003-05-07 12:21:13 +02:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
TT_CMap4 cmap4 = (TT_CMap4)cmap;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
/* if `charcode' is not in any segment, then `mid' is */
|
|
|
|
/* the segment nearest to `charcode' */
|
|
|
|
/* */
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( charcode > end )
|
|
|
|
{
|
|
|
|
mid++;
|
|
|
|
if ( mid == num_segs )
|
|
|
|
return 0;
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( tt_cmap4_set_range( cmap4, mid ) )
|
|
|
|
{
|
|
|
|
if ( gindex )
|
|
|
|
*pcharcode = charcode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cmap4->cur_charcode = charcode;
|
|
|
|
|
|
|
|
if ( gindex )
|
|
|
|
cmap4->cur_gindex = gindex;
|
|
|
|
else
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
cmap4->cur_charcode = charcode;
|
|
|
|
tt_cmap4_next( cmap4 );
|
|
|
|
gindex = cmap4->cur_gindex;
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( gindex )
|
|
|
|
*pcharcode = cmap4->cur_charcode;
|
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
return gindex;
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap4_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
|
|
|
{
|
2005-11-30 19:47:49 +01:00
|
|
|
if ( char_code >= 0x10000UL )
|
2005-11-29 12:32:53 +01:00
|
|
|
return 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
|
|
|
|
return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
|
|
|
|
else
|
|
|
|
return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
|
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap4_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
|
|
|
{
|
|
|
|
FT_UInt gindex;
|
|
|
|
|
|
|
|
|
|
|
|
if ( *pchar_code >= 0xFFFFU )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
|
|
|
|
gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TT_CMap4 cmap4 = (TT_CMap4)cmap;
|
|
|
|
|
|
|
|
|
|
|
|
/* no need to search */
|
|
|
|
if ( *pchar_code == cmap4->cur_charcode )
|
|
|
|
{
|
|
|
|
tt_cmap4_next( cmap4 );
|
|
|
|
gindex = cmap4->cur_gindex;
|
|
|
|
if ( gindex )
|
|
|
|
*pchar_code = cmap4->cur_charcode;
|
2005-05-10 00:11:36 +02:00
|
|
|
}
|
2005-11-29 12:32:53 +01:00
|
|
|
else
|
|
|
|
gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
2003-05-07 12:21:13 +02:00
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
return gindex;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap4_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 4;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 4;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap4_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2005-02-28 18:17:47 +01:00
|
|
|
sizeof ( TT_CMap4Rec ),
|
|
|
|
(FT_CMap_InitFunc) tt_cmap4_init,
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap4_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap4_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
4,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap4_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap4_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_4 */
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 6 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 4 */
|
|
|
|
/* length 2 USHORT table length in bytes */
|
|
|
|
/* language 4 USHORT Mac language code */
|
|
|
|
/* */
|
|
|
|
/* first 6 USHORT first segment code */
|
|
|
|
/* count 8 USHORT segment size in chars */
|
|
|
|
/* glyphIds 10 USHORT[count] glyph ids */
|
|
|
|
/* */
|
|
|
|
/* A very simplified segment mapping. */
|
|
|
|
/* */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_6
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap6_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte* p;
|
2003-04-23 21:48:24 +02:00
|
|
|
FT_UInt length, count;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( table + 10 > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
p = table + 2;
|
2002-03-31 20:48:24 +02:00
|
|
|
length = TT_NEXT_USHORT( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2003-04-23 21:48:24 +02:00
|
|
|
p = table + 8; /* skip language and start index */
|
2002-03-31 20:48:24 +02:00
|
|
|
count = TT_NEXT_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( table + length > valid->limit || length < 10 + count * 2 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check glyph indices */
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
|
|
|
FT_UInt gindex;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( ; count > 0; count-- )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = TT_NEXT_USHORT( p );
|
|
|
|
if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap6_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
2002-02-22 19:28:11 +01:00
|
|
|
FT_UInt result = 0;
|
|
|
|
FT_Byte* p = table + 6;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt start = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt count = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt idx = (FT_UInt)( char_code - start );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx < count )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
p += 2 * idx;
|
|
|
|
result = TT_PEEK_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-31 20:48:24 +02:00
|
|
|
tt_cmap6_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt32 result = 0;
|
|
|
|
FT_UInt32 char_code = *pchar_code + 1;
|
|
|
|
FT_UInt gindex = 0;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_Byte* p = table + 6;
|
|
|
|
FT_UInt start = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt count = TT_NEXT_USHORT( p );
|
|
|
|
FT_UInt idx;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
if ( char_code >= 0x10000UL )
|
2002-02-22 19:28:11 +01:00
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
if ( char_code < start )
|
|
|
|
char_code = start;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = (FT_UInt)( char_code - start );
|
|
|
|
p += 2 * idx;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
for ( ; idx < count; idx++ )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = TT_NEXT_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
|
|
|
result = char_code;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
char_code++;
|
|
|
|
}
|
|
|
|
|
|
|
|
Exit:
|
2002-03-22 16:02:38 +01:00
|
|
|
*pchar_code = result;
|
|
|
|
return gindex;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-02-28 17:10:29 +01:00
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap6_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 4;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 6;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap6_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
sizeof ( TT_CMapRec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_InitFunc) tt_cmap_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap6_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap6_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
6,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap6_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap6_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_6 */
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 8 *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** It's hard to completely understand what the OpenType spec *****/
|
|
|
|
/***** says about this format, but here is my conclusion. *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** The purpose of this format is to easily map UTF-16 text to *****/
|
|
|
|
/***** glyph indices. Basically, the `char_code' must be in one of *****/
|
|
|
|
/***** the following formats: *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** - A 16-bit value that isn't part of the Unicode Surrogates *****/
|
|
|
|
/***** Area (i.e. U+D800-U+DFFF). *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** - A 32-bit value, made of two surrogate values, i.e.. if *****/
|
|
|
|
/***** `char_code = (char_hi << 16) | char_lo', then both *****/
|
|
|
|
/***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/
|
|
|
|
/***** Area. *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** The 'is32' table embedded in the charmap indicates whether a *****/
|
|
|
|
/***** given 16-bit value is in the surrogates area or not. *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** So, for any given `char_code', we can assert the following: *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/
|
|
|
|
/***** *****/
|
|
|
|
/***** If `char_hi != 0' then we must have both *****/
|
|
|
|
/***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 8 */
|
2007-01-26 23:18:56 +01:00
|
|
|
/* reserved 2 USHORT reserved */
|
2002-03-31 20:48:24 +02:00
|
|
|
/* length 4 ULONG length in bytes */
|
|
|
|
/* language 8 ULONG Mac language code */
|
|
|
|
/* is32 12 BYTE[8192] 32-bitness bitmap */
|
|
|
|
/* count 8204 ULONG number of groups */
|
|
|
|
/* */
|
|
|
|
/* This header is followed by 'count' groups of the following format: */
|
|
|
|
/* */
|
|
|
|
/* start 0 ULONG first charcode */
|
|
|
|
/* end 4 ULONG last charcode */
|
|
|
|
/* startId 8 ULONG start glyph id for the group */
|
|
|
|
/* */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_8
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap8_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
|
|
|
FT_Byte* p = table + 4;
|
|
|
|
FT_Byte* is32;
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_UInt32 length;
|
|
|
|
FT_UInt32 num_groups;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( table + 16 + 8192 > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
length = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
if ( table + length > valid->limit || length < 8208 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
is32 = table + 12;
|
2002-03-31 20:48:24 +02:00
|
|
|
p = is32 + 8192; /* skip `is32' array */
|
|
|
|
num_groups = TT_NEXT_ULONG( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( p + num_groups * 12 > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check groups, they must be in increasing order */
|
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_UInt32 n, start, end, start_id, count, last = 0;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( n = 0; n < num_groups; n++ )
|
|
|
|
{
|
|
|
|
FT_UInt hi, lo;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
|
|
|
start_id = TT_NEXT_ULONG( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( start > end )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( n > 0 && start <= last )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
count = (FT_UInt32)( end - start + 1 );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( start & ~0xFFFFU )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
/* start_hi != 0; check that is32[i] is 1 for each i in */
|
|
|
|
/* the `hi' and `lo' of the range [start..end] */
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( ; count > 0; count--, start++ )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
hi = (FT_UInt)( start >> 16 );
|
|
|
|
lo = (FT_UInt)( start & 0xFFFFU );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
/* start_hi == 0; check that is32[i] is 0 for each i in */
|
2002-02-22 19:28:11 +01:00
|
|
|
/* the range [start..end] */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/* end_hi cannot be != 0! */
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( end & ~0xFFFFU )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( ; count > 0; count--, start++ )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
lo = (FT_UInt)( start & 0xFFFFU );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
last = end;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-31 20:48:24 +02:00
|
|
|
tt_cmap8_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt result = 0;
|
|
|
|
FT_Byte* p = table + 8204;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt32 num_groups = TT_NEXT_ULONG( p );
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_UInt32 start, end, start_id;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( ; num_groups > 0; num_groups-- )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
|
|
|
start_id = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( char_code < start )
|
|
|
|
break;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( char_code <= end )
|
|
|
|
{
|
2002-09-28 18:40:57 +02:00
|
|
|
result = (FT_UInt)( start_id + char_code - start );
|
2002-02-22 19:28:11 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-31 20:48:24 +02:00
|
|
|
tt_cmap8_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_UInt32 result = 0;
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_UInt32 char_code = *pchar_code + 1;
|
2002-02-22 19:28:11 +01:00
|
|
|
FT_UInt gindex = 0;
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte* p = table + 8204;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt32 num_groups = TT_NEXT_ULONG( p );
|
2002-07-01 23:50:12 +02:00
|
|
|
FT_UInt32 start, end, start_id;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
p = table + 8208;
|
|
|
|
|
2002-07-01 23:50:12 +02:00
|
|
|
for ( ; num_groups > 0; num_groups-- )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
|
|
|
start_id = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( char_code < start )
|
|
|
|
char_code = start;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( char_code <= end )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = (FT_UInt)( char_code - start + start_id );
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
{
|
|
|
|
result = char_code;
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
Exit:
|
2002-03-22 16:02:38 +01:00
|
|
|
*pchar_code = result;
|
|
|
|
return gindex;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap8_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 8;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 8;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap8_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
sizeof ( TT_CMapRec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_InitFunc) tt_cmap_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap8_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap8_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
8,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap8_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap8_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_8 */
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 10 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 10 */
|
|
|
|
/* reserved 2 USHORT reserved */
|
|
|
|
/* length 4 ULONG length in bytes */
|
|
|
|
/* language 8 ULONG Mac language code */
|
|
|
|
/* */
|
|
|
|
/* start 12 ULONG first char in range */
|
|
|
|
/* count 16 ULONG number of chars in range */
|
|
|
|
/* glyphIds 20 USHORT[count] glyph indices covered */
|
|
|
|
/* */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_10
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap10_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte* p = table + 4;
|
2003-04-23 21:48:24 +02:00
|
|
|
FT_ULong length, count;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( table + 20 > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
length = TT_NEXT_ULONG( p );
|
2003-04-23 21:48:24 +02:00
|
|
|
p = table + 16;
|
2002-03-31 20:48:24 +02:00
|
|
|
count = TT_NEXT_ULONG( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( table + length > valid->limit || length < 20 + count * 2 )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
/* check glyph indices */
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
|
|
|
FT_UInt gindex;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
for ( ; count > 0; count-- )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = TT_NEXT_USHORT( p );
|
|
|
|
if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap10_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt result = 0;
|
|
|
|
FT_Byte* p = table + 12;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt32 start = TT_NEXT_ULONG( p );
|
|
|
|
FT_UInt32 count = TT_NEXT_ULONG( p );
|
|
|
|
FT_UInt32 idx = (FT_ULong)( char_code - start );
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( idx < count )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
p += 2 * idx;
|
|
|
|
result = TT_PEEK_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
2002-03-01 03:26:22 +01:00
|
|
|
tt_cmap10_char_next( TT_CMap cmap,
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_UInt32 *pchar_code )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_Byte* table = cmap->data;
|
|
|
|
FT_UInt32 char_code = *pchar_code + 1;
|
|
|
|
FT_UInt gindex = 0;
|
|
|
|
FT_Byte* p = table + 12;
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_UInt32 start = TT_NEXT_ULONG( p );
|
|
|
|
FT_UInt32 count = TT_NEXT_ULONG( p );
|
|
|
|
FT_UInt32 idx;
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
if ( char_code < start )
|
|
|
|
char_code = start;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
idx = (FT_UInt32)( char_code - start );
|
|
|
|
p += 2 * idx;
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
for ( ; idx < count; idx++ )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
gindex = TT_NEXT_USHORT( p );
|
2002-02-22 19:28:11 +01:00
|
|
|
if ( gindex != 0 )
|
|
|
|
break;
|
|
|
|
char_code++;
|
|
|
|
}
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
*pchar_code = char_code;
|
|
|
|
return gindex;
|
2002-02-22 19:28:11 +01:00
|
|
|
}
|
|
|
|
|
2002-02-28 17:10:29 +01:00
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap10_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 8;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 10;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap10_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
sizeof ( TT_CMapRec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_InitFunc) tt_cmap_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap10_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap10_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
10,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap10_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap10_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_10 */
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 12 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 12 */
|
|
|
|
/* reserved 2 USHORT reserved */
|
|
|
|
/* length 4 ULONG length in bytes */
|
|
|
|
/* language 8 ULONG Mac language code */
|
|
|
|
/* count 12 ULONG number of groups */
|
|
|
|
/* 16 */
|
|
|
|
/* */
|
|
|
|
/* This header is followed by `count' groups of the following format: */
|
|
|
|
/* */
|
|
|
|
/* start 0 ULONG first charcode */
|
|
|
|
/* end 4 ULONG last charcode */
|
|
|
|
/* startId 8 ULONG start glyph id for the group */
|
|
|
|
/* */
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_12
|
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
typedef struct TT_CMap12Rec_
|
|
|
|
{
|
|
|
|
TT_CMapRec cmap;
|
|
|
|
FT_Bool valid;
|
|
|
|
FT_ULong cur_charcode;
|
|
|
|
FT_UInt cur_gindex;
|
|
|
|
FT_ULong cur_group;
|
|
|
|
FT_ULong num_groups;
|
|
|
|
|
|
|
|
} TT_CMap12Rec, *TT_CMap12;
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap12_init( TT_CMap12 cmap,
|
2005-11-30 19:47:49 +01:00
|
|
|
FT_Byte* table )
|
2005-11-29 12:27:51 +01:00
|
|
|
{
|
2005-11-30 19:47:49 +01:00
|
|
|
cmap->cmap.data = table;
|
2005-11-29 12:27:51 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
table += 12;
|
|
|
|
cmap->num_groups = FT_PEEK_ULONG( table );
|
2005-11-29 12:27:51 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
cmap->valid = 0;
|
2005-11-29 12:27:51 +01:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
2002-02-22 19:28:11 +01:00
|
|
|
tt_cmap12_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_Byte* p;
|
|
|
|
FT_ULong length;
|
|
|
|
FT_ULong num_groups;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
if ( table + 16 > valid->limit )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
p = table + 4;
|
2002-03-31 20:48:24 +02:00
|
|
|
length = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
p = table + 12;
|
2002-03-31 20:48:24 +02:00
|
|
|
num_groups = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( table + length > valid->limit || length < 16 + 12 * num_groups )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_TOO_SHORT;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
/* check groups, they must be in increasing order */
|
|
|
|
{
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_ULong n, start, end, start_id, last = 0;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
for ( n = 0; n < num_groups; n++ )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
|
|
|
start_id = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
if ( start > end )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
if ( n > 0 && start <= last )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_DATA;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT )
|
|
|
|
{
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
|
2002-03-22 16:02:38 +01:00
|
|
|
FT_INVALID_GLYPH_ID;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
last = end;
|
|
|
|
}
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
|
|
|
|
2002-02-22 19:28:11 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
/* search the index of the charcode next to cmap->cur_charcode */
|
|
|
|
/* cmap->cur_group should be set up properly by caller */
|
|
|
|
/* */
|
2005-11-29 12:27:51 +01:00
|
|
|
static void
|
|
|
|
tt_cmap12_next( TT_CMap12 cmap )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
FT_Byte* p;
|
|
|
|
FT_ULong start, end, start_id, char_code;
|
|
|
|
FT_ULong n;
|
|
|
|
FT_UInt gindex;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
|
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
char_code = cmap->cur_charcode + 1;
|
|
|
|
|
|
|
|
n = cmap->cur_group;
|
|
|
|
|
|
|
|
for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
p = cmap->cmap.data + 16 + 12 * n;
|
2002-03-31 20:48:24 +02:00
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
2005-11-29 12:27:51 +01:00
|
|
|
start_id = TT_PEEK_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
if ( char_code < start )
|
2005-11-29 12:27:51 +01:00
|
|
|
char_code = start;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
for ( ; char_code <= end; char_code++ )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
gindex = (FT_UInt)( start_id + char_code - start );
|
|
|
|
|
|
|
|
if ( gindex )
|
|
|
|
{
|
|
|
|
cmap->cur_charcode = char_code;;
|
|
|
|
cmap->cur_gindex = gindex;
|
|
|
|
cmap->cur_group = n;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
|
|
|
}
|
2005-11-29 12:27:51 +01:00
|
|
|
|
|
|
|
Fail:
|
|
|
|
cmap->valid = 0;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
static FT_UInt
|
|
|
|
tt_cmap12_char_map_binary( TT_CMap cmap,
|
|
|
|
FT_UInt32* pchar_code,
|
|
|
|
FT_Bool next )
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-27 22:25:47 +01:00
|
|
|
FT_UInt gindex = 0;
|
2005-11-29 12:27:51 +01:00
|
|
|
FT_Byte* p = cmap->data + 12;
|
|
|
|
FT_UInt32 num_groups = TT_PEEK_ULONG( p );
|
|
|
|
FT_UInt32 char_code = *pchar_code;
|
2002-07-01 23:50:12 +02:00
|
|
|
FT_UInt32 start, end, start_id;
|
2005-11-29 12:27:51 +01:00
|
|
|
FT_UInt32 max, min, mid;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
if ( !num_groups )
|
|
|
|
return 0;
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2005-11-30 03:39:10 +01:00
|
|
|
/* make compiler happy */
|
|
|
|
mid = num_groups;
|
|
|
|
end = 0xFFFFFFFFUL;
|
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
if ( next )
|
|
|
|
char_code++;
|
|
|
|
|
|
|
|
min = 0;
|
|
|
|
max = num_groups;
|
|
|
|
|
|
|
|
/* binary search */
|
|
|
|
while ( min < max )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
mid = ( min + max ) >> 1;
|
2005-11-30 19:47:49 +01:00
|
|
|
p = cmap->data + 16 + 12 * mid;
|
2005-11-29 12:27:51 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
start = TT_NEXT_ULONG( p );
|
|
|
|
end = TT_NEXT_ULONG( p );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
|
|
|
if ( char_code < start )
|
2005-11-29 12:27:51 +01:00
|
|
|
max = mid;
|
|
|
|
else if ( char_code > end )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
start_id = TT_PEEK_ULONG( p );
|
|
|
|
gindex = (FT_UInt)( start_id + char_code - start );
|
2002-02-27 22:25:47 +01:00
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( next )
|
|
|
|
{
|
|
|
|
TT_CMap12 cmap12 = (TT_CMap12)cmap;
|
|
|
|
|
|
|
|
|
|
|
|
/* if `char_code' is not in any group, then `mid' is */
|
|
|
|
/* the group nearest to `char_code' */
|
|
|
|
/* */
|
|
|
|
|
|
|
|
if ( char_code > end )
|
2002-02-27 22:25:47 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
mid++;
|
|
|
|
if ( mid == num_groups )
|
|
|
|
return 0;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
2005-11-29 12:27:51 +01:00
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
cmap12->valid = 1;
|
2005-11-29 12:27:51 +01:00
|
|
|
cmap12->cur_charcode = char_code;
|
2005-11-30 19:47:49 +01:00
|
|
|
cmap12->cur_group = mid;
|
2005-11-29 12:27:51 +01:00
|
|
|
|
|
|
|
if ( !gindex )
|
|
|
|
{
|
|
|
|
tt_cmap12_next( cmap12 );
|
|
|
|
|
|
|
|
if ( cmap12->valid )
|
|
|
|
gindex = cmap12->cur_gindex;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
cmap12->cur_gindex = gindex;
|
|
|
|
|
|
|
|
if ( gindex )
|
|
|
|
*pchar_code = cmap12->cur_charcode;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
return gindex;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap12_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
|
|
|
{
|
|
|
|
return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap12_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
|
|
|
{
|
|
|
|
TT_CMap12 cmap12 = (TT_CMap12)cmap;
|
|
|
|
FT_ULong gindex;
|
|
|
|
|
|
|
|
|
|
|
|
if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* no need to search */
|
|
|
|
if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
|
|
|
|
{
|
|
|
|
tt_cmap12_next( cmap12 );
|
|
|
|
if ( cmap12->valid )
|
|
|
|
{
|
|
|
|
gindex = cmap12->cur_gindex;
|
|
|
|
if ( gindex )
|
|
|
|
*pchar_code = cmap12->cur_charcode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
gindex = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
return gindex;
|
2002-02-27 22:25:47 +01:00
|
|
|
}
|
2002-02-22 19:28:11 +01:00
|
|
|
|
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap12_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_Byte* p = cmap->data + 8;
|
|
|
|
|
|
|
|
|
2007-05-19 09:18:48 +02:00
|
|
|
cmap_info->format = 12;
|
2003-12-17 15:28:22 +01:00
|
|
|
cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
|
|
|
|
|
* include/freetype/internal/ftobjs.h: Don't include
FT_CONFIG_STANDARD_LIBRARY_H.
(FT_Validator, FT_VAlidationLevel, FT_ValidatorRec, FT_VALIDATOR,
ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
* include/freetype/internal/ftvalid.h: New file.
Make FT_INVALID return module-specific error codes.
* include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
macro.
* include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
FT_KEEP_ERR_PREFIX isn't defined.
* src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
* src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
FT_INTERNAL_VALIDATE_H.
Include sferrors.h before FT_INTERNAL_VALIDATE_H.
s/FT_Err_Ok/SFNT_Err_Ok/.
* src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
* src/type1/t1afm.c: Include t1errors.h.
2004-09-06 09:06:56 +02:00
|
|
|
return SFNT_Err_Ok;
|
2003-12-17 15:28:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap12_class_rec =
|
2002-02-22 19:28:11 +01:00
|
|
|
{
|
2002-02-28 17:10:29 +01:00
|
|
|
{
|
2005-11-29 12:27:51 +01:00
|
|
|
sizeof ( TT_CMap12Rec ),
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2005-11-29 12:27:51 +01:00
|
|
|
(FT_CMap_InitFunc) tt_cmap12_init,
|
2002-03-31 20:48:24 +02:00
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap12_char_index,
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
(FT_CMap_CharNextFunc) tt_cmap12_char_next,
|
|
|
|
|
|
|
|
NULL, NULL, NULL, NULL, NULL
|
2002-02-28 17:10:29 +01:00
|
|
|
},
|
2002-03-01 03:26:22 +01:00
|
|
|
12,
|
2003-12-17 15:28:22 +01:00
|
|
|
(TT_CMap_ValidateFunc) tt_cmap12_validate,
|
|
|
|
(TT_CMap_Info_GetFunc) tt_cmap12_get_info
|
2002-02-22 19:28:11 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_12 */
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/***** *****/
|
|
|
|
/***** FORMAT 14 *****/
|
|
|
|
/***** *****/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* TABLE OVERVIEW */
|
|
|
|
/* -------------- */
|
|
|
|
/* */
|
|
|
|
/* NAME OFFSET TYPE DESCRIPTION */
|
|
|
|
/* */
|
|
|
|
/* format 0 USHORT must be 14 */
|
|
|
|
/* length 2 ULONG table length in bytes */
|
|
|
|
/* numSelector 6 ULONG number of variation sel. records */
|
|
|
|
/* */
|
|
|
|
/* Followed by numSelector records, each of which looks like */
|
|
|
|
/* */
|
|
|
|
/* varSelector 0 UINT24 Unicode codepoint of sel. */
|
|
|
|
/* defaultOff 3 ULONG offset to a default UVS table */
|
|
|
|
/* describing any variants to be found in */
|
|
|
|
/* the normal Unicode subtable. */
|
|
|
|
/* nonDefOff 7 ULONG offset to a non-default UVS table */
|
|
|
|
/* describing any variants not in the */
|
|
|
|
/* standard cmap, with GIDs here */
|
|
|
|
/* (either offset may be 0 NULL) */
|
|
|
|
/* */
|
|
|
|
/* Selectors are sorted by code point. */
|
|
|
|
/* */
|
|
|
|
/* A default Unicode Variation Selector (UVS) subtable is just a list of */
|
|
|
|
/* ranges of code points which are to be found in the standard cmap. No */
|
|
|
|
/* glyph IDs (GIDs) here. */
|
|
|
|
/* */
|
|
|
|
/* numRanges 0 ULONG number of ranges following */
|
|
|
|
/* */
|
|
|
|
/* A range looks like */
|
|
|
|
/* */
|
|
|
|
/* uniStart 0 UINT24 code point of the first character in */
|
|
|
|
/* this range */
|
|
|
|
/* additionalCnt 3 UBYTE count of additional characters in this */
|
|
|
|
/* range (zero means a range of a single */
|
|
|
|
/* character) */
|
|
|
|
/* */
|
|
|
|
/* Ranges are sorted by `uniStart'. */
|
|
|
|
/* */
|
|
|
|
/* A non-default Unicode Variation Selector (UVS) subtable is a list of */
|
|
|
|
/* mappings from codepoint to GID. */
|
|
|
|
/* */
|
|
|
|
/* numMappings 0 ULONG number of mappings */
|
|
|
|
/* */
|
|
|
|
/* A range looks like */
|
|
|
|
/* */
|
|
|
|
/* uniStart 0 UINT24 code point of the first character in */
|
|
|
|
/* this range */
|
|
|
|
/* GID 3 USHORT and its GID */
|
|
|
|
/* */
|
|
|
|
/* Ranges are sorted by `uniStart'. */
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_14
|
|
|
|
|
|
|
|
typedef struct TT_CMap14Rec_
|
|
|
|
{
|
|
|
|
TT_CMapRec cmap;
|
|
|
|
FT_ULong num_selectors;
|
|
|
|
|
|
|
|
} TT_CMap14Rec, *TT_CMap14;
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap14_init( TT_CMap14 cmap,
|
|
|
|
FT_Byte* table )
|
|
|
|
{
|
|
|
|
cmap->cmap.data = table;
|
|
|
|
|
|
|
|
table += 6;
|
|
|
|
cmap->num_selectors = FT_PEEK_ULONG( table );
|
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap14_validate( FT_Byte* table,
|
|
|
|
FT_Validator valid )
|
|
|
|
{
|
|
|
|
FT_Byte* p = table + 2;
|
|
|
|
FT_ULong length = TT_NEXT_ULONG( p );
|
|
|
|
FT_ULong num_selectors = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
|
|
|
|
if ( table + length > valid->limit || length < 10 + 11 * num_selectors )
|
|
|
|
FT_INVALID_TOO_SHORT;
|
|
|
|
|
|
|
|
/* check selectors, they must be in increasing order */
|
|
|
|
{
|
|
|
|
FT_ULong n, varSel, defOff, nondefOff, last = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for ( n = 0; n < num_selectors; n++ )
|
|
|
|
{
|
|
|
|
varSel = TT_NEXT_UINT24( p );
|
|
|
|
defOff = TT_NEXT_ULONG( p );
|
|
|
|
nondefOff = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( defOff >= length || nondefOff >= length )
|
|
|
|
FT_INVALID_TOO_SHORT;
|
|
|
|
|
|
|
|
if ( n > 0 && varSel <= last )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
last = varSel;
|
|
|
|
|
|
|
|
/* check the default table (these glyphs should be reached */
|
|
|
|
/* through the normal Unicode cmap, no GIDs, just check order) */
|
|
|
|
if ( defOff != 0 )
|
|
|
|
{
|
|
|
|
FT_Byte* defp = table + defOff;
|
|
|
|
FT_ULong numRanges = TT_NEXT_ULONG( defp );
|
|
|
|
FT_ULong i, base, cnt;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < numRanges; ++i )
|
|
|
|
{
|
|
|
|
base = TT_NEXT_UINT24( defp );
|
|
|
|
cnt = FT_NEXT_BYTE( defp );
|
|
|
|
|
|
|
|
if ( base + cnt >= 0x110000UL ) /* end of Unicode */
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
|
|
|
|
if ( i > 0 && base <= last )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
last = base + cnt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* and the non-default table (these glyphs are specified here) */
|
|
|
|
if ( nondefOff != 0 ) {
|
|
|
|
FT_Byte* ndp = table + nondefOff;
|
|
|
|
FT_ULong numMappings = TT_NEXT_ULONG( ndp );
|
|
|
|
FT_ULong i, uni, gid;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < numMappings; ++i )
|
|
|
|
{
|
|
|
|
uni = TT_NEXT_UINT24( ndp );
|
|
|
|
gid = TT_NEXT_USHORT( ndp );
|
|
|
|
|
|
|
|
if ( uni >= 0x110000UL ) /* end of Unicode */
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
|
|
|
|
if ( i > 0 && uni <= last )
|
|
|
|
FT_INVALID_DATA;
|
|
|
|
last = uni;
|
|
|
|
|
|
|
|
if ( valid->level >= FT_VALIDATE_TIGHT &&
|
|
|
|
gid >= TT_VALID_GLYPH_COUNT( valid ) )
|
|
|
|
FT_INVALID_GLYPH_ID;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap14_char_index( TT_CMap cmap,
|
|
|
|
FT_UInt32 char_code )
|
|
|
|
{
|
|
|
|
FT_UNUSED( cmap );
|
|
|
|
FT_UNUSED( char_code );
|
|
|
|
|
|
|
|
/* This can't happen */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap14_char_next( TT_CMap cmap,
|
|
|
|
FT_UInt32 *pchar_code )
|
|
|
|
{
|
|
|
|
FT_UNUSED( cmap );
|
|
|
|
|
|
|
|
/* This can't happen */
|
|
|
|
*pchar_code = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Error )
|
|
|
|
tt_cmap14_get_info( TT_CMap cmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_UNUSED( cmap );
|
|
|
|
|
|
|
|
cmap_info->format = 14;
|
|
|
|
/* subtable 14 does not define a language field */
|
|
|
|
cmap_info->language = 0xFFFFFFFFUL;
|
|
|
|
|
|
|
|
return SFNT_Err_Ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_UInt
|
|
|
|
tt_cmap14_char_map_def_binary( FT_Byte *base,
|
|
|
|
FT_UInt32 char_code )
|
|
|
|
{
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_UInt32 numRanges = TT_PEEK_ULONG( base );
|
|
|
|
FT_UInt32 start, cnt;
|
|
|
|
FT_UInt32 max, min, mid;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !numRanges )
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
/* make compiler happy */
|
|
|
|
mid = numRanges;
|
|
|
|
|
|
|
|
min = 0;
|
|
|
|
max = numRanges;
|
|
|
|
|
|
|
|
/* binary search */
|
|
|
|
while ( min < max )
|
|
|
|
{
|
|
|
|
mid = ( min + max ) >> 1;
|
|
|
|
p = base + 4 + 4 * mid;
|
|
|
|
|
|
|
|
start = TT_NEXT_UINT24( p );
|
|
|
|
cnt = FT_NEXT_BYTE( p );
|
|
|
|
|
|
|
|
if ( char_code < start )
|
|
|
|
max = mid;
|
|
|
|
else if ( char_code > start+cnt )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_UInt
|
|
|
|
tt_cmap14_char_map_nondef_binary( FT_Byte *base,
|
|
|
|
FT_UInt32 char_code )
|
|
|
|
{
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_UInt32 numMappings = TT_PEEK_ULONG( base );
|
|
|
|
FT_UInt32 uni, gid;
|
|
|
|
FT_UInt32 max, min, mid;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !numMappings )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* make compiler happy */
|
|
|
|
mid = numMappings;
|
|
|
|
|
|
|
|
min = 0;
|
|
|
|
max = numMappings;
|
|
|
|
|
|
|
|
/* binary search */
|
|
|
|
while ( min < max )
|
|
|
|
{
|
|
|
|
mid = ( min + max ) >> 1;
|
|
|
|
p = base + 4 + 5 * mid;
|
|
|
|
|
|
|
|
uni = TT_NEXT_UINT24( p );
|
|
|
|
gid = TT_NEXT_USHORT( p );
|
|
|
|
|
|
|
|
if ( char_code < uni )
|
|
|
|
max = mid;
|
|
|
|
else if ( char_code > uni )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
|
|
|
return gid;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_Byte*
|
|
|
|
tt_cmap14_find_variant( FT_Byte *base,
|
|
|
|
FT_UInt32 variantCode )
|
|
|
|
{
|
|
|
|
FT_Byte* p;
|
|
|
|
FT_UInt32 numVar = TT_PEEK_ULONG( base );
|
|
|
|
FT_ULong varSel;
|
|
|
|
FT_UInt32 max, min, mid;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !numVar )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* make compiler happy */
|
|
|
|
mid = numVar;
|
|
|
|
|
|
|
|
min = 0;
|
|
|
|
max = numVar;
|
|
|
|
|
|
|
|
/* binary search */
|
|
|
|
while ( min < max )
|
|
|
|
{
|
|
|
|
mid = ( min + max ) >> 1;
|
|
|
|
p = base + 4 + 11 * mid;
|
|
|
|
|
|
|
|
varSel = TT_NEXT_UINT24( p );
|
|
|
|
|
|
|
|
if ( variantCode < varSel )
|
|
|
|
max = mid;
|
|
|
|
else if ( variantCode > varSel )
|
|
|
|
min = mid + 1;
|
|
|
|
else
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt )
|
|
|
|
tt_cmap14_char_var_index( TT_CMap cmap,
|
|
|
|
TT_CMap ucmap,
|
|
|
|
FT_ULong charcode,
|
|
|
|
FT_ULong variantSelector)
|
|
|
|
{
|
|
|
|
FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
|
|
|
|
FT_ULong defOff;
|
|
|
|
FT_ULong nondefOff;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !p )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
defOff = TT_NEXT_ULONG( p );
|
|
|
|
nondefOff = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( defOff != 0 &&
|
|
|
|
tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
|
|
|
|
{
|
|
|
|
/* This is the default variant of this charcode. GID not stored */
|
|
|
|
/* here; stored in the normal Unicode charmap instead. */
|
|
|
|
return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( nondefOff != 0 )
|
|
|
|
return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
|
|
|
|
charcode );
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_Int )
|
|
|
|
tt_cmap14_char_var_isdefault( TT_CMap cmap,
|
|
|
|
FT_ULong charcode,
|
|
|
|
FT_ULong variantSelector )
|
|
|
|
{
|
|
|
|
FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
|
|
|
|
FT_ULong defOff;
|
|
|
|
FT_ULong nondefOff;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !p )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
defOff = TT_NEXT_ULONG( p );
|
|
|
|
nondefOff = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( defOff != 0 &&
|
|
|
|
tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if ( nondefOff != 0 &&
|
|
|
|
tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
|
|
|
|
charcode ) != 0 )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt32 * )
|
|
|
|
tt_cmap14_variants( TT_CMap cmap,
|
|
|
|
FT_Memory memory )
|
|
|
|
{
|
|
|
|
TT_CMap14 cmap14 = (TT_CMap14)cmap;
|
|
|
|
FT_Byte* p = cmap->data + 10;
|
|
|
|
FT_UInt32* ret;
|
|
|
|
FT_UInt i;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
if ( FT_ALLOC( ret,
|
|
|
|
( cmap14->num_selectors + 1 ) * sizeof ( FT_UInt32 ) ) )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
for ( i = 0; i < cmap14->num_selectors; ++i )
|
|
|
|
{
|
|
|
|
ret[i] = TT_NEXT_UINT24( p );
|
|
|
|
p += 8;
|
|
|
|
}
|
|
|
|
ret[i] = 0;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt32 * )
|
|
|
|
tt_cmap14_char_variants( TT_CMap cmap,
|
|
|
|
FT_Memory memory,
|
|
|
|
FT_ULong charCode )
|
|
|
|
{
|
|
|
|
TT_CMap14 cmap14 = (TT_CMap14) cmap;
|
|
|
|
FT_Byte* p = cmap->data + 10;
|
|
|
|
FT_UInt32 *ret;
|
|
|
|
FT_UInt i, j;
|
|
|
|
FT_UInt32 varSel;
|
|
|
|
FT_ULong defOff;
|
|
|
|
FT_ULong nondefOff;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
if ( FT_ALLOC( ret,
|
|
|
|
( cmap14->num_selectors + 1 ) * sizeof ( FT_UInt32 ) ) )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
for ( i = j = 0; i < cmap14->num_selectors; ++i )
|
|
|
|
{
|
|
|
|
varSel = TT_NEXT_UINT24( p );
|
|
|
|
defOff = TT_NEXT_ULONG( p );
|
|
|
|
nondefOff = TT_NEXT_ULONG( p );
|
|
|
|
if ( ( defOff != 0 &&
|
|
|
|
tt_cmap14_char_map_def_binary( cmap->data + defOff,
|
|
|
|
charCode ) ) ||
|
|
|
|
( nondefOff != 0 &&
|
|
|
|
tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
|
|
|
|
charCode ) != 0 ) )
|
|
|
|
ret[j++] = varSel;
|
|
|
|
}
|
|
|
|
ret[j] = 0;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_UInt
|
|
|
|
tt_cmap14_def_char_count( FT_Byte *p )
|
|
|
|
{
|
|
|
|
FT_UInt32 numRanges;
|
|
|
|
FT_UInt tot;
|
|
|
|
FT_UInt cnt;
|
|
|
|
FT_UInt i;
|
|
|
|
|
|
|
|
|
|
|
|
numRanges = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
tot = 0;
|
|
|
|
for ( i = 0; i < numRanges; ++i )
|
|
|
|
{
|
|
|
|
p += 3;
|
|
|
|
cnt = FT_NEXT_BYTE( p );
|
|
|
|
tot += cnt + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return tot;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_UInt*
|
|
|
|
tt_cmap14_get_def_chars( FT_Byte *p,
|
|
|
|
FT_Memory memory )
|
|
|
|
{
|
|
|
|
FT_UInt32 numRanges;
|
|
|
|
FT_UInt uni;
|
|
|
|
FT_UInt cnt;
|
|
|
|
FT_UInt i, j, k;
|
|
|
|
FT_UInt32 *ret;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
cnt = tt_cmap14_def_char_count( p );
|
|
|
|
numRanges = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( FT_ALLOC( ret , ( cnt + 1 ) * sizeof ( FT_UInt32 ) ) )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
for ( i = j = 0; i < numRanges; ++i )
|
|
|
|
{
|
|
|
|
uni = TT_NEXT_UINT24( p );
|
|
|
|
cnt = FT_NEXT_BYTE( p );
|
|
|
|
|
|
|
|
for ( k = 0; k <= cnt; ++k )
|
|
|
|
ret[j++] = uni + k;
|
|
|
|
}
|
|
|
|
ret[j] = 0;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static FT_UInt*
|
|
|
|
tt_cmap14_get_nondef_chars( FT_Byte *p,
|
|
|
|
FT_Memory memory )
|
|
|
|
{
|
|
|
|
FT_UInt32 numMappings;
|
|
|
|
FT_UInt i;
|
|
|
|
FT_UInt32 *ret;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
numMappings = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( FT_ALLOC( ret, ( numMappings + 1 ) * sizeof ( FT_UInt32 ) ) )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
for ( i = 0; i < numMappings; ++i )
|
|
|
|
{
|
|
|
|
ret[i] = TT_NEXT_UINT24( p );
|
|
|
|
p += 2;
|
|
|
|
}
|
|
|
|
ret[i] = 0;
|
|
|
|
|
|
|
|
return( ret );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_DEF( FT_UInt32 * )
|
|
|
|
tt_cmap14_variant_chars( TT_CMap cmap,
|
|
|
|
FT_Memory memory,
|
|
|
|
FT_ULong variantSelector )
|
|
|
|
{
|
|
|
|
FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6,
|
|
|
|
variantSelector );
|
|
|
|
FT_UInt32 *ret;
|
|
|
|
FT_Int i;
|
|
|
|
FT_ULong defOff;
|
|
|
|
FT_ULong nondefOff;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !p )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
defOff = TT_NEXT_ULONG( p );
|
|
|
|
nondefOff = TT_NEXT_ULONG( p );
|
|
|
|
|
|
|
|
if ( defOff == 0 && nondefOff == 0 )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if ( defOff == 0 )
|
|
|
|
return tt_cmap14_get_nondef_chars( cmap->data + nondefOff, memory );
|
|
|
|
else if ( nondefOff == 0 )
|
|
|
|
return tt_cmap14_get_def_chars( cmap->data + defOff, memory );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Both a default and a non-default glyph set? That's probably not */
|
|
|
|
/* good font design, but the spec allows for it... */
|
|
|
|
FT_UInt32 numRanges;
|
|
|
|
FT_UInt32 numMappings;
|
|
|
|
FT_UInt32 duni;
|
|
|
|
FT_UInt32 dcnt;
|
|
|
|
FT_UInt32 nuni;
|
|
|
|
FT_Byte* dp;
|
|
|
|
FT_UInt di, ni, k;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
p = cmap->data + nondefOff;
|
|
|
|
dp = cmap->data + defOff;
|
|
|
|
|
|
|
|
numMappings = TT_NEXT_ULONG( p );
|
|
|
|
dcnt = tt_cmap14_def_char_count( dp );
|
|
|
|
numRanges = TT_NEXT_ULONG( dp );
|
|
|
|
|
|
|
|
if ( numMappings == 0 )
|
|
|
|
return tt_cmap14_get_def_chars( cmap->data + defOff, memory );
|
|
|
|
if ( dcnt == 0 )
|
|
|
|
return tt_cmap14_get_nondef_chars( cmap->data + nondefOff, memory );
|
|
|
|
|
|
|
|
if ( FT_ALLOC( ret,
|
|
|
|
( dcnt + numMappings + 1 ) * sizeof ( FT_UInt32 ) ) )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
duni = TT_NEXT_UINT24( dp );
|
|
|
|
dcnt = FT_NEXT_BYTE( dp );
|
|
|
|
di = 1;
|
|
|
|
nuni = TT_NEXT_UINT24( p );
|
|
|
|
p += 2;
|
|
|
|
ni = 1;
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
for ( ;; )
|
|
|
|
{
|
|
|
|
if ( nuni > duni + dcnt )
|
|
|
|
{
|
|
|
|
for ( k = 0; k <= dcnt; ++k )
|
|
|
|
ret[i++] = duni + k;
|
|
|
|
|
|
|
|
++di;
|
|
|
|
|
|
|
|
if ( di <= numRanges )
|
|
|
|
{
|
|
|
|
duni = TT_NEXT_UINT24( dp );
|
|
|
|
dcnt = FT_NEXT_BYTE( dp );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( nuni < duni )
|
|
|
|
ret[i++] = nuni;
|
|
|
|
/* If it is within the default range then ignore it -- */
|
|
|
|
/* that should not have happened */
|
|
|
|
++ni;
|
|
|
|
if ( ni <= numMappings )
|
|
|
|
{
|
|
|
|
nuni = TT_NEXT_UINT24( p );
|
|
|
|
p += 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ni <= numMappings )
|
|
|
|
{
|
|
|
|
/* If we get here then we have run out of all default ranges. */
|
|
|
|
/* We have read one non-default mapping which we haven't stored */
|
|
|
|
/* and there may be others that need to be read. */
|
|
|
|
ret[i++] = nuni;
|
|
|
|
while ( ni < numMappings )
|
|
|
|
{
|
|
|
|
ret[i++] = TT_NEXT_UINT24( p );
|
|
|
|
p += 2;
|
|
|
|
++ni;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( di < numRanges )
|
|
|
|
{
|
|
|
|
/* If we get here then we have run out of all non-default */
|
|
|
|
/* mappings. We have read one default range which we haven't */
|
|
|
|
/* stored and there may be others that need to be read. */
|
|
|
|
for ( k = 0; k <= dcnt; ++k )
|
|
|
|
ret[i++] = duni + k;
|
|
|
|
|
|
|
|
while ( di < numRanges )
|
|
|
|
{
|
|
|
|
duni = TT_NEXT_UINT24( dp );
|
|
|
|
dcnt = FT_NEXT_BYTE( dp );
|
|
|
|
|
|
|
|
for ( k = 0; k <= dcnt; ++k )
|
|
|
|
ret[i++] = duni + k;
|
|
|
|
++di;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret[i] = 0;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FT_CALLBACK_TABLE_DEF
|
|
|
|
const TT_CMap_ClassRec tt_cmap14_class_rec =
|
|
|
|
{
|
|
|
|
{
|
|
|
|
sizeof ( TT_CMap14Rec ),
|
|
|
|
|
|
|
|
(FT_CMap_InitFunc) tt_cmap14_init,
|
|
|
|
(FT_CMap_DoneFunc) NULL,
|
|
|
|
(FT_CMap_CharIndexFunc)tt_cmap14_char_index,
|
|
|
|
(FT_CMap_CharNextFunc) tt_cmap14_char_next,
|
|
|
|
/* Format 14 extension functions */
|
|
|
|
(FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index,
|
|
|
|
(FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
|
|
|
|
(FT_CMap_VariantListFunc) tt_cmap14_variants,
|
|
|
|
(FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
|
|
|
|
(FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars
|
|
|
|
},
|
|
|
|
14,
|
|
|
|
(TT_CMap_ValidateFunc)tt_cmap14_validate,
|
|
|
|
(TT_CMap_Info_GetFunc)tt_cmap14_get_info
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* TT_CONFIG_CMAP_FORMAT_0 */
|
|
|
|
|
|
|
|
|
2002-03-22 16:02:38 +01:00
|
|
|
static const TT_CMap_Class tt_cmap_classes[] =
|
2002-03-01 03:26:22 +01:00
|
|
|
{
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_0
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap0_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_2
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap2_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_4
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap4_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_6
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap6_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_8
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap8_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_10
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap10_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_12
|
2002-03-22 16:02:38 +01:00
|
|
|
&tt_cmap12_class_rec,
|
2002-03-01 03:26:22 +01:00
|
|
|
#endif
|
|
|
|
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
#ifdef TT_CONFIG_CMAP_FORMAT_14
|
|
|
|
&tt_cmap14_class_rec,
|
|
|
|
#endif
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
NULL,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
/* parse the `cmap' table and build the corresponding TT_CMap objects */
|
|
|
|
/* in the current face */
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
tt_face_build_cmaps( TT_Face face )
|
2002-03-01 03:26:22 +01:00
|
|
|
{
|
2002-03-30 17:14:48 +01:00
|
|
|
FT_Byte* table = face->cmap_table;
|
|
|
|
FT_Byte* limit = table + face->cmap_size;
|
2002-11-06 23:32:54 +01:00
|
|
|
FT_UInt volatile num_cmaps;
|
|
|
|
FT_Byte* volatile p = table;
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-03-22 18:09:52 +01:00
|
|
|
if ( p + 4 > limit )
|
* src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in
computation of glyph_index.
(FNT_Size_Set_Pixels): To find a strike, first check pixel_height
only, then try to find a better hit by comparing pixel_width also.
Without this fix it isn't possible to access all strikes.
Also compute metrics.max_advance to be in sync with other bitmap
drivers.
* src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code.
(FT_Set_Pixel_Size): Assign value to `metrics' after validation of
arguments.
Synchronize computation of height and width for bitmap strikes. The
`width' field in the FT_Bitmap_Size structure is now only useful to
enumerate different strikes. The `max_advance' field of the
FT_Size_Metrics structure should be used to get the (maximum) width
of a strike.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single
argument to function.
* src/psnames/psmodule.c (ps_unicode_value): Handle `.' after
`uniXXXX' and `uXXXX[X[X]]'.
* src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/.
* src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c:
s/FT_Err_/FTC_Err_/.
* src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/.
* src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/.
* src/psaux/t1cmap.c: Include psauxerr.h.
s/FT_Err_/PSaux_Err_/.
* src/pshinter/pshnterr.h: New file.
* src/pshinter/rules.mk: Updated.
* src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h.
s/FT_Err_/PSH_Err_/.
* src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c:
s/FT_Err_/PFR_Err_/.
* src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c,
src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/.
* src/truetype/ttgload.c: s/FT_Err_/TT_Err_/.
* src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define
FT_ERR_PREFIX and FT_ERR_BASE.
s/FT_Err_/Gzip_Err_/.
2003-06-22 17:33:53 +02:00
|
|
|
return SFNT_Err_Invalid_Table;
|
2002-03-01 03:26:22 +01:00
|
|
|
|
|
|
|
/* only recognize format 0 */
|
2002-03-31 20:48:24 +02:00
|
|
|
if ( TT_NEXT_USHORT( p ) != 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
{
|
|
|
|
p -= 2;
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
FT_ERROR(( "tt_face_build_cmaps: unsupported `cmap' table format = %d\n",
|
2002-03-31 20:48:24 +02:00
|
|
|
TT_PEEK_USHORT( p ) ));
|
* src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in
computation of glyph_index.
(FNT_Size_Set_Pixels): To find a strike, first check pixel_height
only, then try to find a better hit by comparing pixel_width also.
Without this fix it isn't possible to access all strikes.
Also compute metrics.max_advance to be in sync with other bitmap
drivers.
* src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code.
(FT_Set_Pixel_Size): Assign value to `metrics' after validation of
arguments.
Synchronize computation of height and width for bitmap strikes. The
`width' field in the FT_Bitmap_Size structure is now only useful to
enumerate different strikes. The `max_advance' field of the
FT_Size_Metrics structure should be used to get the (maximum) width
of a strike.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for
computing `available_sizes->width' but make it always equal to
`available_sizes->height'.
* src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single
argument to function.
* src/psnames/psmodule.c (ps_unicode_value): Handle `.' after
`uniXXXX' and `uXXXX[X[X]]'.
* src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/.
* src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c:
s/FT_Err_/FTC_Err_/.
* src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/.
* src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/.
* src/psaux/t1cmap.c: Include psauxerr.h.
s/FT_Err_/PSaux_Err_/.
* src/pshinter/pshnterr.h: New file.
* src/pshinter/rules.mk: Updated.
* src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h.
s/FT_Err_/PSH_Err_/.
* src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c:
s/FT_Err_/PFR_Err_/.
* src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c,
src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/.
* src/truetype/ttgload.c: s/FT_Err_/TT_Err_/.
* src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define
FT_ERR_PREFIX and FT_ERR_BASE.
s/FT_Err_/Gzip_Err_/.
2003-06-22 17:33:53 +02:00
|
|
|
return SFNT_Err_Invalid_Table;
|
2002-03-22 16:02:38 +01:00
|
|
|
}
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
num_cmaps = TT_NEXT_USHORT( p );
|
2002-03-01 03:26:22 +01:00
|
|
|
|
|
|
|
for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
|
|
|
|
{
|
|
|
|
FT_CharMapRec charmap;
|
|
|
|
FT_UInt32 offset;
|
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
charmap.platform_id = TT_NEXT_USHORT( p );
|
|
|
|
charmap.encoding_id = TT_NEXT_USHORT( p );
|
|
|
|
charmap.face = FT_FACE( face );
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
charmap.encoding = FT_ENCODING_NONE; /* will be filled later */
|
2002-03-31 20:48:24 +02:00
|
|
|
offset = TT_NEXT_ULONG( p );
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2006-03-21 21:47:28 +01:00
|
|
|
if ( offset && offset <= face->cmap_size - 2 )
|
2002-03-01 03:26:22 +01:00
|
|
|
{
|
2006-08-18 19:20:37 +02:00
|
|
|
FT_Byte* volatile cmap = table + offset;
|
2003-06-07 07:13:22 +02:00
|
|
|
volatile FT_UInt format = TT_PEEK_USHORT( cmap );
|
2002-11-06 23:32:54 +01:00
|
|
|
const TT_CMap_Class* volatile pclazz = tt_cmap_classes;
|
2006-04-21 10:38:35 +02:00
|
|
|
TT_CMap_Class volatile clazz;
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
for ( ; *pclazz; pclazz++ )
|
|
|
|
{
|
|
|
|
clazz = *pclazz;
|
|
|
|
if ( clazz->format == format )
|
|
|
|
{
|
2002-03-22 18:09:52 +01:00
|
|
|
volatile TT_ValidatorRec valid;
|
2005-06-30 13:46:46 +02:00
|
|
|
volatile FT_Error error = SFNT_Err_Ok;
|
2002-06-11 01:03:35 +02:00
|
|
|
|
2002-03-31 20:48:24 +02:00
|
|
|
|
|
|
|
ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
|
2002-03-22 18:09:52 +01:00
|
|
|
FT_VALIDATE_DEFAULT );
|
2002-06-11 01:03:35 +02:00
|
|
|
|
* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
unused `max_points' and `max_contours'.
* src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
`max_components'.
* src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
`loadSize' and `loadStack'.
* src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
src/sfnt/ttload.c (tt_face_load_maxp): Update.
* src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
(sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
defined.
* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
(finally!)
For most OpenType tables, `tt_face_load_xxxx' simply loads the table
and `face->root' is set later in `sfnt_load_face'. Here, we try to
make this work for _all_ tables.
* src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
then exit. Error handling or setting face->root is done later in
`sfnt_load_face'.
Pretty trace messages.
* src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
Mac bitmap-only fonts are not scalable.
Check that `face->header.Units_Per_EM' is not zero.
(LOAD_, LOADM_): Pretty trace messages.
* src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics from
`eblc'.
* src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
(load_format_20, load_format_25, tt_face_get_ps_name): Use
face->max_profile.numGlyphs, instead of face->root.num_glyphs.
2006-02-15 08:44:31 +01:00
|
|
|
valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2007-05-15 08:49:37 +02:00
|
|
|
if ( ft_setjmp(
|
|
|
|
*((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 )
|
2002-03-22 16:02:38 +01:00
|
|
|
{
|
|
|
|
/* validate this cmap sub-table */
|
2005-05-10 00:11:36 +02:00
|
|
|
error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
|
2002-03-22 16:02:38 +01:00
|
|
|
}
|
2002-03-01 03:26:22 +01:00
|
|
|
|
2002-03-22 18:09:52 +01:00
|
|
|
if ( valid.validator.error == 0 )
|
2005-05-10 00:11:36 +02:00
|
|
|
{
|
2005-11-29 12:32:53 +01:00
|
|
|
FT_CMap ttcmap;
|
2005-05-10 00:11:36 +02:00
|
|
|
|
2005-11-29 12:32:53 +01:00
|
|
|
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
/* It might make sense to store the single variation selector */
|
|
|
|
/* cmap somewhere special. But it would have to be in the */
|
|
|
|
/* public FT_FaceRec, and we can't change that. */
|
|
|
|
|
2005-11-30 19:47:49 +01:00
|
|
|
if ( !FT_CMap_New( (FT_CMap_Class)clazz,
|
|
|
|
cmap, &charmap, &ttcmap ) )
|
2005-11-29 12:32:53 +01:00
|
|
|
{
|
|
|
|
/* it is simpler to directly set `flags' than adding */
|
|
|
|
/* a parameter to FT_CMap_New */
|
|
|
|
((TT_CMap)ttcmap)->flags = (FT_Int)error;
|
|
|
|
}
|
2005-05-10 00:11:36 +02:00
|
|
|
}
|
2002-03-01 03:26:22 +01:00
|
|
|
else
|
2002-03-31 20:48:24 +02:00
|
|
|
{
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
FT_ERROR(( "tt_face_build_cmaps:" ));
|
2002-03-31 20:48:24 +02:00
|
|
|
FT_ERROR(( " broken cmap sub-table ignored!\n" ));
|
|
|
|
}
|
2004-01-11 11:01:08 +01:00
|
|
|
break;
|
2002-03-01 03:26:22 +01:00
|
|
|
}
|
|
|
|
}
|
Add support for cmap type 14.
* devel/ftoption.h, include/freetype/config/ftoption.h
(TT_CONFIG_CMAP_FORMAT_14): New macro.
* include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
support function prototypes.
(FT_CMap_ClassRec): Add them.
Update all users.
* include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
macro.
* include/freetype/freetype.h (FT_Get_Char_Variant_Index,
FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
functions.
* src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
function.
(FT_Set_Charmap): Disallow cmaps of type 14.
(FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
FT_Get_Chars_Of_Variant): New API functions.
* src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
(TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
tt_cmap14_find_variant, tt_cmap14_char_var_index,
tt_cmap14_char_var_isdefault, tt_cmap14_variants,
tt_cmap14_char_variants, tt_cmap14_def_char_count,
tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
structures for cmap 14 support.
(tt_cmap_classes): Register tt_cmap14_class_rec.
(tt_face_build_cmaps): One more error message.
* docs/CHANGES: Mention cmap 14 support.
2007-10-15 19:21:32 +02:00
|
|
|
|
|
|
|
if ( *pclazz == NULL )
|
|
|
|
{
|
|
|
|
FT_ERROR(( "tt_face_build_cmaps:" ));
|
|
|
|
FT_ERROR(( " unsupported cmap sub-table ignored!\n" ));
|
|
|
|
}
|
2002-03-01 03:26:22 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-05-10 00:11:36 +02:00
|
|
|
return SFNT_Err_Ok;
|
2002-03-01 03:26:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-12-17 15:28:22 +01:00
|
|
|
FT_LOCAL( FT_Error )
|
|
|
|
tt_get_cmap_info( FT_CharMap charmap,
|
|
|
|
TT_CMapInfo *cmap_info )
|
|
|
|
{
|
|
|
|
FT_CMap cmap = (FT_CMap)charmap;
|
|
|
|
TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz;
|
|
|
|
|
|
|
|
|
|
|
|
return clazz->get_cmap_info( charmap, cmap_info );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-02-27 22:25:47 +01:00
|
|
|
/* END */
|