Posted to tcl by emiliano at Sun Mar 22 11:56:33 GMT 2020view pretty
The canvas postscript command is somewhat underdocumented.
FONTMAP
The -fontmap option maps a font used in a canvas, such as the one get by
$canvas itemconfigure $textitem -font
with a pair
[list $fontname $size]
This can fail for several reasons:
* the provided value is not a list
* the list length is != 2
* the font name is the empty string
* the font name has an space in it
* the size is not a valid double
* the size is <= 0
All these conditions are tested in Tk_PostscriptFont(), file generic/tkCanvPs.c
The postscript font name *should* match one of the 35 postscript level 2 fonts
(note that the font slant and weight are encoded in the font name)
AvantGarde-Book
AvantGarde-BookOblique
AvantGarde-Demi
AvantGarde-DemiOblique
Bookman-Demi
Bookman-DemiItalic
Bookman-Light
Bookman-LightItalic
Courier
Courier-Bold
Courier-BoldOblique
Courier-Oblique
Helvetica
Helvetica-Bold
Helvetica-BoldOblique
Helvetica-Narrow
Helvetica-Narrow-Bold
Helvetica-Narrow-BoldOblique
Helvetica-Narrow-Oblique
Helvetica-Oblique
NewCenturySchlbk-Bold
NewCenturySchlbk-BoldItalic
NewCenturySchlbk-Italic
NewCenturySchlbk-Roman
Palatino-Bold
Palatino-BoldItalic
Palatino-Italic
Palatino-Roman
Symbol
Times-Bold
Times-BoldItalic
Times-Italic
Times-Roman
ZapfChancery-MediumItalic
ZapfDingbats
If -fontmap is not provided, or a given font is not found in the fontmap, then
a font name is "guessed" (Tk_PostscriptFontName() in generic/tkFont.c) from
a subset of the above list.
Example of use:
canvas .c
pack .c
set item [.c create text 200 100 -text "Hello\nWorld"]
update idletasks
# replace the default font for Courier 12 on postscript output
set fmap([.c itemcget $item -font]) [list Courier 12]
set ps [.c postscript -fontmap fmap]
The following will raise errors when postscript is generated (see above for a
list of error conditions)
# not a list
set fmap([.c itemcget $item -font]) "{"
# list of lenght != 2
set fmap([.c itemcget $item -font]) [list Courier 12 Bold]
# font name empty
set fmap([.c itemcget $item -font]) [list {} 12]
# font name with space
set fmap([.c itemcget $item -font]) [list {Courier New} 12]
# size not a double
set fmap([.c itemcget $item -font]) [list Courier Foo]
# size <= 0
set fmap([.c itemcget $item -font]) [list Courier -12]
The error produced is
% catch {.c postscript -fontmap fmap} error options
% set error
bad font map entry for "TkDefaultFont": "{"
% dict get $options -errorcode
TK CANVAS PS FONTMAP
% dict get $options -errorinfo
bad font map entry for "TkDefaultFont": "{"
(generating Postscript for item 1)
invoked from within
".c postscript -fontmap fmap"
%
WARNING: You can specify a nonexistent font and it will be used without further
checking. This font map
set fmap([.c itemcget $item -font]) [list NONEXISTENT 12]
will produce an output but it *may* give an error at print or display time
(ghostscript provide fallback fonts).
COLORMAP
The -colormap option is similar to the -fontmap, with the difference there is
absolutely no checking of the value provided. As the documentation says, it
should map one of the colors provided to the canvas items via the
-{active|disabled}*outline or -{active|disabled}*fill options with the
corresponding postscript code to get a given color in the format
[format {%f %f %f setrgbcolor} $red $green $blue]. The three components red,
green and blue must be in the range 0.0 - 1.0
Example:
canvas .c
pack .c
set item [.c create text 200 100 -text "Hello\nWorld" -fill blue]
update idletasks
# convert "blue" to "green3" on postscript output
set rgb [lmap val [winfo rgb .c "green3"] {expr {$val/65535.0}}]
set cmap([.c itemcget $item -fill]) \
[format {%.3f %.3f %.3f setrgbcolor} {*}$rgb]
set ps [.c postscript -colormap cmap]
WARNING: You can specify anything in the color map and it will be used without
further checking. Any invalid postscript code will raise an error at print or
display time. The following map
set cmap([.c itemcget $item -fill]) "watch me crash!"
will cause an error at runtime.
Last but not least, you can use the same array for both -fontmap and -colormap
as long as there's no name clashes between fonts and colors.
The only way to get such clashes is using named fonts with names that are also
valid colors (as accepted by Tk_GetColor())
font create blue -size 12
font create #ff443c -size 12