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