sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "LEGlyphStorage.h" sl@0: #include "CanonShaping.h" sl@0: #include "GlyphDefinitionTables.h" sl@0: #include "ClassDefinitionTables.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: void CanonShaping::sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit) sl@0: { sl@0: for (le_int32 j = index + 1; j < limit; j += 1) { sl@0: le_int32 i; sl@0: le_int32 v = indices[j]; sl@0: le_int32 c = combiningClasses[v]; sl@0: sl@0: for (i = j - 1; i >= index; i -= 1) { sl@0: if (c >= combiningClasses[indices[i]]) { sl@0: break; sl@0: } sl@0: sl@0: indices[i + 1] = indices[i]; sl@0: } sl@0: sl@0: indices[i + 1] = v; sl@0: } sl@0: } sl@0: sl@0: void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, sl@0: LEUnicode *outChars, LEGlyphStorage &glyphStorage) sl@0: { sl@0: const GlyphDefinitionTableHeader *gdefTable = (const GlyphDefinitionTableHeader *) glyphDefinitionTable; sl@0: const ClassDefinitionTable *classTable = gdefTable->getMarkAttachClassDefinitionTable(); sl@0: le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); sl@0: le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); sl@0: LEErrorCode status = LE_NO_ERROR; sl@0: le_int32 i; sl@0: sl@0: for (i = 0; i < charCount; i += 1) { sl@0: combiningClasses[i] = classTable->getGlyphClass((LEGlyphID) inChars[i]); sl@0: indices[i] = i; sl@0: } sl@0: sl@0: for (i = 0; i < charCount; i += 1) { sl@0: if (combiningClasses[i] != 0) { sl@0: le_int32 mark; sl@0: sl@0: for (mark = i; mark < charCount; mark += 1) { sl@0: if (combiningClasses[mark] == 0) { sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sortMarks(indices, combiningClasses, i, mark); sl@0: } sl@0: } sl@0: sl@0: le_int32 out = 0, dir = 1; sl@0: sl@0: if (rightToLeft) { sl@0: out = charCount - 1; sl@0: dir = -1; sl@0: } sl@0: sl@0: for (i = 0; i < charCount; i += 1, out += dir) { sl@0: le_int32 index = indices[i]; sl@0: sl@0: outChars[i] = inChars[index]; sl@0: glyphStorage.setCharIndex(out, index, status); sl@0: } sl@0: sl@0: LE_DELETE_ARRAY(indices); sl@0: LE_DELETE_ARRAY(combiningClasses); sl@0: } sl@0: sl@0: U_NAMESPACE_END