summaryrefslogtreecommitdiffstats
path: root/drawinglayer/qa
diff options
context:
space:
mode:
Diffstat (limited to 'drawinglayer/qa')
-rw-r--r--drawinglayer/qa/unit/border.cxx71
1 files changed, 69 insertions, 2 deletions
diff --git a/drawinglayer/qa/unit/border.cxx b/drawinglayer/qa/unit/border.cxx
index 6f49a2447b77..9f0c62187801 100644
--- a/drawinglayer/qa/unit/border.cxx
+++ b/drawinglayer/qa/unit/border.cxx
@@ -8,7 +8,6 @@
*/
#include <cppunit/TestAssert.h>
-#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
@@ -17,20 +16,27 @@
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/primitive2d/borderlineprimitive2d.hxx>
#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
+#include <drawinglayer/processor2d/baseprocessor2d.hxx>
+#include <drawinglayer/processor2d/processorfromoutputdevice.hxx>
#include <rtl/ref.hxx>
+#include <test/bootstrapfixture.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/virdev.hxx>
using namespace com::sun::star;
namespace
{
-class DrawinglayerBorderTest : public CppUnit::TestFixture
+class DrawinglayerBorderTest : public test::BootstrapFixture
{
public:
void testDoubleDecompositionSolid();
+ void testDoublePixelProcessing();
CPPUNIT_TEST_SUITE(DrawinglayerBorderTest);
CPPUNIT_TEST(testDoubleDecompositionSolid);
+ CPPUNIT_TEST(testDoublePixelProcessing);
CPPUNIT_TEST_SUITE_END();
};
@@ -74,6 +80,67 @@ void DrawinglayerBorderTest::testDoubleDecompositionSolid()
CPPUNIT_ASSERT_DOUBLES_EQUAL(fLeftWidth, rRange.getHeight(), basegfx::fTools::getSmallValue());
}
+void DrawinglayerBorderTest::testDoublePixelProcessing()
+{
+ // Create a pixel processor.
+ ScopedVclPtrInstance<VirtualDevice> pDev;
+ drawinglayer::geometry::ViewInformation2D aView;
+ std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor(drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice(*pDev, aView));
+ CPPUNIT_ASSERT(pProcessor);
+ GDIMetaFile aMetaFile;
+ // Start recording after the processor is created, so we can test the pixel processor.
+ aMetaFile.Record(pDev);
+
+ // Create a border line primitive that's similar to the one from the bugdoc:
+ // 1.47 pixels is 0.03cm at 130% zoom and 96 DPI.
+ basegfx::B2DPoint aStart(0, 20);
+ basegfx::B2DPoint aEnd(100, 20);
+ double fLeftWidth = 1.47;
+ double fDistance = 1.47;
+ double fRightWidth = 1.47;
+ double fExtendLeftStart = 0;
+ double fExtendLeftEnd = 0;
+ double fExtendRightStart = 0;
+ double fExtendRightEnd = 0;
+ basegfx::BColor aColorRight;
+ basegfx::BColor aColorLeft;
+ basegfx::BColor aColorGap;
+ bool bHasGapColor = false;
+ sal_Int16 nStyle = table::BorderLineStyle::DOUBLE;
+ rtl::Reference<drawinglayer::primitive2d::BorderLinePrimitive2D> xBorder(new drawinglayer::primitive2d::BorderLinePrimitive2D(aStart, aEnd, fLeftWidth, fDistance, fRightWidth, fExtendLeftStart, fExtendLeftEnd, fExtendRightStart, fExtendRightEnd, aColorRight, aColorLeft, aColorGap, bHasGapColor, nStyle));
+ drawinglayer::primitive2d::Primitive2DContainer aPrimitives;
+ aPrimitives.push_back(drawinglayer::primitive2d::Primitive2DReference(xBorder.get()));
+
+ // Process the primitives.
+ pProcessor->process(aPrimitives);
+
+ // Now assert the height of the outer (second) border polygon.
+ aMetaFile.Stop();
+ aMetaFile.WindStart();
+ bool bFirst = true;
+ sal_Int32 nHeight = 0;
+ for(std::size_t nAction = 0; nAction < aMetaFile.GetActionSize(); ++nAction)
+ {
+ MetaAction* pAction = aMetaFile.GetAction(nAction);
+ if (pAction->GetType() == MetaActionType::POLYPOLYGON)
+ {
+ if (bFirst)
+ {
+ bFirst = false;
+ continue;
+ }
+
+ auto pMPPAction = static_cast<MetaPolyPolygonAction*>(pAction);
+ const tools::PolyPolygon& rPolyPolygon = pMPPAction->GetPolyPolygon();
+ nHeight = rPolyPolygon.GetBoundRect().getHeight();
+ }
+ }
+ sal_Int32 nExpectedHeight = std::round(fRightWidth);
+ // This was 2, and should be 1: if the logical requested width is 1.47,
+ // then that must be 1 px on the screen, not 2.
+ CPPUNIT_ASSERT_EQUAL(nExpectedHeight, nHeight);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(DrawinglayerBorderTest);
}