/**************************************************************
 *
 * 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 <drawinglayer/attribute/fontattribute.hxx>
#include <tools/string.hxx>

//////////////////////////////////////////////////////////////////////////////

namespace drawinglayer
{
	namespace attribute
	{
		class ImpFontAttribute
		{
		public:
			// refcounter
			sal_uInt32								mnRefCount;

            /// core data
			String   									maFamilyName;       // Font Family Name
			String   									maStyleName;        // Font Style Name
			sal_uInt16									mnWeight;           // Font weight

			/// bitfield
			unsigned									mbSymbol : 1;       // Symbol Font Flag
			unsigned									mbVertical : 1;     // Vertical Text Flag
			unsigned									mbItalic : 1;       // Italic Flag
			unsigned									mbOutline : 1;      // Outline Flag
            unsigned                                    mbRTL : 1;          // RTL Flag
            unsigned                                    mbBiDiStrong : 1;   // BiDi Flag
            unsigned                                    mbMonospaced : 1;

            ImpFontAttribute(
                const String& rFamilyName,
                const String& rStyleName,
                sal_uInt16 nWeight,
                bool bSymbol,
                bool bVertical,
                bool bItalic,
                bool bMonospaced,
                bool bOutline,
                bool bRTL,
                bool bBiDiStrong)
			:	mnRefCount(0),
                maFamilyName(rFamilyName),
			    maStyleName(rStyleName),
			    mnWeight(nWeight),
			    mbSymbol(bSymbol),
			    mbVertical(bVertical),
			    mbItalic(bItalic),
			    mbOutline(bOutline),
                mbRTL(bRTL),
                mbBiDiStrong(bBiDiStrong),
                mbMonospaced(bMonospaced)
            {
            }

            // data read access
            const String& getFamilyName() const { return maFamilyName; }
            const String& getStyleName() const { return maStyleName; }
            sal_uInt16 getWeight() const { return mnWeight; }
            bool getSymbol() const { return mbSymbol; }
            bool getVertical() const { return mbVertical; }
            bool getItalic() const { return mbItalic; }
            bool getOutline() const { return mbOutline; }
            bool getRTL() const { return mbRTL; }
            bool getBiDiStrong() const { return mbBiDiStrong; }
            bool getMonospaced() const { return mbMonospaced; }

            bool operator==(const ImpFontAttribute& rCompare) const
            {
			    return (getFamilyName() == rCompare.getFamilyName()
				    && getStyleName() == rCompare.getStyleName()
				    && getWeight() == rCompare.getWeight()
				    && getSymbol() == rCompare.getSymbol()
				    && getVertical() == rCompare.getVertical()
				    && getItalic() == rCompare.getItalic()
				    && getOutline() == rCompare.getOutline()
				    && getRTL() == rCompare.getRTL()
				    && getBiDiStrong() == rCompare.getBiDiStrong()
				    && getMonospaced() == rCompare.getMonospaced());
            }

            static ImpFontAttribute* get_global_default()
            {
                static ImpFontAttribute* pDefault = 0;

                if(!pDefault)
                {
                    pDefault = new ImpFontAttribute(
                        String(), String(),
                        0,
                        false, false, false, false, false, false, false);

                    // never delete; start with RefCount 1, not 0
    			    pDefault->mnRefCount++;
                }

                return pDefault;
            }
		};

        FontAttribute::FontAttribute(
            const String& rFamilyName,
            const String& rStyleName,
            sal_uInt16 nWeight,
            bool bSymbol,
            bool bVertical,
            bool bItalic,
            bool bMonospaced,
            bool bOutline,
            bool bRTL,
            bool bBiDiStrong)
		:	mpFontAttribute(new ImpFontAttribute(
                rFamilyName, rStyleName, nWeight, bSymbol, bVertical, bItalic, bMonospaced, bOutline, bRTL, bBiDiStrong))
		{
		}

		FontAttribute::FontAttribute()
        :	mpFontAttribute(ImpFontAttribute::get_global_default())
		{
			mpFontAttribute->mnRefCount++;
		}

		FontAttribute::FontAttribute(const FontAttribute& rCandidate)
		:	mpFontAttribute(rCandidate.mpFontAttribute)
		{
			mpFontAttribute->mnRefCount++;
		}

		FontAttribute::~FontAttribute()
		{
			if(mpFontAttribute->mnRefCount)
			{
				mpFontAttribute->mnRefCount--;
			}
			else
			{
				delete mpFontAttribute;
			}
		}

        bool FontAttribute::isDefault() const
        {
            return mpFontAttribute == ImpFontAttribute::get_global_default();
        }

        FontAttribute& FontAttribute::operator=(const FontAttribute& rCandidate)
		{
			if(rCandidate.mpFontAttribute != mpFontAttribute)
			{
				if(mpFontAttribute->mnRefCount)
				{
					mpFontAttribute->mnRefCount--;
				}
				else
				{
					delete mpFontAttribute;
				}

				mpFontAttribute = rCandidate.mpFontAttribute;
				mpFontAttribute->mnRefCount++;
			}

			return *this;
		}

		bool FontAttribute::operator==(const FontAttribute& rCandidate) const
		{
			if(rCandidate.mpFontAttribute == mpFontAttribute)
			{
				return true;
			}

			if(rCandidate.isDefault() != isDefault())
			{
				return false;
			}

			return (*rCandidate.mpFontAttribute == *mpFontAttribute);
		}

        const String& FontAttribute::getFamilyName() const
        {
            return mpFontAttribute->getFamilyName();
        }

        const String& FontAttribute::getStyleName() const
        {
            return mpFontAttribute->getStyleName();
        }

        sal_uInt16 FontAttribute::getWeight() const
        {
            return mpFontAttribute->getWeight();
        }

        bool FontAttribute::getSymbol() const
        {
            return mpFontAttribute->getSymbol();
        }

        bool FontAttribute::getVertical() const
        {
            return mpFontAttribute->getVertical();
        }

        bool FontAttribute::getItalic() const
        {
            return mpFontAttribute->getItalic();
        }

        bool FontAttribute::getOutline() const
        {
            return mpFontAttribute->getOutline();
        }

        bool FontAttribute::getRTL() const
        {
            return mpFontAttribute->getRTL();
        }

        bool FontAttribute::getBiDiStrong() const
        {
            return mpFontAttribute->getBiDiStrong();
        }

        bool FontAttribute::getMonospaced() const
        {
            return mpFontAttribute->getMonospaced();
        }


    } // end of namespace attribute
} // end of namespace drawinglayer

//////////////////////////////////////////////////////////////////////////////
// eof
