summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornavin patidar <patidar@kacst.edu.sa>2013-04-07 11:47:01 +0300
committerMiklos Vajna <vmiklos@suse.cz>2013-04-08 08:10:00 +0000
commit83d9c5562c27b5f766157eba70bebd320463a0af (patch)
tree0691841efca929d443b735a12dbe589eea949219
parent03765ec86bd3edfc116e1ff44c277d3cf1b79775 (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.hxx1
-rw-r--r--vcl/source/glyphs/graphite_layout.cxx23
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)