Hey all,

FriBiDi released (a year and a half ago) a pretty stable new version which
is supposed to be fully ABI compatible with the previous one.
In this version they added support for Arabic shaping, which means we can
finally removed the incomplete Arabic shaping code I wrote
and just use the FriBidi one instead.

This patch does exactly that.

Arabic users will notice a big improvement in Arabic text rendering, the
rest will probably feel no change. This patch means we now depend
on FriBiDi 0.19.2 instead of 0.10.x which we needed up until now. I'm only
sending this patch now because I feel the new FriBiDi is stable enough
to depend on (and I'm not the only one, main distros have this version for a
while) but also because I forgot.

Sorry for you who had to wait,
cheers,
-- 
Tom.
Index: src/lib/engines/common/evas_intl/evas_intl_arabic.c
===================================================================
--- src/lib/engines/common/evas_intl/evas_intl_arabic.c	(revision 49929)
+++ src/lib/engines/common/evas_intl/evas_intl_arabic.c	(working copy)
@@ -1,316 +0,0 @@
-#include "../evas_intl_utils.h"
-
-#ifdef ARABIC_SUPPORT
-/* arabic contextualizing */
-
-/* arabic input forms */
-#define ARABIC_ALEPH_MADDA	0x0622
-#define ARABIC_ALEPH		0x0627
-#define ARABIC_BET		0x0628
-#define ARABIC_TA_MARBUTA	0x0629
-#define ARABIC_TAW		0x062A
-#define ARABIC_TA		0x062B
-#define ARABIC_GIMEL		0x062C
-#define ARABIC_HETH		0x062D
-#define ARABIC_HA		0x062E
-#define	ARABIC_DALET		0x062F
-#define ARABIC_DAL		0x0630
-#define ARABIC_RESH		0x0631
-#define ARABIC_ZAYIN		0x0632
-#define ARABIC_SHIN		0x0633
-#define ARABIC_SH		0x0634
-#define ARABIC_TSADE		0x0635
-#define ARABIC_DAD		0x0636
-#define ARABIC_TETH		0x0637
-#define ARABIC_ZA		0x0638
-#define ARABIC_AYIN		0x0639
-#define ARABIC_GHAIN		0x063A
-#define ARABIC_PE		0x0641
-#define ARABIC_QOPH		0x0642
-#define ARABIC_KAPH		0x0643
-#define ARABIC_LAMED		0x0644
-#define ARABIC_MEM		0x0645
-#define ARABIC_NUN		0x0646
-#define ARABIC_HE		0x0647
-#define ARABIC_WAW		0x0648
-#define ARABIC_ALEPH_MAQSURA	0x0649
-#define ARABIC_YODH		0x064A
-/* arabic contextual forms */
-#define ARABIC_ISOLATED_ALEPH_MADDA	0xFE81
-#define ARABIC_ISOLATED_ALEPH		0xFE8D
-#define ARABIC_ISOLATED_TA_MARBUTA	0xFE93
-#define ARABIC_ISOLATED_BET		0xFE8F
-#define ARABIC_ISOLATED_TAW		0xFE95
-#define ARABIC_ISOLATED_TA		0xFE99
-#define ARABIC_ISOLATED_GIMEL		0xFE9D
-#define ARABIC_ISOLATED_HETH		0xFEA1
-#define ARABIC_ISOLATED_HA		0xFEA5
-#define	ARABIC_ISOLATED_DALET		0xFEA9
-#define ARABIC_ISOLATED_DAL		0xFEAB
-#define ARABIC_ISOLATED_RESH		0xFEAD
-#define ARABIC_ISOLATED_ZAYIN		0xFEAF
-#define ARABIC_ISOLATED_SHIN		0xFEB1
-#define ARABIC_ISOLATED_SH		0xFEB5
-#define ARABIC_ISOLATED_TSADE		0xFEB9
-#define ARABIC_ISOLATED_DAD		0xFEBD
-#define ARABIC_ISOLATED_TETH		0xFEC1
-#define ARABIC_ISOLATED_ZA		0xFEC5
-#define ARABIC_ISOLATED_AYIN		0xFEC9
-#define ARABIC_ISOLATED_GHAIN		0xFECD
-#define ARABIC_ISOLATED_PE		0xFED1
-#define ARABIC_ISOLATED_QOPH		0xFED5
-#define ARABIC_ISOLATED_KAPH		0xFED9
-#define ARABIC_ISOLATED_LAMED		0xFEDD
-#define ARABIC_ISOLATED_MEM		0xFEE1
-#define ARABIC_ISOLATED_NUN		0xFEE5
-#define ARABIC_ISOLATED_HE		0xFEE9
-#define ARABIC_ISOLATED_WAW		0xFEED
-#define ARABIC_ISOLATED_ALEPH_MAQSURA	0xFEEF
-#define ARABIC_ISOLATED_YODH		0xFEF1
-
-#define ARABIC_IS_SPECIAL_LETTER(c)	((c) == ARABIC_ISOLATED_ALEPH ||  \
-      (c) == ARABIC_ISOLATED_DALET || \
-      (c) == ARABIC_ISOLATED_DAL ||   \
-      (c) == ARABIC_ISOLATED_RESH ||  \
-      (c) == ARABIC_ISOLATED_ZAYIN || \
-      (c) == ARABIC_ISOLATED_WAW  || \
-      (c) == ARABIC_ISOLATED_TA_MARBUTA)
-/* from the first to last (including all forms, and special cases
- * like aleph maqsura in some forms*/
-#define ARABIC_IS_CONTEXT(c)	(((c) >= ARABIC_ISOLATED_ALEPH && (c) <= ARABIC_ISOLATED_YODH + 3) || \
-      ((c) >= ARABIC_ISOLATED_ALEPH_MADDA && (c) <= ARABIC_ISOLATED_ALEPH_MADDA + 3) || \
-      (c) == 0xFBE8 || \
-      (c) == 0xFBE9)
-#define ARABIC_IS_LETTER(c)	ARABIC_IS_CONTEXT(c)
-/* used for arabic context logic */
-/* each value is the offset from the regular char in unicode */
-enum _ArabicContext {
-     ARABIC_CONTEXT_ISOLATED = 0,
-     ARABIC_CONTEXT_FINAL = 1,
-     ARABIC_CONTEXT_INITIAL = 2,
-     ARABIC_CONTEXT_MEDIAL = 3
-};
-typedef enum _ArabicContext ArabicContext;
-
-static FriBidiChar
-_evas_intl_arabic_isolated_to_context(FriBidiChar chr, ArabicContext context);
-
-static int
-_evas_intl_arabic_text_to_isolated(FriBidiChar *text);
-
-static FriBidiChar
-_evas_intl_arabic_general_to_isolated(FriBidiChar chr);
-
-/* FIXME: there are issues with text that's already in context
- * vowels support is needed (skip them when analysing context)*/
-int
-evas_intl_arabic_to_context(FriBidiChar *text)
-{
-   int i;
-   int len;
-   int start_of_context = 1; /* assume the first is special/non arabic */
-   int last_is_first = 0;
-   int last_letter = 0;
-
-   /* check for empty string */
-   if (!*text)
-     return 0;
-
-   len = _evas_intl_arabic_text_to_isolated(text);
-   /*FIXME: make it skip vowels */
-   for (i = 0; i < len; i++)
-     {
-	if (!ARABIC_IS_LETTER(text[i]))
-	  {
-	     /* mark so it won't be touched,
-	      * though start formating */
-	     if (last_letter && !start_of_context)
-	       {
-		  ArabicContext tmp = (last_is_first) ?
-		     ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
-		  text[i-1] = _evas_intl_arabic_isolated_to_context(
-			last_letter,
-			tmp);
-	       }
-	     last_is_first = 0;
-	     start_of_context = 1;
-	     last_letter = 0;
-	     continue;
-	  }
-	/* adjust the last letter */
-	last_letter = text[i];
-	if (ARABIC_IS_SPECIAL_LETTER(text[i]))
-	  {
-	     if (!start_of_context)
-	       text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_FINAL);
-	     /* else: leave isolated */
-
-	     start_of_context = 1;
-	     last_is_first = 0;
-	     continue;
-	  }
-
-	if (start_of_context)
-	  {
-	     text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_INITIAL);
-	     last_is_first = 1;
-	  }
-	else
-	  {
-	     text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_MEDIAL);
-	     last_is_first = 0;
-	  }
-	/* spceial chars don't get here. */
-	start_of_context = 0;
-
-     }
-   /* if it's arabic and not isolated, the last is always final */
-   i--;
-   if (last_letter && !start_of_context)
-     {
-	ArabicContext tmp = (last_is_first) ? ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
-	/* because it's medial atm, and should be isolated */
-	text[i] = _evas_intl_arabic_isolated_to_context(last_letter, tmp);
-     }
-
-   return len;
-}
-
-/* I wish I could think about a simpler way to do it.
- * Just match every word with it's isolated form */
-static FriBidiChar
-_evas_intl_arabic_general_to_isolated(FriBidiChar chr)
-{
-   switch (chr)
-     {
-      case ARABIC_ALEPH_MADDA:
-	 return ARABIC_ISOLATED_ALEPH_MADDA;
-
-      case ARABIC_ALEPH:
-	 return ARABIC_ISOLATED_ALEPH;
-
-      case ARABIC_TA_MARBUTA:
-	 return ARABIC_ISOLATED_TA_MARBUTA;
-
-      case ARABIC_BET:
-	 return ARABIC_ISOLATED_BET;
-
-      case ARABIC_TAW:
-	 return ARABIC_ISOLATED_TAW;
-
-      case ARABIC_TA:
-	 return ARABIC_ISOLATED_TA;
-
-      case ARABIC_GIMEL:
-	 return ARABIC_ISOLATED_GIMEL;
-
-      case ARABIC_HETH:
-	 return ARABIC_ISOLATED_HETH;
-
-      case ARABIC_HA:
-	 return ARABIC_ISOLATED_HA;
-
-      case ARABIC_DALET:
-	 return ARABIC_ISOLATED_DALET;
-
-      case ARABIC_DAL:
-	 return ARABIC_ISOLATED_DAL;
-
-      case ARABIC_RESH:
-	 return ARABIC_ISOLATED_RESH;
-
-      case ARABIC_ZAYIN:
-	 return ARABIC_ISOLATED_ZAYIN;
-
-      case ARABIC_SHIN:
-	 return ARABIC_ISOLATED_SHIN;
-
-      case ARABIC_SH:
-	 return ARABIC_ISOLATED_SH;
-
-      case ARABIC_TSADE:
-	 return ARABIC_ISOLATED_TSADE;
-
-      case ARABIC_DAD:
-	 return ARABIC_ISOLATED_DAD;
-
-      case ARABIC_TETH:
-	 return ARABIC_ISOLATED_TETH;
-
-      case ARABIC_ZA:
-	 return ARABIC_ISOLATED_ZA;
-
-      case ARABIC_AYIN:
-	 return ARABIC_ISOLATED_AYIN;
-
-      case ARABIC_GHAIN:
-	 return ARABIC_ISOLATED_GHAIN;
-
-      case ARABIC_PE:
-	 return ARABIC_ISOLATED_PE;
-
-      case ARABIC_QOPH:
-	 return ARABIC_ISOLATED_QOPH;
-
-      case ARABIC_KAPH:
-	 return ARABIC_ISOLATED_KAPH;
-
-      case ARABIC_LAMED:
-	 return ARABIC_ISOLATED_LAMED;
-
-      case ARABIC_MEM:
-	 return ARABIC_ISOLATED_MEM;
-
-      case ARABIC_NUN:
-	 return ARABIC_ISOLATED_NUN;
-
-      case ARABIC_HE:
-	 return ARABIC_ISOLATED_HE;
-
-      case ARABIC_WAW:
-	 return ARABIC_ISOLATED_WAW;
-
-      case ARABIC_ALEPH_MAQSURA:
-	 return ARABIC_ISOLATED_ALEPH_MAQSURA;
-
-      case ARABIC_YODH:
-	 return ARABIC_ISOLATED_YODH;
-      default:
-	 return chr;
-     }
-}
-
-static FriBidiChar
-_evas_intl_arabic_isolated_to_context(FriBidiChar chr, ArabicContext context)
-{
-   if (ARABIC_IS_SPECIAL_LETTER(chr))
-     {
-	if (context == ARABIC_CONTEXT_INITIAL)
-	  return chr;
-	else
-	  return chr + ARABIC_CONTEXT_FINAL;
-     }
-   /* HACK AROUND ALIF MAQSURA */
-   else if (chr == ARABIC_ISOLATED_ALEPH_MAQSURA && context > 1)
-     {
-	chr = 0xFBE8; /* the initial form */
-	context -= 2;
-     }
-   return chr + context;
-}
-
-static int
-_evas_intl_arabic_text_to_isolated(FriBidiChar *text)
-{
-   int i = 0;
-   while (*text)
-     {
-	/* if it's not arabic/it's already in context
-	 * it's just returned the same */
-	*text = _evas_intl_arabic_general_to_isolated(*text);
-	text++;
-	i++;
-     }
-   return i;
-}
-#endif
Index: src/lib/engines/common/evas_intl/evas_intl_arabic.h
===================================================================
--- src/lib/engines/common/evas_intl/evas_intl_arabic.h	(revision 49929)
+++ src/lib/engines/common/evas_intl/evas_intl_arabic.h	(working copy)
@@ -1,9 +0,0 @@
-#ifndef _EVAS_INTL_ARABIC
-#define _EVAS_INTL_ARABIC
-
-#include "evas_intl_utils.h"
-
-int
-evas_intl_arabic_to_context(EvasIntlChar *text);
-
-#endif
Index: src/lib/engines/common/evas_intl_utils.c
===================================================================
--- src/lib/engines/common/evas_intl_utils.c	(revision 49929)
+++ src/lib/engines/common/evas_intl_utils.c	(working copy)
@@ -91,10 +91,6 @@
  	 tmp_V_to_L_list = *position_V_to_L_list;
        }
 
