xref: /AOO41X/main/drawinglayer/source/attribute/sdrlightattribute3d.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/sdrlightattribute3d.hxx>
26 #include <basegfx/color/bcolor.hxx>
27 #include <basegfx/vector/b3dvector.hxx>
28 
29 //////////////////////////////////////////////////////////////////////////////
30 
31 namespace drawinglayer
32 {
33     namespace attribute
34     {
35         class ImpSdr3DLightAttribute
36         {
37         public:
38             // refcounter
39             sal_uInt32                              mnRefCount;
40 
41             // 3D light attribute definitions
42             basegfx::BColor                         maColor;
43             basegfx::B3DVector                      maDirection;
44 
45             // bitfield
46             unsigned                                mbSpecular : 1;
47 
ImpSdr3DLightAttribute(const basegfx::BColor & rColor,const basegfx::B3DVector & rDirection,bool bSpecular)48             ImpSdr3DLightAttribute(
49                 const basegfx::BColor& rColor,
50                 const basegfx::B3DVector& rDirection,
51                 bool bSpecular)
52             :   mnRefCount(0),
53                 maColor(rColor),
54                 maDirection(rDirection),
55                 mbSpecular(bSpecular)
56             {
57             }
58 
59             // data read access
getColor() const60             const basegfx::BColor& getColor() const { return maColor; }
getDirection() const61             const basegfx::B3DVector& getDirection() const { return maDirection; }
getSpecular() const62             bool getSpecular() const { return mbSpecular; }
63 
operator ==(const ImpSdr3DLightAttribute & rCandidate) const64             bool operator==(const ImpSdr3DLightAttribute& rCandidate) const
65             {
66                 return (getColor() == rCandidate.getColor()
67                     && getDirection() == rCandidate.getDirection()
68                     && getSpecular() == rCandidate.getSpecular());
69             }
70 
get_global_default()71             static ImpSdr3DLightAttribute* get_global_default()
72             {
73                 static ImpSdr3DLightAttribute* pDefault = 0;
74 
75                 if(!pDefault)
76                 {
77                     pDefault = new ImpSdr3DLightAttribute(
78                         basegfx::BColor(),
79                         basegfx::B3DVector(),
80                         false);
81 
82                     // never delete; start with RefCount 1, not 0
83                     pDefault->mnRefCount++;
84                 }
85 
86                 return pDefault;
87             }
88         };
89 
Sdr3DLightAttribute(const basegfx::BColor & rColor,const basegfx::B3DVector & rDirection,bool bSpecular)90         Sdr3DLightAttribute::Sdr3DLightAttribute(
91             const basegfx::BColor& rColor,
92             const basegfx::B3DVector& rDirection,
93             bool bSpecular)
94         :   mpSdr3DLightAttribute(new ImpSdr3DLightAttribute(
95                 rColor, rDirection, bSpecular))
96         {
97         }
98 
Sdr3DLightAttribute()99         Sdr3DLightAttribute::Sdr3DLightAttribute()
100         :   mpSdr3DLightAttribute(ImpSdr3DLightAttribute::get_global_default())
101         {
102             mpSdr3DLightAttribute->mnRefCount++;
103         }
104 
Sdr3DLightAttribute(const Sdr3DLightAttribute & rCandidate)105         Sdr3DLightAttribute::Sdr3DLightAttribute(const Sdr3DLightAttribute& rCandidate)
106         :   mpSdr3DLightAttribute(rCandidate.mpSdr3DLightAttribute)
107         {
108             mpSdr3DLightAttribute->mnRefCount++;
109         }
110 
~Sdr3DLightAttribute()111         Sdr3DLightAttribute::~Sdr3DLightAttribute()
112         {
113             if(mpSdr3DLightAttribute->mnRefCount)
114             {
115                 mpSdr3DLightAttribute->mnRefCount--;
116             }
117             else
118             {
119                 delete mpSdr3DLightAttribute;
120             }
121         }
122 
isDefault() const123         bool Sdr3DLightAttribute::isDefault() const
124         {
125             return mpSdr3DLightAttribute == ImpSdr3DLightAttribute::get_global_default();
126         }
127 
operator =(const Sdr3DLightAttribute & rCandidate)128         Sdr3DLightAttribute& Sdr3DLightAttribute::operator=(const Sdr3DLightAttribute& rCandidate)
129         {
130             if(rCandidate.mpSdr3DLightAttribute != mpSdr3DLightAttribute)
131             {
132                 if(mpSdr3DLightAttribute->mnRefCount)
133                 {
134                     mpSdr3DLightAttribute->mnRefCount--;
135                 }
136                 else
137                 {
138                     delete mpSdr3DLightAttribute;
139                 }
140 
141                 mpSdr3DLightAttribute = rCandidate.mpSdr3DLightAttribute;
142                 mpSdr3DLightAttribute->mnRefCount++;
143             }
144 
145             return *this;
146         }
147 
operator ==(const Sdr3DLightAttribute & rCandidate) const148         bool Sdr3DLightAttribute::operator==(const Sdr3DLightAttribute& rCandidate) const
149         {
150             if(rCandidate.mpSdr3DLightAttribute == mpSdr3DLightAttribute)
151             {
152                 return true;
153             }
154 
155             if(rCandidate.isDefault() != isDefault())
156             {
157                 return false;
158             }
159 
160             return (*rCandidate.mpSdr3DLightAttribute == *mpSdr3DLightAttribute);
161         }
162 
getColor() const163         const basegfx::BColor& Sdr3DLightAttribute::getColor() const
164         {
165             return mpSdr3DLightAttribute->getColor();
166         }
167 
getDirection() const168         const basegfx::B3DVector& Sdr3DLightAttribute::getDirection() const
169         {
170             return mpSdr3DLightAttribute->getDirection();
171         }
172 
getSpecular() const173         bool Sdr3DLightAttribute::getSpecular() const
174         {
175             return mpSdr3DLightAttribute->getSpecular();
176         }
177 
178     } // end of namespace attribute
179 } // end of namespace drawinglayer
180 
181 //////////////////////////////////////////////////////////////////////////////
182 // eof
183