diff options
author | navin patidar <patidar@kacst.edu.sa> | 2013-04-07 11:47:01 +0300 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2013-04-08 08:10:00 +0000 |
commit | 83d9c5562c27b5f766157eba70bebd320463a0af (patch) | |
tree | 0691841efca929d443b735a12dbe589eea949219 | |
parent | 03765ec86bd3edfc116e1ff44c277d3cf1b79775 (diff) |
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 <vmiklos@suse.cz>
Tested-by: Miklos Vajna <vmiklos@suse.cz>
-rw-r--r-- | vcl/inc/graphite_layout.hxx | 1 | ||||
-rw-r--r-- | 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<int> 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 <unicode/ubidi.h> #include <unicode/uscript.h> +#include <layout/DefaultCharMapper.h> // Graphite Libraries (must be after vcl headers on windows) #include <graphite2/Segment.h> @@ -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) |