xref: /AOO41X/main/drawinglayer/source/attribute/fillgraphicattribute.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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