LCOV - code coverage report
Current view: top level - drawinglayer/source/primitive2d - polypolygonprimitive2d.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 117 216 54.2 %
Date: 2015-06-13 12:38:46 Functions: 24 40 60.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 <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
      21             : #include <basegfx/polygon/b2dpolypolygontools.hxx>
      22             : #include <basegfx/tools/canvastools.hxx>
      23             : #include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx>
      24             : #include <drawinglayer/primitive2d/maskprimitive2d.hxx>
      25             : #include <drawinglayer/primitive2d/fillhatchprimitive2d.hxx>
      26             : #include <basegfx/matrix/b2dhommatrix.hxx>
      27             : #include <drawinglayer/primitive2d/fillgraphicprimitive2d.hxx>
      28             : #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
      29             : #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
      30             : #include <basegfx/matrix/b2dhommatrixtools.hxx>
      31             : #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
      32             : #include <drawinglayer/geometry/viewinformation2d.hxx>
      33             : #include <vcl/graph.hxx>
      34             : 
      35             : 
      36             : 
      37             : using namespace com::sun::star;
      38             : 
      39             : 
      40             : 
      41             : namespace drawinglayer
      42             : {
      43             :     namespace primitive2d
      44             :     {
      45       19049 :         Primitive2DSequence PolyPolygonHairlinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
      46             :         {
      47       19049 :             const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
      48       19049 :             const sal_uInt32 nCount(aPolyPolygon.count());
      49             : 
      50       19049 :             if(nCount)
      51             :             {
      52       19049 :                 Primitive2DSequence aRetval(nCount);
      53             : 
      54       59696 :                 for(sal_uInt32 a(0L); a < nCount; a++)
      55             :                 {
      56       40647 :                     aRetval[a] = Primitive2DReference(new PolygonHairlinePrimitive2D(aPolyPolygon.getB2DPolygon(a), getBColor()));
      57             :                 }
      58             : 
      59       19049 :                 return aRetval;
      60             :             }
      61             :             else
      62             :             {
      63           0 :                 return Primitive2DSequence();
      64       19049 :             }
      65             :         }
      66             : 
      67       43798 :         PolyPolygonHairlinePrimitive2D::PolyPolygonHairlinePrimitive2D(const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::BColor& rBColor)
      68             :         :   BufferedDecompositionPrimitive2D(),
      69             :             maPolyPolygon(rPolyPolygon),
      70       43798 :             maBColor(rBColor)
      71             :         {
      72       43798 :         }
      73             : 
      74         755 :         bool PolyPolygonHairlinePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
      75             :         {
      76         755 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
      77             :             {
      78         755 :                 const PolyPolygonHairlinePrimitive2D& rCompare = static_cast<const PolyPolygonHairlinePrimitive2D&>(rPrimitive);
      79             : 
      80         755 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
      81         755 :                     && getBColor() == rCompare.getBColor());
      82             :             }
      83             : 
      84           0 :             return false;
      85             :         }
      86             : 
      87      169372 :         basegfx::B2DRange PolyPolygonHairlinePrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
      88             :         {
      89             :             // return range
      90      169372 :             return basegfx::tools::getRange(getB2DPolyPolygon());
      91             :         }
      92             : 
      93             :         // provide unique ID
      94       23932 :         ImplPrimitive2DIDBlock(PolyPolygonHairlinePrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONHAIRLINEPRIMITIVE2D)
      95             : 
      96             :     } // end of namespace primitive2d
      97             : } // end of namespace drawinglayer
      98             : 
      99             : 
     100             : 
     101             : namespace drawinglayer
     102             : {
     103             :     namespace primitive2d
     104             :     {
     105           0 :         Primitive2DSequence PolyPolygonMarkerPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     106             :         {
     107           0 :             const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
     108           0 :             const sal_uInt32 nCount(aPolyPolygon.count());
     109             : 
     110           0 :             if(nCount)
     111             :             {
     112           0 :                 Primitive2DSequence aRetval(nCount);
     113             : 
     114           0 :                 for(sal_uInt32 a(0L); a < nCount; a++)
     115             :                 {
     116           0 :                     aRetval[a] = Primitive2DReference(
     117             :                         new PolygonMarkerPrimitive2D(
     118             :                             aPolyPolygon.getB2DPolygon(a),
     119             :                             getRGBColorA(),
     120             :                             getRGBColorB(),
     121           0 :                             getDiscreteDashLength()));
     122             :                 }
     123             : 
     124           0 :                 return aRetval;
     125             :             }
     126             :             else
     127             :             {
     128           0 :                 return Primitive2DSequence();
     129           0 :             }
     130             :         }
     131             : 
     132           0 :         PolyPolygonMarkerPrimitive2D::PolyPolygonMarkerPrimitive2D(
     133             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     134             :             const basegfx::BColor& rRGBColorA,
     135             :             const basegfx::BColor& rRGBColorB,
     136             :             double fDiscreteDashLength)
     137             :         :   BufferedDecompositionPrimitive2D(),
     138             :             maPolyPolygon(rPolyPolygon),
     139             :             maRGBColorA(rRGBColorA),
     140             :             maRGBColorB(rRGBColorB),
     141           0 :             mfDiscreteDashLength(fDiscreteDashLength)
     142             :         {
     143           0 :         }
     144             : 
     145           0 :         bool PolyPolygonMarkerPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     146             :         {
     147           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     148             :             {
     149           0 :                 const PolyPolygonMarkerPrimitive2D& rCompare = static_cast<const PolyPolygonMarkerPrimitive2D&>(rPrimitive);
     150             : 
     151           0 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     152           0 :                     && getRGBColorA() == rCompare.getRGBColorA()
     153           0 :                     && getRGBColorB() == rCompare.getRGBColorB()
     154           0 :                     && getDiscreteDashLength() == rCompare.getDiscreteDashLength());
     155             :             }
     156             : 
     157           0 :             return false;
     158             :         }
     159             : 
     160           0 :         basegfx::B2DRange PolyPolygonMarkerPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
     161             :         {
     162             :             // return range
     163           0 :             return basegfx::tools::getRange(getB2DPolyPolygon());
     164             :         }
     165             : 
     166             :         // provide unique ID
     167           0 :         ImplPrimitive2DIDBlock(PolyPolygonMarkerPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONMARKERPRIMITIVE2D)
     168             : 
     169             :     } // end of namespace primitive2d
     170             : } // end of namespace drawinglayer
     171             : 
     172             : 
     173             : 
     174             : namespace drawinglayer
     175             : {
     176             :     namespace primitive2d
     177             :     {
     178         337 :         Primitive2DSequence PolyPolygonStrokePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     179             :         {
     180         337 :             const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
     181         337 :             const sal_uInt32 nCount(aPolyPolygon.count());
     182             : 
     183         337 :             if(nCount)
     184             :             {
     185         337 :                 Primitive2DSequence aRetval(nCount);
     186             : 
     187         718 :                 for(sal_uInt32 a(0L); a < nCount; a++)
     188             :                 {
     189         762 :                     aRetval[a] = Primitive2DReference(
     190             :                         new PolygonStrokePrimitive2D(
     191        1143 :                             aPolyPolygon.getB2DPolygon(a), getLineAttribute(), getStrokeAttribute()));
     192             :                 }
     193             : 
     194         337 :                 return aRetval;
     195             :             }
     196             :             else
     197             :             {
     198           0 :                 return Primitive2DSequence();
     199         337 :             }
     200             :         }
     201             : 
     202         126 :         PolyPolygonStrokePrimitive2D::PolyPolygonStrokePrimitive2D(
     203             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     204             :             const attribute::LineAttribute& rLineAttribute,
     205             :             const attribute::StrokeAttribute& rStrokeAttribute)
     206             :         :   BufferedDecompositionPrimitive2D(),
     207             :             maPolyPolygon(rPolyPolygon),
     208             :             maLineAttribute(rLineAttribute),
     209         126 :             maStrokeAttribute(rStrokeAttribute)
     210             :         {
     211         126 :         }
     212             : 
     213         215 :         PolyPolygonStrokePrimitive2D::PolyPolygonStrokePrimitive2D(
     214             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     215             :             const attribute::LineAttribute& rLineAttribute)
     216             :         :   BufferedDecompositionPrimitive2D(),
     217             :             maPolyPolygon(rPolyPolygon),
     218             :             maLineAttribute(rLineAttribute),
     219         215 :             maStrokeAttribute()
     220             :         {
     221         215 :         }
     222             : 
     223           3 :         bool PolyPolygonStrokePrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     224             :         {
     225           3 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     226             :             {
     227           3 :                 const PolyPolygonStrokePrimitive2D& rCompare = static_cast<const PolyPolygonStrokePrimitive2D&>(rPrimitive);
     228             : 
     229           3 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     230           3 :                     && getLineAttribute() == rCompare.getLineAttribute()
     231           6 :                     && getStrokeAttribute() == rCompare.getStrokeAttribute());
     232             :             }
     233             : 
     234           0 :             return false;
     235             :         }
     236             : 
     237         413 :         basegfx::B2DRange PolyPolygonStrokePrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
     238             :         {
     239             :             // get range of it (subdivided)
     240         413 :             basegfx::B2DRange aRetval(basegfx::tools::getRange(getB2DPolyPolygon()));
     241             : 
     242             :             // if width, grow by line width
     243         413 :             if(getLineAttribute().getWidth())
     244             :             {
     245         413 :                 aRetval.grow(getLineAttribute().getWidth() / 2.0);
     246             :             }
     247             : 
     248         413 :             return aRetval;
     249             :         }
     250             : 
     251             :         // provide unique ID
     252         589 :         ImplPrimitive2DIDBlock(PolyPolygonStrokePrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONSTROKEPRIMITIVE2D)
     253             : 
     254             :     } // end of namespace primitive2d
     255             : } // end of namespace drawinglayer
     256             : 
     257             : 
     258             : 
     259             : namespace drawinglayer
     260             : {
     261             :     namespace primitive2d
     262             :     {
     263      314725 :         PolyPolygonColorPrimitive2D::PolyPolygonColorPrimitive2D(
     264             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     265             :             const basegfx::BColor& rBColor)
     266             :         :   BasePrimitive2D(),
     267             :             maPolyPolygon(rPolyPolygon),
     268      314725 :             maBColor(rBColor)
     269             :         {
     270      314725 :         }
     271             : 
     272        1644 :         bool PolyPolygonColorPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     273             :         {
     274        1644 :             if(BasePrimitive2D::operator==(rPrimitive))
     275             :             {
     276        1644 :                 const PolyPolygonColorPrimitive2D& rCompare = static_cast<const PolyPolygonColorPrimitive2D&>(rPrimitive);
     277             : 
     278        1644 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     279        1644 :                     && getBColor() == rCompare.getBColor());
     280             :             }
     281             : 
     282           0 :             return false;
     283             :         }
     284             : 
     285      251222 :         basegfx::B2DRange PolyPolygonColorPrimitive2D::getB2DRange(const geometry::ViewInformation2D& /*rViewInformation*/) const
     286             :         {
     287             :             // return range
     288      251222 :             return basegfx::tools::getRange(getB2DPolyPolygon());
     289             :         }
     290             : 
     291             :         // provide unique ID
     292      298460 :         ImplPrimitive2DIDBlock(PolyPolygonColorPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D)
     293             : 
     294             :     } // end of namespace primitive2d
     295             : } // end of namespace drawinglayer
     296             : 
     297             : 
     298             : 
     299             : namespace drawinglayer
     300             : {
     301             :     namespace primitive2d
     302             :     {
     303         674 :         Primitive2DSequence PolyPolygonGradientPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     304             :         {
     305         674 :             if(!getFillGradient().isDefault())
     306             :             {
     307             :                 // create SubSequence with FillGradientPrimitive2D
     308         674 :                 const basegfx::B2DRange aPolyPolygonRange(getB2DPolyPolygon().getB2DRange());
     309             :                 FillGradientPrimitive2D* pNewGradient = new FillGradientPrimitive2D(
     310             :                     aPolyPolygonRange,
     311             :                     getDefinitionRange(),
     312         674 :                     getFillGradient());
     313         674 :                 const Primitive2DReference xSubRef(pNewGradient);
     314        1348 :                 const Primitive2DSequence aSubSequence(&xSubRef, 1L);
     315             : 
     316             :                 // create mask primitive
     317         674 :                 MaskPrimitive2D* pNewMask = new MaskPrimitive2D(getB2DPolyPolygon(), aSubSequence);
     318        1348 :                 const Primitive2DReference xRef(pNewMask);
     319             : 
     320        1348 :                 return Primitive2DSequence(&xRef, 1);
     321             :             }
     322             :             else
     323             :             {
     324           0 :                 return Primitive2DSequence();
     325             :             }
     326             :         }
     327             : 
     328           0 :         PolyPolygonGradientPrimitive2D::PolyPolygonGradientPrimitive2D(
     329             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     330             :             const attribute::FillGradientAttribute& rFillGradient)
     331             :         :   BufferedDecompositionPrimitive2D(),
     332             :             maPolyPolygon(rPolyPolygon),
     333             :             maDefinitionRange(rPolyPolygon.getB2DRange()),
     334           0 :             maFillGradient(rFillGradient)
     335             :         {
     336           0 :         }
     337             : 
     338         674 :         PolyPolygonGradientPrimitive2D::PolyPolygonGradientPrimitive2D(
     339             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     340             :             const basegfx::B2DRange& rDefinitionRange,
     341             :             const attribute::FillGradientAttribute& rFillGradient)
     342             :         :   BufferedDecompositionPrimitive2D(),
     343             :             maPolyPolygon(rPolyPolygon),
     344             :             maDefinitionRange(rDefinitionRange),
     345         674 :             maFillGradient(rFillGradient)
     346             :         {
     347         674 :         }
     348             : 
     349           0 :         bool PolyPolygonGradientPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     350             :         {
     351           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     352             :             {
     353           0 :                 const PolyPolygonGradientPrimitive2D& rCompare = static_cast<const PolyPolygonGradientPrimitive2D&>(rPrimitive);
     354             : 
     355           0 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     356           0 :                     && getDefinitionRange() == rCompare.getDefinitionRange()
     357           0 :                     && getFillGradient() == rCompare.getFillGradient());
     358             :             }
     359             : 
     360           0 :             return false;
     361             :         }
     362             : 
     363             :         // provide unique ID
     364         542 :         ImplPrimitive2DIDBlock(PolyPolygonGradientPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONGRADIENTPRIMITIVE2D)
     365             : 
     366             :     } // end of namespace primitive2d
     367             : } // end of namespace drawinglayer
     368             : 
     369             : 
     370             : 
     371             : namespace drawinglayer
     372             : {
     373             :     namespace primitive2d
     374             :     {
     375        1497 :         Primitive2DSequence PolyPolygonHatchPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     376             :         {
     377        1497 :             if(!getFillHatch().isDefault())
     378             :             {
     379             :                 // create SubSequence with FillHatchPrimitive2D
     380        1497 :                 const basegfx::B2DRange aPolyPolygonRange(getB2DPolyPolygon().getB2DRange());
     381             :                 FillHatchPrimitive2D* pNewHatch = new FillHatchPrimitive2D(
     382             :                     aPolyPolygonRange,
     383             :                     getDefinitionRange(),
     384             :                     getBackgroundColor(),
     385        1497 :                     getFillHatch());
     386        1497 :                 const Primitive2DReference xSubRef(pNewHatch);
     387        2994 :                 const Primitive2DSequence aSubSequence(&xSubRef, 1L);
     388             : 
     389             :                 // create mask primitive
     390        1497 :                 MaskPrimitive2D* pNewMask = new MaskPrimitive2D(getB2DPolyPolygon(), aSubSequence);
     391        2994 :                 const Primitive2DReference xRef(pNewMask);
     392             : 
     393        2994 :                 return Primitive2DSequence(&xRef, 1);
     394             :             }
     395             :             else
     396             :             {
     397           0 :                 return Primitive2DSequence();
     398             :             }
     399             :         }
     400             : 
     401           0 :         PolyPolygonHatchPrimitive2D::PolyPolygonHatchPrimitive2D(
     402             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     403             :             const basegfx::BColor& rBackgroundColor,
     404             :             const attribute::FillHatchAttribute& rFillHatch)
     405             :         :   BufferedDecompositionPrimitive2D(),
     406             :             maPolyPolygon(rPolyPolygon),
     407             :             maDefinitionRange(rPolyPolygon.getB2DRange()),
     408             :             maBackgroundColor(rBackgroundColor),
     409           0 :             maFillHatch(rFillHatch)
     410             :         {
     411           0 :         }
     412             : 
     413        1497 :         PolyPolygonHatchPrimitive2D::PolyPolygonHatchPrimitive2D(
     414             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     415             :             const basegfx::B2DRange& rDefinitionRange,
     416             :             const basegfx::BColor& rBackgroundColor,
     417             :             const attribute::FillHatchAttribute& rFillHatch)
     418             :         :   BufferedDecompositionPrimitive2D(),
     419             :             maPolyPolygon(rPolyPolygon),
     420             :             maDefinitionRange(rDefinitionRange),
     421             :             maBackgroundColor(rBackgroundColor),
     422        1497 :             maFillHatch(rFillHatch)
     423             :         {
     424        1497 :         }
     425             : 
     426           0 :         bool PolyPolygonHatchPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     427             :         {
     428           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     429             :             {
     430           0 :                 const PolyPolygonHatchPrimitive2D& rCompare = static_cast<const PolyPolygonHatchPrimitive2D&>(rPrimitive);
     431             : 
     432           0 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     433           0 :                     && getDefinitionRange() == rCompare.getDefinitionRange()
     434           0 :                     && getBackgroundColor() == rCompare.getBackgroundColor()
     435           0 :                     && getFillHatch() == rCompare.getFillHatch());
     436             :             }
     437             : 
     438           0 :             return false;
     439             :         }
     440             : 
     441             :         // provide unique ID
     442         845 :         ImplPrimitive2DIDBlock(PolyPolygonHatchPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONHATCHPRIMITIVE2D)
     443             : 
     444             :     } // end of namespace primitive2d
     445             : } // end of namespace drawinglayer
     446             : 
     447             : 
     448             : 
     449             : namespace drawinglayer
     450             : {
     451             :     namespace primitive2d
     452             :     {
     453         410 :         Primitive2DSequence PolyPolygonGraphicPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     454             :         {
     455         410 :             if(!getFillGraphic().isDefault())
     456             :             {
     457         410 :                 const Graphic& rGraphic = getFillGraphic().getGraphic();
     458         410 :                 const GraphicType aType(rGraphic.GetType());
     459             : 
     460             :                 // is there a bitmap or a metafile (do we have content)?
     461         410 :                 if(GRAPHIC_BITMAP == aType || GRAPHIC_GDIMETAFILE == aType)
     462             :                 {
     463         410 :                     const Size aPrefSize(rGraphic.GetPrefSize());
     464             : 
     465             :                     // does content have a size?
     466         410 :                     if(aPrefSize.Width() && aPrefSize.Height())
     467             :                     {
     468             :                         // create SubSequence with FillGraphicPrimitive2D based on polygon range
     469         410 :                         const basegfx::B2DRange aOutRange(getB2DPolyPolygon().getB2DRange());
     470             :                         const basegfx::B2DHomMatrix aNewObjectTransform(
     471             :                             basegfx::tools::createScaleTranslateB2DHomMatrix(
     472             :                                 aOutRange.getRange(),
     473         410 :                                 aOutRange.getMinimum()));
     474         820 :                         Primitive2DReference xSubRef;
     475             : 
     476         410 :                         if(aOutRange != getDefinitionRange())
     477             :                         {
     478             :                             // we want to paint (tiled) content which is defined relative to DefinitionRange
     479             :                             // with the same tiling and offset(s) in the traget range of the geometry (the
     480             :                             // polygon). The range given in the local FillGraphicAttribute defines the position
     481             :                             // of the graphic in unit coordinates relative to the DefinitionRange. Transform
     482             :                             // this using DefinitionRange to get to the global definition and then with the
     483             :                             // inverse transformation from the target range to go to unit coordinates relative
     484             :                             // to that traget coordinate system.
     485           3 :                             basegfx::B2DRange aAdaptedRange(getFillGraphic().getGraphicRange());
     486             : 
     487             :                             const basegfx::B2DHomMatrix aFromDefinitionRangeToGlobal(
     488             :                                 basegfx::tools::createScaleTranslateB2DHomMatrix(
     489           3 :                                     getDefinitionRange().getRange(),
     490           6 :                                     getDefinitionRange().getMinimum()));
     491             : 
     492           3 :                             aAdaptedRange.transform(aFromDefinitionRangeToGlobal);
     493             : 
     494             :                             basegfx::B2DHomMatrix aFromGlobalToOutRange(
     495             :                                 basegfx::tools::createScaleTranslateB2DHomMatrix(
     496             :                                     aOutRange.getRange(),
     497           6 :                                     aOutRange.getMinimum()));
     498           3 :                             aFromGlobalToOutRange.invert();
     499             : 
     500           3 :                             aAdaptedRange.transform(aFromGlobalToOutRange);
     501             : 
     502             :                             const drawinglayer::attribute::FillGraphicAttribute aAdaptedFillGraphicAttribute(
     503           3 :                                 getFillGraphic().getGraphic(),
     504             :                                 aAdaptedRange,
     505           3 :                                 getFillGraphic().getTiling(),
     506           3 :                                 getFillGraphic().getOffsetX(),
     507          15 :                                 getFillGraphic().getOffsetY());
     508             : 
     509           6 :                             xSubRef = new FillGraphicPrimitive2D(
     510             :                                 aNewObjectTransform,
     511           9 :                                 aAdaptedFillGraphicAttribute);
     512             :                         }
     513             :                         else
     514             :                         {
     515         814 :                             xSubRef = new FillGraphicPrimitive2D(
     516             :                                 aNewObjectTransform,
     517         814 :                                 getFillGraphic());
     518             :                         }
     519             : 
     520             :                         // embed to mask primitive
     521             :                         const Primitive2DReference xRef(
     522             :                             new MaskPrimitive2D(
     523             :                                 getB2DPolyPolygon(),
     524         820 :                                 Primitive2DSequence(&xSubRef, 1)));
     525             : 
     526         820 :                         return Primitive2DSequence(&xRef, 1);
     527             :                     }
     528             :                 }
     529             :             }
     530             : 
     531           0 :             return Primitive2DSequence();
     532             :         }
     533             : 
     534           0 :         PolyPolygonGraphicPrimitive2D::PolyPolygonGraphicPrimitive2D(
     535             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     536             :             const attribute::FillGraphicAttribute& rFillGraphic)
     537             :         :   BufferedDecompositionPrimitive2D(),
     538             :             maPolyPolygon(rPolyPolygon),
     539             :             maDefinitionRange(rPolyPolygon.getB2DRange()),
     540           0 :             maFillGraphic(rFillGraphic)
     541             :         {
     542           0 :         }
     543             : 
     544         410 :         PolyPolygonGraphicPrimitive2D::PolyPolygonGraphicPrimitive2D(
     545             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     546             :             const basegfx::B2DRange& rDefinitionRange,
     547             :             const attribute::FillGraphicAttribute& rFillGraphic)
     548             :         :   BufferedDecompositionPrimitive2D(),
     549             :             maPolyPolygon(rPolyPolygon),
     550             :             maDefinitionRange(rDefinitionRange),
     551         410 :             maFillGraphic(rFillGraphic)
     552             :         {
     553         410 :         }
     554             : 
     555           0 :         bool PolyPolygonGraphicPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     556             :         {
     557           0 :             if(BufferedDecompositionPrimitive2D::operator==(rPrimitive))
     558             :             {
     559           0 :                 const PolyPolygonGraphicPrimitive2D& rCompare = static_cast<const PolyPolygonGraphicPrimitive2D&>(rPrimitive);
     560             : 
     561           0 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     562           0 :                     && getDefinitionRange() == rCompare.getDefinitionRange()
     563           0 :                     && getFillGraphic() == rCompare.getFillGraphic());
     564             :             }
     565             : 
     566           0 :             return false;
     567             :         }
     568             : 
     569             :         // provide unique ID
     570         378 :         ImplPrimitive2DIDBlock(PolyPolygonGraphicPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONGRAPHICPRIMITIVE2D)
     571             : 
     572             :     } // end of namespace primitive2d
     573             : } // end of namespace drawinglayer
     574             : 
     575             : 
     576             : 
     577             : namespace drawinglayer
     578             : {
     579             :     namespace primitive2d
     580             :     {
     581           0 :         Primitive2DSequence PolyPolygonSelectionPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
     582             :         {
     583           0 :             Primitive2DSequence aRetval;
     584             : 
     585           0 :             if(getTransparence() < 1.0 && getB2DPolyPolygon().count())
     586             :             {
     587           0 :                 if(getFill() && getB2DPolyPolygon().isClosed())
     588             :                 {
     589             :                     // create fill primitive
     590             :                     const Primitive2DReference aFill(
     591             :                         new PolyPolygonColorPrimitive2D(
     592             :                             getB2DPolyPolygon(),
     593           0 :                             getColor()));
     594             : 
     595           0 :                     aRetval = Primitive2DSequence(&aFill, 1);
     596             :                 }
     597             : 
     598           0 :                 if(getDiscreteGrow() > 0.0)
     599             :                 {
     600             :                     const attribute::LineAttribute aLineAttribute(
     601           0 :                         getColor(),
     602           0 :                         getDiscreteGrow() * getDiscreteUnit() * 2.0);
     603             :                     const Primitive2DReference aFatLine(
     604             :                         new PolyPolygonStrokePrimitive2D(
     605             :                             getB2DPolyPolygon(),
     606           0 :                             aLineAttribute));
     607             : 
     608           0 :                     appendPrimitive2DReferenceToPrimitive2DSequence(aRetval, aFatLine);
     609             :                 }
     610             : 
     611             :                 // embed filled to transparency (if used)
     612           0 :                 if(aRetval.getLength() && getTransparence() > 0.0)
     613             :                 {
     614             :                     const Primitive2DReference aTrans(
     615             :                         new UnifiedTransparencePrimitive2D(
     616             :                             aRetval,
     617           0 :                             getTransparence()));
     618             : 
     619           0 :                     aRetval = Primitive2DSequence(&aTrans, 1);
     620             :                 }
     621             :             }
     622             : 
     623           0 :             return aRetval;
     624             :         }
     625             : 
     626           0 :         PolyPolygonSelectionPrimitive2D::PolyPolygonSelectionPrimitive2D(
     627             :             const basegfx::B2DPolyPolygon& rPolyPolygon,
     628             :             const basegfx::BColor& rColor,
     629             :             double fTransparence,
     630             :             double fDiscreteGrow,
     631             :             bool bFill)
     632             :         :   DiscreteMetricDependentPrimitive2D(),
     633             :             maPolyPolygon(rPolyPolygon),
     634             :             maColor(rColor),
     635             :             mfTransparence(fTransparence),
     636           0 :             mfDiscreteGrow(fabs(fDiscreteGrow)),
     637           0 :             mbFill(bFill)
     638             :         {
     639           0 :         }
     640             : 
     641           0 :         bool PolyPolygonSelectionPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const
     642             :         {
     643           0 :             if(DiscreteMetricDependentPrimitive2D::operator==(rPrimitive))
     644             :             {
     645           0 :                 const PolyPolygonSelectionPrimitive2D& rCompare = static_cast<const PolyPolygonSelectionPrimitive2D&>(rPrimitive);
     646             : 
     647           0 :                 return (getB2DPolyPolygon() == rCompare.getB2DPolyPolygon()
     648           0 :                     && getColor() == rCompare.getColor()
     649           0 :                     && getTransparence() == rCompare.getTransparence()
     650           0 :                     && getDiscreteGrow() == rCompare.getDiscreteGrow()
     651           0 :                     && getFill() == rCompare.getFill());
     652             :             }
     653             : 
     654           0 :             return false;
     655             :         }
     656             : 
     657           0 :         basegfx::B2DRange PolyPolygonSelectionPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const
     658             :         {
     659           0 :             basegfx::B2DRange aRetval(basegfx::tools::getRange(getB2DPolyPolygon()));
     660             : 
     661           0 :             if(getDiscreteGrow() > 0.0)
     662             :             {
     663             :                 // get the current DiscreteUnit (not sure if getDiscreteUnit() is updated here, better go safe way)
     664           0 :                 const double fDiscreteUnit((rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 0.0)).getLength());
     665             : 
     666           0 :                 aRetval.grow(fDiscreteUnit * getDiscreteGrow());
     667             :             }
     668             : 
     669           0 :             return aRetval;
     670             :         }
     671             : 
     672             :         // provide unique ID
     673           0 :         ImplPrimitive2DIDBlock(PolyPolygonSelectionPrimitive2D, PRIMITIVE2D_ID_POLYPOLYGONSELECTIONPRIMITIVE2D)
     674             : 
     675             :     } // end of namespace primitive2d
     676             : } // end of namespace drawinglayer
     677             : 
     678             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11