123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- % 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
- %
- % <name1 | array1> get_pattern_base_cspace <null | name2 | array2>
- %
- % 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
- %
- % <dict> has_base_color <bool>
- %
- % 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
- %
- % <c1> ... <cn> <pattern_dict> <pattern_cspace>
- % get_pattern_base_color
- % <c1> ... <cn> <base_cspace> true
- % or
- % <?c1?> ... <?cn?> <dict> <pattern>
- % 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
|