LCOV - code coverage report
Current view: top level - basebmp/test - polytest.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 166 166 100.0 %
Date: 2014-11-03 Functions: 23 23 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <cppunit/TestAssert.h>
      21             : #include <cppunit/TestFixture.h>
      22             : #include <cppunit/extensions/HelperMacros.h>
      23             : 
      24             : #include <basegfx/vector/b2isize.hxx>
      25             : #include <basegfx/range/b2ibox.hxx>
      26             : #include <basegfx/point/b2ipoint.hxx>
      27             : #include <basegfx/matrix/b2dhommatrix.hxx>
      28             : #include <basegfx/polygon/b2dpolygon.hxx>
      29             : #include <basegfx/polygon/b2dpolygontools.hxx>
      30             : #include <basegfx/polygon/b2dpolypolygon.hxx>
      31             : #include <basegfx/polygon/b2dpolypolygontools.hxx>
      32             : 
      33             : #include <basebmp/color.hxx>
      34             : #include <basebmp/scanlineformats.hxx>
      35             : #include <basebmp/bitmapdevice.hxx>
      36             : #include "tools.hxx"
      37             : 
      38             : using namespace ::basebmp;
      39             : 
      40             : namespace
      41             : {
      42          42 : class PolyTest : public CppUnit::TestFixture
      43             : {
      44             : private:
      45             :     BitmapDeviceSharedPtr mpDevice1bpp;
      46             :     BitmapDeviceSharedPtr mpDevice32bpp;
      47             : 
      48           4 :     void implTestEmpty(const BitmapDeviceSharedPtr& rDevice)
      49             :     {
      50           4 :         const Color aCol(0xFFFFFFFF);
      51           4 :         const Color aBgCol(0);
      52           4 :         rDevice->clear(aBgCol);
      53           4 :         basegfx::B2DPolyPolygon aPoly;
      54             : 
      55             :         basegfx::tools::importFromSvgD(
      56             :             aPoly,
      57           4 :             OUString( "M2 2 l7 7 z" ), false, NULL );
      58             :         rDevice->fillPolyPolygon(
      59             :             aPoly,
      60             :             aCol,
      61           4 :             DrawMode_PAINT );
      62           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 0",
      63           4 :                                countPixel( rDevice, aCol ) == 0);
      64             : 
      65             : 
      66             : 
      67           4 :         rDevice->clear(aBgCol);
      68           4 :         aPoly.clear();
      69             :         basegfx::tools::importFromSvgD(
      70             :             aPoly,
      71           4 :             OUString( "M7 2 l-6 6 z" ), false, NULL );
      72             :         rDevice->fillPolyPolygon(
      73             :             aPoly,
      74             :             aCol,
      75           4 :             DrawMode_PAINT );
      76           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 0(b)",
      77           8 :                                countPixel( rDevice, aCol ) == 0);
      78           4 :     }
      79             : 
      80           4 :     void implTestHairline(const BitmapDeviceSharedPtr& rDevice)
      81             :     {
      82           4 :         const Color aCol(0xFFFFFFFF);
      83           4 :         const Color aBgCol(0);
      84           4 :         rDevice->clear(aBgCol);
      85           4 :         basegfx::B2DPolyPolygon aPoly;
      86             : 
      87             :         basegfx::tools::importFromSvgD(
      88             :             aPoly,
      89           4 :             OUString( "M2 2 h1 l7 7 h-1 z" ), false, NULL );
      90             :         rDevice->fillPolyPolygon(
      91             :             aPoly,
      92             :             aCol,
      93           4 :             DrawMode_PAINT );
      94           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 7",
      95           4 :                                countPixel( rDevice, aCol ) == 7);
      96             : 
      97             : 
      98             : 
      99           4 :         rDevice->clear(aBgCol);
     100           4 :         aPoly.clear();
     101             :         basegfx::tools::importFromSvgD(
     102             :             aPoly,
     103           4 :             OUString( "M7 2 h-1 l-6 6 h1 z" ), false, NULL );
     104             :         rDevice->fillPolyPolygon(
     105             :             aPoly,
     106             :             aCol,
     107           4 :             DrawMode_PAINT );
     108           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 6",
     109           4 :                                countPixel( rDevice, aCol ) == 6);
     110             : 
     111             : 
     112             : 
     113           4 :         rDevice->clear(aBgCol);
     114           4 :         aPoly.clear();
     115             :         basegfx::tools::importFromSvgD(
     116             :             aPoly,
     117           4 :             OUString( "M0 0 l7 7 h-1 l-5-7 z" ), false, NULL );
     118             :         rDevice->fillPolyPolygon(
     119             :             aPoly,
     120             :             aCol,
     121           4 :             DrawMode_PAINT );
     122           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 3",
     123           8 :                                countPixel( rDevice, aCol ) == 3);
     124           4 :     }
     125             : 
     126           4 :     void implTestPolyPoly(const BitmapDeviceSharedPtr& rDevice)
     127             :     {
     128           4 :         const Color aCol(0xFFFFFFFF);
     129           4 :         const Color aBgCol(0);
     130           4 :         rDevice->clear(aBgCol);
     131           4 :         basegfx::B2DPolyPolygon aPoly;
     132             : 
     133             :         basegfx::tools::importFromSvgD( aPoly,
     134             :                                         OUString( "M0 0 h7 v7 h-7 z M2 2 v3 h3 v-3 z" ),
     135           4 :                                         false, NULL );
     136             : 
     137             :         rDevice->fillPolyPolygon(
     138             :             aPoly,
     139             :             aCol,
     140           4 :             DrawMode_PAINT );
     141           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 40",
     142           8 :                                countPixel( rDevice, aCol ) == 40);
     143           4 :     }
     144             : 
     145           4 :     void implTestPolyPolyClip(const BitmapDeviceSharedPtr& rDevice)
     146             :     {
     147           4 :         const Color aCol(0xFFFFFFFF);
     148           4 :         const Color aBgCol(0);
     149           4 :         rDevice->clear(aBgCol);
     150           4 :         basegfx::B2DPolyPolygon aPoly;
     151             : 
     152             :         basegfx::tools::importFromSvgD( aPoly,
     153             :                                         OUString( "M0 0 h7 v7 h-7 z M2 2 v3 h3 v-3 z" ),
     154           4 :                                         false, NULL );
     155           8 :         basegfx::B2DHomMatrix aMat;
     156           4 :         aMat.translate(-3,-3);
     157           4 :         aMat.rotate( 1.7 );
     158           4 :         aMat.translate(6,5);
     159           4 :         aPoly.transform(aMat);
     160             : 
     161             :         rDevice->fillPolyPolygon(
     162             :             aPoly,
     163             :             aCol,
     164           4 :             DrawMode_PAINT );
     165             : 
     166           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 39",
     167           4 :                                countPixel( rDevice, aCol ) == 39);
     168             : 
     169             :         BitmapDeviceSharedPtr pClippedDevice(
     170             :             subsetBitmapDevice( rDevice,
     171           8 :                                 basegfx::B2IBox(3,3,5,8) ));
     172           8 :         CPPUNIT_ASSERT_MESSAGE("size of subsetted device is not (2,5)",
     173           4 :                                pClippedDevice->getSize() == basegfx::B2IVector(2,5));
     174             : 
     175           4 :         rDevice->clear(aBgCol);
     176             :         pClippedDevice->fillPolyPolygon(
     177             :             aPoly,
     178             :             aCol,
     179           4 :             DrawMode_PAINT );
     180           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 7",
     181           8 :                                countPixel( rDevice, aCol ) == 7);
     182           4 :     }
     183             : 
     184           4 :     void implTestLineDrawClip(const BitmapDeviceSharedPtr& rDevice)
     185             :     {
     186           4 :         const Color aCol(0xFFFFFFFF);
     187           4 :         const Color aBgCol(0);
     188           4 :         rDevice->clear(aBgCol);
     189             : 
     190             :         // create rectangular subset, such that we can 'see' extra
     191             :         // pixel outside
     192             :         BitmapDeviceSharedPtr pClippedDevice=(
     193             :             subsetBitmapDevice( rDevice,
     194           4 :                                 basegfx::B2IBox(3,3,5,9) ));
     195             : 
     196             :         // trigger "alternate bresenham" case in
     197             :         // clippedlinerenderer.hxx, first point not clipped
     198           8 :         const basegfx::B2IPoint aPt1(3,3);
     199           8 :         const basegfx::B2IPoint aPt2(4,2);
     200           4 :         pClippedDevice->drawLine( aPt1, aPt2, aCol, DrawMode_PAINT );
     201             : 
     202           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 1",
     203           4 :                                countPixel( rDevice, aCol ) == 1);
     204             : 
     205             :         // trigger "alternate bresenham" case in
     206             :         // clippedlinerenderer.hxx, both start and endpoint clipped
     207           8 :         const basegfx::B2IPoint aPt3(0,4);
     208           4 :         pClippedDevice->drawLine( aPt3, aPt2, aCol, DrawMode_XOR );
     209             : 
     210           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 0",
     211           4 :                                countPixel( rDevice, aCol ) == 0);
     212             : 
     213             :         // trigger "standard bresenham" case in
     214             :         // clippedlinerenderer.hxx, first point not clipped
     215           8 :         const basegfx::B2IPoint aPt4(6,2);
     216           4 :         pClippedDevice->drawLine( aPt1, aPt4, aCol, DrawMode_PAINT );
     217             : 
     218           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 2",
     219           4 :                                countPixel( rDevice, aCol ) == 2);
     220             : 
     221             :         // trigger "clipCode1 & aMinFlag/bMinFlag" cases in
     222             :         // clippedlinerenderer.hxx (note1: needs forcing end point to
     223             :         // be clipped as well, otherwise optimization kicks in. note2:
     224             :         // needs forcing end point to clip on two edges, not only on
     225             :         // one, otherwise swap kicks in)
     226           8 :         const basegfx::B2IPoint aPt5(1,1);
     227           8 :         const basegfx::B2IPoint aPt6(6,10);
     228           4 :         pClippedDevice->drawLine( aPt5, aPt6, aCol, DrawMode_XOR );
     229             : 
     230           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 6",
     231           4 :                                countPixel( rDevice, aCol ) == 6);
     232             : 
     233             :         // trigger "clipCode1 & (aMinFlag|aMaxFlag)" case in
     234             :         // clippedlinerenderer.hxx that was not taken for the test
     235             :         // above
     236           4 :         pClippedDevice->drawLine( aPt3, aPt6, aCol, DrawMode_XOR );
     237             : 
     238           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 8",
     239           8 :                                countPixel( rDevice, aCol ) == 8);
     240             : 
     241           4 :     }
     242             : 
     243           4 :     void implTestPolyDrawClip(const BitmapDeviceSharedPtr& rDevice)
     244             :     {
     245           4 :         const Color aCol(0xFFFFFFFF);
     246           4 :         const Color aBgCol(0);
     247           4 :         rDevice->clear(aBgCol);
     248           4 :         basegfx::B2DPolyPolygon aPoly;
     249             : 
     250             :         // test all corner-touching lines of our clip rect. note that
     251             :         // *all* of the four two-pixel lines in that polygon do *not*
     252             :         // generate a single pixel, due to the rasterization effect.
     253             :         basegfx::tools::importFromSvgD( aPoly,
     254             :                                         OUString( "M2 3 l1 -1 M4 2 l1 1 M2 8 l1 1 M5 8 l-1 1 M2 5 h4 M3 0 v10" ),
     255           4 :                                         false, NULL );
     256             :         BitmapDeviceSharedPtr pClippedDevice=(
     257             :             subsetBitmapDevice( rDevice,
     258           8 :                                 basegfx::B2IBox(3,3,5,9) ));
     259             : 
     260          28 :         for( unsigned int i=0; i<aPoly.count(); ++i )
     261             :             pClippedDevice->drawPolygon(
     262             :                 aPoly.getB2DPolygon(i),
     263             :                 aCol,
     264          24 :                 DrawMode_PAINT );
     265             : 
     266           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 7",
     267           8 :                                countPixel( rDevice, aCol ) == 7);
     268           4 :     }
     269             : 
     270           4 :     void implTestPolyPolyCrissCross(const BitmapDeviceSharedPtr& rDevice)
     271             :     {
     272           4 :         const Color aCol(0xFFFFFFFF);
     273           4 :         const Color aBgCol(0);
     274           4 :         rDevice->clear(aBgCol);
     275           4 :         basegfx::B2DPolyPolygon aPoly;
     276             : 
     277             :         basegfx::tools::importFromSvgD( aPoly,
     278             :                                         OUString( "M0 0 v2 l10 2 v-2 z"
     279             :                                             "M10 6 v-2 l-10 2 v2 z"
     280             :                                             "M1 0 h1 v10 h-1 z"
     281             :                                             "M4 0 h1 v10 h-1 z"
     282             :                                             "M8 0 h1 v10 h-1 z" ),
     283           4 :                                         false, NULL );
     284             :         rDevice->fillPolyPolygon(
     285             :             aPoly,
     286             :             aCol,
     287           4 :             DrawMode_PAINT );
     288           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 46",
     289           8 :                                countPixel( rDevice, aCol ) == 46);
     290           4 :     }
     291             : 
     292             : 
     293             : public:
     294          14 :     void setUp() SAL_OVERRIDE
     295             :     {
     296          14 :         const basegfx::B2ISize aSize(10,10);
     297          28 :         mpDevice1bpp = createBitmapDevice( aSize,
     298             :                                            true,
     299          14 :                                            FORMAT_ONE_BIT_MSB_PAL );
     300          28 :         mpDevice32bpp = createBitmapDevice( aSize,
     301             :                                             true,
     302          28 :                                             FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA );
     303          14 :     }
     304             : 
     305           2 :     void testEmpty()
     306             :     {
     307           2 :         implTestEmpty( mpDevice1bpp );
     308           2 :         implTestEmpty( mpDevice32bpp );
     309           2 :     }
     310             : 
     311           2 :     void testHairline()
     312             :     {
     313           2 :         implTestHairline( mpDevice1bpp );
     314           2 :         implTestHairline( mpDevice32bpp );
     315           2 :     }
     316             : 
     317           2 :     void testPolyPoly()
     318             :     {
     319           2 :         implTestPolyPoly( mpDevice1bpp );
     320           2 :         implTestPolyPoly( mpDevice32bpp );
     321           2 :     }
     322             : 
     323           2 :     void testPolyPolyClip()
     324             :     {
     325           2 :         implTestPolyPolyClip(mpDevice1bpp);
     326           2 :         implTestPolyPolyClip(mpDevice32bpp);
     327           2 :     }
     328             : 
     329           2 :     void testLineDrawClip()
     330             :     {
     331           2 :         implTestLineDrawClip(mpDevice1bpp);
     332           2 :         implTestLineDrawClip(mpDevice32bpp);
     333           2 :     }
     334             : 
     335           2 :     void testPolyDrawClip()
     336             :     {
     337           2 :         implTestPolyDrawClip(mpDevice1bpp);
     338           2 :         implTestPolyDrawClip(mpDevice32bpp);
     339           2 :     }
     340             : 
     341           2 :     void testPolyPolyCrissCross()
     342             :     {
     343           2 :         implTestPolyPolyCrissCross(mpDevice1bpp);
     344           2 :         implTestPolyPolyCrissCross(mpDevice32bpp);
     345           2 :     }
     346             : 
     347             :     // Change the following lines only, if you add, remove or rename
     348             :     // member functions of the current class,
     349             :     // because these macros are need by auto register mechanism.
     350             : 
     351           4 :     CPPUNIT_TEST_SUITE(PolyTest);
     352           2 :     CPPUNIT_TEST(testEmpty);
     353           2 :     CPPUNIT_TEST(testHairline);
     354           2 :     CPPUNIT_TEST(testPolyPoly);
     355           2 :     CPPUNIT_TEST(testPolyPolyClip);
     356           2 :     CPPUNIT_TEST(testLineDrawClip);
     357           2 :     CPPUNIT_TEST(testPolyDrawClip);
     358           2 :     CPPUNIT_TEST(testPolyPolyCrissCross);
     359           4 :     CPPUNIT_TEST_SUITE_END();
     360             : };
     361             : 
     362           2 : CPPUNIT_TEST_SUITE_REGISTRATION(PolyTest);
     363           6 : }
     364             : 
     365             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10