[Libreoffice-commits] core.git: include/vcl sw/source vcl/inc vcl/Library_vcl.mk vcl/quartz vcl/source

Khaled Hosny khaledhosny at eglug.org
Sat Nov 26 14:29:07 UTC 2016


 include/vcl/outdev.hxx              |    5 
 sw/source/core/txtnode/fntcache.cxx |   15 
 vcl/Library_vcl.mk                  |    2 
 vcl/inc/quartz/salgdi.h             |    4 
 vcl/inc/sallayout.hxx               |    2 
 vcl/quartz/CTRunData.cxx            |   94 ----
 vcl/quartz/CTRunData.hxx            |   42 -
 vcl/quartz/ctfonts.cxx              |   17 
 vcl/quartz/ctlayout.cxx             |  787 ------------------------------------
 vcl/quartz/salgdi.cxx               |   18 
 vcl/source/outdev/text.cxx          |   77 +--
 11 files changed, 40 insertions(+), 1023 deletions(-)

New commits:
commit d761d952f460e1943e94c5a7556b3b01d2259666
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Fri Nov 25 14:00:07 2016 +0200

    Kill old Core Text layout engine
    
    Change-Id: If80d65899255d8be72f374fbec232d103a08a006
    Reviewed-on: https://gerrit.libreoffice.org/31232
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Khaled Hosny <khaledhosny at eglug.org>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 2403fc9..15bdb8f 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -142,11 +142,10 @@ enum class SalLayoutFlags
     SubstituteDigits        = 0x0400,
     KashidaJustification    = 0x0800,
     ForFallback             = 0x2000,
-    DrawBullet              = 0x4000,
 };
 namespace o3tl
 {
-    template<> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0x6f77> {};
+    template<> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0x2f77> {};
 }
 
 typedef std::vector< Rectangle > MetricVector;
@@ -1178,7 +1177,7 @@ private:
     SAL_DLLPRIVATE void         ImplInitAboveTextLineSize();
 
 
-    SAL_DLLPRIVATE bool         ImplDrawTextDirect( SalLayout&, bool bTextLines, sal_uInt32 flags = 0 );
+    SAL_DLLPRIVATE void         ImplDrawTextDirect( SalLayout&, bool bTextLines);
     SAL_DLLPRIVATE void         ImplDrawSpecialText( SalLayout& );
     SAL_DLLPRIVATE void         ImplDrawTextRect( long nBaseX, long nBaseY, long nX, long nY, long nWidth, long nHeight );
 
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index a92fb87..e89a762 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -1384,10 +1384,8 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
     {
         const OUString* pStr = &rInf.GetText();
 
-#if !defined(MACOSX) && !defined(IOS)
         OUString aStr;
         OUString aBulletOverlay;
-#endif
         bool bBullet = rInf.GetBullet();
         if( m_bSymbol )
             bBullet = false;
@@ -1492,7 +1490,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
 
         nScrPos = pScrArray[ 0 ];
 
-#if !defined(MACOSX) && !defined(IOS)
         if( bBullet )
         {
             // !!! HACK !!!
@@ -1532,7 +1529,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
                     aBulletOverlay = aBulletOverlay.replaceAt(i, 1, OUString(CH_BLANK));
                 }
         }
-#endif
+
         sal_Int32 nCnt = rInf.GetText().getLength();
         if ( nCnt < rInf.GetIdx() )
             nCnt = 0;
@@ -1556,16 +1553,11 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
             if ( bSwitchH2V )
                 rInf.GetFrame()->SwitchHorizontalToVertical( aTextOriginPos );
 
-#if defined(MACOSX) || defined(IOS)
-            rInf.GetOut().DrawTextArray( aTextOriginPos, rInf.GetText(),
-                                         pKernArray, rInf.GetIdx(), 1, bBullet ? SalLayoutFlags::DrawBullet : SalLayoutFlags::NONE );
-#else
             rInf.GetOut().DrawTextArray( aTextOriginPos, rInf.GetText(),
                                          pKernArray, rInf.GetIdx(), 1 );
             if( bBullet )
                 rInf.GetOut().DrawTextArray( aTextOriginPos, *pStr, pKernArray,
                                              rInf.GetIdx() ? 1 : 0, 1 );
-#endif
         }
         else
         {
@@ -1746,10 +1738,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
                 if ( bSwitchH2V )
                     rInf.GetFrame()->SwitchHorizontalToVertical( aTextOriginPos );
 
-#if defined(MACOSX) || defined(IOS)
-                rInf.GetOut().DrawTextArray( aTextOriginPos, *pStr, pKernArray + nOffs,
-                                             rInf.GetIdx() + nOffs , nLen - nOffs, bBullet ? SalLayoutFlags::DrawBullet : SalLayoutFlags::NONE );
-#else
                 // If we paint bullets instead of spaces, we use a copy of
                 // the paragraph string. For the layout engine, the copy
                 // of the string has to be an environment of the range which
@@ -1804,7 +1792,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
                     pTmpFont->SetStrikeout(aPreviousStrikeout);
                     rInf.GetOut().Pop();
                 }
-#endif
             }
         }
         delete[] pScrArray;
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index 48870e4..ce9b6c0 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -422,9 +422,7 @@ vcl_quartz_code= \
     vcl/quartz/salvd \
 
 vcl_coretext_code= \
-    vcl/quartz/CTRunData \
     vcl/quartz/ctfonts \
-    vcl/quartz/ctlayout \
     vcl/quartz/salgdi \
 
 ifeq ($(OS),MACOSX)
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 2e3f97d..f6776b3 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -88,8 +88,6 @@ public:
     CoreTextStyle( const FontSelectPattern& );
     ~CoreTextStyle( void );
 
-    SalLayout* GetTextLayout( void ) const;
-
     void       GetFontMetric( ImplFontMetricDataRef& ) const;
     bool       GetGlyphBoundRect( sal_GlyphId, Rectangle& ) const;
     bool       GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) const;
