Mercurial > hg > octave-shane
changeset 10727:570f30a48732
split printing between backends
author | Shai Ayal <shaiay@users.sourceforge.net> |
---|---|
date | Thu, 24 Jun 2010 07:06:11 +0300 |
parents | f062b569a301 |
children | e3cc3ff9405f d699a6c63263 |
files | scripts/ChangeLog scripts/plot/__fltk_print__.m scripts/plot/__gnuplot_print__.m scripts/plot/__print_parse_opts__.m scripts/plot/module.mk scripts/plot/print.m |
diffstat | 6 files changed, 257 insertions(+), 1034 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,13 @@ +2010-06-24 Shai Ayal <shaiay@users.sourceforge.net> + + * plot/print.m: convert to wrapper for backend specific print functions + * plot/__gnuplot_print__.m: New gnuplot specific print function, + largely based on the former print.m + * plot/__fltk_print__.m: New fltk specific print function + * plot/__print_parse_opts__.m: New option parser for print + functions, largely based on the former print.m + * plot/module.mk: Add new m-files here + 2010-06-23 David Bateman <dbateman@free.fr> * whitebg.m: New function.
new file mode 100644 --- /dev/null +++ b/scripts/plot/__fltk_print__.m @@ -0,0 +1,29 @@ +## Copyright (C) 2010 Shai Ayal +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} __fltk_print__ (@var{...}) +## Undocumented internal function. +## @end deftypefn + +function __fltk_print__ (varargin) + + opts = __print_parse_opts__ (varargin{:}); + drawnow ("eps", opts.name); + +endfunction
copy from scripts/plot/print.m copy to scripts/plot/__gnuplot_print__.m --- a/scripts/plot/print.m +++ b/scripts/plot/__gnuplot_print__.m @@ -18,184 +18,16 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {} print () -## @deftypefnx {Function File} {} print (@var{options}) -## @deftypefnx {Function File} {} print (@var{filename}, @var{options}) -## @deftypefnx {Function File} {} print (@var{h}, @var{filename}, @var{options}) -## Print a graph, or save it to a file -## -## @var{filename} defines the file name of the output file. If the -## file name has no suffix, one is inferred from the specified -## device and appended to the file name. If no -## filename is specified, the output is sent to the printer. -## -## @var{h} specifies the figure handle. If no handle is specified -## the handle for the current figure is used. -## -## @var{options}: -## @table @code -## @item -P@var{printer} -## Set the @var{printer} name to which the graph is sent if no -## @var{filename} is specified. -## @item -G@var{ghostscript_command} -## Specify the command for calling Ghostscript. For Unix and Windows, -## the defaults are 'gs' and 'gswin32c', respectively. -## @item -color -## @itemx -mono -## Monochrome or color lines. -## @item -solid -## @itemx -dashed -## Solid or dashed lines. -## @item -portrait -## @itemx -landscape -## Specify the orientation of the plot for printed output. -## @item -d@var{device} -## Output device, where @var{device} is one of: -## @table @code -## @item ps -## @itemx ps2 -## @itemx psc -## @itemx psc2 -## Postscript (level 1 and 2, mono and color) -## @item eps -## @itemx eps2 -## @itemx epsc -## @itemx epsc2 -## Encapsulated postscript (level 1 and 2, mono and color) -## @item tex -## @itemx epslatex -## @itemx epslatexstandalone -## @itemx pstex -## @itemx pslatex -## Generate a @LaTeX{} (or @TeX{}) file for labels, and eps/ps for -## graphics. The file produced by @code{epslatexstandalone} can be -## processed directly by @LaTeX{}. The other formats are intended to -## be included in a @LaTeX{} (or @TeX{}) document. The @code{tex} device -## is the same as the @code{epslatex} device. -## @item tikz -## Generate a @LaTeX{} file using gnuplot's Lua/TikZ terminal. -## @item ill -## @itemx aifm -## Adobe Illustrator -## @item cdr -## @itemx corel -## CorelDraw -## @item dxf -## AutoCAD -## @item emf -## @itemx meta -## Microsoft Enhanced Metafile -## @item fig -## XFig. If this format is selected the additional options -## @code{-textspecial} or @code{-textnormal} can be used to control -## whether the special flag should be set for the text in -## the figure (default is @code{-textnormal}). -## @item hpgl -## HP plotter language -## @item mf -## Metafont -## @item png -## Portable network graphics -## @item jpg -## @itemx jpeg -## JPEG image -## @item gif -## GIF image -## @item pbm -## PBMplus -## @item svg -## Scalable vector graphics -## @item pdf -## Portable document format -## @end table -## -## If the device is omitted, it is inferred from the file extension, -## or if there is no filename it is sent to the printer as postscript. -## -## @item -d@var{ghostscript_device} -## Additional devices are supported by Ghostscript. -## Some examples are; -## -## @table @code -## @item ljet2p -## HP LaserJet IIP -## @item ljet3 -## HP LaserJet III -## @item deskjet -## HP DeskJet and DeskJet Plus -## @item cdj550 -## HP DeskJet 550C -## @item paintjet -## HP PointJet -## @item pcx24b -## 24-bit color PCX file format -## @item ppm -## Portable Pixel Map file format -## @end table -## -## For a complete list, type `system ("gs -h")' to see what formats -## and devices are available. -## -## When the ghostscript is sent to a printer the size is determined -## by the figure's "papersize" property. When the ghostscript output -## is sent to a file the size is determined by the figure's -## "paperposition" property. -## -## @itemx -append -## Appends the output to a pre-existing file. Presently only PDF, -## and Postscript files are supported. -## -## @itemx -r@var{NUM} -## Resolution of bitmaps in pixels per inch. For both metafiles and -## SVG the default is the screen resolution, for other it is 150 dpi. -## To specify screen resolution, use "-r0". -## -## @item -tight -## Forces a tight bounding box for eps-files. Since the ghostscript -## devices are conversion of an eps-file, this option works the those -## devices as well. -## -## @itemx -S@var{xsize},@var{ysize} -## Plot size in pixels for EMF, GIF, JPEG, PBM, PNG and SVG. If -## using the command form of the print function, you must quote the -## @var{xsize},@var{ysize} option. For example, by writing -## @w{@code{"-S640,480"}}. The size defaults to that specified by the -## figure's paperposition property. -## -## @item -F@var{fontname} -## @itemx -F@var{fontname}:@var{size} -## @itemx -F:@var{size} -## @var{fontname} set the postscript font (for use with postscript, -## aifm, corel and fig). By default, 'Helvetica' is set for PS/Aifm, -## and 'SwitzerlandLight' for Corel. It can also be 'Times-Roman'. -## @var{size} is given in points. @var{fontname} is ignored for the -## fig device. -## @end table -## -## The filename and options can be given in any order. +## @deftypefn {Function File} __gnuplot_ginput__ (@var{...}) +## Undocumented internal function. ## @end deftypefn ## Author: Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de> ## Adapted-By: jwe -function print (varargin) +function __gnuplot_print__ (varargin) persistent warn_on_inconsistent_orientation = true - orientation = ""; - use_color = 0; # 0=default, -1=mono, +1=color - append_to_file = 0; - force_solid = 0; # 0=default, -1=dashed, +1=solid - fontsize = ""; - font = ""; - canvas_size = ""; - name = ""; - devopt = ""; - printer = ""; - debug = false; - debug_file = "octave-print-commands.log"; - special_flag = "textnormal"; - tight_flag = false; - resolution = ""; persistent ghostscript_binary = ""; if (isempty (ghostscript_binary)) @@ -216,99 +48,34 @@ old_fig = get (0, "currentfigure"); unwind_protect - ## Ensure the last figure is on the screen for single line commands like - ## plot(...); print(...); - drawnow (); - - for i = 1:nargin - arg = varargin{i}; - if (ischar (arg)) - if (strcmp (arg, "-color")) - use_color = 1; - elseif (strcmp (arg, "-append")) - append_to_file = 1; - elseif (strcmp (arg, "-mono")) - use_color = -1; - elseif (strcmp (arg, "-solid")) - force_solid = 1; - elseif (strcmp (arg, "-dashed")) - force_solid = -1; - elseif (strcmp (arg, "-portrait")) - orientation = "portrait"; - elseif (strcmp (arg, "-landscape")) - orientation = "landscape"; - elseif (strcmp (arg, "-tight")) - tight_flag = true; - elseif (strcmp (arg, "-textspecial")) - special_flag = "textspecial"; - elseif (strncmp (arg, "-debug", 6)) - debug = true; - if (length (arg) > 7) - debug_file = arg(8:end); - endif - elseif (length (arg) > 2 && arg(1:2) == "-d") - devopt = tolower(arg(3:end)); - elseif (length (arg) > 2 && arg(1:2) == "-P") - printer = arg; - elseif ((length (arg) > 2) && arg(1:2) == "-G") - ghostscript_binary = arg(3:end); - if (exist (ghostscript_binary, "file") != 2) - ghostscript_binary = file_in_path (EXEC_PATH, ghostscript_binary); - endif - if (isempty (ghostscript_binary)) - error ("print: Ghostscript binary ""%s"" could not be located", arg(3:end)) - endif - elseif (length (arg) > 2 && arg(1:2) == "-F") - idx = rindex (arg, ":"); - if (idx) - font = arg(3:idx-1); - fontsize = arg(idx+1:length(arg)); - else - font = arg(3:length(arg)); - endif - elseif (length (arg) > 2 && arg(1:2) == "-S") - canvas_size = arg(3:length(arg)); - elseif (length (arg) > 2 && arg(1:2) == "-r") - resolution = arg(3:length(arg)); - elseif (length (arg) >= 1 && arg(1) == "-") - error ("print: unknown option `%s'", arg); - elseif (length (arg) > 0) - name = arg; - endif - elseif (isfigure (arg)) - figure (arg); - else - error ("print: expecting inputs to be character string options or a figure handle"); - endif - endfor - + opts = __print_parse_opts__ (varargin{:}); have_ghostscript = (exist (ghostscript_binary, "file") == 2); - doprint = isempty (name); + doprint = isempty (opts.name); if (doprint) - if (isempty (devopt)) - if (use_color < 0) - devopt = "ps"; + if (isempty (opts.devopt)) + if (opts.use_color < 0) + opts.devopt = "ps"; printname = cstrcat (tmpnam, ".ps"); else - devopt = "psc"; + opts.devopt = "psc"; printname = cstrcat (tmpnam, ".psc"); endif else printname = cstrcat (tmpnam, ".", devopt); endif - name = printname; + opts.name = printname; endif - dot = rindex (name, "."); - if (isempty (devopt)) + dot = rindex (opts.name, "."); + if (isempty (opts.devopt)) if (dot == 0) error ("print: no format specified"); else - dev = tolower (name(dot+1:end)); + dev = tolower (opts.name(dot+1:end)); endif else - dev = devopt; + dev = opts.devopt; endif dev_list = {"aifm", "corel", "fig", "png", "jpeg", ... @@ -322,21 +89,21 @@ "eps", "eps", "emf", "pdf", "tex", ... "tex", "tex", "tex", "tikz"}; if (dot == 0) - name = strcat (name, ".", suffixes {strcmpi (dev_list, dev)}); + opts.name = strcat (opts.name, ".", suffixes {strcmpi (dev_list, dev)}); dot = rindex (name, "."); endif - if (append_to_file) + if (opts.append_to_file) if (any (strcmpi (dev, {"ps", "ps2", "psc", "psc2", "pdf"}))) if (have_ghostscript) - file_exists = ((numel (dir (name)) == 1) && (! isdir (name))); + file_exists = ((numel (dir (opts.name)) == 1) && (! isdir (opts.name))); if (! file_exists) - append_to_file = 0; + opts.append_to_file = 0; end end else warning ("print.m: appended output is not supported for device '%s'", dev) - append_to_file = 0; + opts.append_to_file = 0; endif endif @@ -355,23 +122,23 @@ if (strcmp (dev, "epslatex")) ## gnuplot 4.0 wants ".eps" in the output name if (! __gnuplot_has_feature__ ("epslatex_implies_eps_filesuffix")) - name = cstrcat (name(1:dot), "eps"); + opts.name = cstrcat (name(1:dot), "eps"); endif endif ## Check if the specified device is one that is supported by gnuplot. ## If not, assume it is a device/format supported by Ghostscript. if (! any (strcmp (dev, dev_list)) && have_ghostscript) - ghostscript_output = name; + ghostscript_output = opts.name; ghostscript_device = dev; if (doprint) ## If printing, use color postscript. dev = "psc"; - name = cstrcat (tmpnam, ".ps"); + opts.name = cstrcat (tmpnam, ".ps"); else ## If saving to a file, use color encapsulated postscript. dev = "epsc"; - name = cstrcat (tmpnam, ".eps"); + opts.name = cstrcat (tmpnam, ".eps"); endif elseif (doprint && all (! strcmpi (suffixes {strcmpi (dev_list, dev)}, {"ps", "eps", "hpgl"}))) @@ -411,91 +178,91 @@ termn = "postscript"; endif - if (any (dev == "c") || use_color > 0 - || (! isempty (strfind (dev, "tex")) && use_color == 0)) - use_color = 1; + if (any (dev == "c") || opts.use_color > 0 + || (! isempty (strfind (dev, "tex")) && opts.use_color == 0)) + opts.use_color = 1; else - use_color = -1; + opts.use_color = -1; endif - if (use_color > 0) - if (force_solid < 0) + if (opts.use_color > 0) + if (opts.force_solid < 0) options = cstrcat (options, "color dashed "); else options = cstrcat (options, "color solid "); endif else - if (force_solid > 0) + if (opts.force_solid > 0) options = cstrcat (options, "mono solid "); else options = cstrcat (options, "mono dashed "); endif endif - if (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); + if (! isempty (opts.font)) + options = cstrcat (options, "\"", opts.font, "\" "); endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); + if (! isempty (opts.fontsize)) + options = cstrcat (options, " ", opts.fontsize); endif elseif (strcmp (dev, "tikz")) - if (! isempty (font) && ! isempty (fontsize)) - options = cstrcat (options, "\"", font, ",", fontsize, "\" "); + if (! isempty (font) && ! isempty (opts.fontsize)) + options = cstrcat (options, "\"", opts.font, ",", opts.fontsize, "\" "); elseif (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); + options = cstrcat (options, "\"", opts.font, "\" "); else options = ""; endif elseif (strcmp (dev, "aifm") || strcmp (dev, "corel")) ## Adobe Illustrator, CorelDraw - if (use_color >= 0) + if (opts.use_color >= 0) options = " color"; else options = " mono"; endif - if (! isempty (font)) - options = cstrcat (options, " \"", font, "\""); + if (! isempty (opts.font)) + options = cstrcat (options, " \"", opts.font, "\""); endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); + if (! isempty (opts.fontsize)) + options = cstrcat (options, " ", opts.fontsize); endif elseif (strcmp (dev, "fig")) ## XFig options = orientation; - if (use_color >= 0) + if (opts.use_color >= 0) options = " color"; else options = " mono"; endif options = cstrcat (options, " ", special_flag); - if (! isempty (fontsize)) - options = cstrcat (options, " fontsize ", fontsize); + if (! isempty (opts.fontsize)) + options = cstrcat (options, " fontsize ", opts.fontsize); endif elseif (strcmp (dev, "emf")) ## Enhanced Metafile format options = " "; - if (use_color >= 0) + if (opts.use_color >= 0) options = " color"; else options = " mono"; endif - if (force_solid >= 0) + if (opts.force_solid >= 0) options = cstrcat (options, " solid"); endif - if (! isempty (font)) - options = cstrcat (options, " \"", font, "\""); + if (! isempty (opts.font)) + options = cstrcat (options, " \"", opts.font, "\""); endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); + if (! isempty (opts.fontsize)) + options = cstrcat (options, " ", opts.fontsize); endif elseif (any (strcmp (dev, bitmap_devices))) - if (isempty (canvas_size) && isempty (resolution) + if (isempty (opts.canvas_size) && isempty (opts.resolution) && any (strcmp (dev, {"pbm", "gif", "jpeg", "png"}))) options = ""; elseif (strcmp (dev, "svg")) @@ -504,8 +271,8 @@ else options = ""; end - if (! isempty (canvas_size)) - options = cstrcat (options, " size ", canvas_size); + if (! isempty (opts.canvas_size)) + options = cstrcat (options, " size ", opts.canvas_size); endif elseif (any (strcmp (dev, {"dxf", "mf", "hpgl"}))) @@ -515,21 +282,21 @@ elseif (strcmp (dev, "pdf")) ## Portable Document format options = " "; - if (use_color >= 0) + if (opts.use_color >= 0) options = "color"; else options = "mono"; endif - if (force_solid >= 0) + if (opts.force_solid >= 0) options = cstrcat (options, " solid"); - elseif (force_solid < 0) + elseif (opts.force_solid < 0) options = cstrcat (options, " dashed"); endif - if (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); + if (! isempty (opts.font)) + options = cstrcat (options, "\"", opts.font, "\" "); endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); + if (! isempty (opts.fontsize)) + options = cstrcat (options, " ", opts.fontsize); endif endif @@ -566,10 +333,10 @@ if (strcmp (termn, "pdf")) ## If there the installed gnuplot does not support pdf, use Ghostscript. ghostscript_device = "pdfwrite"; - if (strfind (name, ".pdf") == numel (name) - 3) - ghostscript_output = name; + if (strfind (opts.name, ".pdf") == numel (opts.name) - 3) + ghostscript_output = opts.name; else - ghostscript_output = strcat (name, ".pdf"); + ghostscript_output = strcat (opts.name, ".pdf"); endif name = cstrcat (tmpnam, ".ps"); termn = "postscript"; @@ -612,28 +379,28 @@ new_terminal = cstrcat (termn, " ", options); - mono = (use_color < 0); + mono = (opts.use_color < 0); terminals_for_prn = {"postscript", "pdf", "pdfcairo"}; output_for_printer = any (strncmp (termn, terminals_for_prn, numel(termn))); - if (isempty (resolution)) + if (isempty (opts.resolution)) if (any (strcmp (dev, {"emf", "svg"})) || output_for_printer) - resolution = get (0, "screenpixelsperinch"); + opts.resolution = get (0, "screenpixelsperinch"); else - resolution = 150; + opts.resolution = 150; endif else - resolution = str2num (resolution); - if (resolution == 0) - resolution = get (0, "screenpixelsperinch"); + opts.resolution = str2num (opts.resolution); + if (opts.resolution == 0) + opts.resolution = get (0, "screenpixelsperinch"); endif endif figure_properties = get (gcf); if (! isfield (figure_properties, "__pixels_per_inch__")) - addproperty ("__pixels_per_inch__", gcf, "double", resolution); + addproperty ("__pixels_per_inch__", gcf, "double", opts.resolution); endif - set (gcf, "__pixels_per_inch__", resolution) + set (gcf, "__pixels_per_inch__", opts.resolution) unwind_protect set (gcf, "paperunits", "inches"); @@ -644,10 +411,10 @@ ## If not PDF or PostScript, and the result is not being sent to a printer, ## render an image the size of the paperposition box. ## Trigger the listener to convert all paper props to inches. - if (! isempty (canvas_size)) - size_in_pixels = sscanf (canvas_size ,"%d, %d"); + if (! isempty (opts.canvas_size)) + size_in_pixels = sscanf (opts.canvas_size ,"%d, %d"); size_in_pixels = reshape (size_in_pixels, [1, numel(size_in_pixels)]); - papersize_in_inches = size_in_pixels ./ resolution; + papersize_in_inches = size_in_pixels ./ opts.resolution; paperposition_in_inches = [0, 0, papersize_in_inches]; else paperposition_in_inches = get (gcf, "paperposition"); @@ -660,12 +427,12 @@ else if (strcmp (p.paperpositionmode, "auto")) size_in_pixels = get (gcf, "position")(3:4); - paperposition_in_inches(3:4) = size_in_pixels ./ resolution; + paperposition_in_inches(3:4) = size_in_pixels ./ opts.resolution; paperposition_in_inches(1:2) = (p.papersize - paperposition_in_inches(3:4))/2; else paperposition_in_inches = p.paperposition; endif - if (! isempty (orientation) && ! strcmp (orientation, paperorientation)) + if (! isempty (opts.orientation) && ! strcmp (opts.orientation, paperorientation)) ## When -landscape/portrait changes the orientation, flip both the ## papersize and paperposition. restore_properties = true; @@ -675,31 +442,31 @@ set (gcf, "paperposition", paperposition_in_inches); endif endif - if (use_color < 0) + if (opts.use_color < 0) [objs_with_color, color_of_objs] = convert_color2mono (gcf); endif - if (append_to_file) - appended_file_name = name; + if (opts.append_to_file) + appended_file_name = opts.name; if (index(termn, "pdf")) - name = cstrcat (tmpnam, ".pdf"); + opts.name = cstrcat (tmpnam, ".pdf"); temp_name = cstrcat (tmpnam, ".pdf"); ghostscript_device = "pdfwrite"; else - name = cstrcat (tmpnam, ".ps"); + opts.name = cstrcat (tmpnam, ".ps"); temp_name = cstrcat (tmpnam, ".ps"); ghostscript_device = "pswrite"; endif endif - if (debug) - drawnow (new_terminal, name, mono, debug_file); + if (opts.debug) + drawnow (new_terminal, opts.name, mono, debug_file); else - drawnow (new_terminal, name, mono); + drawnow (new_terminal, opts.name, mono); endif - if (append_to_file) + if (opts.append_to_file) ghostscript_options = "-q -dBATCH -dSAFER -dNOPAUSE"; command = sprintf ("%s %s -sDEVICE=%s -sOutputFile=%s %s %s -q", ... ghostscript_binary, ghostscript_options, ghostscript_device, ... - temp_name, appended_file_name, name); + temp_name, appended_file_name, opts.name); status1 = system (command); status2 = system (sprintf ("mv %s %s", temp_name, appended_file_name)); if (status1 != 0 || status2 != 0) @@ -714,7 +481,7 @@ set (gcf, props{n}, p.(props{n})) endfor endif - if (use_color < 0) + if (opts.use_color < 0) convert_mono_to_or_from_color (objs_with_color, color_of_objs, false); endif end_unwind_protect @@ -730,19 +497,19 @@ endif if (isempty (strfind (lower (ghostscript_device), "write"))) ## If output is a bitmap then include the resolution - ghostscript_options = sprintf ("%s -r%d", ghostscript_options, resolution); + ghostscript_options = sprintf ("%s -r%d", ghostscript_options, opts.resolution); endif ghostscript_options = sprintf ("%s -sDEVICE=%s", ghostscript_options, ghostscript_device); command = sprintf ("\"%s\" %s -sOutputFile=\"%s\" \"%s\" 2>&1", ghostscript_binary, - ghostscript_options, ghostscript_output, name); + ghostscript_options, ghostscript_output, opts.name); [errcode, output] = system (command); unlink (name); if (errcode) error ("print: Conversion failed, %s -> %s.\nError was:\n%s\n", name, ghostscript_output, output); endif - elseif (is_eps_file && tight_flag && ! doprint) + elseif (is_eps_file && opts.tight_flag && ! doprint) ## If the saved output file is an eps file, use ghostscript to set a tight bbox. ## This may result in a smaller or larger bbox geometry. if (have_ghostscript)
new file mode 100644 --- /dev/null +++ b/scripts/plot/__print_parse_opts__.m @@ -0,0 +1,116 @@ +## Copyright (C) 2008, 2009 David Bateman +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{x}, @var{y}, @var{buttons}] =} ginput (@var{n}) +## Return which mouse buttons were pressed and keys were hit on the current +## figure. If @var{n} is defined, then wait for @var{n} mouse clicks +## before returning. If @var{n} is not defined, then @code{ginput} will +## loop until the return key is pressed. +## @end deftypefn + +function arg_st = __print_parse_opts__ (varargin) + + arg_st.orientation = ""; + arg_st.use_color = 0; # 0=default, -1=mono, +1=color + arg_st.append_to_file = 0; + arg_st.force_solid = 0; # 0=default, -1=dashed, +1=solid + arg_st.fontsize = ""; + arg_st.font = ""; + arg_st.canvas_size = ""; + arg_st.name = ""; + arg_st.devopt = ""; + arg_st.printer = ""; + arg_st.debug = false; + arg_st.debug_file = "octave-print-commands.log"; + arg_st.special_flag = "textnormal"; + arg_st.tight_flag = false; + arg_st.resolution = ""; + + old_fig = get (0, "currentfigure"); + + unwind_protect + for i = 1:nargin + arg = varargin{i}; + if (ischar (arg)) + if (strcmp (arg, "-color")) + arg_st.use_color = 1; + elseif (strcmp (arg, "-append")) + arg_st.append_to_file = 1; + elseif (strcmp (arg, "-mono")) + arg_st.use_color = -1; + elseif (strcmp (arg, "-solid")) + arg_st.force_solid = 1; + elseif (strcmp (arg, "-dashed")) + arg_st.force_solid = -1; + elseif (strcmp (arg, "-portrait")) + arg_st.orientation = "portrait"; + elseif (strcmp (arg, "-landscape")) + arg_st.orientation = "landscape"; + elseif (strcmp (arg, "-tight")) + arg_st.tight_flag = true; + elseif (strcmp (arg, "-textspecial")) + arg_st.special_flag = "textspecial"; + elseif (strncmp (arg, "-debug", 6)) + arg_st.debug = true; + if (length (arg) > 7) + arg_st.debug_file = arg(8:end); + endif + elseif (length (arg) > 2 && arg(1:2) == "-d") + arg_st.devopt = tolower(arg(3:end)); + elseif (length (arg) > 2 && arg(1:2) == "-P") + arg_st.printer = arg; + elseif ((length (arg) > 2) && arg(1:2) == "-G") + arg_st.ghostscript_binary = arg(3:end); + if (exist (arg_st.ghostscript_binary, "file") != 2) + arg_st.ghostscript_binary = file_in_path (EXEC_PATH, arg_st.ghostscript_binary); + endif + if (isempty (arg_st.ghostscript_binary)) + error ("print: Ghostscript binary ""%s"" could not be located", arg(3:end)) + endif + elseif (length (arg) > 2 && arg(1:2) == "-F") + idx = rindex (arg, ":"); + if (idx) + arg_st.font = arg(3:idx-1); + arg_st.fontsize = arg(idx+1:length(arg)); + else + arg_st.font = arg(3:length(arg)); + endif + elseif (length (arg) > 2 && arg(1:2) == "-S") + arg_st.canvas_size = arg(3:length(arg)); + elseif (length (arg) > 2 && arg(1:2) == "-r") + arg_st.resolution = arg(3:length(arg)); + elseif (length (arg) >= 1 && arg(1) == "-") + error ("print: unknown option `%s'", arg); + elseif (length (arg) > 0) + arg_st.name = arg; + endif + elseif (isfigure (arg)) + arg_st.figure (arg); + else + error ("print: expecting inputs to be character string options or a figure handle"); + endif + endfor + unwind_protect_cleanup + if (isfigure (old_fig)) + figure (old_fig) + endif + end_unwind_protect + +endfunction +
--- a/scripts/plot/module.mk +++ b/scripts/plot/module.mk @@ -124,6 +124,9 @@ plot/plotyy.m \ plot/polar.m \ plot/print.m \ + plot/__gnuplot_print__.m \ + plot/__fltk_print__.m \ + plot/__print_parse_opts__.m \ plot/quiver.m \ plot/quiver3.m \ plot/refresh.m \
--- a/scripts/plot/print.m +++ b/scripts/plot/print.m @@ -1,5 +1,4 @@ -## Copyright (C) 1999, 2005, 2006, 2007, 2008, 2009 Daniel Heiserer -## Copyright (C) 2001 Laurent Mazet +## Copyright (C) 2008, 2009 David Bateman ## ## This file is part of Octave. ## @@ -175,714 +174,13 @@ ## The filename and options can be given in any order. ## @end deftypefn -## Author: Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de> -## Adapted-By: jwe - -function print (varargin) - - persistent warn_on_inconsistent_orientation = true - orientation = ""; - use_color = 0; # 0=default, -1=mono, +1=color - append_to_file = 0; - force_solid = 0; # 0=default, -1=dashed, +1=solid - fontsize = ""; - font = ""; - canvas_size = ""; - name = ""; - devopt = ""; - printer = ""; - debug = false; - debug_file = "octave-print-commands.log"; - special_flag = "textnormal"; - tight_flag = false; - resolution = ""; - - persistent ghostscript_binary = ""; - if (isempty (ghostscript_binary)) - ghostscript_binary = getenv ("GSC"); - ng = 0; - if (isunix ()) - ## Unix - Includes Mac OSX and Cygwin. - gs_binaries = {"gs", "gs.exe"}; - else - ## pc - Includes Win32 and mingw. - gs_binaries = {"gs.exe", "gswin32c.exe"}; - endif - while (ng < numel (gs_binaries) && isempty (ghostscript_binary)) - ng = ng + 1; - ghostscript_binary = file_in_path (EXEC_PATH, gs_binaries{ng}); - endwhile - endif - - old_fig = get (0, "currentfigure"); - unwind_protect - ## Ensure the last figure is on the screen for single line commands like - ## plot(...); print(...); - drawnow (); - - for i = 1:nargin - arg = varargin{i}; - if (ischar (arg)) - if (strcmp (arg, "-color")) - use_color = 1; - elseif (strcmp (arg, "-append")) - append_to_file = 1; - elseif (strcmp (arg, "-mono")) - use_color = -1; - elseif (strcmp (arg, "-solid")) - force_solid = 1; - elseif (strcmp (arg, "-dashed")) - force_solid = -1; - elseif (strcmp (arg, "-portrait")) - orientation = "portrait"; - elseif (strcmp (arg, "-landscape")) - orientation = "landscape"; - elseif (strcmp (arg, "-tight")) - tight_flag = true; - elseif (strcmp (arg, "-textspecial")) - special_flag = "textspecial"; - elseif (strncmp (arg, "-debug", 6)) - debug = true; - if (length (arg) > 7) - debug_file = arg(8:end); - endif - elseif (length (arg) > 2 && arg(1:2) == "-d") - devopt = tolower(arg(3:end)); - elseif (length (arg) > 2 && arg(1:2) == "-P") - printer = arg; - elseif ((length (arg) > 2) && arg(1:2) == "-G") - ghostscript_binary = arg(3:end); - if (exist (ghostscript_binary, "file") != 2) - ghostscript_binary = file_in_path (EXEC_PATH, ghostscript_binary); - endif - if (isempty (ghostscript_binary)) - error ("print: Ghostscript binary ""%s"" could not be located", arg(3:end)) - endif - elseif (length (arg) > 2 && arg(1:2) == "-F") - idx = rindex (arg, ":"); - if (idx) - font = arg(3:idx-1); - fontsize = arg(idx+1:length(arg)); - else - font = arg(3:length(arg)); - endif - elseif (length (arg) > 2 && arg(1:2) == "-S") - canvas_size = arg(3:length(arg)); - elseif (length (arg) > 2 && arg(1:2) == "-r") - resolution = arg(3:length(arg)); - elseif (length (arg) >= 1 && arg(1) == "-") - error ("print: unknown option `%s'", arg); - elseif (length (arg) > 0) - name = arg; - endif - elseif (isfigure (arg)) - figure (arg); - else - error ("print: expecting inputs to be character string options or a figure handle"); - endif - endfor - - have_ghostscript = (exist (ghostscript_binary, "file") == 2); - - doprint = isempty (name); - if (doprint) - if (isempty (devopt)) - if (use_color < 0) - devopt = "ps"; - printname = cstrcat (tmpnam, ".ps"); - else - devopt = "psc"; - printname = cstrcat (tmpnam, ".psc"); - endif - else - printname = cstrcat (tmpnam, ".", devopt); - endif - name = printname; - endif - - dot = rindex (name, "."); - if (isempty (devopt)) - if (dot == 0) - error ("print: no format specified"); - else - dev = tolower (name(dot+1:end)); - endif - else - dev = devopt; - endif - - dev_list = {"aifm", "corel", "fig", "png", "jpeg", ... - "gif", "pbm", "dxf", "mf", "svg", "hpgl", ... - "ps", "ps2", "psc", "psc2", "eps", "eps2", ... - "epsc", "epsc2", "emf", "pdf", "pslatex", ... - "epslatex", "epslatexstandalone", "pstex", "tikz"}; - suffixes = {"ai", "cdr", "fig", "png", "jpeg", ... - "gif", "pbm", "dxf", "mf", "svg", "hpgl", ... - "ps", "ps", "ps", "ps", "eps", "eps", ... - "eps", "eps", "emf", "pdf", "tex", ... - "tex", "tex", "tex", "tikz"}; - if (dot == 0) - name = strcat (name, ".", suffixes {strcmpi (dev_list, dev)}); - dot = rindex (name, "."); - endif - - if (append_to_file) - if (any (strcmpi (dev, {"ps", "ps2", "psc", "psc2", "pdf"}))) - if (have_ghostscript) - file_exists = ((numel (dir (name)) == 1) && (! isdir (name))); - if (! file_exists) - append_to_file = 0; - end - end - else - warning ("print.m: appended output is not supported for device '%s'", dev) - append_to_file = 0; - endif - endif - - if (strcmp (dev, "tex")) - dev = "epslatex"; - elseif (strcmp (dev, "ill")) - dev = "aifm"; - elseif (strcmp (dev, "cdr")) - dev = "corel"; - elseif (strcmp (dev, "meta")) - dev = "emf"; - elseif (strcmp (dev, "jpg")) - dev = "jpeg"; - endif - - if (strcmp (dev, "epslatex")) - ## gnuplot 4.0 wants ".eps" in the output name - if (! __gnuplot_has_feature__ ("epslatex_implies_eps_filesuffix")) - name = cstrcat (name(1:dot), "eps"); - endif - endif - - ## Check if the specified device is one that is supported by gnuplot. - ## If not, assume it is a device/format supported by Ghostscript. - if (! any (strcmp (dev, dev_list)) && have_ghostscript) - ghostscript_output = name; - ghostscript_device = dev; - if (doprint) - ## If printing, use color postscript. - dev = "psc"; - name = cstrcat (tmpnam, ".ps"); - else - ## If saving to a file, use color encapsulated postscript. - dev = "epsc"; - name = cstrcat (tmpnam, ".eps"); - endif - elseif (doprint && all (! strcmpi (suffixes {strcmpi (dev_list, dev)}, - {"ps", "eps", "hpgl"}))) - ## When not using Ghostscript, verify the format is compatible with - ## hard copy output. - error ("print: missing file name, or invalid print format."); - else - ghostscript_output = ""; - endif - - termn = dev; - - ## SVG isn't actually a bitmap, but gnuplot treats its size option as it - ## does the bitmap terminals. - bitmap_devices = {"emf", "gif", "jpeg", "pbm", "png", "svg"}; - - if (any (strcmp (dev, {"ps", "ps2", "psc", "psc2", "epsc", "epsc2", ... - "eps", "eps2", "pstex", "pslatex", "epslatex", ... - "epslatexstandalone"}))) - - ## Various postscript options - if (any (strcmp (dev, {"pstex", "pslatex", "epslatex"}))) - options = ""; - elseif (strcmp (dev, "epslatexstandalone")) - if (__gnuplot_has_feature__ ("epslatexstandalone_terminal")) - termn = "epslatex"; - options = "standalone "; - else - error ("print: epslatexstandalone needs gnuplot 4.2 or higher"); - endif - else - if (dev(1) == "e") - options = "eps "; - else - options = ""; - endif - termn = "postscript"; - endif - - if (any (dev == "c") || use_color > 0 - || (! isempty (strfind (dev, "tex")) && use_color == 0)) - use_color = 1; - else - use_color = -1; - endif - - if (use_color > 0) - if (force_solid < 0) - options = cstrcat (options, "color dashed "); - else - options = cstrcat (options, "color solid "); - endif - else - if (force_solid > 0) - options = cstrcat (options, "mono solid "); - else - options = cstrcat (options, "mono dashed "); - endif - endif - - if (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); - endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); - endif - - elseif (strcmp (dev, "tikz")) - if (! isempty (font) && ! isempty (fontsize)) - options = cstrcat (options, "\"", font, ",", fontsize, "\" "); - elseif (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); - else - options = ""; - endif - - elseif (strcmp (dev, "aifm") || strcmp (dev, "corel")) - ## Adobe Illustrator, CorelDraw - if (use_color >= 0) - options = " color"; - else - options = " mono"; - endif - if (! isempty (font)) - options = cstrcat (options, " \"", font, "\""); - endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); - endif - - elseif (strcmp (dev, "fig")) - ## XFig - options = orientation; - if (use_color >= 0) - options = " color"; - else - options = " mono"; - endif - options = cstrcat (options, " ", special_flag); - if (! isempty (fontsize)) - options = cstrcat (options, " fontsize ", fontsize); - endif +function varargout = print (varargin) - elseif (strcmp (dev, "emf")) - ## Enhanced Metafile format - options = " "; - if (use_color >= 0) - options = " color"; - else - options = " mono"; - endif - if (force_solid >= 0) - options = cstrcat (options, " solid"); - endif - if (! isempty (font)) - options = cstrcat (options, " \"", font, "\""); - endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); - endif - - elseif (any (strcmp (dev, bitmap_devices))) - - if (isempty (canvas_size) && isempty (resolution) - && any (strcmp (dev, {"pbm", "gif", "jpeg", "png"}))) - options = ""; - elseif (strcmp (dev, "svg")) - ## Referring to size, either "dynamic" or "fixed" - options = "fixed"; - else - options = ""; - end - if (! isempty (canvas_size)) - options = cstrcat (options, " size ", canvas_size); - endif - - elseif (any (strcmp (dev, {"dxf", "mf", "hpgl"}))) - ## AutoCad DXF, METAFONT, HPGL - options = ""; - - elseif (strcmp (dev, "pdf")) - ## Portable Document format - options = " "; - if (use_color >= 0) - options = "color"; - else - options = "mono"; - endif - if (force_solid >= 0) - options = cstrcat (options, " solid"); - elseif (force_solid < 0) - options = cstrcat (options, " dashed"); - endif - if (! isempty (font)) - options = cstrcat (options, "\"", font, "\" "); - endif - if (! isempty (fontsize)) - options = cstrcat (options, " ", fontsize); - endif - - endif - - if (__gnuplot_has_feature__ ("variable_GPVAL_TERMINALS")) - available_terminals = __gnuplot_get_var__ (gcf, "GPVAL_TERMINALS"); - available_terminals = regexp (available_terminals, "\\b\\w+\\b", "match"); - ## Favor the cairo terminals. - if (strcmp (termn, "pdf") - && any (strcmp (available_terminals, "pdfcairo"))) - termn = "pdfcairo"; - gnuplot_supports_term = true; - elseif (strcmp (termn, "png") - && any (strcmp (available_terminals, "pngcairo"))) - termn = "pngcairo"; - gnuplot_supports_term = true; - else - gnuplot_supports_term = any (strcmp (available_terminals, termn)); - endif - elseif (strcmp (termn, "pdf")) - ## Some Linux variants do not include a "pdf" capable gnuplot. - ## To be safe, use Ghostscript. - if (have_ghostscript) - gnuplot_supports_term = false; - ghostscript_device = "pdfwrite"; - else - gnuplot_supports_term = true; - endif - else - gnuplot_supports_term = true; - endif - - if (! gnuplot_supports_term) - if (strcmp (termn, "pdf")) - ## If there the installed gnuplot does not support pdf, use Ghostscript. - ghostscript_device = "pdfwrite"; - if (strfind (name, ".pdf") == numel (name) - 3) - ghostscript_output = name; - else - ghostscript_output = strcat (name, ".pdf"); - endif - name = cstrcat (tmpnam, ".ps"); - termn = "postscript"; - ## All "options" for pdf work for postscript as well. - else - error ("print: the device, \"%s\", is not available.", dev) - endif - endif - - is_eps_file = strncmp (dev, "eps", 3); - p.units = get (gcf, "units"); - p.paperunits = get (gcf, "paperunits"); - p.papersize = get (gcf, "papersize"); - p.paperposition = get (gcf, "paperposition"); - p.paperpositionmode = get (gcf, "paperpositionmode"); - p.paperorientation = get (gcf, "paperorientation"); - p.color = get (gcf, "color"); - if (p.papersize(1) > p.papersize(2)) - paperorientation = "landscape"; - else - paperorientation = "portrait"; - endif - if (! strcmp (paperorientation, get (gcf, "paperorientation")) - && warn_on_inconsistent_orientation) - msg = {"print.m - inconsistent papersize and paperorientation properties.\n", - sprintf(" papersize = %.2f, %.2f\n", p.papersize), - sprintf(" paperorientation = \"%s\"\n", p.paperorientation), - " the paperorientation property has been ignored"}; - warning ("%s",msg{:}) - warn_on_inconsistent_orientation = false; - endif - - if (strcmp (termn, "postscript") && ! strncmp (dev, "eps", 3)) - if (isempty (orientation)) - orientation = paperorientation; - endif - ## This is done here to accommodate ghostscript conversion. - options = cstrcat (orientation, " ", options); - end - - new_terminal = cstrcat (termn, " ", options); - - mono = (use_color < 0); - - terminals_for_prn = {"postscript", "pdf", "pdfcairo"}; - output_for_printer = any (strncmp (termn, terminals_for_prn, numel(termn))); + f = gcf (); + drawnow (); + backend = (get (f, "__backend__")); - if (isempty (resolution)) - if (any (strcmp (dev, {"emf", "svg"})) || output_for_printer) - resolution = get (0, "screenpixelsperinch"); - else - resolution = 150; - endif - else - resolution = str2num (resolution); - if (resolution == 0) - resolution = get (0, "screenpixelsperinch"); - endif - endif - figure_properties = get (gcf); - if (! isfield (figure_properties, "__pixels_per_inch__")) - addproperty ("__pixels_per_inch__", gcf, "double", resolution); - endif - set (gcf, "__pixels_per_inch__", resolution) - - unwind_protect - set (gcf, "paperunits", "inches"); - set (gcf, "units", "pixels"); - set (gcf, "color", "none"); - restore_properties = true; - if ((! output_for_printer || is_eps_file) && ! doprint) - ## If not PDF or PostScript, and the result is not being sent to a printer, - ## render an image the size of the paperposition box. - ## Trigger the listener to convert all paper props to inches. - if (! isempty (canvas_size)) - size_in_pixels = sscanf (canvas_size ,"%d, %d"); - size_in_pixels = reshape (size_in_pixels, [1, numel(size_in_pixels)]); - papersize_in_inches = size_in_pixels ./ resolution; - paperposition_in_inches = [0, 0, papersize_in_inches]; - else - paperposition_in_inches = get (gcf, "paperposition"); - paperposition_in_inches(1:2) = 0; - papersize_in_inches = paperposition_in_inches(3:4); - endif - set (gcf, "papersize", papersize_in_inches); - set (gcf, "paperposition", paperposition_in_inches); - set (gcf, "paperpositionmode", "manual"); - else - if (strcmp (p.paperpositionmode, "auto")) - size_in_pixels = get (gcf, "position")(3:4); - paperposition_in_inches(3:4) = size_in_pixels ./ resolution; - paperposition_in_inches(1:2) = (p.papersize - paperposition_in_inches(3:4))/2; - else - paperposition_in_inches = p.paperposition; - endif - if (! isempty (orientation) && ! strcmp (orientation, paperorientation)) - ## When -landscape/portrait changes the orientation, flip both the - ## papersize and paperposition. - restore_properties = true; - set (gcf, "papersize", p.papersize([2, 1])); - set (gcf, "paperposition", paperposition_in_inches([2, 1, 4, 3])); - else - set (gcf, "paperposition", paperposition_in_inches); - endif - endif - if (use_color < 0) - [objs_with_color, color_of_objs] = convert_color2mono (gcf); - endif - if (append_to_file) - appended_file_name = name; - if (index(termn, "pdf")) - name = cstrcat (tmpnam, ".pdf"); - temp_name = cstrcat (tmpnam, ".pdf"); - ghostscript_device = "pdfwrite"; - else - name = cstrcat (tmpnam, ".ps"); - temp_name = cstrcat (tmpnam, ".ps"); - ghostscript_device = "pswrite"; - endif - endif - if (debug) - drawnow (new_terminal, name, mono, debug_file); - else - drawnow (new_terminal, name, mono); - endif - if (append_to_file) - ghostscript_options = "-q -dBATCH -dSAFER -dNOPAUSE"; - command = sprintf ("%s %s -sDEVICE=%s -sOutputFile=%s %s %s -q", ... - ghostscript_binary, ghostscript_options, ghostscript_device, ... - temp_name, appended_file_name, name); - status1 = system (command); - status2 = system (sprintf ("mv %s %s", temp_name, appended_file_name)); - if (status1 != 0 || status2 != 0) - error ("print: output failed to append to '%s'.", appended_file_name); - endif - endif - unwind_protect_cleanup - ## FIXME - it would be nice to delete "__pixels_per_inch__" property here. - if (restore_properties) - props = fieldnames (p); - for n = 1:numel(props) - set (gcf, props{n}, p.(props{n})) - endfor - endif - if (use_color < 0) - convert_mono_to_or_from_color (objs_with_color, color_of_objs, false); - endif - end_unwind_protect - - if (! isempty (ghostscript_output)) - if (is_eps_file && tight_flag) - ## If gnuplot's output is an eps-file then crop at the bounding box. - fix_eps_bbox (name, ghostscript_binary); - endif - ghostscript_options = "-q -dBATCH -dSAFER -dNOPAUSE -dTextAlphaBits=4"; - if (is_eps_file) - ghostscript_options = sprintf ("%s -dEPSCrop", ghostscript_options); - endif - if (isempty (strfind (lower (ghostscript_device), "write"))) - ## If output is a bitmap then include the resolution - ghostscript_options = sprintf ("%s -r%d", ghostscript_options, resolution); - endif - ghostscript_options = sprintf ("%s -sDEVICE=%s", ghostscript_options, - ghostscript_device); - command = sprintf ("\"%s\" %s -sOutputFile=\"%s\" \"%s\" 2>&1", ghostscript_binary, - ghostscript_options, ghostscript_output, name); - [errcode, output] = system (command); - unlink (name); - if (errcode) - error ("print: Conversion failed, %s -> %s.\nError was:\n%s\n", - name, ghostscript_output, output); - endif - elseif (is_eps_file && tight_flag && ! doprint) - ## If the saved output file is an eps file, use ghostscript to set a tight bbox. - ## This may result in a smaller or larger bbox geometry. - if (have_ghostscript) - fix_eps_bbox (name, ghostscript_binary); - endif - endif - - if (doprint) - if (isunix ()) - prn_opt = "-l"; - elseif (ispc ()) - prn_opt = "-o l"; - else - ## FIXME - besides Unix and Windows, what other OS's might be considered. - prn_opt = ""; - endif - if (isempty (printer)) - prn_cmd = sprintf ("lpr %s '%s' 2>&1", prn_opt, printname); - else - prn_cmd = sprintf ("lpr %s -P %s '%s' 2>&1", prn_opt, printer, printname); - endif - [status, output] = system (prn_cmd); - if (status != 0) - disp (output) - warning ("print.m: printing failed.") - endif - [status, output] = unlink (printname); - if (status != 0) - disp (output) - warning ("print.m: failed to delete temporay file, '%s'.", printname) - endif - endif - - unwind_protect_cleanup - if (isfigure (old_fig)) - figure (old_fig) - endif - end_unwind_protect + varargout = cell (1, nargout); + [varargout{:}] = feval (strcat ("__", backend, "_print__"), varargin{:}); endfunction - -function bb = fix_eps_bbox (eps_file_name, ghostscript_binary) - - persistent warn_on_no_ghostscript = true - - box_string = "%%BoundingBox:"; - - ghostscript_options = "-q -dBATCH -dSAFER -dNOPAUSE -dTextAlphaBits=4 -sDEVICE=bbox"; - cmd = sprintf ("\"%s\" %s \"%s\" 2>&1", ghostscript_binary, - ghostscript_options, eps_file_name); - [status, output] = system (cmd); - - if (status == 0) - - pattern = strcat (box_string, "[^%]*"); - pattern = pattern(1:find(double(pattern)>32, 1, "last")); - bbox_line = regexp (output, pattern, "match"); - if (iscell (bbox_line)) - bbox_line = bbox_line{1}; - endif - ## Remore the EOL characters. - bbox_line(double(bbox_line)<32) = ""; - - fid = fopen (eps_file_name, "r+"); - unwind_protect - bbox_replaced = false; - while (! bbox_replaced) - current_line = fgetl (fid); - if (strncmpi (current_line, box_string, numel(box_string))) - line_length = numel (current_line); - num_spaces = line_length - numel (bbox_line); - if (numel (current_line) < numel (bbox_line)) - ## If there new line is longer, continue with the current line. - new_line = current_line; - else - new_line = bbox_line; - new_line(end+1:numel(current_line)) = " "; - endif - ## Back up to the beginning of the line (include EOL characters). - if (ispc ()) - fseek (fid, -line_length-2, "cof"); - else - fseek (fid, -line_length-1, "cof"); - endif - count = fprintf (fid, "%s", new_line); - bbox_replaced = true; - elseif (! ischar (current_line)) - bbox_replaced = true; - warning ("print.m: no bounding box found in '%s'.", eps_file_name) - endif - endwhile - unwind_protect_cleanup - fclose (fid); - end_unwind_protect - elseif (warn_on_no_ghostscript) - warn_on_no_ghostscript = false; - warning ("print.m: Ghostscript failed to determine the bounding box.\nError was:\n%s\n", output) - endif - -endfunction - -function [h, c] = convert_color2mono (hfig) - unwind_protect - showhiddenhandles = get (0, "showhiddenhandles"); - set (0, "showhiddenhandles", "on"); - h.color = findobj (hfig, "-property", "color"); - h.facecolor = findobj (hfig, "-property", "facecolor"); - h.edgecolor = findobj (hfig, "-property", "edgecolor"); - h.backgroundcolor = findobj (hfig, "-property", "backgroundcolor"); - h.colormap = findobj (hfig, "-property", "colormap"); - unwind_protect_cleanup - set (0, "showhiddenhandles", showhiddenhandles); - end_unwind_protect - f = fieldnames (h); - for nf = 1:numel(f) - if (! isempty (h.(f{nf}))) - v = get (h.(f{nf}), f{nf}); - if (! iscell (v)) - v = {v}; - endif - c.(f{nf}) = v; - endif - endfor - convert_mono_to_or_from_color (h, c, true) -endfunction - -function convert_mono_to_or_from_color (h, c, mono) - f = fieldnames (h); - for nf = 1:numel(f) - for nh = 1:numel (h.(f{nf})) - color = c.(f{nf}){nh}; - ## Ignore color == {"none", "flat", ...} - if (isfloat (color)) - if (mono) - ## Same method as used by rgb2gray in the image pkg. - color = rgb2ntsc (color)(:,1) * ones (1, 3); - endif - set (h.(f{nf})(nh), f{nf}, color); - endif - endfor - endfor -endfunction -