vcl/headless/svptext.cxx | 5 vcl/inc/CommonSalLayout.hxx | 5 vcl/inc/headless/svpgdi.hxx | 2 vcl/inc/salgdi.hxx | 2 vcl/inc/textrender.hxx | 2 vcl/inc/unx/cairotextrender.hxx | 2 vcl/inc/unx/genpspgraphics.h | 1 vcl/inc/unx/salgdi.h | 2 vcl/source/gdi/CommonSalLayout.cxx | 25 ++-- vcl/unx/generic/gdi/cairotextrender.cxx | 176 +++++++++++++++++++++++++++++++ vcl/unx/generic/gdi/font.cxx | 4 vcl/unx/generic/print/genpspgraphics.cxx | 5 12 files changed, 222 insertions(+), 9 deletions(-)
New commits: commit 38c7eb826d47e37f751ff58c0d880e91a00e3141 Author: Akash Jain <akash...@gmail.com> Date: Mon Jun 20 23:49:53 2016 +0530 Integrate CommonSalLayout in unx/ code path Change-Id: I7591d4b159d2d92027dba162b5752468cb69e7a7 diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx index e8fd525..c4bf42c 100644 --- a/vcl/headless/svptext.cxx +++ b/vcl/headless/svptext.cxx @@ -121,6 +121,11 @@ void SvpSalGraphics::DrawServerFontLayout( const ServerFontLayout& rSalLayout ) m_aTextRenderImpl.DrawServerFontLayout(rSalLayout ); } +void SvpSalGraphics::DrawCommonSalLayout( const CommonSalLayout& rSalLayout ) +{ + m_aTextRenderImpl.DrawCommonSalLayout( rSalLayout ); +} + void SvpSalGraphics::SetTextColor( SalColor nSalColor ) { m_aTextRenderImpl.SetTextColor(nSalColor); diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx index 0d941f9..6d6d19e 100755 --- a/vcl/inc/CommonSalLayout.hxx +++ b/vcl/inc/CommonSalLayout.hxx @@ -36,6 +36,9 @@ class CommonSalLayout : public GenericSalLayout css::uno::Reference<css::i18n::XBreakIterator> mxBreak; #ifdef _WIN32 HDC mhDC; +#elif defined(MACOSX) || defined(IOS) +#else + ServerFont& mrServerFont; #endif public: @@ -45,7 +48,9 @@ public: explicit CommonSalLayout(const CoreTextStyle*); #else explicit CommonSalLayout(ServerFont&); + ServerFont& GetServerFont() const {return mrServerFont;} #endif + virtual ~CommonSalLayout(); void SetNeedFallback(ImplLayoutArgs&, sal_Int32, bool); void AdjustLayout(ImplLayoutArgs&) override; diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index dc88a60..626aab9 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -46,6 +46,7 @@ struct BitmapBuffer; class GlyphCache; class ServerFont; +class CommonSalLayout; typedef struct _cairo cairo_t; typedef struct _cairo_surface cairo_surface_t; typedef struct _cairo_user_data_key cairo_user_data_key_t; @@ -153,6 +154,7 @@ public: virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override; virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override; virtual void DrawServerFontLayout( const ServerFontLayout& ) override; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) override; virtual bool supportsOperation( OutDevSupportType ) const override; virtual void drawPixel( long nX, long nY ) override; virtual void drawPixel( long nX, long nY, SalColor nSalColor ) override; diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx index 56fe42d..79ea307 100644 --- a/vcl/inc/salgdi.hxx +++ b/vcl/inc/salgdi.hxx @@ -44,6 +44,7 @@ class FontSubsetInfo; class OpenGLContext; class OutputDevice; class ServerFontLayout; +class CommonSalLayout; struct SystemGraphicsData; #if ENABLE_CAIRO_CANVAS @@ -218,6 +219,7 @@ public: virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) = 0; virtual void DrawServerFontLayout( const ServerFontLayout& ) = 0; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) = 0; virtual bool supportsOperation( OutDevSupportType ) const = 0; diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx index e08274e..1f49591 100644 --- a/vcl/inc/textrender.hxx +++ b/vcl/inc/textrender.hxx @@ -27,6 +27,7 @@ class ImplLayoutArgs; class ImplFontMetricData; class ServerFontLayout; +class CommonSalLayout; class PhysicalFontCollection; class PhysicalFontFace; @@ -72,6 +73,7 @@ public: virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) = 0; virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) = 0; virtual void DrawServerFontLayout( const ServerFontLayout& ) = 0; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) = 0; #if ENABLE_CAIRO_CANVAS virtual SystemFontData GetSysFontData( int nFallbackLevel ) const = 0; #endif // ENABLE_CAIRO_CANVAS diff --git a/vcl/inc/unx/cairotextrender.hxx b/vcl/inc/unx/cairotextrender.hxx index 612daae..04ab8ce 100644 --- a/vcl/inc/unx/cairotextrender.hxx +++ b/vcl/inc/unx/cairotextrender.hxx @@ -29,6 +29,7 @@ typedef struct FT_FaceRec_* FT_Face; class ServerFont; +class CommonSalLayout; class GlyphCache; typedef struct _cairo cairo_t; @@ -119,6 +120,7 @@ public: virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override; virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override; virtual void DrawServerFontLayout( const ServerFontLayout& ) override; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) override; #if ENABLE_CAIRO_CANVAS virtual SystemFontData GetSysFontData( int nFallbackLevel ) const override; #endif diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h index b7658b9..ac0551c 100644 --- a/vcl/inc/unx/genpspgraphics.h +++ b/vcl/inc/unx/genpspgraphics.h @@ -132,6 +132,7 @@ public: virtual bool GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) override; virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override; virtual void DrawServerFontLayout( const ServerFontLayout& ) override; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) override; virtual bool supportsOperation( OutDevSupportType ) const override; virtual void drawPixel( long nX, long nY ) override; virtual void drawPixel( long nX, long nY, SalColor nSalColor ) override; diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h index 40aa91b..e376f02 100644 --- a/vcl/inc/unx/salgdi.h +++ b/vcl/inc/unx/salgdi.h @@ -55,6 +55,7 @@ class X11OpenGLSalVirtualDevice; class ServerFont; class ImplLayoutArgs; class ServerFontLayout; +class CommonSalLayout; class PhysicalFontCollection; class PhysicalFontFace; class SalGraphicsImpl; @@ -155,6 +156,7 @@ public: virtual bool GetGlyphOutline( sal_GlyphId nIndex, basegfx::B2DPolyPolygon& ) override; virtual SalLayout* GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) override; virtual void DrawServerFontLayout( const ServerFontLayout& ) override; + virtual void DrawCommonSalLayout( const CommonSalLayout& ) override; virtual bool supportsOperation( OutDevSupportType ) const override; virtual void drawPixel( long nX, long nY ) override; diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index c01b2eb..414869c 100755 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -24,6 +24,7 @@ #include <com/sun/star/i18n/CharacterIteratorMode.hpp> #include <i18nlangtag/mslangid.hxx> #include <limits> +#include <salgdi.hxx> #if defined(_WIN32) struct WinFontFaceWithHDC @@ -86,18 +87,19 @@ CommonSalLayout::CommonSalLayout(HDC hDC, const WinFontFace& rWinFontFace, WinFo } #elif defined(MACOSX) || defined(IOS) -CommonSalLayout::CommonSalLayout(CoreTextStyle* rCoreTextStyle) +CommonSalLayout::CommonSalLayout(CoreTextStyle* pCoreTextStyle) : mpHBFace(nullptr), - maFontSelData(rCoreTextStyle) + maFontSelData(pCoreTextStyle) { - mpHBFace = hb_face_create_for_tables(getFontTable, rCoreTextStyle->mpFontData, nullptr); + mpHBFace = hb_face_create_for_tables(getFontTable, pCoreTextStyle->mpFontData, nullptr); //XXX modify coretextstyle to also store fsd } #else CommonSalLayout::CommonSalLayout(ServerFont& rServerFont) : mpHBFace(nullptr), - maFontSelData(rServerFont.GetFontSelData()) + maFontSelData(rServerFont.GetFontSelData()), + mrServerFont(rServerFont) { mpHBFace = hb_face_create_for_tables(getFontTable, &rServerFont, nullptr); } @@ -194,9 +196,14 @@ void CommonSalLayout::AdjustLayout(ImplLayoutArgs& rArgs) //XXX Kashida } -void CommonSalLayout::DrawText( SalGraphics& ) const +void CommonSalLayout::DrawText(SalGraphics& rSalGraphics) const { //call platform dependent DrawText functions +#if defined(_WIN32) +#elif defined(MACOSX) || defined(IOS) +#else + rSalGraphics.DrawCommonSalLayout( *this ); +#endif } bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) @@ -204,9 +211,10 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) //XXX WinLayout object DOESN'T derive from GSL GenericSalLayout& rLayout = *this; - hb_font_t* pHBFont = hb_font_create(mpHBFace); - hb_font_set_ppem(pHBFont, maFontSelData.mnWidth, maFontSelData.mnHeight); - hb_font_set_scale(pHBFont, maFontSelData.mnWidth << 6, maFontSelData.mnHeight << 6); + hb_font_t *pHBFont = hb_font_create(mpHBFace); + hb_font_set_ppem(pHBFont, maFontSelData.mnWidth? maFontSelData.mnWidth:maFontSelData.mnHeight , maFontSelData.mnHeight); + hb_font_set_scale(pHBFont, (uint64_t)(maFontSelData.mnWidth? maFontSelData.mnWidth:maFontSelData.mnHeight) << 6 + , (uint64_t)maFontSelData.mnHeight << 6); hb_ot_font_set_funcs(pHBFont); int nGlyphCapacity = 2 * (rArgs.mnEndCharPos - rArgs.mnMinCharPos); @@ -374,7 +382,6 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) int32_t nYOffset = pHbPositions[i].y_offset >> 6; int32_t nXAdvance = pHbPositions[i].x_advance >> 6; int32_t nYAdvance = pHbPositions[i].y_advance >> 6; - Point aNewPos = Point(aCurrPos.X() + nXOffset, -(aCurrPos.Y() + nYOffset)); // Definiton of glyphitem may have to change to support system graphics lib const GlyphItem aGI(nCharPos, nGlyphIndex, aNewPos, nGlyphFlags, nXAdvance, nXOffset); diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx index 513f5e5..14d45b3 100644 --- a/vcl/unx/generic/gdi/cairotextrender.cxx +++ b/vcl/unx/generic/gdi/cairotextrender.cxx @@ -42,6 +42,7 @@ #include <cairo.h> #include <cairo-ft.h> +#include "CommonSalLayout.hxx" CairoTextRender::CairoTextRender() : mnTextColor(MAKE_SALCOLOR(0x00, 0x00, 0x00)) //black @@ -152,6 +153,178 @@ namespace } } +void CairoTextRender::DrawCommonSalLayout( const CommonSalLayout& rLayout ) +{ + std::vector<cairo_glyph_t> cairo_glyphs; + std::vector<int> glyph_extrarotation; + cairo_glyphs.reserve( 256 ); + + Point aPos; + sal_GlyphId aGlyphId; + for( int nStart = 0; rLayout.GetNextGlyphs( 1, &aGlyphId, aPos, nStart ); ) + { + cairo_glyph_t aGlyph; + aGlyph.index = aGlyphId & GF_IDXMASK; + aGlyph.x = aPos.X(); + aGlyph.y = aPos.Y(); + cairo_glyphs.push_back(aGlyph); + + switch (aGlyphId & GF_ROTMASK) + { + case GF_ROTL: // left + glyph_extrarotation.push_back(1); + break; + case GF_ROTR: // right + glyph_extrarotation.push_back(-1); + break; + default: + glyph_extrarotation.push_back(0); + break; + } + } + + if (cairo_glyphs.empty()) + return; + + ServerFont& rFont = rLayout.GetServerFont(); + const FontSelectPattern& rFSD = rFont.GetFontSelData(); + int nHeight = rFSD.mnHeight; + int nWidth = rFSD.mnWidth ? rFSD.mnWidth : nHeight; + if (nWidth == 0 || nHeight == 0) + return; + + cairo_t *cr = getCairoContext(); + if (!cr) + { + SAL_WARN("vcl", "no cairo context for text"); + return; + } + + ImplSVData* pSVData = ImplGetSVData(); + if (const cairo_font_options_t* pFontOptions = pSVData->mpDefInst->GetCairoFontOptions()) + cairo_set_font_options(cr, pFontOptions); + + double nDX, nDY; + getSurfaceOffset(nDX, nDY); + cairo_translate(cr, nDX, nDY); + + clipRegion(cr); + + cairo_set_source_rgb(cr, + SALCOLOR_RED(mnTextColor)/255.0, + SALCOLOR_GREEN(mnTextColor)/255.0, + SALCOLOR_BLUE(mnTextColor)/255.0); + + FT_Face aFace = rFont.GetFtFace(); + CairoFontsCache::CacheId aId; + aId.maFace = aFace; + aId.mpOptions = rFont.GetFontOptions().get(); + aId.mbEmbolden = rFont.NeedsArtificialBold(); + + cairo_matrix_t m; + + std::vector<int>::const_iterator aEnd = glyph_extrarotation.end(); + std::vector<int>::const_iterator aStart = glyph_extrarotation.begin(); + std::vector<int>::const_iterator aI = aStart; + while (aI != aEnd) + { + int nGlyphRotation = *aI; + + std::vector<int>::const_iterator aNext = nGlyphRotation?(aI+1):std::find_if(aI+1, aEnd, hasRotation); + + size_t nStartIndex = std::distance(aStart, aI); + size_t nLen = std::distance(aI, aNext); + + aId.mbVerticalMetrics = nGlyphRotation != 0.0; + cairo_font_face_t* font_face = static_cast<cairo_font_face_t*>(CairoFontsCache::FindCachedFont(aId)); + if (!font_face) + { + const FontConfigFontOptions *pOptions = rFont.GetFontOptions().get(); + void *pPattern = pOptions ? pOptions->GetPattern(aFace, aId.mbEmbolden) : nullptr; + if (pPattern) + font_face = cairo_ft_font_face_create_for_pattern(static_cast<FcPattern*>(pPattern)); + if (!font_face) + font_face = cairo_ft_font_face_create_for_ft_face(reinterpret_cast<FT_Face>(aFace), rFont.GetLoadFlags()); + CairoFontsCache::CacheFont(font_face, aId); + } + cairo_set_font_face(cr, font_face); + + cairo_set_font_size(cr, nHeight); + + cairo_matrix_init_identity(&m); + + if (rLayout.GetOrientation()) + cairo_matrix_rotate(&m, toRadian(rLayout.GetOrientation())); + + cairo_matrix_scale(&m, nWidth, nHeight); + + if (nGlyphRotation) + { + cairo_matrix_rotate(&m, toRadian(nGlyphRotation*900)); + + cairo_matrix_t em_square; + cairo_matrix_init_identity(&em_square); + cairo_get_matrix(cr, &em_square); + + cairo_matrix_scale(&em_square, aFace->units_per_EM, + aFace->units_per_EM); + cairo_set_matrix(cr, &em_square); + + cairo_font_extents_t font_extents; + cairo_font_extents(cr, &font_extents); + + cairo_matrix_init_identity(&em_square); + cairo_set_matrix(cr, &em_square); + + //gives the same positions as pre-cairo conversion, but I don't + //like them + double xdiff = 0.0; + double ydiff = 0.0; + if (nGlyphRotation == 1) + { + ydiff = font_extents.ascent/nHeight; + xdiff = -font_extents.descent/nHeight; + } + else if (nGlyphRotation == -1) + { + cairo_text_extents_t text_extents; + cairo_glyph_extents(cr, &cairo_glyphs[nStartIndex], nLen, + &text_extents); + + xdiff = -text_extents.x_advance/nHeight; + //to restore an apparent bug in the original X11 impl, replace + //nHeight with nWidth below + xdiff += font_extents.descent/nHeight; + } + cairo_matrix_translate(&m, xdiff, ydiff); + } + + if (rFont.NeedsArtificialItalic()) + { + cairo_matrix_t shear; + cairo_matrix_init_identity(&shear); + shear.xy = -shear.xx * 0x6000L / 0x10000L; + cairo_matrix_multiply(&m, &shear, &m); + } + + cairo_set_font_matrix(cr, &m); + cairo_show_glyphs(cr, &cairo_glyphs[nStartIndex], nLen); + +#if OSL_DEBUG_LEVEL > 2 + //draw origin + cairo_save (cr); + cairo_rectangle (cr, cairo_glyphs[nStartIndex].x, cairo_glyphs[nStartIndex].y, 5, 5); + cairo_set_source_rgba (cr, 1, 0, 0, 0.80); + cairo_fill (cr); + cairo_restore (cr); +#endif + + aI = aNext; + } + + releaseCairoContext(cr); + +} void CairoTextRender::DrawServerFontLayout( const ServerFontLayout& rLayout ) { std::vector<cairo_glyph_t> cairo_glyphs; @@ -507,6 +680,9 @@ SalLayout* CairoTextRender::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackL } else #endif + if(getenv("LO_CSL")) + pLayout = new CommonSalLayout( *mpServerFont[ nFallbackLevel ] ); + else pLayout = new ServerFontLayout( *mpServerFont[ nFallbackLevel ] ); } diff --git a/vcl/unx/generic/gdi/font.cxx b/vcl/unx/generic/gdi/font.cxx index 1669465..dacfd11 100644 --- a/vcl/unx/generic/gdi/font.cxx +++ b/vcl/unx/generic/gdi/font.cxx @@ -56,6 +56,10 @@ void X11SalGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) { mxTextRenderImpl->DrawServerFontLayout(rLayout); } +void X11SalGraphics::DrawCommonSalLayout( const CommonSalLayout& rLayout ) +{ + mxTextRenderImpl->DrawCommonSalLayout(rLayout); +} const FontCharMapPtr X11SalGraphics::GetFontCharMap() const { diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx index 78eee82..ff87e3f 100644 --- a/vcl/unx/generic/print/genpspgraphics.cxx +++ b/vcl/unx/generic/print/genpspgraphics.cxx @@ -767,6 +767,11 @@ void GenPspGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) DrawPrinterLayout( rLayout, *m_pPrinterGfx, true ); } +void GenPspGraphics::DrawCommonSalLayout( const CommonSalLayout& /*rLayout*/ ) +{ + // TODO +} + const FontCharMapPtr GenPspGraphics::GetFontCharMap() const { if( !m_pServerFont[0] ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits