From 83d9c5562c27b5f766157eba70bebd320463a0af Mon Sep 17 00:00:00 2001 From: navin patidar Date: Sun, 7 Apr 2013 11:47:01 +0300 Subject: fix fdo#60534 : use DefaultCharMapper::mapChar() to map RTL string unicodes. Use DefaultCharMapper::mapChar() to map RTL string unicodes to their mirror compatible unicodes. Change-Id: I5bd2fd18bf96c49bbdf2be521a9cf28c311c7a09 Reviewed-on: https://gerrit.libreoffice.org/3221 Reviewed-by: Miklos Vajna Tested-by: Miklos Vajna --- vcl/inc/graphite_layout.hxx | 1 + vcl/source/glyphs/graphite_layout.cxx | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/vcl/inc/graphite_layout.hxx b/vcl/inc/graphite_layout.hxx index bbf6f15b2fe5..fa6d25c340a5 100644 --- a/vcl/inc/graphite_layout.hxx +++ b/vcl/inc/graphite_layout.hxx @@ -97,6 +97,7 @@ public: private: const gr_face * mpFace; // not owned by layout gr_font * mpFont; // not owned by layout + sal_Unicode * mpStr; int mnSegCharOffset; // relative to ImplLayoutArgs::mpStr long mnWidth; std::vector mvChar2BaseGlyph; diff --git a/vcl/source/glyphs/graphite_layout.cxx b/vcl/source/glyphs/graphite_layout.cxx index 8b19c31eeec7..3e3c3291fb30 100644 --- a/vcl/source/glyphs/graphite_layout.cxx +++ b/vcl/source/glyphs/graphite_layout.cxx @@ -48,6 +48,7 @@ #include #include +#include // Graphite Libraries (must be after vcl headers on windows) #include @@ -490,6 +491,7 @@ GraphiteLayout::GraphiteLayout(const gr_face * face, gr_font * font, const grutils::GrFeatureParser * pFeatures) throw() : mpFace(face), mpFont(font), + mpStr(NULL), mnWidth(0), mfScaling(1.0), mpFeatures(pFeatures) @@ -501,6 +503,7 @@ GraphiteLayout::~GraphiteLayout() throw() { clear(); // the features and font are owned by the platform layers + delete[] mpStr; mpFeatures = NULL; mpFont = NULL; } @@ -591,12 +594,28 @@ gr_segment * GraphiteLayout::CreateSegment(ImplLayoutArgs& rArgs) } size_t numchars = gr_count_unicode_characters(gr_utf16, rArgs.mpStr + mnSegCharOffset, rArgs.mpStr + (rArgs.mnLength > limit + 64 ? limit + 64 : rArgs.mnLength), NULL); + + mpStr = new sal_Unicode[rArgs.mnLength+1]; + if(mpStr) + memcpy(mpStr, rArgs.mpStr, (rArgs.mnLength+1)*2); + + if (bRtl && mpStr) + { + DefaultCharMapper cmap(true, bRtl); + int i=0; + while(rArgs.mpStr[i]) + { + mpStr[i]=(sal_Unicode) cmap.mapChar((sal_uInt32)rArgs.mpStr[i]); + i++; + } + } + if (mpFeatures) pSegment = gr_make_seg(mpFont, mpFace, 0, mpFeatures->values(), gr_utf16, - rArgs.mpStr + mnSegCharOffset, numchars, bRtl); + mpStr + mnSegCharOffset, numchars, bRtl); else pSegment = gr_make_seg(mpFont, mpFace, 0, NULL, gr_utf16, - rArgs.mpStr + mnSegCharOffset, numchars, bRtl); + mpStr + mnSegCharOffset, numchars, bRtl); //pSegment = new gr::RangeSegment((gr::Font *)&mrFont, mpTextSrc, &maLayout, mnMinCharPos, limit); if (pSegment != NULL) -- cgit