xref: /plan9/sys/src/cmd/gs/src/gsgdata.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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