xref: /trunk/main/drawinglayer/source/attribute/sdrsceneattribute3d.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  *  OpenOffice.org - a multi-platform office productivity suite
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  *  $RCSfile: sdrattribute3d.cxx,v $
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  *  $Revision: 1.5 $
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  *  last change: $Author: aw $ $Date: 2008-05-27 14:11:19 $
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  *  The Contents of this file are made available subject to
12*cdf0e10cSrcweir  *  the terms of GNU Lesser General Public License Version 2.1.
13*cdf0e10cSrcweir  *
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  *    GNU Lesser General Public License Version 2.1
16*cdf0e10cSrcweir  *    =============================================
17*cdf0e10cSrcweir  *    Copyright 2005 by Sun Microsystems, Inc.
18*cdf0e10cSrcweir  *    901 San Antonio Road, Palo Alto, CA 94303, USA
19*cdf0e10cSrcweir  *
20*cdf0e10cSrcweir  *    This library is free software; you can redistribute it and/or
21*cdf0e10cSrcweir  *    modify it under the terms of the GNU Lesser General Public
22*cdf0e10cSrcweir  *    License version 2.1, as published by the Free Software Foundation.
23*cdf0e10cSrcweir  *
24*cdf0e10cSrcweir  *    This library is distributed in the hope that it will be useful,
25*cdf0e10cSrcweir  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
26*cdf0e10cSrcweir  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27*cdf0e10cSrcweir  *    Lesser General Public License for more details.
28*cdf0e10cSrcweir  *
29*cdf0e10cSrcweir  *    You should have received a copy of the GNU Lesser General Public
30*cdf0e10cSrcweir  *    License along with this library; if not, write to the Free Software
31*cdf0e10cSrcweir  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32*cdf0e10cSrcweir  *    MA  02111-1307  USA
33*cdf0e10cSrcweir  *
34*cdf0e10cSrcweir  ************************************************************************/
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
37*cdf0e10cSrcweir #include "precompiled_drawinglayer.hxx"
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #include <drawinglayer/attribute/sdrsceneattribute3d.hxx>
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir namespace drawinglayer
44*cdf0e10cSrcweir {
45*cdf0e10cSrcweir     namespace attribute
46*cdf0e10cSrcweir     {
47*cdf0e10cSrcweir         class ImpSdrSceneAttribute
48*cdf0e10cSrcweir         {
49*cdf0e10cSrcweir         public:
50*cdf0e10cSrcweir             // refcounter
51*cdf0e10cSrcweir             sal_uInt32                              mnRefCount;
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir             // 3D scene attribute definitions
54*cdf0e10cSrcweir             double                                      mfDistance;
55*cdf0e10cSrcweir             double                                      mfShadowSlant;
56*cdf0e10cSrcweir             ::com::sun::star::drawing::ProjectionMode   maProjectionMode;
57*cdf0e10cSrcweir             ::com::sun::star::drawing::ShadeMode        maShadeMode;
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir             // bitfield
60*cdf0e10cSrcweir             unsigned                                    mbTwoSidedLighting : 1;
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir         public:
63*cdf0e10cSrcweir             ImpSdrSceneAttribute(
64*cdf0e10cSrcweir                 double fDistance,
65*cdf0e10cSrcweir                 double fShadowSlant,
66*cdf0e10cSrcweir                 ::com::sun::star::drawing::ProjectionMode aProjectionMode,
67*cdf0e10cSrcweir                 ::com::sun::star::drawing::ShadeMode aShadeMode,
68*cdf0e10cSrcweir                 bool bTwoSidedLighting)
69*cdf0e10cSrcweir             :   mnRefCount(0),
70*cdf0e10cSrcweir                 mfDistance(fDistance),
71*cdf0e10cSrcweir                 mfShadowSlant(fShadowSlant),
72*cdf0e10cSrcweir                 maProjectionMode(aProjectionMode),
73*cdf0e10cSrcweir                 maShadeMode(aShadeMode),
74*cdf0e10cSrcweir                 mbTwoSidedLighting(bTwoSidedLighting)
75*cdf0e10cSrcweir             {
76*cdf0e10cSrcweir             }
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir             // data read access
79*cdf0e10cSrcweir             double getDistance() const { return mfDistance; }
80*cdf0e10cSrcweir             double getShadowSlant() const { return mfShadowSlant; }
81*cdf0e10cSrcweir             ::com::sun::star::drawing::ProjectionMode getProjectionMode() const { return maProjectionMode; }
82*cdf0e10cSrcweir             ::com::sun::star::drawing::ShadeMode getShadeMode() const { return maShadeMode; }
83*cdf0e10cSrcweir             bool getTwoSidedLighting() const { return mbTwoSidedLighting; }
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir             bool operator==(const ImpSdrSceneAttribute& rCandidate) const
86*cdf0e10cSrcweir             {
87*cdf0e10cSrcweir                 return (getDistance() == rCandidate.getDistance()
88*cdf0e10cSrcweir                     && getShadowSlant() == rCandidate.getShadowSlant()
89*cdf0e10cSrcweir                     && getProjectionMode() == rCandidate.getProjectionMode()
90*cdf0e10cSrcweir                     && getShadeMode() == rCandidate.getShadeMode()
91*cdf0e10cSrcweir                     && getTwoSidedLighting() == rCandidate.getTwoSidedLighting());
92*cdf0e10cSrcweir             }
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir             static ImpSdrSceneAttribute* get_global_default()
95*cdf0e10cSrcweir             {
96*cdf0e10cSrcweir                 static ImpSdrSceneAttribute* pDefault = 0;
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir                 if(!pDefault)
99*cdf0e10cSrcweir                 {
100*cdf0e10cSrcweir                     pDefault = new ImpSdrSceneAttribute(
101*cdf0e10cSrcweir                         0.0, 0.0,
102*cdf0e10cSrcweir                         ::com::sun::star::drawing::ProjectionMode_PARALLEL,
103*cdf0e10cSrcweir                         ::com::sun::star::drawing::ShadeMode_FLAT,
104*cdf0e10cSrcweir                         false);
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir                     // never delete; start with RefCount 1, not 0
107*cdf0e10cSrcweir                     pDefault->mnRefCount++;
108*cdf0e10cSrcweir                 }
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir                 return pDefault;
111*cdf0e10cSrcweir             }
112*cdf0e10cSrcweir         };
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir         SdrSceneAttribute::SdrSceneAttribute(
115*cdf0e10cSrcweir             double fDistance,
116*cdf0e10cSrcweir             double fShadowSlant,
117*cdf0e10cSrcweir             ::com::sun::star::drawing::ProjectionMode aProjectionMode,
118*cdf0e10cSrcweir             ::com::sun::star::drawing::ShadeMode aShadeMode,
119*cdf0e10cSrcweir             bool bTwoSidedLighting)
120*cdf0e10cSrcweir         :   mpSdrSceneAttribute(new ImpSdrSceneAttribute(
121*cdf0e10cSrcweir                 fDistance, fShadowSlant, aProjectionMode, aShadeMode, bTwoSidedLighting))
122*cdf0e10cSrcweir         {
123*cdf0e10cSrcweir         }
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir         SdrSceneAttribute::SdrSceneAttribute()
126*cdf0e10cSrcweir         :   mpSdrSceneAttribute(ImpSdrSceneAttribute::get_global_default())
127*cdf0e10cSrcweir         {
128*cdf0e10cSrcweir             mpSdrSceneAttribute->mnRefCount++;
129*cdf0e10cSrcweir         }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir         SdrSceneAttribute::SdrSceneAttribute(const SdrSceneAttribute& rCandidate)
132*cdf0e10cSrcweir         :   mpSdrSceneAttribute(rCandidate.mpSdrSceneAttribute)
133*cdf0e10cSrcweir         {
134*cdf0e10cSrcweir             mpSdrSceneAttribute->mnRefCount++;
135*cdf0e10cSrcweir         }
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir         SdrSceneAttribute::~SdrSceneAttribute()
138*cdf0e10cSrcweir         {
139*cdf0e10cSrcweir             if(mpSdrSceneAttribute->mnRefCount)
140*cdf0e10cSrcweir             {
141*cdf0e10cSrcweir                 mpSdrSceneAttribute->mnRefCount--;
142*cdf0e10cSrcweir             }
143*cdf0e10cSrcweir             else
144*cdf0e10cSrcweir             {
145*cdf0e10cSrcweir                 delete mpSdrSceneAttribute;
146*cdf0e10cSrcweir             }
147*cdf0e10cSrcweir         }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir         bool SdrSceneAttribute::isDefault() const
150*cdf0e10cSrcweir         {
151*cdf0e10cSrcweir             return mpSdrSceneAttribute == ImpSdrSceneAttribute::get_global_default();
152*cdf0e10cSrcweir         }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir         SdrSceneAttribute& SdrSceneAttribute::operator=(const SdrSceneAttribute& rCandidate)
155*cdf0e10cSrcweir         {
156*cdf0e10cSrcweir             if(rCandidate.mpSdrSceneAttribute != mpSdrSceneAttribute)
157*cdf0e10cSrcweir             {
158*cdf0e10cSrcweir                 if(mpSdrSceneAttribute->mnRefCount)
159*cdf0e10cSrcweir                 {
160*cdf0e10cSrcweir                     mpSdrSceneAttribute->mnRefCount--;
161*cdf0e10cSrcweir                 }
162*cdf0e10cSrcweir                 else
163*cdf0e10cSrcweir                 {
164*cdf0e10cSrcweir                     delete mpSdrSceneAttribute;
165*cdf0e10cSrcweir                 }
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir                 mpSdrSceneAttribute = rCandidate.mpSdrSceneAttribute;
168*cdf0e10cSrcweir                 mpSdrSceneAttribute->mnRefCount++;
169*cdf0e10cSrcweir             }
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir             return *this;
172*cdf0e10cSrcweir         }
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir         bool SdrSceneAttribute::operator==(const SdrSceneAttribute& rCandidate) const
175*cdf0e10cSrcweir         {
176*cdf0e10cSrcweir             if(rCandidate.mpSdrSceneAttribute == mpSdrSceneAttribute)
177*cdf0e10cSrcweir             {
178*cdf0e10cSrcweir                 return true;
179*cdf0e10cSrcweir             }
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir             if(rCandidate.isDefault() != isDefault())
182*cdf0e10cSrcweir             {
183*cdf0e10cSrcweir                 return false;
184*cdf0e10cSrcweir             }
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir             return (*rCandidate.mpSdrSceneAttribute == *mpSdrSceneAttribute);
187*cdf0e10cSrcweir         }
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir         double SdrSceneAttribute::getDistance() const
190*cdf0e10cSrcweir         {
191*cdf0e10cSrcweir             return mpSdrSceneAttribute->getDistance();
192*cdf0e10cSrcweir         }
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir         double SdrSceneAttribute::getShadowSlant() const
195*cdf0e10cSrcweir         {
196*cdf0e10cSrcweir             return mpSdrSceneAttribute->getShadowSlant();
197*cdf0e10cSrcweir         }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir         ::com::sun::star::drawing::ProjectionMode SdrSceneAttribute::getProjectionMode() const
200*cdf0e10cSrcweir         {
201*cdf0e10cSrcweir             return mpSdrSceneAttribute->getProjectionMode();
202*cdf0e10cSrcweir         }
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir         ::com::sun::star::drawing::ShadeMode SdrSceneAttribute::getShadeMode() const
205*cdf0e10cSrcweir         {
206*cdf0e10cSrcweir             return mpSdrSceneAttribute->getShadeMode();
207*cdf0e10cSrcweir         }
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir         bool SdrSceneAttribute::getTwoSidedLighting() const
210*cdf0e10cSrcweir         {
211*cdf0e10cSrcweir             return mpSdrSceneAttribute->getTwoSidedLighting();
212*cdf0e10cSrcweir         }
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir     } // end of namespace attribute
215*cdf0e10cSrcweir } // end of namespace drawinglayer
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
218*cdf0e10cSrcweir // eof
219