summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam')
-rw-r--r--Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam398
1 files changed, 398 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam b/Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam
new file mode 100644
index 00000000000..8462a7087b8
--- /dev/null
+++ b/Build/source/libs/icu/icu-49.1-PATCHES/patch-40-auxParam
@@ -0,0 +1,398 @@
+diff -ur icu-49.rc.orig/source/layout/AlternateSubstSubtables.cpp icu-49.rc/source/layout/AlternateSubstSubtables.cpp
+--- icu-49.rc.orig/source/layout/AlternateSubstSubtables.cpp 2012-03-02 23:14:52.000000000 +0100
++++ icu-49.rc/source/layout/AlternateSubstSubtables.cpp 2012-03-03 17:32:24.000000000 +0100
+@@ -27,13 +27,19 @@
+ Offset alternateSetTableOffset = SWAPW(alternateSetTableOffsetArray[coverageIndex]);
+ const AlternateSetTable *alternateSetTable =
+ (const AlternateSetTable *) ((char *) this + alternateSetTableOffset);
+- TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]);
++ le_int32 altIndex = glyphIterator->getFeatureParam();
+
+- if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) {
+- glyphIterator->setCurrGlyphID(SWAPW(alternateSetTable->alternateArray[0]));
++ if (altIndex < SWAPW(alternateSetTable->glyphCount)) {
++ TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[altIndex]);
++
++ if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate))) {
++ glyphIterator->setCurrGlyphID(alternate);
++ }
++
++ return 1;
+ }
+
+- return 1;
++ // feature param was out of range for the glyph
+ }
+
+ // XXXX If we get here, the table's mal-formed...
+diff -ur icu-49.rc.orig/source/layout/GlyphIterator.cpp icu-49.rc/source/layout/GlyphIterator.cpp
+--- icu-49.rc.orig/source/layout/GlyphIterator.cpp 2012-03-02 23:14:52.000000000 +0100
++++ icu-49.rc/source/layout/GlyphIterator.cpp 2012-03-03 17:32:24.000000000 +0100
+@@ -19,7 +19,7 @@
+ FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
+ : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
+ glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
+- srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
++ srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), featureParam(0), glyphGroup(0),
+ glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL)
+
+ {
+@@ -53,12 +53,13 @@
+ destIndex = that.destIndex;
+ lookupFlags = that.lookupFlags;
+ featureMask = that.featureMask;
++ featureParam = that.featureParam;
+ glyphGroup = that.glyphGroup;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+ }
+
+-GlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask)
++GlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask, le_int32 newFeatureParam)
+ : glyphStorage(that.glyphStorage)
+ {
+ direction = that.direction;
+@@ -71,6 +72,7 @@
+ destIndex = that.destIndex;
+ lookupFlags = that.lookupFlags;
+ featureMask = newFeatureMask;
++ featureParam = newFeatureParam;
+ glyphGroup = 0;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+@@ -89,6 +91,7 @@
+ destIndex = that.destIndex;
+ lookupFlags = newLookupFlags;
+ featureMask = that.featureMask;
++ featureParam = that.featureParam;
+ glyphGroup = that.glyphGroup;
+ glyphClassDefinitionTable = that.glyphClassDefinitionTable;
+ markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
+@@ -103,6 +106,7 @@
+ {
+ position = prevLimit;
+ featureMask = newFeatureMask;
++ featureParam = 0;
+ glyphGroup = 0;
+ lookupFlags = newLookupFlags;
+ }
+@@ -130,6 +134,11 @@
+ return position;
+ }
+
++le_int32 GlyphIterator::getFeatureParam() const
++{
++ return featureParam;
++}
++
+ le_bool GlyphIterator::isRightToLeft() const
+ {
+ return direction < 0;
+@@ -400,8 +409,10 @@
+ }
+ }
+
+-le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const
++le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup)
+ {
++ featureParam = 0;
++
+ if (featureMask == 0) {
+ return TRUE;
+ }
+@@ -409,7 +420,20 @@
+ LEErrorCode success = LE_NO_ERROR;
+ FeatureMask fm = glyphStorage.getAuxData(position, success);
+
+- return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup);
++ if (((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup)) {
++ const le_int32 *paramList = (const le_int32 *) glyphStorage.getAuxParam(position, success);
++ if (paramList != NULL) {
++ fm = featureMask;
++ while ((fm & 0x80000000UL) == 0) {
++ ++paramList;
++ fm <<= 1;
++ }
++ featureParam = *paramList;
++ }
++ return TRUE;
++ }
++
++ return FALSE;
+ }
+
+ le_bool GlyphIterator::findFeatureTag()
+diff -ur icu-49.rc.orig/source/layout/GlyphIterator.h icu-49.rc/source/layout/GlyphIterator.h
+--- icu-49.rc.orig/source/layout/GlyphIterator.h 2012-03-02 23:14:54.000000000 +0100
++++ icu-49.rc/source/layout/GlyphIterator.h 2012-03-03 17:32:24.000000000 +0100
+@@ -28,7 +28,7 @@
+
+ GlyphIterator(GlyphIterator &that);
+
+- GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask);
++ GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask, le_int32 featureParam = 0);
+
+ GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags);
+
+@@ -51,6 +51,8 @@
+ le_int32 getMarkComponent(le_int32 markPosition) const;
+ le_bool findMark2Glyph();
+
++ le_int32 getFeatureParam() const;
++
+ void getCursiveEntryPoint(LEPoint &entryPoint) const;
+ void getCursiveExitPoint(LEPoint &exitPoint) const;
+
+@@ -74,7 +76,7 @@
+
+ private:
+ le_bool filterGlyph(le_uint32 index) const;
+- le_bool hasFeatureTag(le_bool matchGroup) const;
++ le_bool hasFeatureTag(le_bool matchGroup); /* not const because it updates the featureParam field */
+ le_bool nextInternal(le_uint32 delta = 1);
+ le_bool prevInternal(le_uint32 delta = 1);
+
+@@ -90,6 +92,7 @@
+ le_int32 destIndex;
+ le_uint16 lookupFlags;
+ FeatureMask featureMask;
++ le_int32 featureParam;
+ le_int32 glyphGroup;
+
+ const GlyphClassDefinitionTable *glyphClassDefinitionTable;
+diff -ur icu-49.rc.orig/source/layout/LEGlyphStorage.cpp icu-49.rc/source/layout/LEGlyphStorage.cpp
+--- icu-49.rc.orig/source/layout/LEGlyphStorage.cpp 2012-03-02 23:14:54.000000000 +0100
++++ icu-49.rc/source/layout/LEGlyphStorage.cpp 2012-03-03 17:32:24.000000000 +0100
+@@ -20,7 +20,7 @@
+
+ LEGlyphStorage::LEGlyphStorage()
+ : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL),
+- fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0)
++ fAuxData(NULL), fAuxParam(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0)
+ {
+ // nothing else to do!
+ }
+@@ -44,6 +44,11 @@
+ fAuxData = NULL;
+ }
+
++ if (fAuxParam != NULL) {
++ LE_DELETE_ARRAY(fAuxParam);
++ fAuxParam = NULL;
++ }
++
+ if (fInsertionList != NULL) {
+ delete fInsertionList;
+ fInsertionList = NULL;
+@@ -151,14 +156,15 @@
+ return -1;
+ }
+
+- if (fAuxData != NULL) {
++ if (fAuxData != NULL || fAuxParam != NULL) {
+ success = LE_INTERNAL_ERROR;
+ return -1;
+ }
+
+ fAuxData = LE_NEW_ARRAY(le_uint32, fGlyphCount);
++ fAuxParam = LE_NEW_ARRAY(void *, fGlyphCount);
+
+- if (fAuxData == NULL) {
++ if (fAuxData == NULL || fAuxParam == NULL) {
+ success = LE_MEMORY_ALLOCATION_ERROR;
+ return -1;
+ }
+@@ -365,13 +371,32 @@
+ return fAuxData[glyphIndex];
+ }
+
+-void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success)
++void *LEGlyphStorage::getAuxParam(le_int32 glyphIndex, LEErrorCode &success) const
++{
++ if (LE_FAILURE(success)) {
++ return NULL;
++ }
++
++ if (fAuxParam == NULL) {
++ success = LE_NO_LAYOUT_ERROR;
++ return NULL;
++ }
++
++ if (glyphIndex < 0 || glyphIndex >= fGlyphCount) {
++ success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
++ return NULL;
++ }
++
++ return fAuxParam[glyphIndex];
++}
++
++void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, void *auxParam, LEErrorCode &success)
+ {
+ if (LE_FAILURE(success)) {
+ return;
+ }
+
+- if (fAuxData == NULL) {
++ if (fAuxData == NULL || fAuxParam == NULL) {
+ success = LE_NO_LAYOUT_ERROR;
+ return;
+ }
+@@ -382,6 +407,7 @@
+ }
+
+ fAuxData[glyphIndex] = auxData;
++ fAuxParam[glyphIndex] = auxParam;
+ }
+
+ void LEGlyphStorage::getGlyphPositions(float positions[], LEErrorCode &success) const
+@@ -496,8 +522,14 @@
+ LE_DELETE_ARRAY(fAuxData);
+ }
+
++ if (fAuxParam != NULL) {
++ LE_DELETE_ARRAY(fAuxParam);
++ }
++
+ fAuxData = from.fAuxData;
+ from.fAuxData = NULL;
++ fAuxParam = from.fAuxParam;
++ from.fAuxParam = NULL;
+ }
+
+ void LEGlyphStorage::adoptGlyphCount(LEGlyphStorage &from)
+@@ -588,6 +620,15 @@
+ fAuxData = (le_uint32 *)newAuxData;
+ }
+
++ if (fAuxParam != NULL) {
++ void **newAuxParam = (void **) LE_GROW_ARRAY(fAuxParam, newGlyphCount);
++ if (newAuxParam == NULL) {
++ // could not grow the aux param array
++ return fGlyphCount;
++ }
++ fAuxParam = (void **)newAuxParam;
++ }
++
+ fSrcIndex = fGlyphCount - 1;
+ fDestIndex = newGlyphCount - 1;
+
+@@ -640,6 +681,18 @@
+ }
+ }
+
++ if (fAuxParam != NULL) {
++ le_int32 src = fSrcIndex, dest = fDestIndex;
++
++ while (src > atPosition) {
++ fAuxParam[dest--] = fAuxParam[src--];
++ }
++
++ for (le_int32 i = count - 1; i >= 0; i -= 1) {
++ fAuxParam[dest--] = fAuxParam[atPosition];
++ }
++ }
++
+ while (fSrcIndex > atPosition) {
+ fGlyphs[fDestIndex] = fGlyphs[fSrcIndex];
+ fCharIndices[fDestIndex] = fCharIndices[fSrcIndex];
+diff -ur icu-49.rc.orig/source/layout/LEGlyphStorage.h icu-49.rc/source/layout/LEGlyphStorage.h
+--- icu-49.rc.orig/source/layout/LEGlyphStorage.h 2012-03-02 23:14:52.000000000 +0100
++++ icu-49.rc/source/layout/LEGlyphStorage.h 2012-03-03 17:32:24.000000000 +0100
+@@ -63,12 +63,12 @@
+ float *fPositions;
+
+ /**
+- * The auxillary data array.
++ * The auxillary data arrays.
+ *
+ * @internal
+ */
+ le_uint32 *fAuxData;
+-
++ void **fAuxParam;
+
+ /**
+ * The insertion list, used to grow the above arrays.
+@@ -299,6 +299,7 @@
+ * @stable ICU 3.6
+ */
+ le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const;
++ void *getAuxParam(le_int32 glyphIndex, LEErrorCode &success) const;
+
+ /**
+ * This operator allows direct access to the glyph array
+@@ -427,15 +428,20 @@
+ void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success);
+
+ /**
+- * Set the auxillary data for a particular glyph.
++ * Set the auxiliary data for a particular glyph.
+ *
+ * @param glyphIndex the index of the glyph
+- * @param auxData the new auxillary data
+- * @param success will be set to an error code if the auxillary data cannot be set.
++ * @param auxData the new auxiliary data
++ * @param auxParam the new secondary auxiliary data (parameter)
++ * @param success will be set to an error code if the auxiliary data cannot be set.
+ *
+- * @stable ICU 3.6
++ * @stable ICU 3.6 - mod for XeTeX
++ */
++ void setAuxData(le_int32 glyphIndex, le_uint32 auxData, void *auxParam, LEErrorCode &success);
++ /**
++ * The common case when @param auxParam is <code>NULL</code>.
+ */
+- void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success);
++ inline void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success);
+
+ /**
+ * Delete the glyph array and replace it with the one
+@@ -540,6 +546,10 @@
+ return fGlyphs[glyphIndex];
+ }
+
++inline void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success)
++{
++ setAuxData(glyphIndex, auxData, NULL, success);
++}
+
+ U_NAMESPACE_END
+ #endif
+diff -ur icu-49.rc.orig/source/layout/OpenTypeLayoutEngine.cpp icu-49.rc/source/layout/OpenTypeLayoutEngine.cpp
+--- icu-49.rc.orig/source/layout/OpenTypeLayoutEngine.cpp 2012-03-02 23:14:54.000000000 +0100
++++ icu-49.rc/source/layout/OpenTypeLayoutEngine.cpp 2012-03-03 17:32:24.000000000 +0100
+@@ -78,7 +78,7 @@
+ OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode,
+ le_int32 typoFlags, const GlyphSubstitutionTableHeader *gsubTable, LEErrorCode &success)
+ : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures),
+- fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
++ fFeatureMap(featureMap), fFeatureParamList(NULL), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE),
+ fGSUBTable(gsubTable), fGDEFTable(NULL), fGPOSTable(NULL), fSubstitutionFilter(NULL)
+ {
+ static const le_uint32 gdefTableTag = LE_GDEF_TABLE_TAG;
+@@ -216,7 +216,7 @@
+ glyphStorage.allocateAuxData(success);
+
+ for (le_int32 i = 0; i < count; i += 1) {
+- glyphStorage.setAuxData(i, fFeatureMask, success);
++ glyphStorage.setAuxData(i, fFeatureMask, (void *) fFeatureParamList, success);
+ }
+
+ return count;
+diff -ur icu-49.rc.orig/source/layout/OpenTypeLayoutEngine.h icu-49.rc/source/layout/OpenTypeLayoutEngine.h
+--- icu-49.rc.orig/source/layout/OpenTypeLayoutEngine.h 2012-03-02 23:14:54.000000000 +0100
++++ icu-49.rc/source/layout/OpenTypeLayoutEngine.h 2012-03-03 17:32:24.000000000 +0100
+@@ -194,6 +194,13 @@
+ le_bool fFeatureOrder;
+
+ /**
++ * The list of what? FIXME..
++ *
++ * @internal
++ */
++ const le_int32 *fFeatureParamList;
++
++ /**
+ * The address of the GSUB table.
+ *
+ * @internal