home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / printBox.C < prev    next >
C/C++ Source or Header  |  1998-10-04  |  4KB  |  161 lines

  1. // $Id: printBox.C,v 1.12 1998/10/04 11:05:18 zeller Exp $  -*- C++ -*-
  2. // utilities for printing boxes
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Christian Lindig <lindig@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char printBox_rcsid[] = 
  30.     "$Id: printBox.C,v 1.12 1998/10/04 11:05:18 zeller Exp $";
  31.  
  32.  
  33. #include "Box.h"
  34. #include "printBox.h"
  35.  
  36.  
  37. // some constants...
  38. static const char EPSHEAD[] = "%!PS-Adobe-2.0 EPSF-2.0\n";
  39. static const char CREATOR[] = "%%Creator: Box::print() by Christian Lindig\n";
  40. static const char PAGES[] =   "%%Pages: 1\n";
  41. static const char ENDC[] =    "%%EndComments\n";
  42. static const char BOUND[] =   "%%BoundingBox: ";
  43.  
  44.  
  45. //
  46. // include the big strings for prolog and trailer
  47. //
  48.  
  49. #include "eps-code.h"
  50.  
  51.  
  52. //
  53. // epsHeader
  54. // write out the header of the eps-file, calculate the bounding box
  55. // and make the graph fit to a DIN-A4 paper.
  56. //
  57. // Remember: the origin of the PS-system is lower left, the internal
  58. // origin of the graph is upper left!
  59. //
  60.  
  61. void Box::epsHeader (ostream& os, 
  62.              const BoxRegion& region, 
  63.              const PostScriptPrintGC& gc)
  64. {
  65.     // check size of graph
  66.  
  67.     BoxPoint space  = region.space();
  68.     BoxPoint origin = region.origin();
  69.  
  70.     BoxPoint size;
  71.     switch (gc.orientation)
  72.     {
  73.     case PostScriptPrintGC::PORTRAIT:
  74.     size = BoxPoint(gc.hsize, gc.vsize);
  75.     break;
  76.  
  77.     case PostScriptPrintGC::LANDSCAPE:
  78.     size = BoxPoint(gc.vsize, gc.hsize);
  79.     break;
  80.     }
  81.  
  82.     double scale = 1.0;
  83.     if (space > size)
  84.     {
  85.     // Scale down ...
  86.     double hscale = double(size[X]) / region.space(X);
  87.     double vscale = double(size[Y]) / region.space(Y);
  88.     scale = (hscale < vscale ? hscale : vscale);
  89.     
  90.     space[X] = int(double(space[X]) * scale + 0.5);
  91.     space[Y] = int(double(space[Y]) * scale + 0.5);
  92.  
  93.     origin[X] = int(double(origin[X]) * scale + 0.5);
  94.     origin[Y] = int(double(origin[Y]) * scale + 0.5);
  95.     }
  96.  
  97.     // Determine bounding box
  98.     BoxPoint llcorner, urcorner;
  99.     switch (gc.orientation)
  100.     {
  101.     case PostScriptPrintGC::PORTRAIT:
  102.     llcorner = BoxPoint(gc.hoffset,
  103.                 gc.voffset);
  104.     urcorner = BoxPoint(gc.hoffset + space[X], 
  105.                 gc.voffset + space[Y]);
  106.     break;
  107.  
  108.     case PostScriptPrintGC::LANDSCAPE:
  109.         llcorner = BoxPoint(gc.hsize - space[Y] + gc.hoffset - gc.voffset, 
  110.                 gc.hoffset);
  111.     urcorner = BoxPoint(gc.hsize + gc.hoffset - gc.voffset,
  112.                 gc.hoffset + space[X]);
  113.     break;
  114.     }
  115.  
  116.     os << EPSHEAD
  117.        << CREATOR
  118.        << BOUND 
  119.        << llcorner[X] << " " << llcorner[Y] << " "
  120.        << urcorner[X] << " " << urcorner[Y] << "\n"
  121.        << PAGES << ENDC
  122.        << "\ngsave\n";
  123.  
  124.     // Write rotation
  125.     if (gc.orientation == PostScriptPrintGC::LANDSCAPE)
  126.     os << gc.hsize + gc.hoffset << " 0 translate 90 rotate\n";
  127.  
  128.     // Write scaling
  129.     int hmove = gc.hoffset - origin[X];
  130.     int vmove = gc.voffset + space[Y] + origin[Y];
  131.  
  132.     os << hmove << " " << vmove << " translate\n"
  133.        << scale << " " << -scale << " scale\n";
  134. }
  135.  
  136.  
  137. // public interface
  138.  
  139. void Box::_printHeader(ostream& os, 
  140.                const BoxRegion& region, 
  141.                const PrintGC& gc)
  142. {
  143.     if (gc.isPostScript())
  144.     {
  145.     epsHeader(os, region, (PostScriptPrintGC &)gc);
  146.     os << prolog;
  147.     }
  148.     else if (gc.isFig())
  149.     {
  150.     os << FIGHEAD;
  151.     }
  152. }
  153.  
  154. void Box::_printTrailer(ostream& os, const BoxRegion&, const PrintGC& gc)
  155. {
  156.     if (gc.isPostScript())
  157.     {
  158.     os << trailer;
  159.     }
  160. }
  161.