@@ -136,8 +134,6 @@ private:
 
 class AquaSalGraphics : public SalGraphics
 {
-    friend class CTLayout;
-protected:
     CGLayerRef                              mxLayer;    // Quartz graphics layer
     CGContextRef                            mrContext;  // Quartz drawing context
 #ifdef MACOSX
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 805b3e2..3fab81f 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -167,8 +167,6 @@ public:
     virtual void    AdjustLayout( ImplLayoutArgs& );    // adjusting after fallback etc.
     virtual void    InitFont() const {}
     virtual void    DrawText( SalGraphics& ) const = 0;
-    virtual bool    DrawTextSpecial( SalGraphics& /* rGraphics */, sal_uInt32 /* flags */ ) const { return false; }
-#define DRAWTEXT_F_OUTLINE ((sal_uInt32)(1<<0))
 
     int             GetUnitsPerPixel() const                { return mnUnitsPerPixel; }
     int             GetOrientation() const                  { return mnOrientation; }
diff --git a/vcl/quartz/CTRunData.cxx b/vcl/quartz/CTRunData.cxx
deleted file mode 100644
index 8f58d47..0000000
--- a/vcl/quartz/CTRunData.cxx
+++ /dev/null
@@ -1,94 +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/.
- */
-
-#include <sal/config.h>
-#include <sal/types.h>
-
-#include <cassert>
-
-#include "CTRunData.hxx"
-#include "quartz/utils.h"
-
-
-CTRunData::CTRunData( CTRunRef pRun, int start)
-    : ownership_flags(0)
-    , m_StartPos(start)
-    , m_pRun(pRun)
-{
-    assert(pRun);
-
-    CFDictionaryRef pRunAttributes = CTRunGetAttributes( m_pRun );
-    m_pFont = static_cast<CTFontRef>(CFDictionaryGetValue( pRunAttributes, kCTFontAttributeName ));
-
-    m_nGlyphs = CTRunGetGlyphCount(m_pRun);
-    m_EndPos = m_StartPos + m_nGlyphs;
-    const CFRange aAll = CFRangeMake( 0, m_nGlyphs );
-
-    m_pAdvances = CTRunGetAdvancesPtr( pRun );
-    if( !m_pAdvances )
-    {
-        m_pAdvances = new CGSize[m_nGlyphs];
-        ownership_flags |= CTRUNDATA_F_OWN_ADVANCES;
-        CTRunGetAdvances( pRun, aAll, const_cast<CGSize*>(m_pAdvances) );
-    }
-
-    m_pGlyphs = CTRunGetGlyphsPtr( m_pRun );
-    if( !m_pGlyphs )
-    {
-        m_pGlyphs = new CGGlyph[m_nGlyphs];
-        ownership_flags |= CTRUNDATA_F_OWN_GLYPHS;
-        CTRunGetGlyphs( pRun, aAll, const_cast<CGGlyph*>(m_pGlyphs));
-    }
-
-    m_pStringIndices = CTRunGetStringIndicesPtr( pRun );
-    if( !m_pStringIndices )
-    {
-        m_pStringIndices = new CFIndex[m_nGlyphs];
-        ownership_flags |= CTRUNDATA_F_OWN_INDICES;
-        CTRunGetStringIndices( pRun, aAll, const_cast<CFIndex*>(m_pStringIndices) );
-    }
-
-    m_pPositions = CTRunGetPositionsPtr( pRun );
-    if( !m_pPositions )
-    {
-        m_pPositions = new CGPoint[m_nGlyphs];
-        ownership_flags |= CTRUNDATA_F_OWN_POSITIONS;
-        CTRunGetPositions( pRun, aAll, const_cast<CGPoint*>(m_pPositions) );
-    }
-    for(int i = 0; i < m_nGlyphs; i++)
-    {
-        SAL_INFO( "vcl.ct", "CTRunData Adv:" << (double)m_pAdvances[i].width << " s-idx:" << m_pStringIndices[i] << " pos:(" <<
-                  m_pPositions[i].x << ":" << m_pPositions[i].y << ")");
-    }
-}
-
-CTRunData::~CTRunData()
-{
-    if(ownership_flags & CTRUNDATA_F_OWN_ADVANCES)
-    {
-        delete [] m_pAdvances;
-    }
-
-    if(ownership_flags & CTRUNDATA_F_OWN_GLYPHS)
-    {
-        delete [] m_pGlyphs;
-    }
-
-    if(ownership_flags & CTRUNDATA_F_OWN_INDICES)
-    {
-        delete [] m_pStringIndices;
-    }
-
-    if(ownership_flags & CTRUNDATA_F_OWN_POSITIONS)
-    {
-        delete [] m_pPositions;
-    }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/quartz/CTRunData.hxx b/vcl/quartz/CTRunData.hxx
deleted file mode 100644
index 3201acf..0000000
--- a/vcl/quartz/CTRunData.hxx
+++ /dev/null
@@ -1,42 +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/.
- */
-#ifndef CTRunData_Included
-#define CTRunData_Included
-
-#include "premac.h"
-#include <CoreGraphics/CoreGraphics.h>
-#include <CoreText/CoreText.h>
-#include "postmac.h"
-
-class CTRunData
-{
-public:
-    int   ownership_flags;
-#define CTRUNDATA_F_OWN_ADVANCES  (1<<0)
-#define CTRUNDATA_F_OWN_GLYPHS    (1<<1)
-#define CTRUNDATA_F_OWN_INDICES   (1<<2)
-#define CTRUNDATA_F_OWN_POSITIONS (1<<3)
-
-    int m_nGlyphs;
-    int m_StartPos;
-    int m_EndPos;
-    CTRunRef m_pRun;
-    CTFontRef m_pFont;
-    const CGGlyph* m_pGlyphs;
-    const CGPoint* m_pPositions;
-    const CGSize*  m_pAdvances;
-    const CFIndex* m_pStringIndices;
-
-    CTRunData(CTRunRef pRun, int start);
-   ~CTRunData();
-};
-
-#endif /* NDef CTRunData_Included */
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 20f5414..d5f29b5 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -100,17 +100,6 @@ CoreTextStyle::CoreTextStyle( const FontSelectPattern& rFSD )
     CTFontRef pNewCTFont = CTFontCreateWithFontDescriptor( pFontDesc, fScaledFontHeight, &aMatrix );
     CFDictionarySetValue( mpStyleDict, kCTFontAttributeName, pNewCTFont );
     CFRelease( pNewCTFont);
-
-    // allow delayed setting the font color, i.e. after the text layout
-    CFDictionarySetValue( mpStyleDict, kCTForegroundColorFromContextAttributeName, kCFBooleanTrue );
-
-#if 0 // LastResort is implicit in CoreText's font cascading
-    const void* aGFBDescriptors[] = { CTFontDescriptorCreateWithNameAndSize( CFSTR("LastResort"), 0) }; // TODO: use the full GFB list
-    const int nGfbCount = sizeof(aGFBDescriptors) / sizeof(*aGFBDescriptors);
-    CFArrayRef pGfbList = CFArrayCreate( NULL, aGFBDescriptors, nGfbCount, &kCFTypeArrayCallBacks);
-    CFDictionaryAddValue( mpStyleDict, kCTFontCascadeListAttribute, pGfbList);
-    CFRelease( pGfbList);
-#endif
 }
 
 CoreTextStyle::~CoreTextStyle()
@@ -171,7 +160,6 @@ SAL_WNODEPRECATED_DECLARATIONS_POP
 bool CoreTextStyle::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect ) const
 {
     CGGlyph nCGGlyph = aGlyphId & GF_IDXMASK;
-    // XXX: this is broken if the glyph came from fallback font
     CTFontRef aCTFontRef = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
 
     SAL_WNODEPRECATED_DECLARATIONS_PUSH //TODO: 10.11 kCTFontDefaultOrientation
@@ -247,7 +235,6 @@ bool CoreTextStyle::GetGlyphOutline( sal_GlyphId aGlyphId, basegfx::B2DPolyPolyg
     rResult.clear();
 
     CGGlyph nCGGlyph = aGlyphId & GF_IDXMASK;
-    // XXX: this is broken if the glyph came from fallback font
     CTFontRef pCTFont = static_cast<CTFontRef>(CFDictionaryGetValue( mpStyleDict, kCTFontAttributeName ));
     CGPathRef xPath = CTFontCreatePathForGlyph( pCTFont, nCGGlyph, nullptr );
     if (!xPath)
@@ -368,9 +355,9 @@ FontAttributes DevFontFromCTFontDescriptor( CTFontDescriptorRef pFD, bool* bFont
     // get font attributes
     CFDictionaryRef pAttrDict = static_cast<CFDictionaryRef>(CTFontDescriptorCopyAttribute( pFD, kCTFontTraitsAttribute ));
 
-    if (bFontEnabled && *bFontEnabled && SalLayout::UseCommonLayout())
+    if (bFontEnabled && *bFontEnabled)
     {
-        // Ignore font formats not supported by CommonSalLayout.
+        // Ignore font formats not supported.
         int nFormat;
         CFNumberRef pFormat = static_cast<CFNumberRef>(CTFontDescriptorCopyAttribute(pFD, kCTFontFormatAttribute));
         CFNumberGetValue(pFormat, kCFNumberIntType, &nFormat);
diff --git a/vcl/quartz/ctlayout.cxx b/vcl/quartz/ctlayout.cxx
deleted file mode 100644
index fcf474e..0000000
--- a/vcl/quartz/ctlayout.cxx
+++ /dev/null
@@ -1,787 +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 <sal/config.h>
-
-#include <memory>
-#include <vector>
-
-#include <sal/types.h>
-#include <tools/debug.hxx>
-
-#include "quartz/ctfonts.hxx"
-#include "CTRunData.hxx"
-#include "quartz/utils.h"
-
-
-class CTLayout : public SalLayout
-{
-public:
-    explicit        CTLayout( const CoreTextStyle* );
-    virtual         ~CTLayout() override;
-
-    virtual bool    LayoutText( ImplLayoutArgs& ) override;
-    virtual void    AdjustLayout( ImplLayoutArgs& ) override;
-    virtual void    DrawText( SalGraphics& ) const override;
-    virtual bool    DrawTextSpecial( SalGraphics& rGraphics, sal_uInt32 flags ) const override;
-
-    virtual int     GetNextGlyphs( int nLen, sal_GlyphId* pOutGlyphIds, Point& rPos, int&,
-                                   DeviceCoordinate* pGlyphAdvances = nullptr, int* pCharIndexes = nullptr,
-                                   const PhysicalFontFace** pFallbackFonts = nullptr ) const override;
-
-    virtual DeviceCoordinate GetTextWidth() const override;
-    virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const override;
-    virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const override;
-    virtual void    GetCaretPositions( int nArraySize, long* pCaretXArray ) const override;
-    virtual bool    GetBoundRect( SalGraphics&, Rectangle& ) const override;
-
-    virtual void    InitFont() const override;
-    virtual void    MoveGlyph( int nStart, long nNewXPos ) override;
-    virtual void    DropGlyph( int nStart ) override;
-    virtual void    Simplify( bool bIsBase ) override;
-
-private:
-    void            drawCTLine(AquaSalGraphics& rAquaGraphics, CTLineRef ctline, const CoreTextStyle* const pStyle) const;
-    CGPoint         GetTextDrawPosition() const;
-    bool            CacheGlyphLayout() const;
-
-    const CoreTextStyle* const    mpTextStyle;
-
-    // CoreText specific objects
-    CFAttributedStringRef mpAttrString;
-    CTLineRef mpCTLine;
-
-    int mnCharCount;        // ==mnEndCharPos-mnMinCharPos
-    int mnTrailingSpaceCount;
-    double mfTrailingSpaceWidth;
-
-    // cached details about the resulting layout
-    // mutable members since these details are all lazy initialized
-    mutable double  mfCachedWidth;          // cached value of resulting typographical width
-
-    // x-offset relative to layout origin
-    // currently only used in RTL-layouts
-    mutable double  mfBaseAdv;
-
-    mutable bool  bLayouted; // true if the glyph layout information are cached and current;
-    mutable std::vector<std::unique_ptr<CTRunData>> m_vRunData;
-
-};
-
-CTLayout::CTLayout( const CoreTextStyle* pTextStyle )
-    : mpTextStyle( pTextStyle )
-    , mpAttrString( nullptr )
-    , mpCTLine( nullptr )
-    , mnCharCount( 0 )
-    , mnTrailingSpaceCount( 0 )
-    , mfTrailingSpaceWidth( 0.0 )
-    , mfCachedWidth( -1 )
-    , mfBaseAdv( 0 )
-    , bLayouted( false )
-{
-}
-
-CTLayout::~CTLayout()
-{
-    if( mpCTLine )
-    {
-        SAL_INFO( "vcl.ct", "CFRelease(" << mpCTLine << ")" );
-        CFRelease( mpCTLine );
-    }
-    if( mpAttrString )
-        CFRelease( mpAttrString );
-}
-
-bool CTLayout::LayoutText( ImplLayoutArgs& rArgs )
-{
-    m_vRunData.clear();
-    bLayouted = false;
-
-    // release an eventual older layout
-    if( mpAttrString )
-        CFRelease( mpAttrString );
-    mpAttrString = nullptr;
-    if( mpCTLine )
-    {
-        SAL_INFO( "vcl.ct", "CFRelease(" << mpCTLine << ")" );
-        CFRelease( mpCTLine );
-    }
-    mpCTLine = nullptr;
-
-    // initialize the new layout
-    SalLayout::AdjustLayout( rArgs );
-    mnCharCount = mnEndCharPos - mnMinCharPos;
-
-    // short circuit if there is nothing to do
-    if( mnCharCount <= 0 )
-        return false;
-
-    const sal_Unicode *pStr = rArgs.mrStr.getStr();
-
-    // create the CoreText line layout
-    CFStringRef aCFText = CFStringCreateWithCharactersNoCopy( nullptr,
-                                                              reinterpret_cast<UniChar const *>(pStr + mnMinCharPos),
-                                                              mnCharCount,
-                                                              kCFAllocatorNull );
-    // CFAttributedStringCreate copies the attribues parameter
-    mpAttrString = CFAttributedStringCreate( nullptr, aCFText, mpTextStyle->GetStyleDict() );
-    mpCTLine = CTLineCreateWithAttributedString( mpAttrString );
-    SAL_INFO( "vcl.ct", "CTLineCreateWithAttributedString(\"" << GetOUString(aCFText) << "\") =p " << mpCTLine );
-    CFRelease( aCFText);
-
-    mnTrailingSpaceCount = 0;
-    // reverse search for first 'non-space'...
-    for( int i = mnEndCharPos - 1; i >= mnMinCharPos; i--)
-    {
-        sal_Unicode nChar = pStr[i];
-        if ((nChar <= 0x0020) ||                  // blank
-            (nChar == 0x00A0) ||                  // non breaking space
-            (nChar >= 0x2000 && nChar <= 0x200F) || // whitespace
-            (nChar == 0x3000))                   // ideographic space
-        {
-            mnTrailingSpaceCount += 1;
-        }
-        else
-        {
-            break;
-        }
-    }
-    return true;
-}
-
-void CTLayout::AdjustLayout( ImplLayoutArgs& rArgs )
-{
-    if( !mpCTLine)
-    {
-        return;
-    }
-
-
-    int nPixelWidth = rArgs.mpDXArray ? rArgs.mpDXArray[ mnCharCount - 1 ] : rArgs.mnLayoutWidth;
-    if( nPixelWidth <= 0)
-        return;
-
-    // HACK: justification requests which change the width by just one pixel are probably
-    // #i86038# introduced by lossy conversions between integer based coordinate system
-    int fuzz =  (nPixelWidth - GetTextWidth()) / 2;
-    if (!fuzz)
-    {
-        return;
-    }
-
-    // if the text to be justified has whitespace in it then
-    // - Writer goes crazy with its HalfSpace magic
-    // - CoreText handles spaces specially (in particular at the text end)
-    if( mnTrailingSpaceCount )
-    {
-        if(rArgs.mpDXArray)
-        {
-            int nFullPixelWidth = nPixelWidth;
-            nPixelWidth = mnTrailingSpaceCount == mnCharCount
-                ? 0 : rArgs.mpDXArray[ mnCharCount - mnTrailingSpaceCount - 1];
-            mfTrailingSpaceWidth = nFullPixelWidth - nPixelWidth;
-        }
-        else
-        {
-            if(mfTrailingSpaceWidth <= 0.0)
-            {
-                mfTrailingSpaceWidth = CTLineGetTrailingWhitespaceWidth( mpCTLine );
-                nPixelWidth -= rint(mfTrailingSpaceWidth);
-            }
-        }
-        if(nPixelWidth <= 0)
-        {
-            return;
-        }
-        // recreate the CoreText line layout without trailing spaces
-        SAL_INFO( "vcl.ct", "CFRelease(" << mpCTLine << ")" );
-        CFRelease( mpCTLine );
-        const sal_Unicode *pStr = rArgs.mrStr.getStr();
-        CFStringRef aCFText = CFStringCreateWithCharactersNoCopy( nullptr,
-                                                                  reinterpret_cast<UniChar const *>(pStr + mnMinCharPos),
-                                                                  mnCharCount - mnTrailingSpaceCount,
-                                                                  kCFAllocatorNull );
-        CFAttributedStringRef pAttrStr = CFAttributedStringCreate( nullptr,
-                                                                   aCFText,
-                                                                   mpTextStyle->GetStyleDict() );
-        mpCTLine = CTLineCreateWithAttributedString( pAttrStr );
-        SAL_INFO( "vcl.ct", "CTLineCreateWithAttributedString(\"" << GetOUString(aCFText) << "\") = " << mpCTLine );
-        CFRelease( pAttrStr );
-        CFRelease( aCFText );
-
-
-        // in RTL-layouts trailing spaces are leftmost
-        // TODO: use BiDi-algorithm to thoroughly check this assumption
-        if( rArgs.mnFlags & SalLayoutFlags::BiDiRtl)
-        {
-            mfBaseAdv = mfTrailingSpaceWidth;
-        }
-    }
-
-    CTLineRef pNewCTLine = CTLineCreateJustifiedLine( mpCTLine, 1.0, nPixelWidth);
-    SAL_INFO( "vcl.ct", "CTLineCreateJustifiedLine(" << mpCTLine << ",1.0," << nPixelWidth << ") = " << pNewCTLine );
-
-    if( !pNewCTLine )
-    {
-        // CTLineCreateJustifiedLine can and does fail
-        // handle failure by keeping the unjustified layout
-        // TODO: a better solution such as
-        // - forcing glyph overlap
-        // - changing the font size
-        // - changing the CTM matrix
-        return;
-    }
-    SAL_INFO( "vcl.ct", "CFRelease(" << mpCTLine << ")" );
-    CFRelease( mpCTLine );
-    mpCTLine = pNewCTLine;
-    mfCachedWidth = nPixelWidth + mfTrailingSpaceWidth;
-}
-
-// When drawing right aligned text, rounding errors in the position returned by
-// GetDrawPosition() cause the right margin of the text to change whenever text
-// width changes causing "jumping letters" effect. So here we calculate the
-// drawing position relative to the right margin on our own to avoid the
-// rounding errors. That is basically a hack, and it should go away if one day
-// we managed to get rid of those rounding errors.
-
-// We continue using GetDrawPosition() for non-right aligned text, to minimize
-// any unforeseen side effects.
-CGPoint CTLayout::GetTextDrawPosition() const
-{
-    CGFloat fPosX, fPosY;
-
-    if (mnLayoutFlags & SalLayoutFlags::RightAlign)
-    {
-        // text is always drawn at its leftmost point
-        const Point aPos = DrawBase();
-        fPosX = aPos.X() + mfBaseAdv - GetTextWidth();
-        fPosY = aPos.Y();
-    }
-    else
-    {
-        const Point aPos = GetDrawPosition(Point(mfBaseAdv, 0));
-        fPosX = aPos.X();
-        fPosY = aPos.Y();
-    }
-
-    CGPoint aTextPos = { +fPosX, -fPosY };
-    return aTextPos;
-}
-
-/* use to deal with special font decoration like 'outline' drawing
- * return true if it was able to handle the drawing
- * false if not, in which case the caller
- * is supposed to fallback to 'generic' method
- */
-bool CTLayout::DrawTextSpecial( SalGraphics& rGraphics, sal_uInt32 flags ) const
-{
-    AquaSalGraphics& rAquaGraphics = static_cast<AquaSalGraphics&>(rGraphics);
-
-    // short circuit if there is nothing to do
-    if( (mnCharCount <= 0) || !rAquaGraphics.CheckContext() )
-        return true;
-#if 0 /* temporarely revert to the 'old way' */
-    if (flags & DRAWTEXT_F_OUTLINE)
-    {
-        CFMutableDictionaryRef styledict = CFDictionaryCreateMutableCopy(
-                CFAllocatorGetDefault(),
-                CFDictionaryGetCount(mpTextStyle->GetStyleDict()),
-                mpTextStyle->GetStyleDict());
-
-        int nStroke = 2;
-        CFNumberRef rStroke = CFNumberCreate(NULL, kCFNumberSInt32Type, &nStroke);
-        CFDictionarySetValue(styledict, kCTStrokeWidthAttributeName, rStroke);
-
-        CFAttributedStringRef pAttrStr = CFAttributedStringCreate(
-                NULL,
-                CFAttributedStringGetString(mpAttrString),
-                styledict);
-        CTLineRef pCTLine = CTLineCreateWithAttributedString( pAttrStr );
-        SAL_INFO( "vcl.ct", "CTLineCreateWithAttributedString(" << GetOUString(CFAttributedStringGetString(mpAttrSring)) << ") = " << pCTLine );
-        CFRelease( pAttrStr );
-
-        /* draw the text in 'outline' */
-        drawCTLine(rAquaGraphics, pCTLine, mpTextStyle);
-        SAL_INFO( "vcl.ct", "CFRelease(" << pCTLine << ")" );
-        CFRelease(pCTLine);
-        return true;
-    }
-    else
-#endif
-    {
-        return SalLayout::DrawTextSpecial(rGraphics, flags);
-    }
-}
-
-void CTLayout::drawCTLine(AquaSalGraphics& rAquaGraphics, CTLineRef ctline, const CoreTextStyle* const pStyle) const
-{
-    // the view is vertically flipped => flipped glyphs
-    // so apply a temporary transformation that it flips back
-    // also compensate if the font was size limited
-    CGContextRef context = rAquaGraphics.mrContext;
-    SAL_INFO( "vcl.ct", "CGContextSaveGState(" << context << ")" );
-    CGContextSaveGState( context );
-    SAL_INFO( "vcl.ct", "CGContextScaleCTM(" << context << ",1.0,-1.0)" );
-    CGContextScaleCTM( context, 1.0, -1.0 );
-    CGContextSetShouldAntialias( context, !rAquaGraphics.mbNonAntialiasedText );
-
-    // set the text transformation (e.g. position)
-    CGPoint aTextPos = GetTextDrawPosition();
-
-    if( pStyle->mfFontRotation != 0.0 )
-    {
-        const CGFloat fRadians = pStyle->mfFontRotation;
-        SAL_INFO( "vcl.ct", "CGContextRotateCTM(" << context << "," << +fRadians << ")" );
-        CGContextRotateCTM( context, +fRadians );
-
-        const CGAffineTransform aInvMatrix = CGAffineTransformMakeRotation( -fRadians );
-        aTextPos = CGPointApplyAffineTransform( aTextPos, aInvMatrix );
-    }
-
-    SAL_INFO( "vcl.ct", "CGContextSetTextPosition(" << context << "," << aTextPos << ")" );
-    CGContextSetTextPosition( context, aTextPos.x, aTextPos.y );
-
-#ifndef IOS
-    // request an update of the to-be-changed window area
-    if( rAquaGraphics.IsWindowGraphics() )
-    {
-        const CGRect aInkRect = CTLineGetImageBounds( mpCTLine, context );
-        const CGRect aRefreshRect = CGContextConvertRectToDeviceSpace( context, aInkRect );
-        rAquaGraphics.RefreshRect( aRefreshRect );
-    }
-#endif
-
-    // set the text color as fill color (see kCTForegroundColorFromContextAttributeName)
-    CGContextSetFillColor( context, rAquaGraphics.maTextColor.AsArray() );
-
-    SAL_INFO( "vcl.ct", "CTLineDraw(" << ctline << "," << context << ")" );
-    // draw the text
-    CTLineDraw( ctline, context );
-
-    if(mnLayoutFlags & SalLayoutFlags::DrawBullet)
-    {
-        CFArrayRef runArray = CTLineGetGlyphRuns(ctline);
-        CFIndex runCount = CFArrayGetCount(runArray);
-
-        for (CFIndex runIndex = 0; runIndex < runCount; runIndex++)
-        {
-            CTRunRef run = static_cast<CTRunRef>(CFArrayGetValueAtIndex(runArray, runIndex));
-            CFIndex runGlyphCount = CTRunGetGlyphCount(run);
-            CGPoint position;
-            CGSize advance;
-            CFIndex runGlyphIndex = 0;
-            CFIndex stringIndice = 0;
-
-            for (; runGlyphIndex < runGlyphCount; runGlyphIndex++)
-            {
-                CFRange glyphRange = CFRangeMake(runGlyphIndex, 1);
-                CTRunGetStringIndices( run, glyphRange, &stringIndice );
-                UniChar curChar = CFStringGetCharacterAtIndex (CFAttributedStringGetString(mpAttrString), stringIndice);
-                if(curChar == ' ')
-                {
-                    CGFloat ascent;
-                    CGFloat descent;
-                    CGFloat leading;
-                    CTFontRef runFont = static_cast<CTFontRef>(CFDictionaryGetValue(CTRunGetAttributes(run),
-                                                                        kCTFontAttributeName));
-                    CGFloat baseSize = CTFontGetSize(runFont);
-                    CTRunGetTypographicBounds ( run, glyphRange,
-                                                &ascent, &descent, &leading);
-                    CTRunGetPositions(run, glyphRange, &position);
-                    CTRunGetAdvances(run, glyphRange, &advance);
-                    CGRect bulletRect;
-                    if(mnLayoutFlags & SalLayoutFlags::Vertical)
-                    {
-                        bulletRect = CGRectMake(position.x - advance.width / 4,
-                                                -position.y,  baseSize / 5, baseSize / 5 );
-                    }
-                    else
-                    {
-                        bulletRect = CGRectMake(position.x + advance.width / 4,
-                                                position.y + ascent / 3 - baseSize / 5,  baseSize / 5, baseSize / 5 );
-                    }
-
-                    CGContextSaveGState(context);
-                    CGContextTranslateCTM(context, aTextPos.x, aTextPos.y);
-                    RGBAColor bulletColor(MAKE_SALCOLOR(0x26, 0x8b, 0xd2 )); // NON_PRINTING_CHARACTER_COLOR
-                    CGContextSetFillColor( context, bulletColor.AsArray() );
-                    CGContextSetStrokeColor(context, bulletColor.AsArray());
-                    if(mnLayoutFlags & SalLayoutFlags::Vertical)
-                    {
-                        CGContextRotateCTM( context,  -F_PI/2 );
-                    }
-
-                    CGContextBeginPath(context);
-                    CGContextAddEllipseInRect(context, bulletRect);
-                    CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill
-                    CGContextRestoreGState(context);
-                }
-            }
-        }
-    }
-    // restore the original graphic context transformations
-    SAL_INFO( "vcl.ct", "CGContextRestoreGState(" << context << ")" );
-    CGContextRestoreGState( context );
-}
-
-void CTLayout::DrawText( SalGraphics& rGraphics ) const
-{
-    AquaSalGraphics& rAquaGraphics = static_cast<AquaSalGraphics&>(rGraphics);
-
-    // short circuit if there is nothing to do
-    if( (mnCharCount <= 0) || !rAquaGraphics.CheckContext() )
-        return;
-
-    drawCTLine(rAquaGraphics, mpCTLine, mpTextStyle);
-}
-
-bool CTLayout::CacheGlyphLayout() const // eew!
-{
-    m_vRunData.clear();
-    if(!mpCTLine)
-    {
-        return false;
-    }
-    CFArrayRef aRuns = CTLineGetGlyphRuns( mpCTLine );
-    const int nRun = CFArrayGetCount( aRuns );
-    int nPos = 0;
-
-    for( int i = 0; i < nRun; ++i )
-    {
-        CTRunRef pRun = static_cast<CTRunRef>(CFArrayGetValueAtIndex( aRuns, i ));
-        CTRunData* pRunData = new CTRunData(pRun, nPos);
-        m_vRunData.push_back(std::unique_ptr<CTRunData>(pRunData));
-        nPos += pRunData->m_nGlyphs;
-    }
-    bLayouted = true;
-    return true;
-}
-
-int CTLayout::GetNextGlyphs( int nLen, sal_GlyphId* pOutGlyphIds, Point& rPos, int& nStart,
-                             DeviceCoordinate* pGlyphAdvances, int* pCharIndexes,
-                             const PhysicalFontFace** pFallbackFonts ) const
-{
-    if( !mpCTLine )
-    {
-        return 0;
-    }
-    if(!bLayouted)
-    {
-        CacheGlyphLayout();
-    }
-
-    if( nStart < 0 ) // first glyph requested?
-    {
-        nStart = 0;
-    }
-    const PhysicalFontFace* pFallbackFont = nullptr;
-    CTFontRef pFont = nullptr;
-    CTFontDescriptorRef pFontDesc = nullptr;
-    FontAttributes rDevFontAttr;
-
-    auto iter = m_vRunData.begin();
-
-    while (iter != m_vRunData.end() && (*iter)->m_EndPos <= nStart)
-    {
-        ++iter;
-    }
-    if(iter == m_vRunData.end())
-    {
-        return 0;
-    }
-    else
-    {
-        if( pFallbackFonts )
-        {
-            pFont = static_cast<CTFontRef>(CFDictionaryGetValue( mpTextStyle->GetStyleDict(), kCTFontAttributeName ));
-            pFontDesc = CTFontCopyFontDescriptor( (*iter)->m_pFont );
-            rDevFontAttr = DevFontFromCTFontDescriptor( pFontDesc, nullptr );
-        }
-    }
-    int i = nStart;
-    int count = 0;
-    while( i < nStart + nLen )
-    {
-            // convert glyph details for VCL
-        int j = i - (*iter)->m_StartPos;
-        *(pOutGlyphIds++) = (*iter)->m_pGlyphs[ j ];
-        if( pGlyphAdvances )
-        {
-            *(pGlyphAdvances++) = lrint((*iter)->m_pAdvances[ j ].width);
-        }
-        if( pCharIndexes )
-        {
-            *(pCharIndexes++) = (*iter)->m_pStringIndices[ j ] + mnMinCharPos;
-        }
-        if( pFallbackFonts )
-        {
-            if (!CFEqual((*iter)->m_pFont,  pFont))
-            {
-                pFallbackFont = new CoreTextFontFace( rDevFontAttr, reinterpret_cast<sal_IntPtr>(pFontDesc) );
-                *(pFallbackFonts++) = pFallbackFont;
-            }
-            else
-            {
-                *(pFallbackFonts++) = nullptr;
-            }
-        }
-        if( i == nStart )
-        {
-            const CGPoint& rFirstPos = (*iter)->m_pPositions[ j ];
-            rPos = GetDrawPosition( Point( rFirstPos.x, rFirstPos.y) );
-        }
-        i += 1;
-        count += 1;
-        if (i == (*iter)->m_EndPos)
-        {
-            // note: we assume that we do not have empty runs in the middle of things
-            ++iter;
-            if (iter == m_vRunData.end())
-            {
-                break;
-            }
-            if( pFallbackFonts )
-            {
-                pFont = static_cast<CTFontRef>(CFDictionaryGetValue( mpTextStyle->GetStyleDict(), kCTFontAttributeName ));
-                pFontDesc = CTFontCopyFontDescriptor( (*iter)->m_pFont );
-                rDevFontAttr = DevFontFromCTFontDescriptor( pFontDesc, nullptr );
-            }
-        }
-    }
-    nStart = i;
-
-    return count;
-
-}
-
-DeviceCoordinate CTLayout::GetTextWidth() const
-{
-    if( (mnCharCount <= 0) || !mpCTLine )
-        return 0;
-
-    if( mfCachedWidth < 0.0 )
-    {
-        mfCachedWidth = CTLineGetTypographicBounds( mpCTLine, nullptr, nullptr, nullptr);
-    }
-
-    return mfCachedWidth;
-}
-
-DeviceCoordinate CTLayout::FillDXArray( DeviceCoordinate* pDXArray ) const
-{
-    DeviceCoordinate nPixelWidth = GetTextWidth();
-
-    // short circuit requests which don't need full details
-    if( !pDXArray )
-    {
-        return nPixelWidth;
-    }
-
-    for(int i = 0; i < mnCharCount; i++)
-    {
-        pDXArray[i] = 0.0;
-    }
-
-    // prepare the sub-pixel accurate logical-width array
-    ::std::vector<float> aWidthVector( mnCharCount );
-    if( mnTrailingSpaceCount && (mfTrailingSpaceWidth > 0.0) )
-    {
-        const double fOneWidth = mfTrailingSpaceWidth / mnTrailingSpaceCount;
-        for(int i = mnCharCount - mnTrailingSpaceCount; i < mnCharCount; i++)
-        {
-            aWidthVector[i] = fOneWidth;
-        }
-    }
-
-    // handle each glyph run
-    CFArrayRef aGlyphRuns = CTLineGetGlyphRuns( mpCTLine );
-    const int nRunCount = CFArrayGetCount( aGlyphRuns );
-    typedef std::vector<CGSize> CGSizeVector;
-    CGSizeVector aSizeVector;
-    typedef std::vector<CFIndex> CFIndexVector;
-    CFIndexVector aIndexVector;
-
-    for( int nRunIndex = 0; nRunIndex < nRunCount; ++nRunIndex )
-    {
-        CTRunRef pGlyphRun = static_cast<CTRunRef>(CFArrayGetValueAtIndex( aGlyphRuns, nRunIndex ));
-        const CFIndex nGlyphCount = CTRunGetGlyphCount( pGlyphRun );
-        const CFRange aFullRange = CFRangeMake( 0, nGlyphCount );
-
-        aSizeVector.resize( nGlyphCount );
-        aIndexVector.resize( nGlyphCount );
-        CTRunGetAdvances( pGlyphRun, aFullRange, &aSizeVector[0] );
-        CTRunGetStringIndices( pGlyphRun, aFullRange, &aIndexVector[0] );
-
-        for( int i = 0; i != nGlyphCount; ++i )
-        {
-            const int nRelIndex = aIndexVector[i];
-            SAL_INFO( "vcl.ct", "aWidthVector[ g:" << i << "-> c:" << nRelIndex << " ] = " <<
-                      aWidthVector[nRelIndex] << " + " << aSizeVector[i].width << " = " <<
-                      aWidthVector[nRelIndex] + aSizeVector[i].width);
-            aWidthVector[nRelIndex] += aSizeVector[i].width;
-        }
-    }
-
-    // convert the sub-pixel accurate array into classic pDXArray integers
-    float fWidthSum = 0.0;
-    sal_Int32 nOldDX = 0;
-    for( int i = 0; i < mnCharCount; ++i)
-    {
-        const sal_Int32 nNewDX = rint( fWidthSum += aWidthVector[i]);
-        pDXArray[i] = nNewDX - nOldDX;
-        nOldDX = nNewDX;
-    }
-    return nPixelWidth;
-}
-
-sal_Int32 CTLayout::GetTextBreak( DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor ) const
-{
-    if( !mpCTLine )
-    {
-        SAL_INFO("vcl.ct", "GetTextBreak mpCTLine == NULL");
-        return -1;
-    }
-    CTTypesetterRef aCTTypeSetter = CTTypesetterCreateWithAttributedString( mpAttrString );
-    CFIndex nBestGuess = (nCharExtra >= 0) ? 0 : mnCharCount;
-    for( int i = 1; i <= mnCharCount; i *= 2 )
-    {
-        // guess the target width considering char-extra expansion/condensation
-        const double nTargetWidth = nMaxWidth - nBestGuess * nCharExtra;
-        const double fCTMaxWidth = nTargetWidth / nFactor;
-        // calculate the breaking index for the guessed target width
-        const CFIndex nNewIndex = CTTypesetterSuggestClusterBreak( aCTTypeSetter, 0, fCTMaxWidth );
-        if( nNewIndex >= mnCharCount )
-        {
-            CFRelease( aCTTypeSetter );
-            return -1;
-        }
-        // check if the original extra-width guess was good
-        if( !nCharExtra )
-            nBestGuess = nNewIndex;
-
-        if( nBestGuess == nNewIndex )
-            break;
-
-        // prepare another round for a different number of characters
-        CFIndex nNewGuess = (nNewIndex + nBestGuess + 1) / 2;
-        if( nNewGuess == nBestGuess )
-        {
-            nNewGuess += (nNewIndex > nBestGuess) ? +1 : -1;
-        }
-        nBestGuess = nNewGuess;
-    }
-
-    // suggest the best fitting cluster break as breaking position
-    CFRelease( aCTTypeSetter );
-
-    const int nIndex = nBestGuess + mnMinCharPos;
-    SAL_INFO("vcl.ct", "GetTextBreak nIndex:" << nIndex);
-
-    return nIndex;
-}
-
-void CTLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) const
-{
-    SAL_WARN_IF( (nMaxIndex<=0) || (nMaxIndex&1), "vcl",
-        "CTLayout::GetCaretPositions() : invalid number of caret pairs requested");
-
-    // initialize the caret positions
-    for( int i = 0; i < nMaxIndex; ++i )
-    {
-        pCaretXArray[ i ] = -1;
-    }
-    for( int n = 0; n <= mnCharCount; ++n )
-    {
-        // measure the characters cursor position
-        CGFloat fPos2 = -1;
-        const CGFloat fPos1 = CTLineGetOffsetForStringIndex( mpCTLine, n, &fPos2 );
-        (void)fPos2; // TODO: split cursor at line direction change
-
-        // update previous trailing position
-        if( n > 0 )
-            pCaretXArray[ 2*n-1 ] = lrint( fPos1 );
-
-        // update current leading position
-        if( 2*n >= nMaxIndex )
-            break;
-        pCaretXArray[ 2*n+0 ] = lrint( fPos1 );
-    }
-}
-
-bool CTLayout::GetBoundRect( SalGraphics& rGraphics, Rectangle& rVCLRect ) const
-{
-    // Closely mimic DrawText(), except that instead of calling
-    // CTLineDraw() to draw the line, we call CTLineGetImageBounds()
-    // to get its bounds. But all the coordinate system manipulation
-    // before that is the same => should be factored out?
-
-    AquaSalGraphics& rAquaGraphics = static_cast<AquaSalGraphics&>(rGraphics);
-
-    if( !rAquaGraphics.CheckContext() )
-        return false;
-
-    CGContextSaveGState( rAquaGraphics.mrContext );
-    CGContextScaleCTM( rAquaGraphics.mrContext, 1.0, -1.0 );
-    CGContextSetShouldAntialias( rAquaGraphics.mrContext, !rAquaGraphics.mbNonAntialiasedText );
-
-    const CGPoint aVclPos = GetTextDrawPosition();
-    CGPoint aTextPos = GetTextDrawPosition();
-
-    if( mpTextStyle->mfFontRotation != 0.0 )
-    {
-        const CGFloat fRadians = mpTextStyle->mfFontRotation;
-        CGContextRotateCTM( rAquaGraphics.mrContext, +fRadians );
-
-        const CGAffineTransform aInvMatrix = CGAffineTransformMakeRotation( -fRadians );
-        aTextPos = CGPointApplyAffineTransform( aTextPos, aInvMatrix );
-    }
-
-    CGContextSetTextPosition( rAquaGraphics.mrContext, aTextPos.x, aTextPos.y );
-    CGRect aMacRect = CTLineGetImageBounds( mpCTLine, rAquaGraphics.mrContext );
-
-    if( mpTextStyle->mfFontRotation != 0.0 )
-    {
-        const CGFloat fRadians = mpTextStyle->mfFontRotation;
-        const CGAffineTransform aMatrix = CGAffineTransformMakeRotation( +fRadians );
-        aMacRect = CGRectApplyAffineTransform( aMacRect, aMatrix );
-    }
-
-    CGContextRestoreGState( rAquaGraphics.mrContext );
-
-    rVCLRect.Left()   = aVclPos.x + lrint(aMacRect.origin.x);
-    rVCLRect.Right()  = aVclPos.x + lrint(aMacRect.origin.x + aMacRect.size.width);
-    rVCLRect.Bottom() = aVclPos.x - lrint(aMacRect.origin.y);
-    rVCLRect.Top()    = aVclPos.x - lrint(aMacRect.origin.y + aMacRect.size.height);
-
-    return true;
-}
-
-// glyph fallback is supported directly by Aqua
-// so methods used only by MultiSalLayout can be dummy implementated
-void CTLayout::InitFont() const {}
-void CTLayout::MoveGlyph( int /*nStart*/, long /*nNewXPos*/ ) {}
-void CTLayout::DropGlyph( int /*nStart*/ ) {}
-void CTLayout::Simplify( bool /*bIsBase*/ ) {}
-
-SalLayout* CoreTextStyle::GetTextLayout() const
-{
-    return new CTLayout( this);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index a58870f..0333bbf 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -380,11 +380,8 @@ void AquaSalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
     // Copy all PhysicalFontFace objects contained in the SystemFontList
     pSalData->mpFontList->AnnounceFonts( *pFontCollection );
 
-    if (SalLayout::UseCommonLayout())
-    {
-        static CoreTextGlyphFallbackSubstititution aSubstFallback;
-        pFontCollection->SetFallbackHook(&aSubstFallback);
-    }
+    static CoreTextGlyphFallbackSubstititution aSubstFallback;
+    pFontCollection->SetFallbackHook(&aSubstFallback);
 }
 
 void AquaSalGraphics::ClearDevFontCache()
@@ -534,15 +531,10 @@ void AquaSalGraphics::SetFont(FontSelectPattern* pReqFont, int nFallbackLevel)
 
 SalLayout* AquaSalGraphics::GetTextLayout(ImplLayoutArgs& /*rArgs*/, int nFallbackLevel)
 {
-    SalLayout* pSalLayout = nullptr;
     if (mpTextStyle[nFallbackLevel])
-    {
-        if (SalLayout::UseCommonLayout())
-            pSalLayout = new CommonSalLayout(*mpTextStyle[nFallbackLevel]);
-        else
-            pSalLayout = mpTextStyle[nFallbackLevel]->GetTextLayout();
-    }
-    return pSalLayout;
+        return new CommonSalLayout(*mpTextStyle[nFallbackLevel]);
+
+    return nullptr;
 }
 
 const FontCharMapRef AquaSalGraphics::GetFontCharMap() const
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 0506280..e27974b 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -275,13 +275,12 @@ bool OutputDevice::ImplDrawRotateText( SalLayout& rSalLayout )
     return true;
 }
 
-bool OutputDevice::ImplDrawTextDirect( SalLayout& rSalLayout,
-                                       bool bTextLines,
-                                       sal_uInt32 flags )
+void OutputDevice::ImplDrawTextDirect( SalLayout& rSalLayout,
+                                       bool bTextLines)
 {
     if( mpFontInstance->mnOwnOrientation )
         if( ImplDrawRotateText( rSalLayout ) )
-            return true;
+            return;
 
     long nOldX = rSalLayout.DrawBase().X();
     if( HasMirroredGraphics() )
@@ -306,18 +305,7 @@ bool OutputDevice::ImplDrawTextDirect( SalLayout& rSalLayout,
         rSalLayout.DrawBase().X() = pOutDevRef->mnOutWidth - 1 - (rSalLayout.DrawBase().X() - devX) + devX;
     }
 
-    if(flags)
-    {
-        if( ! rSalLayout.DrawTextSpecial( *mpGraphics, flags ))
-        {
-            rSalLayout.DrawBase().X() = nOldX;
-            return false;
-        }
-    }
-    else
-    {
-        rSalLayout.DrawText( *mpGraphics );
-    }
+    rSalLayout.DrawText( *mpGraphics );
     rSalLayout.DrawBase().X() = nOldX;
 
     if( bTextLines )
@@ -328,8 +316,6 @@ bool OutputDevice::ImplDrawTextDirect( SalLayout& rSalLayout,
     // emphasis marks
     if( maFont.GetEmphasisMark() & FontEmphasisMark::Style )
         ImplDrawEmphasisMarks( rSalLayout );
-
-    return true;
 }
 
 void OutputDevice::ImplDrawSpecialText( SalLayout& rSalLayout )
@@ -420,36 +406,33 @@ void OutputDevice::ImplDrawSpecialText( SalLayout& rSalLayout )
 
         if ( maFont.IsOutline() )
         {
-            if(! ImplDrawTextDirect( rSalLayout, mbTextLines, DRAWTEXT_F_OUTLINE))
-            {
-                rSalLayout.DrawBase() = aOrigPos + Point(-1,-1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(+1,+1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(-1,+0);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(-1,+1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(+0,+1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(+0,-1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(+1,-1);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos + Point(+1,+0);
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                rSalLayout.DrawBase() = aOrigPos;
+            rSalLayout.DrawBase() = aOrigPos + Point(-1,-1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(+1,+1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(-1,+0);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(-1,+1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(+0,+1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(+0,-1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(+1,-1);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos + Point(+1,+0);
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            rSalLayout.DrawBase() = aOrigPos;
 
-                SetTextColor( Color( COL_WHITE ) );
-                SetTextLineColor( Color( COL_WHITE ) );
-                SetOverlineColor( Color( COL_WHITE ) );
-                ImplInitTextColor();
-                ImplDrawTextDirect( rSalLayout, mbTextLines );
-                SetTextColor( aOldColor );
-                SetTextLineColor( aOldTextLineColor );
-                SetOverlineColor( aOldOverlineColor );
-                ImplInitTextColor();
-            }
+            SetTextColor( Color( COL_WHITE ) );
+            SetTextLineColor( Color( COL_WHITE ) );
+            SetOverlineColor( Color( COL_WHITE ) );
+            ImplInitTextColor();
+            ImplDrawTextDirect( rSalLayout, mbTextLines );
+            SetTextColor( aOldColor );
+            SetTextLineColor( aOldTextLineColor );
+            SetOverlineColor( aOldOverlineColor );
+            ImplInitTextColor();
         }
     }
 }


More information about the Libreoffice-commits mailing list