xref: /trunk/main/drawinglayer/source/attribute/lineattribute.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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/attribute/lineattribute.hxx>
32 #include <basegfx/color/bcolor.hxx>
33 
34 //////////////////////////////////////////////////////////////////////////////
35 
36 namespace drawinglayer
37 {
38     namespace attribute
39     {
40         class ImpLineAttribute
41         {
42         public:
43             // refcounter
44             sal_uInt32                              mnRefCount;
45 
46             // data definitions
47             basegfx::BColor                         maColor;                // color
48             double                                  mfWidth;                // absolute line width
49             basegfx::B2DLineJoin                    meLineJoin;             // type of LineJoin
50 
51             ImpLineAttribute(
52                 const basegfx::BColor& rColor,
53                 double fWidth,
54                 basegfx::B2DLineJoin aB2DLineJoin)
55             :   mnRefCount(0),
56                 maColor(rColor),
57                 mfWidth(fWidth),
58                 meLineJoin(aB2DLineJoin)
59             {
60             }
61 
62             // data read access
63             const basegfx::BColor& getColor() const { return maColor; }
64             double getWidth() const { return mfWidth; }
65             basegfx::B2DLineJoin getLineJoin() const { return meLineJoin; }
66 
67             bool operator==(const ImpLineAttribute& rCandidate) const
68             {
69                 return (getColor() == rCandidate.getColor()
70                     && getWidth() == rCandidate.getWidth()
71                     && getLineJoin() == rCandidate.getLineJoin());
72             }
73 
74             static ImpLineAttribute* get_global_default()
75             {
76                 static ImpLineAttribute* pDefault = 0;
77 
78                 if(!pDefault)
79                 {
80                     pDefault = new ImpLineAttribute(
81                         basegfx::BColor(),
82                         0.0,
83                         basegfx::B2DLINEJOIN_ROUND);
84 
85                     // never delete; start with RefCount 1, not 0
86                     pDefault->mnRefCount++;
87                 }
88 
89                 return pDefault;
90             }
91         };
92 
93         LineAttribute::LineAttribute(
94             const basegfx::BColor& rColor,
95             double fWidth,
96             basegfx::B2DLineJoin aB2DLineJoin)
97         :   mpLineAttribute(new ImpLineAttribute(
98                 rColor, fWidth, aB2DLineJoin))
99         {
100         }
101 
102         LineAttribute::LineAttribute()
103         :   mpLineAttribute(ImpLineAttribute::get_global_default())
104         {
105             mpLineAttribute->mnRefCount++;
106         }
107 
108         LineAttribute::LineAttribute(const LineAttribute& rCandidate)
109         :   mpLineAttribute(rCandidate.mpLineAttribute)
110         {
111             mpLineAttribute->mnRefCount++;
112         }
113 
114         LineAttribute::~LineAttribute()
115         {
116             if(mpLineAttribute->mnRefCount)
117             {
118                 mpLineAttribute->mnRefCount--;
119             }
120             else
121             {
122                 delete mpLineAttribute;
123             }
124         }
125 
126         bool LineAttribute::isDefault() const
127         {
128             return mpLineAttribute == ImpLineAttribute::get_global_default();
129         }
130 
131         LineAttribute& LineAttribute::operator=(const LineAttribute& rCandidate)
132         {
133             if(rCandidate.mpLineAttribute != mpLineAttribute)
134             {
135                 if(mpLineAttribute->mnRefCount)
136                 {
137                     mpLineAttribute->mnRefCount--;
138                 }
139                 else
140                 {
141                     delete mpLineAttribute;
142                 }
143 
144                 mpLineAttribute = rCandidate.mpLineAttribute;
145                 mpLineAttribute->mnRefCount++;
146             }
147 
148             return *this;
149         }
150 
151         bool LineAttribute::operator==(const LineAttribute& rCandidate) const
152         {
153             if(rCandidate.mpLineAttribute == mpLineAttribute)
154             {
155                 return true;
156             }
157 
158             if(rCandidate.isDefault() != isDefault())
159             {
160                 return false;
161             }
162 
163             return (*rCandidate.mpLineAttribute == *mpLineAttribute);
164         }
165 
166         const basegfx::BColor& LineAttribute::getColor() const
167         {
168             return mpLineAttribute->getColor();
169         }
170 
171         double LineAttribute::getWidth() const
172         {
173             return mpLineAttribute->getWidth();
174         }
175 
176         basegfx::B2DLineJoin LineAttribute::getLineJoin() const
177         {
178             return mpLineAttribute->getLineJoin();
179         }
180 
181     } // end of namespace attribute
182 } // end of namespace drawinglayer
183 
184 //////////////////////////////////////////////////////////////////////////////
185 // eof
186