00001 /*
00002 File: EPSRenderer.cc
00003
00004 Function: Implements EPSRenderer.h
00005
00006 Author(s): Andrew Willmott
00007
00008 Copyright: (c) 1997-2000, Andrew Willmott
00009
00010 */
00011
00012 #include <iostream.h>
00013 #include "gcl/EPSRenderer.h"
00014
00015 EPSRenderer::EPSRenderer() :
00016 Renderer(),
00017 matrixStack(1, 32),
00018 start(true),
00019 style(renNone),
00020 itsFilename("out.eps")
00021 {
00022 matrixStack.Top() = vl_I;
00023 itsPlot.SetOutputSize(192);
00024 // 192 points: this gets us same size as 400x400 picture at 150dpi in frame
00025 }
00026
00027 Void EPSRenderer::ViewPoint(const HPoint &hp, Bool draw)
00028 {
00029 Point p = proj(hp);
00030
00031 if (draw)
00032 itsPlot.LineTo(p[0], p[1]);
00033 else
00034 itsPlot.MoveTo(p[0], p[1]);
00035 }
00036
00037 Void EPSRenderer::Attach(StrConst epsFilename)
00038 {
00039 itsFilename = epsFilename;
00040 }
00041
00042 Void EPSRenderer::MakeCurrent()
00043 {
00044 }
00045
00046 Void EPSRenderer::Show()
00047 {
00048 itsPlot.Close();
00049 }
00050
00051
00052 // --- Renderer Drawing Operators ---------------------------------------------
00053
00054
00055 Renderer &EPSRenderer::SetColour(const Colour &c)
00056 {
00057 itsPlot.SetColour(c);
00058 return(SELF);
00059 }
00060
00061 Renderer &EPSRenderer::SetPoint(const Point &p)
00062 {
00063 HPoint hp(p, 1.0);
00064
00065 hp = xform(matrixStack.Top(), hp);
00066
00067 ClipPoint(hp, !start);
00068
00069 if (start)
00070 {
00071 firstPoint = p;
00072 start = false;
00073 }
00074
00075 return(SELF);
00076 }
00077
00078 Renderer &EPSRenderer::SetCoord(const Coord &c)
00079 {
00080 return(SetPoint(Vector(c, 0.0)));
00081 }
00082
00083 Renderer &EPSRenderer::SetNormal(const Vector &n)
00084 {
00085 return(SELF);
00086 }
00087
00088 Renderer &EPSRenderer::SetTransform(const Transform &t)
00089 {
00090 matrixStack.Top() *= t;
00091 return(SELF);
00092 }
00093
00094 Renderer &EPSRenderer::SetCamera(const Camera &c)
00095 {
00096 matrixStack.Clear();
00097 matrixStack.Push(c.ProjMatrix() * c.ModelMatrix());
00098 return(SELF);
00099 }
00100
00101 Renderer &EPSRenderer::Pop()
00102 {
00103 matrixStack.Pop();
00104 return(SELF);
00105 }
00106
00107 Renderer &EPSRenderer::Push()
00108 {
00109 matrixStack.Push(matrixStack.Top());
00110 return(SELF);
00111 }
00112
00113 Renderer &EPSRenderer::Clear()
00114 {
00115 itsPlot.Open(itsFilename);
00116 itsPlot.SetPort(-1, -1, 1, 1, true);
00117 itsPlot.SetWidth(0.0005);
00118
00119 return(SELF);
00120 }
00121
00122 Renderer &EPSRenderer::Begin(RenderStyle newStyle)
00123 {
00124 Assert(style == renNone, "Unmatched EPSRenderer::Begin().");
00125 style = newStyle;
00126 start = true;
00127 return(SELF);
00128 }
00129
00130 Renderer &EPSRenderer::End()
00131 {
00132 Assert(style != renNone, "Unmatched EPSRenderer::End().");
00133
00134 if (style == renPoly || style == renLineLoop)
00135 // close loop
00136 SetPoint(firstPoint);
00137
00138 style = renNone;
00139 return(SELF);
00140 }
00141
00142 Void EPSRenderer::Print(ostream &s)
00143 {
00144 #ifdef BROKEN
00145 s << "EPS Renderer\n style = " << (int) style
00146 << " matrix = " << matrixStack.Top()
00147 << " start = " << start << endl;
00148 #endif
00149 }
00150