diff options
Diffstat (limited to 'modules/arabic/mulefont.c')
-rw-r--r-- | modules/arabic/mulefont.c | 260 |
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 !! */ + } +} + + + + |