xref: /AOO41X/main/drawinglayer/source/attribute/materialattribute3d.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/materialattribute3d.hxx>
28 #include <basegfx/color/bcolor.hxx>
29 
30 //////////////////////////////////////////////////////////////////////////////
31 
32 namespace drawinglayer
33 {
34     namespace attribute
35     {
36         class ImpMaterialAttribute3D
37         {
38         public:
39             // refcounter
40             sal_uInt32                              mnRefCount;
41 
42             // materialAttribute3D definitions
43             basegfx::BColor                         maColor;                // object color
44             basegfx::BColor                         maSpecular;             // material specular color
45             basegfx::BColor                         maEmission;             // material emissive color
46             sal_uInt16                              mnSpecularIntensity;    // material specular intensity [0..128]
47 
ImpMaterialAttribute3D(const basegfx::BColor & rColor,const basegfx::BColor & rSpecular,const basegfx::BColor & rEmission,sal_uInt16 nSpecularIntensity)48             ImpMaterialAttribute3D(const basegfx::BColor& rColor, const basegfx::BColor& rSpecular, const basegfx::BColor& rEmission, sal_uInt16 nSpecularIntensity)
49             :   mnRefCount(0),
50                 maColor(rColor),
51                 maSpecular(rSpecular),
52                 maEmission(rEmission),
53                 mnSpecularIntensity(nSpecularIntensity)
54             {
55             }
56 
ImpMaterialAttribute3D(const basegfx::BColor & rColor)57             ImpMaterialAttribute3D(const basegfx::BColor& rColor)
58             :   mnRefCount(0),
59                 maColor(rColor),
60                 maSpecular(1.0, 1.0, 1.0),
61                 maEmission(),
62                 mnSpecularIntensity(15)
63             {
64             }
65 
66             // data read access
getColor() const67             const basegfx::BColor& getColor() const { return maColor; }
getSpecular() const68             const basegfx::BColor& getSpecular() const { return maSpecular; }
getEmission() const69             const basegfx::BColor& getEmission() const { return maEmission; }
getSpecularIntensity() const70             sal_uInt16 getSpecularIntensity() const { return mnSpecularIntensity; }
71 
operator ==(const ImpMaterialAttribute3D & rCandidate) const72             bool operator==(const ImpMaterialAttribute3D& rCandidate) const
73             {
74                 return (getColor() == rCandidate.getColor()
75                     && getSpecular() == rCandidate.getSpecular()
76                     && getEmission() == rCandidate.getEmission()
77                     && getSpecularIntensity() == rCandidate.getSpecularIntensity());
78             }
79 
get_global_default()80             static ImpMaterialAttribute3D* get_global_default()
81             {
82                 static ImpMaterialAttribute3D* pDefault = 0;
83 
84                 if(!pDefault)
85                 {
86                     pDefault = new ImpMaterialAttribute3D(
87                         basegfx::BColor(),
88                         basegfx::BColor(),
89                         basegfx::BColor(),
90                         0);
91 
92                     // never delete; start with RefCount 1, not 0
93                     pDefault->mnRefCount++;
94                 }
95 
96                 return pDefault;
97             }
98         };
99 
MaterialAttribute3D(const basegfx::BColor & rColor,const basegfx::BColor & rSpecular,const basegfx::BColor & rEmission,sal_uInt16 nSpecularIntensity)100         MaterialAttribute3D::MaterialAttribute3D(
101             const basegfx::BColor& rColor,
102             const basegfx::BColor& rSpecular,
103             const basegfx::BColor& rEmission,
104             sal_uInt16 nSpecularIntensity)
105         :   mpMaterialAttribute3D(new ImpMaterialAttribute3D(
106                 rColor, rSpecular, rEmission, nSpecularIntensity))
107         {
108         }
109 
MaterialAttribute3D(const basegfx::BColor & rColor)110         MaterialAttribute3D::MaterialAttribute3D(
111             const basegfx::BColor& rColor)
112         :   mpMaterialAttribute3D(new ImpMaterialAttribute3D(rColor))
113         {
114         }
115 
MaterialAttribute3D()116         MaterialAttribute3D::MaterialAttribute3D()
117         :   mpMaterialAttribute3D(ImpMaterialAttribute3D::get_global_default())
118         {
119             mpMaterialAttribute3D->mnRefCount++;
120         }
121 
MaterialAttribute3D(const MaterialAttribute3D & rCandidate)122         MaterialAttribute3D::MaterialAttribute3D(const MaterialAttribute3D& rCandidate)
123         :   mpMaterialAttribute3D(rCandidate.mpMaterialAttribute3D)
124         {
125             mpMaterialAttribute3D->mnRefCount++;
126         }
127 
~MaterialAttribute3D()128         MaterialAttribute3D::~MaterialAttribute3D()
129         {
130             if(mpMaterialAttribute3D->mnRefCount)
131             {
132                 mpMaterialAttribute3D->mnRefCount--;
133             }
134             else
135             {
136                 delete mpMaterialAttribute3D;
137             }
138         }
139 
isDefault() const140         bool MaterialAttribute3D::isDefault() const
141         {
142             return mpMaterialAttribute3D == ImpMaterialAttribute3D::get_global_default();
143         }
144 
operator =(const MaterialAttribute3D & rCandidate)145         MaterialAttribute3D& MaterialAttribute3D::operator=(const MaterialAttribute3D& rCandidate)
146         {
147             if(rCandidate.mpMaterialAttribute3D != mpMaterialAttribute3D)
148             {
149                 if(mpMaterialAttribute3D->mnRefCount)
150                 {
151                     mpMaterialAttribute3D->mnRefCount--;
152                 }
153                 else
154                 {
155                     delete mpMaterialAttribute3D;
156                 }
157 
158                 mpMaterialAttribute3D = rCandidate.mpMaterialAttribute3D;
159                 mpMaterialAttribute3D->mnRefCount++;
160             }
161 
162             return *this;
163         }
164 
operator ==(const MaterialAttribute3D & rCandidate) const165         bool MaterialAttribute3D::operator==(const MaterialAttribute3D& rCandidate) const
166         {
167             if(rCandidate.mpMaterialAttribute3D == mpMaterialAttribute3D)
168             {
169                 return true;
170             }
171 
172             if(rCandidate.isDefault() != isDefault())
173             {
174                 return false;
175             }
176 
177             return (*rCandidate.mpMaterialAttribute3D == *mpMaterialAttribute3D);
178         }
179 
getColor() const180         const basegfx::BColor& MaterialAttribute3D::getColor() const
181         {
182             return mpMaterialAttribute3D->getColor();
183         }
184 
getSpecular() const185         const basegfx::BColor& MaterialAttribute3D::getSpecular() const
186         {
187             return mpMaterialAttribute3D->getSpecular();
188         }
189 
getEmission() const190         const basegfx::BColor& MaterialAttribute3D::getEmission() const
191         {
192             return mpMaterialAttribute3D->getEmission();
193         }
194 
getSpecularIntensity() const195         sal_uInt16 MaterialAttribute3D::getSpecularIntensity() const
196         {
197             return mpMaterialAttribute3D->getSpecularIntensity();
198         }
199     } // end of namespace attribute
200 } // end of namespace drawinglayer
201 
202 //////////////////////////////////////////////////////////////////////////////
203 // eof
204