1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: gsptype2.h 9934 2009-08-05 22:12:58Z marcos $ */
15 /* Client interface to PatternType 2 Patterns */
16 
17 #ifndef gsptype2_INCLUDED
18 #  define gsptype2_INCLUDED
19 
20 #include "gspcolor.h"
21 #include "gsdcolor.h"
22 #include "gxfixed.h"
23 
24 /* ---------------- Types and structures ---------------- */
25 
26 /* PatternType 2 template */
27 
28 #ifndef gs_shading_t_DEFINED
29 #  define gs_shading_t_DEFINED
30 typedef struct gs_shading_s gs_shading_t;
31 #endif
32 
33 typedef struct gs_pattern2_template_s {
34     gs_pattern_template_common;
35     const gs_shading_t *Shading;
36 } gs_pattern2_template_t;
37 
38 #define private_st_pattern2_template() /* in gsptype2.c */\
39   gs_private_st_suffix_add1(st_pattern2_template,\
40     gs_pattern2_template_t, "gs_pattern2_template_t",\
41     pattern2_template_enum_ptrs, pattern2_template_reloc_ptrs,\
42     st_pattern_template, Shading)
43 #define st_pattern2_template_max_ptrs (st_pattern_template_max_ptrs + 1)
44 
45 /* PatternType 2 instance */
46 
47 #ifndef gx_device_color_DEFINED
48 #  define gx_device_color_DEFINED
49 typedef struct gx_device_color_s gx_device_color;
50 #endif
51 
52 typedef struct gs_pattern2_instance_s {
53     gs_pattern_instance_common;
54     gs_pattern2_template_t template;
55     bool shfill;
56 } gs_pattern2_instance_t;
57 
58 #define private_st_pattern2_instance() /* in gsptype2.c */\
59   gs_private_st_composite(st_pattern2_instance, gs_pattern2_instance_t,\
60     "gs_pattern2_instance_t", pattern2_instance_enum_ptrs,\
61     pattern2_instance_reloc_ptrs)
62 
63 #ifndef gx_path_DEFINED
64 #define gx_path_DEFINED
65 typedef struct gx_path_s gx_path;
66 #endif
67 
68 #ifndef gx_device_DEFINED
69 #define gx_device_DEFINED
70 typedef struct gx_device_s gx_device;
71 #endif
72 
73 #ifndef gs_color_space_DEFINED
74 #  define gs_color_space_DEFINED
75 typedef struct gs_color_space_s gs_color_space;
76 #endif
77 
78 #ifndef gx_clip_path_DEFINED
79 #  define gx_clip_path_DEFINED
80 typedef struct gx_clip_path_s gx_clip_path;
81 #endif
82 
83 extern const gx_device_color_type_t gx_dc_pattern2;
84 
85 #define gx_dc_type_pattern2 (&gx_dc_pattern2)
86 
87 /* ---------------- Procedures ---------------- */
88 
89 /*
90  * We should provide a gs_cspace_build_Pattern2 procedure to construct
91  * the color space, but we don't.
92  */
93 
94 /* Initialize a PatternType 2 pattern. */
95 void gs_pattern2_init(gs_pattern2_template_t *);
96 
97 /* Check device color for Pattern Type 2. */
98 bool gx_dc_is_pattern2_color(const gx_device_color *pdevc);
99 
100 /* Set the 'shfill' flag to a PatternType 2 pattern instance. */
101 int gs_pattern2_set_shfill(gs_client_color * pcc);
102 
103 /* Transform a shading bounding box into device space. */
104 int gx_dc_pattern2_shade_bbox_transform2fixed(const gs_rect * rect,
105 	const gs_imager_state * pis, gs_fixed_rect * rfixed);
106 
107 /* Get a shading bbox. Returns 1 on success. */
108 int gx_dc_pattern2_get_bbox(const gx_device_color * pdevc, gs_fixed_rect *bbox);
109 
110 /* Checks whether a PatternType 2 has a shading BBox. */
111 int gx_dc_pattern2_color_has_bbox(const gx_device_color * pdevc);
112 
113 /* Intersect a clipping path a shading BBox. */
114 int gx_dc_pattern2_clip_with_bbox(const gx_device_color * pdevc, gx_device * pdev,
115                                   gx_clip_path *cpath_local, const gx_clip_path **cpath1);
116 /* Intersect a clipping path a shading BBox. */
117 int gx_dc_pattern2_clip_with_bbox_simple(const gx_device_color * pdevc, gx_device * pdev,
118 				  gx_clip_path *cpath);
119 /* Check whether color is a shading with BBox. */
120 int gx_dc_pattern2_is_rectangular_cell(const gx_device_color * pdevc, gx_device * pdev, gs_fixed_rect *rect);
121 
122 /* Get a shading color space. */
123 const gs_color_space *gx_dc_pattern2_get_color_space(const gx_device_color * pdevc);
124 
125 /* Check device color for a possibly self-overlapping shading. */
126 bool gx_dc_pattern2_can_overlap(const gx_device_color *pdevc);
127 
128 /* Check whether a pattern color has a background. */
129 bool gx_dc_pattern2_has_background(const gx_device_color *pdevc);
130 #endif /* gsptype2_INCLUDED */
131