view scripts/plot/print.m @ 5362:ef053d682e42

[project @ 2005-05-23 19:21:54 by jwe]
author jwe
date Mon, 23 May 2005 19:21:54 +0000
parents 0ac38aea9f76
children 37f62a7778c2
line wrap: on
line source

## Copyright (C) 1999 Daniel Heiserer
## Copyright (C) 2001 Laurent Mazet
##
## 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 2, 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, write to the Free
## Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.

## -*- texinfo -*-
## @deftypefn {Function File} {} print (@var{filename}, @var{options})
##
## Print a graph, or save it to a file
##
## @var{filename} defines the file name of the output file. If no
## filename is specified, output is sent to the printer.
##
## @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 -color
## @itemx -mono
##   Monochrome or colour lines.
## @item -solid
## @itemx -dashed
##   Solid or dashed lines.
## @item -portrait
## @itemx -landscape
##   Plot orientation, as returned by "orient".
## @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 ill
##   @itemx aifm
##     Adobe Illustrator
##   @item cdr
##   @itemx corel
##     CorelDraw
##   @item hpgl
##     HP plotter language
##   @item fig
##     XFig
##   @item dxf
##     AutoCAD
##   @item mf
##     Metafont
##   @item png
##     Portable network graphics
##   @item pbm
##     PBMplus
##   @end table
##
##   Other devices are supported by "convert" from ImageMagick.  Type
##   system("convert") to see what formats are available.
##
##   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 -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.
## @end deftypefn

## Author: Daniel Heiserer <Daniel.heiserer@physik.tu-muenchen.de>
## Adapted-By: jwe

## PKG_ADD: mark_as_command print

