1*593dc095SDavid du Colombier /* Copyright (C) 2001 Aladdin Enterprises. All rights reserved. 2*593dc095SDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 5*593dc095SDavid du Colombier 6*593dc095SDavid du Colombier This software is distributed under license and may not be copied, 7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms 8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution. 9*593dc095SDavid du Colombier 10*593dc095SDavid du Colombier For more information about licensing, please refer to 11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on 12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or 13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15*593dc095SDavid du Colombier */ 16*593dc095SDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gsgdata.h,v 1.5 2004/11/15 01:12:06 ray Exp $ */ 18*593dc095SDavid du Colombier /* Interface for glyph data access */ 19*593dc095SDavid du Colombier 20*593dc095SDavid du Colombier #ifndef gsgdata_INCLUDED 21*593dc095SDavid du Colombier # define gsgdata_INCLUDED 22*593dc095SDavid du Colombier 23*593dc095SDavid du Colombier #include "gsstype.h" /* for extern_st */ 24*593dc095SDavid du Colombier 25*593dc095SDavid du Colombier /* 26*593dc095SDavid du Colombier * Define the structure used to return the data for a glyph upon 27*593dc095SDavid du Colombier * request. "Data" currently means the bytes of a Type 1, TrueType, or 28*593dc095SDavid du Colombier * similar scalable outline, or the bits of a bitmap (not currently used). 29*593dc095SDavid du Colombier */ 30*593dc095SDavid du Colombier 31*593dc095SDavid du Colombier /* ------ Information for clients ------ */ 32*593dc095SDavid du Colombier 33*593dc095SDavid du Colombier /* 34*593dc095SDavid du Colombier * Clients that get glyph data (for example, using the get_outline procedure 35*593dc095SDavid du Colombier * of a Type 42 or a CIDFontType 2 font) do so as follows: 36*593dc095SDavid du Colombier 37*593dc095SDavid du Colombier gs_glyph_data_t gdata; 38*593dc095SDavid du Colombier int code; 39*593dc095SDavid du Colombier ... 40*593dc095SDavid du Colombier code = ...get_outline(...&gdata...); 41*593dc095SDavid du Colombier 42*593dc095SDavid du Colombier * 43*593dc095SDavid du Colombier * If code >= 0 (no error), gdata.bits.{data,size} point to the outline data. 44*593dc095SDavid du Colombier * 45*593dc095SDavid du Colombier * Since the data may have been allocated in response to the request, 46*593dc095SDavid du Colombier * when the client is finished with the data, it should call: 47*593dc095SDavid du Colombier 48*593dc095SDavid du Colombier gs_glyph_data_free(&gdata, "client name"); 49*593dc095SDavid du Colombier 50*593dc095SDavid du Colombier * This is a no-op if the data are stored in the font, but an actual freeing 51*593dc095SDavid du Colombier * procedure if they were allocated by get_outline. 52*593dc095SDavid du Colombier */ 53*593dc095SDavid du Colombier 54*593dc095SDavid du Colombier /* ------ Structure declaration ------ */ 55*593dc095SDavid du Colombier 56*593dc095SDavid du Colombier typedef struct gs_glyph_data_procs_s gs_glyph_data_procs_t; 57*593dc095SDavid du Colombier #ifndef gs_glyph_data_DEFINED 58*593dc095SDavid du Colombier # define gs_glyph_data_DEFINED 59*593dc095SDavid du Colombier typedef struct gs_glyph_data_s gs_glyph_data_t; 60*593dc095SDavid du Colombier #endif 61*593dc095SDavid du Colombier struct gs_glyph_data_s { 62*593dc095SDavid du Colombier gs_const_bytestring bits; /* pointer to actual data returned here */ 63*593dc095SDavid du Colombier const gs_glyph_data_procs_t *procs; 64*593dc095SDavid du Colombier void *proc_data; 65*593dc095SDavid du Colombier gs_memory_t *memory; /* allocator to use (may be different than font) */ 66*593dc095SDavid du Colombier }; 67*593dc095SDavid du Colombier extern_st(st_glyph_data); 68*593dc095SDavid du Colombier #define ST_GLYPH_DATA_NUM_PTRS 2 69*593dc095SDavid du Colombier 70*593dc095SDavid du Colombier /* 71*593dc095SDavid du Colombier * NOTE: Clients must not call these procedures directly. Use the 72*593dc095SDavid du Colombier * gs_glyph_data_{substring,free} procedures declared below. 73*593dc095SDavid du Colombier */ 74*593dc095SDavid du Colombier struct gs_glyph_data_procs_s { 75*593dc095SDavid du Colombier #define GS_PROC_GLYPH_DATA_FREE(proc)\ 76*593dc095SDavid du Colombier void proc(gs_glyph_data_t *pgd, client_name_t cname) 77*593dc095SDavid du Colombier GS_PROC_GLYPH_DATA_FREE((*free)); 78*593dc095SDavid du Colombier #define GS_PROC_GLYPH_DATA_SUBSTRING(proc)\ 79*593dc095SDavid du Colombier int proc(gs_glyph_data_t *pgd, uint offset, uint size) 80*593dc095SDavid du Colombier GS_PROC_GLYPH_DATA_SUBSTRING((*substring)); 81*593dc095SDavid du Colombier }; 82*593dc095SDavid du Colombier 83*593dc095SDavid du Colombier /* 84*593dc095SDavid du Colombier * Replace glyph data by a substring. If the data were allocated by 85*593dc095SDavid du Colombier * get_outline et al, this frees the part of the data outside the substring. 86*593dc095SDavid du Colombier */ 87*593dc095SDavid du Colombier int gs_glyph_data_substring(gs_glyph_data_t *pgd, uint offset, uint size); 88*593dc095SDavid du Colombier 89*593dc095SDavid du Colombier /* 90*593dc095SDavid du Colombier * Free the data for a glyph if they were allocated by get_outline et al. 91*593dc095SDavid du Colombier * This also does the equivalent of a from_null (see below) so that 92*593dc095SDavid du Colombier * multiple calls of this procedure are harmless. 93*593dc095SDavid du Colombier */ 94*593dc095SDavid du Colombier void gs_glyph_data_free(gs_glyph_data_t *pgd, client_name_t cname); 95*593dc095SDavid du Colombier 96*593dc095SDavid du Colombier /* ------ Information for implementors of get_outline et al ------ */ 97*593dc095SDavid du Colombier 98*593dc095SDavid du Colombier /* 99*593dc095SDavid du Colombier * The implementor of get_outline or similar procedures should set the 100*593dc095SDavid du Colombier * client's glyph_data_t structure as follows: 101*593dc095SDavid du Colombier 102*593dc095SDavid du Colombier ...get_outline...(...gs_font *pfont...gs_glyph_data_t *pgd...) 103*593dc095SDavid du Colombier { 104*593dc095SDavid du Colombier ... 105*593dc095SDavid du Colombier gs_glyph_data_from_string(pgd, odata, osize, NULL); 106*593dc095SDavid du Colombier (or) gs_glyph_data_from_string(pgd, odata, osize, pfont); 107*593dc095SDavid du Colombier } 108*593dc095SDavid du Colombier 109*593dc095SDavid du Colombier * If the data are in an object rather then a string, use 110*593dc095SDavid du Colombier 111*593dc095SDavid du Colombier gs_glyph_data_from_bytes(pgd, obase, ooffset, osize, <NULL|pfont>); 112*593dc095SDavid du Colombier 113*593dc095SDavid du Colombier * The last argument of gs_glyph_data_from_{string|bytes} should be pfont 114*593dc095SDavid du Colombier * iff odata/osize were allocated by this call and will not be retained 115*593dc095SDavid du Colombier * by the implementor (i.e., should be freed when the client calls 116*593dc095SDavid du Colombier * gs_glyph_data_free), NULL otherwise. 117*593dc095SDavid du Colombier */ 118*593dc095SDavid du Colombier 119*593dc095SDavid du Colombier /* 120*593dc095SDavid du Colombier * Initialize glyph data from a string or from bytes. 121*593dc095SDavid du Colombier */ 122*593dc095SDavid du Colombier #ifndef gs_font_DEFINED 123*593dc095SDavid du Colombier # define gs_font_DEFINED 124*593dc095SDavid du Colombier typedef struct gs_font_s gs_font; 125*593dc095SDavid du Colombier #endif 126*593dc095SDavid du Colombier void gs_glyph_data_from_string(gs_glyph_data_t *pgd, const byte *data, 127*593dc095SDavid du Colombier uint size, gs_font *font); 128*593dc095SDavid du Colombier void gs_glyph_data_from_bytes(gs_glyph_data_t *pgd, const byte *bytes, 129*593dc095SDavid du Colombier uint offset, uint size, gs_font *font); 130*593dc095SDavid du Colombier /* from_null(pgd) is a shortcut for from_string(pgd, NULL, 0, NULL). */ 131*593dc095SDavid du Colombier void gs_glyph_data_from_null(gs_glyph_data_t *pgd); 132*593dc095SDavid du Colombier 133*593dc095SDavid du Colombier #endif /* gsgdata_INCLUDED */ 134