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/fillgraphicattribute.hxx>
28 #include <vcl/graph.hxx>
29 
30 //////////////////////////////////////////////////////////////////////////////
31 
32 namespace drawinglayer
33 {
34 	namespace attribute
35 	{
36 		class ImpFillGraphicAttribute
37 		{
38 		public:
39 			// refcounter
40 			sal_uInt32								mnRefCount;
41 
42             // data definitions
43 			Graphic                                 maGraphic;
44 			basegfx::B2DRange						maGraphicRange;
45 
46             // tiling definitions, offsets in X/Y in percent for each 2nd row.
47             // If both are set, Y is ignored (X has precedence)
48             double                                  mfOffsetX;
49             double                                  mfOffsetY;
50 
51 			// bitfield
52 			unsigned								mbTiling : 1;
53 
54 			ImpFillGraphicAttribute(
55                 const Graphic& rGraphic,
56                 const basegfx::B2DRange& rGraphicRange,
57                 bool bTiling,
58                 double fOffsetX,
59                 double fOffsetY)
60 			:	mnRefCount(0),
61 		    	maGraphic(rGraphic),
62 			    maGraphicRange(rGraphicRange),
63                 mfOffsetX(fOffsetX),
64                 mfOffsetY(fOffsetY),
65 			    mbTiling(bTiling)
66 		    {
67 		    }
68 
69 			// data read access
70 			const Graphic& getGraphic() const { return maGraphic; }
71 			const basegfx::B2DRange& getGraphicRange() const { return maGraphicRange; }
72 			bool getTiling() const { return mbTiling; }
73             double getOffsetX() const { return mfOffsetX; }
74             double getOffsetY() const { return mfOffsetY; }
75 
76             bool operator==(const ImpFillGraphicAttribute& rCandidate) const
77 		    {
78 			    return (getGraphic() == rCandidate.getGraphic()
79 				    && getGraphicRange() == rCandidate.getGraphicRange()
80 				    && getTiling() == rCandidate.getTiling()
81                     && getOffsetX() == rCandidate.getOffsetX()
82                     && getOffsetY() == rCandidate.getOffsetY());
83 		    }
84 
85             static ImpFillGraphicAttribute* get_global_default()
86             {
87                 static ImpFillGraphicAttribute* pDefault = 0;
88 
89                 if(!pDefault)
90                 {
91                     pDefault = new ImpFillGraphicAttribute(
92                         Graphic(),
93                         basegfx::B2DRange(),
94                         false,
95                         0.0,
96                         0.0);
97 
98                     // never delete; start with RefCount 1, not 0
99     			    pDefault->mnRefCount++;
100                 }
101 
102                 return pDefault;
103             }
104 		};
105 
106         FillGraphicAttribute::FillGraphicAttribute(
107             const Graphic& rGraphic,
108             const basegfx::B2DRange& rGraphicRange,
109             bool bTiling,
110             double fOffsetX,
111             double fOffsetY)
112 		:	mpFillGraphicAttribute(
113                 new ImpFillGraphicAttribute(
114                     rGraphic,
115                     rGraphicRange,
116                     bTiling,
117                     basegfx::clamp(fOffsetX, 0.0, 1.0),
118                     basegfx::clamp(fOffsetY, 0.0, 1.0)))
119 		{
120 		}
121 
122 		FillGraphicAttribute::FillGraphicAttribute()
123         :	mpFillGraphicAttribute(ImpFillGraphicAttribute::get_global_default())
124 		{
125 			mpFillGraphicAttribute->mnRefCount++;
126 		}
127 
128         FillGraphicAttribute::FillGraphicAttribute(const FillGraphicAttribute& rCandidate)
129 		:	mpFillGraphicAttribute(rCandidate.mpFillGraphicAttribute)
130 		{
131 			mpFillGraphicAttribute->mnRefCount++;
132 		}
133 
134 		FillGraphicAttribute::~FillGraphicAttribute()
135 		{
136 			if(mpFillGraphicAttribute->mnRefCount)
137 			{
138 				mpFillGraphicAttribute->mnRefCount--;
139 			}
140 			else
141 			{
142 				delete mpFillGraphicAttribute;
143 			}
144 		}
145 
146         bool FillGraphicAttribute::isDefault() const
147         {
148             return mpFillGraphicAttribute == ImpFillGraphicAttribute::get_global_default();
149         }
150 
151         FillGraphicAttribute& FillGraphicAttribute::operator=(const FillGraphicAttribute& rCandidate)
152 		{
153 			if(rCandidate.mpFillGraphicAttribute != mpFillGraphicAttribute)
154 			{
155 				if(mpFillGraphicAttribute->mnRefCount)
156 				{
157 					mpFillGraphicAttribute->mnRefCount--;
158 				}
159 				else
160 				{
161 					delete mpFillGraphicAttribute;
162 				}
163 
164 				mpFillGraphicAttribute = rCandidate.mpFillGraphicAttribute;
165 				mpFillGraphicAttribute->mnRefCount++;
166 			}
167 
168 			return *this;
169 		}
170 
171 		bool FillGraphicAttribute::operator==(const FillGraphicAttribute& rCandidate) const
172 		{
173 			if(rCandidate.mpFillGraphicAttribute == mpFillGraphicAttribute)
174 			{
175 				return true;
176 			}
177 
178 			if(rCandidate.isDefault() != isDefault())
179 			{
180 				return false;
181 			}
182 
183 			return (*rCandidate.mpFillGraphicAttribute == *mpFillGraphicAttribute);
184 		}
185 
186         const Graphic& FillGraphicAttribute::getGraphic() const
187         {
188             return mpFillGraphicAttribute->getGraphic();
189         }
190 
191         const basegfx::B2DRange& FillGraphicAttribute::getGraphicRange() const
192         {
193             return mpFillGraphicAttribute->getGraphicRange();
194         }
195 
196         bool FillGraphicAttribute::getTiling() const
197         {
198             return mpFillGraphicAttribute->getTiling();
199         }
200 
201         double FillGraphicAttribute::getOffsetX() const
202         {
203             return mpFillGraphicAttribute->getOffsetX();
204         }
205 
206         double FillGraphicAttribute::getOffsetY() const
207         {
208             return mpFillGraphicAttribute->getOffsetY();
209         }
210 
211     } // end of namespace attribute
212 } // end of namespace drawinglayer
213 
214 //////////////////////////////////////////////////////////////////////////////
215 // eof
216