Kaydet (Commit) de2aeef3 authored tarafından Mark Hung's avatar Mark Hung Kaydeden (comit) Andras Timar

Fix tdf#40091 and tdf#40335 text layout issues.

tdf#40091 Vertical writing inferior to MS Word
tdf#40335 Using Right-to-left (vertical) for text, the characters
overlap each other. Cursor is placed at the half of the character.

It seems that current implementation use HarfBuzz OpenType layout
API hb_buffer_get_glyph_positions() to layout the text, however
instead of setting text direction to HB_DIRECTION_TTB, it
uses HB_DIRECTION_LTR as its direction and rotates each CJK glyph
to simulate the HB_DIRECTION_TTB. However the API use font width
to position each glyph no matter whether the glyph will be rotated
or not.

Change-Id: Ie35238dd92218f8c4463c0ae1d356ad8609c5f48
Reviewed-on: https://gerrit.libreoffice.org/17774Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNorbert Thiebaud <nthiebaud@gmail.com>
Reviewed-on: https://gerrit.libreoffice.org/18878Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
(cherry picked from commit a4532151)
üst 663dff81
......@@ -402,6 +402,7 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
// allocate temporary arrays, note: round to even
int nGlyphCapacity = (3 * (rArgs.mnEndCharPos - rArgs.mnMinCharPos) | 15) + 1;
int32_t nVirtAdv = int32_t(aFtFace->size->metrics.height*rFont.GetStretch())>>6;
rLayout.Reserve(nGlyphCapacity);
......@@ -563,6 +564,8 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, 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;
if ( nGlyphIndex & GF_ROTMASK )
nXAdvance = nVirtAdv;
Point aNewPos = Point(aCurrPos.X() + nXOffset, -(aCurrPos.Y() + nYOffset));
const GlyphItem aGI(nCharPos, nGlyphIndex, aNewPos, nGlyphFlags, nXAdvance, nXOffset, nYOffset);
......
......@@ -185,6 +185,7 @@ public:
const unsigned char* GetTable( const char* pName, sal_uLong* pLength );
int GetEmUnits() const { return maFaceFT->units_per_EM;}
const FT_Size_Metrics& GetMetricsFT() const { return maSizeFT->metrics; }
double GetStretch() { return mfStretch; }
const FontCharMapPtr GetFontCharMap() const;
bool GetFontCapabilities(vcl::FontCapabilities &) const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment