1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* cffdrivr.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* OpenType font driver implementation (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Copyright 1996-2015 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_FREETYPE_H 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_STREAM_H 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_SFNT_H 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_CID_H 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_INFO_H 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_POSTSCRIPT_NAME_H 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_TT_CMAP_H 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffdrivr.h" 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffgload.h" 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffload.h" 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffcmap.h" 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffparse.h" 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cfferrs.h" 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "cffpic.h" 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include FT_SERVICE_FONT_FORMAT_H 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_GLYPH_DICT_H 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_PROPERTIES_H 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_CFF_DRIVER_H 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_cffdriver 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** F A C E S ****/ 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cff_get_kerning */ 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A driver method used to return the kerning vector between two */ 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyphs of the same face. */ 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A handle to the source face object. */ 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* left_glyph :: The index of the left glyph in the kern pair. */ 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* right_glyph :: The index of the right glyph in the kern pair. */ 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Output> */ 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kerning :: The kerning vector. This is in font units for */ 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* scalable formats, and in pixels for fixed-sizes */ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* formats. */ 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Note> */ 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Only horizontal layouts (left-to-right & right-to-left) are */ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* supported by this function. Other layouts, or more sophisticated */ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* kernings, are out of scope of this method (the basic driver */ 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* interface is meant to be simple). */ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* They can be implemented by format-specific interfaces. */ 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_kerning( FT_Face ttface, /* TT_Face */ 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt left_glyph, 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt right_glyph, 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Vector* kerning ) 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_Face face = (TT_Face)ttface; 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SFNT_Service sfnt = (SFNT_Service)face->sfnt; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->x = 0; 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->y = 0; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( sfnt ) 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cff_glyph_load */ 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* A driver method used to load a glyph within a given glyph slot. */ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* slot :: A handle to the target slot object where the glyph */ 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* will be loaded. */ 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* size :: A handle to the source face size at which the glyph */ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* must be scaled, loaded, etc. */ 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyph_index :: The index of the glyph in the font file. */ 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* load_flags :: A flag indicating what to load for this glyph. The */ 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FT_LOAD_??? constants can be used to control the */ 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* glyph loading process (e.g., whether the outline */ 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* should be scaled, whether to load bitmaps or not, */ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* whether to hint the outline, etc). */ 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Size cffsize, /* CFF_Size */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 load_flags ) 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Size size = (CFF_Size)cffsize; 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !slot ) 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Slot_Handle ); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index )); 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* check whether we want a scaled outline or bitmap */ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !size ) 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* reset the size object if necessary */ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( load_flags & FT_LOAD_NO_SCALE ) 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = NULL; 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( size ) 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* these two objects must have the same parent */ 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cffsize->face != cffslot->face ) 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Face_Handle ); 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now load the glyph outline if necessary */ 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = cff_slot_load( slot, size, glyph_index, load_flags ); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* force drop-out mode to 2 - irrelevant now */ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* slot->outline.dropout_mode = 2; */ 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Error ) 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_advances( FT_Face face, 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt start, 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt count, 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int32 flags, 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed* advances ) 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt nn; 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_GlyphSlot slot = face->glyph; 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( FT_IS_SFNT( face ) ) 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* OpenType 1.7 mandates that the data from `hmtx' table be used; */ 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* it is no longer necessary that those values are identical to */ 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* the values in the `CFF' table */ 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann TT_Face ttface = (TT_Face)face; 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Short dummy; 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( flags & FT_LOAD_VERTICAL_LAYOUT ) 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* check whether we have data from the `vmtx' table at all; */ 211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* otherwise we extract the info from the CFF glyphstrings */ 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* (instead of synthesizing a global value using the `OS/2' */ 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* table) */ 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( !ttface->vertical_info ) 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann goto Missing_Table; 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for ( nn = 0; nn < count; nn++ ) 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_UShort ah; 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, 223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1, 224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann start + nn, 225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &dummy, 226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &ah ); 227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_TRACE5(( " idx %d: advance height %d font units\n", 229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann start + nn, ah )); 230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann advances[nn] = ah; 231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann else 234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* check whether we have data from the `hmtx' table at all */ 236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( !ttface->horizontal.number_Of_HMetrics ) 237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann goto Missing_Table; 238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann for ( nn = 0; nn < count; nn++ ) 240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_UShort aw; 242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, 245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 0, 246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann start + nn, 247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &dummy, 248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann &aw ); 249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_TRACE5(( " idx %d: advance width %d font units\n", 251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann start + nn, aw )); 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann advances[nn] = aw; 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return error; 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann Missing_Table: 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( nn = 0; nn < count; nn++ ) 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = cff_glyph_load( slot, face->size, start + nn, flags ); 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ? slot->linearVertAdvance 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : slot->linearHoriAdvance; 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * GLYPH DICT SERVICE 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_glyph_name( CFF_Face face, 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Pointer buffer, 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt buffer_max ) 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font font = (CFF_Font)face->extra.data; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* gname; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort sid; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !font->psnames ) 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ERROR(( "cff_get_glyph_name:" 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov " cannot get glyph name from CFF & CEF fonts\n" 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov " " 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov " without the `PSNames' module\n" )); 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Missing_Module ); 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Exit; 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* first, locate the sid in the charset table */ 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sid = font->charset.sids[glyph_index]; 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now, lookup the name itself */ 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gname = cff_index_get_sid_string( font, sid ); 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( gname ) 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_STRCPYN( buffer, gname, buffer_max ); 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Err_Ok; 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Exit: 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_UInt 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_name_index( CFF_Face face, 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* glyph_name ) 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Charset charset; 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_PsCMaps psnames; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_String* name; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort sid; 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt i; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff = (CFF_FontRec *)face->extra.data; 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov charset = &cff->charset; 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !psnames ) 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for ( i = 0; i < cff->num_glyphs; i++ ) 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sid = charset->sids[i]; 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( sid > 390 ) 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name = cff_index_get_string( cff, sid - 391 ); 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov name = (FT_String *)psnames->adobe_std_strings( sid ); 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !name ) 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !ft_strcmp( glyph_name, name ) ) 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return i; 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_GLYPHDICTREC( 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_glyph_dict, 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_GlyphDict_NameIndexFunc)cff_get_name_index 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT INFO SERVICE 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Int 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_ps_has_glyph_names( FT_Face face ) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_ps_get_font_info( CFF_Face face, 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfoRec* afont_info ) 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff && cff->font_info == NULL ) 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_FontRecDict dict = &cff->top_font.font_dict; 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PS_FontInfoRec *font_info = NULL; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Memory memory = face->root.memory; 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->version = cff_index_get_sid_string( cff, 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->version ); 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->notice = cff_index_get_sid_string( cff, 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->notice ); 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->full_name = cff_index_get_sid_string( cff, 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->full_name ); 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->family_name = cff_index_get_sid_string( cff, 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->family_name ); 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->weight = cff_index_get_sid_string( cff, 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->weight ); 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->italic_angle = dict->italic_angle; 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->is_fixed_pitch = dict->is_fixed_pitch; 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov font_info->underline_position = (FT_Short)dict->underline_position; 409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann font_info->underline_thickness = (FT_UShort)dict->underline_thickness; 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff->font_info = font_info; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff ) 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *afont_info = *cff->font_info; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Fail: 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_PSINFOREC( 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_ps_info, 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontInfoFunc) cff_ps_get_font_info, 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontExtraFunc) NULL, 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontPrivateFunc)NULL, /* unsupported with CFF fonts */ 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (PS_GetFontValueFunc) NULL /* not implemented */ 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * POSTSCRIPT NAME SERVICE 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const char* 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_ps_name( CFF_Face face ) 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFF_Font cff = (CFF_Font)face->extra.data; 441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann SFNT_Service sfnt = (SFNT_Service)face->sfnt; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* following the OpenType specification 1.7, we return the name stored */ 445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* in the `name' table for a CFF wrapped into an SFNT container */ 446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( sfnt ) 448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann { 449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Library library = FT_FACE_LIBRARY( face ); 450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); 451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_Service_PsFontName service = 452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann (FT_Service_PsFontName)ft_module_get_service( 453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann sfnt_module, 454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_SERVICE_ID_POSTSCRIPT_FONT_NAME ); 455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if ( service && service->get_ps_font_name ) 458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return service->get_ps_font_name( FT_FACE( face ) ); 459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (const char*)cff->font_name; 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_PSFONTNAMEREC( 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_ps_name, 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_PsName_GetFunc)cff_get_ps_name 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * TT CMAP INFO 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * If the charmap is a synthetic Unicode encoding cmap or 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * service defined in SFNT module. 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Otherwise call the service function in the sfnt module. 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_cmap_info( FT_CharMap charmap, 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_CMapInfo *cmap_info ) 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CMap cmap = FT_CMAP( charmap ); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Face face = FT_CMAP_FACE( cmap ); 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Library library = FT_FACE_LIBRARY( face ); 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap_info->language = 0; 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap_info->format = 0; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET && 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET ) 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module sfnt = FT_Get_Module( library, "sfnt" ); 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_TTCMaps service = 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Service_TTCMaps)ft_module_get_service( sfnt, 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP ); 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service && service->get_cmap_info ) 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_cmap_info( charmap, cmap_info ); 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_TTCMAPSREC( 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_get_cmap_info, 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (TT_CMap_Info_GetFunc)cff_get_cmap_info 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * CID INFO SERVICE 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_ros( CFF_Face face, 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *registry, 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* *ordering, 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Int *supplement ) 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff ) 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_FontRecDict dict = &cff->top_font.font_dict; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( dict->cid_registry == 0xFFFFU ) 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( registry ) 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff->registry == NULL ) 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff->registry = cff_index_get_sid_string( cff, 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->cid_registry ); 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *registry = cff->registry; 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( ordering ) 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff->ordering == NULL ) 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff->ordering = cff_index_get_sid_string( cff, 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->cid_ordering ); 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ordering = cff->ordering; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * XXX: According to Adobe TechNote #5176, the supplement in CFF 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * can be a real number. We truncate it to fit public API 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * since freetype-2.3.6. 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( supplement ) 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( dict->cid_supplement < FT_INT_MIN || 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->cid_supplement > FT_INT_MAX ) 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dict->cid_supplement )); 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *supplement = (FT_Int)dict->cid_supplement; 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Fail: 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_is_cid( CFF_Face face, 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool *is_cid ) 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff = (CFF_Font)face->extra.data; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *is_cid = 0; 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff ) 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_FontRecDict dict = &cff->top_font.font_dict; 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( dict->cid_registry != 0xFFFFU ) 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *is_cid = 1; 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_cid_from_glyph_index( CFF_Face face, 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt glyph_index, 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt *cid ) 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Font cff; 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff = (CFF_Font)face->extra.data; 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cff ) 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt c; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_FontRecDict dict = &cff->top_font.font_dict; 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( dict->cid_registry == 0xFFFFU ) 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( glyph_index > cff->num_glyphs ) 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_THROW( Invalid_Argument ); 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov c = cff->charset.sids[glyph_index]; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( cid ) 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *cid = c; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Fail: 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_CIDREC( 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_cid_info, 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * PROPERTY SERVICE 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_property_set( FT_Module module, /* CFF_Driver */ 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* property_name, 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* value ) 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Driver driver = (CFF_Driver)module; 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !ft_strcmp( property_name, "darkening-parameters" ) ) 664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int* darken_params = (FT_Int*)value; 666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int x1 = darken_params[0]; 668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int y1 = darken_params[1]; 669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int x2 = darken_params[2]; 670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int y2 = darken_params[3]; 671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int x3 = darken_params[4]; 672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int y3 = darken_params[5]; 673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int x4 = darken_params[6]; 674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int y4 = darken_params[7]; 675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || 678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || 679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov x1 > x2 || x2 > x3 || x3 > x4 || 680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) 681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[0] = x1; 684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[1] = y1; 685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[2] = x2; 686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[3] = y2; 687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[4] = x3; 688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[5] = y3; 689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[6] = x4; 690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov driver->darken_params[7] = y4; 691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return error; 693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if ( !ft_strcmp( property_name, "hinting-engine" ) ) 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt* hinting_engine = (FT_UInt*)value; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef CFF_CONFIG_OPTION_OLD_ENGINE 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *hinting_engine != FT_CFF_HINTING_ADOBE ) 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Unimplemented_Feature ); 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov driver->hinting_engine = *hinting_engine; 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool* no_stem_darkening = (FT_Bool*)value; 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov driver->no_stem_darkening = *no_stem_darkening; 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE0(( "cff_property_set: missing property `%s'\n", 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov property_name )); 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Missing_Property ); 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_property_get( FT_Module module, /* CFF_Driver */ 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* property_name, 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const void* value ) 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error = FT_Err_Ok; 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_Driver driver = (CFF_Driver)module; 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !ft_strcmp( property_name, "darkening-parameters" ) ) 734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int* darken_params = driver->darken_params; 736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Int* val = (FT_Int*)value; 737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[0] = darken_params[0]; 740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[1] = darken_params[1]; 741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[2] = darken_params[2]; 742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[3] = darken_params[3]; 743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[4] = darken_params[4]; 744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[5] = darken_params[5]; 745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[6] = darken_params[6]; 746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov val[7] = darken_params[7]; 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return error; 749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if ( !ft_strcmp( property_name, "hinting-engine" ) ) 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_UInt hinting_engine = driver->hinting_engine; 753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_UInt* val = (FT_UInt*)value; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *val = hinting_engine; 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Bool no_stem_darkening = driver->no_stem_darkening; 763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FT_Bool* val = (FT_Bool*)value; 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *val = no_stem_darkening; 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE0(( "cff_property_get: missing property `%s'\n", 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov property_name )); 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Missing_Property ); 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICE_PROPERTIESREC( 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_service_properties, 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Properties_SetFunc)cff_property_set, 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (FT_Properties_GetFunc)cff_property_get ) 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** D R I V E R I N T E R F A C E ****/ 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /**** ****/ 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC7( 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_services, 798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET, 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_SERVICEDESCREC6( 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_services, 809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_CALLBACK_DEF( FT_Module_Interface ) 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_interface( FT_Module driver, /* CFF_Driver */ 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const char* module_interface ) 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Library library; 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module sfnt; 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Module_Interface result; 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann /* CFF_SERVICES_GET dereferences `library' in PIC mode */ 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef FT_CONFIG_OPTION_PIC 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !driver ) 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov library = driver->library; 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface ); 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( result != NULL ) 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return result; 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* `driver' is not yet evaluated in non-PIC mode */ 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef FT_CONFIG_OPTION_PIC 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !driver ) 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov library = driver->library; 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !library ) 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* we pass our request to the `sfnt' module */ 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sfnt = FT_Get_Module( library, "sfnt" ); 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The FT_DriverInterface structure is defined in ftdriver.h. */ 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CFF_SIZE_SELECT cff_size_select 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define CFF_SIZE_SELECT 0 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_DEFINE_DRIVER( 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_driver_class, 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_FONT_DRIVER | 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_SCALABLE | 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MODULE_DRIVER_HAS_HINTER, 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CFF_DriverRec ), 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov "cff", 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x10000L, 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0x20000L, 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* module-specific interface */ 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_driver_init, 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_driver_done, 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_interface, 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* now the specific driver fields */ 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( TT_FaceRec ), 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CFF_SizeRec ), 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov sizeof ( CFF_GlyphSlotRec ), 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_face_init, 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_face_done, 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_size_init, 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_size_done, 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_slot_init, 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_slot_done, 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_glyph_load, 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_kerning, 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 0, /* FT_Face_AttachFunc */ 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_get_advances, 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cff_size_request, 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFF_SIZE_SELECT 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ) 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 908