blob: eb98ff359431398b8ebd5285c1e53e4ff343caa6 [file] [log] [blame]
/**************************************************************
*
* 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