1*035a2f44SArmin Le Grand /**************************************************************
2*035a2f44SArmin Le Grand  *
3*035a2f44SArmin Le Grand  * Licensed to the Apache Software Foundation (ASF) under one
4*035a2f44SArmin Le Grand  * or more contributor license agreements.  See the NOTICE file
5*035a2f44SArmin Le Grand  * distributed with this work for additional information
6*035a2f44SArmin Le Grand  * regarding copyright ownership.  The ASF licenses this file
7*035a2f44SArmin Le Grand  * to you under the Apache License, Version 2.0 (the
8*035a2f44SArmin Le Grand  * "License"); you may not use this file except in compliance
9*035a2f44SArmin Le Grand  * with the License.  You may obtain a copy of the License at
10*035a2f44SArmin Le Grand  *
11*035a2f44SArmin Le Grand  *   http://www.apache.org/licenses/LICENSE-2.0
12*035a2f44SArmin Le Grand  *
13*035a2f44SArmin Le Grand  * Unless required by applicable law or agreed to in writing,
14*035a2f44SArmin Le Grand  * software distributed under the License is distributed on an
15*035a2f44SArmin Le Grand  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*035a2f44SArmin Le Grand  * KIND, either express or implied.  See the License for the
17*035a2f44SArmin Le Grand  * specific language governing permissions and limitations
18*035a2f44SArmin Le Grand  * under the License.
19*035a2f44SArmin Le Grand  *
20*035a2f44SArmin Le Grand  *************************************************************/
21*035a2f44SArmin Le Grand 
22*035a2f44SArmin Le Grand 
23*035a2f44SArmin Le Grand 
24*035a2f44SArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove
25*035a2f44SArmin Le Grand #include "precompiled_drawinglayer.hxx"
26*035a2f44SArmin Le Grand 
27*035a2f44SArmin Le Grand #include <drawinglayer/attribute/fillgraphicattribute.hxx>
28*035a2f44SArmin Le Grand #include <vcl/graph.hxx>
29*035a2f44SArmin Le Grand 
30*035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
31*035a2f44SArmin Le Grand 
32*035a2f44SArmin Le Grand namespace drawinglayer
33*035a2f44SArmin Le Grand {
34*035a2f44SArmin Le Grand 	namespace attribute
35*035a2f44SArmin Le Grand 	{
36*035a2f44SArmin Le Grand 		class ImpFillGraphicAttribute
37*035a2f44SArmin Le Grand 		{
38*035a2f44SArmin Le Grand 		public:
39*035a2f44SArmin Le Grand 			// refcounter
40*035a2f44SArmin Le Grand 			sal_uInt32								mnRefCount;
41*035a2f44SArmin Le Grand 
42*035a2f44SArmin Le Grand             // data definitions
43*035a2f44SArmin Le Grand 			Graphic                                 maGraphic;
44*035a2f44SArmin Le Grand 			basegfx::B2DRange						maGraphicRange;
45*035a2f44SArmin Le Grand 
46*035a2f44SArmin Le Grand             // tiling definitions, offsets in X/Y in percent for each 2nd row.
47*035a2f44SArmin Le Grand             // If both are set, Y is ignored (X has precedence)
48*035a2f44SArmin Le Grand             double                                  mfOffsetX;
49*035a2f44SArmin Le Grand             double                                  mfOffsetY;
50*035a2f44SArmin Le Grand 
51*035a2f44SArmin Le Grand 			// bitfield
52*035a2f44SArmin Le Grand 			unsigned								mbTiling : 1;
53*035a2f44SArmin Le Grand 
54*035a2f44SArmin Le Grand 			ImpFillGraphicAttribute(
55*035a2f44SArmin Le Grand                 const Graphic& rGraphic,
56*035a2f44SArmin Le Grand                 const basegfx::B2DRange& rGraphicRange,
57*035a2f44SArmin Le Grand                 bool bTiling,
58*035a2f44SArmin Le Grand                 double fOffsetX,
59*035a2f44SArmin Le Grand                 double fOffsetY)
60*035a2f44SArmin Le Grand 			:	mnRefCount(0),
61*035a2f44SArmin Le Grand 		    	maGraphic(rGraphic),
62*035a2f44SArmin Le Grand 			    maGraphicRange(rGraphicRange),
63*035a2f44SArmin Le Grand 			    mbTiling(bTiling),
64*035a2f44SArmin Le Grand                 mfOffsetX(fOffsetX),
65*035a2f44SArmin Le Grand                 mfOffsetY(fOffsetY)
66*035a2f44SArmin Le Grand 		    {
67*035a2f44SArmin Le Grand 		    }
68*035a2f44SArmin Le Grand 
69*035a2f44SArmin Le Grand 			// data read access
70*035a2f44SArmin Le Grand 			const Graphic& getGraphic() const { return maGraphic; }
71*035a2f44SArmin Le Grand 			const basegfx::B2DRange& getGraphicRange() const { return maGraphicRange; }
72*035a2f44SArmin Le Grand 			bool getTiling() const { return mbTiling; }
73*035a2f44SArmin Le Grand             double getOffsetX() const { return mfOffsetX; }
74*035a2f44SArmin Le Grand             double getOffsetY() const { return mfOffsetY; }
75*035a2f44SArmin Le Grand 
76*035a2f44SArmin Le Grand             bool operator==(const ImpFillGraphicAttribute& rCandidate) const
77*035a2f44SArmin Le Grand 		    {
78*035a2f44SArmin Le Grand 			    return (getGraphic() == rCandidate.getGraphic()
79*035a2f44SArmin Le Grand 				    && getGraphicRange() == rCandidate.getGraphicRange()
80*035a2f44SArmin Le Grand 				    && getTiling() == rCandidate.getTiling()
81*035a2f44SArmin Le Grand                     && getOffsetX() == rCandidate.getOffsetX()
82*035a2f44SArmin Le Grand                     && getOffsetY() == rCandidate.getOffsetY());
83*035a2f44SArmin Le Grand 		    }
84*035a2f44SArmin Le Grand 
85*035a2f44SArmin Le Grand             static ImpFillGraphicAttribute* get_global_default()
86*035a2f44SArmin Le Grand             {
87*035a2f44SArmin Le Grand                 static ImpFillGraphicAttribute* pDefault = 0;
88*035a2f44SArmin Le Grand 
89*035a2f44SArmin Le Grand                 if(!pDefault)
90*035a2f44SArmin Le Grand                 {
91*035a2f44SArmin Le Grand                     pDefault = new ImpFillGraphicAttribute(
92*035a2f44SArmin Le Grand                         Graphic(),
93*035a2f44SArmin Le Grand                         basegfx::B2DRange(),
94*035a2f44SArmin Le Grand                         false,
95*035a2f44SArmin Le Grand                         0.0,
96*035a2f44SArmin Le Grand                         0.0);
97*035a2f44SArmin Le Grand 
98*035a2f44SArmin Le Grand                     // never delete; start with RefCount 1, not 0
99*035a2f44SArmin Le Grand     			    pDefault->mnRefCount++;
100*035a2f44SArmin Le Grand                 }
101*035a2f44SArmin Le Grand 
102*035a2f44SArmin Le Grand                 return pDefault;
103*035a2f44SArmin Le Grand             }
104*035a2f44SArmin Le Grand 		};
105*035a2f44SArmin Le Grand 
106*035a2f44SArmin Le Grand         FillGraphicAttribute::FillGraphicAttribute(
107*035a2f44SArmin Le Grand             const Graphic& rGraphic,
108*035a2f44SArmin Le Grand             const basegfx::B2DRange& rGraphicRange,
109*035a2f44SArmin Le Grand             bool bTiling,
110*035a2f44SArmin Le Grand             double fOffsetX,
111*035a2f44SArmin Le Grand             double fOffsetY)
112*035a2f44SArmin Le Grand 		:	mpFillGraphicAttribute(
113*035a2f44SArmin Le Grand                 new ImpFillGraphicAttribute(
114*035a2f44SArmin Le Grand                     rGraphic,
115*035a2f44SArmin Le Grand                     rGraphicRange,
116*035a2f44SArmin Le Grand                     bTiling,
117*035a2f44SArmin Le Grand                     basegfx::clamp(fOffsetX, 0.0, 1.0),
118*035a2f44SArmin Le Grand                     basegfx::clamp(fOffsetY, 0.0, 1.0)))
119*035a2f44SArmin Le Grand 		{
120*035a2f44SArmin Le Grand 		}
121*035a2f44SArmin Le Grand 
122*035a2f44SArmin Le Grand 		FillGraphicAttribute::FillGraphicAttribute()
123*035a2f44SArmin Le Grand         :	mpFillGraphicAttribute(ImpFillGraphicAttribute::get_global_default())
124*035a2f44SArmin Le Grand 		{
125*035a2f44SArmin Le Grand 			mpFillGraphicAttribute->mnRefCount++;
126*035a2f44SArmin Le Grand 		}
127*035a2f44SArmin Le Grand 
128*035a2f44SArmin Le Grand         FillGraphicAttribute::FillGraphicAttribute(const FillGraphicAttribute& rCandidate)
129*035a2f44SArmin Le Grand 		:	mpFillGraphicAttribute(rCandidate.mpFillGraphicAttribute)
130*035a2f44SArmin Le Grand 		{
131*035a2f44SArmin Le Grand 			mpFillGraphicAttribute->mnRefCount++;
132*035a2f44SArmin Le Grand 		}
133*035a2f44SArmin Le Grand 
134*035a2f44SArmin Le Grand 		FillGraphicAttribute::~FillGraphicAttribute()
135*035a2f44SArmin Le Grand 		{
136*035a2f44SArmin Le Grand 			if(mpFillGraphicAttribute->mnRefCount)
137*035a2f44SArmin Le Grand 			{
138*035a2f44SArmin Le Grand 				mpFillGraphicAttribute->mnRefCount--;
139*035a2f44SArmin Le Grand 			}
140*035a2f44SArmin Le Grand 			else
141*035a2f44SArmin Le Grand 			{
142*035a2f44SArmin Le Grand 				delete mpFillGraphicAttribute;
143*035a2f44SArmin Le Grand 			}
144*035a2f44SArmin Le Grand 		}
145*035a2f44SArmin Le Grand 
146*035a2f44SArmin Le Grand         bool FillGraphicAttribute::isDefault() const
147*035a2f44SArmin Le Grand         {
148*035a2f44SArmin Le Grand             return mpFillGraphicAttribute == ImpFillGraphicAttribute::get_global_default();
149*035a2f44SArmin Le Grand         }
150*035a2f44SArmin Le Grand 
151*035a2f44SArmin Le Grand         FillGraphicAttribute& FillGraphicAttribute::operator=(const FillGraphicAttribute& rCandidate)
152*035a2f44SArmin Le Grand 		{
153*035a2f44SArmin Le Grand 			if(rCandidate.mpFillGraphicAttribute != mpFillGraphicAttribute)
154*035a2f44SArmin Le Grand 			{
155*035a2f44SArmin Le Grand 				if(mpFillGraphicAttribute->mnRefCount)
156*035a2f44SArmin Le Grand 				{
157*035a2f44SArmin Le Grand 					mpFillGraphicAttribute->mnRefCount--;
158*035a2f44SArmin Le Grand 				}
159*035a2f44SArmin Le Grand 				else
160*035a2f44SArmin Le Grand 				{
161*035a2f44SArmin Le Grand 					delete mpFillGraphicAttribute;
162*035a2f44SArmin Le Grand 				}
163*035a2f44SArmin Le Grand 
164*035a2f44SArmin Le Grand 				mpFillGraphicAttribute = rCandidate.mpFillGraphicAttribute;
165*035a2f44SArmin Le Grand 				mpFillGraphicAttribute->mnRefCount++;
166*035a2f44SArmin Le Grand 			}
167*035a2f44SArmin Le Grand 
168*035a2f44SArmin Le Grand 			return *this;
169*035a2f44SArmin Le Grand 		}
170*035a2f44SArmin Le Grand 
171*035a2f44SArmin Le Grand 		bool FillGraphicAttribute::operator==(const FillGraphicAttribute& rCandidate) const
172*035a2f44SArmin Le Grand 		{
173*035a2f44SArmin Le Grand 			if(rCandidate.mpFillGraphicAttribute == mpFillGraphicAttribute)
174*035a2f44SArmin Le Grand 			{
175*035a2f44SArmin Le Grand 				return true;
176*035a2f44SArmin Le Grand 			}
177*035a2f44SArmin Le Grand 
178*035a2f44SArmin Le Grand 			if(rCandidate.isDefault() != isDefault())
179*035a2f44SArmin Le Grand 			{
180*035a2f44SArmin Le Grand 				return false;
181*035a2f44SArmin Le Grand 			}
182*035a2f44SArmin Le Grand 
183*035a2f44SArmin Le Grand 			return (*rCandidate.mpFillGraphicAttribute == *mpFillGraphicAttribute);
184*035a2f44SArmin Le Grand 		}
185*035a2f44SArmin Le Grand 
186*035a2f44SArmin Le Grand         const Graphic& FillGraphicAttribute::getGraphic() const
187*035a2f44SArmin Le Grand         {
188*035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getGraphic();
189*035a2f44SArmin Le Grand         }
190*035a2f44SArmin Le Grand 
191*035a2f44SArmin Le Grand         const basegfx::B2DRange& FillGraphicAttribute::getGraphicRange() const
192*035a2f44SArmin Le Grand         {
193*035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getGraphicRange();
194*035a2f44SArmin Le Grand         }
195*035a2f44SArmin Le Grand 
196*035a2f44SArmin Le Grand         bool FillGraphicAttribute::getTiling() const
197*035a2f44SArmin Le Grand         {
198*035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getTiling();
199*035a2f44SArmin Le Grand         }
200*035a2f44SArmin Le Grand 
201*035a2f44SArmin Le Grand         double FillGraphicAttribute::getOffsetX() const
202*035a2f44SArmin Le Grand         {
203*035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getOffsetX();
204*035a2f44SArmin Le Grand         }
205*035a2f44SArmin Le Grand 
206*035a2f44SArmin Le Grand         double FillGraphicAttribute::getOffsetY() const
207*035a2f44SArmin Le Grand         {
208*035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getOffsetY();
209*035a2f44SArmin Le Grand         }
210*035a2f44SArmin Le Grand 
211*035a2f44SArmin Le Grand     } // end of namespace attribute
212*035a2f44SArmin Le Grand } // end of namespace drawinglayer
213*035a2f44SArmin Le Grand 
214*035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
215*035a2f44SArmin Le Grand // eof
216