]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Shape arabic code when on UTF-8 visual
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 29 Mar 2010 01:37:24 +0000 (03:37 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 29 Mar 2010 01:37:24 +0000 (03:37 +0200)
include/grub/unicode.h
normal/charset.c
normal/term.c

index 9fde69cc8c5773e195068038e8eb7f74d061b125..a779e2c9c32581bcc2e45f7746104a8b44ebef82 100644 (file)
@@ -222,5 +222,7 @@ grub_unicode_glyph_from_code (grub_uint32_t code)
 
 grub_uint32_t
 grub_unicode_mirror_code (grub_uint32_t in);
+grub_uint32_t
+grub_unicode_shape_code (grub_uint32_t in, grub_uint8_t attr);
 
 #endif
index 55a9894a93f6de581f50d95375fc74eda1379e90..6f09fac90a81ee33bbbc06af14d36d63902e4476 100644 (file)
@@ -1227,3 +1227,39 @@ grub_unicode_mirror_code (grub_uint32_t in)
       return grub_unicode_bidi_pairs[i].replace;
   return in;
 }
+
+grub_uint32_t
+grub_unicode_shape_code (grub_uint32_t in, grub_uint8_t attr)
+{
+  int i;
+  if (!(in >= GRUB_UNICODE_ARABIC_START
+       && in < GRUB_UNICODE_ARABIC_END))
+    return in;
+
+  for (i = 0; grub_unicode_arabic_shapes[i].code; i++)
+    if (grub_unicode_arabic_shapes[i].code == in)
+      {
+       grub_uint32_t out;
+       switch (attr & (GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED
+                       | GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED))
+         {
+         case 0:
+           out = grub_unicode_arabic_shapes[i].isolated;
+           break;
+         case GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED:
+           out = grub_unicode_arabic_shapes[i].right_linked;
+           break;
+         case GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED:
+           out = grub_unicode_arabic_shapes[i].left_linked;
+           break;
+         case GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED
+           |GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED:
+           out = grub_unicode_arabic_shapes[i].both_linked;
+           break;
+         }
+       if (out)
+         return out;
+      }
+
+  return in;
+}
index 09299f647e58b969dbcd61fe7f63fff5538f8169..4724c5d4120ab725087ae99e2870f20049a6ef41 100644 (file)
@@ -392,9 +392,12 @@ putglyph (const struct grub_unicode_glyph *c, struct grub_term_output *term)
            {
              code = c->base;
              if ((term->flags & GRUB_TERM_CODE_TYPE_MASK)
-                 == GRUB_TERM_CODE_TYPE_UTF8_VISUAL
-                 && (c->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR))
-               code = grub_unicode_mirror_code (code);
+                 == GRUB_TERM_CODE_TYPE_UTF8_VISUAL)
+               {
+                 if ((c->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR))
+                   code = grub_unicode_mirror_code (code);
+                 code = grub_unicode_shape_code (code, c->attributes);
+               }
            }
          else
            code = c->combining[i].code;