xref: /AOO41X/main/drawinglayer/source/attribute/strokeattribute.cxx (revision 464702f4578bd67db020a330afd07883930c5e07)
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 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_drawinglayer.hxx"
26 
27 #include <drawinglayer/attribute/strokeattribute.hxx>
28 #include <numeric>
29 
30 //////////////////////////////////////////////////////////////////////////////
31 
32 namespace drawinglayer
33 {
34     namespace attribute
35     {
36         class ImpStrokeAttribute
37         {
38         public:
39             // refcounter
40             sal_uInt32                              mnRefCount;
41 
42             // data definitions
43             ::std::vector< double >                     maDotDashArray;         // array of double which defines the dot-dash pattern
44             double                                      mfFullDotDashLen;       // sum of maDotDashArray (for convenience)
45 
ImpStrokeAttribute(const::std::vector<double> & rDotDashArray,double fFullDotDashLen)46             ImpStrokeAttribute(
47                 const ::std::vector< double >& rDotDashArray,
48                 double fFullDotDashLen)
49             :   mnRefCount(0),
50                 maDotDashArray(rDotDashArray),
51                 mfFullDotDashLen(fFullDotDashLen)
52             {
53             }
54 
55             // data read access
getDotDashArray() const56             const ::std::vector< double >& getDotDashArray() const { return maDotDashArray; }
getFullDotDashLen() const57             double getFullDotDashLen() const
58             {
59                 if(0.0 == mfFullDotDashLen && maDotDashArray.size())
60                 {
61                     // calculate length on demand
62                     const double fAccumulated(::std::accumulate(maDotDashArray.begin(), maDotDashArray.end(), 0.0));
63                     const_cast< ImpStrokeAttribute* >(this)->mfFullDotDashLen = fAccumulated;
64                 }
65 
66                 return mfFullDotDashLen;
67             }
68 
operator ==(const ImpStrokeAttribute & rCandidate) const69             bool operator==(const ImpStrokeAttribute& rCandidate) const
70             {
71                 return (getDotDashArray() == rCandidate.getDotDashArray()
72                     && getFullDotDashLen() == rCandidate.getFullDotDashLen());
73             }
74 
get_global_default()75             static ImpStrokeAttribute* get_global_default()
76             {
77                 static ImpStrokeAttribute* pDefault = 0;
78 
79                 if(!pDefault)
80                 {
81                     pDefault = new ImpStrokeAttribute(
82                         std::vector< double >(),
83                         0.0);
84 
85                     // never delete; start with RefCount 1, not 0
86                     pDefault->mnRefCount++;
87                 }
88 
89                 return pDefault;
90             }
91         };
92 
StrokeAttribute(const::std::vector<double> & rDotDashArray,double fFullDotDashLen)93         StrokeAttribute::StrokeAttribute(
94             const ::std::vector< double >& rDotDashArray,
95             double fFullDotDashLen)
96         :   mpStrokeAttribute(new ImpStrokeAttribute(
97                 rDotDashArray, fFullDotDashLen))
98         {
99         }
100 
StrokeAttribute()101         StrokeAttribute::StrokeAttribute()
102         :   mpStrokeAttribute(ImpStrokeAttribute::get_global_default())
103         {
104             mpStrokeAttribute->mnRefCount++;
105         }
106 
StrokeAttribute(const StrokeAttribute & rCandidate)107         StrokeAttribute::StrokeAttribute(const StrokeAttribute& rCandidate)
108         :   mpStrokeAttribute(rCandidate.mpStrokeAttribute)
109         {
110             mpStrokeAttribute->mnRefCount++;
111         }
112 
~StrokeAttribute()113         StrokeAttribute::~StrokeAttribute()
114         {
115             if(mpStrokeAttribute->mnRefCount)
116             {
117                 mpStrokeAttribute->mnRefCount--;
118             }
119             else
120             {
121                 delete mpStrokeAttribute;
122             }
123         }
124 
isDefault() const125         bool StrokeAttribute::isDefault() const
126         {
127             return mpStrokeAttribute == ImpStrokeAttribute::get_global_default();
128         }
129 
operator =(const StrokeAttribute & rCandidate)130         StrokeAttribute& StrokeAttribute::operator=(const StrokeAttribute& rCandidate)
131         {
132             if(rCandidate.mpStrokeAttribute != mpStrokeAttribute)
133             {
134                 if(mpStrokeAttribute->mnRefCount)
135                 {
136                     mpStrokeAttribute->mnRefCount--;
137                 }
138                 else
139                 {
140                     delete mpStrokeAttribute;
141                 }
142 
143                 mpStrokeAttribute = rCandidate.mpStrokeAttribute;
144                 mpStrokeAttribute->mnRefCount++;
145             }
146 
147             return *this;
148         }
149 
operator ==(const StrokeAttribute & rCandidate) const150         bool StrokeAttribute::operator==(const StrokeAttribute& rCandidate) const
151         {
152             if(rCandidate.mpStrokeAttribute == mpStrokeAttribute)
153             {
154                 return true;
155             }
156 
157             if(rCandidate.isDefault() != isDefault())
158             {
159                 return false;
160             }
161 
162             return (*rCandidate.mpStrokeAttribute == *mpStrokeAttribute);
163         }
164 
getDotDashArray() const165         const ::std::vector< double >& StrokeAttribute::getDotDashArray() const
166         {
167             return mpStrokeAttribute->getDotDashArray();
168         }
169 
getFullDotDashLen() const170         double StrokeAttribute::getFullDotDashLen() const
171         {
172             return mpStrokeAttribute->getFullDotDashLen();
173         }
174     } // end of namespace attribute
175 } // end of namespace drawinglayer
176 
177 //////////////////////////////////////////////////////////////////////////////
178 // eof
179