% Copyright (C) 2001, 2002 Aladdin Enterprises. 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 the license contained in the file LICENSE in this distribution. % % For more information about licensing, please refer to % http://www.ghostscript.com/licensing/. For information on % commercial licensing, go to http://www.artifex.com/licensing/ or % contact Artifex Software, Inc., 101 Lucas Valley Road #110, % San Rafael, CA 94903, U.S.A., +1(415)492-9861. % $Id: gs_patrn.ps,v 1.2 2002/11/13 20:23:10 alexcher Exp $ % Pattern color space method dictionary. % verify that Pattern color spaces are supported /.setpatternspace where { pop } { currentfile closefile } ifelse .currentglobal true .setglobal .cspace_util begin % % get_pattern_base_cspace % % If the Pattern color space has a base color space, push that base % color space onto the stack. Otherwise, push a null object. % /get_pattern_base_cspace { dup type /nametype eq { pop //null } { dup length 1 gt { 1 get } { pop //null } ifelse } ifelse } bind def % % has_base_color % % Determine if a Pattern "color" includes a base color. This is the case % if the pattern dictionary has PatternType 1 and PaintType 2. % /has_base_color { dup //null eq { pop //false } { dup /PatternType get 1 eq { /PaintType get 2 eq } { pop //false } ifelse } ifelse } bind def % % ... % get_pattern_base_color % ... true % or % ... % get_pattern_base_color % false % % If a pattern dictionary has a base color, set up that base color and % color space, and push true. Otherwise, just push false. It is assumed % that if the pattern includes a base color, the Pattern color space % has a base color space. % /get_pattern_base_color { exch //has_base_color exec { 1 get //true } { pop //false } ifelse } bind def colorspacedict /Pattern mark /cs_potential_indexed_base false /cs_potential_pattern_base false /cs_potential_alternate false /cs_potential_icc_alternate false % % We employ the same convention for describing the number of % components in a Pattern color space as is used by the graphic % library. For pattern spaces with no underlying color space, % the result is -1. If a Pattern space has an underlying color % space with n components, the result is -(n + 1). % /cs_get_ncomps { //get_pattern_base_cspace exec dup //null eq { pop 0 } //.cs_get_ncomps ifelse 1 add neg } bind % there is no "range" for a Pattern color space /cs_get_range { {} cvlit } bind /cs_get_default_color { pop //null } bind /cs_get_currentgray { //get_pattern_base_color exec //.cs_get_currentgray { 0 } ifelse } bind /cs_get_currentrgb { //get_pattern_base_color exec //.cs_get_currentrgb { 0 0 0 } ifelse } bind /cs_get_currentcmyk { //get_pattern_base_color exec //.cs_get_currentcmyk { 0 0 0 1.0 } ifelse } bind /cs_validate { dup //get_pattern_base_cspace exec dup //null eq { pop } { //.cs_validate exec //.cs_potential_pattern_base exec not //setcspace_rangecheck if } ifelse } bind % substitute the base space if appropriate /cs_substitute { dup //get_pattern_base_cspace exec dup //null eq { pop dup } { //.cs_substitute exec 2 copy eq { pop pop dup } { % retain only the new alternate space exch pop % build all new structures in local VM .currentglobal 3 1 roll //false .setglobal % construct a new array and insert the new base color space 1 index dup length array copy dup 1 4 -1 roll put % restore VM mode 3 -1 roll .setglobal } ifelse } ifelse } bind /cs_prepare {} % % Install the current color space. % % The current Ghostscript color space implementation requires that % color spaces that provide a base or alternative color space set % that base/alternative color space to be the current color space % before attempting to set the original color space. % % In principle, the only errors that are possible for .setpatternspace % (given that setcolorspace itself is legal) are limitcheck and/or % VMerror. The Ghostscript implementation allows a few others, so % we go through the full code to restore the current color space in % the event of an error. % /cs_install { dup //get_pattern_base_cspace exec dup //null eq { pop dup type /nametype eq { pop { /Pattern } cvlit } if .setpatternspace } { % save the current color space currentcolorspace % set the base color space as the current color space exch //forcesetcolorspace % set the pattern color space; restore the earlier space on error mark 2 index { .setpatternspace } stopped { cleartomark setcolorspace stop } { pop pop pop } ifelse } ifelse } bind % % Pattern dictionaries generated by makepattern will include an % Implementation entry whose value is an internal data structure. % Such structures are given executable type names that match their % internal structure names. The names used for pattern % implementations are gs_pattern1_instance_t and % gs_pattern2_instance_t. It is unfortunate to have to expose such % internal names at this level, but not easily avoided. % /cs_prepare_color { % verify that the topmost operand is a pattern dictionary 1 index dup type /dicttype ne { //null ne //setcspace_typecheck if pop } { dup /Implementation .knownget { type dup dup /gs_pattern1_instance_t ne exch /gs_pattern2_instance_t ne and exch xcheck not or //setcspace_typecheck if } //setcspace_typecheck ifelse % check if base color space operands are present dup /PatternType get 1 eq { /PaintType get 2 eq { % verify that a base color space exists //get_pattern_base_cspace exec dup //null eq //setcspace_rangecheck if exch 1 index //.cs_get_ncomps exec exch 1 index 3 add 1 roll //check_num_stack exec //.cs_get_ncomps exec 1 add -1 roll } { pop } ifelse } { pop pop } ifelse } ifelse } bind /cs_complete_setcolor //pop_1 .dicttomark put end % .cspace_util .setglobal