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/lineattribute.hxx> 28 #include <basegfx/color/bcolor.hxx> 29 30 ////////////////////////////////////////////////////////////////////////////// 31 32 namespace drawinglayer 33 { 34 namespace attribute 35 { 36 class ImpLineAttribute 37 { 38 public: 39 // refcounter 40 sal_uInt32 mnRefCount; 41 42 // data definitions 43 basegfx::BColor maColor; // color 44 double mfWidth; // absolute line width 45 basegfx::B2DLineJoin meLineJoin; // type of LineJoin 46 47 ImpLineAttribute( 48 const basegfx::BColor& rColor, 49 double fWidth, 50 basegfx::B2DLineJoin aB2DLineJoin) 51 : mnRefCount(0), 52 maColor(rColor), 53 mfWidth(fWidth), 54 meLineJoin(aB2DLineJoin) 55 { 56 } 57 58 // data read access 59 const basegfx::BColor& getColor() const { return maColor; } 60 double getWidth() const { return mfWidth; } 61 basegfx::B2DLineJoin getLineJoin() const { return meLineJoin; } 62 63 bool operator==(const ImpLineAttribute& rCandidate) const 64 { 65 return (getColor() == rCandidate.getColor() 66 && getWidth() == rCandidate.getWidth() 67 && getLineJoin() == rCandidate.getLineJoin()); 68 } 69 70 static ImpLineAttribute* get_global_default() 71 { 72 static ImpLineAttribute* pDefault = 0; 73 74 if(!pDefault) 75 { 76 pDefault = new ImpLineAttribute( 77 basegfx::BColor(), 78 0.0, 79 basegfx::B2DLINEJOIN_ROUND); 80 81 // never delete; start with RefCount 1, not 0 82 pDefault->mnRefCount++; 83 } 84 85 return pDefault; 86 } 87 }; 88 89 LineAttribute::LineAttribute( 90 const basegfx::BColor& rColor, 91 double fWidth, 92 basegfx::B2DLineJoin aB2DLineJoin) 93 : mpLineAttribute(new ImpLineAttribute( 94 rColor, fWidth, aB2DLineJoin)) 95 { 96 } 97 98 LineAttribute::LineAttribute() 99 : mpLineAttribute(ImpLineAttribute::get_global_default()) 100 { 101 mpLineAttribute->mnRefCount++; 102 } 103 104 LineAttribute::LineAttribute(const LineAttribute& rCandidate) 105 : mpLineAttribute(rCandidate.mpLineAttribute) 106 { 107 mpLineAttribute->mnRefCount++; 108 } 109 110 LineAttribute::~LineAttribute() 111 { 112 if(mpLineAttribute->mnRefCount) 113 { 114 mpLineAttribute->mnRefCount--; 115 } 116 else 117 { 118 delete mpLineAttribute; 119 } 120 } 121 122 bool LineAttribute::isDefault() const 123 { 124 return mpLineAttribute == ImpLineAttribute::get_global_default(); 125 } 126 127 LineAttribute& LineAttribute::operator=(const LineAttribute& rCandidate) 128 { 129 if(rCandidate.mpLineAttribute != mpLineAttribute) 130 { 131 if(mpLineAttribute->mnRefCount) 132 { 133 mpLineAttribute->mnRefCount--; 134 } 135 else 136 { 137 delete mpLineAttribute; 138 } 139 140 mpLineAttribute = rCandidate.mpLineAttribute; 141 mpLineAttribute->mnRefCount++; 142 } 143 144 return *this; 145 } 146 147 bool LineAttribute::operator==(const LineAttribute& rCandidate) const 148 { 149 if(rCandidate.mpLineAttribute == mpLineAttribute) 150 { 151 return true; 152 } 153 154 if(rCandidate.isDefault() != isDefault()) 155 { 156 return false; 157 } 158 159 return (*rCandidate.mpLineAttribute == *mpLineAttribute); 160 } 161 162 const basegfx::BColor& LineAttribute::getColor() const 163 { 164 return mpLineAttribute->getColor(); 165 } 166 167 double LineAttribute::getWidth() const 168 { 169 return mpLineAttribute->getWidth(); 170 } 171 172 basegfx::B2DLineJoin LineAttribute::getLineJoin() const 173 { 174 return mpLineAttribute->getLineJoin(); 175 } 176 177 } // end of namespace attribute 178 } // end of namespace drawinglayer 179 180 ////////////////////////////////////////////////////////////////////////////// 181 // eof 182