xref: /AOO41X/main/drawinglayer/source/attribute/sdrlineattribute.cxx (revision 4bfbcde8d64cc5d114df10dce4a9ed79eff32278)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_drawinglayer.hxx"
24 
25 #include <drawinglayer/attribute/sdrlineattribute.hxx>
26 #include <basegfx/color/bcolor.hxx>
27 
28 //////////////////////////////////////////////////////////////////////////////
29 
30 namespace drawinglayer
31 {
32     namespace attribute
33     {
34         class ImpSdrLineAttribute
35         {
36         public:
37             // refcounter
38             sal_uInt32                              mnRefCount;
39 
40             // line definitions
41             basegfx::B2DLineJoin                    meJoin;             // B2DLINEJOIN_* defines
42             double                                  mfWidth;            // 1/100th mm, 0.0==hair
43             double                                  mfTransparence;     // [0.0 .. 1.0], 0.0==no transp.
44             basegfx::BColor                         maColor;            // color of line
45             com::sun::star::drawing::LineCap        meCap;              // BUTT, ROUND, or SQUARE
46             ::std::vector< double >                 maDotDashArray;     // array of double which defines the dot-dash pattern
47             double                                  mfFullDotDashLen;   // sum of maDotDashArray (for convenience)
48 
ImpSdrLineAttribute(basegfx::B2DLineJoin eJoin,double fWidth,double fTransparence,const basegfx::BColor & rColor,com::sun::star::drawing::LineCap eCap,const::std::vector<double> & rDotDashArray,double fFullDotDashLen)49             ImpSdrLineAttribute(
50                 basegfx::B2DLineJoin eJoin,
51                 double fWidth,
52                 double fTransparence,
53                 const basegfx::BColor& rColor,
54                 com::sun::star::drawing::LineCap eCap,
55                 const ::std::vector< double >& rDotDashArray,
56                 double fFullDotDashLen)
57             :   mnRefCount(0),
58                 meJoin(eJoin),
59                 mfWidth(fWidth),
60                 mfTransparence(fTransparence),
61                 maColor(rColor),
62                 meCap(eCap),
63                 maDotDashArray(rDotDashArray),
64                 mfFullDotDashLen(fFullDotDashLen)
65             {
66             }
67 
ImpSdrLineAttribute(const basegfx::BColor & rColor)68             ImpSdrLineAttribute(const basegfx::BColor& rColor)
69             :   mnRefCount(0),
70                 meJoin(basegfx::B2DLINEJOIN_NONE),
71                 mfWidth(0.0),
72                 mfTransparence(0.0),
73                 maColor(rColor),
74                 meCap(com::sun::star::drawing::LineCap_BUTT),
75                 maDotDashArray(),
76                 mfFullDotDashLen(0.0)
77             {
78             }
79 
80             // data read access
getJoin() const81             basegfx::B2DLineJoin getJoin() const { return meJoin; }
getWidth() const82             double getWidth() const { return mfWidth; }
getTransparence() const83             double getTransparence() const { return mfTransparence; }
getColor() const84             const basegfx::BColor& getColor() const { return maColor; }
getCap() const85             com::sun::star::drawing::LineCap getCap() const { return meCap; }
getDotDashArray() const86             const ::std::vector< double >& getDotDashArray() const { return maDotDashArray; }
getFullDotDashLen() const87             double getFullDotDashLen() const { return mfFullDotDashLen; }
88 
operator ==(const ImpSdrLineAttribute & rCandidate) const89             bool operator==(const ImpSdrLineAttribute& rCandidate) const
90             {
91                 return (getJoin() == rCandidate.getJoin()
92                     && getWidth() == rCandidate.getWidth()
93                     && getTransparence() == rCandidate.getTransparence()
94                     && getColor() == rCandidate.getColor()
95                     && getCap() == rCandidate.getCap()
96                     && getDotDashArray() == rCandidate.getDotDashArray());
97             }
98 
get_global_default()99             static ImpSdrLineAttribute* get_global_default()
100             {
101                 static ImpSdrLineAttribute* pDefault = 0;
102 
103                 if(!pDefault)
104                 {
105                     pDefault = new ImpSdrLineAttribute(
106                         basegfx::B2DLINEJOIN_ROUND,
107                         0.0,
108                         0.0,
109                         basegfx::BColor(),
110                         com::sun::star::drawing::LineCap_BUTT,
111                         std::vector< double >(),
112                         0.0);
113 
114                     // never delete; start with RefCount 1, not 0
115                     pDefault->mnRefCount++;
116                 }
117 
118                 return pDefault;
119             }
120         };
121 
SdrLineAttribute(basegfx::B2DLineJoin eJoin,double fWidth,double fTransparence,const basegfx::BColor & rColor,com::sun::star::drawing::LineCap eCap,const::std::vector<double> & rDotDashArray,double fFullDotDashLen)122         SdrLineAttribute::SdrLineAttribute(
123             basegfx::B2DLineJoin eJoin,
124             double fWidth,
125             double fTransparence,
126             const basegfx::BColor& rColor,
127             com::sun::star::drawing::LineCap eCap,
128             const ::std::vector< double >& rDotDashArray,
129             double fFullDotDashLen)
130         :   mpSdrLineAttribute(
131                 new ImpSdrLineAttribute(
132                     eJoin,
133                     fWidth,
134                     fTransparence,
135                     rColor,
136                     eCap,
137                     rDotDashArray,
138                     fFullDotDashLen))
139         {
140         }
141 
SdrLineAttribute(const basegfx::BColor & rColor)142         SdrLineAttribute::SdrLineAttribute(
143             const basegfx::BColor& rColor)
144         :   mpSdrLineAttribute(
145                 new ImpSdrLineAttribute(
146                     rColor))
147         {
148         }
149 
SdrLineAttribute()150         SdrLineAttribute::SdrLineAttribute()
151         :   mpSdrLineAttribute(ImpSdrLineAttribute::get_global_default())
152         {
153             mpSdrLineAttribute->mnRefCount++;
154         }
155 
SdrLineAttribute(const SdrLineAttribute & rCandidate)156         SdrLineAttribute::SdrLineAttribute(const SdrLineAttribute& rCandidate)
157         :   mpSdrLineAttribute(rCandidate.mpSdrLineAttribute)
158         {
159             mpSdrLineAttribute->mnRefCount++;
160         }
161 
~SdrLineAttribute()162         SdrLineAttribute::~SdrLineAttribute()
163         {
164             if(mpSdrLineAttribute->mnRefCount)
165             {
166                 mpSdrLineAttribute->mnRefCount--;
167             }
168             else
169             {
170                 delete mpSdrLineAttribute;
171             }
172         }
173 
isDefault() const174         bool SdrLineAttribute::isDefault() const
175         {
176             return mpSdrLineAttribute == ImpSdrLineAttribute::get_global_default();
177         }
178 
operator =(const SdrLineAttribute & rCandidate)179         SdrLineAttribute& SdrLineAttribute::operator=(const SdrLineAttribute& rCandidate)
180         {
181             if(rCandidate.mpSdrLineAttribute != mpSdrLineAttribute)
182             {
183                 if(mpSdrLineAttribute->mnRefCount)
184                 {
185                     mpSdrLineAttribute->mnRefCount--;
186                 }
187                 else
188                 {
189                     delete mpSdrLineAttribute;
190                 }
191 
192                 mpSdrLineAttribute = rCandidate.mpSdrLineAttribute;
193                 mpSdrLineAttribute->mnRefCount++;
194             }
195 
196             return *this;
197         }
198 
operator ==(const SdrLineAttribute & rCandidate) const199         bool SdrLineAttribute::operator==(const SdrLineAttribute& rCandidate) const
200         {
201             if(rCandidate.mpSdrLineAttribute == mpSdrLineAttribute)
202             {
203                 return true;
204             }
205 
206             if(rCandidate.isDefault() != isDefault())
207             {
208                 return false;
209             }
210 
211             return (*rCandidate.mpSdrLineAttribute == *mpSdrLineAttribute);
212         }
213 
getJoin() const214         basegfx::B2DLineJoin SdrLineAttribute::getJoin() const
215         {
216             return mpSdrLineAttribute->getJoin();
217         }
218 
getWidth() const219         double SdrLineAttribute::getWidth() const
220         {
221             return mpSdrLineAttribute->getWidth();
222         }
223 
getTransparence() const224         double SdrLineAttribute::getTransparence() const
225         {
226             return mpSdrLineAttribute->getTransparence();
227         }
228 
getColor() const229         const basegfx::BColor& SdrLineAttribute::getColor() const
230         {
231             return mpSdrLineAttribute->getColor();
232         }
233 
getDotDashArray() const234         const ::std::vector< double >& SdrLineAttribute::getDotDashArray() const
235         {
236             return mpSdrLineAttribute->getDotDashArray();
237         }
238 
getFullDotDashLen() const239         double SdrLineAttribute::getFullDotDashLen() const
240         {
241             return mpSdrLineAttribute->getFullDotDashLen();
242         }
243 
isDashed() const244         bool SdrLineAttribute::isDashed() const
245         {
246             return (0L != getDotDashArray().size());
247         }
248 
getCap() const249         com::sun::star::drawing::LineCap SdrLineAttribute::getCap() const
250         {
251             return mpSdrLineAttribute->getCap();
252         }
253 
254     } // end of namespace attribute
255 } // end of namespace drawinglayer
256 
257 //////////////////////////////////////////////////////////////////////////////
258 // eof
259