Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1993, 1995, 1996, 1997, 1999 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: gxpcolor.h,v 1.9 2003/08/20 19:53:11 igor Exp $ */
18
/* Pattern color and tile structures and procedures */
19
/* Requires gsmatrix.h, gxcolor2.h, gxdcolor.h */
20
 
21
#ifndef gxpcolor_INCLUDED
22
#  define gxpcolor_INCLUDED
23
 
24
#include "gspcolor.h"
25
#include "gxcspace.h"
26
#include "gxdevice.h"
27
#include "gxdevmem.h"
28
#include "gxpcache.h"
29
 
30
/*
31
 * Define the type of a Pattern, also used with Pattern instances.
32
 */
33
#ifndef gs_pattern_type_DEFINED
34
#  define gs_pattern_type_DEFINED
35
typedef struct gs_pattern_type_s gs_pattern_type_t;
36
#endif
37
struct gs_pattern_type_s {
38
    int PatternType;
39
    struct pp_ {
40
 
41
	/*
42
	 * Define whether a Pattern uses the base color space in its color
43
	 * space, requiring setcolor to provide values for the base color
44
	 * space.  Currently this is true for uncolored PatternType 1
45
	 * patterns, false for all others.
46
	 */
47
 
48
#define pattern_proc_uses_base_space(proc)\
49
  bool proc(const gs_pattern_template_t *)
50
 
51
	pattern_proc_uses_base_space((*uses_base_space));
52
 
53
	/*
54
	 * Make an instance of a Pattern.
55
	 */
56
 
57
#define pattern_proc_make_pattern(proc)\
58
  int proc(gs_client_color *, const gs_pattern_template_t *,\
59
	   const gs_matrix *, gs_state *, gs_memory_t *)
60
 
61
	pattern_proc_make_pattern((*make_pattern));
62
 
63
	/*
64
	 * Get the template from a Pattern instance.
65
	 */
66
 
67
#define pattern_proc_get_pattern(proc)\
68
  const gs_pattern_template_t *proc(const gs_pattern_instance_t *)
69
 
70
	pattern_proc_get_pattern((*get_pattern));
71
 
72
	/*
73
	 * Remap a Pattern color to a device color.
74
	 * cs_proc_remap_color is defined in gxcspace.h.
75
	 */
76
 
77
#define pattern_proc_remap_color(proc)\
78
  cs_proc_remap_color(proc)
79
 
80
	pattern_proc_remap_color((*remap_color));
81
 
82
	/*
83
	 * Perform any special actions required when a pattern instance
84
	 * is made the current color "color" (i.e.: at setcolor time).
85
	 * This is primarily useful for PatternType2 patterns, where the
86
	 * pattern instance specifies a color space.
87
	 */
88
#define pattern_proc_set_color(proc)\
89
  int proc(const gs_client_color *, gs_state *)
90
 
91
	pattern_proc_set_color((*set_color));
92
 
93
    } procs;
94
};
95
 
96
/*
97
 * Initialize the common part of a pattern template.  This procedure is for
98
 * the use of gs_pattern*_init implementations, not clients.
99
 */
100
void gs_pattern_common_init(gs_pattern_template_t *,
101
			    const gs_pattern_type_t *);
102
 
103
/*
104
 * Do the generic work for makepattern: allocate the instance and the
105
 * saved graphics state, and fill in the common members.
106
 */
107
int gs_make_pattern_common(gs_client_color *, const gs_pattern_template_t *,
108
			   const gs_matrix *, gs_state *, gs_memory_t *,
109
			   gs_memory_type_ptr_t);
110
 
111
/* Declare the freeing procedure for Pattern instances. */
112
extern rc_free_proc(rc_free_pattern_instance);
113
 
114
/* Declare the Pattern color space type. */
115
extern const gs_color_space_type gs_color_space_type_Pattern;
116
 
117
/*
118
 * Define the (PatternType 1) Pattern device color types.  There is one type
119
 * for colored patterns, and one uncolored pattern type for each non-Pattern
120
 * device color type.
121
 */
122
extern const gx_device_color_type_t
123
    gx_dc_pattern,
124
    gx_dc_pure_masked, gx_dc_binary_masked, gx_dc_colored_masked;
125
 
126
#define gx_dc_type_pattern (&gx_dc_pattern)
127
 
128
/*
129
 * These device color methods are shared amongst pattern types.
130
 */
131
extern dev_color_proc_save_dc(gx_dc_pattern_save_dc);
132
extern dev_color_proc_write(gx_dc_pattern_write);
133
extern dev_color_proc_read(gx_dc_pattern_read);
134
 
135
/*
136
 * For shading and colored tiling patterns, it is not possible to say
137
 * which color components have non-zero values.
138
 */
139
extern dev_color_proc_get_nonzero_comps(gx_dc_pattern_get_nonzero_comps);
140
 
141
/*
142
 * Define a color tile, an entry in the rendered Pattern cache (and
143
 * eventually in the colored halftone cache).  Note that the depth is
144
 * not sufficient to ensure that the rendering matches a given device;
145
 * however, we don't currently have an object that represents the
146
 * abstraction of a 'color representation'.
147
 */
