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