-#ifdef ARABIC_SUPPORT
-   /* fix arabic context */
-   evas_intl_arabic_to_context(unicode_in);
-#endif
    LKL(fribidi_lock);
    if (!fribidi_log2vis(unicode_in, len, direction,
          unicode_out, tmp_L_to_V_list, tmp_V_to_L_list, tmp_level_list))
Index: src/lib/engines/common/evas_intl_utils.h
===================================================================
--- src/lib/engines/common/evas_intl_utils.h	(revision 49929)
+++ src/lib/engines/common/evas_intl_utils.h	(working copy)
@@ -20,13 +20,6 @@
 typedef FriBidiLevel	EvasIntlLevel;
 
 
-/* whether should fix arabic specifix issues */
-# define ARABIC_SUPPORT
-
-# ifdef ARABIC_SUPPORT
-#  include "evas_intl/evas_intl_arabic.h"
-# endif
-
 # define evas_intl_position_logical_to_visual(list, position) \
 		(list) ? list[position] : position;
 
Index: src/lib/engines/common/Makefile.am
===================================================================
--- src/lib/engines/common/Makefile.am	(revision 49929)
+++ src/lib/engines/common/Makefile.am	(working copy)
@@ -68,8 +68,6 @@
 evas_regionbuf.c \
 evas_pipe.c \
 evas_intl_utils.c \
-evas_intl/evas_intl_arabic.c \
-evas_intl/evas_intl_arabic.h \
 evas_map_image.c \
 evas_map_image.h
 
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to