148
struct gx_color_tile_s {
149
    /* ------ The following are the 'key' in the cache. ------ */
150
    /* Note that the id is a generated instance ID, */
151
    /* and has no relation to the template's gs_uid. */
152
    gx_bitmap_id id;
153
    int depth;
154
    /* We do, however, copy the template's gs_uid, */
155
    /* for use in selective cache purging. */
156
    gs_uid uid;
157
    /* ------ The following are the cache 'value'. ------ */
158
    /* Note that if tbits and tmask both have data != 0, */
159
    /* both must have the same rep_shift. */
160
/****** NON-ZERO shift VALUES ARE NOT SUPPORTED YET. ******/
161
    int tiling_type;		/* TilingType */
162
    gs_matrix step_matrix;	/* tiling space -> device space, */
163
    /* see gxcolor2.h for details */
164
    gs_rect bbox;		/* bbox of tile in tiling space */
165
    gx_strip_bitmap tbits;	/* data = 0 if uncolored */
166
    gx_strip_bitmap tmask;	/* data = 0 if no mask */
167
    /* (i.e., the mask is all 1's) */
168
    bool is_simple;		/* true if xstep/ystep = tile size */
169
    bool is_dummy;		/* if true, the device manages the pattern, 
170
                                   and the content of the tile is empty. */
171
    /* The following is neither key nor value. */
172
    uint index;			/* the index of the tile within */
173
    /* the cache (for GC) */
174
};
175
 
176
#define private_st_color_tile()	/* in gxpcmap.c */\
177
  gs_private_st_ptrs2(st_color_tile, gx_color_tile, "gx_color_tile",\
178
    color_tile_enum_ptrs, color_tile_reloc_ptrs, tbits.data, tmask.data)
179
#define private_st_color_tile_element()	/* in gxpcmap.c */\
180
  gs_private_st_element(st_color_tile_element, gx_color_tile,\
181
    "gx_color_tile[]", color_tile_elt_enum_ptrs, color_tile_elt_reloc_ptrs,\
182
    st_color_tile)
183
 
184
/* Define the Pattern cache. */
185
/*#include "gxpcache.h" *//* (above) */
186
 
187
/* Allocate a Pattern cache. */
188
/* We shorten the procedure names because some VMS compilers */
189
/* truncate names to 23 characters. */
190
uint gx_pat_cache_default_tiles(void);
191
ulong gx_pat_cache_default_bits(void);
192
gx_pattern_cache *gx_pattern_alloc_cache(gs_memory_t *, uint, ulong);
193
 
194
/* Get or set the Pattern cache in a gstate. */
195
gx_pattern_cache *gstate_pattern_cache(gs_state *);
196
void gstate_set_pattern_cache(gs_state *, gx_pattern_cache *);
197
 
198
/*
199
 * Define a device for accumulating the rendering of a Pattern.
200
 * This is actually a wrapper for two other devices: one that accumulates
201
 * the actual pattern image (if this is a colored pattern), and one that
202
 * accumulates a mask defining which pixels in the image are set.
203
 */
204
typedef struct gx_device_pattern_accum_s {
205
    gx_device_forward_common;
206
    /* Client sets these before opening */
207
    gs_memory_t *bitmap_memory;
208
    const gs_pattern1_instance_t *instance;
209
    /* open sets these */
210
    gx_device_memory *bits;	/* target also points to bits */
211
    gx_device_memory *mask;
212
} gx_device_pattern_accum;
213
 
214
#define private_st_device_pattern_accum() /* in gxpcmap.c */\
215
  gs_private_st_suffix_add3_final(st_device_pattern_accum,\
216
    gx_device_pattern_accum, "pattern accumulator", pattern_accum_enum,\
217
    pattern_accum_reloc, gx_device_finalize, st_device_forward,\
218
    instance, bits, mask)
219
 
220
/* Allocate a pattern accumulator. */
221
gx_device_pattern_accum *gx_pattern_accum_alloc(gs_memory_t * memory, client_name_t);
222
 
223
/* Add an accumulated pattern to the cache. */
224
/* Note that this does not free any of the data in the accumulator */
225
/* device, but it may zero out the bitmap_memory pointers to prevent */
226
/* the accumulated bitmaps from being freed when the device is closed. */
227
int gx_pattern_cache_add_entry(gs_imager_state *, gx_device_pattern_accum *,
228
			       gx_color_tile **);
229
/* Add a dummy Pattern cache entry.  Stubs a pattern tile for interpreter when
230
   device handles high level patterns. */
231
int gx_pattern_cache_add_dummy_entry(gs_imager_state *pis, gs_pattern1_instance_t *pinst,
232
				int depth);
233
 
234
/* Look up a pattern color in the cache. */
235
bool gx_pattern_cache_lookup(gx_device_color *, const gs_imager_state *,
236
			     gx_device *, gs_color_select_t);
237
 
238
/* Purge selected entries from the pattern cache. */
239
void gx_pattern_cache_winnow(gx_pattern_cache *,
240
			     bool (*)(gx_color_tile *, void *),
241
			     void *);
242
 
243
#endif /* gxpcolor_INCLUDED */