lemon/eps.cc
changeset 1980 a954b780e3ab
child 2008 0820d8168cbb
equal deleted inserted replaced
-1:000000000000 0:c22f003a901c
       
     1 #include <eps.h>
       
     2 
       
     3 namespace lemon {
       
     4   
       
     5   void EpsDrawer::defMacros()
       
     6   {
       
     7     out << "/clmode true def\n" <<
       
     8       "/cshowmode false def\n" <<
       
     9       "/defont (Helvetica) findfont def\n" <<
       
    10       "/fosi 12 def\n" <<
       
    11       "\n" <<
       
    12       "/st { clmode { currentpoint stroke newpath moveto } if } bind def\n" <<
       
    13       "/str { currentpoint stroke newpath moveto /clmode true def } bind def\n"
       
    14 	<<
       
    15       "/fl { currentpoint fill newpath moveto /clmode true def } bind def\n" <<
       
    16       "/eofl { currentpoint eofill newpath moveto /clmode true def } bind def\n"
       
    17 	<<
       
    18       "/cl { currentpoint clip newpath moveto /clmode true def } bind def\n"
       
    19 	<<
       
    20       "/eocl { currentpoint eoclip newpath moveto /clmode true def } bind def\n"
       
    21 	<<
       
    22       "\n" <<
       
    23       "/l { moveto lineto st } bind def\n" <<
       
    24       "/lt { lineto st } bind def\n" <<
       
    25       "/mt { moveto } bind def\n" <<
       
    26       "/c { dup 3 index add 2 index moveto 0 360 arc st } bind def\n" <<
       
    27       "/collect { /clmode false def currentpoint newpath moveto } bind def\n" <<
       
    28       "\n" <<
       
    29       "/fontset { defont fosi scalefont setfont } bind def\n" <<
       
    30       "/stfs { /fosi exch def fontset } bind def\n" <<
       
    31       "/cshow { dup stringwidth pop\n" <<
       
    32       "   neg 2 div 0 rmoveto show } bind def\n" <<
       
    33       "/xshow { cshowmode { cshow } { show } ifelse } def\n" <<
       
    34       "\n" <<
       
    35       "fontset\n" <<
       
    36       "newpath\n" <<
       
    37       "0 0 moveto\n" <<
       
    38       "1 setlinecap\n";
       
    39   }
       
    40 
       
    41   void EpsDrawer::init(int x1,int y1,int x2,int y2)
       
    42   {
       
    43     out << "%!PS-Adobe-2.0 EPSF-2.0\n" <<
       
    44       "%%BoundingBox: " << x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 <<
       
    45       "\n%%EndComments\n";
       
    46     defMacros();
       
    47   }
       
    48 
       
    49   void EpsDrawer::init(double x1,double y1,double x2,double y2)
       
    50   {
       
    51     out << "%!PS-Adobe-2.0\n" <<
       
    52       "%%HiResBoundingBox: " << 
       
    53       x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 <<
       
    54       "\n%%EndComments\n";
       
    55     defMacros();
       
    56   }
       
    57 
       
    58 
       
    59   EpsDrawer::EpsDrawer(std::ostream &os,int x,int y) : local_stream(false),
       
    60 						       out(os)
       
    61   {
       
    62     init(0,0,x,y);
       
    63   }
       
    64 
       
    65   EpsDrawer::EpsDrawer(std::ostream &os,int x1,int y1,int x2,int y2) : 
       
    66     local_stream(false),
       
    67     out(os)
       
    68   {
       
    69     init(x1,y1,x2,y2);
       
    70   }
       
    71 
       
    72   EpsDrawer::EpsDrawer(std::ostream &os,xy<double> s) : local_stream(false),
       
    73 							out(os)
       
    74   {
       
    75     init(0.0,0.0,s.x,s.y);
       
    76   }
       
    77 
       
    78   EpsDrawer::EpsDrawer(std::ostream &os,xy<double> a, xy<double> b) :
       
    79     local_stream(false),
       
    80     out(os)
       
    81   {
       
    82     init(a.x,a.y,b.x,b.y);
       
    83   }
       
    84 
       
    85 
       
    86   EpsDrawer::EpsDrawer(const std::string &name,int x,int y) :
       
    87     local_stream(true),
       
    88     out(*new std::ofstream(name.c_str()))
       
    89   {
       
    90     init(0,0,x,y);
       
    91   }
       
    92 
       
    93   EpsDrawer::EpsDrawer(const std::string &name,int x1,int y1,int x2,int y2) : 
       
    94     local_stream(true),
       
    95     out(*new std::ofstream(name.c_str()))
       
    96   {
       
    97     init(x1,y1,x2,y2);
       
    98   }
       
    99   
       
   100   EpsDrawer::EpsDrawer(const std::string &name,xy<double> s) :
       
   101     local_stream(true),
       
   102     out(*new std::ofstream(name.c_str()))
       
   103   {
       
   104     init(0.0,0.0,s.x,s.y);
       
   105   }
       
   106 
       
   107   EpsDrawer::EpsDrawer(const std::string &name,xy<double> a, xy<double> b) :
       
   108     local_stream(true),
       
   109     out(*new std::ofstream(name.c_str()))
       
   110   {
       
   111     init(a.x,a.y,b.x,b.y);
       
   112   }
       
   113 
       
   114 
       
   115   EpsDrawer::~EpsDrawer()
       
   116   {
       
   117     out << "showpage\n";
       
   118     if(local_stream) delete &out;
       
   119   }
       
   120 
       
   121   EpsDrawer &EpsDrawer::save()
       
   122   {
       
   123     out << "gsave\n";
       
   124     return *this;  
       
   125   }
       
   126 
       
   127   EpsDrawer &EpsDrawer::restore()
       
   128   {
       
   129     out << "grestore\n";
       
   130     return *this;  
       
   131   }
       
   132  
       
   133   EpsDrawer &EpsDrawer::line(double x1,double y1,double x2,double y2)
       
   134   {
       
   135     out << x1 << ' ' << y1 << ' ' << x2 << ' ' << y2 << " l\n";
       
   136     return *this;
       
   137   
       
   138   }
       
   139 
       
   140   EpsDrawer &EpsDrawer::lineTo(double x1,double y1)
       
   141   {
       
   142     out << x1 << ' ' << y1 << " lt\n";
       
   143     return *this;
       
   144   
       
   145   }
       
   146 
       
   147   EpsDrawer &EpsDrawer::moveTo(double x1,double y1)
       
   148   {
       
   149     out << x1 << ' ' << y1 << " mt\n";
       
   150     return *this;  
       
   151   }
       
   152 
       
   153   EpsDrawer &EpsDrawer::circle(double x,double y, double r)
       
   154   {
       
   155     out << x << ' ' << y << ' ' << r << " c\n";
       
   156     return *this;  
       
   157   }
       
   158 
       
   159   EpsDrawer &EpsDrawer::operator<<(const std::string &s)
       
   160   {
       
   161     out << "(" << s <<") xshow\n";
       
   162     return *this;
       
   163   }
       
   164 
       
   165   EpsDrawer &EpsDrawer::operator<<(const char *s)
       
   166   {
       
   167     out << "(" << s <<") xshow\n";
       
   168     return *this;
       
   169   }
       
   170 
       
   171   EpsDrawer &EpsDrawer::operator<<(int i)
       
   172   {
       
   173     out << "(" << i <<") xshow\n";
       
   174     return *this;
       
   175   }
       
   176 
       
   177   EpsDrawer &EpsDrawer::operator<<(double d)
       
   178   {
       
   179     out << "(" << d <<") xshow\n";
       
   180     return *this;
       
   181   }
       
   182 
       
   183   EpsDrawer &EpsDrawer::fontSize(double si)
       
   184   {
       
   185     out << si << " stfs\n";
       
   186     return *this;
       
   187   }
       
   188   EpsDrawer &EpsDrawer::font(std::string s)
       
   189   {
       
   190     out << "/defont ("<<s<<") findfont def fontset\n";
       
   191     return *this;
       
   192   }
       
   193 
       
   194 
       
   195   EpsDrawer &EpsDrawer::collect()
       
   196   {
       
   197     out << "collect\n";
       
   198     return *this;  
       
   199   }
       
   200 
       
   201   EpsDrawer &EpsDrawer::closePath()
       
   202   {
       
   203     out << "closepath\n";
       
   204     return *this;
       
   205   }
       
   206 
       
   207   EpsDrawer &EpsDrawer::stroke()
       
   208   {
       
   209     out << "str\n";
       
   210     return *this;  
       
   211   }
       
   212   EpsDrawer &EpsDrawer::fill()
       
   213   {
       
   214     out << "fl\n";
       
   215     return *this;  
       
   216   }
       
   217   EpsDrawer &EpsDrawer::eoFill()
       
   218   {
       
   219     out << "eofl\n";
       
   220     return *this;  
       
   221   }
       
   222   EpsDrawer &EpsDrawer::clip()
       
   223   {
       
   224     out << "cl\n";
       
   225     return *this;  
       
   226   }
       
   227   EpsDrawer &EpsDrawer::eoClip()
       
   228   {
       
   229     out << "eocl\n";
       
   230     return *this;  
       
   231   }
       
   232 
       
   233   EpsDrawer &EpsDrawer::lineWidth(double w)
       
   234   {
       
   235     out << w << " setlinewidth\n";
       
   236     return *this;  
       
   237   }
       
   238 
       
   239   EpsDrawer &EpsDrawer::lineCap(int i)
       
   240   {
       
   241     out << i << " setlinecap\n";
       
   242     return *this;  
       
   243   }
       
   244 
       
   245   EpsDrawer &EpsDrawer::lineJoin(int i)
       
   246   {
       
   247     out << i << " setlinejoin\n";
       
   248     return *this;  
       
   249   }
       
   250 
       
   251   EpsDrawer &EpsDrawer::miterLimit(double w)
       
   252   {
       
   253     out << w << " setmiterlimit\n";
       
   254     return *this;  
       
   255   }
       
   256 
       
   257   EpsDrawer &EpsDrawer::color(double r, double g, double b)
       
   258   {
       
   259     out << r << ' ' << g << ' ' << b << " setrgbcolor\n";
       
   260     return *this;  
       
   261   }
       
   262 
       
   263   EpsDrawer &EpsDrawer::translate(double x,double y)
       
   264   {
       
   265     out << x << ' ' << y << " translate\n";
       
   266     return *this;  
       
   267   }
       
   268 
       
   269   EpsDrawer &EpsDrawer::rotate(double r)
       
   270   {
       
   271     out << r << " rotate\n";
       
   272     return *this;  
       
   273   }
       
   274   EpsDrawer &EpsDrawer::scale(double sx, double sy)
       
   275   {
       
   276     out << sx << ' ' << sy << " scale\n";
       
   277     return *this;  
       
   278   }
       
   279   
       
   280   EpsDrawer &EpsDrawer::clear()
       
   281   {
       
   282     out << "erasepage\n";
       
   283     return *this;  
       
   284   }
       
   285   
       
   286   EpsDrawer &EpsDrawer::centerMode(bool m)
       
   287   {
       
   288     if(m) out << "/cshowmode true def\n";
       
   289     else out << "/cshowmode false def\n";
       
   290 
       
   291     return *this;  
       
   292   }
       
   293   
       
   294   EpsDrawer &EpsDrawer::flush()
       
   295   {
       
   296     out << "flush\n";
       
   297     //  fflush(fp);
       
   298     return *this;
       
   299   }
       
   300 
       
   301 }