123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- % 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_indxd.ps,v 1.2 2002/11/13 20:23:10 alexcher Exp $
- % Indexed color space method dictionary
- % verify that Indexed color spaces are supported
- /.setindexedspace where
- { pop }
- { currentfile closefile }
- ifelse
- .currentglobal true .setglobal
- .cspace_util begin
- %
- % <num> <array> restrict_index <int> <array>
- %
- % Restrict the operand to setcolor for an Indexed color space to be an
- % integer in the applicable range.
- %
- /restrict_index
- {
- exch round cvi
- dup 0 lt
- { pop 0 }
- {
- 1 index 2 get 2 copy gt
- { exch }
- if
- pop
- }
- ifelse
- exch
- }
- bind def
- %
- % <num> <array> get_indexed_base_color <c1> ... <cn> <array>
- %
- % Get the base color corresponding to an indexed color value.
- %
- /get_indexed_base_color
- {
- % just in case, set the index into the appropriate range
- //restrict_index exec
- % lookup in the string or use the lookup proc
- mark 1 index 3 get dup type /stringtype eq
- {
- 2 index 1 get //.cs_get_ncomps exec dup 6 -1 roll mul exch getinterval
- { 255 div }
- forall
- }
- { 4 -1 roll exch exec }
- ifelse
- counttomark 2 add -2 roll pop
- }
- bind def
- colorspacedict
- /Indexed
- mark
- /cs_potential_indexed_base false
- /cs_potential_pattern_base true
- /cs_potential_alternate false
- /cs_potential_icc_alternate false
- /cs_get_ncomps //ncomps_1
- /cs_get_range { 0 exch 2 get 2 array astore } bind
- /cs_get_default_color { pop 0 } bind
- /cs_get_currentgray
- { //get_indexed_base_color exec 1 get //.cs_get_currentgray exec }
- bind
- /cs_get_currentrgb
- { //get_indexed_base_color exec 1 get //.cs_get_currentrgb exec }
- bind
- /cs_get_currentcmyk
- { //get_indexed_base_color exec 1 get //.cs_get_currentcmyk exec }
- bind
- % a lot of validation is done by the cs_validate method
- /cs_validate
- {
- //check_array exec
- dup 1 get //.cs_validate exec //.cs_potential_indexed_base exec not
- //setcspace_rangecheck
- if
- dup 2 get dup type /integertype ne
- //setcspace_typecheck
- {
- dup 0 lt exch 4095 gt or
- //setcspace_rangecheck
- if
- }
- ifelse
- dup 3 get dup type /stringtype eq
- {
- length
- 1 index dup 2 get 1 add exch 1 get //.cs_get_ncomps exec mul
- lt
- //setcspace_rangecheck
- if
- }
- {
- //check_array exec xcheck not
- //setcspace_typecheck
- if
- }
- ifelse
- }
- bind
- % substitute the base space if appropriate
- /cs_substitute
- {
- dup 1 get //.cs_substitute exec 2 copy eq
- { pop pop dup }
- {
- % retain only the new base 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
- }
- bind
- /cs_prepare {}
- %
- % Install the current color space. Note that the alternative color
- % space will already have been set as 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.
- %
- /cs_install
- {
- % save the current color space
- currentcolorspace
- % set the base color space as the current color space
- 1 index 1 get //forcesetcolorspace
- % set the indexed color space; restore the earlier space on error
- mark 2 index
- { .setindexedspace }
- stopped
- { cleartomark setcolorspace stop }
- { pop pop pop }
- ifelse
- }
- bind
- /cs_prepare_color //validate_1
- %
- % Adobe implementations always execute a lookup procedure when setcolor
- % is invoked. Ghostscript samples the lookup procedure when
- % setcolorspace is invoked, and then does not access it again. In the
- % unlikely event that an application depends on the Adobe-specific
- % behavior, it is replicated in this method.
- %
- /cs_complete_setcolor
- {
- 3 get dup type /stringtype eq
- { pop }
- {
- currentcolor exch exec
- currentcolorspace 1 get //clear_setcolor_operands exec
- }
- ifelse
- }
- bind
- .dicttomark
- put
- end % .cspace_util
- .setglobal
|