1035a2f44SArmin Le Grand /**************************************************************
2035a2f44SArmin Le Grand  *
3035a2f44SArmin Le Grand  * Licensed to the Apache Software Foundation (ASF) under one
4035a2f44SArmin Le Grand  * or more contributor license agreements.  See the NOTICE file
5035a2f44SArmin Le Grand  * distributed with this work for additional information
6035a2f44SArmin Le Grand  * regarding copyright ownership.  The ASF licenses this file
7035a2f44SArmin Le Grand  * to you under the Apache License, Version 2.0 (the
8035a2f44SArmin Le Grand  * "License"); you may not use this file except in compliance
9035a2f44SArmin Le Grand  * with the License.  You may obtain a copy of the License at
10035a2f44SArmin Le Grand  *
11035a2f44SArmin Le Grand  *   http://www.apache.org/licenses/LICENSE-2.0
12035a2f44SArmin Le Grand  *
13035a2f44SArmin Le Grand  * Unless required by applicable law or agreed to in writing,
14035a2f44SArmin Le Grand  * software distributed under the License is distributed on an
15035a2f44SArmin Le Grand  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16035a2f44SArmin Le Grand  * KIND, either express or implied.  See the License for the
17035a2f44SArmin Le Grand  * specific language governing permissions and limitations
18035a2f44SArmin Le Grand  * under the License.
19035a2f44SArmin Le Grand  *
20035a2f44SArmin Le Grand  *************************************************************/
21035a2f44SArmin Le Grand 
22035a2f44SArmin Le Grand 
23035a2f44SArmin Le Grand 
24035a2f44SArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove
25035a2f44SArmin Le Grand #include "precompiled_drawinglayer.hxx"
26035a2f44SArmin Le Grand 
27035a2f44SArmin Le Grand #include <drawinglayer/attribute/fillgraphicattribute.hxx>
28035a2f44SArmin Le Grand #include <vcl/graph.hxx>
29035a2f44SArmin Le Grand 
30035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
31035a2f44SArmin Le Grand 
32035a2f44SArmin Le Grand namespace drawinglayer
33035a2f44SArmin Le Grand {
34035a2f44SArmin Le Grand 	namespace attribute
35035a2f44SArmin Le Grand 	{
36035a2f44SArmin Le Grand 		class ImpFillGraphicAttribute
37035a2f44SArmin Le Grand 		{
38035a2f44SArmin Le Grand 		public:
39035a2f44SArmin Le Grand 			// refcounter
40035a2f44SArmin Le Grand 			sal_uInt32								mnRefCount;
41035a2f44SArmin Le Grand 
42035a2f44SArmin Le Grand             // data definitions
43035a2f44SArmin Le Grand 			Graphic                                 maGraphic;
44035a2f44SArmin Le Grand 			basegfx::B2DRange						maGraphicRange;
45035a2f44SArmin Le Grand 
46035a2f44SArmin Le Grand             // tiling definitions, offsets in X/Y in percent for each 2nd row.
47035a2f44SArmin Le Grand             // If both are set, Y is ignored (X has precedence)
48035a2f44SArmin Le Grand             double                                  mfOffsetX;
49035a2f44SArmin Le Grand             double                                  mfOffsetY;
50035a2f44SArmin Le Grand 
51035a2f44SArmin Le Grand 			// bitfield
52035a2f44SArmin Le Grand 			unsigned								mbTiling : 1;
53035a2f44SArmin Le Grand 
ImpFillGraphicAttribute(const Graphic & rGraphic,const basegfx::B2DRange & rGraphicRange,bool bTiling,double fOffsetX,double fOffsetY)54035a2f44SArmin Le Grand 			ImpFillGraphicAttribute(
55035a2f44SArmin Le Grand                 const Graphic& rGraphic,
56035a2f44SArmin Le Grand                 const basegfx::B2DRange& rGraphicRange,
57035a2f44SArmin Le Grand                 bool bTiling,
58035a2f44SArmin Le Grand                 double fOffsetX,
59035a2f44SArmin Le Grand                 double fOffsetY)
60035a2f44SArmin Le Grand 			:	mnRefCount(0),
61035a2f44SArmin Le Grand 		    	maGraphic(rGraphic),
62035a2f44SArmin Le Grand 			    maGraphicRange(rGraphicRange),
63035a2f44SArmin Le Grand                 mfOffsetX(fOffsetX),
64*74e5dc1dSPavel Janík                 mfOffsetY(fOffsetY),
65*74e5dc1dSPavel Janík 			    mbTiling(bTiling)
66035a2f44SArmin Le Grand 		    {
67035a2f44SArmin Le Grand 		    }
68035a2f44SArmin Le Grand 
69035a2f44SArmin Le Grand 			// data read access
getGraphic() const70035a2f44SArmin Le Grand 			const Graphic& getGraphic() const { return maGraphic; }
getGraphicRange() const71035a2f44SArmin Le Grand 			const basegfx::B2DRange& getGraphicRange() const { return maGraphicRange; }
getTiling() const72035a2f44SArmin Le Grand 			bool getTiling() const { return mbTiling; }
getOffsetX() const73035a2f44SArmin Le Grand             double getOffsetX() const { return mfOffsetX; }
getOffsetY() const74035a2f44SArmin Le Grand             double getOffsetY() const { return mfOffsetY; }
75035a2f44SArmin Le Grand 
operator ==(const ImpFillGraphicAttribute & rCandidate) const76035a2f44SArmin Le Grand             bool operator==(const ImpFillGraphicAttribute& rCandidate) const
77035a2f44SArmin Le Grand 		    {
78035a2f44SArmin Le Grand 			    return (getGraphic() == rCandidate.getGraphic()
79035a2f44SArmin Le Grand 				    && getGraphicRange() == rCandidate.getGraphicRange()
80035a2f44SArmin Le Grand 				    && getTiling() == rCandidate.getTiling()
81035a2f44SArmin Le Grand                     && getOffsetX() == rCandidate.getOffsetX()
82035a2f44SArmin Le Grand                     && getOffsetY() == rCandidate.getOffsetY());
83035a2f44SArmin Le Grand 		    }
84035a2f44SArmin Le Grand 
get_global_default()85035a2f44SArmin Le Grand             static ImpFillGraphicAttribute* get_global_default()
86035a2f44SArmin Le Grand             {
87035a2f44SArmin Le Grand                 static ImpFillGraphicAttribute* pDefault = 0;
88035a2f44SArmin Le Grand 
89035a2f44SArmin Le Grand                 if(!pDefault)
90035a2f44SArmin Le Grand                 {
91035a2f44SArmin Le Grand                     pDefault = new ImpFillGraphicAttribute(
92035a2f44SArmin Le Grand                         Graphic(),
93035a2f44SArmin Le Grand                         basegfx::B2DRange(),
94035a2f44SArmin Le Grand                         false,
95035a2f44SArmin Le Grand                         0.0,
96035a2f44SArmin Le Grand                         0.0);
97035a2f44SArmin Le Grand 
98035a2f44SArmin Le Grand                     // never delete; start with RefCount 1, not 0
99035a2f44SArmin Le Grand     			    pDefault->mnRefCount++;
100035a2f44SArmin Le Grand                 }
101035a2f44SArmin Le Grand 
102035a2f44SArmin Le Grand                 return pDefault;
103035a2f44SArmin Le Grand             }
104035a2f44SArmin Le Grand 		};
105035a2f44SArmin Le Grand 
FillGraphicAttribute(const Graphic & rGraphic,const basegfx::B2DRange & rGraphicRange,bool bTiling,double fOffsetX,double fOffsetY)106035a2f44SArmin Le Grand         FillGraphicAttribute::FillGraphicAttribute(
107035a2f44SArmin Le Grand             const Graphic& rGraphic,
108035a2f44SArmin Le Grand             const basegfx::B2DRange& rGraphicRange,
109035a2f44SArmin Le Grand             bool bTiling,
110035a2f44SArmin Le Grand             double fOffsetX,
111035a2f44SArmin Le Grand             double fOffsetY)
112035a2f44SArmin Le Grand 		:	mpFillGraphicAttribute(
113035a2f44SArmin Le Grand                 new ImpFillGraphicAttribute(
114035a2f44SArmin Le Grand                     rGraphic,
115035a2f44SArmin Le Grand                     rGraphicRange,
116035a2f44SArmin Le Grand                     bTiling,
117035a2f44SArmin Le Grand                     basegfx::clamp(fOffsetX, 0.0, 1.0),
118035a2f44SArmin Le Grand                     basegfx::clamp(fOffsetY, 0.0, 1.0)))
119035a2f44SArmin Le Grand 		{
120035a2f44SArmin Le Grand 		}
121035a2f44SArmin Le Grand 
FillGraphicAttribute()122035a2f44SArmin Le Grand 		FillGraphicAttribute::FillGraphicAttribute()
123035a2f44SArmin Le Grand         :	mpFillGraphicAttribute(ImpFillGraphicAttribute::get_global_default())
124035a2f44SArmin Le Grand 		{
125035a2f44SArmin Le Grand 			mpFillGraphicAttribute->mnRefCount++;
126035a2f44SArmin Le Grand 		}
127035a2f44SArmin Le Grand 
FillGraphicAttribute(const FillGraphicAttribute & rCandidate)128035a2f44SArmin Le Grand         FillGraphicAttribute::FillGraphicAttribute(const FillGraphicAttribute& rCandidate)
129035a2f44SArmin Le Grand 		:	mpFillGraphicAttribute(rCandidate.mpFillGraphicAttribute)
130035a2f44SArmin Le Grand 		{
131035a2f44SArmin Le Grand 			mpFillGraphicAttribute->mnRefCount++;
132035a2f44SArmin Le Grand 		}
133035a2f44SArmin Le Grand 
~FillGraphicAttribute()134035a2f44SArmin Le Grand 		FillGraphicAttribute::~FillGraphicAttribute()
135035a2f44SArmin Le Grand 		{
136035a2f44SArmin Le Grand 			if(mpFillGraphicAttribute->mnRefCount)
137035a2f44SArmin Le Grand 			{
138035a2f44SArmin Le Grand 				mpFillGraphicAttribute->mnRefCount--;
139035a2f44SArmin Le Grand 			}
140035a2f44SArmin Le Grand 			else
141035a2f44SArmin Le Grand 			{
142035a2f44SArmin Le Grand 				delete mpFillGraphicAttribute;
143035a2f44SArmin Le Grand 			}
144035a2f44SArmin Le Grand 		}
145035a2f44SArmin Le Grand 
isDefault() const146035a2f44SArmin Le Grand         bool FillGraphicAttribute::isDefault() const
147035a2f44SArmin Le Grand         {
148035a2f44SArmin Le Grand             return mpFillGraphicAttribute == ImpFillGraphicAttribute::get_global_default();
149035a2f44SArmin Le Grand         }
150035a2f44SArmin Le Grand 
operator =(const FillGraphicAttribute & rCandidate)151035a2f44SArmin Le Grand         FillGraphicAttribute& FillGraphicAttribute::operator=(const FillGraphicAttribute& rCandidate)
152035a2f44SArmin Le Grand 		{
153035a2f44SArmin Le Grand 			if(rCandidate.mpFillGraphicAttribute != mpFillGraphicAttribute)
154035a2f44SArmin Le Grand 			{
155035a2f44SArmin Le Grand 				if(mpFillGraphicAttribute->mnRefCount)
156035a2f44SArmin Le Grand 				{
157035a2f44SArmin Le Grand 					mpFillGraphicAttribute->mnRefCount--;
158035a2f44SArmin Le Grand 				}
159035a2f44SArmin Le Grand 				else
160035a2f44SArmin Le Grand 				{
161035a2f44SArmin Le Grand 					delete mpFillGraphicAttribute;
162035a2f44SArmin Le Grand 				}
163035a2f44SArmin Le Grand 
164035a2f44SArmin Le Grand 				mpFillGraphicAttribute = rCandidate.mpFillGraphicAttribute;
165035a2f44SArmin Le Grand 				mpFillGraphicAttribute->mnRefCount++;
166035a2f44SArmin Le Grand 			}
167035a2f44SArmin Le Grand 
168035a2f44SArmin Le Grand 			return *this;
169035a2f44SArmin Le Grand 		}
170035a2f44SArmin Le Grand 
operator ==(const FillGraphicAttribute & rCandidate) const171035a2f44SArmin Le Grand 		bool FillGraphicAttribute::operator==(const FillGraphicAttribute& rCandidate) const
172035a2f44SArmin Le Grand 		{
173035a2f44SArmin Le Grand 			if(rCandidate.mpFillGraphicAttribute == mpFillGraphicAttribute)
174035a2f44SArmin Le Grand 			{
175035a2f44SArmin Le Grand 				return true;
176035a2f44SArmin Le Grand 			}
177035a2f44SArmin Le Grand 
178035a2f44SArmin Le Grand 			if(rCandidate.isDefault() != isDefault())
179035a2f44SArmin Le Grand 			{
180035a2f44SArmin Le Grand 				return false;
181035a2f44SArmin Le Grand 			}
182035a2f44SArmin Le Grand 
183035a2f44SArmin Le Grand 			return (*rCandidate.mpFillGraphicAttribute == *mpFillGraphicAttribute);
184035a2f44SArmin Le Grand 		}
185035a2f44SArmin Le Grand 
getGraphic() const186035a2f44SArmin Le Grand         const Graphic& FillGraphicAttribute::getGraphic() const
187035a2f44SArmin Le Grand         {
188035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getGraphic();
189035a2f44SArmin Le Grand         }
190035a2f44SArmin Le Grand 
getGraphicRange() const191035a2f44SArmin Le Grand         const basegfx::B2DRange& FillGraphicAttribute::getGraphicRange() const
192035a2f44SArmin Le Grand         {
193035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getGraphicRange();
194035a2f44SArmin Le Grand         }
195035a2f44SArmin Le Grand 
getTiling() const196035a2f44SArmin Le Grand         bool FillGraphicAttribute::getTiling() const
197035a2f44SArmin Le Grand         {
198035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getTiling();
199035a2f44SArmin Le Grand         }
200035a2f44SArmin Le Grand 
getOffsetX() const201035a2f44SArmin Le Grand         double FillGraphicAttribute::getOffsetX() const
202035a2f44SArmin Le Grand         {
203035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getOffsetX();
204035a2f44SArmin Le Grand         }
205035a2f44SArmin Le Grand 
getOffsetY() const206035a2f44SArmin Le Grand         double FillGraphicAttribute::getOffsetY() const
207035a2f44SArmin Le Grand         {
208035a2f44SArmin Le Grand             return mpFillGraphicAttribute->getOffsetY();
209035a2f44SArmin Le Grand         }
210035a2f44SArmin Le Grand 
211035a2f44SArmin Le Grand     } // end of namespace attribute
212035a2f44SArmin Le Grand } // end of namespace drawinglayer
213035a2f44SArmin Le Grand 
214035a2f44SArmin Le Grand //////////////////////////////////////////////////////////////////////////////
215035a2f44SArmin Le Grand // eof
216