diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-10-04 21:55:58 +1000 |
---|---|---|
committer | Chris Sherlock <chris.sherlock79@gmail.com> | 2014-10-06 00:13:38 +0000 |
commit | 9177329a425cf70b515d1f266132838894fe54c6 (patch) | |
tree | dd064e9b56019046faa0966d0147c19a7fa2ca3e | |
parent | 36e1d19af8585bc2f36322ba32acbed46e58c4de (diff) |
vcl: FontCharMap to use intrusive_ptr ImplFontCharMap
ImplFontCharMap was using it's own reference counting mechanism,
however we can use intrusive_ptr more effectively.
Added a unit test around FontCharMap.
Change-Id: Ifab6ce002fd1df8feb7e017dea3012ff9ea7f18a
Reviewed-on: https://gerrit.libreoffice.org/11804
Reviewed-by: Chris Sherlock <chris.sherlock79@gmail.com>
Tested-by: Chris Sherlock <chris.sherlock79@gmail.com>
-rw-r--r-- | include/vcl/metric.hxx | 8 | ||||
-rw-r--r-- | vcl/CppunitTest_vcl_fontcharmap.mk | 53 | ||||
-rw-r--r-- | vcl/Module_vcl.mk | 1 | ||||
-rw-r--r-- | vcl/generic/fontmanager/fontmanager.cxx | 6 | ||||
-rw-r--r-- | vcl/generic/glyphs/gcach_ftyp.cxx | 15 | ||||
-rw-r--r-- | vcl/generic/glyphs/gcach_ftyp.hxx | 4 | ||||
-rw-r--r-- | vcl/generic/print/genpspgraphics.cxx | 4 | ||||
-rw-r--r-- | vcl/headless/svptext.cxx | 4 | ||||
-rw-r--r-- | vcl/inc/generic/genpspgraphics.h | 2 | ||||
-rw-r--r-- | vcl/inc/generic/glyphcache.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/headless/svpgdi.hxx | 2 | ||||
-rw-r--r-- | vcl/inc/impfont.hxx | 24 | ||||
-rw-r--r-- | vcl/inc/quartz/salgdi.h | 6 | ||||
-rw-r--r-- | vcl/inc/salgdi.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/unx/salgdi.h | 2 | ||||
-rw-r--r-- | vcl/inc/win/salgdi.h | 6 | ||||
-rw-r--r-- | vcl/qa/cppunit/fontcharmap.cxx | 48 | ||||
-rw-r--r-- | vcl/quartz/salgdi.cxx | 23 | ||||
-rw-r--r-- | vcl/source/gdi/impfont.cxx | 77 | ||||
-rw-r--r-- | vcl/source/outdev/font.cxx | 2 | ||||
-rw-r--r-- | vcl/unx/generic/gdi/salgdi3.cxx | 4 | ||||
-rw-r--r-- | vcl/win/source/gdi/salgdi3.cxx | 28 | ||||
-rw-r--r-- | vcl/win/source/gdi/winlayout.cxx | 2 |
23 files changed, 215 insertions, 112 deletions
diff --git a/include/vcl/metric.hxx b/include/vcl/metric.hxx index c22c553e374e..0bc977a408a9 100644 --- a/include/vcl/metric.hxx +++ b/include/vcl/metric.hxx @@ -24,10 +24,13 @@ #include <vcl/font.hxx> #include <vcl/outdev.hxx> +#include <boost/intrusive_ptr.hpp> + class ImplFontMetric; class ImplFontCharMap; typedef sal_uInt32 sal_UCS4; +typedef boost::intrusive_ptr< ImplFontCharMap > ImplFontCharMapPtr; namespace vcl { @@ -94,7 +97,7 @@ inline std::basic_ostream<charT, traits> & operator <<( class VCL_DLLPUBLIC FontCharMap { private: - const ImplFontCharMap* mpImpl; + ImplFontCharMapPtr mpImplFontCharMap; public: FontCharMap(); @@ -106,6 +109,7 @@ public: int GetCharCount( void ) const; sal_UCS4 GetFirstChar() const; + sal_UCS4 GetLastChar() const; sal_UCS4 GetNextChar( sal_UCS4 ) const; sal_UCS4 GetPrevChar( sal_UCS4 ) const; @@ -116,7 +120,7 @@ public: private: friend class ::OutputDevice; - void Reset( const ImplFontCharMap* pNewMap = NULL ); + void Reset( const ImplFontCharMapPtr pNewMap = NULL ); // prevent assignment and copy construction FontCharMap( const FontCharMap& ); diff --git a/vcl/CppunitTest_vcl_fontcharmap.mk b/vcl/CppunitTest_vcl_fontcharmap.mk new file mode 100644 index 000000000000..0a89f411a2e0 --- /dev/null +++ b/vcl/CppunitTest_vcl_fontcharmap.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_fontcharmap)) + +$(eval $(call gb_CppunitTest_set_include,vcl_fontcharmap,\ + $$(INCLUDE) \ + -I$(SRCDIR)/vcl/inc \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,vcl_fontcharmap, \ + vcl/qa/cppunit/fontcharmap \ +)) + +$(eval $(call gb_CppunitTest_use_externals,vcl_fontcharmap,boost_headers)) + +$(eval $(call gb_CppunitTest_use_libraries,vcl_fontcharmap, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + svt \ + test \ + tl \ + tk \ + unotest \ + vcl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_api,vcl_fontcharmap,\ + udkapi \ + offapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,vcl_fontcharmap)) +$(eval $(call gb_CppunitTest_use_vcl,vcl_fontcharmap)) + +$(eval $(call gb_CppunitTest_use_components,vcl_fontcharmap,\ + configmgr/source/configmgr \ + i18npool/util/i18npool \ + ucb/source/core/ucb1 \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,vcl_fontcharmap)) + +# vim: set noet sw=4 ts=4: diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk index f2eef6f50703..d8750167561d 100644 --- a/vcl/Module_vcl.mk +++ b/vcl/Module_vcl.mk @@ -94,6 +94,7 @@ $(eval $(call gb_Module_add_targets,vcl,\ endif $(eval $(call gb_Module_add_check_targets,vcl,\ + CppunitTest_vcl_fontcharmap \ CppunitTest_vcl_complextext \ CppunitTest_vcl_filters_test \ CppunitTest_vcl_app_test \ diff --git a/vcl/generic/fontmanager/fontmanager.cxx b/vcl/generic/fontmanager/fontmanager.cxx index 273707699350..05fc829d0e5e 100644 --- a/vcl/generic/fontmanager/fontmanager.cxx +++ b/vcl/generic/fontmanager/fontmanager.cxx @@ -2088,11 +2088,11 @@ void PrintFontManager::getGlyphWidths( fontID nFont, CmapResult aCmapResult; if( ParseCMAP( pCmapData, nCmapSize, aCmapResult ) ) { - const ImplFontCharMap aCharMap( aCmapResult ); + const ImplFontCharMapPtr pCharMap( new ImplFontCharMap(aCmapResult) ); for( sal_uInt32 cOld = 0;;) { // get next unicode covered by font - const sal_uInt32 c = aCharMap.GetNextChar( cOld ); + const sal_uInt32 c = pCharMap->GetNextChar( cOld ); if( c == cOld ) break; cOld = c; @@ -2101,7 +2101,7 @@ void PrintFontManager::getGlyphWidths( fontID nFont, break; #endif // get the matching glyph index - const sal_GlyphId aGlyphId = aCharMap.GetGlyphIndex( c ); + const sal_GlyphId aGlyphId = pCharMap->GetGlyphIndex( c ); // update the requested map rUnicodeEnc[ (sal_Unicode)c ] = aGlyphId; } diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx index 9db574ee407b..fa93fc603738 100644 --- a/vcl/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/generic/glyphs/gcach_ftyp.cxx @@ -242,7 +242,7 @@ FtFontInfo::FtFontInfo( const ImplDevFontAttributes& rDevFontAttributes, FtFontInfo::~FtFontInfo() { if( mpFontCharMap ) - mpFontCharMap->DeReference(); + mpFontCharMap = 0; delete mpChar2Glyph; delete mpGlyph2Char; #if ENABLE_GRAPHITE @@ -1265,13 +1265,13 @@ bool ServerFont::GetGlyphBitmap8( sal_GlyphId aGlyphId, RawBitmap& rRawBitmap ) // determine unicode ranges in font -const ImplFontCharMap* ServerFont::GetImplFontCharMap( void ) const +const ImplFontCharMapPtr ServerFont::GetImplFontCharMap( void ) const { - const ImplFontCharMap* pIFCMap = mpFontInfo->GetImplFontCharMap(); + const ImplFontCharMapPtr pIFCMap = mpFontInfo->GetImplFontCharMap(); return pIFCMap; } -const ImplFontCharMap* FtFontInfo::GetImplFontCharMap( void ) +const ImplFontCharMapPtr FtFontInfo::GetImplFontCharMap( void ) { // check if the charmap is already cached if( mpFontCharMap ) @@ -1281,9 +1281,14 @@ const ImplFontCharMap* FtFontInfo::GetImplFontCharMap( void ) CmapResult aCmapResult; bool bOK = GetFontCodeRanges( aCmapResult ); if( bOK ) - mpFontCharMap = new ImplFontCharMap( aCmapResult ); + { + ImplFontCharMapPtr pFontCharMap( new ImplFontCharMap( aCmapResult ) ); + mpFontCharMap = pFontCharMap; + } else + { mpFontCharMap = ImplFontCharMap::GetDefaultMap(); + } // mpFontCharMap on either branch now has a refcount of 1 return mpFontCharMap; } diff --git a/vcl/generic/glyphs/gcach_ftyp.hxx b/vcl/generic/glyphs/gcach_ftyp.hxx index b43d47b39397..803ce072a955 100644 --- a/vcl/generic/glyphs/gcach_ftyp.hxx +++ b/vcl/generic/glyphs/gcach_ftyp.hxx @@ -84,7 +84,7 @@ public: void CacheGlyphIndex( sal_UCS4 cChar, int nGI ) const; bool GetFontCodeRanges( CmapResult& ) const; - const ImplFontCharMap* GetImplFontCharMap( void ); + const ImplFontCharMapPtr GetImplFontCharMap( void ); private: FT_FaceRec_* maFaceFT; @@ -99,7 +99,7 @@ private: sal_IntPtr mnFontId; ImplDevFontAttributes maDevFontAttributes; - const ImplFontCharMap* mpFontCharMap; + ImplFontCharMapPtr mpFontCharMap; // cache unicode->glyphid mapping because looking it up is expensive // TODO: change to boost::unordered_multimap when a use case requires a m:n mapping diff --git a/vcl/generic/print/genpspgraphics.cxx b/vcl/generic/print/genpspgraphics.cxx index 401f5c7af5e8..759519b3cefa 100644 --- a/vcl/generic/print/genpspgraphics.cxx +++ b/vcl/generic/print/genpspgraphics.cxx @@ -777,12 +777,12 @@ void GenPspGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) DrawPrinterLayout( rLayout, *m_pPrinterGfx, true ); } -const ImplFontCharMap* GenPspGraphics::GetImplFontCharMap() const +const ImplFontCharMapPtr GenPspGraphics::GetImplFontCharMap() const { if( !m_pServerFont[0] ) return NULL; - const ImplFontCharMap* pIFCMap = m_pServerFont[0]->GetImplFontCharMap(); + const ImplFontCharMapPtr pIFCMap = m_pServerFont[0]->GetImplFontCharMap(); return pIFCMap; } diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx index 3f2384c5da17..905d78bef9fd 100644 --- a/vcl/headless/svptext.cxx +++ b/vcl/headless/svptext.cxx @@ -231,12 +231,12 @@ void SvpSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLe } } -const ImplFontCharMap* SvpSalGraphics::GetImplFontCharMap() const +const ImplFontCharMapPtr SvpSalGraphics::GetImplFontCharMap() const { if( !m_pServerFont[0] ) return NULL; - const ImplFontCharMap* pIFCMap = m_pServerFont[0]->GetImplFontCharMap(); + const ImplFontCharMapPtr pIFCMap = m_pServerFont[0]->GetImplFontCharMap(); return pIFCMap; } diff --git a/vcl/inc/generic/genpspgraphics.h b/vcl/inc/generic/genpspgraphics.h index ec54d5bd66eb..66c7f31f3802 100644 --- a/vcl/inc/generic/genpspgraphics.h +++ b/vcl/inc/generic/genpspgraphics.h @@ -89,7 +89,7 @@ public: virtual void SetTextColor( SalColor nSalColor ) SAL_OVERRIDE; virtual sal_uInt16 SetFont( FontSelectPattern*, int nFallbackLevel ) SAL_OVERRIDE; virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) SAL_OVERRIDE; - virtual const ImplFontCharMap* GetImplFontCharMap() const SAL_OVERRIDE; + virtual const ImplFontCharMapPtr GetImplFontCharMap() const SAL_OVERRIDE; virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const SAL_OVERRIDE; virtual void GetDevFontList( PhysicalFontCollection* ) SAL_OVERRIDE; // graphics must drop any cached font info diff --git a/vcl/inc/generic/glyphcache.hxx b/vcl/inc/generic/glyphcache.hxx index a3b1c4f9ea87..40a07dad1640 100644 --- a/vcl/inc/generic/glyphcache.hxx +++ b/vcl/inc/generic/glyphcache.hxx @@ -182,7 +182,7 @@ public: const unsigned char* GetTable( const char* pName, sal_uLong* pLength ); int GetEmUnits() const { return maFaceFT->units_per_EM;} const FT_Size_Metrics& GetMetricsFT() const { return maSizeFT->metrics; } - const ImplFontCharMap* GetImplFontCharMap() const; + const ImplFontCharMapPtr GetImplFontCharMap() const; bool GetFontCapabilities(vcl::FontCapabilities &) const; GlyphData& GetGlyphData( sal_GlyphId ); diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index 65a8fc2a15bf..aad4693d35e7 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -156,7 +156,7 @@ public: virtual void SetTextColor( SalColor nSalColor ) SAL_OVERRIDE; virtual sal_uInt16 SetFont( FontSelectPattern*, int nFallbackLevel ) SAL_OVERRIDE; virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) SAL_OVERRIDE; - virtual const ImplFontCharMap* GetImplFontCharMap() const SAL_OVERRIDE; + virtual const ImplFontCharMapPtr GetImplFontCharMap() const SAL_OVERRIDE; virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const SAL_OVERRIDE; virtual void GetDevFontList( PhysicalFontCollection* ) SAL_OVERRIDE; virtual void ClearDevFontCache() SAL_OVERRIDE; diff --git a/vcl/inc/impfont.hxx b/vcl/inc/impfont.hxx index 3c42f6e1a465..af97677f3999 100644 --- a/vcl/inc/impfont.hxx +++ b/vcl/inc/impfont.hxx @@ -29,6 +29,11 @@ #include <vcl/fntstyle.hxx> #include <outfont.hxx> +#include <boost/intrusive_ptr.hpp> + +class ImplFontCharMap; +typedef boost::intrusive_ptr< ImplFontCharMap > ImplFontCharMapPtr; + // - Impl_Font - class Impl_Font @@ -158,7 +163,7 @@ public: explicit ImplFontCharMap( const CmapResult& ); virtual ~ImplFontCharMap(); - static ImplFontCharMap* GetDefaultMap( bool bSymbols=false); + static ImplFontCharMapPtr GetDefaultMap( bool bSymbols=false); bool IsDefaultMap() const; bool HasChar( sal_uInt32 ) const; @@ -174,12 +179,12 @@ public: int GetIndexFromChar( sal_uInt32 ) const; sal_uInt32 GetCharFromIndex( int ) const; - void AddReference() const; - void DeReference() const; - int GetGlyphIndex( sal_uInt32 ) const; private: + friend void intrusive_ptr_add_ref(ImplFontCharMap* pImplFontCharMap); + friend void intrusive_ptr_release(ImplFontCharMap* pImplFontCharMap); + int ImplFindRangeIndex( sal_uInt32 ) const; // prevent assignment and copy construction @@ -195,6 +200,17 @@ private: mutable sal_uInt32 mnRefCount; }; +inline void intrusive_ptr_add_ref(ImplFontCharMap* pImplFontCharMap) +{ + ++pImplFontCharMap->mnRefCount; +} + +inline void intrusive_ptr_release(ImplFontCharMap* pImplFontCharMap) +{ + if (--pImplFontCharMap->mnRefCount == 0) + delete pImplFontCharMap; +} + // CmapResult is a normalized version of the many CMAP formats class VCL_PLUGIN_PUBLIC CmapResult { diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h index 8aad5348292b..0c58ca7da621 100644 --- a/vcl/inc/quartz/salgdi.h +++ b/vcl/inc/quartz/salgdi.h @@ -73,7 +73,7 @@ public: CoreTextStyle* CreateTextStyle( const FontSelectPattern& ) const; int GetFontTable( const char pTagName[5], unsigned char* ) const; - const ImplFontCharMap* GetImplFontCharMap() const; + const ImplFontCharMapPtr GetImplFontCharMap() const; bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; bool HasChar( sal_uInt32 cChar ) const; @@ -85,7 +85,7 @@ protected: private: const sal_IntPtr mnFontId; - mutable const ImplFontCharMap* mpCharMap; + mutable ImplFontCharMapPtr mpCharMap; mutable vcl::FontCapabilities maFontCapabilities; mutable bool mbOs2Read; // true if OS2-table related info is valid mutable bool mbHasOs2Table; @@ -330,7 +330,7 @@ public: // get the current font's metrics virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) SAL_OVERRIDE; // get the repertoire of the current font - virtual const ImplFontCharMap* + virtual const ImplFontCharMapPtr GetImplFontCharMap() const SAL_OVERRIDE; virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const SAL_OVERRIDE; // graphics must fill supplied font list diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx index bed847472fc6..c2752b92447f 100644 --- a/vcl/inc/salgdi.hxx +++ b/vcl/inc/salgdi.hxx @@ -28,6 +28,7 @@ #include "vcl/salnativewidgets.hxx" #include "salglyphid.hxx" #include "sallayout.hxx" +#include <impfont.hxx> #include <map> @@ -36,7 +37,6 @@ class SalBitmap; class FontSelectPattern; class ImplFontMetricData; class PhysicalFontFace; -class ImplFontCharMap; class SalLayout; class ImplLayoutArgs; class Rectangle; @@ -231,7 +231,7 @@ public: virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel = 0 ) = 0; // get the repertoire of the current font - virtual const ImplFontCharMap* + virtual const ImplFontCharMapPtr GetImplFontCharMap() const = 0; // get the layout capabilities of the current font diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h index 978e51421834..ba0814be8671 100644 --- a/vcl/inc/unx/salgdi.h +++ b/vcl/inc/unx/salgdi.h @@ -229,7 +229,7 @@ public: virtual void SetTextColor( SalColor nSalColor ) SAL_OVERRIDE; virtual sal_uInt16 SetFont( FontSelectPattern*, int nFallbackLevel ) SAL_OVERRIDE; virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) SAL_OVERRIDE; - virtual const ImplFontCharMap* GetImplFontCharMap() const SAL_OVERRIDE; + virtual const ImplFontCharMapPtr GetImplFontCharMap() const SAL_OVERRIDE; virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const SAL_OVERRIDE; virtual void GetDevFontList( PhysicalFontCollection* ) SAL_OVERRIDE; virtual void ClearDevFontCache() SAL_OVERRIDE; diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h index 957db9103215..ace973cde206 100644 --- a/vcl/inc/win/salgdi.h +++ b/vcl/inc/win/salgdi.h @@ -94,7 +94,7 @@ public: const gr_face* GraphiteFace() const; #endif - const ImplFontCharMap* GetImplFontCharMap() const; + const ImplFontCharMapPtr GetImplFontCharMap() const; bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const; const Ucs2SIntMap* GetEncodingVector() const { return mpEncodingVector; } void SetEncodingVector( const Ucs2SIntMap* pNewVec ) const @@ -116,7 +116,7 @@ private: #endif mutable bool mbHasArabicSupport; mutable bool mbFontCapabilitiesRead; - mutable ImplFontCharMap* mpUnicodeMap; + mutable ImplFontCharMapPtr mpUnicodeMap; mutable const Ucs2SIntMap* mpEncodingVector; mutable vcl::FontCapabilities maFontCapabilities; @@ -310,7 +310,7 @@ public: // get the current font's metrics virtual void GetFontMetric( ImplFontMetricData*, int nFallbackLevel ); // get the repertoire of the current font - virtual const ImplFontCharMap* GetImplFontCharMap() const; + virtual const ImplFontCharMapPtr GetImplFontCharMap() const; // get the layout capabilities of the current font virtual bool GetFontCapabilities(vcl::FontCapabilities &rGetFontCapabilities) const; // graphics must fill supplied font list diff --git a/vcl/qa/cppunit/fontcharmap.cxx b/vcl/qa/cppunit/fontcharmap.cxx new file mode 100644 index 000000000000..1fee918bee0d --- /dev/null +++ b/vcl/qa/cppunit/fontcharmap.cxx @@ -0,0 +1,48 @@ +/* -*- 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/. + */ + +#include <test/bootstrapfixture.hxx> + +#include <osl/file.hxx> +#include <osl/process.h> + +#include <vcl/metric.hxx> + +class VclFontCharMapTest : public test::BootstrapFixture +{ +public: + VclFontCharMapTest() : BootstrapFixture(true, false) {} + + void testDefaultFontCharMap(); + + CPPUNIT_TEST_SUITE(VclFontCharMapTest); + CPPUNIT_TEST(testDefaultFontCharMap); + CPPUNIT_TEST_SUITE_END(); +}; + +void VclFontCharMapTest::testDefaultFontCharMap() +{ + FontCharMap *fcmap = new FontCharMap(); // gets default map + + CPPUNIT_ASSERT( fcmap->IsDefaultMap() ); + + sal_uInt32 nStartBMPPlane = fcmap->GetFirstChar(); + sal_uInt32 nStartSupBMPPlane = fcmap->GetNextChar(0xD800); + sal_uInt32 nEndBMPPlane = fcmap->GetLastChar(); + + CPPUNIT_ASSERT( nStartBMPPlane == 0x0020 ); + CPPUNIT_ASSERT( nStartSupBMPPlane == 0xE000 ); + CPPUNIT_ASSERT( nEndBMPPlane == 0xFFF0-1 ); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(VclFontCharMapTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx index 80d6d5ed5a7e..b5f5251f99e8 100644 --- a/vcl/quartz/salgdi.cxx +++ b/vcl/quartz/salgdi.cxx @@ -62,19 +62,17 @@ using namespace vcl; CoreTextFontData::CoreTextFontData( const CoreTextFontData& rSrc ) : PhysicalFontFace( rSrc ) , mnFontId( rSrc.mnFontId ) -, mpCharMap( rSrc.mpCharMap ) , mbOs2Read( rSrc.mbOs2Read ) , mbHasOs2Table( rSrc.mbHasOs2Table ) , mbCmapEncodingRead( rSrc.mbCmapEncodingRead ) { - if( mpCharMap ) - mpCharMap->AddReference(); + if( rSrc.mpCharMap ) + mpCharMap = rSrc.mpCharMap; } CoreTextFontData::CoreTextFontData( const ImplDevFontAttributes& rDFA, sal_IntPtr nFontId ) : PhysicalFontFace( rDFA, 0 ) , mnFontId( nFontId ) -, mpCharMap( NULL ) , mbOs2Read( false ) , mbHasOs2Table( false ) , mbCmapEncodingRead( false ) @@ -85,7 +83,7 @@ CoreTextFontData::CoreTextFontData( const ImplDevFontAttributes& rDFA, sal_IntPt CoreTextFontData::~CoreTextFontData() { if( mpCharMap ) - mpCharMap->DeReference(); + mpCharMap = 0; } sal_IntPtr CoreTextFontData::GetFontId() const @@ -95,7 +93,7 @@ sal_IntPtr CoreTextFontData::GetFontId() const static unsigned GetUShort( const unsigned char* p ){return((p[0]<<8)+p[1]);} -const ImplFontCharMap* CoreTextFontData::GetImplFontCharMap() const +const ImplFontCharMapPtr CoreTextFontData::GetImplFontCharMap() const { // return the cached charmap if( mpCharMap ) @@ -103,7 +101,6 @@ const ImplFontCharMap* CoreTextFontData::GetImplFontCharMap() const // set the default charmap mpCharMap = ImplFontCharMap::GetDefaultMap(); - mpCharMap->AddReference(); // get the CMAP byte size // allocate a buffer for the CMAP raw data @@ -124,10 +121,9 @@ const ImplFontCharMap* CoreTextFontData::GetImplFontCharMap() const CmapResult aCmapResult; if( ParseCMAP( &aBuffer[0], nRawLength, aCmapResult ) ) { + ImplFontCharMapPtr pCharMap(new ImplFontCharMap( aCmapResult ) ); // create the matching charmap - mpCharMap->DeReference(); - mpCharMap = new ImplFontCharMap( aCmapResult ); - mpCharMap->AddReference(); + mpCharMap = pCharMap; } return mpCharMap; @@ -489,7 +485,7 @@ SalLayout* AquaSalGraphics::GetTextLayout( ImplLayoutArgs& /*rArgs*/, int /*nFal return pSalLayout; } -const ImplFontCharMap* AquaSalGraphics::GetImplFontCharMap() const +const ImplFontCharMapPtr AquaSalGraphics::GetImplFontCharMap() const { if( !mpFontData ) return ImplFontCharMap::GetDefaultMap(); @@ -726,9 +722,8 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV free( (void*)pGlyphMetrics ); } - const ImplFontCharMap* pMap = mpFontData->GetImplFontCharMap(); + ImplFontCharMapPtr pMap = mpFontData->GetImplFontCharMap(); DBG_ASSERT( pMap && pMap->GetCharCount(), "no charmap" ); - pMap->AddReference(); // TODO: add and use RAII object instead // get unicode<->glyph encoding // TODO? avoid sft mapping by using the pMap itself @@ -744,7 +739,7 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV rUnicodeEnc[ nUcsChar ] = nGlyph; } - pMap->DeReference(); // TODO: add and use RAII object instead + pMap = 0; } ::CloseTTFont( pSftFont ); diff --git a/vcl/source/gdi/impfont.cxx b/vcl/source/gdi/impfont.cxx index d0d285be5694..e4e6fc809230 100644 --- a/vcl/source/gdi/impfont.cxx +++ b/vcl/source/gdi/impfont.cxx @@ -50,7 +50,7 @@ ImplFontCharMap::ImplFontCharMap( const CmapResult& rCR ) } } -static ImplFontCharMap* pDefaultImplFontCharMap = NULL; +static ImplFontCharMapPtr pDefaultImplFontCharMap; static const sal_UCS4 aDefaultUnicodeRanges[] = {0x0020,0xD800, 0xE000,0xFFF0}; static const sal_UCS4 aDefaultSymbolRanges[] = {0x0020,0x0100, 0xF020,0xF100}; @@ -69,40 +69,22 @@ ImplFontCharMap::~ImplFontCharMap() delete[] mpGlyphIds; } -ImplFontCharMap* ImplFontCharMap::GetDefaultMap( bool bSymbols) +ImplFontCharMapPtr ImplFontCharMap::GetDefaultMap( bool bSymbols) { - if( pDefaultImplFontCharMap ) - pDefaultImplFontCharMap->AddReference(); - else + const sal_UCS4* pRangeCodes = aDefaultUnicodeRanges; + int nCodesCount = sizeof(aDefaultUnicodeRanges) / sizeof(*pRangeCodes); + if( bSymbols ) { - const sal_UCS4* pRangeCodes = aDefaultUnicodeRanges; - int nCodesCount = sizeof(aDefaultUnicodeRanges) / sizeof(*pRangeCodes); - if( bSymbols ) - { - pRangeCodes = aDefaultSymbolRanges; - nCodesCount = sizeof(aDefaultSymbolRanges) / sizeof(*pRangeCodes); - } - - CmapResult aDefaultCR( bSymbols, pRangeCodes, nCodesCount/2 ); - pDefaultImplFontCharMap = new ImplFontCharMap( aDefaultCR ); + pRangeCodes = aDefaultSymbolRanges; + nCodesCount = sizeof(aDefaultSymbolRanges) / sizeof(*pRangeCodes); } - return pDefaultImplFontCharMap; -} + CmapResult aDefaultCR( bSymbols, pRangeCodes, nCodesCount/2 ); + pDefaultImplFontCharMap.reset( new ImplFontCharMap( aDefaultCR ) ); -void ImplFontCharMap::AddReference( void) const -{ - ++mnRefCount; -} - -void ImplFontCharMap::DeReference( void) const -{ - if( --mnRefCount <= 0 ) - if( this != pDefaultImplFontCharMap ) - delete this; + return pDefaultImplFontCharMap; } - int ImplFontCharMap::ImplFindRangeIndex( sal_UCS4 cChar ) const { int nLower = 0; @@ -561,73 +543,74 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) } FontCharMap::FontCharMap() -: mpImpl( ImplFontCharMap::GetDefaultMap() ) +: mpImplFontCharMap( ImplFontCharMap::GetDefaultMap() ) {} FontCharMap::~FontCharMap() { - mpImpl->DeReference(); - mpImpl = NULL; + mpImplFontCharMap = 0; } int FontCharMap::GetCharCount() const { - return mpImpl->GetCharCount(); + return mpImplFontCharMap->GetCharCount(); } int FontCharMap::CountCharsInRange( sal_UCS4 cMin, sal_UCS4 cMax ) const { - return mpImpl->CountCharsInRange( cMin, cMax ); + return mpImplFontCharMap->CountCharsInRange( cMin, cMax ); } -void FontCharMap::Reset( const ImplFontCharMap* pNewMap ) +void FontCharMap::Reset( const ImplFontCharMapPtr pNewMap ) { if( pNewMap == NULL ) { - mpImpl->DeReference(); - mpImpl = ImplFontCharMap::GetDefaultMap(); + mpImplFontCharMap = ImplFontCharMap::GetDefaultMap(); } - else if( pNewMap != mpImpl ) + else if( pNewMap != mpImplFontCharMap ) { - mpImpl->DeReference(); - mpImpl = pNewMap; - mpImpl->AddReference(); + mpImplFontCharMap = pNewMap; } } bool FontCharMap::IsDefaultMap() const { - return mpImpl->IsDefaultMap(); + return mpImplFontCharMap->IsDefaultMap(); } bool FontCharMap::HasChar( sal_UCS4 cChar ) const { - return mpImpl->HasChar( cChar ); + return mpImplFontCharMap->HasChar( cChar ); } sal_UCS4 FontCharMap::GetFirstChar() const { - return mpImpl->GetFirstChar(); + return mpImplFontCharMap->GetFirstChar(); +} + +sal_UCS4 FontCharMap::GetLastChar() const +{ + return mpImplFontCharMap->GetLastChar(); } sal_UCS4 FontCharMap::GetNextChar( sal_UCS4 cChar ) const { - return mpImpl->GetNextChar( cChar ); + return mpImplFontCharMap->GetNextChar( cChar ); } sal_UCS4 FontCharMap::GetPrevChar( sal_UCS4 cChar ) const { - return mpImpl->GetPrevChar( cChar ); + return mpImplFontCharMap->GetPrevChar( cChar ); } int FontCharMap::GetIndexFromChar( sal_UCS4 cChar ) const { - return mpImpl->GetIndexFromChar( cChar ); + return mpImplFontCharMap->GetIndexFromChar( cChar ); } sal_UCS4 FontCharMap::GetCharFromIndex( int nIndex ) const { - return mpImpl->GetCharFromIndex( nIndex ); + return mpImplFontCharMap->GetCharFromIndex( nIndex ); } // on some systems we have to get the font attributes from the name table diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx index 7b83d0460407..0a7733df8253 100644 --- a/vcl/source/outdev/font.cxx +++ b/vcl/source/outdev/font.cxx @@ -231,7 +231,7 @@ bool OutputDevice::GetFontCharMap( FontCharMap& rFontCharMap ) const if( !mpFontEntry ) return false; - const ImplFontCharMap* pNewMap = mpGraphics->GetImplFontCharMap(); + const ImplFontCharMapPtr pNewMap = mpGraphics->GetImplFontCharMap(); rFontCharMap.Reset( pNewMap ); if( rFontCharMap.IsDefaultMap() ) diff --git a/vcl/unx/generic/gdi/salgdi3.cxx b/vcl/unx/generic/gdi/salgdi3.cxx index 13d550ed2e61..f028597fe1da 100644 --- a/vcl/unx/generic/gdi/salgdi3.cxx +++ b/vcl/unx/generic/gdi/salgdi3.cxx @@ -431,12 +431,12 @@ void X11SalGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) cairo_destroy(cr); } -const ImplFontCharMap* X11SalGraphics::GetImplFontCharMap() const +const ImplFontCharMapPtr X11SalGraphics::GetImplFontCharMap() const { if( !mpServerFont[0] ) return NULL; - const ImplFontCharMap* pIFCMap = mpServerFont[0]->GetImplFontCharMap(); + const ImplFontCharMapPtr pIFCMap = mpServerFont[0]->GetImplFontCharMap(); return pIFCMap; } diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx index efa5417c2dd1..cb5be79ee1b6 100644 --- a/vcl/win/source/gdi/salgdi3.cxx +++ b/vcl/win/source/gdi/salgdi3.cxx @@ -444,7 +444,7 @@ void ImplGetLogFontFromFontSelect( HDC, const FontSelectPattern*, bool WinGlyphFallbackSubstititution::HasMissingChars( const PhysicalFontFace* pFace, const OUString& rMissingChars ) const { const ImplWinFontData* pWinFont = static_cast<const ImplWinFontData*>(pFace); - const ImplFontCharMap* pCharMap = pWinFont->GetImplFontCharMap(); + ImplFontCharMapPtr pCharMap = pWinFont->GetImplFontCharMap(); if( !pCharMap ) { // construct a Size structure as the parameter of constructor of class FontSelectPattern @@ -474,7 +474,6 @@ bool WinGlyphFallbackSubstititution::HasMissingChars( const PhysicalFontFace* pF // avoid fonts with unknown CMAP subtables for glyph fallback if( !pCharMap || pCharMap->IsDefaultMap() ) return false; - pCharMap->AddReference(); int nMatchCount = 0; // static const int nMaxMatchCount = 1; // TODO: tolerate more missing characters? @@ -485,7 +484,8 @@ bool WinGlyphFallbackSubstititution::HasMissingChars( const PhysicalFontFace* pF nMatchCount += pCharMap->HasChar( uChar ); break; // for now } - pCharMap->DeReference(); + + pCharMap = 0; const bool bHasMatches = (nMatchCount > 0); return bHasMatches; @@ -1137,7 +1137,7 @@ ImplWinFontData::~ImplWinFontData() delete[] mpFontCharSets; if( mpUnicodeMap ) - mpUnicodeMap->DeReference(); + mpUnicodeMap = 0; #if ENABLE_GRAPHITE if (mpGraphiteData) mpGraphiteData->DeReference(); @@ -1224,7 +1224,7 @@ bool ImplWinFontData::IsGSUBstituted( sal_UCS4 cChar ) const return( maGsubTable.find( cChar ) != maGsubTable.end() ); } -const ImplFontCharMap* ImplWinFontData::GetImplFontCharMap() const +const ImplFontCharMapPtr ImplWinFontData::GetImplFontCharMap() const { if( !mpUnicodeMap ) return NULL; @@ -1298,12 +1298,14 @@ void ImplWinFontData::ReadCmapTable( HDC hDC ) const mbDisableGlyphApi |= aResult.mbRecoded; aResult.mbSymbolic = bIsSymbolFont; if( aResult.mnRangeCount > 0 ) - mpUnicodeMap = new ImplFontCharMap( aResult ); + { + ImplFontCharMapPtr pUnicodeMap( new ImplFontCharMap( aResult ) ); + mpUnicodeMap = pUnicodeMap; + } } if( !mpUnicodeMap ) mpUnicodeMap = ImplFontCharMap::GetDefaultMap( bIsSymbolFont ); - mpUnicodeMap->AddReference(); } void ImplWinFontData::GetFontCapabilities( HDC hDC ) const @@ -1697,7 +1699,7 @@ sal_uLong WinSalGraphics::GetKernPairs() return mnFontKernPairCount; } -const ImplFontCharMap* WinSalGraphics::GetImplFontCharMap() const +const ImplFontCharMapPtr WinSalGraphics::GetImplFontCharMap() const { if( !mpWinFontData[0] ) return ImplFontCharMap::GetDefaultMap(); @@ -2480,8 +2482,7 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile, if( aRawCffData.get() ) { pWinFontData->UpdateFromHDC( getHDC() ); - const ImplFontCharMap* pCharMap = pWinFontData->GetImplFontCharMap(); - pCharMap->AddReference(); + ImplFontCharMapPtr pCharMap = pWinFontData->GetImplFontCharMap(); sal_GlyphId aRealGlyphIds[ 256 ]; for( int i = 0; i < nGlyphCount; ++i ) @@ -2497,7 +2498,7 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile, aRealGlyphIds[i] = aGlyphId; } - pCharMap->DeReference(); // TODO: and and use a RAII object + pCharMap = 0; // provide a font subset from the CFF-table FILE* pOutFile = fopen( aToFile.getStr(), "wb" ); @@ -2731,9 +2732,8 @@ void WinSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, rUnicodeEnc.clear(); } const ImplWinFontData* pWinFont = static_cast<const ImplWinFontData*>(pFont); - const ImplFontCharMap* pMap = pWinFont->GetImplFontCharMap(); + ImplFontCharMapPtr pMap = pWinFont->GetImplFontCharMap(); DBG_ASSERT( pMap && pMap->GetCharCount(), "no map" ); - pMap->AddReference(); int nCharCount = pMap->GetCharCount(); sal_uInt32 nChar = pMap->GetFirstChar(); @@ -2750,7 +2750,7 @@ void WinSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, nChar = pMap->GetNextChar( nChar ); } - pMap->DeReference(); // TODO: and and use a RAII object + pMap = 0; } } else if( pFont->IsEmbeddable() ) diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index eff3f9c0856a..958348fdfd80 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -2952,8 +2952,6 @@ bool ImplWinFontEntry::InitKashidaHandling( HDC hDC ) PhysicalFontFace* ImplWinFontData::Clone() const { - if( mpUnicodeMap ) - mpUnicodeMap->AddReference(); #if ENABLE_GRAPHITE if ( mpGraphiteData ) mpGraphiteData->AddReference(); |