2 |
- |
1 |
/* Copyright (C) 2002 Aladdin Enterprises. All rights reserved.
|
|
|
2 |
|
|
|
3 |
This software is provided AS-IS with no warranty, either express or
|
|
|
4 |
implied.
|
|
|
5 |
|
|
|
6 |
This software is distributed under license and may not be copied,
|
|
|
7 |
modified or distributed except as expressly authorized under the terms
|
|
|
8 |
of the license contained in the file LICENSE in this distribution.
|
|
|
9 |
|
|
|
10 |
For more information about licensing, please refer to
|
|
|
11 |
http://www.ghostscript.com/licensing/. For information on
|
|
|
12 |
commercial licensing, go to http://www.artifex.com/licensing/ or
|
|
|
13 |
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
|
|
|
14 |
San Rafael, CA 94903, U.S.A., +1(415)492-9861.
|
|
|
15 |
*/
|
|
|
16 |
|
|
|
17 |
/* $Id: gxfcmap1.h,v 1.1 2002/04/08 21:02:44 lpd Exp $ */
|
|
|
18 |
/* Adobe CMapType 1 CMap structure definitions */
|
|
|
19 |
|
|
|
20 |
#ifndef gxfcmap1_INCLUDED
|
|
|
21 |
# define gxfcmap1_INCLUDED
|
|
|
22 |
|
|
|
23 |
#include "gxfcmap.h"
|
|
|
24 |
|
|
|
25 |
/*
|
|
|
26 |
* This is the concrete subclass of gs_cmap_t that directly implements
|
|
|
27 |
* the Adobe CMapType 1/2 specification.
|
|
|
28 |
*
|
|
|
29 |
* In this implementation, the two maps (defs and notdefs) each consist of
|
|
|
30 |
* two separate parts:
|
|
|
31 |
*
|
|
|
32 |
* - A key map, which maps a parsed character to an index in a value
|
|
|
33 |
* table.
|
|
|
34 |
*
|
|
|
35 |
* - A value table in which each entry specifies a string, a name, or a
|
|
|
36 |
* CID, as described in gxfcmap.h.
|
|
|
37 |
*
|
|
|
38 |
* We separate the value tables from the key maps so that large, closely
|
|
|
39 |
* related CMaps such as UniCNS-UCS2-H and UniCNS-UTF8-H can (someday)
|
|
|
40 |
* share the value tables but not the code space or key maps.
|
|
|
41 |
*/
|
|
|
42 |
typedef struct gs_cmap_adobe1_s gs_cmap_adobe1_t;
|
|
|
43 |
|
|
|
44 |
/*
|
|
|
45 |
* To save space in lookup tables, all keys within each lookup range share
|
|
|
46 |
* a prefix (which may be empty).
|
|
|
47 |
*
|
|
|
48 |
* The strings in this structure are all const after initialization.
|
|
|
49 |
*/
|
|
|
50 |
typedef struct gx_cmap_lookup_range_s {
|
|
|
51 |
gs_cmap_adobe1_t *cmap; /* back pointer for glyph marking */
|
|
|
52 |
int num_entries;
|
|
|
53 |
/* Keys */
|
|
|
54 |
byte key_prefix[MAX_CMAP_CODE_SIZE];
|
|
|
55 |
int key_prefix_size; /* 0 .. MAX_CMAP_CODE_SIZE */
|
|
|
56 |
int key_size; /* 0 .. MAX_CMAP_CODE_SIZE - key_prefix_s' */
|
|
|
57 |
bool key_is_range;
|
|
|
58 |
gs_string keys; /* [num_entries * key_size * (key_is_range+1)] */
|
|
|
59 |
/* Values */
|
|
|
60 |
gx_cmap_code_value_type_t value_type;
|
|
|
61 |
int value_size; /* bytes per value */
|
|
|
62 |
gs_string values; /* [num_entries * value_size] */
|
|
|
63 |
int font_index;
|
|
|
64 |
} gx_cmap_lookup_range_t;
|
|
|
65 |
/*
|
|
|
66 |
* The GC descriptor for lookup ranges is complex, because it must mark
|
|
|
67 |
* names.
|
|
|
68 |
*/
|
|
|
69 |
extern_st(st_cmap_lookup_range_element);
|
|
|
70 |
#define public_st_cmap_lookup_range() /* in gsfcmap.c */\
|
|
|
71 |
gs_public_st_composite(st_cmap_lookup_range, gx_cmap_lookup_range_t,\
|
|
|
72 |
"gx_cmap_lookup_range_t", cmap_lookup_range_enum_ptrs,\
|
|
|
73 |
cmap_lookup_range_reloc_ptrs)
|
|
|
74 |
#define public_st_cmap_lookup_range_element() /* in gsfcmap.c */\
|
|
|
75 |
gs_public_st_element(st_cmap_lookup_range_element, gx_cmap_lookup_range_t,\
|
|
|
76 |
"gx_cmap_lookup_range_t[]", cmap_lookup_range_elt_enum_ptrs,\
|
|
|
77 |
cmap_lookup_range_elt_reloc_ptrs, st_cmap_lookup_range)
|
|
|
78 |
|
|
|
79 |
/*
|
|
|
80 |
* The main body of data in a CMap is two code maps, one for defined
|
|
|
81 |
* characters, one for notdefs.
|
|
|
82 |
*/
|
|
|
83 |
typedef struct gx_code_space_s {
|
|
|
84 |
gx_code_space_range_t *ranges;
|
|
|
85 |
int num_ranges;
|
|
|
86 |
} gx_code_space_t;
|
|
|
87 |
typedef struct gx_code_map_s {
|
|
|
88 |
gx_cmap_lookup_range_t *lookup;
|
|
|
89 |
int num_lookup;
|
|
|
90 |
} gx_code_map_t;
|
|
|
91 |
struct gs_cmap_adobe1_s {
|
|
|
92 |
GS_CMAP_COMMON;
|
|
|
93 |
gx_code_space_t code_space;
|
|
|
94 |
gx_code_map_t def; /* defined characters */
|
|
|
95 |
gx_code_map_t notdef; /* notdef characters */
|
|
|
96 |
gs_glyph_mark_proc_t mark_glyph; /* glyph marking procedure for GC */
|
|
|
97 |
void *mark_glyph_data; /* closure data */
|
|
|
98 |
};
|
|
|
99 |
|
|
|
100 |
extern_st(st_cmap_adobe1);
|
|
|
101 |
#define public_st_cmap_adobe1() /* in gsfcmap1.c */\
|
|
|
102 |
gs_public_st_suffix_add4(st_cmap_adobe1, gs_cmap_adobe1_t,\
|
|
|
103 |
"gs_cmap_adobe1_t", cmap_adobe1_enum_ptrs, cmap_adobe1_reloc_ptrs,\
|
|
|
104 |
st_cmap,\
|
|
|
105 |
code_space.ranges, def.lookup, notdef.lookup, mark_glyph_data)
|
|
|
106 |
|
|
|
107 |
/* ---------------- Procedures ---------------- */
|
|
|
108 |
|
|
|
109 |
/*
|
|
|
110 |
* Allocate and initialize an Adobe1 CMap. The caller must still fill in
|
|
|
111 |
* the code space ranges, lookup tables, keys, and values.
|
|
|
112 |
*/
|
|
|
113 |
int gs_cmap_adobe1_alloc(gs_cmap_adobe1_t **ppcmap, int wmode,
|
|
|
114 |
const byte *map_name, uint name_size,
|
|
|
115 |
uint num_fonts, uint num_ranges, uint num_lookups,
|
|
|
116 |
uint keys_size, uint values_size,
|
|
|
117 |
const gs_cid_system_info_t *pcidsi, gs_memory_t *mem);
|
|
|
118 |
|
|
|
119 |
#endif /* gxfcmap1_INCLUDED */
|