Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

EPSPlot.cc

Go to the documentation of this file.
00001 /*
00002     File:       EPSPlot.cc
00003 
00004     Function:   Provides 2D plotter which outputs EPS files.
00005 
00006     Author:     Andrew Willmott
00007 
00008     Notes:      Some of this is originally from Paul Heckbert's libplo.a
00009 */
00010 
00011 #include "gcl/EPSPlot.h"
00012 #include "gcl/Geometry.h"
00013 #include <string.h>
00014 
00015 // --- eps header -------------------------------------------------------------
00016 
00017 static Char header[] = 
00018 "%%!PS-Adobe-3.0 EPSF-3.0\n"
00019 "%%%%BoundingBox: %d %d %d %d\n"
00020 "%%%%Title: %s\n"
00021 "%%%%Creator: PSPlot class\n";
00022 
00023 // --- little ps library  -----------------------------------------------------
00024 
00025 static Char definitions[] = "\
00026 /m {moveto} def\n\
00027 /d {lineto} def\n\
00028 /t {moveto show} def\n\
00029 /p {stroke} def\n\
00030 /dot {newpath 0 360 arc closepath fill} def\n\
00031 /cir {newpath 0 360 arc closepath stroke} def\n\
00032 \n\n";
00033 
00034 
00035 // --- EPSPlot class ----------------------------------------------------------
00036 
00037 
00038 EPSPlot::EPSPlot() : 
00039     file(0),
00040     drawn(false),
00041     font("Helvetica"),
00042     width(1),
00043     scale(144),     // default 2" x 2"
00044     level2(false)
00045 {
00046 }
00047 
00048 Void EPSPlot::Open(const Char *filename)
00049 {
00050     if (strcmp(filename, ".") == 0)
00051         file = stdout;
00052     else if ((file = fopen(filename, "w")) == NULL)
00053     {
00054         fprintf(stderr, "(EPSPlot::Open) Can't write %s\n", filename);
00055         return;
00056     }
00057     
00058     fprintf(file, header, 0, 0, (int) scale, (int) scale, "plot");
00059     fputs(definitions, file);
00060     
00061     if (level2)
00062     {
00063         // draw border
00064         fprintf(file, "0.1 setlinewidth\n");
00065         fprintf(file, "%g %g %g %g rectstroke\n", 0.0, 0.0, scale, scale);
00066     
00067         // make sure everything outside viewport is clipped.
00068         fprintf(file, "%g %g %g %g rectclip\n", 0.0, 0.0, scale, scale);
00069     }
00070         
00071     // scale down so coord. sys. is [0,1].
00072     
00073     fprintf(file, "%g %g scale\n", scale, scale);
00074 }
00075 
00076 Void EPSPlot::Close()
00077 {
00078     if (drawn)
00079         Stroke();
00080     fprintf(file, "showpage\n");
00081     fclose(file);
00082 }
00083 
00084 // --- Drawing commands -------------------------------------------------------
00085 
00086 Void EPSPlot::MoveTo(GCLReal x, GCLReal y)
00087 {
00088     if (drawn)
00089         Stroke();
00090     fprintf(file, "%.4g %.4g m\n", x, y);
00091 }
00092 
00093 Void EPSPlot::LineTo(GCLReal x, GCLReal y)
00094 {
00095     drawn = 1;
00096     fprintf(file, "%.4g %.4g d\n", x, y);
00097 }
00098 
00099 Void EPSPlot::Stroke()
00100 {
00101     fprintf(file, "p\n");
00102     drawn = 0;
00103 }
00104 
00105 Void EPSPlot::SetWidth(GCLReal width)
00106 {
00107     if (drawn)
00108         Stroke();
00109     fprintf(file, "%g setlinewidth\n", width);
00110 }
00111 
00112 Void EPSPlot::LineStyle(Int style)
00113 {
00114     if (drawn)
00115         Stroke();
00116     switch (style)
00117     {
00118     case lineDashed:
00119         fprintf(file, "[.06 .04] 0 setdash\n");
00120         break;
00121     case lineDotted:
00122         fprintf(file, "[.015 .03] 0 setdash\n");
00123         break;
00124     default:
00125         fprintf(stderr, "(EPSPlot::LineStyle) don't know style %d\n", style);
00126         /* fall through */
00127     case lineSolid:
00128         fprintf(file, "[] 0 setdash\n");
00129         break;
00130     }
00131 }
00132 
00133 Void EPSPlot::SetColour(const Colour &clr)
00134 {
00135     if (drawn)
00136         Stroke();
00137 
00138     if (level2)
00139     {
00140         fprintf(file, "%g %g %g setrgbcolor\n", 
00141             Double(clr[0]), Double(clr[1]), Double(clr[2]));
00142     }
00143     else
00144     {
00145         Double level = dot(cRGBToLum, clr);
00146         fprintf(file, "%g setgray\n", level);
00147     }
00148 }
00149 
00150 Void EPSPlot::Dot(GCLReal x, GCLReal y, GCLReal r)
00151 {
00152     if (drawn)
00153         Stroke();
00154     fprintf(file, "%.4g %.4g %.4g dot\n", x, y, r);
00155 }
00156 
00157 Void EPSPlot::Circle(GCLReal x, GCLReal y, GCLReal r)
00158 {
00159     if (drawn)
00160         Stroke();
00161     fprintf(file, "%.4g %.4g %.4g cir\n", x, y, r);
00162 }
00163 
00164 Void EPSPlot::DrawText(GCLReal x, GCLReal y, Char *string)
00165 {
00166     fprintf(file, "(%s) %.4g %.4g t\n", string, x, y);
00167 }
00168 
00169 Void EPSPlot::SetOutputSize(GCLReal size)
00170 {
00171     scale = size;
00172 }
00173 
00174 Void EPSPlot::SetPort(GCLReal left, GCLReal bottom, GCLReal right, GCLReal top,
00175                       Bool centred)
00176 {
00177     Scale(1.0 / (right - left), 1.0 / (top - bottom));
00178     if (centred)
00179         Translate((right - left) / 2.0, (top - bottom) / 2.0);
00180     else
00181         Translate(-left, -bottom);
00182 }
00183 
00184 Void EPSPlot::Push()
00185 {
00186     if (drawn)
00187         Stroke();
00188     fprintf(file, "gsave\n");
00189 }
00190 
00191 Void EPSPlot::Pop()
00192 {
00193     if (drawn)
00194         Stroke();
00195     fprintf(file, "grestore\n");
00196 }
00197 
00198 Void EPSPlot::Translate(GCLReal tx, GCLReal ty)
00199 {
00200     fprintf(file, "%.4g %.4g translate\n", tx, ty);
00201 }
00202 
00203 Void EPSPlot::Scale(GCLReal sx, GCLReal sy)
00204 {
00205     fprintf(file, "%.4g %.4g scale\n", sx, sy);
00206 }
00207 
00208 Void EPSPlot::Rotate(GCLReal angle)
00209 {
00210     fprintf(file, "%.4g rotate\n", RadsToDegs(angle));
00211 }
00212 
00213 Void EPSPlot::Comment(StrConst string)
00214 {
00215     fprintf(file, "%% %s\n", string);
00216 }
00217 
00218 

Generated at Sat Aug 5 00:16:58 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000