summaryrefslogtreecommitdiff
path: root/graphics/epix/format.cc
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/epix/format.cc')
-rw-r--r--graphics/epix/format.cc720
1 files changed, 0 insertions, 720 deletions
diff --git a/graphics/epix/format.cc b/graphics/epix/format.cc
deleted file mode 100644
index f799baa7a4..0000000000
--- a/graphics/epix/format.cc
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- * format.cc -- ePiX output format interface and label-writing functions
- *
- * This file is part of ePiX, a c++ library for creating high-quality
- * figures in LaTeX
- *
- * Version 1.2.0-2
- * Last Change: September 26, 2007
- */
-
-/*
- * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
- * Andrew D. Hwang <rot 13 nujnat at zngupf dot ubylpebff dot rqh>
- * Department of Mathematics and Computer Science
- * College of the Holy Cross
- * Worcester, MA, 01610-2395, USA
- *
- */
-
-/*
- * ePiX is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * ePiX is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
- * License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with ePiX; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <cmath>
-#include <string>
-#include <sstream>
-#include <vector>
-#include <list>
-
-#include "enums.h"
-#include "constants.h"
-
-#include "errors.h"
-#include "utils.h"
-
-#include "functions.h"
-
-#include "marker_style.h"
-#include "label_style.h"
-#include "path_style.h"
-#include "Color.h"
-
-#include "pen_data.h"
-
-#include "pairs.h"
-#include "edge_data.h"
-
-#include "length.h"
-
-#include "picture.h" // circ may need to add White to pallet
-#include "picture_data.h"
-
-#include "format.h"
-
-namespace ePiX {
- // public, non-virtual
- // LaTeX label-generating commands written in terms of protected interface
- std::string format::print_mark(const pair& here, const pair& offset,
- const epix_mark_type mk,
- const marker_sizes& sz,
- const label_state& style,
- const std::string& len) const
- {
- // convert dotsize to len
- length true_diam(sz.dot_size());
- double diam(true_diam.to(len).magnitude());
-
- // set diameter
- if (mk == DOT || mk == CIRC)
- diam *= 0.75;
- else if (mk == DDOT)
- diam *= 0.5;
-
- // and print
- if (mk == SPOT || mk == DOT || mk == DDOT)
- return print_circle_marker(here + pt_to_len(offset, len), diam, true,
- style.text_color(), len);
-
- else if (mk == CIRC) // Draw filled dot, then ring
- {
- Color bk(style.mask_color());
- // use White for unset mask
- if (bk.is_unset())
- {
- bk = White();
- the_picture().add_to_pallet(bk);
- }
-
- return print_circle_marker(here + pt_to_len(offset, len), diam, true,
- bk, len)
- + print_circle_marker(here + pt_to_len(offset, len), diam, false,
- style.text_color(), len);
- }
-
- else if (mk == RING)
- return print_circle_marker(here + pt_to_len(offset, len), diam, false,
- style.text_color(), len);
-
- else
- return put_box(here + pt_to_len(offset, len),
- print_latex_label(style, print_latex_marker(mk, sz, len),
- false)); // no mask or box
- }
-
- // public, non-virtual
- std::string format::print_text(const pair& here, const pair& offset,
- const std::string& label,
- const label_state& style,
- const std::string& len) const
- {
- return put_box(here + pt_to_len(offset, len),
- print_latex_label(style, label, true));
- }
-
-
- // public, non-virtual
- std::string format::print_line(const edge2d& e,
- const pair& offset,
- const pen_data& line,
- const pen_data& base,
- const path_state& style,
- const std::string& len) const
- {
- if ((line.width() < length(EPIX_EPSILON))
- || (line.color().is_unset())
- || !e.is_seen() )
- return "";
-
- // else
- std::list<edge2d> edges;
- edges.push_back(e);
- return print_line(edges, offset, line, base, style, len);
- }
-
-
- // public, non-virtual (file header comment block)
- std::string format::file_comments(const std::string& units,
- const length& hoffset,
- const length& voffset,
- double Xmin, double Xmax,
- double Ymin, double Ymax,
- double Hsize, double Vsize) const
- {
- std::ostringstream obuf;
-
- const std::string hoff_dir(length(0) < hoffset ? "right" : "left");
- const std::string voff_dir(length(0) < voffset ? "up" : "down");
-
- const double hoff(hoffset.magnitude());
- const double voff(voffset.magnitude());
-
- std::stringstream bd_box, act_sz, fg_off;
- bd_box << " Cartesian bounding box: ["
- << Xmin << "," << Xmax << "] x [" << Ymin << "," << Ymax<< "]";
-
- act_sz << " Actual size: " << Hsize << " x " << Vsize << units;
-
- fg_off << " Figure offset: "
- << hoff_dir << " by " << hoff << units << ", "
- << voff_dir << " by " << voff << units;
-
- obuf << print_comment("ePiX-" + epix_version())
- << print_comment("")
- << print_comment(bd_box.str())
- << print_comment(act_sz.str())
- << print_comment(fg_off.str())
- << print_comment("")
- << print_comment(usepackages())
- << print_comment("");
-
- return obuf.str();
- } // end of file_comments()
-
-
- // public, virtual
- std::string format::pic_header(const pair& sizes,
- const pair& offsets,
- const std::set<Color>& pallet,
- const std::string& len) const
- {
- std::stringstream obuf;
- obuf << print_pallet(pallet)
- << set_unitlength(len)
- << start_picture(sizes, offsets);
-
- return obuf.str();
- }
-
- // public, virtual
- std::string format::pic_footer() const
- {
- return end_picture();
- }
-
- // public, non-virtual
- std::string format::print_color(const std::string& model,
- const std::string& name,
- const std::vector<double>& dens) const
- {
- if (dens.size() == 3)
- return print_color(model, name, dens.at(0), dens.at(1), dens.at(2));
-
- else if (dens.size() == 4)
- return print_color(model, name,
- dens.at(0), dens.at(1), dens.at(2), dens.at(3));
-
- else if (dens.size() == 0) // Neutral()
- return "";
-
- else
- {
- epix_warning("format::print_color(): Internal error");
- return print_color("rgb", "rgb_000000", 0, 0, 0);
- }
- }
-
- // protected, non-virtual (one-pen version)
- std::string format::print_line(const std::list<edge2d>& edges,
- const pair& offset, const pen_data& line,
- const path_state& style,
- const std::string& attribs,
- const std::string& len) const
- {
- if ( (line.width() < length(EPIX_EPSILON))
- || (line.color().is_unset())
- || edges.begin() == edges.end() )
- return "";
-
- // else
- std::stringstream value, obuf;
-
- obuf << set_pen_state(line);
-
- if (style.is_solid())
- obuf << print_paths(edges, offset, attribs, len);
-
- else // not solid
- {
- // compute diameter of dots
- length lw(line.width());
- lw.to(len);
-
- // compute unit length in pt
- length units("1"+len);
- units.to("pt");
- double in_pt(units.magnitude());
-
- double pattern_size(style.separation()); // in pt
-
- // split each edge into pattern_size chunks if necessary
- for (std::list<edge2d>::const_iterator ep = edges.begin();
- ep != edges.end(); ++ep)
- {
- double curr_len(((*ep).length())*in_pt);
-
- // number of dash patterns *ep can hold
- unsigned int N((unsigned int) ceil(curr_len/pattern_size));
- if (N == 1)
- obuf << print_edge((*ep), offset, style.breakpts(),
- lw.magnitude(), line.color(), attribs, len);
-
- if (N > 1)
- {
- pair T((*ep).tail()), dir((1.0/N)*((*ep).head() - T));
- for (unsigned int i=0; i<N; ++i)
- obuf << print_edge(edge2d(T+i*dir, T+(i+1)*dir,
- (*ep).is_seen()),
- offset, style.breakpts(),
- lw.magnitude(), line.color(),
- attribs, len);
- }
- }
- } // end of !solid
-
- return obuf.str();
- } // end of print_line(edges, offset, line, style, attribs, len)
-
-
- std::string format::print_line(const edge2d& e,
- const pair& offset,
- const pen_data& line,
- const path_state& style,
- const std::string& attribs,
- const std::string& len) const
- {
- if ( (line.width() < length(EPIX_EPSILON)) ||
- (line.color().is_unset()) ||
- !e.is_seen() )
- return "";
-
- std::list<edge2d> edges;
- edges.push_back(e);
- return print_line(edges, offset, line, style, attribs, len);
- }
-
-
- // local to this file
- std::string __epix_rule(double x, double y)
- {
- std::stringstream buf;
- buf << "\\rule{" << x << "pt}{" << y << "pt}";
-
- return buf.str();
- }
-
-
- // protected, non-virtual
- std::string format::xdefinecolor(const std::string& model,
- const std::string& name,
- double d1, double d2, double d3) const
- {
- std::stringstream obuf;
- obuf << "\\xdefinecolor{" << name << "}";
-
- if (model == "cmy")
- {
- double bk(min(min(d1,d2),d3));
-
- obuf << "{cmyk}{"
- << d1-bk << "," << d2-bk << "," << d3-bk << "," << bk << "}%"
- << std::endl;
- }
-
- else
- obuf << "{" << model << "}{" << d1 << "," << d2 << "," << d3 << "}%"
- << std::endl;
-
- return obuf.str();
- }
-
- // protected, non-virtual
- std::string format::xdefinecolor(const std::string& model,
- const std::string& name,
- double d1, double d2,
- double d3, double d4) const
- {
- std::stringstream obuf;
- obuf << "\\xdefinecolor{" << name << "}{cmyk}{"
- << d1 << "," << d2 << "," << d3 << "," << d4 << "}%"
- << std::endl;
-
- return obuf.str();
- }
-
- // protected, virtual
- std::string format::print_pallet(const std::set<Color>& pallet) const
- {
- std::stringstream obuf;
-
- for (std::set<Color>::const_iterator cp=pallet.begin();
- cp!=pallet.end(); ++cp)
- obuf << print_color((*cp).model(), (*cp).name(), (*cp).densities());
-
- return obuf.str();
- }
-
- // protected, virtual
- std::string format::print(const pair& arg) const
- {
- std::stringstream o;
- o << "(" << truncate(arg.x1()) << "," << truncate(arg.x2()) << ")";
- return o.str();
- }
-
- // protected, virtual
- std::string format::print(const length& len) const
- {
- return len.name();
- }
-
- // protected, virtual
- std::string format::print(const Color& col) const
- {
- return col.name();
- }
-
- // protected, non-virtual (print non-solid edge as segments and dots)
- std::string format::print_edge(const edge2d& edge, const pair& offset,
- const std::vector<double> bkpts,
- double diam, const Color& col,
- const std::string& attribs,
- const std::string& len) const
- {
- if (!edge.is_seen())
- return "";
-
- if (bkpts.size() % 2 != 0)
- {
- epix_warning("Internal error in path pattern");
- return "";
- }
-
- // else
- std::stringstream obuf;
-
- const pair T(edge.tail() + pt_to_len(offset, len));
- const pair dir(edge.head() - edge.tail());
-
- for (unsigned int i=0; i < bkpts.size(); i += 2)
- {
- double curr(bkpts.at(i)), next(bkpts.at(i+1));
-
- if (EPIX_EPSILON < next - curr) // dash
- obuf << start_open_path(attribs)
- << print(T + curr*dir)
- << path_connector()
- << print(T + next*dir)
- << end_open_path(attribs);
-
- else // dot
- obuf << print_circle_marker(T + curr*dir, diam, true, col, len);
- }
-
- return obuf.str();
- }
-
-
- // protected, non-virtual (solid path, handle (offset) data only)
- std::string format::print_paths(const std::list<edge2d>& edges,
- const pair& offset,
- const std::string& attribs,
- const std::string& len) const
- {
- std::stringstream obuf;
-
- std::list<edge2d>::const_iterator ep(edges.begin());
-
- const pair shift(pt_to_len(offset, len));
-
- bool all_visible(true); // all edges visible?
-
- // Assume not for now
- const std::string pname(start_open_path(attribs));
-
- // print contiguous lists of visible edges
- while (ep != edges.end())
- {
- if ((*ep).is_seen()) // print contiguous visible path
- {
- obuf << pname
- << print((*ep).tail() + shift)
- << path_connector()
- << print((*ep).head() + shift);
- ++ep;
-
- while ((*ep).is_seen() && ep != edges.end())
- obuf << path_connector() << print((*ep++).head() + shift);
-
- obuf << end_open_path(attribs);
- }
-
- else // invisible edge
- {
- ++ep;
- all_visible = false;
- }
- }
-
- std::string value(obuf.str());
-
- --ep; // last edge
-
- // if we're a closed loop of visible edges, adjust open/close path
- if (all_visible && (*edges.begin()).tail() == (*ep).head())
- {
- value.replace(0,
- start_open_path(attribs).size(),
- start_closed_path(attribs));
-
- value.replace(value.size()-end_open_path(attribs).size(),
- end_open_path(attribs).size(),
- end_closed_path(attribs));
- }
-
- return break_lines(value, path_break());
- }
-
-
- //// Label and marker functions ////
- // protected, non-virtual (print LaTeX command for marker of specified size)
- std::string format::print_latex_marker(const epix_mark_type mark,
- const marker_sizes& sz,
- const std::string& len) const
- {
- std::stringstream obuf;
-
- obuf << "$";
-
- switch(mark)
- {
- case PLUS:
- obuf << "+";
- break;
- case OPLUS:
- obuf << "\\oplus";
- break;
- case TIMES:
- obuf << "\\times";
- break;
- case OTIMES:
- obuf << "\\otimes";
- break;
- case DIAMOND:
- obuf << "\\diamond";
- break;
- case UP:
- obuf << "\\bigtriangleup";
- break;
- case DOWN:
- obuf << "\\bigtriangledown";
- break;
- case BOX:
- obuf << __epix_rule(0.75*sz.dot_size(), 0.75*sz.dot_size());
- break;
- case BBOX:
- obuf << __epix_rule(0.5*sz.dot_size(), 0.5*sz.dot_size());
- break;
- case HTICK:
- obuf << __epix_rule(0.5, 2*sz.tick_size());
- break;
- case VTICK:
- obuf << __epix_rule(2*sz.tick_size(), 0.5);
- break;
- // should never see these cases
- case SPOT:
- case DOT:
- case DDOT:
- case CIRC:
- case RING:
- epix_warning("Mark type internal error"); // fall through
- case PATH: // fall through
- case TEXT:
- default:
- return ""; // N.B. return
- }
-
- obuf << "$";
-
- return obuf.str();
- }
-
-
- // public, non-virtual
- // handles font face, size, and color
- std::string format::print_latex_hbox(const label_state& style,
- const std::string& label) const
- {
- std::stringstream text_buf;
-
- bool need_ff(style.fontface() != "rm"); // roman
- bool need_fs(style.fontsize() != "nsz"); // normalsize
-
- text_buf << "\\hbox{\\color{" << print(style.text_color()) << "}";
-
- if (need_ff)
- text_buf << "\\text" << style.fontface() << "{";
-
- if (need_fs)
- text_buf << "\\" << style.fontsize() << " ";
-
- text_buf << label;
-
- if (need_ff)
- text_buf << "}";
-
- text_buf << "}";
-
- return text_buf.str();
- }
-
-
- // protected, virtual
- std::string format::path_break() const
- {
- std::stringstream buf;
- buf << std::endl << " ";
-
- return buf.str();
- }
-
- // inserted between points of a path
- std::string format::path_connector() const
- {
- return "";
- }
-
- // protected, non-virtual
- // handles rotation, masking, border, and alignment
- std::string format::print_latex_label(const label_state& style,
- const std::string& label,
- bool boxed) const
- {
- std::stringstream obuf;
-
- // need rotatebox?
- bool rotated(EPIX_EPSILON < fabs(style.label_angle()));
-
- // need colorbox?
- bool masked(boxed && style.is_masked());
-
- // need extra fcolorbox?
- bool padded(style.label_padding() != length(0));
-
- obuf << "\\makebox(0,0)"
- << print(style.align_to()); // "none" -> ""
-
- obuf << "{";
-
- if (rotated)
- obuf << "\\rotatebox{" << style.label_angle() << "}{";
-
- if (masked)
- {
- pen_data bpen(style.label_border());
-
- // draw border?
- if (!bpen.color().is_unset() && length(EPIX_EPSILON) < bpen.width())
- obuf << "\\fboxrule" << print(bpen.width()) << "%" << std::endl
- << "\\fcolorbox{" << print(bpen.color()) << "}{"
- << print(style.mask_color()) << "}";
-
- else
- obuf << "\\colorbox{" << print(style.mask_color()) << "}";
-
- if (padded)
- {
- // cancel off the xcolor default
- length extra_pad(style.label_padding() + length(-3));
-
- obuf << "{\\fboxrule" << print(extra_pad) << "%" << std::endl
- << "\\fcolorbox{" << print(style.mask_color()) << "}{"
- << print(style.mask_color()) << "}";
- }
-
- obuf << "{";
- }
-
- // finally, the payload
- obuf << print_latex_hbox(style, label);
-
- // close wrappers
- if (masked)
- {
- obuf << "}";
-
- if (padded)
- obuf << "}";
- }
-
- if (rotated)
- obuf << "}";
-
- obuf << "}";
-
- return obuf.str();
- } // end of print_latex_label
-
- // private (convert an epix_label_posn to a string)
- std::string format::print(const epix_label_posn arg) const
- {
- std::string val;
- switch(arg)
- {
- case none:
- return ""; // other cases return at bottom
-
- case c:
- val="c";
- break;
- case r:
- val="l"; // opposite of LaTeX
- break;
- case tr:
- case rt:
- val="bl";
- break;
- case t:
- val="b";
- break;
- case tl:
- case lt:
- val="br";
- break;
- case l:
- val="r";
- break;
- case bl:
- case lb:
- val="tr";
- break;
- case b:
- val="t";
- break;
- case br:
- case rb:
- val="tl";
- break;
- }
-
- return "[" + val + "]";
- } // end of format::print(align_type)
-
-
- // private (true pt offset to len)
- pair format::pt_to_len(pair offset, const std::string& len) const
- {
- return offset *= length("1pt").to(len).magnitude();
- }
-} // end of namespace