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 + -
显示快捷键?