LCOV - code coverage report
Current view: top level - libreoffice/basebmp/test - polytest.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 164 164 100.0 %
Date: 2012-12-17 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" ) );
      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" ) );
      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" ) );
      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" ) );
     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" ) );
     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           4 :                                         OUString( "M0 0 h7 v7 h-7 z M2 2 v3 h3 v-3 z" ) );
     135             : 
     136             :         rDevice->fillPolyPolygon(
     137             :             aPoly,
     138             :             aCol,
     139           4 :             DrawMode_PAINT );
     140           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 40",
     141           8 :                                countPixel( rDevice, aCol ) == 40);
     142           4 :     }
     143             : 
     144           4 :     void implTestPolyPolyClip(const BitmapDeviceSharedPtr& rDevice)
     145             :     {
     146           4 :         const Color aCol(0xFFFFFFFF);
     147           4 :         const Color aBgCol(0);
     148           4 :         rDevice->clear(aBgCol);
     149           4 :         basegfx::B2DPolyPolygon aPoly;
     150             : 
     151             :         basegfx::tools::importFromSvgD( aPoly,
     152           4 :                                         OUString( "M0 0 h7 v7 h-7 z M2 2 v3 h3 v-3 z" ) );
     153           4 :         basegfx::B2DHomMatrix aMat;
     154           4 :         aMat.translate(-3,-3);
     155           4 :         aMat.rotate( 1.7 );
     156           4 :         aMat.translate(6,5);
     157           4 :         aPoly.transform(aMat);
     158             : 
     159             :         rDevice->fillPolyPolygon(
     160             :             aPoly,
     161             :             aCol,
     162           4 :             DrawMode_PAINT );
     163             : 
     164           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 39",
     165           4 :                                countPixel( rDevice, aCol ) == 39);
     166             : 
     167             :         BitmapDeviceSharedPtr pClippedDevice(
     168             :             subsetBitmapDevice( rDevice,
     169           4 :                                 basegfx::B2IBox(3,3,5,8) ));
     170           8 :         CPPUNIT_ASSERT_MESSAGE("size of subsetted device is not (2,5)",
     171           4 :                                pClippedDevice->getSize() == basegfx::B2IVector(2,5));
     172             : 
     173           4 :         rDevice->clear(aBgCol);
     174             :         pClippedDevice->fillPolyPolygon(
     175             :             aPoly,
     176             :             aCol,
     177           4 :             DrawMode_PAINT );
     178           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 7",
     179           8 :                                countPixel( rDevice, aCol ) == 7);
     180           4 :     }
     181             : 
     182           4 :     void implTestLineDrawClip(const BitmapDeviceSharedPtr& rDevice)
     183             :     {
     184           4 :         const Color aCol(0xFFFFFFFF);
     185           4 :         const Color aBgCol(0);
     186           4 :         rDevice->clear(aBgCol);
     187             : 
     188             :         // create rectangular subset, such that we can 'see' extra
     189             :         // pixel outside
     190             :         BitmapDeviceSharedPtr pClippedDevice=(
     191             :             subsetBitmapDevice( rDevice,
     192           4 :                                 basegfx::B2IBox(3,3,5,9) ));
     193             : 
     194             :         // trigger "alternate bresenham" case in
     195             :         // clippedlinerenderer.hxx, first point not clipped
     196           4 :         const basegfx::B2IPoint aPt1(3,3);
     197           4 :         const basegfx::B2IPoint aPt2(4,2);
     198           4 :         pClippedDevice->drawLine( aPt1, aPt2, aCol, DrawMode_PAINT );
     199             : 
     200           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 1",
     201           4 :                                countPixel( rDevice, aCol ) == 1);
     202             : 
     203             :         // trigger "alternate bresenham" case in
     204             :         // clippedlinerenderer.hxx, both start and endpoint clipped
     205           4 :         const basegfx::B2IPoint aPt3(0,4);
     206           4 :         pClippedDevice->drawLine( aPt3, aPt2, aCol, DrawMode_XOR );
     207             : 
     208           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 0",
     209           4 :                                countPixel( rDevice, aCol ) == 0);
     210             : 
     211             :         // trigger "standard bresenham" case in
     212             :         // clippedlinerenderer.hxx, first point not clipped
     213           4 :         const basegfx::B2IPoint aPt4(6,2);
     214           4 :         pClippedDevice->drawLine( aPt1, aPt4, aCol, DrawMode_PAINT );
     215             : 
     216           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 2",
     217           4 :                                countPixel( rDevice, aCol ) == 2);
     218             : 
     219             :         // trigger "clipCode1 & aMinFlag/bMinFlag" cases in
     220             :         // clippedlinerenderer.hxx (note1: needs forcing end point to
     221             :         // be clipped as well, otherwise optimisation kicks in. note2:
     222             :         // needs forcing end point to clip on two edges, not only on
     223             :         // one, otherwise swap kicks in)
     224           4 :         const basegfx::B2IPoint aPt5(1,1);
     225           4 :         const basegfx::B2IPoint aPt6(6,10);
     226           4 :         pClippedDevice->drawLine( aPt5, aPt6, aCol, DrawMode_XOR );
     227             : 
     228           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 6",
     229           4 :                                countPixel( rDevice, aCol ) == 6);
     230             : 
     231             :         // trigger "clipCode1 & (aMinFlag|aMaxFlag)" case in
     232             :         // clippedlinerenderer.hxx that was not taken for the test
     233             :         // above
     234           4 :         pClippedDevice->drawLine( aPt3, aPt6, aCol, DrawMode_XOR );
     235             : 
     236           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 8",
     237           8 :                                countPixel( rDevice, aCol ) == 8);
     238             : 
     239           4 :     }
     240             : 
     241           4 :     void implTestPolyDrawClip(const BitmapDeviceSharedPtr& rDevice)
     242             :     {
     243           4 :         const Color aCol(0xFFFFFFFF);
     244           4 :         const Color aBgCol(0);
     245           4 :         rDevice->clear(aBgCol);
     246           4 :         basegfx::B2DPolyPolygon aPoly;
     247             : 
     248             :         // test all corner-touching lines of our clip rect. note that
     249             :         // *all* of the four two-pixel lines in that polygon do *not*
     250             :         // generate a single pixel, due to the rasterization effect.
     251             :         basegfx::tools::importFromSvgD( aPoly,
     252           4 :                                         OUString( "M2 3 l1 -1 M4 2 l1 1 M2 8 l1 1 M5 8 l-1 1 M2 5 h4 M3 0 v10" ) );
     253             :         BitmapDeviceSharedPtr pClippedDevice=(
     254             :             subsetBitmapDevice( rDevice,
     255           4 :                                 basegfx::B2IBox(3,3,5,9) ));
     256             : 
     257          28 :         for( unsigned int i=0; i<aPoly.count(); ++i )
     258             :             pClippedDevice->drawPolygon(
     259             :                 aPoly.getB2DPolygon(i),
     260             :                 aCol,
     261          24 :                 DrawMode_PAINT );
     262             : 
     263           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 7",
     264           8 :                                countPixel( rDevice, aCol ) == 7);
     265           4 :     }
     266             : 
     267           4 :     void implTestPolyPolyCrissCross(const BitmapDeviceSharedPtr& rDevice)
     268             :     {
     269           4 :         const Color aCol(0xFFFFFFFF);
     270           4 :         const Color aBgCol(0);
     271           4 :         rDevice->clear(aBgCol);
     272           4 :         basegfx::B2DPolyPolygon aPoly;
     273             : 
     274             :         basegfx::tools::importFromSvgD( aPoly,
     275             :                                         OUString( "M0 0 v2 l10 2 v-2 z"
     276             :                                             "M10 6 v-2 l-10 2 v2 z"
     277             :                                             "M1 0 h1 v10 h-1 z"
     278             :                                             "M4 0 h1 v10 h-1 z"
     279           4 :                                             "M8 0 h1 v10 h-1 z" ) );
     280             :         rDevice->fillPolyPolygon(
     281             :             aPoly,
     282             :             aCol,
     283           4 :             DrawMode_PAINT );
     284           8 :         CPPUNIT_ASSERT_MESSAGE("number of rendered pixel is not 46",
     285           8 :                                countPixel( rDevice, aCol ) == 46);
     286           4 :     }
     287             : 
     288             : 
     289             : public:
     290          14 :     void setUp()
     291             :     {
     292          14 :         const basegfx::B2ISize aSize(10,10);
     293             :         mpDevice1bpp = createBitmapDevice( aSize,
     294             :                                            true,
     295          14 :                                            Format::ONE_BIT_MSB_PAL );
     296             :         mpDevice32bpp = createBitmapDevice( aSize,
     297             :                                             true,
     298          14 :                                             Format::THIRTYTWO_BIT_TC_MASK );
     299          14 :     }
     300             : 
     301           2 :     void testEmpty()
     302             :     {
     303           2 :         implTestEmpty( mpDevice1bpp );
     304           2 :         implTestEmpty( mpDevice32bpp );
     305           2 :     }
     306             : 
     307           2 :     void testHairline()
     308             :     {
     309           2 :         implTestHairline( mpDevice1bpp );
     310           2 :         implTestHairline( mpDevice32bpp );
     311           2 :     }
     312             : 
     313           2 :     void testPolyPoly()
     314             :     {
     315           2 :         implTestPolyPoly( mpDevice1bpp );
     316           2 :         implTestPolyPoly( mpDevice32bpp );
     317           2 :     }
     318             : 
     319           2 :     void testPolyPolyClip()
     320             :     {
     321           2 :         implTestPolyPolyClip(mpDevice1bpp);
     322           2 :         implTestPolyPolyClip(mpDevice32bpp);
     323           2 :     }
     324             : 
     325           2 :     void testLineDrawClip()
     326             :     {
     327           2 :         implTestLineDrawClip(mpDevice1bpp);
     328           2 :         implTestLineDrawClip(mpDevice32bpp);
     329           2 :     }
     330             : 
     331           2 :     void testPolyDrawClip()
     332             :     {
     333           2 :         implTestPolyDrawClip(mpDevice1bpp);
     334           2 :         implTestPolyDrawClip(mpDevice32bpp);
     335           2 :     }
     336             : 
     337           2 :     void testPolyPolyCrissCross()
     338             :     {
     339           2 :         implTestPolyPolyCrissCross(mpDevice1bpp);
     340           2 :         implTestPolyPolyCrissCross(mpDevice32bpp);
     341           2 :     }
     342             : 
     343             :     // Change the following lines only, if you add, remove or rename
     344             :     // member functions of the current class,
     345             :     // because these macros are need by auto register mechanism.
     346             : 
     347           4 :     CPPUNIT_TEST_SUITE(PolyTest);
     348           2 :     CPPUNIT_TEST(testEmpty);
     349           2 :     CPPUNIT_TEST(testHairline);
     350           2 :     CPPUNIT_TEST(testPolyPoly);
     351           2 :     CPPUNIT_TEST(testPolyPolyClip);
     352           2 :     CPPUNIT_TEST(testLineDrawClip);
     353           2 :     CPPUNIT_TEST(testPolyDrawClip);
     354           2 :     CPPUNIT_TEST(testPolyPolyCrissCross);
     355           4 :     CPPUNIT_TEST_SUITE_END();
     356             : };
     357             : 
     358           2 : CPPUNIT_TEST_SUITE_REGISTRATION(PolyTest);
     359           6 : }
     360             : 
     361             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10