vcl/Library_vcl.mk | 1 vcl/inc/cairotextrender.hxx | 2 vcl/inc/opengl/win/gdiimpl.hxx | 1 vcl/inc/textrender.hxx | 7 vcl/inc/win/salgdi.h | 24 ++ vcl/inc/win/salvd.h | 3 vcl/inc/wintextrender.hxx | 140 ------------- vcl/win/source/gdi/salgdi.cxx | 30 ++ vcl/win/source/gdi/salgdi3.cxx | 131 ++----------- vcl/win/source/gdi/salvd.cxx | 15 - vcl/win/source/gdi/winlayout.cxx | 352 +++++++++++------------------------ vcl/win/source/gdi/winlayout.hxx | 229 ++++++++++++++++++++++ vcl/win/source/gdi/wintextrender.cxx | 64 ------ 13 files changed, 432 insertions(+), 567 deletions(-)
New commits: commit 1e6046d87440a860a3d1704226fd86f960d9e11c Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Nov 13 23:53:34 2014 +0100 windows opengl: Proof-of-concept text rendering. We don't have a method that would paint a texture with transparency yet. We also need to limit the size of the DIBSection exactly to what we are going to paint, no point in creating a huge bitmap that is mostly empty (but the part where is the text being drawn). Change-Id: Ice0bf325743d08e19e636be73cef6aff3cde5704 diff --git a/vcl/inc/opengl/win/gdiimpl.hxx b/vcl/inc/opengl/win/gdiimpl.hxx index aa29dd9..085be79 100644 --- a/vcl/inc/opengl/win/gdiimpl.hxx +++ b/vcl/inc/opengl/win/gdiimpl.hxx @@ -17,6 +17,7 @@ class WinOpenGLSalGraphicsImpl : public OpenGLSalGraphicsImpl { + friend class WinLayout; private: WinSalGraphics& mrParent; diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h index 69ea4cf..5e4d32f 100644 --- a/vcl/inc/win/salgdi.h +++ b/vcl/inc/win/salgdi.h @@ -146,6 +146,7 @@ class WinSalGraphics : public SalGraphics { friend class WinSalGraphicsImpl; friend class ScopedFont; + friend class WinLayout; private: boost::scoped_ptr<SalGraphicsImpl> mpImpl; diff --git a/vcl/inc/win/salvd.h b/vcl/inc/win/salvd.h index 546a1f0..2c59f47 100644 --- a/vcl/inc/win/salvd.h +++ b/vcl/inc/win/salvd.h @@ -51,8 +51,11 @@ public: virtual void ReleaseGraphics( SalGraphics* pGraphics ); virtual bool SetSize( long nNewDX, long nNewDY ); virtual void GetSize( long& rWidth, long& rHeight ); + + static HBITMAP ImplCreateVirDevBitmap(HDC hDC, long nDX, long nDY, sal_uInt16 nBitCount, void **ppDummy); }; + #endif // INCLUDED_VCL_INC_WIN_SALVD_H /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/win/source/gdi/salvd.cxx b/vcl/win/source/gdi/salvd.cxx index 2269deb..2b00c03 100644 --- a/vcl/win/source/gdi/salvd.cxx +++ b/vcl/win/source/gdi/salvd.cxx @@ -27,14 +27,14 @@ #include <win/salgdi.h> #include <win/salvd.h> -static HBITMAP ImplCreateVirDevBitmap( HDC hDC, long nDX, long nDY, - sal_uInt16 nBitCount ) +HBITMAP WinSalVirtualDevice::ImplCreateVirDevBitmap(HDC hDC, long nDX, long nDY, sal_uInt16 nBitCount, void **ppData) { HBITMAP hBitmap; if ( nBitCount == 1 ) { hBitmap = CreateBitmap( (int)nDX, (int)nDY, 1, 1, NULL ); + ppData = NULL; } else { @@ -55,9 +55,8 @@ static HBITMAP ImplCreateVirDevBitmap( HDC hDC, long nDX, long nDY, aBitmapInfo.bmiHeader.biClrUsed = 0; aBitmapInfo.bmiHeader.biClrImportant = 0; - void* pDummy; hBitmap = CreateDIBSection( hDC, &aBitmapInfo, - DIB_RGB_COLORS, &pDummy, NULL, + DIB_RGB_COLORS, ppData, NULL, 0 ); } @@ -87,8 +86,8 @@ SalVirtualDevice* WinSalInstance::CreateVirtualDevice( SalGraphics* pSGraphics, if( !hDC ) ImplWriteLastError( GetLastError(), "CreateCompatibleDC in CreateVirtualDevice" ); - hBmp = ImplCreateVirDevBitmap( pGraphics->getHDC(), - nDX, nDY, nBitCount ); + void *pDummy; + hBmp = WinSalVirtualDevice::ImplCreateVirDevBitmap(pGraphics->getHDC(), nDX, nDY, nBitCount, &pDummy); if( !hBmp ) ImplWriteLastError( GetLastError(), "ImplCreateVirDevBitmap in CreateVirtualDevice" ); // #124826# continue even if hBmp could not be created @@ -198,8 +197,8 @@ bool WinSalVirtualDevice::SetSize( long nDX, long nDY ) return TRUE; // ??? else { - HBITMAP hNewBmp = ImplCreateVirDevBitmap( getHDC(), nDX, nDY, - mnBitCount ); + void *pDummy; + HBITMAP hNewBmp = ImplCreateVirDevBitmap(getHDC(), nDX, nDY, mnBitCount, &pDummy); if ( hNewBmp ) { SelectBitmap( getHDC(), hNewBmp ); diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index b63e0fa..2bdc8e3 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -22,10 +22,12 @@ #include "osl/module.h" #include "osl/file.h" +#include <opengl/texture.hxx> +#include <opengl/win/gdiimpl.hxx> #include <vcl/opengl/OpenGLHelper.hxx> - -#include "win/salgdi.h" -#include "win/saldata.hxx" +#include <win/salgdi.h> +#include <win/saldata.hxx> +#include <win/salvd.h> #include "sft.hxx" #include "sallayout.hxx" @@ -151,14 +153,62 @@ SCRIPT_CACHE& WinLayout::GetScriptCache() const void WinLayout::DrawText(SalGraphics& rGraphics) const { - if (mbUseOpenGL) + WinSalGraphics& rWinGraphics = static_cast<WinSalGraphics&>(rGraphics); + HDC hDC = rWinGraphics.getHDC(); + + if (!mbUseOpenGL) { - // TODO draw to a texture instead - DrawTextImpl(static_cast<WinSalGraphics&>(rGraphics).getHDC()); + // no OpenGL, just classic rendering + DrawTextImpl(hDC); } else { - DrawTextImpl(static_cast<WinSalGraphics&>(rGraphics).getHDC()); + // we have to render the text to a hidden texture, and draw it + + // FIXME so that we don't have to use enormous bitmap, move the text + // to 0,0, size the width / height accordingly, and move it back via + // SalTwoRects later + const int width = 1024; + const int height = 1024; + const int bpp = 32; + + HDC compatibleDC = CreateCompatibleDC(hDC); + + sal_uInt8 *data; + HBITMAP hBitmap = WinSalVirtualDevice::ImplCreateVirDevBitmap(compatibleDC, width, height, bpp, reinterpret_cast<void **>(&data)); + // FIXME fill transparent instead of 128 + memset(data, 128, width*height*4); + + // draw the text to the hidden DC + HGDIOBJ hBitmapOld = SelectObject(compatibleDC, hBitmap); + SelectFont(compatibleDC, mhFont); + DrawTextImpl(compatibleDC); + SelectObject(compatibleDC, hBitmapOld); + + // and turn it into a texture + OpenGLTexture aTexture(width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + CHECK_GL_ERROR(); + + WinOpenGLSalGraphicsImpl *pImpl = dynamic_cast<WinOpenGLSalGraphicsImpl*>(rWinGraphics.mpImpl.get()); + if (pImpl) + { + SalTwoRect aRects; + aRects.mnSrcX = 0; + aRects.mnSrcY = 0; + aRects.mnSrcWidth = width; + aRects.mnSrcHeight = height; + aRects.mnDestX = 0; + aRects.mnDestY = 0; + aRects.mnDestWidth = width; + aRects.mnDestHeight = height; + + // FIXME We don't have a method that could paint a texture with + // transparency yet, use it when we have it + pImpl->DrawTexture(aTexture.Id(), Size(width, height), aRects); + } + + DeleteObject(hBitmap); + DeleteDC(compatibleDC); } } commit 0c3f9bb9deba180a152ff376e7b24ac5c1aa0667 Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Nov 13 20:14:22 2014 +0100 windows opengl: Prepare WinLayout (and derived classes) for OpenGL. Change-Id: Ifd18f51ac417cb3778e61f33df30daa7be6c0bf8 diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index d5c6c80..b63e0fa 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -22,7 +22,7 @@ #include "osl/module.h" #include "osl/file.h" -#include "vcl/svapp.hxx" +#include <vcl/opengl/OpenGLHelper.hxx> #include "win/salgdi.h" #include "win/saldata.hxx" @@ -107,13 +107,14 @@ inline int ImplWinFontEntry::GetCachedGlyphWidth( int nCharCode ) const return it->second; } -WinLayout::WinLayout( HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE ) +WinLayout::WinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE, bool bUseOpenGL) : mhDC( hDC ), mhFont( (HFONT)::GetCurrentObject(hDC,OBJ_FONT) ), mnBaseAdv( 0 ), mfFontScale( 1.0 ), mrWinFontData( rWFD ), - mrWinFontEntry( rWFE ) + mrWinFontEntry(rWFE), + mbUseOpenGL(bUseOpenGL) {} void WinLayout::InitFont() const @@ -148,9 +149,22 @@ SCRIPT_CACHE& WinLayout::GetScriptCache() const return mrWinFontEntry.GetScriptCache(); } -SimpleWinLayout::SimpleWinLayout( HDC hDC, BYTE nCharSet, - const ImplWinFontData& rWinFontData, ImplWinFontEntry& rWinFontEntry ) -: WinLayout( hDC, rWinFontData, rWinFontEntry ), +void WinLayout::DrawText(SalGraphics& rGraphics) const +{ + if (mbUseOpenGL) + { + // TODO draw to a texture instead + DrawTextImpl(static_cast<WinSalGraphics&>(rGraphics).getHDC()); + } + else + { + DrawTextImpl(static_cast<WinSalGraphics&>(rGraphics).getHDC()); + } +} + +SimpleWinLayout::SimpleWinLayout(HDC hDC, BYTE nCharSet, const ImplWinFontData& rWinFontData, + ImplWinFontEntry& rWinFontEntry, bool bUseOpenGL) +: WinLayout(hDC, rWinFontData, rWinFontEntry, bUseOpenGL), mnGlyphCount( 0 ), mnCharCount( 0 ), mpOutGlyphs( NULL ), @@ -517,14 +531,11 @@ int SimpleWinLayout::GetNextGlyphs( int nLen, sal_GlyphId* pGlyphIds, Point& rPo return nCount; } -void SimpleWinLayout::DrawText( SalGraphics& rGraphics ) const +void SimpleWinLayout::DrawTextImpl(HDC hDC) const { if( mnGlyphCount <= 0 ) return; - WinSalGraphics& rWinGraphics = static_cast<WinSalGraphics&>(rGraphics); - HDC aHDC = rWinGraphics.getHDC(); - HFONT hOrigFont = DisableFontScaling(); UINT mnDrawOptions = ETO_GLYPH_INDEX; @@ -543,24 +554,23 @@ void SimpleWinLayout::DrawText( SalGraphics& rGraphics ) const // #108267#,#109387# break up string into smaller chunks // the output positions will be updated by windows (SetTextAlign) POINT oldPos; - UINT oldTa = ::GetTextAlign( aHDC ); - ::SetTextAlign( aHDC, (oldTa & ~TA_NOUPDATECP) | TA_UPDATECP ); - ::MoveToEx( aHDC, aPos.X(), aPos.Y(), &oldPos ); + UINT oldTa = ::GetTextAlign(hDC); + ::SetTextAlign(hDC, (oldTa & ~TA_NOUPDATECP) | TA_UPDATECP); + ::MoveToEx(hDC, aPos.X(), aPos.Y(), &oldPos); unsigned int i = 0; for( unsigned int n = 0; n < numGlyphPortions; ++n, i+=maxGlyphCount ) - ::ExtTextOutW( aHDC, 0, 0, mnDrawOptions, NULL, - mpOutGlyphs+i, maxGlyphCount, mpGlyphAdvances+i ); - ::ExtTextOutW( aHDC, 0, 0, mnDrawOptions, NULL, - mpOutGlyphs+i, remainingGlyphs, mpGlyphAdvances+i ); - ::MoveToEx( aHDC, oldPos.x, oldPos.y, (LPPOINT) NULL); - ::SetTextAlign( aHDC, oldTa ); + { + ::ExtTextOutW(hDC, 0, 0, mnDrawOptions, NULL, mpOutGlyphs+i, maxGlyphCount, mpGlyphAdvances+i); + } + ::ExtTextOutW(hDC, 0, 0, mnDrawOptions, NULL, mpOutGlyphs+i, remainingGlyphs, mpGlyphAdvances+i); + ::MoveToEx(hDC, oldPos.x, oldPos.y, (LPPOINT) NULL); + ::SetTextAlign(hDC, oldTa); } else - ::ExtTextOutW( aHDC, aPos.X(), aPos.Y(), mnDrawOptions, NULL, - mpOutGlyphs, mnGlyphCount, mpGlyphAdvances ); + ::ExtTextOutW(hDC, aPos.X(), aPos.Y(), mnDrawOptions, NULL, mpOutGlyphs, mnGlyphCount, mpGlyphAdvances); if( hOrigFont ) - DeleteFont( SelectFont( aHDC, hOrigFont ) ); + DeleteFont(SelectFont(hDC, hOrigFont)); } DeviceCoordinate SimpleWinLayout::FillDXArray( DeviceCoordinate* pDXArray ) const @@ -933,9 +943,9 @@ static bool InitUSP() return true; } -UniscribeLayout::UniscribeLayout( HDC hDC, - const ImplWinFontData& rWinFontData, ImplWinFontEntry& rWinFontEntry ) -: WinLayout( hDC, rWinFontData, rWinFontEntry ), +UniscribeLayout::UniscribeLayout(HDC hDC, const ImplWinFontData& rWinFontData, + ImplWinFontEntry& rWinFontEntry, bool bUseOpenGL) +: WinLayout(hDC, rWinFontData, rWinFontEntry, bUseOpenGL), mpScriptItems( NULL ), mpVisualItems( NULL ), mnItemCount( 0 ), @@ -1907,7 +1917,7 @@ void UniscribeLayout::Simplify( bool /*bIsBase*/ ) } } -void UniscribeLayout::DrawText( SalGraphics& ) const +void UniscribeLayout::DrawTextImpl(HDC hDC) const { HFONT hOrigFont = DisableFontScaling(); @@ -1943,18 +1953,18 @@ void UniscribeLayout::DrawText( SalGraphics& ) const Point aRelPos( rVisualItem.mnXOffset + nBaseClusterOffset, 0 ); Point aPos = GetDrawPosition( aRelPos ); SCRIPT_CACHE& rScriptCache = GetScriptCache(); - ScriptTextOut( mhDC, &rScriptCache, + ScriptTextOut(hDC, &rScriptCache, aPos.X(), aPos.Y(), 0, NULL, &rVisualItem.mpScriptItem->a, NULL, 0, mpOutGlyphs + nMinGlyphPos, nEndGlyphPos - nMinGlyphPos, mpGlyphAdvances + nMinGlyphPos, mpJustifications ? mpJustifications + nMinGlyphPos : NULL, - mpGlyphOffsets + nMinGlyphPos ); + mpGlyphOffsets + nMinGlyphPos); } if( hOrigFont ) - DeleteFont( SelectFont( mhDC, hOrigFont ) ); + DeleteFont(SelectFont(hDC, hOrigFont)); } DeviceCoordinate UniscribeLayout::FillDXArray( DeviceCoordinate* pDXArray ) const @@ -2494,8 +2504,8 @@ float gr_fontAdvance(const void* appFontHandle, gr_uint16 glyphId) return gm.gmCellIncX; } -GraphiteWinLayout::GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE) throw() - : WinLayout(hDC, rWFD, rWFE), mpFont(NULL), +GraphiteWinLayout::GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE, bool bUseOpenGL) throw() + : WinLayout(hDC, rWFD, rWFE, bUseOpenGL), mpFont(NULL), maImpl(rWFD.GraphiteFace(), rWFE) { // the log font size may differ from the font entry size if scaling is used for large fonts @@ -2577,10 +2587,9 @@ void GraphiteWinLayout::AdjustLayout(ImplLayoutArgs& rArgs) maImpl.AdjustLayout(rArgs); } -void GraphiteWinLayout::DrawText(SalGraphics &sal_graphics) const +void GraphiteWinLayout::DrawTextImpl(HDC hDC) const { HFONT hOrigFont = DisableFontScaling(); - const HDC aHDC = static_cast<WinSalGraphics&>(sal_graphics).getHDC(); maImpl.DrawBase() = WinLayout::maDrawBase; maImpl.DrawOffset() = WinLayout::maDrawOffset; const int MAX_GLYPHS = 2; @@ -2595,11 +2604,10 @@ void GraphiteWinLayout::DrawText(SalGraphics &sal_graphics) const if (nGlyphs < 1) break; std::copy(glyphIntStr, glyphIntStr + nGlyphs, glyphWStr); - ::ExtTextOutW(aHDC, aPos.X(), aPos.Y(), ETO_GLYPH_INDEX, - NULL, (LPCWSTR)&(glyphWStr), nGlyphs, NULL); + ::ExtTextOutW(hDC, aPos.X(), aPos.Y(), ETO_GLYPH_INDEX, NULL, (LPCWSTR)&(glyphWStr), nGlyphs, NULL); } while (nGlyphs); if( hOrigFont ) - DeleteFont( SelectFont( aHDC, hOrigFont ) ); + DeleteFont(SelectFont(hDC, hOrigFont)); } sal_Int32 GraphiteWinLayout::GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const @@ -2652,18 +2660,20 @@ SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLe const ImplWinFontData& rFontFace = *mpWinFontData[ nFallbackLevel ]; ImplWinFontEntry& rFontInstance = *mpWinFontEntry[ nFallbackLevel ]; + bool bUseOpenGL = OpenGLHelper::isVCLOpenGLEnabled(); + if( !(rArgs.mnFlags & SAL_LAYOUT_COMPLEX_DISABLED) && (bUspInited || InitUSP()) ) // CTL layout engine { #if ENABLE_GRAPHITE if (rFontFace.SupportsGraphite()) { - pWinLayout = new GraphiteWinLayout(getHDC(), rFontFace, rFontInstance); + pWinLayout = new GraphiteWinLayout(getHDC(), rFontFace, rFontInstance, bUseOpenGL); } else #endif // ENABLE_GRAPHITE // script complexity is determined in upper layers - pWinLayout = new UniscribeLayout( getHDC(), rFontFace, rFontInstance ); + pWinLayout = new UniscribeLayout(getHDC(), rFontFace, rFontInstance, bUseOpenGL); // NOTE: it must be guaranteed that the WinSalGraphics lives longer than // the created UniscribeLayout, otherwise the data passed into the // constructor might become invalid too early @@ -2683,10 +2693,10 @@ SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLe eCharSet = mpLogFont->lfCharSet; #if ENABLE_GRAPHITE if (rFontFace.SupportsGraphite()) - pWinLayout = new GraphiteWinLayout( getHDC(), rFontFace, rFontInstance); + pWinLayout = new GraphiteWinLayout(getHDC(), rFontFace, rFontInstance, bUseOpenGL); else #endif // ENABLE_GRAPHITE - pWinLayout = new SimpleWinLayout( getHDC(), eCharSet, rFontFace, rFontInstance ); + pWinLayout = new SimpleWinLayout(getHDC(), eCharSet, rFontFace, rFontInstance, bUseOpenGL); } if( mfFontScale[nFallbackLevel] != 1.0 ) diff --git a/vcl/win/source/gdi/winlayout.hxx b/vcl/win/source/gdi/winlayout.hxx index b96e9ea..7847665 100644 --- a/vcl/win/source/gdi/winlayout.hxx +++ b/vcl/win/source/gdi/winlayout.hxx @@ -40,18 +40,26 @@ struct VisualItem; class WinLayout : public SalLayout { public: - WinLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); + WinLayout(HDC, const ImplWinFontData&, ImplWinFontEntry&, bool bUseOpenGL); virtual void InitFont() const; void SetFontScale( float f ) { mfFontScale = f; } HFONT DisableFontScaling( void) const; SCRIPT_CACHE& GetScriptCache() const; + /// In the non-OpenGL case, call the DrawTextImpl directly, otherwise make + /// sure we draw to an interim texture. + virtual void DrawText(SalGraphics&) const SAL_OVERRIDE; + + /// Draw to the provided HDC. + virtual void DrawTextImpl(HDC hDC) const = 0; + protected: HDC mhDC; // WIN32 device handle HFONT mhFont; // WIN32 font handle int mnBaseAdv; // x-offset relative to Layout origin float mfFontScale; // allows metrics emulation of huge font sizes + bool mbUseOpenGL; ///< We need to render via OpenGL const ImplWinFontData& mrWinFontData; ImplWinFontEntry& mrWinFontEntry; @@ -60,12 +68,12 @@ protected: class SimpleWinLayout : public WinLayout { public: - SimpleWinLayout( HDC, BYTE nCharSet, const ImplWinFontData&, ImplWinFontEntry& ); + SimpleWinLayout(HDC, BYTE nCharSet, const ImplWinFontData&, ImplWinFontEntry&, bool bUseOpenGL); virtual ~SimpleWinLayout(); virtual bool LayoutText( ImplLayoutArgs& ); virtual void AdjustLayout( ImplLayoutArgs& ); - virtual void DrawText( SalGraphics& ) const; + virtual void DrawTextImpl(HDC hDC) const SAL_OVERRIDE; virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, DeviceCoordinate* pGlyphAdvances, int* pCharIndexes, @@ -104,11 +112,11 @@ private: class UniscribeLayout : public WinLayout { public: - UniscribeLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); + UniscribeLayout(HDC, const ImplWinFontData&, ImplWinFontEntry&, bool bUseOpenGL); virtual bool LayoutText( ImplLayoutArgs& ); virtual void AdjustLayout( ImplLayoutArgs& ); - virtual void DrawText( SalGraphics& ) const; + virtual void DrawTextImpl(HDC hDC) const SAL_OVERRIDE; virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, DeviceCoordinate* pGlyphAdvances, int* pCharPosAry, const PhysicalFontFace** pFallbackFonts = NULL ) const; @@ -189,13 +197,13 @@ private: grutils::GrFeatureParser * mpFeatures; mutable GraphiteLayoutWinImpl maImpl; public: - GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE) throw(); + GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE, bool bUseOpenGL) throw(); virtual ~GraphiteWinLayout(); // used by upper layers virtual bool LayoutText( ImplLayoutArgs& ); // first step of layout virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting after fallback etc. - virtual void DrawText( SalGraphics& ) const; + virtual void DrawTextImpl(HDC hDC) const SAL_OVERRIDE; // methods using string indexing virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; commit 7ce7bce3d5294e8e81b03cfdb026442fd464bb7b Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Nov 13 18:58:54 2014 +0100 vcl: Split winlayout.cxx to .cxx and .hxx. Change-Id: I4a26842777536ce63b482a2d69524918a18b602c diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index 958348f..d5c6c80 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -17,8 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <svsys.h> -#include "rtl/ustring.hxx" +#include "winlayout.hxx" #include "osl/module.h" #include "osl/file.h" @@ -39,7 +38,6 @@ #include <algorithm> -#include <usp10.h> #include <shlwapi.h> #include <winver.h> @@ -51,7 +49,6 @@ typedef boost::unordered_map<int,int> IntMap; #include <config_graphite.h> #if ENABLE_GRAPHITE #include <i18nlangtag/languagetag.hxx> -#include <graphite_layout.hxx> #include <graphite_features.hxx> #endif @@ -110,71 +107,6 @@ inline int ImplWinFontEntry::GetCachedGlyphWidth( int nCharCode ) const return it->second; } -class WinLayout : public SalLayout -{ -public: - WinLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); - virtual void InitFont() const; - void SetFontScale( float f ) { mfFontScale = f; } - HFONT DisableFontScaling( void) const; - - SCRIPT_CACHE& GetScriptCache() const - { return mrWinFontEntry.GetScriptCache(); } - -protected: - HDC mhDC; // WIN32 device handle - HFONT mhFont; // WIN32 font handle - int mnBaseAdv; // x-offset relative to Layout origin - float mfFontScale; // allows metrics emulation of huge font sizes - - const ImplWinFontData& mrWinFontData; - ImplWinFontEntry& mrWinFontEntry; -}; - -class SimpleWinLayout : public WinLayout -{ -public: - SimpleWinLayout( HDC, BYTE nCharSet, const ImplWinFontData&, ImplWinFontEntry& ); - virtual ~SimpleWinLayout(); - - virtual bool LayoutText( ImplLayoutArgs& ); - virtual void AdjustLayout( ImplLayoutArgs& ); - virtual void DrawText( SalGraphics& ) const; - - virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, - DeviceCoordinate* pGlyphAdvances, int* pCharIndexes, - const PhysicalFontFace** pFallbackFonts = NULL ) const; - - virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; - virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; - - // for glyph+font+script fallback - virtual void MoveGlyph( int nStart, long nNewXPos ); - virtual void DropGlyph( int nStart ); - virtual void Simplify( bool bIsBase ); - -protected: - void Justify( DeviceCoordinate nNewWidth ); - void ApplyDXArray( const ImplLayoutArgs& ); - -private: - int mnGlyphCount; - int mnCharCount; - WCHAR* mpOutGlyphs; - int* mpGlyphAdvances; // if possible this is shared with mpGlyphAdvances[] - int* mpGlyphOrigAdvs; - int* mpCharWidths; // map rel char pos to char width - int* mpChars2Glyphs; // map rel char pos to abs glyph pos - int* mpGlyphs2Chars; // map abs glyph pos to abs char pos - bool* mpGlyphRTLFlags; // BiDi status for glyphs: true=>RTL - mutable long mnWidth; - bool mbDisableGlyphs; - - int mnNotdefWidth; - BYTE mnCharSet; -}; - WinLayout::WinLayout( HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE ) : mhDC( hDC ), mhFont( (HFONT)::GetCurrentObject(hDC,OBJ_FONT) ), @@ -211,6 +143,11 @@ HFONT WinLayout::DisableFontScaling() const return SelectFont( mhDC, hHugeFont ); } +SCRIPT_CACHE& WinLayout::GetScriptCache() const +{ + return mrWinFontEntry.GetScriptCache(); +} + SimpleWinLayout::SimpleWinLayout( HDC hDC, BYTE nCharSet, const ImplWinFontData& rWinFontData, ImplWinFontEntry& rWinFontEntry ) : WinLayout( hDC, rWinFontData, rWinFontEntry ), @@ -954,72 +891,6 @@ public: bool HasKashidas() const { return mbHasKashidas; } }; -class UniscribeLayout : public WinLayout -{ -public: - UniscribeLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); - - virtual bool LayoutText( ImplLayoutArgs& ); - virtual void AdjustLayout( ImplLayoutArgs& ); - virtual void DrawText( SalGraphics& ) const; - virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, - DeviceCoordinate* pGlyphAdvances, int* pCharPosAry, - const PhysicalFontFace** pFallbackFonts = NULL ) const; - - virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; - virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; - virtual bool IsKashidaPosValid ( int nCharPos ) const; - - // for glyph+font+script fallback - virtual void MoveGlyph( int nStart, long nNewXPos ); - virtual void DropGlyph( int nStart ); - virtual void Simplify( bool bIsBase ); - virtual void DisableGlyphInjection( bool bDisable ) { mbDisableGlyphInjection = bDisable; } - -protected: - virtual ~UniscribeLayout(); - - void Justify( DeviceCoordinate nNewWidth ); - void ApplyDXArray( const ImplLayoutArgs& ); - - bool GetItemSubrange( const VisualItem&, - int& rMinIndex, int& rEndIndex ) const; - -private: - // item specific info - SCRIPT_ITEM* mpScriptItems; // in logical order - VisualItem* mpVisualItems; // in visual order - int mnItemCount; // number of visual items - - // string specific info - // everything is in logical order - int mnCharCapacity; - WORD* mpLogClusters; // map from absolute_char_pos to relative_glyph_pos - int* mpCharWidths; // map from absolute_char_pos to char_width - int mnSubStringMin; // char_pos of first char in context - - // glyph specific info - // everything is in visual order - int mnGlyphCount; - int mnGlyphCapacity; - int* mpGlyphAdvances; // glyph advance width before justification - int* mpJustifications; // glyph advance width after justification - WORD* mpOutGlyphs; // glyphids in visual order - GOFFSET* mpGlyphOffsets; // glyph offsets to the "naive" layout - SCRIPT_VISATTR* mpVisualAttrs; // glyph visual attributes - mutable int* mpGlyphs2Chars; // map from absolute_glyph_pos to absolute_char_pos - - // kashida stuff - void InitKashidaHandling(); - void KashidaItemFix( int nMinGlyphPos, int nEndGlyphPos ); - bool KashidaWordFix( int nMinGlyphPos, int nEndGlyphPos, int* pnCurrentPos ); - - int mnMinKashidaWidth; - int mnMinKashidaGlyph; - bool mbDisableGlyphInjection; -}; - static bool bUspInited = false; static bool bManualCellAlign = true; @@ -2604,63 +2475,12 @@ bool UniscribeLayout::IsKashidaPosValid ( int nCharPos ) const #if ENABLE_GRAPHITE -class GraphiteLayoutWinImpl : public GraphiteLayout -{ -public: - GraphiteLayoutWinImpl(const gr_face * pFace, ImplWinFontEntry & rFont) - throw() - : GraphiteLayout(pFace), mrFont(rFont) {}; - virtual ~GraphiteLayoutWinImpl() throw() {}; - virtual sal_GlyphId getKashidaGlyph(int & rWidth); -private: - ImplWinFontEntry & mrFont; -}; - sal_GlyphId GraphiteLayoutWinImpl::getKashidaGlyph(int & rWidth) { rWidth = mrFont.GetMinKashidaWidth(); return mrFont.GetMinKashidaGlyph(); } -// This class uses the SIL Graphite engine to provide complex text layout services to the VCL -// @author tse - -class GraphiteWinLayout : public WinLayout -{ -private: - gr_font * mpFont; - grutils::GrFeatureParser * mpFeatures; - mutable GraphiteLayoutWinImpl maImpl; -public: - GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE) throw(); - - // used by upper layers - virtual bool LayoutText( ImplLayoutArgs& ); // first step of layout - virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting after fallback etc. - virtual void DrawText( SalGraphics& ) const; - - // methods using string indexing - virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; - virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; - - virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; - - // methods using glyph indexing - virtual int GetNextGlyphs(int nLen, sal_GlyphId* pGlyphIdxAry, ::Point & rPos, int&, - DeviceCoordinate* pGlyphAdvAry = NULL, int* pCharPosAry = NULL, - const PhysicalFontFace** pFallbackFonts = NULL ) const; - - // used by glyph+font+script fallback - virtual void MoveGlyph( int nStart, long nNewXPos ); - virtual void DropGlyph( int nStart ); - virtual void Simplify( bool bIsBase ); - ~GraphiteWinLayout() - { - delete mpFeatures; - gr_font_destroy(maImpl.GetFont()); - } -}; - float gr_fontAdvance(const void* appFontHandle, gr_uint16 glyphId) { HDC hDC = reinterpret_cast<HDC>(const_cast<void*>(appFontHandle)); @@ -2701,6 +2521,12 @@ GraphiteWinLayout::GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplW maImpl.SetFeatures(mpFeatures); } +GraphiteWinLayout::~GraphiteWinLayout() +{ + delete mpFeatures; + gr_font_destroy(maImpl.GetFont()); +} + bool GraphiteWinLayout::LayoutText( ImplLayoutArgs & args) { if (args.mnMinCharPos >= args.mnEndCharPos) diff --git a/vcl/win/source/gdi/winlayout.hxx b/vcl/win/source/gdi/winlayout.hxx new file mode 100644 index 0000000..b96e9ea --- /dev/null +++ b/vcl/win/source/gdi/winlayout.hxx @@ -0,0 +1,221 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_VCL_WIN_SOURCE_GDI_WINLAYOUT_HXX +#define INCLUDED_VCL_WIN_SOURCE_GDI_WINLAYOUT_HXX + +#include <rtl/ustring.hxx> + +#include <sallayout.hxx> +#include <svsys.h> +#include <win/salgdi.h> + +#include <usp10.h> + +// Graphite headers +#include <config_graphite.h> +#if ENABLE_GRAPHITE +#include <graphite_layout.hxx> +#endif + +class ImplWinFontEntry; +struct VisualItem; + +class WinLayout : public SalLayout +{ +public: + WinLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); + virtual void InitFont() const; + void SetFontScale( float f ) { mfFontScale = f; } + HFONT DisableFontScaling( void) const; + + SCRIPT_CACHE& GetScriptCache() const; + +protected: + HDC mhDC; // WIN32 device handle + HFONT mhFont; // WIN32 font handle + int mnBaseAdv; // x-offset relative to Layout origin + float mfFontScale; // allows metrics emulation of huge font sizes + + const ImplWinFontData& mrWinFontData; + ImplWinFontEntry& mrWinFontEntry; +}; + +class SimpleWinLayout : public WinLayout +{ +public: + SimpleWinLayout( HDC, BYTE nCharSet, const ImplWinFontData&, ImplWinFontEntry& ); + virtual ~SimpleWinLayout(); + + virtual bool LayoutText( ImplLayoutArgs& ); + virtual void AdjustLayout( ImplLayoutArgs& ); + virtual void DrawText( SalGraphics& ) const; + + virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, + DeviceCoordinate* pGlyphAdvances, int* pCharIndexes, + const PhysicalFontFace** pFallbackFonts = NULL ) const; + + virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; + + // for glyph+font+script fallback + virtual void MoveGlyph( int nStart, long nNewXPos ); + virtual void DropGlyph( int nStart ); + virtual void Simplify( bool bIsBase ); + +protected: + void Justify( DeviceCoordinate nNewWidth ); + void ApplyDXArray( const ImplLayoutArgs& ); + +private: + int mnGlyphCount; + int mnCharCount; + WCHAR* mpOutGlyphs; + int* mpGlyphAdvances; // if possible this is shared with mpGlyphAdvances[] + int* mpGlyphOrigAdvs; + int* mpCharWidths; // map rel char pos to char width + int* mpChars2Glyphs; // map rel char pos to abs glyph pos + int* mpGlyphs2Chars; // map abs glyph pos to abs char pos + bool* mpGlyphRTLFlags; // BiDi status for glyphs: true=>RTL + mutable long mnWidth; + bool mbDisableGlyphs; + + int mnNotdefWidth; + BYTE mnCharSet; +}; + +class UniscribeLayout : public WinLayout +{ +public: + UniscribeLayout( HDC, const ImplWinFontData&, ImplWinFontEntry& ); + + virtual bool LayoutText( ImplLayoutArgs& ); + virtual void AdjustLayout( ImplLayoutArgs& ); + virtual void DrawText( SalGraphics& ) const; + virtual int GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, int&, + DeviceCoordinate* pGlyphAdvances, int* pCharPosAry, + const PhysicalFontFace** pFallbackFonts = NULL ) const; + + virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; + virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; + virtual bool IsKashidaPosValid ( int nCharPos ) const; + + // for glyph+font+script fallback + virtual void MoveGlyph( int nStart, long nNewXPos ); + virtual void DropGlyph( int nStart ); + virtual void Simplify( bool bIsBase ); + virtual void DisableGlyphInjection( bool bDisable ) { mbDisableGlyphInjection = bDisable; } + +protected: + virtual ~UniscribeLayout(); + + void Justify( DeviceCoordinate nNewWidth ); + void ApplyDXArray( const ImplLayoutArgs& ); + + bool GetItemSubrange( const VisualItem&, + int& rMinIndex, int& rEndIndex ) const; + +private: + // item specific info + SCRIPT_ITEM* mpScriptItems; // in logical order + VisualItem* mpVisualItems; // in visual order + int mnItemCount; // number of visual items + + // string specific info + // everything is in logical order + int mnCharCapacity; + WORD* mpLogClusters; // map from absolute_char_pos to relative_glyph_pos + int* mpCharWidths; // map from absolute_char_pos to char_width + int mnSubStringMin; // char_pos of first char in context + + // glyph specific info + // everything is in visual order + int mnGlyphCount; + int mnGlyphCapacity; + int* mpGlyphAdvances; // glyph advance width before justification + int* mpJustifications; // glyph advance width after justification + WORD* mpOutGlyphs; // glyphids in visual order + GOFFSET* mpGlyphOffsets; // glyph offsets to the "naive" layout + SCRIPT_VISATTR* mpVisualAttrs; // glyph visual attributes + mutable int* mpGlyphs2Chars; // map from absolute_glyph_pos to absolute_char_pos + + // kashida stuff + void InitKashidaHandling(); + void KashidaItemFix( int nMinGlyphPos, int nEndGlyphPos ); + bool KashidaWordFix( int nMinGlyphPos, int nEndGlyphPos, int* pnCurrentPos ); + + int mnMinKashidaWidth; + int mnMinKashidaGlyph; + bool mbDisableGlyphInjection; +}; + +#if ENABLE_GRAPHITE + +class GraphiteLayoutWinImpl : public GraphiteLayout +{ +public: + GraphiteLayoutWinImpl(const gr_face * pFace, ImplWinFontEntry & rFont) + throw() + : GraphiteLayout(pFace), mrFont(rFont) {}; + virtual ~GraphiteLayoutWinImpl() throw() {}; + virtual sal_GlyphId getKashidaGlyph(int & rWidth); +private: + ImplWinFontEntry & mrFont; +}; + +/// This class uses the SIL Graphite engine to provide complex text layout services to the VCL +class GraphiteWinLayout : public WinLayout +{ +private: + gr_font * mpFont; + grutils::GrFeatureParser * mpFeatures; + mutable GraphiteLayoutWinImpl maImpl; +public: + GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE) throw(); + virtual ~GraphiteWinLayout(); + + // used by upper layers + virtual bool LayoutText( ImplLayoutArgs& ); // first step of layout + virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting after fallback etc. + virtual void DrawText( SalGraphics& ) const; + + // methods using string indexing + virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra=0, int nFactor=1) const SAL_OVERRIDE; + virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const; + + virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; + + // methods using glyph indexing + virtual int GetNextGlyphs(int nLen, sal_GlyphId* pGlyphIdxAry, ::Point & rPos, int&, + DeviceCoordinate* pGlyphAdvAry = NULL, int* pCharPosAry = NULL, + const PhysicalFontFace** pFallbackFonts = NULL ) const; + + // used by glyph+font+script fallback + virtual void MoveGlyph( int nStart, long nNewXPos ); + virtual void DropGlyph( int nStart ); + virtual void Simplify( bool bIsBase ); +}; + +#endif // ENABLE_GRAPHITE + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 3a2378efba11a9305f1e7263b2c2b40277ffb121 Author: Jan Holesovsky <ke...@collabora.com> Date: Thu Nov 13 17:59:39 2014 +0100 Revert "vcl: Abstract the Windows text rendering into a TextRenderImpl descendant." Turns out it might be easier to actually subclass only the various SalLayout's - let's try it first, and re-introduce this code again if not. This reverts commit 309257ddadfdc3e46506036ed81f6e0695211ebe. diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index f15e5b6..81f774a 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -660,7 +660,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/win/source/gdi/salprn \ vcl/win/source/gdi/salvd \ vcl/win/source/gdi/winlayout \ - vcl/win/source/gdi/wintextrender \ vcl/win/source/gdi/wntgdi \ vcl/win/source/window/salframe \ vcl/win/source/window/keynames \ diff --git a/vcl/inc/cairotextrender.hxx b/vcl/inc/cairotextrender.hxx index ea995bb..e5db2ab 100644 --- a/vcl/inc/cairotextrender.hxx +++ b/vcl/inc/cairotextrender.hxx @@ -79,7 +79,7 @@ protected: virtual cairo_surface_t* getCairoSurface() = 0; virtual void drawSurface(cairo_t* cr) = 0; - bool setFont(const FontSelectPattern *pEntry, int nFallbackLevel); +bool setFont( const FontSelectPattern *pEntry, int nFallbackLevel ); virtual void clipRegion(cairo_t* cr) = 0; diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx index a004143..b18b630 100644 --- a/vcl/inc/textrender.hxx +++ b/vcl/inc/textrender.hxx @@ -17,8 +17,8 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifndef INCLUDED_VCL_INC_TEXTRENDER_HXX -#define INCLUDED_VCL_INC_TEXTRENDER_HXX +#ifndef INCLUDED_VCL_INC_UNX_CAIROFONTIMPL_HXX +#define INCLUDED_VCL_INC_UNX_CAIROFONTIMPL_HXX #include <tools/rational.hxx> #include <vcl/salgtype.hxx> @@ -29,6 +29,9 @@ #include "salglyphid.hxx" #include "fontsubset.hxx" +class PspSalPrinter; +class PspSalInfoPrinter; +class ServerFont; class ImplLayoutArgs; class ServerFontLayout; class PhysicalFontCollection; diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h index 18709e1..69ea4cf 100644 --- a/vcl/inc/win/salgdi.h +++ b/vcl/inc/win/salgdi.h @@ -25,9 +25,7 @@ #include "outfont.hxx" #include "PhysicalFontFace.hxx" #include "impfont.hxx" -#include <textrender.hxx> #include <vcl/fontcapabilities.hxx> -#include <win/svsys.h> #include <boost/scoped_ptr.hpp> #include <boost/unordered_set.hpp> @@ -150,7 +148,6 @@ class WinSalGraphics : public SalGraphics friend class ScopedFont; private: boost::scoped_ptr<SalGraphicsImpl> mpImpl; - boost::scoped_ptr<TextRenderImpl> mpTextRenderImpl; HDC mhLocalDC; // HDC bool mbPrinter : 1; // is Printer @@ -159,13 +156,26 @@ private: bool mbScreen : 1; // is Screen compatible HWND mhWnd; // Window-Handle, when Window-Graphics + HFONT mhFonts[ MAX_FALLBACK ]; // Font + Fallbacks + const ImplWinFontData* mpWinFontData[ MAX_FALLBACK ]; // pointer to the most recent font face + ImplWinFontEntry* 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 + HFONT mhDefFont; // DefaultFont HPALETTE mhDefPal; // DefaultPalette COLORREF mnTextColor; // TextColor RGNDATA* mpClipRgnData; // ClipRegion-Data RGNDATA* mpStdClipRgnData; // Cache Standard-ClipRegion-Data + LOGFONTA* mpLogFont; // LOG-Font which is currently selected (only W9x) + ImplFontAttrCache* mpFontAttrCache; // Cache font attributes from files in so/share/fonts + BYTE* mpFontCharSets; // All Charsets for the current font + BYTE mnFontCharSetCount; // Number of Charsets of the current font; 0 - if not queried + 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: @@ -275,6 +285,12 @@ protected: const SalBitmap* pAlphaBitmap); virtual bool drawAlphaRect( long nX, long nY, long nWidth, long nHeight, sal_uInt8 nTransparency ); +private: + // local helpers + + // get kernign pairs of the current font + sal_uLong GetKernPairs(); + public: // public SalGraphics methods, the interface to the independent vcl part @@ -366,6 +382,7 @@ public: bool bVertical, Int32Vector& rWidths, Ucs2UIntMap& rUnicodeEnc ); + virtual int GetMinKashidaWidth(); virtual bool GetGlyphBoundRect( sal_GlyphId, Rectangle& ); virtual bool GetGlyphOutline( sal_GlyphId, ::basegfx::B2DPolyPolygon& ); diff --git a/vcl/inc/wintextrender.hxx b/vcl/inc/wintextrender.hxx deleted file mode 100644 index 90b0561..0000000 --- a/vcl/inc/wintextrender.hxx +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- 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 . - */ - -#ifndef INCLUDED_VCL_INC_WINTEXTRENDER_HXX -#define INCLUDED_VCL_INC_WINTEXTRENDER_HXX - -#include <tools/rational.hxx> -#include <vcl/salgtype.hxx> -#include <vcl/sysdata.hxx> -#include <vcl/vclenum.hxx> -#include <vcl/metric.hxx> - -#include "salgdi.hxx" -#include "salglyphid.hxx" -#include "fontsubset.hxx" -#include <textrender.hxx> -#include <win/salgdi.h> - -class ImplLayoutArgs; -class ServerFontLayout; -class PhysicalFontCollection; -class PhysicalFontFace; - -/// Implementation of the GDI text rendering. -class WinTextRender : public TextRenderImpl -{ - /// Rendering for a printer? - bool mbPrinter; - - /// Parent WinSalGraphics. - WinSalGraphics& mrGraphics; - - HFONT mhFonts[ MAX_FALLBACK ]; ///< Font + Fallbacks - const ImplWinFontData* mpWinFontData[ MAX_FALLBACK ]; ///< pointer to the most recent font face - ImplWinFontEntry* mpWinFontEntry[ MAX_FALLBACK ]; ///< pointer to the most recent font instance - float mfFontScale[ MAX_FALLBACK ]; ///< allows metrics emulation of huge font sizes - float mfCurrentFontScale; - HFONT mhDefFont; ///< DefaultFont - - LOGFONTA* mpLogFont; ///< LOG-Font which is currently selected (only W9x) - ImplFontAttrCache* mpFontAttrCache; ///< Cache font attributes from files in so/share/fonts - BYTE* mpFontCharSets; ///< All Charsets for the current font - BYTE mnFontCharSetCount; ///< Number of Charsets of the current font; 0 - if not queried - 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 - -public: - WinTextRender(bool bPrinter, WinSalGraphics& rGraphics); - virtual ~WinTextRender(); - - 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 FontCharMapPtr GetFontCharMap() const SAL_OVERRIDE; - - virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const SAL_OVERRIDE; - - virtual void GetDevFontList(PhysicalFontCollection*) SAL_OVERRIDE; - - virtual void ClearDevFontCache() SAL_OVERRIDE; - - virtual bool AddTempDevFont(PhysicalFontCollection*, const OUString& rFileURL, const OUString& rFontName) SAL_OVERRIDE; - - virtual bool CreateFontSubset(const OUString& rToFile, - const PhysicalFontFace*, - sal_GlyphId* pGlyphIDs, - sal_uInt8* pEncoding, - sal_Int32* pWidths, - int nGlyphs, - FontSubsetInfo& rInfo) SAL_OVERRIDE; - - virtual const Ucs2SIntMap* GetFontEncodingVector(const PhysicalFontFace*, const Ucs2OStrMap** ppNonEncoded) SAL_OVERRIDE; - - virtual const void* GetEmbedFontData(const PhysicalFontFace*, - const sal_Ucs* pUnicodes, - sal_Int32* pWidths, - FontSubsetInfo& rInfo, - long* pDataLen) SAL_OVERRIDE; - - virtual void FreeEmbedFontData(const void* pData, long nDataLen) SAL_OVERRIDE; - - virtual void GetGlyphWidths(const PhysicalFontFace*, - bool bVertical, - Int32Vector& rWidths, - Ucs2UIntMap& rUnicodeEnc) SAL_OVERRIDE; - - virtual bool GetGlyphBoundRect(sal_GlyphId nIndex, Rectangle&) SAL_OVERRIDE; - - virtual bool GetGlyphOutline(sal_GlyphId nIndex, ::basegfx::B2DPolyPolygon&) SAL_OVERRIDE; - - virtual SalLayout* GetTextLayout(ImplLayoutArgs&, int nFallbackLevel) SAL_OVERRIDE; - - virtual void DrawServerFontLayout(const ServerFontLayout&) SAL_OVERRIDE; - - virtual SystemFontData GetSysFontData(int nFallbackLevel) const SAL_OVERRIDE; - -private: - HDC getHDC() const; - - /// Get kerning pairs of the current font. - sal_uLong GetKernPairs(); - - int GetMinKashidaWidth(); - - class ScopedFont - { - public: - explicit ScopedFont(WinTextRender & rData); - - ~ScopedFont(); - - private: - WinTextRender & m_rData; - HFONT m_hOrigFont; - }; -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/win/source/gdi/salgdi.cxx b/vcl/win/source/gdi/salgdi.cxx index 95180c3..8f8f7ab 100644 --- a/vcl/win/source/gdi/salgdi.cxx +++ b/vcl/win/source/gdi/salgdi.cxx @@ -35,7 +35,6 @@ #include "salgdiimpl.hxx" #include "gdiimpl.hxx" #include "opengl/win/gdiimpl.hxx" -#include <wintextrender.hxx> #include <vcl/opengl/OpenGLHelper.hxx> @@ -504,6 +503,8 @@ void WinSalGraphics::DeInitGraphics() SelectPen( getHDC(), mhDefPen ); if ( mhDefBrush ) SelectBrush( getHDC(), mhDefBrush ); + if ( mhDefFont ) + SelectFont( getHDC(), mhDefFont ); } HDC ImplGetCachedDC( sal_uLong nID, HBITMAP hBmp ) @@ -573,22 +574,33 @@ WinSalGraphics::WinSalGraphics(WinSalGraphics::Type eType, bool bScreen, HWND hW mbWindow(eType == WinSalGraphics::WINDOW), mhWnd(hWnd), mbScreen(bScreen), + mfCurrentFontScale(1.0), mhRegion(0), mhDefPen(0), mhDefBrush(0), + mhDefFont(0), mhDefPal(0), mpStdClipRgnData(NULL), + mpLogFont(NULL), + mpFontCharSets(NULL), + mpFontAttrCache(NULL), + mnFontCharSetCount(0), + mpFontKernPairs(NULL), + mnFontKernPairCount(0), + mbFontKernInit(false), mnPenWidth(GSL_PEN_WIDTH) { if (OpenGLHelper::isVCLOpenGLEnabled() && !mbPrinter) - { mpImpl.reset(new WinOpenGLSalGraphicsImpl(*this)); - mpTextRenderImpl.reset((new WinTextRender(mbPrinter, *this))); - } else - { mpImpl.reset(new WinSalGraphicsImpl(*this)); - mpTextRenderImpl.reset((new WinTextRender(mbPrinter, *this))); + + for( int i = 0; i < MAX_FALLBACK; ++i ) + { + mhFonts[ i ] = 0; + mpWinFontData[ i ] = NULL; + mpWinFontEntry[ i ] = NULL; + mfFontScale[ i ] = 1.0; } } @@ -605,6 +617,12 @@ WinSalGraphics::~WinSalGraphics() // delete cache data delete [] mpStdClipRgnData; + + delete mpLogFont; + + delete mpFontCharSets; + + delete mpFontKernPairs; } bool WinSalGraphics::isPrinter() const diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx index bd69703..f3933d9 100644 --- a/vcl/win/source/gdi/salgdi3.cxx +++ b/vcl/win/source/gdi/salgdi3.cxx @@ -49,7 +49,6 @@ #include "sft.hxx" #include "win/saldata.hxx" #include "win/salgdi.h" -#include <wintextrender.hxx> using namespace vcl; @@ -1358,11 +1357,6 @@ void ImplWinFontData::GetFontCapabilities( HDC hDC ) const void WinSalGraphics::SetTextColor( SalColor nSalColor ) { - mpTextRenderImpl->SetTextColor(nSalColor); -} - -void WinTextRender::SetTextColor(SalColor nSalColor) -{ COLORREF aCol = PALETTERGB( SALCOLOR_RED( nSalColor ), SALCOLOR_GREEN( nSalColor ), SALCOLOR_BLUE( nSalColor ) ); @@ -1531,11 +1525,6 @@ HFONT WinSalGraphics::ImplDoSetFont( FontSelectPattern* i_pFont, float& o_rFontS sal_uInt16 WinSalGraphics::SetFont( FontSelectPattern* pFont, int nFallbackLevel ) { - return mpTextRenderImpl->SetFont(pFont, nFallbackLevel); -} - -sal_uInt16 WinTextRender::SetFont(FontSelectPattern* pFont, int nFallbackLevel) -{ // return early if there is no new font if( !pFont ) { @@ -1559,7 +1548,7 @@ sal_uInt16 WinTextRender::SetFont(FontSelectPattern* pFont, int nFallbackLevel) mpWinFontData[ nFallbackLevel ] = static_cast<const ImplWinFontData*>( pFont->mpFontData ); HFONT hOldFont = 0; - HFONT hNewFont = mrGraphics.ImplDoSetFont( pFont, mfFontScale[ nFallbackLevel ], hOldFont ); + HFONT hNewFont = ImplDoSetFont( pFont, mfFontScale[ nFallbackLevel ], hOldFont ); mfCurrentFontScale = mfFontScale[nFallbackLevel]; if( !mhDefFont ) @@ -1610,11 +1599,6 @@ sal_uInt16 WinTextRender::SetFont(FontSelectPattern* pFont, int nFallbackLevel) void WinSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLevel ) { - mpTextRenderImpl->GetFontMetric(pMetric, nFallbackLevel); -} - -void WinTextRender::GetFontMetric(ImplFontMetricData* pMetric, int nFallbackLevel) -{ // temporarily change the HDC to the font in the fallback level HFONT hOldFont = SelectFont( getHDC(), mhFonts[nFallbackLevel] ); @@ -1689,7 +1673,7 @@ void WinTextRender::GetFontMetric(ImplFontMetricData* pMetric, int nFallbackLeve pMetric->mnMinKashida = GetMinKashidaWidth(); } -sal_uLong WinTextRender::GetKernPairs() +sal_uLong WinSalGraphics::GetKernPairs() { if ( mbFontKernInit ) { @@ -1720,11 +1704,6 @@ sal_uLong WinTextRender::GetKernPairs() const FontCharMapPtr WinSalGraphics::GetFontCharMap() const { - return mpTextRenderImpl->GetFontCharMap(); -} - -const FontCharMapPtr WinTextRender::GetFontCharMap() const -{ if( !mpWinFontData[0] ) { FontCharMapPtr pDefFontCharMap( new FontCharMap() ); @@ -1735,11 +1714,6 @@ const FontCharMapPtr WinTextRender::GetFontCharMap() const bool WinSalGraphics::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const { - return mpTextRenderImpl->GetFontCapabilities(rFontCapabilities); -} - -bool WinTextRender::GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const -{ if( !mpWinFontData[0] ) return false; return mpWinFontData[0]->GetFontCapabilities(rFontCapabilities); @@ -2050,11 +2024,6 @@ static bool ImplGetFontAttrFromFile( const OUString& rFontFileURL, bool WinSalGraphics::AddTempDevFont( PhysicalFontCollection* pFontCollection, const OUString& rFontFileURL, const OUString& rFontName ) { - return mpTextRenderImpl->AddTempDevFont(pFontCollection, rFontFileURL, rFontName); -} - -bool WinTextRender::AddTempDevFont(PhysicalFontCollection* pFontCollection, const OUString& rFontFileURL, const OUString& rFontName) -{ SAL_INFO( "vcl.gdi", "WinSalGraphics::AddTempDevFont(): " << OUStringToOString( rFontFileURL, RTL_TEXTENCODING_UTF8 ).getStr() ); ImplDevFontAttributes aDFA; @@ -2110,11 +2079,6 @@ bool WinTextRender::AddTempDevFont(PhysicalFontCollection* pFontCollection, cons void WinSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection ) { - mpTextRenderImpl->GetDevFontList(pFontCollection); -} - -void WinTextRender::GetDevFontList(PhysicalFontCollection* pFontCollection) -{ // make sure all fonts are registered at least temporarily static bool bOnce = true; if( bOnce ) @@ -2210,21 +2174,11 @@ void WinTextRender::GetDevFontList(PhysicalFontCollection* pFontCollection) void WinSalGraphics::ClearDevFontCache() { - mpTextRenderImpl->ClearDevFontCache(); -} - -void WinTextRender::ClearDevFontCache() -{ //anything to do here ? } bool WinSalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect ) { - return mpTextRenderImpl->GetGlyphBoundRect(aGlyphId, rRect); -} - -bool WinTextRender::GetGlyphBoundRect(sal_GlyphId aGlyphId, Rectangle& rRect) -{ HDC hDC = getHDC(); // use unity matrix @@ -2256,11 +2210,6 @@ bool WinTextRender::GetGlyphBoundRect(sal_GlyphId aGlyphId, Rectangle& rRect) bool WinSalGraphics::GetGlyphOutline( sal_GlyphId aGlyphId, ::basegfx::B2DPolyPolygon& rB2DPolyPoly ) { - return mpTextRenderImpl->GetGlyphOutline(aGlyphId, rB2DPolyPoly); -} - -bool WinTextRender::GetGlyphOutline(sal_GlyphId aGlyphId, ::basegfx::B2DPolyPolygon& rB2DPolyPoly) -{ rB2DPolyPoly.clear(); HDC hDC = getHDC(); @@ -2440,13 +2389,25 @@ bool WinTextRender::GetGlyphOutline(sal_GlyphId aGlyphId, ::basegfx::B2DPolyPoly return true; } -WinTextRender::ScopedFont::ScopedFont(WinTextRender & rData): m_rData(rData) +class ScopedFont +{ +public: + explicit ScopedFont(WinSalGraphics & rData); + + ~ScopedFont(); + +private: + WinSalGraphics & m_rData; + HFONT m_hOrigFont; +}; + +ScopedFont::ScopedFont(WinSalGraphics & rData): m_rData(rData) { m_hOrigFont = m_rData.mhFonts[0]; m_rData.mhFonts[0] = 0; // avoid deletion of current font } -WinTextRender::ScopedFont::~ScopedFont() +ScopedFont::~ScopedFont() { if( m_hOrigFont ) { @@ -2490,13 +2451,6 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile, const PhysicalFontFace* pFont, sal_GlyphId* pGlyphIds, sal_uInt8* pEncoding, sal_Int32* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rInfo ) { - return mpTextRenderImpl->CreateFontSubset(rToFile, pFont, pGlyphIds, pEncoding, pGlyphWidths, nGlyphCount, rInfo); -} - -bool WinTextRender::CreateFontSubset(const OUString& rToFile, - const PhysicalFontFace* pFont, sal_GlyphId* pGlyphIds, sal_uInt8* pEncoding, - sal_Int32* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rInfo) -{ // TODO: use more of the central font-subsetting code, move stuff there if needed // create matching FontSelectPattern @@ -2508,7 +2462,7 @@ bool WinTextRender::CreateFontSubset(const OUString& rToFile, ScopedFont aOldFont(*this); float fScale = 1.0; HFONT hOldFont = 0; - mrGraphics.ImplDoSetFont( &aIFSD, fScale, hOldFont ); + ImplDoSetFont( &aIFSD, fScale, hOldFont ); ImplWinFontData* pWinFontData = (ImplWinFontData*)aIFSD.mpFontData; @@ -2651,13 +2605,6 @@ const void* WinSalGraphics::GetEmbedFontData( const PhysicalFontFace* pFont, const sal_Unicode* pUnicodes, sal_Int32* pCharWidths, FontSubsetInfo& rInfo, long* pDataLen ) { - return mpTextRenderImpl->GetEmbedFontData(pFont, pUnicodes, pCharWidths, rInfo, pDataLen); -} - -const void* WinTextRender::GetEmbedFontData(const PhysicalFontFace* pFont, - const sal_Unicode* pUnicodes, sal_Int32* pCharWidths, - FontSubsetInfo& rInfo, long* pDataLen) -{ // create matching FontSelectPattern // we need just enough to get to the font file data FontSelectPattern aIFSD( *pFont, Size(0,1000), 1000.0, 0, false ); @@ -2709,23 +2656,13 @@ const void* WinTextRender::GetEmbedFontData(const PhysicalFontFace* pFont, return (void*)pData; } -void WinSalGraphics::FreeEmbedFontData(const void* pData, long nLen) -{ - mpTextRenderImpl->FreeEmbedFontData(pData, nLen); -} - -void WinTextRender::FreeEmbedFontData(const void* pData, long /*nLen*/) +void WinSalGraphics::FreeEmbedFontData( const void* pData, long /*nLen*/ ) { delete[] reinterpret_cast<char*>(const_cast<void*>(pData)); } const Ucs2SIntMap* WinSalGraphics::GetFontEncodingVector( const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded ) { - return mpTextRenderImpl->GetFontEncodingVector(pFont, pNonEncoded); -} - -const Ucs2SIntMap* WinTextRender::GetFontEncodingVector(const PhysicalFontFace* pFont, const Ucs2OStrMap** pNonEncoded) -{ // TODO: even for builtin fonts we get here... why? if( !pFont->IsEmbeddable() ) return NULL; @@ -2754,12 +2691,6 @@ void WinSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont, Int32Vector& rWidths, Ucs2UIntMap& rUnicodeEnc ) { - mpTextRenderImpl->GetGlyphWidths(pFont, bVertical, rWidths, rUnicodeEnc); -} - -void WinTextRender::GetGlyphWidths(const PhysicalFontFace* pFont, bool bVertical, - Int32Vector& rWidths, Ucs2UIntMap& rUnicodeEnc) -{ // create matching FontSelectPattern // we need just enough to get to the font file data FontSelectPattern aIFSD( *pFont, Size(0,1000), 1000.0, 0, false ); @@ -2769,7 +2700,7 @@ void WinTextRender::GetGlyphWidths(const PhysicalFontFace* pFont, bool bVertical float fScale = 0.0; HFONT hOldFont = 0; - mrGraphics.ImplDoSetFont( &aIFSD, fScale, hOldFont ); + ImplDoSetFont( &aIFSD, fScale, hOldFont ); if( pFont->IsSubsettable() ) { @@ -2846,32 +2777,20 @@ void WinTextRender::GetGlyphWidths(const PhysicalFontFace* pFont, bool bVertical } } -void WinSalGraphics::DrawServerFontLayout(const ServerFontLayout& rLayout) -{ - mpTextRenderImpl->DrawServerFontLayout(rLayout); -} - -void WinTextRender::DrawServerFontLayout(const ServerFontLayout&) +void WinSalGraphics::DrawServerFontLayout( const ServerFontLayout& ) {} -SystemFontData WinSalGraphics::GetSysFontData(int nFallbackLevel) const -{ - return mpTextRenderImpl->GetSysFontData(nFallbackLevel); -} - -SystemFontData WinTextRender::GetSysFontData(int nFallbackLevel) const +SystemFontData WinSalGraphics::GetSysFontData( int nFallbacklevel ) const { SystemFontData aSysFontData; - if (nFallbackLevel >= MAX_FALLBACK) - nFallbackLevel = MAX_FALLBACK - 1; - if (nFallbackLevel < 0) - nFallbackLevel = 0; + if (nFallbacklevel >= MAX_FALLBACK) nFallbacklevel = MAX_FALLBACK - 1; + if (nFallbacklevel < 0 ) nFallbacklevel = 0; - aSysFontData.hFont = mhFonts[nFallbackLevel]; + aSysFontData.hFont = mhFonts[nFallbacklevel]; OSL_TRACE("\r\n:WinSalGraphics::GetSysFontData(): FontID: %p, Fallback level: %d", - aSysFontData.hFont, nFallbackLevel); + aSysFontData.hFont, nFallbacklevel); return aSysFontData; } diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index 1c8eeb3..958348f 100644 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -27,7 +27,6 @@ #include "win/salgdi.h" #include "win/saldata.hxx" -#include <wintextrender.hxx> #include "sft.hxx" #include "sallayout.hxx" @@ -2820,11 +2819,6 @@ void GraphiteWinLayout::Simplify( bool is_base ) SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel ) { - return mpTextRenderImpl->GetTextLayout(rArgs, nFallbackLevel); -} - -SalLayout* WinTextRender::GetTextLayout(ImplLayoutArgs& rArgs, int nFallbackLevel) -{ DBG_ASSERT( mpWinFontEntry[nFallbackLevel], "WinSalGraphics mpWinFontEntry==NULL"); WinLayout* pWinLayout = NULL; @@ -2875,7 +2869,7 @@ SalLayout* WinTextRender::GetTextLayout(ImplLayoutArgs& rArgs, int nFallbackLeve return pWinLayout; } -int WinTextRender::GetMinKashidaWidth() +int WinSalGraphics::GetMinKashidaWidth() { if( !mpWinFontEntry[0] ) return 0; diff --git a/vcl/win/source/gdi/wintextrender.cxx b/vcl/win/source/gdi/wintextrender.cxx deleted file mode 100644 index df2382f..0000000 --- a/vcl/win/source/gdi/wintextrender.cxx +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- 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 <wintextrender.hxx> - -#include <win/salgdi.h> -#include <win/wincomp.hxx> - -WinTextRender::WinTextRender(bool bPrinter, WinSalGraphics& rGraphics) - : mbPrinter(bPrinter) - , mrGraphics(rGraphics) - , mfCurrentFontScale(1.0) - , mhDefFont(0) - , mpLogFont(NULL) - , mpFontAttrCache(NULL) - , mpFontCharSets(NULL) - , mnFontCharSetCount(0) - , mbFontKernInit(false) - , mpFontKernPairs(NULL) - , mnFontKernPairCount(0) -{ - for (int i = 0; i < MAX_FALLBACK; ++i) - { - mhFonts[i] = 0; - mpWinFontData[i] = NULL; - mpWinFontEntry[i] = NULL; - mfFontScale[i] = 1.0; - } -} - -WinTextRender::~WinTextRender() -{ - if (mhDefFont) - SelectFont(getHDC(), mhDefFont); - - delete[] mpLogFont; - - delete[] mpFontCharSets; - - delete[] mpFontKernPairs; -} - -HDC WinTextRender::getHDC() const -{ - return mrGraphics.getHDC(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits