1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <drawinglayer/attribute/materialattribute3d.hxx>
28*b1cdbd2cSJim Jagielski #include <basegfx/color/bcolor.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace drawinglayer
33*b1cdbd2cSJim Jagielski {
34*b1cdbd2cSJim Jagielski 	namespace attribute
35*b1cdbd2cSJim Jagielski 	{
36*b1cdbd2cSJim Jagielski 		class ImpMaterialAttribute3D
37*b1cdbd2cSJim Jagielski 		{
38*b1cdbd2cSJim Jagielski 		public:
39*b1cdbd2cSJim Jagielski 			// refcounter
40*b1cdbd2cSJim Jagielski 			sal_uInt32								mnRefCount;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 			// materialAttribute3D definitions
43*b1cdbd2cSJim Jagielski 			basegfx::BColor							maColor;				// object color
44*b1cdbd2cSJim Jagielski 			basegfx::BColor							maSpecular;				// material specular color
45*b1cdbd2cSJim Jagielski 			basegfx::BColor							maEmission;				// material emissive color
46*b1cdbd2cSJim Jagielski 			sal_uInt16								mnSpecularIntensity;	// material specular intensity [0..128]
47*b1cdbd2cSJim Jagielski 
ImpMaterialAttribute3D(const basegfx::BColor & rColor,const basegfx::BColor & rSpecular,const basegfx::BColor & rEmission,sal_uInt16 nSpecularIntensity)48*b1cdbd2cSJim Jagielski 			ImpMaterialAttribute3D(const basegfx::BColor& rColor, const basegfx::BColor& rSpecular, const basegfx::BColor& rEmission, sal_uInt16 nSpecularIntensity)
49*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
50*b1cdbd2cSJim Jagielski                 maColor(rColor),
51*b1cdbd2cSJim Jagielski 				maSpecular(rSpecular),
52*b1cdbd2cSJim Jagielski 				maEmission(rEmission),
53*b1cdbd2cSJim Jagielski 				mnSpecularIntensity(nSpecularIntensity)
54*b1cdbd2cSJim Jagielski 			{
55*b1cdbd2cSJim Jagielski 			}
56*b1cdbd2cSJim Jagielski 
ImpMaterialAttribute3D(const basegfx::BColor & rColor)57*b1cdbd2cSJim Jagielski 			ImpMaterialAttribute3D(const basegfx::BColor& rColor)
58*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
59*b1cdbd2cSJim Jagielski                 maColor(rColor),
60*b1cdbd2cSJim Jagielski 				maSpecular(1.0, 1.0, 1.0),
61*b1cdbd2cSJim Jagielski 				maEmission(),
62*b1cdbd2cSJim Jagielski 				mnSpecularIntensity(15)
63*b1cdbd2cSJim Jagielski 			{
64*b1cdbd2cSJim Jagielski 			}
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 			// data read access
getColor() const67*b1cdbd2cSJim Jagielski 			const basegfx::BColor& getColor() const { return maColor; }
getSpecular() const68*b1cdbd2cSJim Jagielski 			const basegfx::BColor& getSpecular() const { return maSpecular; }
getEmission() const69*b1cdbd2cSJim Jagielski 			const basegfx::BColor& getEmission() const { return maEmission; }
getSpecularIntensity() const70*b1cdbd2cSJim Jagielski 			sal_uInt16 getSpecularIntensity() const { return mnSpecularIntensity; }
71*b1cdbd2cSJim Jagielski 
operator ==(const ImpMaterialAttribute3D & rCandidate) const72*b1cdbd2cSJim Jagielski 			bool operator==(const ImpMaterialAttribute3D& rCandidate) const
73*b1cdbd2cSJim Jagielski 			{
74*b1cdbd2cSJim Jagielski 				return (getColor() == rCandidate.getColor()
75*b1cdbd2cSJim Jagielski 					&& getSpecular() == rCandidate.getSpecular()
76*b1cdbd2cSJim Jagielski 					&& getEmission() == rCandidate.getEmission()
77*b1cdbd2cSJim Jagielski 					&& getSpecularIntensity() == rCandidate.getSpecularIntensity());
78*b1cdbd2cSJim Jagielski 			}
79*b1cdbd2cSJim Jagielski 
get_global_default()80*b1cdbd2cSJim Jagielski             static ImpMaterialAttribute3D* get_global_default()
81*b1cdbd2cSJim Jagielski             {
82*b1cdbd2cSJim Jagielski                 static ImpMaterialAttribute3D* pDefault = 0;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski                 if(!pDefault)
85*b1cdbd2cSJim Jagielski                 {
86*b1cdbd2cSJim Jagielski                     pDefault = new ImpMaterialAttribute3D(
87*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
88*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
89*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
90*b1cdbd2cSJim Jagielski                         0);
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
93*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
94*b1cdbd2cSJim Jagielski                 }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski                 return pDefault;
97*b1cdbd2cSJim Jagielski             }
98*b1cdbd2cSJim Jagielski 		};
99*b1cdbd2cSJim Jagielski 
MaterialAttribute3D(const basegfx::BColor & rColor,const basegfx::BColor & rSpecular,const basegfx::BColor & rEmission,sal_uInt16 nSpecularIntensity)100*b1cdbd2cSJim Jagielski         MaterialAttribute3D::MaterialAttribute3D(
101*b1cdbd2cSJim Jagielski             const basegfx::BColor& rColor,
102*b1cdbd2cSJim Jagielski             const basegfx::BColor& rSpecular,
103*b1cdbd2cSJim Jagielski             const basegfx::BColor& rEmission,
104*b1cdbd2cSJim Jagielski             sal_uInt16 nSpecularIntensity)
105*b1cdbd2cSJim Jagielski 		:	mpMaterialAttribute3D(new ImpMaterialAttribute3D(
106*b1cdbd2cSJim Jagielski                 rColor, rSpecular, rEmission, nSpecularIntensity))
107*b1cdbd2cSJim Jagielski 		{
108*b1cdbd2cSJim Jagielski 		}
109*b1cdbd2cSJim Jagielski 
MaterialAttribute3D(const basegfx::BColor & rColor)110*b1cdbd2cSJim Jagielski 		MaterialAttribute3D::MaterialAttribute3D(
111*b1cdbd2cSJim Jagielski             const basegfx::BColor& rColor)
112*b1cdbd2cSJim Jagielski 		:	mpMaterialAttribute3D(new ImpMaterialAttribute3D(rColor))
113*b1cdbd2cSJim Jagielski 		{
114*b1cdbd2cSJim Jagielski 		}
115*b1cdbd2cSJim Jagielski 
MaterialAttribute3D()116*b1cdbd2cSJim Jagielski 		MaterialAttribute3D::MaterialAttribute3D()
117*b1cdbd2cSJim Jagielski         :	mpMaterialAttribute3D(ImpMaterialAttribute3D::get_global_default())
118*b1cdbd2cSJim Jagielski 		{
119*b1cdbd2cSJim Jagielski 			mpMaterialAttribute3D->mnRefCount++;
120*b1cdbd2cSJim Jagielski 		}
121*b1cdbd2cSJim Jagielski 
MaterialAttribute3D(const MaterialAttribute3D & rCandidate)122*b1cdbd2cSJim Jagielski 		MaterialAttribute3D::MaterialAttribute3D(const MaterialAttribute3D& rCandidate)
123*b1cdbd2cSJim Jagielski 		:	mpMaterialAttribute3D(rCandidate.mpMaterialAttribute3D)
124*b1cdbd2cSJim Jagielski 		{
125*b1cdbd2cSJim Jagielski 			mpMaterialAttribute3D->mnRefCount++;
126*b1cdbd2cSJim Jagielski 		}
127*b1cdbd2cSJim Jagielski 
~MaterialAttribute3D()128*b1cdbd2cSJim Jagielski 		MaterialAttribute3D::~MaterialAttribute3D()
129*b1cdbd2cSJim Jagielski 		{
130*b1cdbd2cSJim Jagielski 			if(mpMaterialAttribute3D->mnRefCount)
131*b1cdbd2cSJim Jagielski 			{
132*b1cdbd2cSJim Jagielski 				mpMaterialAttribute3D->mnRefCount--;
133*b1cdbd2cSJim Jagielski 			}
134*b1cdbd2cSJim Jagielski 			else
135*b1cdbd2cSJim Jagielski 			{
136*b1cdbd2cSJim Jagielski 				delete mpMaterialAttribute3D;
137*b1cdbd2cSJim Jagielski 			}
138*b1cdbd2cSJim Jagielski 		}
139*b1cdbd2cSJim Jagielski 
isDefault() const140*b1cdbd2cSJim Jagielski         bool MaterialAttribute3D::isDefault() const
141*b1cdbd2cSJim Jagielski         {
142*b1cdbd2cSJim Jagielski             return mpMaterialAttribute3D == ImpMaterialAttribute3D::get_global_default();
143*b1cdbd2cSJim Jagielski         }
144*b1cdbd2cSJim Jagielski 
operator =(const MaterialAttribute3D & rCandidate)145*b1cdbd2cSJim Jagielski         MaterialAttribute3D& MaterialAttribute3D::operator=(const MaterialAttribute3D& rCandidate)
146*b1cdbd2cSJim Jagielski 		{
147*b1cdbd2cSJim Jagielski 			if(rCandidate.mpMaterialAttribute3D != mpMaterialAttribute3D)
148*b1cdbd2cSJim Jagielski 			{
149*b1cdbd2cSJim Jagielski 				if(mpMaterialAttribute3D->mnRefCount)
150*b1cdbd2cSJim Jagielski 				{
151*b1cdbd2cSJim Jagielski 					mpMaterialAttribute3D->mnRefCount--;
152*b1cdbd2cSJim Jagielski 				}
153*b1cdbd2cSJim Jagielski 				else
154*b1cdbd2cSJim Jagielski 				{
155*b1cdbd2cSJim Jagielski 					delete mpMaterialAttribute3D;
156*b1cdbd2cSJim Jagielski 				}
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 				mpMaterialAttribute3D = rCandidate.mpMaterialAttribute3D;
159*b1cdbd2cSJim Jagielski 				mpMaterialAttribute3D->mnRefCount++;
160*b1cdbd2cSJim Jagielski 			}
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 			return *this;
163*b1cdbd2cSJim Jagielski 		}
164*b1cdbd2cSJim Jagielski 
operator ==(const MaterialAttribute3D & rCandidate) const165*b1cdbd2cSJim Jagielski 		bool MaterialAttribute3D::operator==(const MaterialAttribute3D& rCandidate) const
166*b1cdbd2cSJim Jagielski 		{
167*b1cdbd2cSJim Jagielski 			if(rCandidate.mpMaterialAttribute3D == mpMaterialAttribute3D)
168*b1cdbd2cSJim Jagielski 			{
169*b1cdbd2cSJim Jagielski 				return true;
170*b1cdbd2cSJim Jagielski 			}
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
173*b1cdbd2cSJim Jagielski 			{
174*b1cdbd2cSJim Jagielski 				return false;
175*b1cdbd2cSJim Jagielski 			}
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpMaterialAttribute3D == *mpMaterialAttribute3D);
178*b1cdbd2cSJim Jagielski 		}
179*b1cdbd2cSJim Jagielski 
getColor() const180*b1cdbd2cSJim Jagielski 		const basegfx::BColor& MaterialAttribute3D::getColor() const
181*b1cdbd2cSJim Jagielski 		{
182*b1cdbd2cSJim Jagielski 			return mpMaterialAttribute3D->getColor();
183*b1cdbd2cSJim Jagielski 		}
184*b1cdbd2cSJim Jagielski 
getSpecular() const185*b1cdbd2cSJim Jagielski 		const basegfx::BColor& MaterialAttribute3D::getSpecular() const
186*b1cdbd2cSJim Jagielski 		{
187*b1cdbd2cSJim Jagielski 			return mpMaterialAttribute3D->getSpecular();
188*b1cdbd2cSJim Jagielski 		}
189*b1cdbd2cSJim Jagielski 
getEmission() const190*b1cdbd2cSJim Jagielski 		const basegfx::BColor& MaterialAttribute3D::getEmission() const
191*b1cdbd2cSJim Jagielski 		{
192*b1cdbd2cSJim Jagielski 			return mpMaterialAttribute3D->getEmission();
193*b1cdbd2cSJim Jagielski 		}
194*b1cdbd2cSJim Jagielski 
getSpecularIntensity() const195*b1cdbd2cSJim Jagielski 		sal_uInt16 MaterialAttribute3D::getSpecularIntensity() const
196*b1cdbd2cSJim Jagielski 		{
197*b1cdbd2cSJim Jagielski 			return mpMaterialAttribute3D->getSpecularIntensity();
198*b1cdbd2cSJim Jagielski 		}
199*b1cdbd2cSJim Jagielski 	} // end of namespace attribute
200*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
203*b1cdbd2cSJim Jagielski // eof
204