300 lines
7.7 KiB
PostScript
300 lines
7.7 KiB
PostScript
% 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
|