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