vcl/source/gdi/CommonSalLayout.cxx | 41 ++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-)
New commits: commit 279407d78c43da63ee88639f00482b1ea703f363 Author: Khaled Hosny <[email protected]> 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); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
