/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_drawinglayer.hxx" #include #include ////////////////////////////////////////////////////////////////////////////// namespace drawinglayer { namespace attribute { class ImpSdrLineStartEndAttribute { public: // refcounter sal_uInt32 mnRefCount; // line arrow definitions basegfx::B2DPolyPolygon maStartPolyPolygon; // start Line PolyPolygon basegfx::B2DPolyPolygon maEndPolyPolygon; // end Line PolyPolygon double mfStartWidth; // 1/100th mm double mfEndWidth; // 1/100th mm // bitfield unsigned mbStartActive : 1L; // start of Line is active unsigned mbEndActive : 1L; // end of Line is active unsigned mbStartCentered : 1L; // Line is centered on line start point unsigned mbEndCentered : 1L; // Line is centered on line end point ImpSdrLineStartEndAttribute( const basegfx::B2DPolyPolygon& rStartPolyPolygon, const basegfx::B2DPolyPolygon& rEndPolyPolygon, double fStartWidth, double fEndWidth, bool bStartActive, bool bEndActive, bool bStartCentered, bool bEndCentered) : mnRefCount(0), maStartPolyPolygon(rStartPolyPolygon), maEndPolyPolygon(rEndPolyPolygon), mfStartWidth(fStartWidth), mfEndWidth(fEndWidth), mbStartActive(bStartActive), mbEndActive(bEndActive), mbStartCentered(bStartCentered), mbEndCentered(bEndCentered) { } // data read access const basegfx::B2DPolyPolygon& getStartPolyPolygon() const { return maStartPolyPolygon; } const basegfx::B2DPolyPolygon& getEndPolyPolygon() const { return maEndPolyPolygon; } double getStartWidth() const { return mfStartWidth; } double getEndWidth() const { return mfEndWidth; } bool isStartActive() const { return mbStartActive; } bool isEndActive() const { return mbEndActive; } bool isStartCentered() const { return mbStartCentered; } bool isEndCentered() const { return mbEndCentered; } bool operator==(const ImpSdrLineStartEndAttribute& rCandidate) const { return (getStartPolyPolygon() == rCandidate.getStartPolyPolygon() && getEndPolyPolygon() == rCandidate.getEndPolyPolygon() && getStartWidth() == rCandidate.getStartWidth() && getEndWidth() == rCandidate.getEndWidth() && isStartActive() == rCandidate.isStartActive() && isEndActive() == rCandidate.isEndActive() && isStartCentered() == rCandidate.isStartCentered() && isEndCentered() == rCandidate.isEndCentered()); } static ImpSdrLineStartEndAttribute* get_global_default() { static ImpSdrLineStartEndAttribute* pDefault = 0; if(!pDefault) { pDefault = new ImpSdrLineStartEndAttribute( basegfx::B2DPolyPolygon(), basegfx::B2DPolyPolygon(), 0.0, 0.0, false, false, false, false); // never delete; start with RefCount 1, not 0 pDefault->mnRefCount++; } return pDefault; } }; SdrLineStartEndAttribute::SdrLineStartEndAttribute( const basegfx::B2DPolyPolygon& rStartPolyPolygon, const basegfx::B2DPolyPolygon& rEndPolyPolygon, double fStartWidth, double fEndWidth, bool bStartActive, bool bEndActive, bool bStartCentered, bool bEndCentered) : mpSdrLineStartEndAttribute(new ImpSdrLineStartEndAttribute( rStartPolyPolygon, rEndPolyPolygon, fStartWidth, fEndWidth, bStartActive, bEndActive, bStartCentered, bEndCentered)) { } SdrLineStartEndAttribute::SdrLineStartEndAttribute() : mpSdrLineStartEndAttribute(ImpSdrLineStartEndAttribute::get_global_default()) { mpSdrLineStartEndAttribute->mnRefCount++; } SdrLineStartEndAttribute::SdrLineStartEndAttribute(const SdrLineStartEndAttribute& rCandidate) : mpSdrLineStartEndAttribute(rCandidate.mpSdrLineStartEndAttribute) { mpSdrLineStartEndAttribute->mnRefCount++; } SdrLineStartEndAttribute::~SdrLineStartEndAttribute() { if(mpSdrLineStartEndAttribute->mnRefCount) { mpSdrLineStartEndAttribute->mnRefCount--; } else { delete mpSdrLineStartEndAttribute; } } bool SdrLineStartEndAttribute::isDefault() const { return mpSdrLineStartEndAttribute == ImpSdrLineStartEndAttribute::get_global_default(); } SdrLineStartEndAttribute& SdrLineStartEndAttribute::operator=(const SdrLineStartEndAttribute& rCandidate) { if(rCandidate.mpSdrLineStartEndAttribute != mpSdrLineStartEndAttribute) { if(mpSdrLineStartEndAttribute->mnRefCount) { mpSdrLineStartEndAttribute->mnRefCount--; } else { delete mpSdrLineStartEndAttribute; } mpSdrLineStartEndAttribute = rCandidate.mpSdrLineStartEndAttribute; mpSdrLineStartEndAttribute->mnRefCount++; } return *this; } bool SdrLineStartEndAttribute::operator==(const SdrLineStartEndAttribute& rCandidate) const { if(rCandidate.mpSdrLineStartEndAttribute == mpSdrLineStartEndAttribute) { return true; } if(rCandidate.isDefault() != isDefault()) { return false; } return (*rCandidate.mpSdrLineStartEndAttribute == *mpSdrLineStartEndAttribute); } const basegfx::B2DPolyPolygon& SdrLineStartEndAttribute::getStartPolyPolygon() const { return mpSdrLineStartEndAttribute->getStartPolyPolygon(); } const basegfx::B2DPolyPolygon& SdrLineStartEndAttribute::getEndPolyPolygon() const { return mpSdrLineStartEndAttribute->getEndPolyPolygon(); } double SdrLineStartEndAttribute::getStartWidth() const { return mpSdrLineStartEndAttribute->getStartWidth(); } double SdrLineStartEndAttribute::getEndWidth() const { return mpSdrLineStartEndAttribute->getEndWidth(); } bool SdrLineStartEndAttribute::isStartActive() const { return mpSdrLineStartEndAttribute->isStartActive(); } bool SdrLineStartEndAttribute::isEndActive() const { return mpSdrLineStartEndAttribute->isEndActive(); } bool SdrLineStartEndAttribute::isStartCentered() const { return mpSdrLineStartEndAttribute->isStartCentered(); } bool SdrLineStartEndAttribute::isEndCentered() const { return mpSdrLineStartEndAttribute->isEndCentered(); } } // end of namespace attribute } // end of namespace drawinglayer ////////////////////////////////////////////////////////////////////////////// // eof