summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp253
1 files changed, 0 insertions, 253 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp b/Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp
deleted file mode 100644
index c5ab55e27a9..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-1.0.8/src/BoundingBox.cpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/*************************************************************************
-** BoundingBox.cpp **
-** **
-** This file is part of dvisvgm -- the DVI to SVG converter **
-** Copyright (C) 2005-2011 Martin Gieseking <martin.gieseking@uos.de> **
-** **
-** This program 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 3 of **
-** the License, or (at your option) any later version. **
-** **
-** This program 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 this program; if not, see <http://www.gnu.org/licenses/>. **
-*************************************************************************/
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-#include "BoundingBox.h"
-#include "Matrix.h"
-#include "XMLNode.h"
-
-using namespace std;
-
-
-BoundingBox::BoundingBox ()
- : ulx(0), uly(0), lrx(0), lry(0), _valid(false), _locked(false)
-{
-}
-
-
-BoundingBox::BoundingBox (double ulxx, double ulyy, double lrxx, double lryy)
- : ulx(min(ulxx,lrxx)), uly(min(ulyy,lryy)),
- lrx(max(ulxx,lrxx)), lry(max(ulyy,lryy)),
- _valid(true), _locked(false)
-{
-}
-
-
-BoundingBox::BoundingBox (const DPair &p1, const DPair &p2)
- : ulx(min(p1.x(), p2.x())), uly(min(p1.y(), p2.y())),
- lrx(max(p1.x(), p2.x())), lry(max(p1.y(), p2.y())),
- _valid(true), _locked(false)
-{
-}
-
-
-BoundingBox::BoundingBox (const Length &ulxx, const Length &ulyy, const Length &lrxx, const Length &lryy)
- : ulx(min(ulxx.pt(),lrxx.pt())), uly(min(ulyy.pt(),lryy.pt())),
- lrx(max(ulxx.pt(),lrxx.pt())), lry(max(ulyy.pt(),lryy.pt())),
- _valid(true), _locked(false)
-{
-}
-
-
-/** Removes leading and trailing whitespace from the given string. */
-static string& strip (string &str) {
- size_t n=0;
- while (n < str.length() && isspace(str[n]))
- ++n;
- str.erase(0, n);
- n=str.length()-1;
- while (n > 0 && isspace(str[n]))
- --n;
- str.erase(n+1);
- return str;
-}
-
-
-/** Sets or modifies the bounding box. If 'boxstr' consists of 4 length values,
- * they denote the absolute position of two diagonal corners of the box. In case
- * of a single length value l the current box is enlarged by adding (-l,-l) the upper
- * left and (l,l) to the lower right corner.
- * @param[in] boxstr whitespace and/or comma separated string of lengths. */
-void BoundingBox::set (string boxstr) {
- vector<Length> coord;
- const size_t len = boxstr.length();
- size_t l=0;
- strip(boxstr);
- string lenstr;
- do {
- while (l < len && isspace(boxstr[l]))
- l++;
- size_t r=l;
- while (r < len && !isspace(boxstr[r]) && boxstr[r] != ',')
- r++;
- lenstr = boxstr.substr(l, r-l);
- if (!lenstr.empty()) {
- coord.push_back(Length(lenstr));
- if (boxstr[r] == ',')
- r++;
- l = r;
- }
- } while (!lenstr.empty() && coord.size() < 4);
-
- switch (coord.size()) {
- case 1:
- ulx -= coord[0].pt();
- uly -= coord[0].pt();
- lrx += coord[0].pt();
- lry += coord[0].pt();
- break;
- case 2:
- ulx -= coord[0].pt();
- uly -= coord[1].pt();
- lrx += coord[0].pt();
- lry += coord[1].pt();
- break;
- case 4:
- ulx = min(coord[0].pt(), coord[2].pt());
- uly = min(coord[1].pt(), coord[3].pt());
- lrx = max(coord[0].pt(), coord[2].pt());
- lry = max(coord[1].pt(), coord[3].pt());
- break;
- default:
- throw BoundingBoxException("1, 2 or 4 length parameters expected");
- }
-}
-
-
-/** Enlarges the box so that point (x,y) is enclosed. */
-void BoundingBox::embed (double x, double y) {
- if (!_locked) {
- if (_valid) {
- if (x < ulx)
- ulx = x;
- else if (x > lrx)
- lrx = x;
- if (y < uly)
- uly = y;
- else if (y > lry)
- lry = y;
- }
- else {
- ulx = lrx = x;
- uly = lry = y;
- _valid = true;
- }
- }
-}
-
-
-/** Enlarges the box so that box bb is enclosed. */
-void BoundingBox::embed (const BoundingBox &bb) {
- if (!_locked && bb._valid) {
- if (_valid) {
- embed(bb.ulx, bb.uly);
- embed(bb.lrx, bb.lry);
- }
- else {
- ulx = bb.ulx;
- uly = bb.uly;
- lrx = bb.lrx;
- lry = bb.lry;
- _valid = true;
- }
- }
-}
-
-
-void BoundingBox::embed (const DPair &c, double r) {
- embed(BoundingBox(c.x()-r, c.y()-r, c.x()+r, c.y()+r));
-}
-
-
-void BoundingBox::expand (double m) {
- if (!_locked) {
- ulx -= m;
- uly -= m;
- lrx += m;
- lry += m;
- }
-}
-
-
-/** Intersects the current box with bbox and applies the result to *this.
- * If both boxes are disjoint, *this is not altered.
- * @param[in] bbox box to intersect with
- * @return false if *this is locked or both boxes are disjoint */
-bool BoundingBox::intersect (const BoundingBox &bbox) {
- if (_locked || lrx < bbox.ulx || lry < bbox.uly || ulx > bbox.lrx || uly > bbox.lry)
- return false;
- ulx = max(ulx, bbox.ulx);
- uly = max(uly, bbox.uly);
- lrx = min(lrx, bbox.lrx);
- lry = min(lry, bbox.lry);
- return true;
-}
-
-
-void BoundingBox::operator += (const BoundingBox &bb) {
- if (!_locked) {
- ulx += bb.ulx;
- uly += bb.uly;
- lrx += bb.lrx;
- lry += bb.lry;
- }
-}
-
-
-void BoundingBox::scale (double sx, double sy) {
- if (!_locked) {
- ulx *= sx;
- lrx *= sx;
- if (sx < 0) swap(ulx, lrx);
- uly *= sy;
- lry *= sy;
- if (sy < 0) swap(uly, lry);
- }
-}
-
-
-void BoundingBox::transform (const Matrix &tm) {
- if (!_locked) {
- DPair ul = tm * DPair(lrx, lry);
- DPair lr = tm * DPair(ulx, uly);
- DPair ll = tm * DPair(ulx, lry);
- DPair ur = tm * DPair(lrx, uly);
- ulx = min(min(ul.x(), lr.x()), min(ur.x(), ll.x()));
- uly = min(min(ul.y(), lr.y()), min(ur.y(), ll.y()));
- lrx = max(max(ul.x(), lr.x()), max(ur.x(), ll.x()));
- lry = max(max(ul.y(), lr.y()), max(ur.y(), ll.y()));
- }
-}
-
-
-string BoundingBox::toSVGViewBox () const {
- ostringstream oss;
- oss << ulx << ' ' << uly << ' ' << width() << ' ' << height();
- return oss.str();
-}
-
-
-ostream& BoundingBox::write (ostream &os) const {
- return os << '(' << ulx << ", " << uly
- << ", " << lrx << ", " << lry << ')';
-}
-
-
-XMLElementNode* BoundingBox::toSVGRect () const {
- XMLElementNode *rect = new XMLElementNode("rect");
- rect->addAttribute("x", minX());
- rect->addAttribute("y", minY());
- rect->addAttribute("width", width());
- rect->addAttribute("height", height());
- rect->addAttribute("fill", "none");
- return rect;
-}