diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2018-09-06 14:00:29 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2018-09-07 20:26:18 +0200 |
commit | 334df91c6e464fe6434500f63e2fb12438722845 (patch) | |
tree | 5c4b4ff2daac67159b9e94265eb5f25b6d60b641 /vcl | |
parent | c5483edae01e4145c80439c5070e0bf2fad51186 (diff) |
WIN drop mhFonts[MAX_FALLBACK]
Everything now uses the HFONT from WinFontInstance, so there
is no need for the additional fallback array.
Change-Id: I15a197b262633569cb95c37689561db5323e1115
Reviewed-on: https://gerrit.libreoffice.org/60092
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/win/salgdi.h | 13 | ||||
-rw-r--r-- | vcl/win/gdi/salfont.cxx | 55 | ||||
-rw-r--r-- | vcl/win/gdi/salgdi.cxx | 6 |
3 files changed, 17 insertions, 57 deletions
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h index 32a104bef88e..243d2cdc8fc5 100644 --- a/vcl/inc/win/salgdi.h +++ b/vcl/inc/win/salgdi.h @@ -156,19 +156,6 @@ private: bool mbScreen : 1; // is Screen compatible HWND mhWnd; // Window-Handle, when Window-Graphics - /** HFONT lifecycle - * - * The HFONT has to be shared between mhFonts and mpWinFontEntry. - * As mpWinFontEntry is reference counted and just freed in SetFont, the HFONT is - * transferred from mhFonts to the mpWinFontEntry. - * - * We need the mhFonts list, as embedded fonts don't have a corresponding WinFontInstance - * so for these there is just the mhFonts entry. - * - * The HFONT object can just be assigned to mhFonts _or_ mpWinFontEntry! - **/ - - HFONT mhFonts[ MAX_FALLBACK ]; // Font + Fallbacks rtl::Reference<WinFontInstance> mpWinFontEntry[ MAX_FALLBACK ]; // pointer to the most recent font instance HRGN mhRegion; // vcl::Region Handle diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx index bed9c7a22376..e2734052c9c0 100644 --- a/vcl/win/gdi/salfont.cxx +++ b/vcl/win/gdi/salfont.cxx @@ -913,22 +913,17 @@ void WinSalGraphics::SetFont(LogicalFontInstance* pFont, int nFallbackLevel) // return early if there is no new font if( !pFont ) { - // deselect still active font - if (mhDefFont) - { - ::SelectFont(getHDC(), mhDefFont); - mhDefFont = nullptr; - } + if (!mpWinFontEntry[nFallbackLevel].is()) + return; + + // select original DC font + assert(mhDefFont); + ::SelectFont(getHDC(), mhDefFont); + mhDefFont = nullptr; + // release no longer referenced font handles for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i ) - { - if( mhFonts[i] ) - { - ::DeleteFont( mhFonts[i] ); - mhFonts[ i ] = nullptr; - } mpWinFontEntry[i] = nullptr; - } return; } @@ -953,16 +948,8 @@ void WinSalGraphics::SetFont(LogicalFontInstance* pFont, int nFallbackLevel) else { // release no longer referenced font handles - for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i ) - { - if( mhFonts[i] ) - { - ::DeleteFont( mhFonts[i] ); - mhFonts[i] = nullptr; - } - if (i > nFallbackLevel) - mpWinFontEntry[i] = nullptr; - } + for( int i = nFallbackLevel + 1; mpWinFontEntry[i].is() && i < MAX_FALLBACK; ++i ) + mpWinFontEntry[i] = nullptr; } // now the font is live => update font face @@ -973,8 +960,8 @@ void WinSalGraphics::SetFont(LogicalFontInstance* pFont, int nFallbackLevel) void WinSalGraphics::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nFallbackLevel ) { // temporarily change the HDC to the font in the fallback level - assert(!mhFonts[nFallbackLevel] && mpWinFontEntry[nFallbackLevel]); - const HFONT hOldFont = SelectFont(getHDC(), mpWinFontEntry[nFallbackLevel]->GetHFONT()); + rtl::Reference<WinFontInstance> pFontInstance = mpWinFontEntry[nFallbackLevel]; + const HFONT hOldFont = SelectFont(getHDC(), pFontInstance->GetHFONT()); wchar_t aFaceName[LF_FACESIZE+60]; if( GetTextFaceW( getHDC(), SAL_N_ELEMENTS(aFaceName), aFaceName ) ) @@ -985,7 +972,7 @@ void WinSalGraphics::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nFa const RawFontData aHheaRawData(getHDC(), nHheaTag); const RawFontData aOS2RawData(getHDC(), nOS2Tag); - rxFontMetric->SetMinKashida(mpWinFontEntry[nFallbackLevel]->GetKashidaWidth()); + rxFontMetric->SetMinKashida(pFontInstance->GetKashidaWidth()); // get the font metric OUTLINETEXTMETRICW aOutlineMetric; @@ -1006,7 +993,7 @@ void WinSalGraphics::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nFa rxFontMetric->SetSlant( 0 ); // transformation dependent font metrics - rxFontMetric->SetWidth(static_cast<int>(mpWinFontEntry[nFallbackLevel]->GetScale() * aWinMetric.tmAveCharWidth)); + rxFontMetric->SetWidth(static_cast<int>(pFontInstance->GetScale() * aWinMetric.tmAveCharWidth)); const std::vector<uint8_t> rHhea(aHheaRawData.get(), aHheaRawData.get() + aHheaRawData.size()); const std::vector<uint8_t> rOS2(aOS2RawData.get(), aOS2RawData.get() + aOS2RawData.size()); @@ -1596,18 +1583,13 @@ private: HFONT m_hOrigFont; }; -ScopedFont::ScopedFont(WinSalGraphics & rData): m_rData(rData) +ScopedFont::ScopedFont(WinSalGraphics & rData): m_rData(rData), m_hOrigFont(nullptr) { if (m_rData.mpWinFontEntry[0]) { m_hOrigFont = m_rData.mpWinFontEntry[0]->GetHFONT(); m_rData.mpWinFontEntry[0]->UnsetHFONT(); } - else - { - m_hOrigFont = m_rData.mhFonts[0]; - m_rData.mhFonts[0] = nullptr; // avoid deletion of current font - } } ScopedFont::~ScopedFont() @@ -1615,11 +1597,8 @@ ScopedFont::~ScopedFont() if( m_hOrigFont ) { // restore original font, destroy temporary font - HFONT hTempFont = m_rData.mhFonts[0]; - if (m_rData.mpWinFontEntry[0]) - m_rData.mpWinFontEntry[0]->SetHFONT(m_hOrigFont); - else - m_rData.mhFonts[0] = m_hOrigFont; + HFONT hTempFont = m_rData.mpWinFontEntry[0]->GetHFONT(); + m_rData.mpWinFontEntry[0]->SetHFONT(m_hOrigFont); SelectObject( m_rData.getHDC(), m_hOrigFont ); DeleteObject( hTempFont ); } diff --git a/vcl/win/gdi/salgdi.cxx b/vcl/win/gdi/salgdi.cxx index 46155bbef3dc..24188e42517d 100644 --- a/vcl/win/gdi/salgdi.cxx +++ b/vcl/win/gdi/salgdi.cxx @@ -620,12 +620,6 @@ WinSalGraphics::WinSalGraphics(WinSalGraphics::Type eType, bool bScreen, HWND hW mpImpl.reset(new WinOpenGLSalGraphicsImpl(*this, pProvider)); else mpImpl.reset(new WinSalGraphicsImpl(*this)); - - for( int i = 0; i < MAX_FALLBACK; ++i ) - { - mhFonts[ i ] = nullptr; - mpWinFontEntry[ i ] = nullptr; - } } WinSalGraphics::~WinSalGraphics() |