view scripts/plot/util/private/__ghostscript__.m @ 17572:7bb76a22cde1

maint: Split scripts/plot directory into 4 pieces. scripts/gui : user-interface functions scripts/plot/appearance : functions controlling plot appearance scripts/plot/draw : plotting functions which produce graphs scripts/plot/util : low-level plotting functions and utilities. * scripts/gui/guidata.m, scripts/gui/guihandles.m, scripts/gui/module.mk, scripts/gui/private/__file_filter__.m, scripts/gui/private/__fltk_file_filter__.m, scripts/gui/private/__is_function__.m, scripts/gui/private/__uigetdir_fltk__.m, scripts/gui/private/__uigetfile_fltk__.m, scripts/gui/private/__uiobject_split_args__.m, scripts/gui/private/__uiputfile_fltk__.m, scripts/gui/uicontextmenu.m, scripts/gui/uicontrol.m, scripts/gui/uigetdir.m, scripts/gui/uigetfile.m, scripts/gui/uimenu.m, scripts/gui/uipanel.m, scripts/gui/uipushtool.m, scripts/gui/uiputfile.m, scripts/gui/uiresume.m, scripts/gui/uitoggletool.m, scripts/gui/uitoolbar.m, scripts/gui/uiwait.m, scripts/gui/waitbar.m, scripts/gui/waitforbuttonpress.m: Moved from scripts/plot to scripts/gui * scripts/plot/appearance/__clabel__.m, scripts/plot/appearance/__getlegenddata__.m, scripts/plot/appearance/axis.m, scripts/plot/appearance/box.m, scripts/plot/appearance/caxis.m, scripts/plot/appearance/clabel.m, scripts/plot/appearance/daspect.m, scripts/plot/appearance/diffuse.m, scripts/plot/appearance/grid.m, scripts/plot/appearance/gtext.m, scripts/plot/appearance/hidden.m, scripts/plot/appearance/legend.m, scripts/plot/appearance/orient.m, scripts/plot/appearance/pbaspect.m, scripts/plot/appearance/private/__axis_label__.m, scripts/plot/appearance/private/__axis_limits__.m, scripts/plot/appearance/shading.m, scripts/plot/appearance/specular.m, scripts/plot/appearance/text.m, scripts/plot/appearance/title.m, scripts/plot/appearance/view.m, scripts/plot/appearance/whitebg.m, scripts/plot/appearance/xlabel.m, scripts/plot/appearance/xlim.m, scripts/plot/appearance/ylabel.m, scripts/plot/appearance/ylim.m, scripts/plot/appearance/zlabel.m, scripts/plot/appearance/zlim.m: Moved from scripts/plot to subdir appearance. * scripts/plot/draw/area.m, scripts/plot/draw/bar.m, scripts/plot/draw/barh.m, scripts/plot/draw/colorbar.m, scripts/plot/draw/comet.m, scripts/plot/draw/comet3.m, scripts/plot/draw/compass.m, scripts/plot/draw/contour.m, scripts/plot/draw/contour3.m, scripts/plot/draw/contourc.m, scripts/plot/draw/contourf.m, scripts/plot/draw/cylinder.m, scripts/plot/draw/ellipsoid.m, scripts/plot/draw/errorbar.m, scripts/plot/draw/ezcontour.m, scripts/plot/draw/ezcontourf.m, scripts/plot/draw/ezmesh.m, scripts/plot/draw/ezmeshc.m, scripts/plot/draw/ezplot.m, scripts/plot/draw/ezplot3.m, scripts/plot/draw/ezpolar.m, scripts/plot/draw/ezsurf.m, scripts/plot/draw/ezsurfc.m, scripts/plot/draw/feather.m, scripts/plot/draw/fill.m, scripts/plot/draw/fplot.m, scripts/plot/draw/hist.m, scripts/plot/draw/isocolors.m, scripts/plot/draw/isonormals.m, scripts/plot/draw/isosurface.m, scripts/plot/draw/line.m, scripts/plot/draw/loglog.m, scripts/plot/draw/loglogerr.m, scripts/plot/draw/mesh.m, scripts/plot/draw/meshc.m, scripts/plot/draw/meshz.m, scripts/plot/draw/pareto.m, scripts/plot/draw/patch.m, scripts/plot/draw/pcolor.m, scripts/plot/draw/peaks.m, scripts/plot/draw/pie.m, scripts/plot/draw/pie3.m, scripts/plot/draw/plot.m, scripts/plot/draw/plot3.m, scripts/plot/draw/plotmatrix.m, scripts/plot/draw/plotyy.m, scripts/plot/draw/polar.m, scripts/plot/draw/private/__add_datasource__.m, scripts/plot/draw/private/__bar__.m, scripts/plot/draw/private/__contour__.m, scripts/plot/draw/private/__errcomm__.m, scripts/plot/draw/private/__errplot__.m, scripts/plot/draw/private/__ezplot__.m, scripts/plot/draw/private/__interp_cube__.m, scripts/plot/draw/private/__line__.m, scripts/plot/draw/private/__marching_cube__.m, scripts/plot/draw/private/__patch__.m, scripts/plot/draw/private/__pie__.m, scripts/plot/draw/private/__plt__.m, scripts/plot/draw/private/__quiver__.m, scripts/plot/draw/private/__scatter__.m, scripts/plot/draw/private/__stem__.m, scripts/plot/draw/quiver.m, scripts/plot/draw/quiver3.m, scripts/plot/draw/rectangle.m, scripts/plot/draw/ribbon.m, scripts/plot/draw/rose.m, scripts/plot/draw/scatter.m, scripts/plot/draw/scatter3.m, scripts/plot/draw/semilogx.m, scripts/plot/draw/semilogxerr.m, scripts/plot/draw/semilogy.m, scripts/plot/draw/semilogyerr.m, scripts/plot/draw/shrinkfaces.m, scripts/plot/draw/slice.m, scripts/plot/draw/sombrero.m, scripts/plot/draw/sphere.m, scripts/plot/draw/stairs.m, scripts/plot/draw/stem.m, scripts/plot/draw/stem3.m, scripts/plot/draw/stemleaf.m, scripts/plot/draw/surf.m, scripts/plot/draw/surface.m, scripts/plot/draw/surfc.m, scripts/plot/draw/surfl.m, scripts/plot/draw/surfnorm.m, scripts/plot/draw/tetramesh.m, scripts/plot/draw/trimesh.m, scripts/plot/draw/triplot.m, scripts/plot/draw/trisurf.m, scripts/plot/draw/waterfall.m: Moved from plot/ to subdir draw. * scripts/plot/util/__actual_axis_position__.m, scripts/plot/util/__default_plot_options__.m, scripts/plot/util/__gnuplot_drawnow__.m, scripts/plot/util/__next_line_color__.m, scripts/plot/util/__next_line_style__.m, scripts/plot/util/__plt_get_axis_arg__.m, scripts/plot/util/__pltopt__.m, scripts/plot/util/allchild.m, scripts/plot/util/ancestor.m, scripts/plot/util/axes.m, scripts/plot/util/cla.m, scripts/plot/util/clf.m, scripts/plot/util/close.m, scripts/plot/util/closereq.m, scripts/plot/util/colstyle.m, scripts/plot/util/copyobj.m, scripts/plot/util/figure.m, scripts/plot/util/findall.m, scripts/plot/util/findfigs.m, scripts/plot/util/findobj.m, scripts/plot/util/gca.m, scripts/plot/util/gcbf.m, scripts/plot/util/gcbo.m, scripts/plot/util/gcf.m, scripts/plot/util/gco.m, scripts/plot/util/ginput.m, scripts/plot/util/gnuplot_binary.in, scripts/plot/util/graphics_toolkit.m, scripts/plot/util/hdl2struct.m, scripts/plot/util/hggroup.m, scripts/plot/util/hold.m, scripts/plot/util/isaxes.m, scripts/plot/util/isfigure.m, scripts/plot/util/ishghandle.m, scripts/plot/util/ishold.m, scripts/plot/util/isprop.m, scripts/plot/util/linkprop.m, scripts/plot/util/meshgrid.m, scripts/plot/util/ndgrid.m, scripts/plot/util/newplot.m, scripts/plot/util/print.m, scripts/plot/util/printd.m, scripts/plot/util/private/__add_default_menu__.m, scripts/plot/util/private/__fltk_ginput__.m, scripts/plot/util/private/__fltk_print__.m, scripts/plot/util/private/__ghostscript__.m, scripts/plot/util/private/__gnuplot_get_var__.m, scripts/plot/util/private/__gnuplot_ginput__.m, scripts/plot/util/private/__gnuplot_has_feature__.m, scripts/plot/util/private/__gnuplot_has_terminal__.m, scripts/plot/util/private/__gnuplot_open_stream__.m, scripts/plot/util/private/__gnuplot_print__.m, scripts/plot/util/private/__gnuplot_version__.m, scripts/plot/util/private/__go_draw_axes__.m, scripts/plot/util/private/__go_draw_figure__.m, scripts/plot/util/private/__print_parse_opts__.m, scripts/plot/util/private/__tight_eps_bbox__.m, scripts/plot/util/refresh.m, scripts/plot/util/refreshdata.m, scripts/plot/util/saveas.m, scripts/plot/util/shg.m, scripts/plot/util/struct2hdl.m, scripts/plot/util/subplot.m: Moved from plot to subdir util. * etc/HACKING: Updated directory structure info. * scripts/Makefile.am, scripts/plot/appearance/module.mk, scripts/plot/draw/module.mk, scripts/plot/util/module.mk: Added new directories to build system.
author Rik <rik@octave.org>
date Fri, 04 Oct 2013 17:09:08 -0700
parents scripts/plot/private/__ghostscript__.m@5d3a684236b0
children d63878346099
line wrap: on
line source

