diff --git a/include/vcl/font.hxx b/include/vcl/font.hxx index 14b02651f55f..04052ad3f47a 100644 --- a/include/vcl/font.hxx +++ b/include/vcl/font.hxx @@ -81,6 +81,9 @@ public: FontFamily GetFamily() const; void SetCharSet( rtl_TextEncoding ); rtl_TextEncoding GetCharSet() const; + void SetSymbolFlag( bool ); + bool IsSymbolFont() const; + // Prefer LanguageTag over LanguageType void SetLanguageTag( const LanguageTag & ); const LanguageTag& GetLanguageTag() const; diff --git a/vcl/CppunitTest_vcl_font.mk b/vcl/CppunitTest_vcl_font.mk new file mode 100644 index 000000000000..910f540cbd7e --- /dev/null +++ b/vcl/CppunitTest_vcl_font.mk @@ -0,0 +1,53 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,vcl_font)) + +$(eval $(call gb_CppunitTest_set_include,vcl_font,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,vcl_font, \ + vcl/qa/cppunit/font \ +)) + +$(eval $(call gb_CppunitTest_use_externals,vcl_font,boost_headers)) + +$(eval $(call gb_CppunitTest_use_libraries,vcl_font, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + svt \ + test \ + tl \ + tk \ + unotest \ + vcl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_api,vcl_font,\ + udkapi \ + offapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,vcl_font)) +$(eval $(call gb_CppunitTest_use_vcl,vcl_font)) + +$(eval $(call gb_CppunitTest_use_components,vcl_font,\ + configmgr/source/configmgr \ + i18npool/util/i18npool \ + ucb/source/core/ucb1 \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,vcl_font)) + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index 0be5a4bb18bc..299ffb11f4ac 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -97,6 +97,7 @@ $(eval $(call gb_Module_add_check_targets,vcl,\ CppunitTest_vcl_lifecycle \ CppunitTest_vcl_bitmap_test \ CppunitTest_vcl_fontcharmap \ + CppunitTest_vcl_font \ CppunitTest_vcl_fontmetric \ CppunitTest_vcl_complextext \ CppunitTest_vcl_filters_test \ diff --git a/vcl/inc/fontattributes.hxx b/vcl/inc/fontattributes.hxx index 53b122d834ab..5ab9b4fd9b1d 100644 --- a/vcl/inc/fontattributes.hxx +++ b/vcl/inc/fontattributes.hxx @@ -117,9 +117,22 @@ inline void FontAttributes::SetSymbolFlag( const bool bSymbolFlag ) { mbSymbolFlag = bSymbolFlag; if ( bSymbolFlag ) + { meCharSet = RTL_TEXTENCODING_SYMBOL; + } + else + { + // if the symbol flag is unset, but it was a symbol font before then + // until the character set encoding is set via SetCharSet then we + // can't know what the characterset is! + if ( meCharSet == RTL_TEXTENCODING_SYMBOL ) + { + meCharSet = RTL_TEXTENCODING_DONTKNOW; + } + } } + inline void FontAttributes::SetCharSet( const rtl_TextEncoding aEncoding ) { meCharSet = aEncoding; diff --git a/vcl/inc/impfont.hxx b/vcl/inc/impfont.hxx index 8e134941f02d..cc4d19429cea 100644 --- a/vcl/inc/impfont.hxx +++ b/vcl/inc/impfont.hxx @@ -52,6 +52,7 @@ private: Color maColor; // compatibility, now on output device Color maFillColor; // compatibility, now on output device rtl_TextEncoding meCharSet; + bool mbSymbol; LanguageTag maLanguageTag; LanguageTag maCJKLanguageTag; FontFamily meFamily; diff --git a/vcl/source/font/font.cxx b/vcl/source/font/font.cxx index c01e5a73dca8..28c80bb1e432 100644 --- a/vcl/source/font/font.cxx +++ b/vcl/source/font/font.cxx @@ -37,191 +37,6 @@ using namespace vcl; -ImplFont::ImplFont() : - mnRefCount( 1 ), - maColor( COL_TRANSPARENT ), - maFillColor( COL_TRANSPARENT ), - meCharSet( RTL_TEXTENCODING_DONTKNOW ), - maLanguageTag( LANGUAGE_DONTKNOW ), - maCJKLanguageTag( LANGUAGE_DONTKNOW ), - meFamily( FAMILY_DONTKNOW ), - mePitch( PITCH_DONTKNOW ), - meAlign( ALIGN_TOP ), - meWeight( WEIGHT_DONTKNOW ), - meWidthType( WIDTH_DONTKNOW ), - meItalic( ITALIC_NONE ), - meUnderline( UNDERLINE_NONE ), - meOverline( UNDERLINE_NONE ), - meStrikeout( STRIKEOUT_NONE ), - meRelief( RELIEF_NONE ), - meEmphasisMark( EMPHASISMARK_NONE ), - mnOrientation( 0 ), - mnKerning( FontKerning::NONE ), - mbWordLine( false ), - mbOutline( false ), - mbConfigLookup( false ), - mbShadow( false ), - mbVertical( false ), - mbTransparent( true ) -{} - -ImplFont::ImplFont( const ImplFont& rImplFont ) : - mnRefCount( 1 ), - maFamilyName( rImplFont.maFamilyName ), - maStyleName( rImplFont.maStyleName ), - maSize( rImplFont.maSize ), - maColor( rImplFont.maColor ), - maFillColor( rImplFont.maFillColor ), - meCharSet( rImplFont.meCharSet ), - maLanguageTag( rImplFont.maLanguageTag ), - maCJKLanguageTag( rImplFont.maCJKLanguageTag ), - meFamily( rImplFont.meFamily ), - mePitch( rImplFont.mePitch ), - meAlign( rImplFont.meAlign ), - meWeight( rImplFont.meWeight ), - meWidthType( rImplFont.meWidthType ), - meItalic( rImplFont.meItalic ), - meUnderline( rImplFont.meUnderline ), - meOverline( rImplFont.meOverline ), - meStrikeout( rImplFont.meStrikeout ), - meRelief( rImplFont.meRelief ), - meEmphasisMark( rImplFont.meEmphasisMark ), - mnOrientation( rImplFont.mnOrientation ), - mnKerning( rImplFont.mnKerning ), - mbWordLine( rImplFont.mbWordLine ), - mbOutline( rImplFont.mbOutline ), - mbConfigLookup( rImplFont.mbConfigLookup ), - mbShadow( rImplFont.mbShadow ), - mbVertical( rImplFont.mbVertical ), - mbTransparent( rImplFont.mbTransparent ) -{} - -bool ImplFont::operator==( const ImplFont& rOther ) const -{ - // equality tests split up for easier debugging - if( (meWeight != rOther.meWeight) - || (meItalic != rOther.meItalic) - || (meFamily != rOther.meFamily) - || (mePitch != rOther.mePitch) ) - return false; - - if( (meCharSet != rOther.meCharSet) - || (maLanguageTag != rOther.maLanguageTag) - || (maCJKLanguageTag != rOther.maCJKLanguageTag) - || (meAlign != rOther.meAlign) ) - return false; - - if( (maSize != rOther.maSize) - || (mnOrientation != rOther.mnOrientation) - || (mbVertical != rOther.mbVertical) ) - return false; - - if( (maFamilyName != rOther.maFamilyName) - || (maStyleName != rOther.maStyleName) ) - return false; - - if( (maColor != rOther.maColor) - || (maFillColor != rOther.maFillColor) ) - return false; - - if( (meUnderline != rOther.meUnderline) - || (meOverline != rOther.meOverline) - || (meStrikeout != rOther.meStrikeout) - || (meRelief != rOther.meRelief) - || (meEmphasisMark != rOther.meEmphasisMark) - || (mbWordLine != rOther.mbWordLine) - || (mbOutline != rOther.mbOutline) - || (mbShadow != rOther.mbShadow) - || (mnKerning != rOther.mnKerning) - || (mbTransparent != rOther.mbTransparent) ) - return false; - - return true; -} - -void ImplFont::AskConfig() -{ - if( mbConfigLookup ) - return; - - mbConfigLookup = true; - - // prepare the FontSubst configuration lookup - const utl::FontSubstConfiguration& rFontSubst = utl::FontSubstConfiguration::get(); - - OUString aShortName; - OUString aFamilyName; - ImplFontAttrs nType = ImplFontAttrs::None; - FontWeight eWeight = WEIGHT_DONTKNOW; - FontWidth eWidthType = WIDTH_DONTKNOW; - OUString aMapName = GetEnglishSearchFontName( maFamilyName ); - - utl::FontSubstConfiguration::getMapName( aMapName, - aShortName, aFamilyName, eWeight, eWidthType, nType ); - - // lookup the font name in the configuration - const utl::FontNameAttr* pFontAttr = rFontSubst.getSubstInfo( aMapName ); - - // if the direct lookup failed try again with an alias name - if ( !pFontAttr && (aShortName != aMapName) ) - pFontAttr = rFontSubst.getSubstInfo( aShortName ); - - if( pFontAttr ) - { - // the font was found in the configuration - if( meFamily == FAMILY_DONTKNOW ) - { - if ( pFontAttr->Type & ImplFontAttrs::Serif ) - meFamily = FAMILY_ROMAN; - else if ( pFontAttr->Type & ImplFontAttrs::SansSerif ) - meFamily = FAMILY_SWISS; - else if ( pFontAttr->Type & ImplFontAttrs::Typewriter ) - meFamily = FAMILY_MODERN; - else if ( pFontAttr->Type & ImplFontAttrs::Italic ) - meFamily = FAMILY_SCRIPT; - else if ( pFontAttr->Type & ImplFontAttrs::Decorative ) - meFamily = FAMILY_DECORATIVE; - } - - if( mePitch == PITCH_DONTKNOW ) - { - if ( pFontAttr->Type & ImplFontAttrs::Fixed ) - mePitch = PITCH_FIXED; - } - } - - // if some attributes are still unknown then use the FontSubst magic - if( meFamily == FAMILY_DONTKNOW ) - { - if( nType & ImplFontAttrs::Serif ) - meFamily = FAMILY_ROMAN; - else if( nType & ImplFontAttrs::SansSerif ) - meFamily = FAMILY_SWISS; - else if( nType & ImplFontAttrs::Typewriter ) - meFamily = FAMILY_MODERN; - else if( nType & ImplFontAttrs::Italic ) - meFamily = FAMILY_SCRIPT; - else if( nType & ImplFontAttrs::Decorative ) - meFamily = FAMILY_DECORATIVE; - } - - if( meWeight == WEIGHT_DONTKNOW ) - meWeight = eWeight; - if( meWidthType == WIDTH_DONTKNOW ) - meWidthType = eWidthType; -} - -void Font::MakeUnique() -{ - // create a copy if others still reference it - if ( mpImplFont->mnRefCount != 1 ) - { - if ( mpImplFont->mnRefCount ) - mpImplFont->mnRefCount--; - mpImplFont = new ImplFont( *mpImplFont ); - } -} - Font::Font() { static ImplFont aStaticImplFont; @@ -276,6 +91,17 @@ Font::~Font() } } +void Font::MakeUnique() +{ + // create a copy if others still reference it + if ( mpImplFont->mnRefCount != 1 ) + { + if ( mpImplFont->mnRefCount ) + mpImplFont->mnRefCount--; + mpImplFont = new ImplFont( *mpImplFont ); + } +} + void Font::SetColor( const Color& rColor ) { if( mpImplFont->maColor != rColor ) @@ -347,6 +173,31 @@ void Font::SetCharSet( rtl_TextEncoding eCharSet ) { MakeUnique(); mpImplFont->meCharSet = eCharSet; + + if ( eCharSet == RTL_TEXTENCODING_SYMBOL ) + mpImplFont->mbSymbol = true; + else + mpImplFont->mbSymbol = false; + } +} + +bool Font::IsSymbolFont() const +{ + return mpImplFont->mbSymbol; +} + +void Font::SetSymbolFlag( bool bSymbol ) +{ + mpImplFont->mbSymbol = bSymbol; + + if ( bSymbol ) + { + mpImplFont->meCharSet = RTL_TEXTENCODING_SYMBOL; + } + else + { + if ( mpImplFont->meCharSet == RTL_TEXTENCODING_SYMBOL ) + mpImplFont->meCharSet = RTL_TEXTENCODING_DONTKNOW; } } @@ -985,4 +836,182 @@ bool Font::IsWordLineMode() const { return mpImplFont->mbWordLine; } bool Font::IsSameInstance( const vcl::Font& rFont ) const { return (mpImplFont == rFont.mpImplFont); } + + +ImplFont::ImplFont() : + mnRefCount( 1 ), + maColor( COL_TRANSPARENT ), + maFillColor( COL_TRANSPARENT ), + meCharSet( RTL_TEXTENCODING_DONTKNOW ), + mbSymbol( false ), + maLanguageTag( LANGUAGE_DONTKNOW ), + maCJKLanguageTag( LANGUAGE_DONTKNOW ), + meFamily( FAMILY_DONTKNOW ), + mePitch( PITCH_DONTKNOW ), + meAlign( ALIGN_TOP ), + meWeight( WEIGHT_DONTKNOW ), + meWidthType( WIDTH_DONTKNOW ), + meItalic( ITALIC_NONE ), + meUnderline( UNDERLINE_NONE ), + meOverline( UNDERLINE_NONE ), + meStrikeout( STRIKEOUT_NONE ), + meRelief( RELIEF_NONE ), + meEmphasisMark( EMPHASISMARK_NONE ), + mnOrientation( 0 ), + mnKerning( FontKerning::NONE ), + mbWordLine( false ), + mbOutline( false ), + mbConfigLookup( false ), + mbShadow( false ), + mbVertical( false ), + mbTransparent( true ) +{} + +ImplFont::ImplFont( const ImplFont& rImplFont ) : + mnRefCount( 1 ), + maFamilyName( rImplFont.maFamilyName ), + maStyleName( rImplFont.maStyleName ), + maSize( rImplFont.maSize ), + maColor( rImplFont.maColor ), + maFillColor( rImplFont.maFillColor ), + meCharSet( rImplFont.meCharSet ), + mbSymbol( false ), + maLanguageTag( rImplFont.maLanguageTag ), + maCJKLanguageTag( rImplFont.maCJKLanguageTag ), + meFamily( rImplFont.meFamily ), + mePitch( rImplFont.mePitch ), + meAlign( rImplFont.meAlign ), + meWeight( rImplFont.meWeight ), + meWidthType( rImplFont.meWidthType ), + meItalic( rImplFont.meItalic ), + meUnderline( rImplFont.meUnderline ), + meOverline( rImplFont.meOverline ), + meStrikeout( rImplFont.meStrikeout ), + meRelief( rImplFont.meRelief ), + meEmphasisMark( rImplFont.meEmphasisMark ), + mnOrientation( rImplFont.mnOrientation ), + mnKerning( rImplFont.mnKerning ), + mbWordLine( rImplFont.mbWordLine ), + mbOutline( rImplFont.mbOutline ), + mbConfigLookup( rImplFont.mbConfigLookup ), + mbShadow( rImplFont.mbShadow ), + mbVertical( rImplFont.mbVertical ), + mbTransparent( rImplFont.mbTransparent ) +{} + +bool ImplFont::operator==( const ImplFont& rOther ) const +{ + // equality tests split up for easier debugging + if( (meWeight != rOther.meWeight) + || (meItalic != rOther.meItalic) + || (meFamily != rOther.meFamily) + || (mePitch != rOther.mePitch) ) + return false; + + if( (meCharSet != rOther.meCharSet) + || (maLanguageTag != rOther.maLanguageTag) + || (maCJKLanguageTag != rOther.maCJKLanguageTag) + || (meAlign != rOther.meAlign) ) + return false; + + if( (maSize != rOther.maSize) + || (mnOrientation != rOther.mnOrientation) + || (mbVertical != rOther.mbVertical) ) + return false; + + if( (maFamilyName != rOther.maFamilyName) + || (maStyleName != rOther.maStyleName) ) + return false; + + if( (maColor != rOther.maColor) + || (maFillColor != rOther.maFillColor) ) + return false; + + if( (meUnderline != rOther.meUnderline) + || (meOverline != rOther.meOverline) + || (meStrikeout != rOther.meStrikeout) + || (meRelief != rOther.meRelief) + || (meEmphasisMark != rOther.meEmphasisMark) + || (mbWordLine != rOther.mbWordLine) + || (mbOutline != rOther.mbOutline) + || (mbShadow != rOther.mbShadow) + || (mnKerning != rOther.mnKerning) + || (mbTransparent != rOther.mbTransparent) ) + return false; + + return true; +} + +void ImplFont::AskConfig() +{ + if( mbConfigLookup ) + return; + + mbConfigLookup = true; + + // prepare the FontSubst configuration lookup + const utl::FontSubstConfiguration& rFontSubst = utl::FontSubstConfiguration::get(); + + OUString aShortName; + OUString aFamilyName; + ImplFontAttrs nType = ImplFontAttrs::None; + FontWeight eWeight = WEIGHT_DONTKNOW; + FontWidth eWidthType = WIDTH_DONTKNOW; + OUString aMapName = GetEnglishSearchFontName( maFamilyName ); + + utl::FontSubstConfiguration::getMapName( aMapName, + aShortName, aFamilyName, eWeight, eWidthType, nType ); + + // lookup the font name in the configuration + const utl::FontNameAttr* pFontAttr = rFontSubst.getSubstInfo( aMapName ); + + // if the direct lookup failed try again with an alias name + if ( !pFontAttr && (aShortName != aMapName) ) + pFontAttr = rFontSubst.getSubstInfo( aShortName ); + + if( pFontAttr ) + { + // the font was found in the configuration + if( meFamily == FAMILY_DONTKNOW ) + { + if ( pFontAttr->Type & ImplFontAttrs::Serif ) + meFamily = FAMILY_ROMAN; + else if ( pFontAttr->Type & ImplFontAttrs::SansSerif ) + meFamily = FAMILY_SWISS; + else if ( pFontAttr->Type & ImplFontAttrs::Typewriter ) + meFamily = FAMILY_MODERN; + else if ( pFontAttr->Type & ImplFontAttrs::Italic ) + meFamily = FAMILY_SCRIPT; + else if ( pFontAttr->Type & ImplFontAttrs::Decorative ) + meFamily = FAMILY_DECORATIVE; + } + + if( mePitch == PITCH_DONTKNOW ) + { + if ( pFontAttr->Type & ImplFontAttrs::Fixed ) + mePitch = PITCH_FIXED; + } + } + + // if some attributes are still unknown then use the FontSubst magic + if( meFamily == FAMILY_DONTKNOW ) + { + if( nType & ImplFontAttrs::Serif ) + meFamily = FAMILY_ROMAN; + else if( nType & ImplFontAttrs::SansSerif ) + meFamily = FAMILY_SWISS; + else if( nType & ImplFontAttrs::Typewriter ) + meFamily = FAMILY_MODERN; + else if( nType & ImplFontAttrs::Italic ) + meFamily = FAMILY_SCRIPT; + else if( nType & ImplFontAttrs::Decorative ) + meFamily = FAMILY_DECORATIVE; + } + + if( meWeight == WEIGHT_DONTKNOW ) + meWeight = eWeight; + if( meWidthType == WIDTH_DONTKNOW ) + meWidthType = eWidthType; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */