[Libreoffice-commits] core.git: Branch 'feature/commonsallayout' - vcl/source

Khaled Hosny khaledhosny at eglug.org
Mon Sep 26 17:12:18 UTC 2016


 vcl/source/gdi/CommonSalLayout.cxx |   41 ++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

New commits:
commit 279407d78c43da63ee88639f00482b1ea703f363
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Mon Sep 26 19:09:52 2016 +0200

    First try on vertical text in CommonSalLayout
    
    Does not work quite right yet.
    
    Change-Id: I52a71c9c21ad75c7cb9c8574e5e7e3b7c1c0c0c3

diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 8963624..7bcbf1d 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -381,6 +381,16 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
             LanguageTag &rTag = rArgs.maLanguageTag;
             OString sLanguage = OUStringToOString(rTag.getBcp47(), RTL_TEXTENCODING_ASCII_US);
 
+            bool bVertical = false;
+            if ((rArgs.mnFlags & SalLayoutFlags::Vertical) &&
+                (aHbScript == HB_SCRIPT_HAN ||
+                 aHbScript == HB_SCRIPT_HANGUL ||
+                 aHbScript == HB_SCRIPT_HIRAGANA ||
+                 aHbScript == HB_SCRIPT_KATAKANA))
+            {
+                bVertical = true;
+            }
+
             int nHbFlags = HB_BUFFER_FLAGS_DEFAULT;
             if (nMinRunPos == 0)
                 nHbFlags |= HB_BUFFER_FLAG_BOT; /* Beginning-of-text */
@@ -392,7 +402,10 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
 #if !HB_VERSION_ATLEAST(1, 1, 0)
             hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs);
 #endif
-            hb_buffer_set_direction(pHbBuffer, bRightToLeft ? HB_DIRECTION_RTL: HB_DIRECTION_LTR);
+            if (SAL_UNLIKELY(bVertical))
+              hb_buffer_set_direction(pHbBuffer, HB_DIRECTION_TTB);
+            else
+              hb_buffer_set_direction(pHbBuffer, bRightToLeft ? HB_DIRECTION_RTL: HB_DIRECTION_LTR);
             hb_buffer_set_script(pHbBuffer, aHbScript);
             hb_buffer_set_language(pHbBuffer, hb_language_from_string(sLanguage.getStr(), -1));
             hb_buffer_set_flags(pHbBuffer, (hb_buffer_flags_t) nHbFlags);
@@ -457,17 +470,31 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
                 if (bDiacritic)
                     nGlyphFlags |= GlyphItem::IS_DIACRITIC;
 
-                int32_t nXOffset =  pHbPositions[i].x_offset >> 6;
-                int32_t nYOffset =  pHbPositions[i].y_offset >> 6;
-                int32_t nXAdvance = pHbPositions[i].x_advance >> 6;
-                int32_t nYAdvance = pHbPositions[i].y_advance >> 6;
+                int32_t nXOffset;
+                int32_t nYOffset;
+                int32_t nXAdvance;
+                Point aNewPos;
+
+                if (SAL_UNLIKELY(bVertical))
+                {
+                    nXOffset =  pHbPositions[i].y_offset >> 6;
+                    nYOffset =  pHbPositions[i].x_offset >> 6;
+                    nXAdvance = pHbPositions[i].y_advance >> 6;
+                    nGlyphIndex |= GF_ROTL;
+                    aNewPos = Point(-(aCurrPos.X() + nXOffset), aCurrPos.Y() + nYOffset);
+                }
+                else
+                {
+                    nXOffset =  pHbPositions[i].x_offset >> 6;
+                    nYOffset =  pHbPositions[i].y_offset >> 6;
+                    nXAdvance = pHbPositions[i].x_advance >> 6;
+                    aNewPos = Point(aCurrPos.X() + nXOffset, -(aCurrPos.Y() + nYOffset));
+                }
 
-                Point aNewPos = Point(aCurrPos.X() + nXOffset, -(aCurrPos.Y() + nYOffset));
                 const GlyphItem aGI(nCharPos, nGlyphIndex, aNewPos, nGlyphFlags, nXAdvance, nXOffset);
                 AppendGlyph(aGI);
 
                 aCurrPos.X() += nXAdvance;
-                aCurrPos.Y() += nYAdvance;
             }
 
             hb_buffer_destroy(pHbBuffer);


More information about the Libreoffice-commits mailing list