## Copyright (C) 2010-2012 Ben Abbott
##
## 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} {} __ghostscript__ (@var{@dots{}})
## Undocumented internal function.
## @end deftypefn

## Author: Ben Abbott <bpabbott@mac.com>
## Created: 2010-07-26

function [gs_cmd, cleanup_cmd] = __ghostscript__ (varargin);

  opts.binary = "";
  opts.source = "-";
  opts.output = "-";
  opts.device = "";
  opts.epscrop = false;
  opts.antialiasing  = false;
  opts.antialiasing_textalphabits = 4;,
  opts.antialiasing_graphicsalphabits = 4;
  opts.resolution = 150;
  opts.papersize = "";
  opts.pageoffset = [0 0];
  opts.debug = false;
  opts.level = [];
  opts.prepend = "";

  offsetfile = "";
  offset_ps = {};
  cleanup_cmd = "";

  args = varargin;
  n = find (cellfun ("isclass", args, "struct"));
  if (! isempty (n))
    f = fieldnames (args{n});
    for m = 1:numel (f)
      opts.(f{m}) = args{n}.(f{m});
    endfor
    args(n) = [];
  endif
  for n = 1:2:numel (args)
    opts.(args{n}) = args{n+1};
  endfor

  if (isempty (opts.papersize))
    format_for_printer = false;
  else
    format_for_printer = true;
  endif

  gs_opts = sprintf ("-dQUIET -dNOPAUSE -dBATCH -dSAFER -sDEVICE=%s", opts.device);

  if (! isempty (opts.level) && ismember (opts.level, [1, 2, 3]))
    gs_opts = sprintf ("%s -dLanguageLevel=%d", gs_opts, round (opts.level));
  endif

  if (opts.antialiasing && isempty (strfind (opts.device, "write")))
    ## Apply anti-aliasing to all bitmap formats/devices
    gs_opts = sprintf ("%s -dTextAlphaBits=%d -dGraphicsAlphaBits=%d",
                       gs_opts, opts.antialiasing_textalphabits,
                       opts.antialiasing_graphicsalphabits);
    gs_opts = sprintf ("%s -r%dx%d", gs_opts, [1, 1] * opts.resolution);
  elseif (any (strcmp (opts.device, {"pswrite", "ps2write", "pdfwrite"})))
    gs_opts = sprintf ("%s -dEmbedAllFonts=true", gs_opts);
    if (strcmp (opts.device, "pdfwrite"))
      ## Optimize for loading
      gs_opts = sprintf ("%s -dOptimize=true", gs_opts);
    endif
  endif

  if (opts.epscrop)
    ## papersize is specified by the eps bbox
    gs_opts = sprintf ("%s -dEPSCrop", gs_opts);
  endif
  if (format_for_printer)
    if (ischar (opts.papersize))
      gs_opts = sprintf ("%s -sPAPERSIZE=%s", gs_opts, opts.papersize);
    elseif (isnumeric (opts.papersize) && numel (opts.papersize) == 2)
      gs_opts = sprintf ("%s -dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d",
                         gs_opts, opts.papersize);
      if (opts.papersize(1) > opts.papersize(2))
        ## Lanscape mode: This option will result in automatic rotation of the
        ##                document page if the requested page size matches one
        ##                of the default page sizes
        gs_opts = sprintf ("%s -dNORANGEPAGESIZE", gs_opts);
      endif
    else
      error ("print:badpapersize", "__ghostscript__.m: invalid 'papersize'");
    endif
    gs_opts = sprintf ("%s -dFIXEDMEDIA", gs_opts);
    ## "pageoffset" is relative to the coordinates, not the BBox LLHC.
    str = sprintf ("%s [%d %d] %s", "<< /Margins [0 0] /.HWMargins [0 0 0 0] /PageOffset",
                   opts.pageoffset, ">> setpagedevice");
    offset_ps = {"%!PS-Adobe-3.0", str, "%%EOF"};
    if (isfield (opts, "offsetfile"))
      offsetfile = opts.offsetfile;
      cleanup_cmd = "";
    else
      offsetfile = strcat (tmpnam (), ".ps");
      cleanup_cmd = sprintf ("rm %s", offsetfile);
    endif
    unwind_protect
      fid = fopen (offsetfile, "w");
      if (fid == -1)
        error ("print:fopenfailed", "__ghostscript__.m: fopen () failed");
      endif
      fprintf (fid, "%s\n", offset_ps{:});
    unwind_protect_cleanup
      status = fclose (fid);
      if (status == -1)
        error ("print:fclosefailed", "__ghostscript__.m: fclose () failed");
      endif
    end_unwind_protect
    if (opts.debug)
      fprintf ("---- begin %s ----\n", offsetfile);
      fprintf ("%s\n", offset_ps{:});
      fprintf ("----- end %s -----\n", offsetfile);
    endif
  endif

  if (isempty (opts.binary))
    error ("print:no_ghostscript", "__ghostscript__.m: ghostscript is required.");
  elseif (isempty (opts.output))
    cmd = sprintf ("%s %s", opts.binary, gs_opts);
  else
    cmd = sprintf ("%s %s -sOutputFile=\"%s\"", opts.binary, gs_opts, opts.output);
  endif
  if (! isempty (opts.prepend)
      && any (strcmpi (opts.device, {"pswrite", "ps2write", "pdfwrite"})))
    ## FIXME - Fonts get may be mangled when appending ps/ps2.
    ##         See "How to concatenate several PS files" at the link,
    ##         http://en.wikibooks.org/wiki/PostScript_FAQ
    cmd = sprintf ("%s %s", cmd, opts.prepend);
    if (isempty (cleanup_cmd))
      cleanup_cmd = sprintf ("rm %s", opts.prepend);
    else
      cleanup_cmd = sprintf ("%s ; rm %s", cleanup_cmd, opts.prepend);
    endif
  endif
  if (! isempty (offsetfile) && format_for_printer)
    cmd = sprintf ("%s %s", cmd, offsetfile);
  endif
  if (! isempty (opts.source))
    cmd = sprintf ("%s %s", cmd, opts.source);
  endif

  if (opts.debug)
    fprintf ("Ghostscript command: '%s'\n", cmd);
  endif

  gs_cmd = cmd;

endfunction