summaryrefslogtreecommitdiff
path: root/sys/lib/ghostscript/gs_patrn.ps
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 16:53:33 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 16:53:33 +0300
commite463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (patch)
treed5e9f57c28f026cb21de3bd77cc10cd7f64aaa85 /sys/lib/ghostscript/gs_patrn.ps
parentb41b9034225ab3e49980d9de55c141011b6383b0 (diff)
Import sources from 2011-03-30 iso image - sys/lib
Diffstat (limited to 'sys/lib/ghostscript/gs_patrn.ps')
-rwxr-xr-xsys/lib/ghostscript/gs_patrn.ps299
1 files changed, 299 insertions, 0 deletions
diff --git a/sys/lib/ghostscript/gs_patrn.ps b/sys/lib/ghostscript/gs_patrn.ps
new file mode 100755
index 000000000..01667dfe2
--- /dev/null
+++ b/sys/lib/ghostscript/gs_patrn.ps
@@ -0,0 +1,299 @@
+% 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