summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp274
1 files changed, 0 insertions, 274 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp
deleted file mode 100644
index 78f3a19ee58..00000000000
--- a/Build/source/texk/dvisvgm/dvisvgm-src/src/BoundingBox.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-/*************************************************************************
-** BoundingBox.cpp **
-** **
-** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2021 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 "BoundingBox.hpp"
-#include "Matrix.hpp"
-#include "utility.hpp"
-#include "XMLNode.hpp"
-#include "XMLString.hpp"
-
-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.bp(),lrxx.bp())), _uly(min(ulyy.bp(),lryy.bp())),
- _lrx(max(ulxx.bp(),lrxx.bp())), _lry(max(ulyy.bp(),lryy.bp())),
- _valid(true), _locked(false)
-{
-}
-
-
-BoundingBox::BoundingBox (const string &boxstr)
- : _ulx(0), _uly(0), _lrx(0), _lry(0), _valid(false), _locked(false)
-{
- set(boxstr);
-}
-
-
-/** Extracts a sequence of length values from a string like "5cm, 2.4in, 0pt".
- * @param[in] boxstr whitespace and/or comma separated string of lengths.
- * @param[out] the extracted lengths */
-vector<Length> BoundingBox::extractLengths (string boxstr) {
- vector<Length> lengths;
- boxstr = util::replace(boxstr, ",", " ");
- boxstr = util::normalize_space(boxstr);
- vector<string> lengthStrings = util::split(boxstr, " ");
- for (const string &lenstr : lengthStrings) {
- if (!lenstr.empty())
- lengths.emplace_back(Length(lenstr));
- }
- return lengths;
-}
-
-
-/** 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 (const string &boxstr) {
- vector<Length> coord = extractLengths(boxstr);
- set(coord);
-}
-
-
-void BoundingBox::set (const std::vector<Length> &coord) {
- switch (coord.size()) {
- case 1:
- _ulx -= coord[0].bp();
- _uly -= coord[0].bp();
- _lrx += coord[0].bp();
- _lry += coord[0].bp();
- break;
- case 2:
- _ulx -= coord[0].bp();
- _uly -= coord[1].bp();
- _lrx += coord[0].bp();
- _lry += coord[1].bp();
- break;
- case 4:
- _ulx = min(coord[0].bp(), coord[2].bp());
- _uly = min(coord[1].bp(), coord[3].bp());
- _lrx = max(coord[0].bp(), coord[2].bp());
- _lry = max(coord[1].bp(), coord[3].bp());
- break;
- default:
- throw BoundingBoxException("1, 2 or 4 length parameters expected");
- }
- _valid = true;
-}
-
-
-/** 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 the given bounding box is enclosed. */
-void BoundingBox::embed (const BoundingBox &bbox) {
- if (!_locked && bbox._valid) {
- if (_valid) {
- embed(bbox._ulx, bbox._uly);
- embed(bbox._lrx, bbox._lry);
- }
- else {
- _ulx = bbox._ulx;
- _uly = bbox._uly;
- _lrx = bbox._lrx;
- _lry = bbox._lry;
- _valid = true;
- }
- }
-}
-
-
-/** Embeds a virtual circle into the box and enlarges it accordingly.
- * @param[in] c center of the circle
- * @param[in] r radius of the circle */
-void BoundingBox::embed (const DPair &c, double r) {
- embed(BoundingBox(c.x()-r, c.y()-r, c.x()+r, c.y()+r));
-}
-
-
-/** Expands the box in all four directions by a given value. */
-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) {
- // check if the two boxes are disjoint
- if (_locked || _lrx < bbox._ulx || _lry < bbox._uly || _ulx > bbox._lrx || _uly > bbox._lry)
- return false;
- // not disjoint: compute the intersection
- _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 &bbox) {
- if (!_locked) {
- _ulx += bbox._ulx;
- _uly += bbox._uly;
- _lrx += bbox._lrx;
- _lry += bbox._lry;
- }
-}
-
-
-static inline bool almost_equal (double v1, double v2) {
- return abs(v1-v2) < 1e-10;
-}
-
-
-bool BoundingBox::operator == (const BoundingBox &bbox) const {
- return _valid && bbox._valid
- && almost_equal(_ulx, bbox._ulx)
- && almost_equal(_uly, bbox._uly)
- && almost_equal(_lrx, bbox._lrx)
- && almost_equal(_lry, bbox._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(_ulx, _uly);
- DPair lr = tm * DPair(_lrx, _lry);
- 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 << XMLString(_ulx) << ' ' << XMLString(_uly) << ' ' << XMLString(width()) << ' ' << XMLString(height());
- return oss.str();
-}
-
-
-ostream& BoundingBox::write (ostream &os) const {
- os << '(' << _ulx << ", " << _uly << ", " << _lrx << ", " << _lry << ')';
- if (!_valid)
- os << " (invalid)";
- else if (_locked)
- os << " (locked)";
- return os;
-}
-
-
-unique_ptr<XMLElement> BoundingBox::createSVGRect () const {
- auto rect = util::make_unique<XMLElement>("rect");
- rect->addAttribute("x", minX());
- rect->addAttribute("y", minY());
- rect->addAttribute("width", width());
- rect->addAttribute("height", height());
- rect->addAttribute("fill", "none");
- return rect;
-}