summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp')
-rw-r--r--Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp39
1 files changed, 26 insertions, 13 deletions
diff --git a/Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp b/Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp
index 8eedae283ce..d8ef3ed3a04 100644
--- a/Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp
+++ b/Build/source/texk/web2c/xetexdir/XeTeXOTLayoutEngine.cpp
@@ -57,7 +57,8 @@ static le_int32 getLanguageCode(LETag languageTag)
LayoutEngine* XeTeXOTLayoutEngine::LayoutEngineFactory
(const XeTeXFontInst* fontInstance,
LETag scriptTag, LETag languageTag,
- const LETag* addFeatures, const LETag* removeFeatures,
+ const LETag* addFeatures, const le_int32* addParams,
+ const LETag* removeFeatures,
LEErrorCode &success)
{
static le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG;
@@ -101,7 +102,7 @@ LayoutEngine* XeTeXOTLayoutEngine::LayoutEngineFactory
case hiraScriptCode:
case kanaScriptCode:
case hrktScriptCode:
- result = new XeTeXHanLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, addFeatures, removeFeatures);
+ result = new XeTeXHanLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, addFeatures, addParams, removeFeatures);
break;
case khmrScriptCode:
@@ -109,7 +110,7 @@ LayoutEngine* XeTeXOTLayoutEngine::LayoutEngineFactory
break;
default:
- result = new XeTeXOTLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, addFeatures, removeFeatures);
+ result = new XeTeXOTLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, addFeatures, addParams, removeFeatures);
break;
}
}
@@ -157,7 +158,7 @@ const char XeTeXOTLayoutEngine::fgClassID=0;
XeTeXOTLayoutEngine::XeTeXOTLayoutEngine(
const LEFontInstance* fontInstance, LETag scriptTag, LETag languageTag,
const GlyphSubstitutionTableHeader* gsubTable,
- const LETag* addFeatures, const LETag* removeFeatures)
+ const LETag* addFeatures, const le_int32* addParams, const LETag* removeFeatures)
: OpenTypeLayoutEngine(fontInstance, getScriptCode(scriptTag), getLanguageCode(languageTag), 3, gsubTable)
{
static le_uint32 gposTableTag = LE_GPOS_TABLE_TAG;
@@ -177,16 +178,18 @@ XeTeXOTLayoutEngine::XeTeXOTLayoutEngine(
}
}
- adjustFeatures(addFeatures, removeFeatures);
+ adjustFeatures(addFeatures, addParams, removeFeatures);
}
XeTeXOTLayoutEngine::~XeTeXOTLayoutEngine()
{
if (fFeatureList != NULL && fFeatureList != fDefaultFeatures)
LE_DELETE_ARRAY(fFeatureList);
+ if (fFeatureParamList != NULL)
+ LE_DELETE_ARRAY(fFeatureParamList);
}
-void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const LETag* removeTags)
+void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const le_int32* addParams, const LETag* removeTags)
{
// bail out if nothing was requested!
if ((addTags == NULL || *addTags == emptyTag) && (removeTags == NULL || *removeTags == emptyTag))
@@ -208,6 +211,8 @@ void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const LETag* remo
// copy the existing tags, skipping any in the remove list
LETag* dest = newList;
+ le_int32* newParams = LE_NEW_ARRAY(le_int32, count);
+ le_int32* dest2 = newParams;
pTag = fFeatureList;
while (*pTag != emptyTag) {
const LETag* t = removeTags;
@@ -217,13 +222,16 @@ void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const LETag* remo
break;
else
t++;
- if (t == NULL || *t == emptyTag)
+ if (t == NULL || *t == emptyTag) {
*dest++ = *pTag;
+ *dest2++ = 0;
+ }
pTag++;
}
- // copy the added tags, skipping any already present
+ // copy the added tags and parameters, skipping any already present
pTag = addTags;
+ const le_int32* pParam = addParams;
if (pTag != NULL)
while (*pTag != emptyTag) {
const LETag* t = newList;
@@ -232,9 +240,12 @@ void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const LETag* remo
break;
else
t++;
- if (t == dest)
- *dest++ = *pTag;
+ if (t == dest) {
+ *dest++ = *pTag;
+ *dest2++ = *pParam;
+ }
pTag++;
+ pParam++;
}
// terminate the new list
@@ -245,6 +256,7 @@ void XeTeXOTLayoutEngine::adjustFeatures(const LETag* addTags, const LETag* remo
LE_DELETE_ARRAY(fFeatureList);
fFeatureList = newList;
+ fFeatureParamList = newParams;
}
@@ -265,15 +277,16 @@ static const LETag verticalFeatures[] = {loclFeatureTag, vrt2FeatureTag, vertFea
XeTeXHanLayoutEngine::XeTeXHanLayoutEngine(const XeTeXFontInst *fontInstance, LETag scriptTag, LETag languageTag,
const GlyphSubstitutionTableHeader *gsubTable,
- const LETag *addFeatures, const LETag *removeFeatures)
- : XeTeXOTLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, NULL, NULL)
+ const LETag *addFeatures, const le_int32* addParams,
+ const LETag *removeFeatures)
+ : XeTeXOTLayoutEngine(fontInstance, scriptTag, languageTag, gsubTable, NULL, NULL, NULL)
{
// reset the default feature list
fFeatureList = fontInstance->getLayoutDirVertical() ? verticalFeatures : horizontalFeatures;
fDefaultFeatures = fFeatureList;
// then apply any adjustments
- adjustFeatures(addFeatures, removeFeatures);
+ adjustFeatures(addFeatures, addParams, removeFeatures);
}
XeTeXHanLayoutEngine::~XeTeXHanLayoutEngine()