[Libreoffice-commits] core.git: Branch 'feature/fixes7' - 2 commits - vcl/inc vcl/win
Tor Lillqvist
tml at collabora.com
Thu Aug 20 06:06:16 PDT 2015
vcl/inc/win/salgdi.h | 11 --------
vcl/win/source/gdi/salgdi.cxx | 5 ---
vcl/win/source/gdi/salgdi3.cxx | 40 -------------------------------
vcl/win/source/gdi/winlayout.cxx | 49 ++++-----------------------------------
4 files changed, 7 insertions(+), 98 deletions(-)
New commits:
commit f1dec3a397393639da58585f834cc8d4d9409989
Author: Tor Lillqvist <tml at collabora.com>
Date: Thu Aug 20 15:40:40 2015 +0300
Adjust for the TA_BASELINE of the DC
The text alignment of DCs is set to TA_BASELINE in
WinSalGraphics::InitGraphics(). In the ScriptTextOut-using old code
path this affects where glyphs are put, so we need to take it into
consideration also in the new code path that uses cached glyph
textures. Adjusting the position up by the ascent plus internal
leading of the font seems to work at least for horizontal scripts.
(We used to bluntly adjust the position up by the height of the glyph
cache texture, which was too much. The glyphs got positioned too high
and the top of tall ones was clipped.)
Change-Id: I86aecd6f3016e14b2f0328555ddfd3129e394c4c
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 315d983..d445506 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -64,6 +64,7 @@ struct OpenGLGlyphCacheChunk
int mnGlyphCount;
std::vector<Rectangle> maLocation;
std::shared_ptr<OpenGLTexture> mpTexture;
+ int mnAscentPlusIntLeading;
};
// win32 specific physical font instance
@@ -355,6 +356,10 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
aChunk.mpTexture = std::unique_ptr<OpenGLTexture>(aDC.getTexture());
+ TEXTMETRICW aTextMetric;
+ GetTextMetricsW(aDC.getCompatibleHDC(), &aTextMetric);
+ aChunk.mnAscentPlusIntLeading = aTextMetric.tmAscent + aTextMetric.tmInternalLeading;
+
maOpenGLGlyphCache.insert(n, aChunk);
SelectFont(aDC.getCompatibleHDC(), hOrigFont);
@@ -1667,7 +1672,7 @@ bool UniscribeLayout::DrawCachedGlyphs(SalGraphics& rGraphics) const
SalTwoRect a2Rects(rChunk.maLocation[n].Left(), rChunk.maLocation[n].Top(),
rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight(),
- nAdvance + aPos.X() + mpGlyphOffsets[i].du, aPos.Y() + mpGlyphOffsets[i].dv - rChunk.maLocation[n].getHeight(),
+ nAdvance + aPos.X() + mpGlyphOffsets[i].du, aPos.Y() + mpGlyphOffsets[i].dv - rChunk.mnAscentPlusIntLeading,
rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight()); // ???
pImpl->DrawMask(*rChunk.mpTexture, salColor, a2Rects);
nAdvance += mpGlyphAdvances[i];
commit 4f9262c87d707f220d640ad513264e8f67ae9761
Author: Tor Lillqvist <tml at collabora.com>
Date: Thu Aug 20 13:37:13 2015 +0300
Drop code that is dead after 4667db065d34193d99bce82f7e8f3b20a03ecade
Change-Id: Id023b43e901b0e41ebf3b208c6e80fd023bf7f9a
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index a700fac..f499a31 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -214,9 +214,6 @@ private:
RGNDATA* mpClipRgnData; // ClipRegion-Data
RGNDATA* mpStdClipRgnData; // Cache Standard-ClipRegion-Data
ImplFontAttrCache* mpFontAttrCache; // Cache font attributes from files in so/share/fonts
- bool mbFontKernInit; // FALSE: FontKerns must be queried
- KERNINGPAIR* mpFontKernPairs; // Kerning Pairs of the current Font
- sal_uIntPtr mnFontKernPairCount;// Number of Kerning Pairs of the current Font
int mnPenWidth; // Linienbreite
public:
@@ -336,12 +333,6 @@ protected:
const SalBitmap* pAlphaBitmap) SAL_OVERRIDE;
virtual bool drawAlphaRect( long nX, long nY, long nWidth, long nHeight, sal_uInt8 nTransparency ) SAL_OVERRIDE;
-private:
- // local helpers
-
- // get kernign pairs of the current font
- sal_uLong GetKernPairs();
-
public:
// public SalGraphics methods, the interface to the independent vcl part
@@ -470,7 +461,7 @@ void ImplGetLogFontFromFontSelect( HDC, const FontSelectPattern*,
#define MAX_64KSALPOINTS ((((sal_uInt16)0xFFFF)-8)/sizeof(POINTS))
// #102411# Win's GCP mishandles kerning => we need to do it ourselves
-// SalGraphicsData::mpFontKernPairs is sorted by
+// kerning pairs is sorted by
inline bool ImplCmpKernData( const KERNINGPAIR& a, const KERNINGPAIR& b )
{
if( a.wFirst < b.wFirst )
diff --git a/vcl/win/source/gdi/salgdi.cxx b/vcl/win/source/gdi/salgdi.cxx
index 23d4e5c..64d4952 100644
--- a/vcl/win/source/gdi/salgdi.cxx
+++ b/vcl/win/source/gdi/salgdi.cxx
@@ -634,9 +634,6 @@ WinSalGraphics::WinSalGraphics(WinSalGraphics::Type eType, bool bScreen, HWND hW
mhDefPal(0),
mpStdClipRgnData(NULL),
mpFontAttrCache(NULL),
- mpFontKernPairs(NULL),
- mnFontKernPairCount(0),
- mbFontKernInit(false),
mnPenWidth(GSL_PEN_WIDTH)
{
if (OpenGLHelper::isVCLOpenGLEnabled() && !mbPrinter)
@@ -666,8 +663,6 @@ WinSalGraphics::~WinSalGraphics()
// delete cache data
delete [] mpStdClipRgnData;
-
- delete [] mpFontKernPairs;
}
SalGraphicsImpl* WinSalGraphics::GetImpl() const
diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx
index c70d868..419fa26a 100644
--- a/vcl/win/source/gdi/salgdi3.cxx
+++ b/vcl/win/source/gdi/salgdi3.cxx
@@ -1559,17 +1559,6 @@ sal_uInt16 WinSalGraphics::SetFont( FontSelectPattern* pFont, int nFallbackLevel
if( mpWinFontData[ nFallbackLevel ] )
mpWinFontData[ nFallbackLevel ]->UpdateFromHDC( getHDC() );
- if( !nFallbackLevel )
- {
- mbFontKernInit = TRUE;
- if ( mpFontKernPairs )
- {
- delete[] mpFontKernPairs;
- mpFontKernPairs = NULL;
- }
- mnFontKernPairCount = 0;
- }
-
// some printers have higher internal resolution, so their
// text output would be different from what we calculated
// => suggest DrawTextArray to workaround this problem
@@ -1655,35 +1644,6 @@ void WinSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLe
pMetric->mnMinKashida = GetMinKashidaWidth();
}
-sal_uLong WinSalGraphics::GetKernPairs()
-{
- if ( mbFontKernInit )
- {
- if( mpFontKernPairs )
- {
- delete[] mpFontKernPairs;
- mpFontKernPairs = NULL;
- }
- mnFontKernPairCount = 0;
-
- KERNINGPAIR* pPairs = NULL;
- int nCount = ::GetKerningPairsW( getHDC(), 0, NULL );
- if( nCount )
- {
- pPairs = new KERNINGPAIR[ nCount+1 ];
- mpFontKernPairs = pPairs;
- mnFontKernPairCount = nCount;
- ::GetKerningPairsW( getHDC(), nCount, pPairs );
- }
-
- mbFontKernInit = FALSE;
-
- std::sort( mpFontKernPairs, mpFontKernPairs + mnFontKernPairCount, ImplCmpKernData );
- }
-
- return mnFontKernPairCount;
-}
-
const FontCharMapPtr WinSalGraphics::GetFontCharMap() const
{
if( !mpWinFontData[0] )
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index c1c2d7e..315d983 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -77,14 +77,6 @@ private:
// TODO: also add HFONT??? Watch out for issues with too many active fonts...
public:
- bool HasKernData() const;
- void SetKernData( int, const KERNINGPAIR* );
- int GetKerning( sal_Unicode, sal_Unicode ) const;
-private:
- KERNINGPAIR* mpKerningPairs;
- int mnKerningPairs;
-
-public:
SCRIPT_CACHE& GetScriptCache() const
{ return maScriptCache; }
private:
@@ -2426,8 +2418,6 @@ int WinSalGraphics::GetMinKashidaWidth()
ImplWinFontEntry::ImplWinFontEntry( FontSelectPattern& rFSD )
: ImplFontEntry( rFSD )
-, mpKerningPairs( NULL )
-, mnKerningPairs( -1 )
, maWidthMap( 512 )
, mnMinKashidaWidth( -1 )
, mnMinKashidaGlyph( -1 )
@@ -2439,38 +2429,6 @@ ImplWinFontEntry::~ImplWinFontEntry()
{
if( maScriptCache != NULL )
ScriptFreeCache( &maScriptCache );
- delete[] mpKerningPairs;
-}
-
-bool ImplWinFontEntry::HasKernData() const
-{
- return (mnKerningPairs >= 0);
-}
-
-void ImplWinFontEntry::SetKernData( int nPairCount, const KERNINGPAIR* pPairData )
-{
- mnKerningPairs = nPairCount;
- mpKerningPairs = new KERNINGPAIR[ mnKerningPairs ];
- memcpy( mpKerningPairs, (const void*)pPairData, nPairCount*sizeof(KERNINGPAIR) );
-}
-
-int ImplWinFontEntry::GetKerning( sal_Unicode cLeft, sal_Unicode cRight ) const
-{
- int nKernAmount = 0;
- if( mpKerningPairs )
- {
- const KERNINGPAIR aRefPair = { cLeft, cRight, 0 };
- const KERNINGPAIR* pFirstPair = mpKerningPairs;
- const KERNINGPAIR* pEndPair = mpKerningPairs + mnKerningPairs;
- const KERNINGPAIR* pPair = std::lower_bound( pFirstPair,
- pEndPair, aRefPair, ImplCmpKernData );
- if( (pPair != pEndPair)
- && (pPair->wFirst == aRefPair.wFirst)
- && (pPair->wSecond == aRefPair.wSecond) )
- nKernAmount = pPair->iKernAmount;
- }
-
- return nKernAmount;
}
bool ImplWinFontEntry::InitKashidaHandling( HDC hDC )
More information about the Libreoffice-commits
mailing list