diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2016-01-07 21:51:12 +1100 |
---|---|---|
committer | Chris Sherlock <chris.sherlock79@gmail.com> | 2016-01-07 22:23:08 +1100 |
commit | 50261ea4b7242e365717c77a9370afd1044a97e3 (patch) | |
tree | dfa8cc19d5363bca1b582fe6c4cd95a29bdd0a19 | |
parent | 90e07dd6f5d64a0d0041361c1592a6cd93ff2ac0 (diff) |
vcl: reorganize ImplFontEntry functions
I have moved all ImplFontEntry functions into vcl/source/font/fontentry.cxx
and also created a new hash function that hashes std::pair<sal_UCS4,FontWeight>
types by specializing std::hash.
Change-Id: Ibbe07c38b98e3c976836a895dbfdcaecd5daff8d
-rw-r--r-- | vcl/Library_vcl.mk | 1 | ||||
-rw-r--r-- | vcl/inc/fontentry.hxx | 4 | ||||
-rw-r--r-- | vcl/source/font/fontentry.cxx | 134 | ||||
-rw-r--r-- | vcl/source/outdev/font.cxx | 60 |
4 files changed, 136 insertions, 63 deletions
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 27142a01608e..89132a5d5e1b 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -394,6 +394,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/font/PhysicalFontFace \ vcl/source/font/PhysicalFontFamily \ vcl/source/font/fontselect \ + vcl/source/font/fontentry \ vcl/source/fontsubset/cff \ vcl/source/fontsubset/fontsubset \ vcl/source/fontsubset/gsub \ diff --git a/vcl/inc/fontentry.hxx b/vcl/inc/fontentry.hxx index 2768423d97dd..d654788c4fbe 100644 --- a/vcl/inc/fontentry.hxx +++ b/vcl/inc/fontentry.hxx @@ -61,9 +61,7 @@ private: // cache of Unicode characters and replacement font names // TODO: a fallback map can be shared with many other ImplFontEntries // TODO: at least the ones which just differ in orientation, stretching or height - typedef ::std::pair<sal_UCS4,FontWeight> GFBCacheKey; - struct GFBCacheKey_Hash{ size_t operator()( const GFBCacheKey& ) const; }; - typedef ::std::unordered_map<GFBCacheKey,OUString,GFBCacheKey_Hash> UnicodeFallbackList; + typedef ::std::unordered_map< ::std::pair<sal_UCS4,FontWeight>, OUString > UnicodeFallbackList; UnicodeFallbackList* mpUnicodeFallbackList; }; diff --git a/vcl/source/font/fontentry.cxx b/vcl/source/font/fontentry.cxx new file mode 100644 index 000000000000..ebcf55639c8f --- /dev/null +++ b/vcl/source/font/fontentry.cxx @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include "i18nlangtag/mslangid.hxx" + +#include <unotools/configmgr.hxx> +#include <vcl/virdev.hxx> +#include <vcl/print.hxx> +#include <vcl/outdev.hxx> +#include <vcl/edit.hxx> +#include <vcl/settings.hxx> +#include <vcl/sysdata.hxx> +#include <vcl/fontcharmap.hxx> + +#include "sallayout.hxx" +#include "svdata.hxx" + +#include "impfont.hxx" +#include "outdata.hxx" +#include "fontentry.hxx" +#include "fontattributes.hxx" + +#include "outdev.h" +#include "window.h" + +#include "PhysicalFontCollection.hxx" +#include "PhysicalFontFace.hxx" +#include "PhysicalFontFamily.hxx" + +#include "svids.hrc" + +#include <config_graphite.h> +#if ENABLE_GRAPHITE +#include "graphite_features.hxx" +#endif + +#include "../gdi/pdfwriter_impl.hxx" + +#include <boost/functional/hash.hpp> +#include <cmath> +#include <cstring> +#include <memory> +#include <algorithm> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::rtl; +using namespace ::utl; + +// extend std namespace to add custom hash needed for ImplFontEntry + +namespace std +{ + template <> struct hash< pair< sal_UCS4, FontWeight > > + { + size_t operator()(const pair< sal_UCS4, FontWeight >& rData) const + { + size_t h1 = hash<sal_UCS4>()(rData.first); + size_t h2 = hash<int>()(rData.second); + return h1 ^ h2; + } + }; +} + + +ImplFontEntry::ImplFontEntry( const FontSelectPattern& rFontSelData ) + : m_pFontCache(nullptr) + , maFontSelData( rFontSelData ) + , maFontAttributes( rFontSelData ) + , mpConversion( nullptr ) + , mnLineHeight( 0 ) + , mnRefCount( 1 ) + , mnSetFontFlags( 0 ) + , mnOwnOrientation( 0 ) + , mnOrientation( 0 ) + , mbInit( false ) + , mpUnicodeFallbackList( nullptr ) +{ + maFontSelData.mpFontEntry = this; +} + +ImplFontEntry::~ImplFontEntry() +{ + delete mpUnicodeFallbackList; + m_pFontCache = nullptr; +} + +void ImplFontEntry::AddFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName ) +{ + if( !mpUnicodeFallbackList ) + mpUnicodeFallbackList = new UnicodeFallbackList; + (*mpUnicodeFallbackList)[ std::pair< sal_UCS4, FontWeight >(cChar,eWeight) ] = rFontName; +} + +bool ImplFontEntry::GetFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, OUString* pFontName ) const +{ + if( !mpUnicodeFallbackList ) + return false; + + UnicodeFallbackList::const_iterator it = mpUnicodeFallbackList->find( std::pair< sal_UCS4, FontWeight >(cChar,eWeight) ); + if( it == mpUnicodeFallbackList->end() ) + return false; + + *pFontName = (*it).second; + return true; +} + +void ImplFontEntry::IgnoreFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName ) +{ + UnicodeFallbackList::iterator it = mpUnicodeFallbackList->find( std::pair< sal_UCS4,FontWeight >(cChar,eWeight) ); + if( it == mpUnicodeFallbackList->end() ) + return; + if( (*it).second == rFontName ) + mpUnicodeFallbackList->erase( it ); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx index 915cc89fcb32..4593900da3cf 100644 --- a/vcl/source/outdev/font.cxx +++ b/vcl/source/outdev/font.cxx @@ -979,66 +979,6 @@ vcl::Font OutputDevice::GetDefaultFont( DefaultFontType nType, LanguageType eLan return aFont; } -ImplFontEntry::ImplFontEntry( const FontSelectPattern& rFontSelData ) - : m_pFontCache(nullptr) - , maFontSelData( rFontSelData ) - , maFontAttributes( rFontSelData ) - , mpConversion( nullptr ) - , mnLineHeight( 0 ) - , mnRefCount( 1 ) - , mnSetFontFlags( 0 ) - , mnOwnOrientation( 0 ) - , mnOrientation( 0 ) - , mbInit( false ) - , mpUnicodeFallbackList( nullptr ) -{ - maFontSelData.mpFontEntry = this; -} - -ImplFontEntry::~ImplFontEntry() -{ - delete mpUnicodeFallbackList; - m_pFontCache = nullptr; -} - -size_t ImplFontEntry::GFBCacheKey_Hash::operator()( const GFBCacheKey& rData ) const -{ - boost::hash<sal_UCS4> a; - boost::hash<int > b; - return a(rData.first) ^ b(rData.second); -} - -void ImplFontEntry::AddFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName ) -{ - if( !mpUnicodeFallbackList ) - mpUnicodeFallbackList = new UnicodeFallbackList; - (*mpUnicodeFallbackList)[ GFBCacheKey(cChar,eWeight) ] = rFontName; -} - -bool ImplFontEntry::GetFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, OUString* pFontName ) const -{ - if( !mpUnicodeFallbackList ) - return false; - - UnicodeFallbackList::const_iterator it = mpUnicodeFallbackList->find( GFBCacheKey(cChar,eWeight) ); - if( it == mpUnicodeFallbackList->end() ) - return false; - - *pFontName = (*it).second; - return true; -} - -void ImplFontEntry::IgnoreFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName ) -{ -// DBG_ASSERT( mpUnicodeFallbackList, "ImplFontEntry::IgnoreFallbackForUnicode no list" ); - UnicodeFallbackList::iterator it = mpUnicodeFallbackList->find( GFBCacheKey(cChar,eWeight) ); -// DBG_ASSERT( it != mpUnicodeFallbackList->end(), "ImplFontEntry::IgnoreFallbackForUnicode no match" ); - if( it == mpUnicodeFallbackList->end() ) - return; - if( (*it).second == rFontName ) - mpUnicodeFallbackList->erase( it ); -} - FontSelectPatternAttributes::FontSelectPatternAttributes( const vcl::Font& rFont, const OUString& rSearchName, const Size& rSize, float fExactHeight ) : maSearchName( rSearchName ) |