diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp | 343 |
1 files changed, 0 insertions, 343 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp deleted file mode 100644 index c31ab1a0258..00000000000 --- a/Build/source/texk/dvisvgm/dvisvgm-src/tests/TensorProductPatchTest.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/************************************************************************* -** TensorProductPatchTest.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 <gtest/gtest.h> -#include <vector> -#include "Color.hpp" -#include "TensorProductPatch.hpp" - -using namespace std; - - -#define EXPECT_NEAR_PAIR(name, p1, p2, eps) \ - {SCOPED_TRACE(name); expect_near_pair(p1, p2, eps);} - -#define EXPECT_EQUAL_PAIR(name, p1, p2) \ - {SCOPED_TRACE(name); expect_equal_pair(p1, p2);} - -#define CHECK_BEZIER_POINTS(name, bezier, p1, p2, p3, p4) \ - {SCOPED_TRACE(name); checkBezierPoints(bezier, p1, p2, p3, p4);} - - -static void expect_near_pair (const DPair &p1, const DPair &p2, double eps) { - EXPECT_NEAR(p1.x(), p2.x(), eps); - EXPECT_NEAR(p1.y(), p2.y(), eps); -} - - -static void expect_equal_pair (const DPair &p1, const DPair &p2) { - EXPECT_DOUBLE_EQ(p1.x(), p2.x()); - EXPECT_DOUBLE_EQ(p1.y(), p2.y()); -} - - -class TensorProductPatchTest : public ::testing::Test { - protected: - void SetUp () override { - _points.resize(16); - _points[0] = DPair(10, 10); - _points[1] = DPair(0, 30); - _points[2] = DPair(20, 40); - _points[3] = DPair(10, 70); - _points[4] = DPair(20, 100); - _points[5] = DPair(70, 100); - _points[6] = DPair(100, 70); - _points[7] = DPair(90, 60); - _points[8] = DPair(80, 50); - _points[9] = DPair(70, 20); - _points[10] = DPair(50, 30); - _points[11] = DPair(20, 0); - _points[12] = DPair(30, 40); - _points[13] = DPair(40, 80); - _points[14] = DPair(60, 70); - _points[15] = DPair(40, 40); - _patch.setPoints(_points, 0, 0); - - vector<Color> colors(4); - colors[0].setRGB(1.0, 0.0, 0.0); - colors[1].setRGB(1.0, 1.0, 0.0); - colors[2].setRGB(1.0, 0.0, 1.0); - colors[3].setRGB(0.0, 1.0, 0.0); - _patch.setColors(colors, 0, 0); - } - - void checkBezierPoints (const Bezier &b, const DPair &p1, const DPair &p2, const DPair &p3, const DPair &p4) const { - EXPECT_EQ(b.point(0), p1); - EXPECT_EQ(b.point(1), p2); - EXPECT_EQ(b.point(2), p3); - EXPECT_EQ(b.point(3), p4); - } - - - protected: - vector<DPair> _points; - TensorProductPatch _patch; -}; - - -TEST_F(TensorProductPatchTest, construct) { - EXPECT_EQ(_patch.psShadingType(), 7); - EXPECT_EQ(_patch.numPoints(0), 16); - EXPECT_EQ(_patch.numColors(0), 4); - EXPECT_EQ(_patch.numPoints(1), 12); - EXPECT_EQ(_patch.numColors(1), 2); - - CoonsPatch cp(Color::ColorSpace::RGB); - EXPECT_EQ(cp.psShadingType(), 6); - EXPECT_EQ(cp.numPoints(0), 12); - EXPECT_EQ(cp.numColors(0), 4); - EXPECT_EQ(cp.numPoints(1), 8); - EXPECT_EQ(cp.numColors(1), 2); -} - - -TEST_F(TensorProductPatchTest, valueAt) { - EXPECT_EQ(_patch.valueAt(0, 0), DPair(10, 10)); - EXPECT_EQ(_patch.valueAt(1, 0), DPair(70, 20)); - EXPECT_EQ(_patch.valueAt(0, 1), DPair(10, 70)); - EXPECT_EQ(_patch.valueAt(1, 1), DPair(100, 70)); - - vector<DPair> points = _points; - vector<Color> colors(2); - points.resize(12); - TensorProductPatch tpp1(points, colors, Color::ColorSpace::RGB, 1, &_patch); - EXPECT_EQ(tpp1.valueAt(0, 0), DPair(10, 70)); - EXPECT_EQ(tpp1.valueAt(0, 1), DPair(100, 70)); - EXPECT_EQ(tpp1.valueAt(1, 0), DPair(70, 100)); - EXPECT_EQ(tpp1.valueAt(1, 1), DPair(20, 40)); - - TensorProductPatch tpp2(points, colors, Color::ColorSpace::RGB, 2, &_patch); - EXPECT_EQ(tpp2.valueAt(0, 0), DPair(100, 70)); - EXPECT_EQ(tpp2.valueAt(0, 1), DPair(70, 20)); - EXPECT_EQ(tpp2.valueAt(1, 0), DPair(70, 100)); - EXPECT_EQ(tpp2.valueAt(1, 1), DPair(20, 40)); - - TensorProductPatch tpp3(points, colors, Color::ColorSpace::RGB, 3, &_patch); - EXPECT_EQ(tpp3.valueAt(0, 0), DPair(70, 20)); - EXPECT_EQ(tpp3.valueAt(0, 1), DPair(10, 10)); - EXPECT_EQ(tpp3.valueAt(1, 0), DPair(70, 100)); - EXPECT_EQ(tpp3.valueAt(1, 1), DPair(20, 40)); - - colors.resize(4); - CoonsPatch cp1(points, colors, Color::ColorSpace::RGB, 0, 0); - EXPECT_EQ(cp1.valueAt(0, 0), DPair(10, 70)); - EXPECT_EQ(cp1.valueAt(0, 1), DPair(10, 10)); - EXPECT_EQ(cp1.valueAt(1, 0), DPair(100, 70)); - EXPECT_EQ(cp1.valueAt(1, 1), DPair(70, 20)); - - points.resize(8); - colors.resize(2); - CoonsPatch cp2(points, colors, Color::ColorSpace::RGB, 1, &cp1); - EXPECT_EQ(cp2.valueAt(0, 0), DPair(100, 70)); - EXPECT_EQ(cp2.valueAt(0, 1), DPair(10, 70)); - EXPECT_EQ(cp2.valueAt(1, 0), DPair(20, 40)); - EXPECT_EQ(cp2.valueAt(1, 1), DPair(70, 100)); - - CoonsPatch cp3(points, colors, Color::ColorSpace::RGB, 2, &cp1); - EXPECT_EQ(cp3.valueAt(0, 0), DPair(70, 20)); - EXPECT_EQ(cp3.valueAt(0, 1), DPair(100, 70)); - EXPECT_EQ(cp3.valueAt(1, 0), DPair(20, 40)); - EXPECT_EQ(cp3.valueAt(1, 1), DPair(70, 100)); - - CoonsPatch cp4(points, colors, Color::ColorSpace::RGB, 3, &cp1); - EXPECT_EQ(cp4.valueAt(0, 0), DPair(10, 10)); - EXPECT_EQ(cp4.valueAt(0, 1), DPair(70, 20)); - EXPECT_EQ(cp4.valueAt(1, 0), DPair(20, 40)); - EXPECT_EQ(cp4.valueAt(1, 1), DPair(70, 100)); -} - - -TEST_F(TensorProductPatchTest, averageColor) { - EXPECT_EQ(_patch.averageColor().rgbString(), "#bf8040"); -} - - - -TEST_F(TensorProductPatchTest, vertices) { - EXPECT_EQ(_patch.valueAt(0,0), DPair(10,10)); - EXPECT_EQ(_patch.valueAt(0,1), DPair(10,70)); - EXPECT_EQ(_patch.valueAt(1,1), DPair(100,70)); - EXPECT_EQ(_patch.valueAt(1,0), DPair(70,20)); - - EXPECT_EQ(_patch.colorAt(0,0).rgbString(), "#f00"); - EXPECT_EQ(_patch.colorAt(0,1).rgbString(), "#ff0"); - EXPECT_EQ(_patch.colorAt(1,1).rgbString(), "#f0f"); - EXPECT_EQ(_patch.colorAt(1,0).rgbString(), "#0f0"); -} - - -TEST_F(TensorProductPatchTest, curves) { - Bezier bezier; - _patch.horizontalCurve(0, bezier); - CHECK_BEZIER_POINTS("A", bezier, DPair(10, 10), DPair(20, 0), DPair(50, 30), DPair(70, 20)); - _patch.horizontalCurve(1, bezier); - CHECK_BEZIER_POINTS("B", bezier, DPair(10, 70), DPair(20, 100), DPair(70, 100), DPair(100, 70)); - _patch.verticalCurve(0, bezier); - CHECK_BEZIER_POINTS("C", bezier, DPair(10, 10), DPair(0, 30), DPair(20, 40), DPair(10, 70)); - _patch.verticalCurve(1, bezier); - CHECK_BEZIER_POINTS("D", bezier, DPair(70, 20), DPair(80, 50), DPair(90, 60), DPair(100, 70)); -} - - -TEST_F(TensorProductPatchTest, blossom_outer) { - EXPECT_EQ(_patch.blossomValue(0,0,0,0,0,0), DPair(10, 10)); - EXPECT_EQ(_patch.blossomValue(0,0,0,1,0,0), DPair(0, 30)); - EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,0), DPair(20, 40)); - EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,1), DPair(10, 70)); - - EXPECT_EQ(_patch.blossomValue(1,1,1,0,0,0), DPair(70, 20)); - EXPECT_EQ(_patch.blossomValue(1,1,1,1,0,0), DPair(80, 50)); - EXPECT_EQ(_patch.blossomValue(1,1,1,1,1,0), DPair(90, 60)); - EXPECT_EQ(_patch.blossomValue(1,1,1,1,1,1), DPair(100, 70)); - - EXPECT_EQ(_patch.blossomValue(1,0,0,0,0,0), DPair(20, 0)); - EXPECT_EQ(_patch.blossomValue(1,1,0,0,0,0), DPair(50, 30)); - EXPECT_EQ(_patch.blossomValue(1,1,1,0,0,0), DPair(70, 20)); - - EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,1), DPair(10, 70)); - EXPECT_EQ(_patch.blossomValue(1,0,0,1,1,1), DPair(20, 100)); - EXPECT_EQ(_patch.blossomValue(1,1,0,1,1,1), DPair(70, 100)); -} - - -TEST_F(TensorProductPatchTest, blossom_inner) { - EXPECT_EQ(_patch.blossomValue(1,0,0,1,0,0), DPair(30, 40)); - EXPECT_EQ(_patch.blossomValue(1,1,0,1,0,0), DPair(40, 40)); - EXPECT_EQ(_patch.blossomValue(1,0,0,1,1,0), DPair(40, 80)); - EXPECT_EQ(_patch.blossomValue(1,1,0,1,1,0), DPair(60, 70)); -} - - -TEST_F(TensorProductPatchTest, values) { - EXPECT_EQUAL_PAIR("A", _patch.valueAt(0.25, 0.5), _patch.blossomValue(0.25, 0.25, 0.25, 0.5, 0.5, 0.5)); - EXPECT_NEAR_PAIR("B", _patch.valueAt(0.25, 0.5), DPair(26.1133, 48.457), 0.0001); - - EXPECT_EQUAL_PAIR("C", _patch.valueAt(0.8, 0.2), _patch.blossomValue(0.8, 0.8, 0.8, 0.2, 0.2, 0.2)); - EXPECT_NEAR_PAIR("D", _patch.valueAt(0.8, 0.2), DPair(59.5974, 35.4502), 0.0001); -} - - -TEST_F(TensorProductPatchTest, boundaryPath) { - GraphicsPath<double> path = _patch.getBoundaryPath(); - ostringstream oss; - path.writeSVG(oss, false); - EXPECT_EQ(oss.str(), "M10 10C20 0 50 30 70 20C80 50 90 60 100 70C70 100 20 100 10 70C20 40 0 30 10 10Z"); -} - - -TEST_F(TensorProductPatchTest, subpatch) { - TensorProductPatch tpp; - _patch.subpatch(0, 0.5, 0, 0.5, tpp); - GraphicsPath<double> path = tpp.getBoundaryPath(); - ostringstream oss; - path.writeSVG(oss, false); - EXPECT_EQ(oss.str(), "M10 10C5 20 7.5 27.5 10 36.25C20.625 46.875 31.25 52.1875 43.28125 54.21875C40 40.9375 36.25 27.5 36.25 15C25 10 15 5 10 10Z"); - EXPECT_EQ(tpp.colorAt(0, 0).rgbString(), "#f00"); - EXPECT_EQ(tpp.colorAt(0, 1).rgbString(), "#ff8000"); - EXPECT_EQ(tpp.colorAt(1, 0).rgbString(), "#808000"); - EXPECT_EQ(tpp.colorAt(1, 1).rgbString(), "#bf8040"); -} - - -TEST_F(TensorProductPatchTest, bbox) { - BoundingBox bbox = _patch.getBBox(); - EXPECT_NEAR(bbox.minX(), 7.1132, 0.0001); - EXPECT_NEAR(bbox.minY(), 7.9289, 0.0001); - EXPECT_DOUBLE_EQ(bbox.maxX(), 100.0); - EXPECT_DOUBLE_EQ(bbox.maxY(), 92.5); -} - - -class Callback : public ShadingPatch::Callback { - public: - void patchSegment (GraphicsPath<double> &path, const Color &color) { - ostringstream oss; - path.writeSVG(oss, false); - _pathstr += oss.str(); - _colorstr += color.rgbString(); - } - string pathstr() const {return _pathstr;} - string colorstr() const {return _colorstr;} - void reset () {_pathstr.clear(); _colorstr.clear();} - - private: - string _pathstr; - string _colorstr; -}; - - -TEST_F(TensorProductPatchTest, approximate) { - Callback callback; - vector<Color> colors(4); - TensorProductPatch tpp(_points, colors, Color::ColorSpace::RGB, 0, 0); - tpp.approximate(2, false, 0.1, callback); - EXPECT_EQ(callback.pathstr(), "M10 10C20 0 50 30 70 20C80 50 90 60 100 70C70 100 20 100 10 70C20 40 0 30 10 10Z"); - EXPECT_EQ(callback.colorstr(), "#000"); - - callback.reset(); - _patch.approximate(2, false, 0.1, callback); - EXPECT_EQ( - callback.pathstr(), - "M10 10C15 5 25 10 36.25 15C36.25 27.5 40 40.9375 43.28125 54.21875C31.25 52.1875 20.625 46.875 10 36.25C7.5 27.5 5 20 10 10Z" - "M36.25 15C47.5 20 60 25 70 20C75 35 80 45 85 52.5C68.75 55 55.3125 56.25 43.28125 54.21875C40 40.9375 36.25 27.5 36.25 15Z" - "M10 36.25C20.625 46.875 31.25 52.1875 43.28125 54.21875C46.5625 67.5 49.375 80.625 47.5 92.5C30 92.5 15 85 10 70C15 55 12.5 45 10 36.25Z" - "M43.28125 54.21875C55.3125 56.25 68.75 55 85 52.5C90 60 95 65 100 70C85 85 65 92.5 47.5 92.5C49.375 80.625 46.5625 67.5 43.28125 54.21875Z"); - EXPECT_EQ(callback.colorstr(), "#cf6010#70a030#efa030#cf6090"); -} - - - -TEST_F(TensorProductPatchTest, fail) { - // edge flag == 0 - vector<DPair> points(15); - EXPECT_THROW(_patch.setPoints(points, 0, 0), ShadingException); - points.resize(17); // too many points - EXPECT_THROW(_patch.setPoints(points, 0, 0), ShadingException); - - vector<Color> colors(2); // too few colors - EXPECT_THROW(_patch.setColors(colors, 0, 0), ShadingException); - colors.resize(5); // too many colors - EXPECT_THROW(_patch.setColors(colors, 0, 0), ShadingException); - - // edge flag > 0 - points.resize(16); - EXPECT_THROW(_patch.setPoints(points, 1, 0), ShadingException); - points.resize(11); // too few points - EXPECT_THROW(_patch.setPoints(points, 1, &_patch), ShadingException); - points.resize(13); // too many points - EXPECT_THROW(_patch.setPoints(points, 1, &_patch), ShadingException); - - colors.resize(4); - EXPECT_THROW(_patch.setColors(colors, 1, 0), ShadingException); - colors.resize(1); // too few colors - EXPECT_THROW(_patch.setColors(colors, 1, &_patch), ShadingException); - colors.resize(3); // too many colors - EXPECT_THROW(_patch.setColors(colors, 1, &_patch), ShadingException); - - CoonsPatch cp; - points.resize(8); - EXPECT_THROW(cp.setPoints(points, 1, 0), ShadingException); - points.resize(11); - EXPECT_THROW(cp.setPoints(points, 0, 0), ShadingException); - colors.resize(2); - EXPECT_THROW(cp.setColors(colors, 1, 0), ShadingException); - colors.resize(5); - EXPECT_THROW(cp.setColors(colors, 0, 0), ShadingException); -} |