summaryrefslogtreecommitdiff
path: root/gs/base/gsshade.h
diff options
context:
space:
mode:
Diffstat (limited to 'gs/base/gsshade.h')
-rw-r--r--gs/base/gsshade.h269
1 files changed, 269 insertions, 0 deletions
diff --git a/gs/base/gsshade.h b/gs/base/gsshade.h
new file mode 100644
index 000000000..47d092ccf
--- /dev/null
+++ b/gs/base/gsshade.h
@@ -0,0 +1,269 @@
+/* Copyright (C) 2001-2006 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id$ */
+/* Definitions for shading */
+
+#ifndef gsshade_INCLUDED
+# define gsshade_INCLUDED
+
+#include "gsccolor.h"
+#include "gscspace.h"
+#include "gsdsrc.h"
+#include "gsfunc.h"
+#include "gsmatrix.h"
+#include "gxfixed.h"
+
+#ifndef gx_cie_joint_caches_DEFINED
+#define gx_cie_joint_caches_DEFINED
+typedef struct gx_cie_joint_caches_s gx_cie_joint_caches;
+#endif
+
+/* ---------------- Types and structures ---------------- */
+
+/* Define the shading types. */
+typedef enum {
+ shading_type_Function_based = 1,
+ shading_type_Axial = 2,
+ shading_type_Radial = 3,
+ shading_type_Free_form_Gouraud_triangle = 4,
+ shading_type_Lattice_form_Gouraud_triangle = 5,
+ shading_type_Coons_patch = 6,
+ shading_type_Tensor_product_patch = 7
+} gs_shading_type_t;
+
+/*
+ * Define information common to all shading types. We separate the private
+ * part from the parameters so that clients can create parameter structures
+ * without having to know the structure of the implementation.
+ */
+#define gs_shading_params_common\
+ gs_color_space *ColorSpace;\
+ gx_cie_joint_caches *cie_joint_caches; /* if ColorSpace is CIE or uses CIE. */\
+ gs_client_color *Background;\
+ bool have_BBox;\
+ gs_rect BBox;\
+ bool AntiAlias
+
+typedef struct gs_shading_params_s {
+ gs_shading_params_common;
+} gs_shading_params_t;
+
+/* Define the type-specific procedures for shadings. */
+#ifndef gs_shading_t_DEFINED
+# define gs_shading_t_DEFINED
+typedef struct gs_shading_s gs_shading_t;
+#endif
+#ifndef gx_device_DEFINED
+# define gx_device_DEFINED
+typedef struct gx_device_s gx_device;
+#endif
+
+/*
+ * Fill a user space rectangle. This will paint every pixel that is in the
+ * intersection of the rectangle and the shading's geometry, but it may
+ * leave some pixels in the rectangle unpainted, and it may also paint
+ * outside the rectangle: the caller is responsible for setting up a
+ * clipping device if necessary.
+ */
+#define SHADING_FILL_RECTANGLE_PROC(proc)\
+ int proc(const gs_shading_t *psh, const gs_rect *prect,\
+ const gs_fixed_rect *prect_clip, gx_device *dev,\
+ gs_imager_state *pis)
+typedef SHADING_FILL_RECTANGLE_PROC((*shading_fill_rectangle_proc_t));
+#define gs_shading_fill_rectangle(psh, prect, prect_clip, dev, pis)\
+ ((psh)->head.procs.fill_rectangle(psh, prect, prect_clip, dev, pis))
+
+/* Define the generic shading structures. */
+typedef struct gs_shading_procs_s {
+ shading_fill_rectangle_proc_t fill_rectangle;
+} gs_shading_procs_t;
+typedef struct gs_shading_head_s {
+ gs_shading_type_t type;
+ gs_shading_procs_t procs;
+} gs_shading_head_t;
+
+/* Define a generic shading, for use as the target type of pointers. */
+struct gs_shading_s {
+ gs_shading_head_t head;
+ gs_shading_params_t params;
+};
+#define ShadingType(psh) ((psh)->head.type)
+#define private_st_shading() /* in gsshade.c */\
+ gs_private_st_ptrs3(st_shading, gs_shading_t, "gs_shading_t",\
+ shading_enum_ptrs, shading_reloc_ptrs,\
+ params.ColorSpace, params.cie_joint_caches, params.Background)
+
+/* Define Function-based shading. */
+typedef struct gs_shading_Fb_params_s {
+ gs_shading_params_common;
+ float Domain[4];
+ gs_matrix Matrix;
+ gs_function_t *Function;
+} gs_shading_Fb_params_t;
+
+#define private_st_shading_Fb() /* in gsshade.c */\
+ gs_private_st_suffix_add1(st_shading_Fb, gs_shading_Fb_t,\
+ "gs_shading_Fb_t", shading_Fb_enum_ptrs, shading_Fb_reloc_ptrs,\
+ st_shading, params.Function)
+
+/* Define Axial shading. */
+typedef struct gs_shading_A_params_s {
+ gs_shading_params_common;
+ float Coords[4];
+ float Domain[2];
+ gs_function_t *Function;
+ bool Extend[2];
+} gs_shading_A_params_t;
+
+#define private_st_shading_A() /* in gsshade.c */\
+ gs_private_st_suffix_add1(st_shading_A, gs_shading_A_t,\
+ "gs_shading_A_t", shading_A_enum_ptrs, shading_A_reloc_ptrs,\
+ st_shading, params.Function)
+
+/* Define Radial shading. */
+typedef struct gs_shading_R_params_s {
+ gs_shading_params_common;
+ float Coords[6];
+ float Domain[2];
+ gs_function_t *Function;
+ bool Extend[2];
+} gs_shading_R_params_t;
+
+#define private_st_shading_R() /* in gsshade.c */\
+ gs_private_st_suffix_add1(st_shading_R, gs_shading_R_t,\
+ "gs_shading_R_t", shading_R_enum_ptrs, shading_R_reloc_ptrs,\
+ st_shading, params.Function)
+
+/* Define common parameters for mesh shading. */
+#define gs_shading_mesh_params_common\
+ gs_shading_params_common;\
+ gs_data_source_t DataSource;\
+ int BitsPerCoordinate;\
+ int BitsPerComponent;\
+ float *Decode;\
+ gs_function_t *Function
+/* The following are for internal use only. */
+typedef struct gs_shading_mesh_params_s {
+ gs_shading_mesh_params_common;
+} gs_shading_mesh_params_t;
+typedef struct gs_shading_mesh_s {
+ gs_shading_head_t head;
+ gs_shading_mesh_params_t params;
+} gs_shading_mesh_t;
+
+#define private_st_shading_mesh() /* in gsshade.c */\
+ gs_private_st_composite(st_shading_mesh, gs_shading_mesh_t,\
+ "gs_shading_mesh_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
+
+/* Define Free-form Gouraud triangle mesh shading. */
+typedef struct gs_shading_FfGt_params_s {
+ gs_shading_mesh_params_common;
+ int BitsPerFlag;
+} gs_shading_FfGt_params_t;
+
+#define private_st_shading_FfGt() /* in gsshade.c */\
+ gs_private_st_composite_only(st_shading_FfGt, gs_shading_FfGt_t,\
+ "gs_shading_FfGt_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
+
+/* Define Lattice-form Gouraud triangle mesh shading. */
+typedef struct gs_shading_LfGt_params_s {
+ gs_shading_mesh_params_common;
+ int VerticesPerRow;
+} gs_shading_LfGt_params_t;
+
+#define private_st_shading_LfGt() /* in gsshade.c */\
+ gs_private_st_composite_only(st_shading_LfGt, gs_shading_LfGt_t,\
+ "gs_shading_LfGt_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
+
+/* Define Coons patch mesh shading. */
+typedef struct gs_shading_Cp_params_s {
+ gs_shading_mesh_params_common;
+ int BitsPerFlag;
+} gs_shading_Cp_params_t;
+
+#define private_st_shading_Cp() /* in gsshade.c */\
+ gs_private_st_composite_only(st_shading_Cp, gs_shading_Cp_t,\
+ "gs_shading_Cp_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
+
+/* Define Tensor product patch mesh shading. */
+typedef struct gs_shading_Tpp_params_s {
+ gs_shading_mesh_params_common;
+ int BitsPerFlag;
+} gs_shading_Tpp_params_t;
+
+#define private_st_shading_Tpp() /* in gsshade.c */\
+ gs_private_st_composite_only(st_shading_Tpp, gs_shading_Tpp_t,\
+ "gs_shading_Tpp_t", shading_mesh_enum_ptrs, shading_mesh_reloc_ptrs)
+
+/* ---------------- Procedures ---------------- */
+
+/* Initialize shading parameters of specific types. */
+void gs_shading_Fb_params_init(gs_shading_Fb_params_t * params);
+void gs_shading_A_params_init(gs_shading_A_params_t * params);
+void gs_shading_R_params_init(gs_shading_R_params_t * params);
+void gs_shading_FfGt_params_init(gs_shading_FfGt_params_t * params);
+void gs_shading_LfGt_params_init(gs_shading_LfGt_params_t * params);
+void gs_shading_Cp_params_init(gs_shading_Cp_params_t * params);
+void gs_shading_Tpp_params_init(gs_shading_Tpp_params_t * params);
+
+/* Create (initialize) shadings of specific types. */
+int gs_shading_Fb_init(gs_shading_t ** ppsh,
+ const gs_shading_Fb_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_A_init(gs_shading_t ** ppsh,
+ const gs_shading_A_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_R_init(gs_shading_t ** ppsh,
+ const gs_shading_R_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_FfGt_init(gs_shading_t ** ppsh,
+ const gs_shading_FfGt_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_LfGt_init(gs_shading_t ** ppsh,
+ const gs_shading_LfGt_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_Cp_init(gs_shading_t ** ppsh,
+ const gs_shading_Cp_params_t * params,
+ gs_memory_t * mem);
+int gs_shading_Tpp_init(gs_shading_t ** ppsh,
+ const gs_shading_Tpp_params_t * params,
+ gs_memory_t * mem);
+
+/*
+ * Fill a path or a (device-space) rectangle with a shading. Both the path
+ * and the rectangle are optional, but at least one must be non-NULL; if
+ * both are specified, the filled region is their intersection. This is the
+ * only externally accessible procedure for rendering a shading.
+ * fill_background indicates whether to fill portions of the path outside
+ * the shading's geometry: it is true for filling with a pattern, false for
+ * shfill.
+ */
+#ifndef gx_path_DEFINED
+# define gx_path_DEFINED
+typedef struct gx_path_s gx_path;
+#endif
+#ifndef gs_matrix_fixed_DEFINED
+#define gs_matrix_fixed_DEFINED
+typedef struct gs_matrix_fixed_s gs_matrix_fixed;
+#endif
+/* Fill a rectangle with a shading. */
+int gs_shading_do_fill_rectangle(const gs_shading_t *psh,
+ const gs_fixed_rect *prect, gx_device *dev,
+ gs_imager_state *pis, bool fill_background);
+
+/* Add a shading bbox to a path. */
+int gs_shading_path_add_box(gx_path *ppath, const gs_rect *pbox,
+ const gs_matrix_fixed *pmat);
+
+#endif /* gsshade_INCLUDED */