aboutsummaryrefslogtreecommitdiffstats
path: root/include/coltex
diff options
context:
space:
mode:
authorJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 20:38:23 +0000
committerJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 20:38:23 +0000
commit78c2bcf9e96ab00615ee6f96905bca78fcd52a00 (patch)
tree9c7e31f2a59e174433e55b589771005b48a34158 /include/coltex
parent9daa98ce90ceeeaba9e942d28575d8fcfe36db4b (diff)
downloadlout-78c2bcf9e96ab00615ee6f96905bca78fcd52a00.tar.gz
Lout 3.27.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@23 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'include/coltex')
-rw-r--r--include/coltex417
1 files changed, 417 insertions, 0 deletions
diff --git a/include/coltex b/include/coltex
new file mode 100644
index 0000000..44b82a4
--- /dev/null
+++ b/include/coltex
@@ -0,0 +1,417 @@
+
+###########################################################################
+# #
+# coltex #
+# #
+# Jeffrey H. Kingston #
+# 30 October 2002 #
+# #
+# Include file providing @ColourCommand and @TextureCommand symbols. #
+# #
+###########################################################################
+
+@SysInclude { lengths } # @PSLengths (needed for @TextureCommand)
+
+
+###########################################################################
+# #
+# @ColourCommand #
+# #
+# Jeff Kingston #
+# 19 October 2001 #
+# Updated for compatibility with textures 28 October 2002. #
+# #
+# @ColourCommand converts a colour expressed in a manner that the #
+# ordinary user can comprehend into the PostScript or PDF command #
+# needed to obtain that colour, suitable for passing to @SetColour #
+# or including in the left parameter of @Graphic. #
+# #
+# This symbol is needed in various places so I've taken the coward's #
+# way out and @SysIncluded it at those places. #
+# #
+# Examples of behaviour for the PostScript back end: #
+# #
+# Parameter Result #
+# ------------------------------------------------------------ #
+# black "0.0 0.0 0.0 LoutSetRGBColor" #
+# darkblue "0.0 0.0 0.5 LoutSetRGBColor" #
+# white "1.0 1.0 1.0 LoutSetRGBColor" #
+# none "" #
+# nochange "" #
+# "" "" #
+# rgb <red> <blue> <green> "<red> <blue> <green> LoutSetRGBColor" #
+# cymk <c> <y> <m> <k> "<c> <y> <m> <k> LoutSetCMYKColor" #
+# ------------------------------------------------------------ #
+# #
+# See the Expert's Guide for the use of LoutSetRGBColor and #
+# LoutSetCMYKColor rather than setrgbcolor and setcmykcolor. #
+# #
+# @ColourCommand also does the right thing for the PDF back end; #
+# its result is always empty for the PlainText back end. #
+# #
+###########################################################################
+
+def @ColourCommand right @Body
+{
+ def @RGB right coords
+ {
+ @BackEnd @Case {
+ PostScript @Yield { coords "LoutSetRGBColor" }
+ PDF @Yield { coords "rg" coords "RG" }
+ PlainText @Yield ""
+ }
+ }
+
+ def @CMYK right coords
+ {
+ @BackEnd @Case {
+ PostScript @Yield { coords "LoutSetCMYKColor" }
+ PDF @Yield { coords "k" coords "K" }
+ PlainText @Yield ""
+ }
+ }
+
+ def @RGBElse right alt
+ {
+ { "rgb" @Common @Body } @Case {
+ "rgb" @Yield @RGB { "rgb" @Rump @Body }
+ else @Yield alt
+ }
+ }
+
+ def @CMYKElse right alt
+ {
+ { "cmyk" @Common @Body } @Case {
+ "cmyk" @Yield @CMYK { "cmyk" @Rump @Body }
+ else @Yield alt
+ }
+ }
+
+ def @NoChangeElse right alt
+ {
+ @Body @Case {
+ { "nochange" "none" "" } @Yield ""
+ else @Yield alt
+ }
+ }
+
+ def @RGBCoords
+ {
+ @Body @Case {
+ black @Yield { 0.0 0.0 0.0 }
+ darkblue @Yield { 0.0 0.0 0.5 }
+ blue @Yield { 0.0 0.0 1.0 }
+ lightblue @Yield { 0.5 0.5 1.0 }
+ darkgreen @Yield { 0.0 0.5 0.0 }
+ green @Yield { 0.0 1.0 0.0 }
+ lightgreen @Yield { 0.5 1.0 0.5 }
+ darkred @Yield { 0.5 0.0 0.0 }
+ red @Yield { 1.0 0.0 0.0 }
+ lightred @Yield { 1.0 0.5 0.5 }
+ darkcyan @Yield { 0.0 0.5 0.5 }
+ cyan @Yield { 0.0 1.0 1.0 }
+ lightcyan @Yield { 0.5 1.0 1.0 }
+ darkmagenta @Yield { 0.5 0.0 0.5 }
+ magenta @Yield { 1.0 0.0 1.0 }
+ lightmagenta @Yield { 1.0 0.5 1.0 }
+ darkyellow @Yield { 0.5 0.5 0.0 }
+ yellow @Yield { 1.0 1.0 0.0 }
+ lightyellow @Yield { 1.0 1.0 0.5 }
+ darkgray @Yield { 0.2 0.2 0.2 }
+ gray @Yield { 0.5 0.5 0.5 }
+ lightgray @Yield { 0.8 0.8 0.8 }
+ darkgrey @Yield { 0.2 0.2 0.2 }
+ grey @Yield { 0.5 0.5 0.5 }
+ lightgrey @Yield { 0.8 0.8 0.8 }
+ white @Yield { 1.0 1.0 1.0 }
+ }
+ }
+
+ @RGBElse @CMYKElse @NoChangeElse @RGB @RGBCoords
+}
+
+
+###########################################################################
+# #
+# @TextureCommand #
+# #
+# @TextureCommand converts a texture expressed in a manner that the #
+# ordinary user can comprehend into the PostScript texture dictionary #
+# needed to obtain that texture, suitable for passing to @SetTexture #
+# or including in the left parameter of @Graphic. #
+# #
+###########################################################################
+
+def @TextureCommand
+ left type
+ named scale { 1 }
+ named hscale { 1 }
+ named vscale { 1 }
+ import @PSLengths named angle { 0d }
+ import @PSLengths named hshift { 0i }
+ import @PSLengths named vshift { 0i }
+ import @PSLengths named width { "dft" }
+ import @PSLengths named height { "dft" }
+ import @PSLengths named gap { "dft" }
+ import @PSLengths named radius { "dft" }
+ import @PSLengths named linewidth { "dft" }
+ named font { "dft" }
+ import @PSLengths named size { "dft" }
+ named value { "dft" }
+{
+ def @Dft left x right y
+ {
+ y @Case {
+ "dft" @Yield x
+ else @Yield y
+ }
+ }
+
+ def @SolidTexture
+ {
+ "null LoutSetTexture"
+ }
+
+ def @StripedTexture
+ {
+ def @Width { "1 pt" @Dft width }
+ def @Gap { "1 pt" @Dft gap }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Width @Gap "add dup ]"
+ @Width @Gap "add dup"
+ "{"
+ "pop 0 0 moveto"
+ @Width @Gap "add 0 lineto"
+ "0" @Width "rlineto"
+ "0" @Width "lineto"
+ "closepath fill"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @GridTexture
+ {
+ def @Width { "1 pt" @Dft width }
+ def @Gap { "1 pt" @Dft gap }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Width @Gap "add dup ]"
+ @Width @Gap "add dup"
+ "{"
+ "pop 0 0 moveto"
+ @Width @Gap "add 0 lineto"
+ "0" @Width "rlineto"
+ @Gap "neg 0 rlineto"
+ "0" @Gap "rlineto"
+ @Width "neg 0 rlineto"
+ "closepath fill"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @DottedTexture
+ {
+ def @Radius { "0.5 pt" @Dft radius }
+ def @Gap { "2 pt" @Dft gap }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Gap "dup ]"
+ @Gap "dup"
+ "{"
+ "pop" @Gap "2 div dup" @Radius "0 360 arc fill"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @ChessboardTexture
+ {
+ def @Width { "2 pt" @Dft width }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Width "2 mul dup ]"
+ @Width "2 mul dup"
+ "{"
+ "pop 0 0 moveto"
+ @Width "0 rlineto"
+ "0" @Width "rlineto"
+ @Width "neg 0 rlineto"
+ closepath
+ @Width @Width "moveto"
+ @Width "0 rlineto"
+ "0" @Width "rlineto"
+ @Width "neg 0 rlineto"
+ "closepath fill"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @BrickworkTexture
+ {
+ def @Width { "6 pt" @Dft width }
+ def @Height { "2 pt" @Dft height }
+ def @Linewidth { "0.5 pt" @Dft linewidth }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Width @Height "2 mul ]"
+ @Width @Height "2 mul"
+ "{"
+ "pop 0 0 moveto" @Width "0 rlineto"
+ "0" @Height "moveto" @Width "0 rlineto"
+ "0" @Height "2 mul moveto" @Width "0 rlineto"
+ "0 0 moveto 0" @Height "rlineto"
+ @Width "0 moveto 0" @Height "rlineto"
+ @Width "2 div" @Height "moveto 0" @Height "rlineto"
+ "[] 0 setdash" @Linewidth "setlinewidth stroke"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @HoneycombTexture
+ {
+ def @R { "2.0 pt" @Dft radius }
+ def @Linewidth { "0.5 pt" @Dft linewidth }
+
+ def @X { @R "0.5 mul" }
+ def @Y { @R "0.886 mul" }
+ def @NegX { @X "neg" }
+ def @NegY { @Y "neg" }
+ def @NegR { @R "neg" }
+ def @BoxWidth { @R @X "add 2 mul" }
+ def @BoxHeight { @Y "2 mul" }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @BoxWidth @BoxHeight "]"
+ @BoxWidth @BoxHeight
+ "{"
+ "pop"
+ @X "0 moveto"
+ @R "0 rlineto"
+ @X @Y "rlineto"
+ @R "0 rlineto"
+ @NegR "0 rlineto"
+ @NegX @Y "rlineto"
+ @NegR "0 rlineto"
+ @NegX @NegY "rlineto"
+ "closepath"
+ "[] 0 setdash" @Linewidth "setlinewidth stroke"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @TriangularTexture
+ {
+ def @R { "4.0 pt" @Dft radius }
+ def @Linewidth { "0.5 pt" @Dft linewidth }
+
+ def @X { @R "0.5 mul" }
+ def @Y { @R "0.886 mul" }
+ def @BoxWidth { @R }
+ def @BoxHeight { @Y "2 mul" }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @BoxWidth @BoxHeight "]"
+ @BoxWidth @BoxHeight
+ "{"
+ "pop"
+ "0 0 moveto"
+ @R "0 lineto"
+ "0" @Y "2 mul lineto"
+ @R "0 rlineto"
+ "closepath"
+ "0" @Y "moveto"
+ @R "0 rlineto"
+ "[] 0 setdash" @Linewidth "setlinewidth stroke"
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ def @StringTexture
+ {
+ def @Width { "12 pt" @Dft width }
+ def @Height { "12 pt" @Dft height }
+ def @Font { "Times-Roman" @Dft font }
+ def @Size { "10 pt" @Dft size }
+ def @Value { "*" @Dft value }
+
+ scale hscale vscale angle hshift vshift
+ "2"
+ "[ 0 0" @Width @Height "]"
+ @Width @Height
+ "{"
+ "pop /"@Font "findfont" @Size "scalefont setfont"
+ "("@Value") dup false 0 0 moveto charpath flattenpath"
+ "pathbbox pop pop neg exch neg exch moveto show"
+
+ "}"
+ "LoutMakeTexture LoutSetTexture"
+ }
+
+ type @Case
+ {
+ "solid" @Yield @SolidTexture
+ "striped" @Yield @StripedTexture
+ "grid" @Yield @GridTexture
+ "dotted" @Yield @DottedTexture
+ "chessboard" @Yield @ChessboardTexture
+ "brickwork" @Yield @BrickworkTexture
+ "honeycomb" @Yield @HoneycombTexture
+ "triangular" @Yield @TriangularTexture
+ "string" @Yield @StringTexture
+ else @Yield type
+ }
+}
+
+###########################################################################
+# #
+# @TextureImport #
+# #
+# Used as an import for texture options. #
+# #
+# We cleverly replace @Texture by nothing inside those options, #
+# and replace the known types by themselves plus @TextureCommand. #
+# This allows the user to type #
+# #
+# texture { striped } #
+# texture { striped @Texture } #
+# texture { striped angle { 45d } } #
+# texture { striped @Texture angle { 45d } } #
+# #
+# and it all winds up being a call to @TextureCommand. #
+# #
+###########################################################################
+
+export
+
+ solid
+ striped
+ grid
+ dotted
+ chessboard
+ brickwork
+ honeycomb
+ triangular
+ string
+ @Texture
+
+def @TextureImport
+{
+ macro solid { "solid" @TextureCommand }
+ macro striped { "striped" @TextureCommand }
+ macro grid { "grid" @TextureCommand }
+ macro dotted { "dotted" @TextureCommand }
+ macro chessboard { "chessboard" @TextureCommand }
+ macro brickwork { "brickwork" @TextureCommand }
+ macro honeycomb { "honeycomb" @TextureCommand }
+ macro triangular { "triangular" @TextureCommand }
+ macro string { "string" @TextureCommand }
+
+ macro @Texture { }
+}