[Libreoffice-commits] core.git: vcl/inc vcl/source

navin patidar patidar at kacst.edu.sa
Mon Apr 8 01:10:19 PDT 2013


 vcl/inc/graphite_layout.hxx           |    1 +
 vcl/source/glyphs/graphite_layout.cxx |   23 +++++++++++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

New commits:
commit 83d9c5562c27b5f766157eba70bebd320463a0af
Author: navin patidar <patidar at kacst.edu.sa>
Date:   Sun Apr 7 11:47:01 2013 +0300

    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 at suse.cz>
    Tested-by: Miklos Vajna <vmiklos at suse.cz>

diff --git a/vcl/inc/graphite_layout.hxx b/vcl/inc/graphite_layout.hxx
index bbf6f15..fa6d25c 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 8b19c31..3e3c329 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)


More information about the Libreoffice-commits mailing list