xref: /plan9-contrib/sys/src/cmd/gs/src/gsshade.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid 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.
97dd7cddfSDavid 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.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gsshade.h,v 1.9 2005/04/19 08:36:38 igor Exp $ */
187dd7cddfSDavid du Colombier /* Definitions for shading */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gsshade_INCLUDED
217dd7cddfSDavid du Colombier #  define gsshade_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "gsccolor.h"
247dd7cddfSDavid du Colombier #include "gscspace.h"
257dd7cddfSDavid du Colombier #include "gsdsrc.h"
267dd7cddfSDavid du Colombier #include "gsfunc.h"
277dd7cddfSDavid du Colombier #include "gsmatrix.h"
287dd7cddfSDavid du Colombier #include "gxfixed.h"
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier /* ---------------- Types and structures ---------------- */
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier /* Define the shading types. */
337dd7cddfSDavid du Colombier typedef enum {
347dd7cddfSDavid du Colombier     shading_type_Function_based = 1,
357dd7cddfSDavid du Colombier     shading_type_Axial = 2,
367dd7cddfSDavid du Colombier     shading_type_Radial = 3,
377dd7cddfSDavid du Colombier     shading_type_Free_form_Gouraud_triangle = 4,
387dd7cddfSDavid du Colombier     shading_type_Lattice_form_Gouraud_triangle = 5,
397dd7cddfSDavid du Colombier     shading_type_Coons_patch = 6,
407dd7cddfSDavid du Colombier     shading_type_Tensor_product_patch = 7
417dd7cddfSDavid du Colombier } gs_shading_type_t;
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier /*
447dd7cddfSDavid du Colombier  * Define information common to all shading types.  We separate the private
457dd7cddfSDavid du Colombier  * part from the parameters so that clients can create parameter structures
467dd7cddfSDavid du Colombier  * without having to know the structure of the implementation.
477dd7cddfSDavid du Colombier  */
487dd7cddfSDavid du Colombier #define gs_shading_params_common\
497dd7cddfSDavid du Colombier   gs_color_space *ColorSpace;\
507dd7cddfSDavid du Colombier   gs_client_color *Background;\
517dd7cddfSDavid du Colombier   bool have_BBox;\
527dd7cddfSDavid du Colombier   gs_rect BBox;\
537dd7cddfSDavid du Colombier   bool AntiAlias
547dd7cddfSDavid du Colombier 
557dd7cddfSDavid du Colombier typedef struct gs_shading_params_s {
567dd7cddfSDavid du Colombier     gs_shading_params_common;
577dd7cddfSDavid du Colombier } gs_shading_params_t;
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier /* Define the type-specific procedures for shadings. */
607dd7cddfSDavid du Colombier #ifndef gs_shading_t_DEFINED
617dd7cddfSDavid du Colombier #  define gs_shading_t_DEFINED
627dd7cddfSDavid du Colombier typedef struct gs_shading_s gs_shading_t;
637dd7cddfSDavid du Colombier #endif
647dd7cddfSDavid du Colombier #ifndef gx_device_DEFINED
657dd7cddfSDavid du Colombier #  define gx_device_DEFINED
667dd7cddfSDavid du Colombier typedef struct gx_device_s gx_device;
677dd7cddfSDavid du Colombier #endif
683ff48bf5SDavid du Colombier 
697dd7cddfSDavid du Colombier /*
707dd7cddfSDavid du Colombier  * Fill a user space rectangle.  This will paint every pixel that is in the
717dd7cddfSDavid du Colombier  * intersection of the rectangle and the shading's geometry, but it may
727dd7cddfSDavid du Colombier  * leave some pixels in the rectangle unpainted, and it may also paint
737dd7cddfSDavid du Colombier  * outside the rectangle: the caller is responsible for setting up a
747dd7cddfSDavid du Colombier  * clipping device if necessary.
757dd7cddfSDavid du Colombier  */
763ff48bf5SDavid du Colombier #define SHADING_FILL_RECTANGLE_PROC(proc)\
77*593dc095SDavid du Colombier   int proc(const gs_shading_t *psh, const gs_rect *prect,\
78*593dc095SDavid du Colombier 	   const gs_fixed_rect *prect_clip, gx_device *dev,\
79*593dc095SDavid du Colombier 	   gs_imager_state *pis)
803ff48bf5SDavid du Colombier typedef SHADING_FILL_RECTANGLE_PROC((*shading_fill_rectangle_proc_t));
81*593dc095SDavid du Colombier #define gs_shading_fill_rectangle(psh, prect, prect_clip, dev, pis)\
82*593dc095SDavid du Colombier   ((psh)->head.procs.fill_rectangle(psh, prect, prect_clip, dev, pis))
833ff48bf5SDavid du Colombier 
843ff48bf5SDavid du Colombier /* Define the generic shading structures. */
853ff48bf5SDavid du Colombier typedef struct gs_shading_procs_s {
863ff48bf5SDavid du Colombier     shading_fill_rectangle_proc_t fill_rectangle;
873ff48bf5SDavid du Colombier } gs_shading_procs_t;
887dd7cddfSDavid du Colombier typedef struct gs_shading_head_s {
897dd7cddfSDavid du Colombier     gs_shading_type_t type;
903ff48bf5SDavid du Colombier     gs_shading_procs_t procs;
917dd7cddfSDavid du Colombier } gs_shading_head_t;
927dd7cddfSDavid du Colombier 
937dd7cddfSDavid du Colombier /* Define a generic shading, for use as the target type of pointers. */
947dd7cddfSDavid du Colombier struct gs_shading_s {
957dd7cddfSDavid du Colombier     gs_shading_head_t head;
967dd7cddfSDavid du Colombier     gs_shading_params_t params;
977dd7cddfSDavid du Colombier };
987dd7cddfSDavid du Colombier #define ShadingType(psh) ((psh)->head.type)
997dd7cddfSDavid du Colombier #define private_st_shading()	/* in gsshade.c */\
1007dd7cddfSDavid du Colombier   gs_private_st_ptrs2(st_shading, gs_shading_t, "gs_shading_t",\
1017dd7cddfSDavid du Colombier     shading_enum_ptrs, shading_reloc_ptrs,\
1027dd7cddfSDavid du Colombier     params.ColorSpace, params.Background)
1037dd7cddfSDavid du Colombier 
1047dd7cddfSDavid du Colombier /* Define Function-based shading. */
1057dd7cddfSDavid du Colombier typedef struct gs_shading_Fb_params_s {
1067dd7cddfSDavid du Colombier     gs_shading_params_common;
1077dd7cddfSDavid du Colombier     float Domain[4];
1087dd7cddfSDavid du Colombier     gs_matrix Matrix;
1097dd7cddfSDavid du Colombier     gs_function_t *Function;
1107dd7cddfSDavid du Colombier } gs_shading_Fb_params_t;
1117dd7cddfSDavid du Colombier 
1127dd7cddfSDavid du Colombier #define private_st_shading_Fb()	/* in gsshade.c */\
1137dd7cddfSDavid du Colombier   gs_private_st_suffix_add1(st_shading_Fb, gs_shading_Fb_t,\
1147dd7cddfSDavid du Colombier     "gs_shading_Fb_t", shading_Fb_enum_ptrs, shading_Fb_reloc_ptrs,\
1157dd7cddfSDavid du Colombier     st_shading, params.Function)
1167dd7cddfSDavid du Colombier 
1177dd7cddfSDavid du Colombier /* Define Axial shading. */
1187dd7cddfSDavid du Colombier typedef struct gs_shading_A_params_s {
1197dd7cddfSDavid du Colombier     gs_shading_params_common;
1207dd7cddfSDavid du Colombier     float Coords[4];
1217dd7cddfSDavid du Colombier     float Domain[2];
1227dd7cddfSDavid du Colombier     gs_function_t *Function;
1237dd7cddfSDavid du Colombier     bool Extend[2];
1247dd7cddfSDavid du Colombier } gs_shading_A_params_t;
1257dd7cddfSDavid du Colombier 
1267dd7cddfSDavid du Colombier #define private_st_shading_A()	/* in gsshade.c */\
1277dd7cddfSDavid du Colombier   gs_private_st_suffix_add1(st_shading_A, gs_shading_A_t,\
1287dd7cddfSDavid du Colombier     "gs_shading_A_t", shading_A_enum_ptrs, shading_A_reloc_ptrs,\
1297dd7cddfSDavid du Colombier     st_shading, params.Function)
1307dd7cddfSDavid du Colombier 
1317dd7cddfSDavid du Colombier /* Define Radial shading. */
1327dd7cddfSDavid du Colombier typedef struct gs_shading_R_params_s {
1337dd7cddfSDavid du Colombier     gs_shading_params_common;
1347dd7cddfSDavid du Colombier     float Coords[6];
1357dd7cddfSDavid du Colombier     float Domain[2];
1367dd7cddfSDavid du Colombier     gs_function_t *Function;
1377dd7cddfSDavid du Colombier     bool Extend[2];
1387dd7cddfSDavid du Colombier } gs_shading_R_params_t;
1397dd7cddfSDavid du Colombier 
1407dd7cddfSDavid du Colombier #define private_st_shading_R()	/* in gsshade.c */\
1417dd7cddfSDavid du Colombier   gs_private_st_suffix_add1(st_shading_R, gs_shading_R_t,\
1427dd7cddfSDavid du Colombier     "gs_shading_R_t", shading_R_enum_ptrs, shading_R_reloc_ptrs,\
1437dd7cddfSDavid du Colombier     st_shading, params.Function)
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier /* Define common parameters for mesh shading. */
1467dd7cddfSDavid du Colombier #define gs_shading_mesh_params_common\
1477dd7cddfSDavid du Colombier   gs_shading_params_common;\
1487dd7cddfSDavid du Colombier   gs_data_source_t DataSource;\
1497dd7cddfSDavid du Colombier   int BitsPerCoordinate;\
1507dd7cddfSDavid du Colombier   int BitsPerComponent;\
1517dd7cddfSDavid du Colombier   float *Decode;\
1527dd7cddfSDavid du Colombier   gs_function_t *Function
1537dd7cddfSDavid du Colombier /* The following are for internal use only. */
1547dd7cddfSDavid du Colombier typedef struct gs_shading_mesh_params_s {
1557dd7cddfSDavid du Colombier     gs_shading_mesh_params_common;
1567dd7cddfSDavid du Colombier } gs_shading_mesh_params_t;
1577dd7cddfSDavid du Colombier typedef struct gs_shading_mesh_s {
1587dd7cddfSDavid du Colombier     gs_shading_head_t head;
1597dd7cddfSDavid du Colombier     gs_shading_mesh_params_t params;
1607dd7cddfSDavid du Colombier } gs_shading_mesh_t;
1617dd7cddfSDavid du Colombier 
1627dd7cddfSDavid du Colombier #define private_st_shading_mesh()	/* in gsshade.c */\
163*593dc095SDavid du Colombier   gs_private_st_composite(st_shading_mesh, gs_shading_mesh_t,\
164*593dc095SDavid du Colombier     "gs_shading_mesh_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier /* Define Free-form Gouraud triangle mesh shading. */
1677dd7cddfSDavid du Colombier typedef struct gs_shading_FfGt_params_s {
1687dd7cddfSDavid du Colombier     gs_shading_mesh_params_common;
1697dd7cddfSDavid du Colombier     int BitsPerFlag;
1707dd7cddfSDavid du Colombier } gs_shading_FfGt_params_t;
1717dd7cddfSDavid du Colombier 
1727dd7cddfSDavid du Colombier #define private_st_shading_FfGt()	/* in gsshade.c */\
173*593dc095SDavid du Colombier   gs_private_st_composite_only(st_shading_FfGt, gs_shading_FfGt_t,\
174*593dc095SDavid du Colombier     "gs_shading_FfGt_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
1757dd7cddfSDavid du Colombier 
1767dd7cddfSDavid du Colombier /* Define Lattice-form Gouraud triangle mesh shading. */
1777dd7cddfSDavid du Colombier typedef struct gs_shading_LfGt_params_s {
1787dd7cddfSDavid du Colombier     gs_shading_mesh_params_common;
1797dd7cddfSDavid du Colombier     int VerticesPerRow;
1807dd7cddfSDavid du Colombier } gs_shading_LfGt_params_t;
1817dd7cddfSDavid du Colombier 
1827dd7cddfSDavid du Colombier #define private_st_shading_LfGt()	/* in gsshade.c */\
183*593dc095SDavid du Colombier   gs_private_st_composite_only(st_shading_LfGt, gs_shading_LfGt_t,\
184*593dc095SDavid du Colombier     "gs_shading_LfGt_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
1857dd7cddfSDavid du Colombier 
1867dd7cddfSDavid du Colombier /* Define Coons patch mesh shading. */
1877dd7cddfSDavid du Colombier typedef struct gs_shading_Cp_params_s {
1887dd7cddfSDavid du Colombier     gs_shading_mesh_params_common;
1897dd7cddfSDavid du Colombier     int BitsPerFlag;
1907dd7cddfSDavid du Colombier } gs_shading_Cp_params_t;
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier #define private_st_shading_Cp()	/* in gsshade.c */\
193*593dc095SDavid du Colombier   gs_private_st_composite_only(st_shading_Cp, gs_shading_Cp_t,\
194*593dc095SDavid du Colombier     "gs_shading_Cp_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
1957dd7cddfSDavid du Colombier 
1967dd7cddfSDavid du Colombier /* Define Tensor product patch mesh shading. */
1977dd7cddfSDavid du Colombier typedef struct gs_shading_Tpp_params_s {
1987dd7cddfSDavid du Colombier     gs_shading_mesh_params_common;
1997dd7cddfSDavid du Colombier     int BitsPerFlag;
2007dd7cddfSDavid du Colombier } gs_shading_Tpp_params_t;
2017dd7cddfSDavid du Colombier 
2027dd7cddfSDavid du Colombier #define private_st_shading_Tpp()	/* in gsshade.c */\
203*593dc095SDavid du Colombier   gs_private_st_composite_only(st_shading_Tpp, gs_shading_Tpp_t,\
204*593dc095SDavid du Colombier     "gs_shading_Tpp_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
2057dd7cddfSDavid du Colombier 
2067dd7cddfSDavid du Colombier /* ---------------- Procedures ---------------- */
2077dd7cddfSDavid du Colombier 
2087dd7cddfSDavid du Colombier /* Initialize shading parameters of specific types. */
209*593dc095SDavid du Colombier void gs_shading_Fb_params_init(gs_shading_Fb_params_t * params);
210*593dc095SDavid du Colombier void gs_shading_A_params_init(gs_shading_A_params_t * params);
211*593dc095SDavid du Colombier void gs_shading_R_params_init(gs_shading_R_params_t * params);
212*593dc095SDavid du Colombier void gs_shading_FfGt_params_init(gs_shading_FfGt_params_t * params);
213*593dc095SDavid du Colombier void gs_shading_LfGt_params_init(gs_shading_LfGt_params_t * params);
214*593dc095SDavid du Colombier void gs_shading_Cp_params_init(gs_shading_Cp_params_t * params);
215*593dc095SDavid du Colombier void gs_shading_Tpp_params_init(gs_shading_Tpp_params_t * params);
2167dd7cddfSDavid du Colombier 
2177dd7cddfSDavid du Colombier /* Create (initialize) shadings of specific types. */
218*593dc095SDavid du Colombier int gs_shading_Fb_init(gs_shading_t ** ppsh,
2197dd7cddfSDavid du Colombier 		       const gs_shading_Fb_params_t * params,
220*593dc095SDavid du Colombier 		       gs_memory_t * mem);
221*593dc095SDavid du Colombier int gs_shading_A_init(gs_shading_t ** ppsh,
2227dd7cddfSDavid du Colombier 		      const gs_shading_A_params_t * params,
223*593dc095SDavid du Colombier 		      gs_memory_t * mem);
224*593dc095SDavid du Colombier int gs_shading_R_init(gs_shading_t ** ppsh,
2257dd7cddfSDavid du Colombier 		      const gs_shading_R_params_t * params,
226*593dc095SDavid du Colombier 		      gs_memory_t * mem);
227*593dc095SDavid du Colombier int gs_shading_FfGt_init(gs_shading_t ** ppsh,
2287dd7cddfSDavid du Colombier 			 const gs_shading_FfGt_params_t * params,
229*593dc095SDavid du Colombier 			 gs_memory_t * mem);
230*593dc095SDavid du Colombier int gs_shading_LfGt_init(gs_shading_t ** ppsh,
2317dd7cddfSDavid du Colombier 			 const gs_shading_LfGt_params_t * params,
232*593dc095SDavid du Colombier 			 gs_memory_t * mem);
233*593dc095SDavid du Colombier int gs_shading_Cp_init(gs_shading_t ** ppsh,
2347dd7cddfSDavid du Colombier 		       const gs_shading_Cp_params_t * params,
235*593dc095SDavid du Colombier 		       gs_memory_t * mem);
236*593dc095SDavid du Colombier int gs_shading_Tpp_init(gs_shading_t ** ppsh,
2377dd7cddfSDavid du Colombier 			const gs_shading_Tpp_params_t * params,
238*593dc095SDavid du Colombier 			gs_memory_t * mem);
2397dd7cddfSDavid du Colombier 
2407dd7cddfSDavid du Colombier /*
2417dd7cddfSDavid du Colombier  * Fill a path or a (device-space) rectangle with a shading.  Both the path
2427dd7cddfSDavid du Colombier  * and the rectangle are optional, but at least one must be non-NULL; if
2437dd7cddfSDavid du Colombier  * both are specified, the filled region is their intersection. This is the
2447dd7cddfSDavid du Colombier  * only externally accessible procedure for rendering a shading.
2457dd7cddfSDavid du Colombier  * fill_background indicates whether to fill portions of the path outside
2467dd7cddfSDavid du Colombier  * the shading's geometry: it is true for filling with a pattern, false for
2477dd7cddfSDavid du Colombier  * shfill.
2487dd7cddfSDavid du Colombier  */
2497dd7cddfSDavid du Colombier #ifndef gx_path_DEFINED
2507dd7cddfSDavid du Colombier #  define gx_path_DEFINED
2517dd7cddfSDavid du Colombier typedef struct gx_path_s gx_path;
2527dd7cddfSDavid du Colombier #endif
253*593dc095SDavid du Colombier int gs_shading_fill_path_adjusted(const gs_shading_t *psh, /*const*/ gx_path *ppath,
2547dd7cddfSDavid du Colombier 			 const gs_fixed_rect *prect, gx_device *dev,
255*593dc095SDavid du Colombier 			 gs_imager_state *pis, bool fill_background);
2567dd7cddfSDavid du Colombier 
2577dd7cddfSDavid du Colombier #endif /* gsshade_INCLUDED */
258