⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 indic-ot.c

📁 GTK+-2.0源码之pango-1.15.6.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
	case CC_MODIFYING_MARK_ABOVE:	case CC_MODIFYING_MARK_POST:	case CC_NUKTA:	case CC_VIRAMA:	case CC_AL_LAKUNA:	    writeChar(&output, C_DOTTED_CIRCLE, prev, blwf_p);	    writeChar(&output, chars[prev], prev, blwf_p);	    break;	case CC_DEPENDENT_VOWEL:	    writeMpre(&output);	    writeChar(&output, C_DOTTED_CIRCLE, prev, blwf_p);	    writeMbelow(&output);	    writeMabove(&output);	    writeMpost(&output);	    writeLengthMark(&output);	    writeAlLakuna(&output);	    break;	case CC_CONSONANT:	case CC_CONSONANT_WITH_NUKTA:	{	    guint32 length = vmabove - prev;	    glong lastConsonant = vmabove - 1;	    glong baseLimit = prev;	    glong baseConsonant, postBase, postBaseLimit;	    gboolean seenVattu, seenBelowBaseForm, supressVattu;	    glong bcSpan;	    /* Check for REPH at front of syllable */	    if (length > 2 && indic_ot_is_reph(class_table, chars[prev]) && indic_ot_is_virama(class_table, chars[prev + 1])) {		baseLimit += 2;		/* Check for eyelash RA, if the script supports it */		if ((class_table->scriptFlags & SF_EYELASH_RA) != 0 &&		    chars[baseLimit] == C_SIGN_ZWJ) {		    if (length > 3) {			baseLimit += 1;		    } else {			baseLimit -= 2;		    }		}	    }	    while (lastConsonant > baseLimit && !indic_ot_is_consonant(class_table, chars[lastConsonant])) {		lastConsonant -= 1;	    }	    baseConsonant = lastConsonant;	    postBase = lastConsonant + 1;	    postBaseLimit = class_table->scriptFlags & SF_POST_BASE_LIMIT_MASK;	    seenVattu = false;	    seenBelowBaseForm = false;	    supressVattu = true;	    while (baseConsonant > baseLimit) {		IndicOTCharClass charClass = indic_ot_get_char_class(class_table, chars[baseConsonant]);		if (IS_CONSONANT(charClass)) {		    if (postBaseLimit == 0 || seenVattu ||			(baseConsonant > baseLimit && !indic_ot_is_virama(class_table, chars[baseConsonant - 1])) ||			!HAS_POST_OR_BELOW_BASE_FORM(charClass)) {			break;		    }		    seenVattu = IS_VATTU(charClass);		    if (HAS_POST_BASE_FORM(charClass)) {			if (seenBelowBaseForm) {			    break;			}			postBase = baseConsonant;		    } else if (HAS_BELOW_BASE_FORM(charClass)) {			seenBelowBaseForm = true;		    }		    postBaseLimit -= 1;		}		baseConsonant -= 1;	    }	    /* Write Mpre */	    writeMpre(&output);	    /* Write eyelash RA */	    /* NOTE: baseLimit == prev + 3 iff eyelash RA present... */	    if (baseLimit == prev + 3) {		writeChar(&output, chars[prev], prev, half_p);		writeChar(&output, chars[prev + 1], prev /*+ 1*/, half_p);		writeChar(&output, chars[prev + 2], prev /*+ 2*/, half_p);	    }	    /* write any pre-base consonants */	    supressVattu = true;	    for (i = baseLimit; i < baseConsonant; i += 1) {		gunichar ch = chars[i];		/* Applying blwf to the first consonant doesn't makes sense		 * since the below-form follows the consonant that it is		 * put under */		gulong tag = (i == baseLimit) ? half_p : blwf_p;		IndicOTCharClass charClass = indic_ot_get_char_class(class_table, ch);		if (IS_CONSONANT(charClass)) {		    if (IS_VATTU(charClass) && supressVattu) {			tag = nukt_p;		    }		    else if ((i + 2 < baseConsonant) && (chars[i + 2] == C_SIGN_ZWNJ)) {			tag = nukt_p;		    }		    supressVattu = IS_VATTU(charClass);		} else if (IS_VIRAMA(charClass) && chars[i + 1] == C_SIGN_ZWNJ)		{		    tag = nukt_p;		}		writeChar(&output, ch, /*i*/ prev, tag);	    }	    bcSpan = baseConsonant + 1;	    if (bcSpan < vmabove && indic_ot_is_nukta(class_table, chars[bcSpan])) {		bcSpan += 1;	    }	    if (baseConsonant == lastConsonant && bcSpan < vmabove && indic_ot_is_virama(class_table, chars[bcSpan])) {		bcSpan += 1;		if (bcSpan < vmabove && chars[bcSpan] == C_SIGN_ZWNJ) {		    bcSpan += 1;		}	    }	    /* note the base consonant for post-GSUB fixups */	    noteBaseConsonant(&output);	    /* write base consonant */	    for (i = baseConsonant; i < bcSpan; i += 1) {		writeChar(&output, chars[i], /*i*/ prev, nukt_p);	    }	    /* for the special conjuction of Cons+0x0d4d+0x0d31 or Cons+0x0d4d+0x0d30 of Malayalam */	    if ((baseConsonant - 2 >= 0) &&		(chars[baseConsonant - 1] == 0x0d4d) &&		((chars[baseConsonant] == 0x0d31) ||		 (chars[baseConsonant] == 0x0d30)) &&		((chars[baseConsonant - 2] >= 0x0d15) &&		 (chars[baseConsonant - 2] <= 0x0d39)))  {		swapChars (&output, -1, -3);		if (mpreFixups) {		    if (mpreFixups->fFixupCount > 0) {			mpreFixups->fFixupCount--;		    }		}	    }	    if ((class_table->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) {		gboolean is_for_0C48 = FALSE;		if (output.fOutChars != NULL) {  /*for 0x0C48 of Telugu*/		    int t;		    for (t = prev; t < syllable; t++) {			if (chars[t] == 0x0C48) {			    writeMabove(&output);			    writeMbelow(&output);			    writeMpost(&output);			    is_for_0C48 = TRUE;			    break;			}		    }		}		if (!is_for_0C48) {		    writeMbelow(&output);		    writeMabove(&output);		    writeMpost(&output);		}	    }	    /* write below-base consonants */	    if (baseConsonant != lastConsonant) {		for (i = bcSpan + 1; i < postBase; i += 1) {		    writeChar(&output, chars[i], /*i*/ prev, blwf_p);		}		if (postBase > lastConsonant) {		    /* write halant that was after base consonant */		    writeChar(&output, chars[bcSpan], /*bcSpan*/ prev, blwf_p);		}	    }	    /* write Mbelow, Mabove */	    if ((class_table->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) {		writeMbelow(&output);		writeMabove(&output);	    }	   if ((class_table->scriptFlags & SF_REPH_AFTER_BELOW) != 0) {		if (baseLimit == prev + 2) {		    writeChar(&output, chars[prev], prev, rphf_p);		    writeChar(&output, chars[prev + 1], prev /*+ 1*/, rphf_p);		}		/* write VMabove */		for (i = vmabove; i < vmpost; i += 1) {		    writeChar(&output, chars[i], /*i*/ prev, blwf_p);		}	    }	    /* write post-base consonants */	    if (baseConsonant != lastConsonant) {		if (postBase <= lastConsonant) {		    for (i = postBase; i <= lastConsonant; i += 1) {			writeChar(&output, chars[i], /*i*/ prev, pstf_p);		    }		    /* write halant that was after base consonant */		    writeChar(&output, chars[bcSpan], /*bcSpan*/ prev, blwf_p);		}		/* write the training halant, if there is one */		if (lastConsonant < matra && indic_ot_is_virama(class_table, chars[matra])) {		    writeChar(&output, chars[matra], /*matra*/ prev, nukt_p);		}	    }	    /* write Mpost */	    if ((class_table->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) {		writeMpost(&output);	    }	    writeLengthMark(&output);	    writeAlLakuna(&output);	    /* write reph */	    if ((class_table->scriptFlags & SF_REPH_AFTER_BELOW) == 0) {		if (baseLimit == prev + 2) {		    writeChar(&output, chars[prev], prev, rphf_p);		    writeChar(&output, chars[prev + 1], prev /*+ 1*/, rphf_p);		}		/* write VMabove */		for (i = vmabove; i < vmpost; i += 1) {		    writeChar(&output, chars[i], /*i*/ prev, blwf_p);		}	    }	    /* write VMpost */	    for (i = vmpost; i < syllable; i += 1) {		writeChar(&output, chars[i], /*i*/ prev, blwf_p);	    }	    break;	}	default:	    break;	}	prev = syllable;    }    if (outMPreFixups) {	*outMPreFixups = mpreFixups;    }    return getOutputIndex(&output);}

⌨️ 快捷键说明

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