📄 arabicligaturizer.java
字号:
/* 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;
if ((options & DIGITS_MASK) != 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -