arabicligaturizer.java

来自「有关对pdf操作的代码」· Java 代码 · 共 775 行 · 第 1/3 页

JAVA
775
字号
    // return len    static void doublelig(StringBuffer string, int level)    /* Ok. We have presentation ligatures in our font. */    {        int len;        int olen = len = string.length();        int j = 0, si = 1;        char lapresult;                while (si < olen) {            lapresult = 0;            if ((level & ar_composedtashkeel) != 0) {                switch (string.charAt(j)) {                    case SHADDA:                        switch (string.charAt(si)) {                            case KASRA:                                lapresult = 0xFC62;                                break;                            case FATHA:                                lapresult = 0xFC60;                                break;                            case DAMMA:                                lapresult = 0xFC61;                                break;                            case 0x064C:                                lapresult = 0xFC5E;                                break;                            case 0x064D:                                lapresult = 0xFC5F;                                break;                        }                        break;                    case KASRA:                        if (string.charAt(si) == SHADDA)                            lapresult = 0xFC62;                        break;                    case FATHA:                        if (string.charAt(si) == SHADDA)                            lapresult = 0xFC60;                        break;                    case DAMMA:                        if (string.charAt(si) == SHADDA)                            lapresult = 0xFC61;                        break;                }            }                        if ((level & ar_lig) != 0) {                switch (string.charAt(j)) {                    case 0xFEDF:       /* LAM initial */                        switch (string.charAt(si)) {                            case 0xFE9E:                                lapresult = 0xFC3F;                                break;        /* JEEM final */                            case 0xFEA0:                                lapresult = 0xFCC9;                                break;        /* JEEM medial */                            case 0xFEA2:                                lapresult = 0xFC40;                                break;        /* HAH final */                            case 0xFEA4:                                lapresult = 0xFCCA;                                break;        /* HAH medial */                            case 0xFEA6:                                lapresult = 0xFC41;                                break;        /* KHAH final */                            case 0xFEA8:                                lapresult = 0xFCCB;                                break;        /* KHAH medial */                            case 0xFEE2:                                lapresult = 0xFC42;                                break;        /* MEEM final */                            case 0xFEE4:                                lapresult = 0xFCCC;                                break;        /* MEEM medial */                        }                        break;                    case 0xFE97:       /* TEH inital */                        switch (string.charAt(si)) {                            case 0xFEA0:                                lapresult = 0xFCA1;                                break;        /* JEEM medial */                            case 0xFEA4:                                lapresult = 0xFCA2;                                break;        /* HAH medial */                            case 0xFEA8:                                lapresult = 0xFCA3;                                break;        /* KHAH medial */                        }                        break;                    case 0xFE91:       /* BEH inital */                        switch (string.charAt(si)) {                            case 0xFEA0:                                lapresult = 0xFC9C;                                break;        /* JEEM medial */                            case 0xFEA4:                                lapresult = 0xFC9D;                                break;        /* HAH medial */                            case 0xFEA8:                                lapresult = 0xFC9E;                                break;        /* KHAH medial */                        }                        break;                    case 0xFEE7:       /* NOON inital */                        switch (string.charAt(si)) {                            case 0xFEA0:                                lapresult = 0xFCD2;                                break;        /* JEEM initial */                            case 0xFEA4:                                lapresult = 0xFCD3;                                break;        /* HAH medial */                            case 0xFEA8:                                lapresult = 0xFCD4;                                break;        /* KHAH medial */                        }                        break;                                            case 0xFEE8:       /* NOON medial */                        switch (string.charAt(si)) {                            case 0xFEAE:                                lapresult = 0xFC8A;                                break;        /* REH final  */                            case 0xFEB0:                                lapresult = 0xFC8B;                                break;        /* ZAIN final */                        }                        break;                    case 0xFEE3:       /* MEEM initial */                        switch (string.charAt(si)) {                            case 0xFEA0:                                lapresult = 0xFCCE;                                break;        /* JEEM medial */                            case 0xFEA4:                                lapresult = 0xFCCF;                                break;        /* HAH medial */                            case 0xFEA8:                                lapresult = 0xFCD0;                                break;        /* KHAH medial */                            case 0xFEE4:                                lapresult = 0xFCD1;                                break;        /* MEEM medial */                        }                        break;                                            case 0xFED3:       /* FEH initial */                        switch (string.charAt(si)) {                            case 0xFEF2:                                lapresult = 0xFC32;                                break;        /* YEH final */                        }                        break;                                            default:                        break;                }                   /* end switch string[si] */            }            if (lapresult != 0) {                string.setCharAt(j, lapresult);                len--;                si++;                 /* jump over one character */                /* we'll have to change this, too. */            }            else {                j++;                string.setCharAt(j, string.charAt(si));                si++;            }        }        string.setLength(len);    }    static boolean connects_to_left(charstruct a) {        return a.numshapes > 2;    }        static void shape(char text[], StringBuffer string, int level) {  /* string is assumed to be empty and big enough.   * text is the original text.   * This routine does the basic arabic reshaping.   * *len the number of non-null characters.   *   * Note: We have to unshape each character first!   */        int join;        int which;        char nextletter;                int p = 0;                     /* initialize for output */        charstruct oldchar = new charstruct();        charstruct curchar = new charstruct();        while (p < text.length) {            nextletter = text[p++];            //nextletter = unshape (nextletter);                        join = ligature(nextletter, curchar);            if (join == 0) {                       /* shape curchar */                int nc = shapecount(nextletter);                //(*len)++;                if (nc == 1) {                    which = 0;        /* final or isolated */                }                else {                    which = 2;        /* medial or initial */                }                if (connects_to_left(oldchar)) {                    which++;                }                                which = which % (curchar.numshapes);                curchar.basechar = charshape(curchar.basechar, which);                                /* get rid of oldchar */                copycstostring(string, oldchar, level);                oldchar = curchar;    /* new values in oldchar */                                /* init new curchar */                curchar = new charstruct();                curchar.basechar = nextletter;                curchar.numshapes = nc;                curchar.lignum++;                //          (*len) += unligature (&curchar, level);            }            else if (join == 1) {            }            //      else            //        {            //          (*len) += unligature (&curchar, level);            //        }            //      p = g_utf8_next_char (p);        }                /* Handle last char */        if (connects_to_left(oldchar))            which = 1;        else            which = 0;        which = which % (curchar.numshapes);        curchar.basechar = charshape(curchar.basechar, which);                /* get rid of oldchar */        copycstostring(string, oldchar, level);        copycstostring(string, curchar, level);    }    static int arabic_shape(char src[], int srcoffset, int srclength, char dest[], int destoffset, int destlength, int level) {        char str[] = new char[srclength];        for (int k = srclength + srcoffset - 1; k >= srcoffset; --k)            str[k - srcoffset] = src[k];        StringBuffer string = new StringBuffer(srclength);        shape(str, string, level);        if ((level & (ar_composedtashkeel | ar_lig)) != 0)            doublelig(string, level);//        string.reverse();        System.arraycopy(string.toString().toCharArray(), 0, dest, destoffset, string.length());        return string.length();    }    static void processNumbers(char text[], int offset, int length, int options) {        int limit = offset + length;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?