summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/win/salgdi.h1
-rw-r--r--vcl/inc/win/winlayout.hxx3
-rw-r--r--vcl/win/gdi/salfont.cxx66
-rw-r--r--vcl/win/gdi/salgdi.cxx1
4 files changed, 46 insertions, 25 deletions
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index fe4f4b8dc8eb..d43a1b28bef7 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -172,7 +172,6 @@ private:
HFONT mhFonts[ MAX_FALLBACK ]; // Font + Fallbacks
WinFontInstance* mpWinFontEntry[ MAX_FALLBACK ]; // pointer to the most recent font instance
float mfFontScale[ MAX_FALLBACK ]; // allows metrics emulation of huge font sizes
- float mfCurrentFontScale;
HRGN mhRegion; // vcl::Region Handle
HPEN mhDefPen; // DefaultPen
HBRUSH mhDefBrush; // DefaultBrush
diff --git a/vcl/inc/win/winlayout.hxx b/vcl/inc/win/winlayout.hxx
index 2e22834c891e..0c447153c800 100644
--- a/vcl/inc/win/winlayout.hxx
+++ b/vcl/inc/win/winlayout.hxx
@@ -156,6 +156,8 @@ public:
void SetHFONT(const HFONT);
HFONT GetHFONT() const { return m_hFont; }
+ void SetScale(float fScale) { m_fScale = fScale; }
+ float GetScale() const { return m_fScale; }
// Prevend deletion of the HFONT in the WinFontInstance destructor
// Used for the ScopedFont handling
@@ -167,6 +169,7 @@ private:
virtual hb_font_t* ImplInitHbFont() override;
HFONT m_hFont;
+ float m_fScale;
GlyphCache maGlyphCache;
};
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 81c8d3a92628..8056b46522a6 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -925,7 +925,6 @@ void WinSalGraphics::SetFont( const FontSelectPattern* pFont, int nFallbackLevel
::SelectFont(getHDC(), mhDefFont);
mhDefFont = nullptr;
}
- mfCurrentFontScale = mfFontScale[nFallbackLevel];
// release no longer referenced font handles
for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i )
{
@@ -939,6 +938,7 @@ void WinSalGraphics::SetFont( const FontSelectPattern* pFont, int nFallbackLevel
GetWinFontEntry(i)->Release();
mpWinFontEntry[i] = nullptr;
}
+ mfFontScale[i] = 1.0;
}
return;
}
@@ -953,52 +953,61 @@ void WinSalGraphics::SetFont( const FontSelectPattern* pFont, int nFallbackLevel
{
pFont->mpFontInstance->Acquire();
}
- mpWinFontEntry[ nFallbackLevel ] = reinterpret_cast<WinFontInstance*>( pFont->mpFontInstance );
+
+ WinFontInstance *pFontInstance = static_cast<WinFontInstance*>(pFont->mpFontInstance);
+ mpWinFontEntry[ nFallbackLevel ] = pFontInstance;
HFONT hOldFont = nullptr;
- HFONT hNewFont = mpWinFontEntry[ nFallbackLevel ] ? mpWinFontEntry[ nFallbackLevel ]->GetHFONT() : nullptr;
+ HFONT hNewFont = pFontInstance ? pFontInstance->GetHFONT() : nullptr;
if (!hNewFont)
{
- hNewFont = ImplDoSetFont(pFont->GetFontSelectPattern(), pFont->GetFontFace(), mfFontScale[ nFallbackLevel ], hOldFont);
- mpWinFontEntry[ nFallbackLevel ]->SetHFONT(hNewFont);
+ float fFontScale = 1.0;
+ hNewFont = ImplDoSetFont(pFont, nullptr, fFontScale, hOldFont);
+ if (pFontInstance)
+ {
+ pFontInstance->SetHFONT(hNewFont);
+ pFontInstance->SetScale(fFontScale);
+ }
+ else
+ {
+ if (mhFonts[nFallbackLevel])
+ ::DeleteFont(mhFonts[nFallbackLevel]);
+ mhFonts[nFallbackLevel] = hNewFont;
+ mfFontScale[nFallbackLevel] = fFontScale;
+ }
}
else
hOldFont = ::SelectFont( getHDC(), hNewFont );
- mfCurrentFontScale = mfFontScale[nFallbackLevel];
-
+ // keep default font
if( !mhDefFont )
- {
- // keep default font
mhDefFont = hOldFont;
- }
else
{
// release no longer referenced font handles
- for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i )
+ for (int i = nFallbackLevel + 1; i < MAX_FALLBACK; ++i)
{
- if( mhFonts[i] )
+ if (mhFonts[i])
{
::DeleteFont( mhFonts[i] );
mhFonts[i] = nullptr;
}
- if (i > nFallbackLevel && mpWinFontEntry[i])
+ if (mpWinFontEntry[i])
{
GetWinFontEntry(i)->Release();
mpWinFontEntry[i] = nullptr;
}
+ mfFontScale[i] = 1.0;
}
}
// store new font in correct layer
- if (mpWinFontEntry[nFallbackLevel])
+ if (pFontInstance)
{
// now the font is live => update font face
- const WinFontFace* pFontFace = static_cast<const WinFontFace*>(mpWinFontEntry[nFallbackLevel]->GetFontFace());
+ const WinFontFace* pFontFace = static_cast<const WinFontFace*>(pFontInstance->GetFontFace());
pFontFace->UpdateFromHDC(getHDC());
}
- else
- mhFonts[ nFallbackLevel ] = hNewFont;
}
void WinSalGraphics::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nFallbackLevel )
@@ -1037,7 +1046,7 @@ void WinSalGraphics::GetFontMetric( ImplFontMetricDataRef& rxFontMetric, int nFa
rxFontMetric->SetSlant( 0 );
// transformation dependent font metrics
- rxFontMetric->SetWidth(static_cast<int>( mfFontScale[nFallbackLevel] * aWinMetric.tmAveCharWidth ));
+ rxFontMetric->SetWidth(static_cast<int>(mpWinFontEntry[nFallbackLevel]->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());
@@ -1385,7 +1394,14 @@ bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle
return true;
}
+ WinFontInstance* pFont = mpWinFontEntry[rGlyph.mnFallbackLevel];
+ HFONT hNewFont = pFont ? pFont->GetHFONT() : mhFonts[rGlyph.mnFallbackLevel];
+ float fFontScale = pFont ? pFont->GetScale() : mfFontScale[rGlyph.mnFallbackLevel];
+
HDC hDC = getHDC();
+ HFONT hFont = static_cast<HFONT>(GetCurrentObject(hDC, OBJ_FONT));
+ if (hNewFont && (hFont != hNewFont))
+ SelectObject(hDC, hNewFont);
// use unity matrix
MAT2 aMat;
@@ -1399,15 +1415,17 @@ bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle
aGM.gmptGlyphOrigin.x = aGM.gmptGlyphOrigin.y = 0;
aGM.gmBlackBoxX = aGM.gmBlackBoxY = 0;
DWORD nSize = ::GetGlyphOutlineW(hDC, rGlyph.maGlyphId, nGGOFlags, &aGM, 0, nullptr, &aMat);
+ if (hNewFont && (hFont != hNewFont))
+ SelectObject(hDC, hFont);
if( nSize == GDI_ERROR )
return false;
rRect = tools::Rectangle( Point( +aGM.gmptGlyphOrigin.x, -aGM.gmptGlyphOrigin.y ),
Size( aGM.gmBlackBoxX, aGM.gmBlackBoxY ) );
- rRect.SetLeft(static_cast<int>( mfCurrentFontScale * rRect.Left() ));
- rRect.SetRight(static_cast<int>( mfCurrentFontScale * rRect.Right() ) + 1);
- rRect.SetTop(static_cast<int>( mfCurrentFontScale * rRect.Top() ));
- rRect.SetBottom(static_cast<int>( mfCurrentFontScale * rRect.Bottom() ) + 1);
+ rRect.SetLeft(static_cast<int>( fFontScale * rRect.Left() ));
+ rRect.SetRight(static_cast<int>( fFontScale * rRect.Right() ) + 1);
+ rRect.SetTop(static_cast<int>( fFontScale * rRect.Top() ));
+ rRect.SetBottom(static_cast<int>( fFontScale * rRect.Bottom() ) + 1);
g_BoundRectCache.insert({rGlyph.maGlyphId, rRect});
@@ -1587,7 +1605,9 @@ bool WinSalGraphics::GetGlyphOutline(const GlyphItem& rGlyph,
// rescaling needed for the tools::PolyPolygon conversion
if( rB2DPolyPoly.count() )
{
- const double fFactor(mfCurrentFontScale/256);
+ WinFontInstance *pFont = mpWinFontEntry[rGlyph.mnFallbackLevel];
+ float fFontScale = pFont ? pFont->GetScale() : mfFontScale[rGlyph.mnFallbackLevel];
+ const double fFactor(fFontScale/256);
rB2DPolyPoly.transform(basegfx::utils::createScaleB2DHomMatrix(fFactor, fFactor));
}
diff --git a/vcl/win/gdi/salgdi.cxx b/vcl/win/gdi/salgdi.cxx
index d38337b6d546..aba0d6e6589e 100644
--- a/vcl/win/gdi/salgdi.cxx
+++ b/vcl/win/gdi/salgdi.cxx
@@ -607,7 +607,6 @@ WinSalGraphics::WinSalGraphics(WinSalGraphics::Type eType, bool bScreen, HWND hW
mbWindow(eType == WinSalGraphics::WINDOW),
mbScreen(bScreen),
mhWnd(hWnd),
- mfCurrentFontScale(1.0),
mhRegion(nullptr),
mhDefPen(nullptr),
mhDefBrush(nullptr),