xref: /trunk/main/drawinglayer/source/primitive3d/polygonprimitive3d.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_drawinglayer.hxx"
30 
31 #include <drawinglayer/primitive3d/polygonprimitive3d.hxx>
32 #include <basegfx/polygon/b3dpolygontools.hxx>
33 #include <basegfx/tools/canvastools.hxx>
34 #include <basegfx/polygon/b3dpolypolygontools.hxx>
35 #include <drawinglayer/primitive3d/polygontubeprimitive3d.hxx>
36 #include <drawinglayer/primitive3d/drawinglayer_primitivetypes3d.hxx>
37 
38 //////////////////////////////////////////////////////////////////////////////
39 
40 using namespace com::sun::star;
41 
42 //////////////////////////////////////////////////////////////////////////////
43 
44 namespace drawinglayer
45 {
46     namespace primitive3d
47     {
48         PolygonHairlinePrimitive3D::PolygonHairlinePrimitive3D(
49             const basegfx::B3DPolygon& rPolygon,
50             const basegfx::BColor& rBColor)
51         :   BasePrimitive3D(),
52             maPolygon(rPolygon),
53             maBColor(rBColor)
54         {
55         }
56 
57         bool PolygonHairlinePrimitive3D::operator==(const BasePrimitive3D& rPrimitive) const
58         {
59             if(BasePrimitive3D::operator==(rPrimitive))
60             {
61                 const PolygonHairlinePrimitive3D& rCompare = (PolygonHairlinePrimitive3D&)rPrimitive;
62 
63                 return (getB3DPolygon() == rCompare.getB3DPolygon()
64                     && getBColor() == rCompare.getBColor());
65             }
66 
67             return false;
68         }
69 
70         basegfx::B3DRange PolygonHairlinePrimitive3D::getB3DRange(const geometry::ViewInformation3D& /*rViewInformation*/) const
71         {
72             return basegfx::tools::getRange(getB3DPolygon());
73         }
74 
75         // provide unique ID
76         ImplPrimitrive3DIDBlock(PolygonHairlinePrimitive3D, PRIMITIVE3D_ID_POLYGONHAIRLINEPRIMITIVE3D)
77 
78     } // end of namespace primitive3d
79 } // end of namespace drawinglayer
80 
81 //////////////////////////////////////////////////////////////////////////////
82 
83 namespace drawinglayer
84 {
85     namespace primitive3d
86     {
87         Primitive3DSequence PolygonStrokePrimitive3D::create3DDecomposition(const geometry::ViewInformation3D& /*rViewInformation*/) const
88         {
89             Primitive3DSequence aRetval;
90 
91             if(getB3DPolygon().count())
92             {
93                 basegfx::B3DPolyPolygon aHairLinePolyPolygon;
94 
95                 if(0.0 == getStrokeAttribute().getFullDotDashLen())
96                 {
97                     aHairLinePolyPolygon = basegfx::B3DPolyPolygon(getB3DPolygon());
98                 }
99                 else
100                 {
101                     // apply LineStyle
102                     basegfx::tools::applyLineDashing(getB3DPolygon(), getStrokeAttribute().getDotDashArray(), &aHairLinePolyPolygon, 0, getStrokeAttribute().getFullDotDashLen());
103                 }
104 
105                 // prepare result
106                 aRetval.realloc(aHairLinePolyPolygon.count());
107 
108                 if(getLineAttribute().getWidth())
109                 {
110                     // create fat line data
111                     const double fRadius(getLineAttribute().getWidth() / 2.0);
112                     const basegfx::B2DLineJoin aLineJoin(getLineAttribute().getLineJoin());
113 
114                     for(sal_uInt32 a(0L); a < aHairLinePolyPolygon.count(); a++)
115                     {
116                         // create tube primitives
117                         const Primitive3DReference xRef(new PolygonTubePrimitive3D(aHairLinePolyPolygon.getB3DPolygon(a), getLineAttribute().getColor(), fRadius, aLineJoin));
118                         aRetval[a] = xRef;
119                     }
120                 }
121                 else
122                 {
123                     // create hair line data for all sub polygons
124                     for(sal_uInt32 a(0L); a < aHairLinePolyPolygon.count(); a++)
125                     {
126                         const basegfx::B3DPolygon aCandidate = aHairLinePolyPolygon.getB3DPolygon(a);
127                         const Primitive3DReference xRef(new PolygonHairlinePrimitive3D(aCandidate, getLineAttribute().getColor()));
128                         aRetval[a] = xRef;
129                     }
130                 }
131             }
132 
133             return aRetval;
134         }
135 
136         PolygonStrokePrimitive3D::PolygonStrokePrimitive3D(
137             const basegfx::B3DPolygon& rPolygon,
138             const attribute::LineAttribute& rLineAttribute,
139             const attribute::StrokeAttribute& rStrokeAttribute)
140         :   BufferedDecompositionPrimitive3D(),
141             maPolygon(rPolygon),
142             maLineAttribute(rLineAttribute),
143             maStrokeAttribute(rStrokeAttribute)
144         {
145         }
146 
147         PolygonStrokePrimitive3D::PolygonStrokePrimitive3D(
148             const basegfx::B3DPolygon& rPolygon,
149             const attribute::LineAttribute& rLineAttribute)
150         :   BufferedDecompositionPrimitive3D(),
151             maPolygon(rPolygon),
152             maLineAttribute(rLineAttribute),
153             maStrokeAttribute()
154         {
155         }
156 
157         bool PolygonStrokePrimitive3D::operator==(const BasePrimitive3D& rPrimitive) const
158         {
159             if(BufferedDecompositionPrimitive3D::operator==(rPrimitive))
160             {
161                 const PolygonStrokePrimitive3D& rCompare = (PolygonStrokePrimitive3D&)rPrimitive;
162 
163                 return (getB3DPolygon() == rCompare.getB3DPolygon()
164                     && getLineAttribute() == rCompare.getLineAttribute()
165                     && getStrokeAttribute() == rCompare.getStrokeAttribute());
166             }
167 
168             return false;
169         }
170 
171         // provide unique ID
172         ImplPrimitrive3DIDBlock(PolygonStrokePrimitive3D, PRIMITIVE3D_ID_POLYGONSTROKEPRIMITIVE3D)
173 
174     } // end of namespace primitive3d
175 } // end of namespace drawinglayer
176 
177 //////////////////////////////////////////////////////////////////////////////
178 // eof
179