function print (varargin)

  ## take care of the settings we had before
  origterm = gget ("terminal");
  origout = gget ("output");
  ## End of line trmination for __gnuplot_raw__ command strings.
  endl = ";\n";
  _automatic_replot = automatic_replot;

  ## take care of the default terminal settings to restore them.
  terminal_default = "";
  
  orientation = orient;
  use_color = 0; # 0=default, -1=mono, +1=color
  force_solid = 0; # 0=default, -1=dashed, +1=solid
  fontsize = font = name = devopt = printer = "";
  
  va_arg_cnt = 1;

  for i = 1:nargin
    arg = nth (varargin, va_arg_cnt++);
    if (isstr (arg))
      if (strcmp (arg, "-color"))
	use_color = 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 (length (arg) > 2 && arg(1:2) == "-d")
	devopt = arg(3:length(arg));
      elseif (length (arg) > 2 && arg(1:2) == "-P")
	printer = arg;
      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) >= 1 && arg(1) == "-")
	error ("print: unknown option `%s'", arg);
      elseif (length (arg) > 0)
	name = arg;
      endif
    else
      error ("print: expects string options");
    endif
  endfor

  doprint = isempty (name);
  if (doprint)
    if (isempty (devopt))
      printname = [ tmpnam, ".ps" ]; 
    else
      printname = [ tmpnam, ".", devopt ];
    endif
    name = printname;
  endif

  if (isempty (devopt))
    dot = rindex (name, ".");
    if (dot == 0) 
      error ("print: no format specified");
    else
      dev = tolower (name(dot+1:end));
    endif
  else
    dev = devopt;
  endif

  if (strcmp (dev, "ill"))
    dev = "aifm";
  elseif (strcmp (dev, "cdr"))
    dev = "corel";
  endif

  ## check if we have to use convert
  dev_list = [" aifm corel fig png pbm dxf mf hpgl", ...
	      " ps ps2 psc psc2 eps eps2 epsc epsc2 " ];
  convertname = "";
  if (isempty (findstr (dev_list , [ " ", dev, " " ]))
    if (! isempty (devopt))
      convertname = [ devopt ":" name ];
    else
      convertname = name;
    endif
    dev = "epsc";
    name = [ tmpnam, ".eps" ];
  endif
  
  unwind_protect
    automatic_replot = 0;

    if (strcmp (dev, "ps") || strcmp (dev, "ps2") ...
	|| strcmp (dev, "psc")  || strcmp (dev, "psc2")
	|| strcmp (dev, "epsc") || strcmp (dev, "epsc2")
	|| strcmp (dev, "eps")  || strcmp (dev, "eps2"))
      ## Various postscript options
      ## XXX FIXME XXX -- Do we need this? DAS
      ##__gnuplot_set__ term postscript
      terminal_default = gget ("terminal");
      
      if (dev(1) == "e")
	options = "eps ";
      else
	options = [ orientation, " " ];
      endif
      options = [ options, "enhanced " ];
      
      if (any (dev == "c") || use_color > 0)
        if (force_solid < 0)
	  options = [ options, "color dashed " ];
	else
          options = [ options, "color solid " ];
        endif
      else
        if (force_solid > 0)
	  options = [ options, "mono solid " ];
	else
	  options = [ options, "mono dashed " ];
        endif
      endif

      if (! isempty (font))
	options = [ options, "\"", font, "\" " ];
      endif
      if (! isempty (fontsize))
	options = [ options, " ", fontsize ];
      endif

      __gnuplot_raw__ (["set term postscript ", options, endl]);


    elseif (strcmp (dev, "aifm") || strcmp (dev, "corel"))
      ## Adobe Illustrator, CorelDraw
      ## FIXME: Do we need it? DAS
      ## eval(sprintf ("__gnuplot_set__ term %s", dev));
      terminal_default = gget ("terminal");
      if (use_color >= 0)
	options = " color";
      else
	options = " mono";
      endif
      if (! isempty (font))
	options = [ options, " \"" , font, "\"" ];
      endif
      if (! isempty (fontsize))
	options = [ options, " ", fontsize ];
      endif

      __gnuplot_raw__ (["set term ", dev, " ", options, endl]);

    elseif (strcmp (dev, "fig"))
      ## XFig
      ## FIXME: Do we need it? DAS
      ## __gnuplot_set__ term fig
      terminal_default = gget ("terminal");
      options = orientation;
      if (use_color >= 0)
	options = " color";
      else
	options = " mono";
      endif
      if (! isempty (fontsize))
	options = [ options, " fontsize ", fontsize ];
      endif
      __gnuplot_raw__ (["set term fig ", options, endl]);

    elseif (strcmp (dev, "png") || strcmp (dev, "pbm"))
      ## Portable network graphics, PBMplus
      ## FIXME: Do we need it? DAS
      ## eval(sprintf ("__gnuplot_set__ term %s", dev));
      terminal_default = gget ("terminal");

      ## XXX FIXME XXX -- New PNG interface takes color as "xRRGGBB"
      ## where x is the literal character 'x' and 'RRGGBB' are the red,
      ## green and blue components in hex.  For now we just ignore it
      ## and use default.  The png terminal now is so rich with options,
      ## that one perhaps has to write a separate printpng.m function.
      ## DAS

      ## if (use_color >= 0)
      ##	eval (sprintf ("__gnuplot_set__ term %s color medium", dev));
      ##else
      ##eval (sprintf ("__gnuplot_set__ term %s mono medium", dev));
      ##endif
      
      __gnuplot_raw__ ("set term png large;\n")
 
    elseif (strcmp (dev, "dxf") || strcmp (dev, "mf") || strcmp (dev, "hpgl"))
      ## AutoCad DXF, METAFONT, HPGL
      __gnuplot_raw__ (["set terminal ", dev, endl]);
    endif
    
    ## Gnuplot expects " around output file name

    __gnuplot_raw__ (["set output \"", name, "\"", endl]);
    __gnuplot_replot__
    
  unwind_protect_cleanup

    ## Restore init state
    if (! isempty (terminal_default))
      __gnuplot_raw__ (["set terminal ", terminal_default, endl]);
    endif
    __gnuplot_raw__ (["set terminal ", origterm, endl]);
    if (isempty (origout))
      __gnuplot_raw__ ("set output;\n")
    else
    ## Gnuplot expects " around output file name
      __gnuplot_raw__ (["set output \"", origout, "\"", endl]);
    end
    __gnuplot_replot__
    
    automatic_replot = _automatic_replot ;

  end_unwind_protect

  if (! isempty (convertname))
    command = [ "convert '", name, "' '", convertname, "'" ];
    [output, errcode] = system (command);
    unlink (name);
    if (errcode)
      error ("print: could not convert");
    endif
  endif

  ## XXX FIXME XXX -- This looks like a dirty, Unix-specific hack.
  ## DAS
  if (doprint)
    system (sprintf ("lpr %s '%s'", printer, printname));
    unlink (printname);
  endif
  
endfunction