summaryrefslogtreecommitdiff
path: root/modules/arabic/mulefont.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/arabic/mulefont.c')
-rw-r--r--modules/arabic/mulefont.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/modules/arabic/mulefont.c b/modules/arabic/mulefont.c
new file mode 100644
index 00000000..edb440a8
--- /dev/null
+++ b/modules/arabic/mulefont.c
@@ -0,0 +1,260 @@
+/* pango-arabic module
+ *
+ * (C) 2000 K. Koehler <koehler@or.uni-bonn.de>
+ *
+ * This file provides a mapping unicode <- mulefont
+ */
+
+
+#include <stdio.h>
+#include <glib.h>
+#include "pango.h"
+#include "pangox.h"
+#include "utils.h"
+#include <unicode.h>
+
+/* #define DEBUG */
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+
+
+int
+arabic_muleinit(PangoFont *font,PangoXSubfont* mulefonts)
+{
+ static char *mule_charsets0[] = {
+ "mulearabic-0",
+ };
+
+ static char *mule_charsets1[] = {
+ "mulearabic-1",
+ };
+
+ static char *mule_charsets2[] = {
+ "mulearabic-2",
+ };
+ PangoXSubfont *subfonts;
+ int *subfont_charsets;
+ int n_subfonts;
+
+ n_subfonts = pango_x_list_subfonts (font,mule_charsets0,
+ 1, &subfonts, &subfont_charsets);
+ if (n_subfonts > 0)
+ mulefonts[0] = subfonts[0];
+ g_free (subfonts);
+ g_free (subfont_charsets);
+
+ n_subfonts = pango_x_list_subfonts (font,mule_charsets1,
+ 1, &subfonts, &subfont_charsets);
+ if (n_subfonts > 0)
+ {
+ mulefonts[1] = subfonts[0];
+ g_free (subfonts);
+ g_free (subfont_charsets);
+ }
+ else
+ {
+ g_free (subfonts);
+ g_free (subfont_charsets);
+ return 0;
+ }
+
+ n_subfonts = pango_x_list_subfonts (font,mule_charsets2,
+ 1, &subfonts, &subfont_charsets);
+ if (n_subfonts > 0)
+ {
+ mulefonts[2] = subfonts[0];
+ g_free (subfonts);
+ g_free (subfont_charsets);
+ }
+ else
+ {
+ g_free (subfonts);
+ g_free (subfont_charsets);
+ return 0;
+ }
+
+ return 1;
+}
+
+
+typedef struct {
+ GUChar4 unicodechar;
+ int fontindex;
+ int charindex;
+} fontentry;
+
+
+static fontentry charmap [] =
+{
+ { 0xFE80,1,0x2d }, /* HAMZA; handle seperately !!! */
+ { 0xFE81,1,0x2e }, /* ALIF MADDA */
+ { 0xFE82,1,0x2f },
+ { 0xFE83,1,0x30 }, /* ALIF HAMZA */
+ { 0xFE84,1,0x31 },
+ { 0xFE85,1,0x32 }, /* WAW HAMZA */
+ { 0xFE86,1,0x33 },
+ { 0xFE87,1,0x34 }, /* ALIF IHAMZA */
+ { 0xFE88,1,0x35 },
+ { 0xFE89,2,0x21 }, /* YA HAMZA */
+ { 0xFE8A,2,0x22 },
+ { 0xFE8B,1,0x36 }, /* HMAZA-'pod' */
+ { 0xFE8C,1,0x37 },
+ { 0xFE8D,1,0x38 }, /* ALIF */
+ { 0xFE8E,1,0x39 },
+ { 0xFE8F,2,0x23 }, /* BA */
+ { 0xFE90,2,0x24 },
+ { 0xFE91,1,0x3A },
+ { 0xFE92,1,0x3B },
+ { 0xFE93,1,0x3C }, /* TA MARBUTA */
+ { 0xFE94,1,0x3D },
+ { 0xFE95,2,0x25 }, /* TA */
+ { 0xFE96,2,0x26 },
+ { 0xFE97,1,0x3E },
+ { 0xFE98,1,0x3F },
+ { 0xFE99,2,0x27 }, /* THA */
+ { 0xFE9A,2,0x28 },
+ { 0xFE9B,1,0x40 },
+ { 0xFE9C,1,0x41 },
+ { 0xFE9D,2,0x29 }, /* DJIM */
+ { 0xFE9E,2,0x2C },
+ { 0xFE9F,2,0x2A },
+ { 0xFEA0,2,0x2B },
+ { 0xFEA1,2,0x2D }, /* .HA */
+ { 0xFEA2,2,0x30 },
+ { 0xFEA3,2,0x2E },
+ { 0xFEA4,2,0x2F },
+ { 0xFEA5,2,0x31 }, /* CHA */
+ { 0xFEA6,2,0x34 },
+ { 0xFEA7,2,0x32 },
+ { 0xFEA8,2,0x33 },
+ { 0xFEA9,1,0x42 }, /* DAL */
+ { 0xFEAA,1,0x43 },
+ { 0xFEAB,1,0x44 }, /* THAL */
+ { 0xFEAC,1,0x45 },
+ { 0xFEAD,1,0x46 }, /* RA */
+ { 0xFEAE,1,0x47 },
+ { 0xFEAF,1,0x48 }, /* ZAY */
+ { 0xFEB0,1,0x49 },
+ { 0xFEB1,2,0x35 }, /* SIN */
+ { 0xFEB2,2,0x38 },
+ { 0xFEB3,2,0x36 },
+ { 0xFEB4,2,0x37 },
+ { 0xFEB5,2,0x39 }, /* SHIN */
+ { 0xFEB2,2,0x3C },
+ { 0xFEB3,2,0x3A },
+ { 0xFEB4,2,0x3B },
+ { 0xFEB9,2,0x3D }, /* SAAD */
+ { 0xFEBA,2,0x40 },
+ { 0xFEBB,2,0x3E },
+ { 0xFEBC,2,0x3F },
+ { 0xFEBD,2,0x41 }, /* DAAD */
+ { 0xFEBE,2,0x44 },
+ { 0xFEBF,2,0x42 },
+ { 0xFEC0,2,0x43 },
+ { 0xFEC1,2,0x45 }, /* .TA */
+ { 0xFEC2,2,0x48 },
+ { 0xFEC3,2,0x46 },
+ { 0xFEC4,2,0x47 },
+ { 0xFEC5,2,0x49 }, /* .ZA */
+ { 0xFEC6,2,0x4C },
+ { 0xFEC7,2,0x4A },
+ { 0xFEC8,2,0x4B },
+ { 0xFEC9,2,0x4D }, /* AIN */
+ { 0xFECA,2,0x4E },
+ { 0xFECB,1,0x4A },
+ { 0xFECC,1,0x4B },
+ { 0xFECD,2,0x4F }, /* RAIN */
+ { 0xFECE,2,0x50 },
+ { 0xFECF,1,0x4C },
+ { 0xFED0,1,0x4D },
+ { 0xFED1,2,0x51 }, /* FA */
+ { 0xFED2,2,0x52 },
+ { 0xFED3,1,0x4E },
+ { 0xFED4,1,0x4F },
+ { 0xFED5,2,0x53 }, /* QAF */
+ { 0xFED6,2,0x54 },
+ { 0xFED7,1,0x50 },
+ { 0xFEB8,1,0x51 },
+ { 0xFED9,2,0x55 }, /* KAF */
+ { 0xFEDA,2,0x58 },
+ { 0xFEDB,2,0x56 },
+ { 0xFEDC,2,0x57 },
+ { 0xFEDD,2,0x59 }, /* LAM */
+ { 0xFEDE,2,0x5A },
+ { 0xFEDF,1,0x52 },
+ { 0xFEE0,1,0x53 },
+ { 0xFEE1,1,0x54 }, /* MIM */
+ { 0xFEE2,1,0x57 },
+ { 0xFEE3,1,0x55 },
+ { 0xFEE4,1,0x56 },
+ { 0xFEE5,2,0x5B }, /* NUN */
+ { 0xFEE6,2,0x5C },
+ { 0xFEE7,1,0x58 },
+ { 0xFEE8,1,0x59 },
+ { 0xFEE9,1,0x5A }, /* HA */
+ { 0xFEEA,1,0x5D },
+ { 0xFEEB,1,0x5B },
+ { 0xFEEC,1,0x5C },
+ { 0xFEED,1,0x5E }, /* WAW */
+ { 0xFEEE,1,0x5F },
+ { 0xFEEF,2,0x5D }, /* ALIF MAQSORA */
+ { 0xFEF0,2,0x5E },
+ { 0xFEF1,2,0x5F }, /* YA */
+ { 0xFEF2,2,0x60 },
+ { 0xFEF3,1,0x60 },
+ { 0xFEF4,1,0x61 },
+ { 0xFEF5,1,0x62 }, /* Lam-Alif Madda */
+ { 0xFEF6,2,0x61 },
+ { 0xFEF7,1,0x63 }, /* Lam-Alif Hamza*/
+ { 0xFEF8,2,0x62 },
+ { 0xFEF9,1,0x64 }, /* Lam-Alif iHamza*/
+ { 0xFEFA,2,0x63 },
+ { 0xFEFB,1,0x65 }, /* Lam-Alif */
+ { 0xFEFC,2,0x64 }
+};
+
+void
+arabic_mule_recode(PangoXSubfont* subfont,int* glyph,PangoXSubfont* mulefonts)
+{
+ int letter=*glyph;
+ if ((letter >= 0x660)&&(letter <= 0x669)) /* indic numeral */
+ {
+ *subfont = mulefonts[0];
+ *glyph = letter - 0x660 + 0x21;
+ }
+ else if ((letter >= 0xFE80)&&(letter <= 0xFEFC))
+ { /* now we have a mess ... a big mess ... */
+ /* The mule 'idea' is that "wide" forms are in the -2 font, whereas
+ * narrow one are in the -1 font.
+ * to conserve space, the characters are all ordered in a big lump.
+ * emacs can't handle it ...
+ */
+#ifdef DEBUG
+ if (charmap[letter-0xFE80].unicodechar != letter)
+ {
+ fprintf(stderr,"[ar] mulefont charmap table defect "
+ "%x comes out as %x ",
+ letter,charmap[letter-0xFE80].unicodechar);
+ }
+#endif
+ *subfont = mulefonts[charmap[letter-0xFE80].fontindex];
+ *glyph = charmap[letter-0xFE80].charindex;
+ }
+ else if (letter == 0x621)
+ {
+ *subfont = mulefonts[charmap[0].fontindex];
+ *glyph = charmap[0].charindex;
+ }
+ else
+ {
+ *subfont = mulefonts[charmap[1].fontindex];
+ *glyph = 0x20; /* we don't have this thing -- use a space */
+ /* This has to be something that does not print anything !! */
+ }
+}
+
+
+
+