Posted to tcl by emiliano at Sun Mar 22 11:56:33 GMT 2020view raw
- 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