Mercurial > hg > octave-nkf
diff scripts/plot/private/__ghostscript__.m @ 10854:d5a7db05d591
Add PS and PDF output for the fltk backend.
author | Ben Abbott <bpabbott@mac.com> |
---|---|
date | Wed, 04 Aug 2010 20:32:49 -0400 |
parents | 05ba991794d4 |
children | dd6b90f44ae5 |
line wrap: on
line diff
--- a/scripts/plot/private/__ghostscript__.m +++ b/scripts/plot/private/__ghostscript__.m @@ -22,29 +22,87 @@ ## Author: Ben Abbott <bpabbott@mac.com> ## Created: 2010-07-26 -function status = __ghostscript__ (opts, varargin); +function status = __ghostscript__ (varargin); - if (nargin > 1) - opts.name = varargin{1}; + opts.binary = ""; + opts.source = ""; + opts.output = ""; + opts.device = ""; + opts.epscrop = false; + opts.antialiasing = false; + opts.resolution = 150; + opts.papersize = ""; + opts.pageoffset = [0 0]; + opts.debug = false; + + offsetfile = ""; + + args = varargin; + n = find (cellfun (@isstruct, args)); + if (! isempty (n)) + f = fieldnames (args{n}); + for m = 1:numel(f) + opts.(f{m}) = args{n}.(f{m}); + endfor + args(n) = []; endif - if (nargin > 2) - opts.ghostscript_device = varargin{2}; - endif - if (nargin > 3) - opts.ghostscript_output = varargin{3}; + for n = 1:2:numel(args) + opts.(args{n}) = args{n+1}; + endfor + + gs_opts = sprintf ("-dQUIET -dNOPAUSE -dBATCH -dSAFER -sDEVICE=%s", opts.device); + if (opts.antialiasing) + gs_opts = sprintf ("%s -dTextAlphaBits=4 -dGraphicsAlphaBits=4", gs_opts); + 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 (strncmp (opts.devopt, "eps", 3)) - ## "eps" files - gs_opts = "-q -dNOPAUSE -dBATCH -dSAFER -dEPSCrop"; - else - ## "ps" or "pdf" files - gs_opts = "-q -dNOPAUSE -dBATCH -dSAFER"; + if (opts.epscrop) + ## papersize is specified by the eps bbox + gs_opts = sprintf ("%s -dEPSCrop", gs_opts); + elseif (! isempty (opts.papersize)) + 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); + offsetfile = strcat (tmpnam (), ".ps"); + fid = fopen (offsetfile, "w"); + if (fid == -1) + error ("print:fopenfailed", "__ghostscript__.m: fopen() failed."); + endif + fprintf (fid, "%s\n", "%!PS-Adobe-3.0") + fprintf (fid, "%s [%d %d] %s\n", "<< /Margins [0 0] /.HWMargins [0 0 0 0] /PageOffset", + opts.pageoffset, ">> setpagedevice"); + fprintf (fid, "%%EOF"); + status = fclose (fid); + if (status == -1) + error ("print:fclosefailed", "__ghostscript__.m: fclose() failed."); + endif + if (opts.debug) + [~,output] = system (sprintf ("cat %s", offsetfile)); + fprintf ("---- begin %s ----\n", offsetfile) + disp (output) + fprintf ("----- end %s -----\n", offsetfile) + endif endif - cmd = sprintf ("%s %s -sDEVICE=%s -r%d -sOutputFile=%s %s", - opts.ghostscript_binary, gs_opts, opts.ghostscript_device, - opts.resolution, opts.ghostscript_output, opts.name); + cmd = sprintf ("%s %s -sOutputFile=%s %s %s", + opts.binary, gs_opts, + opts.output, offsetfile, opts.source); if (opts.debug) fprintf ("Ghostscript command: %s\n", cmd); @@ -54,7 +112,9 @@ if (status != 0) warning ("print:ghostscripterror", - "print.m: gs failed to convert output to file '%s'.", opts.ghostscript_output) + "print.m: ghostscript failed to convert output to file '%s'.", opts.output) endif endfunction + +