author | prr |
Fri, 13 Oct 2017 08:54:00 -0700 | |
changeset 47386 | a26c8a7739f0 |
parent 47385 | 8d56044a9850 |
child 47387 | 4d711a58bb3b |
--- a/make/mapfiles/libfontmanager/mapfile-vers Thu Oct 12 10:40:45 2017 +0530 +++ b/make/mapfiles/libfontmanager/mapfile-vers Fri Oct 13 08:54:00 2017 -0700 @@ -41,8 +41,6 @@ Java_sun_font_StrikeCache_freeLongPointer; Java_sun_font_StrikeCache_freeIntMemory; Java_sun_font_StrikeCache_freeLongMemory; - Java_sun_font_SunLayoutEngine_initGVIDs; - Java_sun_font_SunLayoutEngine_nativeLayout; Java_sun_font_SunLayoutEngine_shape; Java_sun_font_X11TextRenderer_doDrawGlyphList; Java_sun_java2d_loops_DrawGlyphListAA_DrawGlyphListAA;
--- a/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java Thu Oct 12 10:40:45 2017 +0530 +++ b/src/java.desktop/share/classes/sun/font/SunLayoutEngine.java Fri Oct 13 08:54:00 2017 -0700 @@ -102,21 +102,8 @@ * suffice. * */ public final class SunLayoutEngine implements LayoutEngine, LayoutEngineFactory { - private static native void initGVIDs(); - private static final boolean useICU; static { FontManagerNativeLibrary.load(); - initGVIDs(); - String le = java.security.AccessController.doPrivileged( - new sun.security.action. - GetPropertyAction("sun.font.layoutengine", "")); - useICU = le.equals("icu"); - String verbose = java.security.AccessController.doPrivileged( - new sun.security.action. - GetPropertyAction("sun.font.layoutengine.verbose", "")); - if ("true".equalsIgnoreCase(verbose)) { - System.out.println("Using " + (useICU ? "icu." : "harfbuzz.")); - } } private LayoutEngineKey key; @@ -180,34 +167,19 @@ Font2D font = key.font(); FontStrike strike = font.getStrike(desc); long layoutTables = font.getLayoutTableCache(); - if (useICU) { - nativeLayout(font, strike, mat, gmask, baseIndex, - tr.text, tr.start, tr.limit, tr.min, tr.max, - key.script(), key.lang(), typo_flags, pt, data, - font.getUnitsPerEm(), layoutTables); - } else { - long pNativeFont = font.getPlatformNativeFontPtr(); // used on OSX - // pScaler probably not needed long term. - long pScaler = 0L; - if (font instanceof FileFont) { - pScaler = ((FileFont)font).getScaler().nativeScaler; - } - shape(font, strike, ptSize, mat, pScaler, pNativeFont, - layoutTables, isAAT(font), - tr.text, data, key.script(), - tr.start, tr.limit, baseIndex, pt, - typo_flags, gmask); - } + long pNativeFont = font.getPlatformNativeFontPtr(); // used on OSX + // pScaler probably not needed long term. + long pScaler = 0L; + if (font instanceof FileFont) { + pScaler = ((FileFont)font).getScaler().nativeScaler; + } + shape(font, strike, ptSize, mat, pScaler, pNativeFont, + layoutTables, isAAT(font), + tr.text, data, key.script(), + tr.start, tr.limit, baseIndex, pt, + typo_flags, gmask); } - /* Native method to invoke ICU layout engine */ - private static native void - nativeLayout(Font2D font, FontStrike strike, float[] mat, int gmask, - int baseIndex, char[] chars, int offset, int limit, - int min, int max, int script, int lang, int typo_flags, - Point2D.Float pt, GVData data, long upem, long layoutTables); - - /* Native method to invoke harfbuzz layout engine */ private static native boolean shape(Font2D font, FontStrike strike, float ptSize, float[] mat,
--- a/src/java.desktop/share/native/libfontmanager/FontInstanceAdapter.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,323 +0,0 @@ -/* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * (C) Copyright IBM Corp. 1998-2001 - All Rights Reserved - * - * The original version of this source code and documentation is - * copyrighted and owned by IBM. These materials are provided - * under terms of a License Agreement between IBM and Sun. - * This technology is protected by multiple US and International - * patents. This notice and attribution to IBM may not be removed. - */ - -#include "FontInstanceAdapter.h" - -FontInstanceAdapter::FontInstanceAdapter(JNIEnv *theEnv, - jobject theFont2D, - jobject theFontStrike, - float *matrix, - le_int32 xRes, le_int32 yRes, - le_int32 theUPEM, - TTLayoutTableCache *ltables) - : env(theEnv), font2D(theFont2D), fontStrike(theFontStrike), - xppem(0), yppem(0), - xScaleUnitsToPoints(0), yScaleUnitsToPoints(0), - xScalePixelsToUnits(0), yScalePixelsToUnits(0), - upem(theUPEM), layoutTables(ltables) -{ - xPointSize = euclidianDistance(matrix[0], matrix[1]); - yPointSize = euclidianDistance(matrix[2], matrix[3]); - - txMat[0] = matrix[0]/xPointSize; - txMat[1] = matrix[1]/xPointSize; - txMat[2] = matrix[2]/yPointSize; - txMat[3] = matrix[3]/yPointSize; - - xppem = ((float) xRes / 72) * xPointSize; - yppem = ((float) yRes / 72) * yPointSize; - - xScaleUnitsToPoints = xPointSize / upem; - yScaleUnitsToPoints = yPointSize / upem; - - xScalePixelsToUnits = upem / xppem; - yScalePixelsToUnits = upem / yppem; -}; - - -static const LETag cacheMap[LAYOUTCACHE_ENTRIES] = { - GPOS_TAG, GDEF_TAG, GSUB_TAG, MORT_TAG, MORX_TAG, KERN_TAG -}; - -const void *FontInstanceAdapter::getFontTable(LETag tableTag, size_t &length) const -{ - length = 0; - - if (!layoutTables) { // t1 font - return 0; - } - - // cache in font's pscaler object - // font disposer will handle for us - - int cacheIdx; - for (cacheIdx=0;cacheIdx<LAYOUTCACHE_ENTRIES;cacheIdx++) { - if (tableTag==cacheMap[cacheIdx]) break; - } - - if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if found - if (layoutTables->entries[cacheIdx].len != -1) { - length = layoutTables->entries[cacheIdx].len; - return layoutTables->entries[cacheIdx].ptr; - } - } else { - //fprintf(stderr, "unexpected table request from font instance adapter: %x\n", tableTag); - // (don't load any other tables) - return 0; - } - - jbyte* result = 0; - jsize len = 0; - jbyteArray tableBytes = (jbyteArray) - env->CallObjectMethod(font2D, sunFontIDs.getTableBytesMID, tableTag); - if (!IS_NULL(tableBytes)) { - len = env->GetArrayLength(tableBytes); - result = new jbyte[len]; - env->GetByteArrayRegion(tableBytes, 0, len, result); - } - - if (cacheIdx<LAYOUTCACHE_ENTRIES) { // if cacheable table - layoutTables->entries[cacheIdx].len = len; - layoutTables->entries[cacheIdx].ptr = (const void*)result; - } - - length = len; - return (const void*)result; -}; - -LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - LEUnicode32 mappedChar = mapper->mapChar(ch); - - if (mappedChar == 0xFFFF || mappedChar == 0xFFFE) { - return 0xFFFF; - } - - if (mappedChar == 0x200C || mappedChar == 0x200D) { - return 1; - } - - LEGlyphID id = (LEGlyphID)env->CallIntMethod(font2D, sunFontIDs.f2dCharToGlyphMID, (jint)mappedChar); - return id; -} - -LEGlyphID FontInstanceAdapter::mapCharToGlyph(LEUnicode32 ch) const -{ - LEGlyphID id = (LEGlyphID)env->CallIntMethod(font2D, sunFontIDs.f2dCharToGlyphMID, ch); - return id; -} - -void FontInstanceAdapter::mapCharsToWideGlyphs(const LEUnicode chars[], - le_int32 offset, le_int32 count, le_bool reverse, - const LECharMapper *mapper, le_uint32 glyphs[]) const -{ - le_int32 i, out = 0, dir = 1; - - if (reverse) { - out = count - 1; - dir = -1; - } - - for (i = offset; i < offset + count; i += 1, out += dir) { - LEUnicode16 high = chars[i]; - LEUnicode32 code = high; - - if (i < offset + count - 1 && high >= 0xD800 && high <= 0xDBFF) { - LEUnicode16 low = chars[i + 1]; - - if (low >= 0xDC00 && low <= 0xDFFF) { - code = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; - } - } - - glyphs[out] = mapCharToWideGlyph(code, mapper); - - if (code >= 0x10000) { - i += 1; - glyphs[out += dir] = 0xFFFF; - } - } -} - -le_uint32 FontInstanceAdapter::mapCharToWideGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - LEUnicode32 mappedChar = mapper->mapChar(ch); - - if (mappedChar == 0xFFFF) { - return 0xFFFF; - } - - if (mappedChar == 0x200C || mappedChar == 0x200D) { - return 1; - } - - return (LEGlyphID)env->CallIntMethod(font2D, sunFontIDs.charToGlyphMID, - mappedChar); -} - -void FontInstanceAdapter::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const -{ - getWideGlyphAdvance((le_uint32)glyph, advance); -} - -void FontInstanceAdapter::getKerningAdjustment(LEPoint &adjustment) const -{ - float xx, xy, yx, yy; - le_bool isIdentityMatrix; - - isIdentityMatrix = (txMat[0] == 1 && txMat[1] == 0 && - txMat[2] == 0 && txMat[3] == 1); - - if (!isIdentityMatrix) { - xx = adjustment.fX; - xy = xx * txMat[1]; - xx = xx * txMat[0]; - - yy = adjustment.fY; - yx = yy * txMat[2]; - yy = yy * txMat[3]; - - adjustment.fX = xx + yx; - adjustment.fY = xy + yy; - } - - jobject pt = env->NewObject(sunFontIDs.pt2DFloatClass, - sunFontIDs.pt2DFloatCtr, - adjustment.fX, adjustment.fY); - if (pt == NULL) { - env->ExceptionClear(); - adjustment.fX = 0.0f; - adjustment.fY = 0.0f; - } else { - env->CallObjectMethod(fontStrike, sunFontIDs.adjustPointMID, pt); - adjustment.fX = env->GetFloatField(pt, sunFontIDs.xFID); - adjustment.fY = env->GetFloatField(pt, sunFontIDs.yFID); - } -} - -void FontInstanceAdapter::getWideGlyphAdvance(le_uint32 glyph, LEPoint &advance) const -{ - if ((glyph & 0xfffe) == 0xfffe) { - advance.fX = 0; - advance.fY = 0; - return; - } - jobject pt = env->CallObjectMethod(fontStrike, - sunFontIDs.getGlyphMetricsMID, glyph); - if (pt != NULL) { - advance.fX = env->GetFloatField(pt, sunFontIDs.xFID); - advance.fY = env->GetFloatField(pt, sunFontIDs.yFID); - env->DeleteLocalRef(pt); - } -} - -le_bool FontInstanceAdapter::getGlyphPoint(LEGlyphID glyph, - le_int32 pointNumber, - LEPoint &point) const -{ - /* This upcall is not ideal, since it will make another down call. - * The intention is to move up some of this code into Java. But - * a HashMap has been added to the Java PhysicalStrike object to cache - * these points so that they don't need to be repeatedly recalculated - * which is expensive as it needs the font scaler to re-generate the - * hinted glyph outline. This turns out to be a huge win over 1.4.x - */ - jobject pt = env->CallObjectMethod(fontStrike, - sunFontIDs.getGlyphPointMID, - glyph, pointNumber); - if (pt != NULL) { - /* point is a java.awt.geom.Point2D.Float */ - point.fX = env->GetFloatField(pt, sunFontIDs.xFID); - /* convert from java coordinate system to internal '+y up' coordinate system */ - point.fY = -env->GetFloatField(pt, sunFontIDs.yFID); - return true; - } else { - return false; - } -} - -void FontInstanceAdapter::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const -{ - float xx, xy, yx, yy; - le_bool isIdentityMatrix; - - isIdentityMatrix = (txMat[0] == 1 && txMat[1] == 0 && - txMat[2] == 0 && txMat[3] == 1); - - xx = xFunits * xScaleUnitsToPoints; - xy = 0; - if (!isIdentityMatrix) { - xy = xx * txMat[1]; - xx = xx * txMat[0]; - }; - - yx = 0; - yy = yFunits * yScaleUnitsToPoints; - if (!isIdentityMatrix) { - yx = yy * txMat[2]; - yy = yy * txMat[3]; - }; - pixels.fX = xx + yx; - pixels.fY = xy + yy; -} - - -float FontInstanceAdapter::euclidianDistance(float a, float b) -{ - if (a < 0) { - a = -a; - } - - if (b < 0) { - b = -b; - } - - if (a == 0) { - return b; - } - - if (b == 0) { - return a; - } - - float root = a > b ? a + (b / 2) : b + (a / 2); /* Do an initial approximation, in root */ - - /* An unrolled Newton-Raphson iteration sequence */ - root = (root + (a * (a / root)) + (b * (b / root)) + 1) / 2; - root = (root + (a * (a / root)) + (b * (b / root)) + 1) / 2; - root = (root + (a * (a / root)) + (b * (b / root)) + 1) / 2; - - return root; -}
--- a/src/java.desktop/share/native/libfontmanager/FontInstanceAdapter.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -/* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -/* - * (C) Copyright IBM Corp. 1998-2001 - All Rights Reserved - * - * The original version of this source code and documentation is - * copyrighted and owned by IBM. These materials are provided - * under terms of a License Agreement between IBM and Sun. - * This technology is protected by multiple US and International - * patents. This notice and attribution to IBM may not be removed. - */ - -#ifndef __FONTINSTANCEADAPTER_H -#define __FONTINSTANCEADAPTER_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "jni.h" -#include "sunfontids.h" -#include "fontscalerdefs.h" -#include <jni_util.h> - -class FontInstanceAdapter : public LEFontInstance { -private: - JNIEnv *env; - jobject font2D; - jobject fontStrike; - - float xppem; - float yppem; - - float xScaleUnitsToPoints; - float yScaleUnitsToPoints; - - float xScalePixelsToUnits; - float yScalePixelsToUnits; - - le_int32 upem; - float xPointSize, yPointSize; - float txMat[4]; - - float euclidianDistance(float a, float b); - - /* Table format is the same as defined in the truetype spec. - Pointer can be NULL (e.g. for Type1 fonts). */ - TTLayoutTableCache* layoutTables; - -public: - FontInstanceAdapter(JNIEnv *env, - jobject theFont2D, jobject theFontStrike, - float *matrix, le_int32 xRes, le_int32 yRes, - le_int32 theUPEM, TTLayoutTableCache *ltables); - - virtual ~FontInstanceAdapter() { }; - - virtual const LEFontInstance *getSubFont(const LEUnicode chars[], - le_int32 *offset, le_int32 limit, - le_int32 script, LEErrorCode &success) const { - return this; - } - - // tables are cached with the native font scaler data - // only supports gsub, gpos, gdef, mort tables at present - virtual const void *getFontTable(LETag tableTag, size_t &len) const; - - virtual void *getKernPairs() const { - return layoutTables->kernPairs; - } - virtual void setKernPairs(void *pairs) const { - layoutTables->kernPairs = pairs; - } - - virtual le_bool canDisplay(LEUnicode32 ch) const - { - return (le_bool)env->CallBooleanMethod(font2D, - sunFontIDs.canDisplayMID, ch); - }; - - virtual le_int32 getUnitsPerEM() const { - return upem; - }; - - virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const; - - virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch) const; - - virtual void mapCharsToWideGlyphs(const LEUnicode chars[], - le_int32 offset, le_int32 count, le_bool reverse, - const LECharMapper *mapper, le_uint32 glyphs[]) const; - - virtual le_uint32 mapCharToWideGlyph(LEUnicode32 ch, - const LECharMapper *mapper) const; - - virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const; - - virtual void getKerningAdjustment(LEPoint &adjustment) const; - - virtual void getWideGlyphAdvance(le_uint32 glyph, LEPoint &advance) const; - - virtual le_bool getGlyphPoint(LEGlyphID glyph, - le_int32 pointNumber, LEPoint &point) const; - - float getXPixelsPerEm() const - { - return xppem; - }; - - float getYPixelsPerEm() const - { - return yppem; - }; - - float xUnitsToPoints(float xUnits) const - { - return xUnits * xScaleUnitsToPoints; - }; - - float yUnitsToPoints(float yUnits) const - { - return yUnits * yScaleUnitsToPoints; - }; - - void unitsToPoints(LEPoint &units, LEPoint &points) const - { - points.fX = xUnitsToPoints(units.fX); - points.fY = yUnitsToPoints(units.fY); - } - - float xPixelsToUnits(float xPixels) const - { - return xPixels * xScalePixelsToUnits; - }; - - float yPixelsToUnits(float yPixels) const - { - return yPixels * yScalePixelsToUnits; - }; - - void pixelsToUnits(LEPoint &pixels, LEPoint &units) const - { - units.fX = xPixelsToUnits(pixels.fX); - units.fY = yPixelsToUnits(pixels.fY); - }; - - virtual float getScaleFactorX() const { - return xScalePixelsToUnits; - }; - - virtual float getScaleFactorY() const { - return yScalePixelsToUnits; - }; - - void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; - - virtual le_int32 getAscent() const { return 0; }; // not used - virtual le_int32 getDescent() const { return 0; }; // not used - virtual le_int32 getLeading() const { return 0; }; // not used -}; - -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/AlternateSubstSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "AlternateSubstSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 AlternateSubstitutionSubtable::process(const LEReferenceTo<AlternateSubstitutionSubtable> &base, - GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const -{ - // NOTE: For now, we'll just pick the first alternative... - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - - if (coverageIndex >= 0 && LE_SUCCESS(success)) { - le_uint16 altSetCount = SWAPW(alternateSetCount); - - if (coverageIndex < altSetCount) { - Offset alternateSetTableOffset = SWAPW(alternateSetTableOffsetArray[coverageIndex]); - const LEReferenceTo<AlternateSetTable> alternateSetTable(base, success, - (const AlternateSetTable *) ((char *) this + alternateSetTableOffset)); - if (!LE_SUCCESS(success)) return 0; - TTGlyphID alternate = SWAPW(alternateSetTable->alternateArray[0]); - - if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, alternate), success)) { - glyphIterator->setCurrGlyphID(SWAPW(alternateSetTable->alternateArray[0])); - } - - return 1; - } - - // XXXX If we get here, the table's mal-formed... - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/AlternateSubstSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __ALTERNATESUBSTITUTIONSUBTABLES_H -#define __ALTERNATESUBSTITUTIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct AlternateSetTable -{ - le_uint16 glyphCount; - TTGlyphID alternateArray[ANY_NUMBER]; -}; - -LE_VAR_ARRAY(AlternateSetTable, alternateArray) - -struct AlternateSubstitutionSubtable : GlyphSubstitutionSubtable -{ - le_uint16 alternateSetCount; - Offset alternateSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<AlternateSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; -}; - -LE_VAR_ARRAY(AlternateSubstitutionSubtable, alternateSetTableOffsetArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/AnchorTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "DeviceTables.h" -#include "AnchorTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -void AnchorTable::getAnchor(const LETableReference &base, LEGlyphID glyphID, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const -{ - switch(SWAPW(anchorFormat)) { - case 1: - { - LEReferenceTo<Format1AnchorTable> f1(base, success); - if (LE_SUCCESS(success)) { - f1->getAnchor(f1, fontInstance, anchor, success); - } - break; - } - - case 2: - { - LEReferenceTo<Format2AnchorTable> f2(base, success); - if (LE_SUCCESS(success)) { - f2->getAnchor(f2, glyphID, fontInstance, anchor, success); - } - break; - } - - case 3: - { - LEReferenceTo<Format3AnchorTable> f3(base, success); - if (LE_SUCCESS(success)) { - f3->getAnchor(f3, fontInstance, anchor, success); - } - break; - } - - default: - { - // unknown format: just use x, y coordinate, like format 1... - LEReferenceTo<Format1AnchorTable> f1(base, success); - if (LE_SUCCESS(success)) { - f1->getAnchor(f1, fontInstance, anchor, success); - } - break; - } - } -} - -void Format1AnchorTable::getAnchor(const LEReferenceTo<Format1AnchorTable>& base, const LEFontInstance *fontInstance, LEPoint &anchor, LEErrorCode &success) const -{ - le_int16 x = SWAPW(xCoordinate); - le_int16 y = SWAPW(yCoordinate); - LEPoint pixels; - - fontInstance->transformFunits(x, y, pixels); - fontInstance->pixelsToUnits(pixels, anchor); -} - -void Format2AnchorTable::getAnchor(const LEReferenceTo<Format2AnchorTable>& base, - LEGlyphID glyphID, const LEFontInstance *fontInstance, LEPoint &anchor - , LEErrorCode &success) const -{ - LEPoint point; - - if (! fontInstance->getGlyphPoint(glyphID, SWAPW(anchorPoint), point)) { - le_int16 x = SWAPW(xCoordinate); - le_int16 y = SWAPW(yCoordinate); - - fontInstance->transformFunits(x, y, point); - } - - - fontInstance->pixelsToUnits(point, anchor); -} - -void Format3AnchorTable::getAnchor(const LEReferenceTo<Format3AnchorTable> &base, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const -{ - le_int16 x = SWAPW(xCoordinate); - le_int16 y = SWAPW(yCoordinate); - LEPoint pixels; - Offset dtxOffset = SWAPW(xDeviceTableOffset); - Offset dtyOffset = SWAPW(yDeviceTableOffset); - - fontInstance->transformFunits(x, y, pixels); - - if (dtxOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtxOffset); - if (LE_SUCCESS(success)) { - le_int16 adjx = dt->getAdjustment(dt, (le_int16) fontInstance->getXPixelsPerEm(), success); - pixels.fX += adjx; - } - } - - if (dtyOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtyOffset); - if (LE_SUCCESS(success)) { - le_int16 adjy = dt->getAdjustment(dt, (le_int16) fontInstance->getYPixelsPerEm(), success); - pixels.fY += adjy; - } - } - - fontInstance->pixelsToUnits(pixels, anchor); -} - -U_NAMESPACE_END -
--- a/src/java.desktop/share/native/libfontmanager/layout/AnchorTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __ANCHORTABLES_H -#define __ANCHORTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct AnchorTable -{ - le_uint16 anchorFormat; - le_int16 xCoordinate; - le_int16 yCoordinate; - - void getAnchor(const LETableReference &base, LEGlyphID glyphID, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const; -}; - -struct Format1AnchorTable : AnchorTable -{ - void getAnchor(const LEReferenceTo<Format1AnchorTable>& base, - const LEFontInstance *fontInstance, LEPoint &anchor, LEErrorCode &success) const; -}; - -struct Format2AnchorTable : AnchorTable -{ - le_uint16 anchorPoint; - - void getAnchor(const LEReferenceTo<Format2AnchorTable>& base, - LEGlyphID glyphID, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const; -}; - -struct Format3AnchorTable : AnchorTable -{ - Offset xDeviceTableOffset; - Offset yDeviceTableOffset; - - void getAnchor(const LEReferenceTo<Format3AnchorTable>& base, - const LEFontInstance *fontInstance, LEPoint &anchor, - LEErrorCode &success) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ArabicLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,246 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LEGlyphFilter.h" -#include "LEGlyphStorage.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" -#include "ArabicLayoutEngine.h" -#include "ScriptAndLanguageTags.h" -#include "CharSubstitutionFilter.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -#include "GDEFMarkFilter.h" - -#include "ArabicShaping.h" -#include "CanonShaping.h" - -U_NAMESPACE_BEGIN - -le_bool CharSubstitutionFilter::accept(LEGlyphID glyph, LEErrorCode &/*success*/) const -{ - return fFontInstance->canDisplay((LEUnicode) glyph); -} - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ArabicOpenTypeLayoutEngine) - -ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, - le_int32 languageCode, le_int32 typoFlags, - const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, - LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) -{ - fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; -} - -ArabicOpenTypeLayoutEngine::ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, - le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) -{ - fFeatureMap = ArabicShaping::getFeatureMap(fFeatureMapCount); - - // NOTE: We don't need to set fFeatureOrder to TRUE here - // because this constructor is only called by the constructor - // for UnicodeArabicOpenTypeLayoutEngine, which uses a pre-built - // GSUB table that has the features in the correct order. - - //fFeatureOrder = TRUE; -} - -ArabicOpenTypeLayoutEngine::~ArabicOpenTypeLayoutEngine() -{ - // nothing to do -} - -// Input: characters -// Output: characters, char indices, tags -// Returns: output character count -le_int32 ArabicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, - le_int32 max, le_bool rightToLeft, LEUnicode *&outChars, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - outChars = LE_NEW_ARRAY(LEUnicode, count); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(count, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage); - - // Note: This processes the *original* character array so we can get context - // for the first and last characters. This is OK because only the marks - // will have been reordered, and they don't contribute to shaping. - ArabicShaping::shape(chars, offset, count, max, rightToLeft, glyphStorage); - - return count; -} - -void ArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (!fGPOSTable.isEmpty()) { - OpenTypeLayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); - } else if (!fGDEFTable.isEmpty()) { - GDEFMarkFilter filter(fGDEFTable, success); - adjustMarkGlyphs(glyphStorage, &filter, success); - } else { - LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(LETableReference::kStaticData, - CanonShaping::glyphDefinitionTable, - CanonShaping::glyphDefinitionTableLen); - GDEFMarkFilter filter(gdefTable, success); - - adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); - } -} - -UnicodeArabicOpenTypeLayoutEngine::UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) - : ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags | LE_CHAR_FILTER_FEATURE_FLAG, success) -{ - fGSUBTable.setTo(LETableReference::kStaticData, (const GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable, CanonShaping::glyphSubstitutionTableLen); - fGDEFTable.setTo(LETableReference::kStaticData, (const GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); - /* OpenTypeLayoutEngine will allocate a substitution filter */ -} - -UnicodeArabicOpenTypeLayoutEngine::~UnicodeArabicOpenTypeLayoutEngine() -{ - /* OpenTypeLayoutEngine will cleanup the substitution filter */ -} - -// "glyphs", "indices" -> glyphs, indices -le_int32 UnicodeArabicOpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - // FIXME: we could avoid the memory allocation and copy if we - // made a clone of mapCharsToGlyphs which took the fake glyphs - // directly. - le_int32 tempGlyphCount = tempGlyphStorage.getGlyphCount(); - LEUnicode *tempChars = LE_NEW_ARRAY(LEUnicode, tempGlyphCount); - - if (tempChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - for (le_int32 i = 0; i < tempGlyphCount; i += 1) { - tempChars[i] = (LEUnicode) LE_GET_GLYPH(tempGlyphStorage[i]); - } - - glyphStorage.adoptCharIndicesArray(tempGlyphStorage); - - ArabicOpenTypeLayoutEngine::mapCharsToGlyphs(tempChars, 0, tempGlyphCount, FALSE, TRUE, glyphStorage, success); - - LE_DELETE_ARRAY(tempChars); - - return tempGlyphCount; -} - -void UnicodeArabicOpenTypeLayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool /*mirror*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - le_int32 i, dir = 1, out = 0; - - if (reverse) { - out = count - 1; - dir = -1; - } - - glyphStorage.allocateGlyphArray(count, reverse, success); - - for (i = 0; i < count; i += 1, out += dir) { - glyphStorage[out] = (LEGlyphID) chars[offset + i]; - } -} - -void UnicodeArabicOpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - GDEFMarkFilter filter(fGDEFTable, success); - - adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); -} - -U_NAMESPACE_END -
--- a/src/java.desktop/share/native/libfontmanager/layout/ArabicLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,266 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __ARABICLAYOUTENGINE_H -#define __ARABICLAYOUTENGINE_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "LEGlyphFilter.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -/** - * This class implements OpenType layout for Arabic fonts. It overrides - * the characerProcessing method to assign the correct OpenType feature - * tags for the Arabic contextual forms. It also overrides the adjustGlyphPositions - * method to guarantee that all vowel and accent glyphs have zero advance width. - * - * @internal - */ -class ArabicOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of ArabicOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * Indic OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLanguageTags.h for script and language codes - * - * @internal - */ - ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @see OpenTypeLayoutEngine - * @see ScriptAndLanguageTags.h for script and language codes - * - * @internal - */ - ArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~ArabicOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Arabic OpenType character processing. It assigns the OpenType feature - * tags to the characters to generate the correct contextual forms and ligatures. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * - * Output parameters: - * @param outChars - the output character arrayt - * @param charIndices - the output character index array - * @param featureTags - the output feature tag array - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method applies the GPOS table if it is present, otherwise it ensures that all vowel - * and accent glyphs have a zero advance width by calling the adjustMarkGlyphs method. - * If the font contains a GDEF table, that is used to identify voewls and accents. Otherwise - * the character codes are used. - * - * @param chars - the input character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs - * @param positions - the position array, will be updated as needed - * @param success - output parameter set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - // static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -/** - * The class implements OpenType layout for Arabic fonts which don't - * contain a GSUB table, using a canned GSUB table based on Unicode - * Arabic Presentation Forms. It overrides the mapCharsToGlyphs method - * to use the Presentation Forms as logical glyph indices. It overrides the - * glyphPostProcessing method to convert the Presentation Forms to actual - * glyph indices. - * - * @see ArabicOpenTypeLayoutEngine - * - * @internal - */ -class UnicodeArabicOpenTypeLayoutEngine : public ArabicOpenTypeLayoutEngine -{ -public: - /** - * This constructs an instance of UnicodeArabicOpenTypeLayoutEngine for a specific font, - * script and language. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param languageCode - the language - * @param success - set to an error code if the operation fails - * - * @see LEFontInstance - * @see ScriptAndLanguageTags.h for script and language codes - * - * @internal - */ - UnicodeArabicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~UnicodeArabicOpenTypeLayoutEngine(); - -protected: - - /** - * This method converts the Arabic Presentation Forms in the temp glyph array - * into actual glyph indices using ArabicOpenTypeLayoutEngine::mapCharsToGlyps. - * - * Input parameters: - * @param tempGlyphs - the input presentation forms - * @param tempCharIndices - the input character index array - * @param tempGlyphCount - the number of Presentation Froms - * - * Output parameters: - * @param glyphs - the output glyph index array - * @param charIndices - the output character index array - * @param success - set to an error code if the operation fails - * - * @return the number of glyph indices in the output glyph index array - * - * @internal - */ - virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method copies the input characters into the output glyph index array, - * for use by the canned GSUB table. It also generates the character index array. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the offset of the first character to be mapped - * @param count - the number of characters to be mapped - * @param reverse - if <code>TRUE</code>, the output will be in reverse order - * @param mirror - if <code>TRUE</code>, do character mirroring - * @param glyphStorage - the glyph storage object. Glyph and char index arrays will be updated. - * - * @param success - set to an error code if the operation fails - * - * @internal - */ - virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method ensures that all vowel and accent glyphs have a zero advance width by calling - * the adjustMarkGlyphs method. The character codes are used to identify the vowel and mark - * glyphs. - * - * @param chars - the input character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered - * @param glyphStorage - the glyph storage object. The glyph positions will be updated as needed. - * @param success - output parameter set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/ArabicShaping.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,238 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "ArabicShaping.h" -#include "LEGlyphStorage.h" -#include "ClassDefinitionTables.h" - -U_NAMESPACE_BEGIN - -// This table maps Unicode joining types to -// ShapeTypes. -const ArabicShaping::ShapeType ArabicShaping::shapeTypes[] = -{ - ArabicShaping::ST_NOSHAPE_NONE, // [U] - ArabicShaping::ST_NOSHAPE_DUAL, // [C] - ArabicShaping::ST_DUAL, // [D] - ArabicShaping::ST_LEFT, // [L] - ArabicShaping::ST_RIGHT, // [R] - ArabicShaping::ST_TRANSPARENT // [T] -}; - -/* - shaping array holds types for Arabic chars between 0610 and 0700 - other values are either unshaped, or transparent if a mark or format - code, except for format codes 200c (zero-width non-joiner) and 200d - (dual-width joiner) which are both unshaped and non_joining or - dual-joining, respectively. -*/ -ArabicShaping::ShapeType ArabicShaping::getShapeType(LEUnicode c) -{ - LEErrorCode success = LE_NO_ERROR; - const LEReferenceTo<ClassDefinitionTable> joiningTypes(LETableReference::kStaticData, - (const ClassDefinitionTable *) ArabicShaping::shapingTypeTable, - ArabicShaping::shapingTypeTableLen); - le_int32 joiningType = joiningTypes->getGlyphClass(joiningTypes, c, success); - - if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT && LE_SUCCESS(success)) { - return ArabicShaping::shapeTypes[joiningType]; - } - - return ArabicShaping::ST_NOSHAPE_NONE; -} - -#define isolFeatureTag LE_ISOL_FEATURE_TAG -#define initFeatureTag LE_INIT_FEATURE_TAG -#define mediFeatureTag LE_MEDI_FEATURE_TAG -#define finaFeatureTag LE_FINA_FEATURE_TAG -#define ligaFeatureTag LE_LIGA_FEATURE_TAG -#define msetFeatureTag LE_MSET_FEATURE_TAG -#define markFeatureTag LE_MARK_FEATURE_TAG -#define ccmpFeatureTag LE_CCMP_FEATURE_TAG -#define rligFeatureTag LE_RLIG_FEATURE_TAG -#define caltFeatureTag LE_CALT_FEATURE_TAG -#define dligFeatureTag LE_DLIG_FEATURE_TAG -#define cswhFeatureTag LE_CSWH_FEATURE_TAG -#define cursFeatureTag LE_CURS_FEATURE_TAG -#define kernFeatureTag LE_KERN_FEATURE_TAG -#define mkmkFeatureTag LE_MKMK_FEATURE_TAG - -// NOTE: -// The isol, fina, init and medi features must be -// defined in the above order, and have masks that -// are all in the same nibble. -#define isolFeatureMask 0x80000000UL -#define finaFeatureMask 0x40000000UL -#define initFeatureMask 0x20000000UL -#define mediFeatureMask 0x10000000UL -#define ccmpFeatureMask 0x08000000UL -#define rligFeatureMask 0x04000000UL -#define caltFeatureMask 0x02000000UL -#define ligaFeatureMask 0x01000000UL -#define dligFeatureMask 0x00800000UL -#define cswhFeatureMask 0x00400000UL -#define msetFeatureMask 0x00200000UL -#define cursFeatureMask 0x00100000UL -#define kernFeatureMask 0x00080000UL -#define markFeatureMask 0x00040000UL -#define mkmkFeatureMask 0x00020000UL - -#define NO_FEATURES 0 -#define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask) - -#define SHAPE_MASK 0xF0000000UL - -static const FeatureMap featureMap[] = { - {ccmpFeatureTag, ccmpFeatureMask}, - {isolFeatureTag, isolFeatureMask}, - {finaFeatureTag, finaFeatureMask}, - {mediFeatureTag, mediFeatureMask}, - {initFeatureTag, initFeatureMask}, - {rligFeatureTag, rligFeatureMask}, - {caltFeatureTag, caltFeatureMask}, - {ligaFeatureTag, ligaFeatureMask}, - {dligFeatureTag, dligFeatureMask}, - {cswhFeatureTag, cswhFeatureMask}, - {msetFeatureTag, msetFeatureMask}, - {cursFeatureTag, cursFeatureMask}, - {kernFeatureTag, kernFeatureMask}, - {markFeatureTag, markFeatureMask}, - {mkmkFeatureTag, mkmkFeatureMask} -}; - -const FeatureMap *ArabicShaping::getFeatureMap(le_int32 &count) -{ - count = LE_ARRAY_SIZE(featureMap); - - return featureMap; -} - -void ArabicShaping::adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage) -{ - LEErrorCode success = LE_NO_ERROR; - FeatureMask featureMask = (FeatureMask) glyphStorage.getAuxData(outIndex, success); - FeatureMask shape = featureMask & SHAPE_MASK; - - shape >>= shapeOffset; - - glyphStorage.setAuxData(outIndex, ((featureMask & ~SHAPE_MASK) | shape), success); -} - -void ArabicShaping::shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, - le_bool rightToLeft, LEGlyphStorage &glyphStorage) -{ - // iterate in logical order, store tags in visible order - // - // the effective right char is the most recently encountered - // non-transparent char - // - // four boolean states: - // the effective right char shapes - // the effective right char causes left shaping - // the current char shapes - // the current char causes right shaping - // - // if both cause shaping, then - // shaper.shape(errout, 2) (isolate to initial, or final to medial) - // shaper.shape(out, 1) (isolate to final) - - ShapeType rightType = ST_NOSHAPE_NONE, leftType = ST_NOSHAPE_NONE; - LEErrorCode success = LE_NO_ERROR; - le_int32 i; - - for (i = offset - 1; i >= 0; i -= 1) { - rightType = getShapeType(chars[i]); - - if (rightType != ST_TRANSPARENT) { - break; - } - } - - for (i = offset + charCount; i < charMax; i += 1) { - leftType = getShapeType(chars[i]); - - if (leftType != ST_TRANSPARENT) { - break; - } - } - - // erout is effective right logical index - le_int32 erout = -1; - le_bool rightShapes = FALSE; - le_bool rightCauses = (rightType & MASK_SHAPE_LEFT) != 0; - le_int32 in, e, out = 0, dir = 1; - - if (rightToLeft) { - out = charCount - 1; - erout = charCount; - dir = -1; - } - - for (in = offset, e = offset + charCount; in < e; in += 1, out += dir) { - LEUnicode c = chars[in]; - ShapeType t = getShapeType(c); - - if (t == ST_NOSHAPE_NONE) { - glyphStorage.setAuxData(out, NO_FEATURES, success); - } else { - glyphStorage.setAuxData(out, ISOL_FEATURES, success); - } - - if ((t & MASK_TRANSPARENT) != 0) { - continue; - } - - le_bool curShapes = (t & MASK_NOSHAPE) == 0; - le_bool curCauses = (t & MASK_SHAPE_RIGHT) != 0; - - if (rightCauses && curCauses) { - if (rightShapes) { - adjustTags(erout, 2, glyphStorage); - } - - if (curShapes) { - adjustTags(out, 1, glyphStorage); - } - } - - rightShapes = curShapes; - rightCauses = (t & MASK_SHAPE_LEFT) != 0; - erout = out; - } - - if (rightShapes && rightCauses && (leftType & MASK_SHAPE_RIGHT) != 0) { - adjustTags(erout, 2, glyphStorage); - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ArabicShaping.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __ARABICSHAPING_H -#define __ARABICSHAPING_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class ArabicShaping /* not : public UObject because all methods are static */ { -public: - // Joining types - enum JoiningTypes - { - JT_NON_JOINING = 0, - JT_JOIN_CAUSING = 1, - JT_DUAL_JOINING = 2, - JT_LEFT_JOINING = 3, - JT_RIGHT_JOINING = 4, - JT_TRANSPARENT = 5, - JT_COUNT = 6 - }; - - // shaping bit masks - enum ShapingBitMasks - { - MASK_SHAPE_RIGHT = 1, // if this bit set, shapes to right - MASK_SHAPE_LEFT = 2, // if this bit set, shapes to left - MASK_TRANSPARENT = 4, // if this bit set, is transparent (ignore other bits) - MASK_NOSHAPE = 8 // if this bit set, don't shape this char, i.e. tatweel - }; - - // shaping values - enum ShapeTypeValues - { - ST_NONE = 0, - ST_RIGHT = MASK_SHAPE_RIGHT, - ST_LEFT = MASK_SHAPE_LEFT, - ST_DUAL = MASK_SHAPE_RIGHT | MASK_SHAPE_LEFT, - ST_TRANSPARENT = MASK_TRANSPARENT, - ST_NOSHAPE_DUAL = MASK_NOSHAPE | ST_DUAL, - ST_NOSHAPE_NONE = MASK_NOSHAPE - }; - - typedef le_int32 ShapeType; - - static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax, - le_bool rightToLeft, LEGlyphStorage &glyphStorage); - - static const FeatureMap *getFeatureMap(le_int32 &count); - -private: - // forbid instantiation - ArabicShaping(); - - static ShapeType getShapeType(LEUnicode c); - - static const le_uint8 shapingTypeTable[]; - static const size_t shapingTypeTableLen; - - static const ShapeType shapeTypes[]; - - static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage); -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/AttachmentPosnSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __ATTACHMENTPOSITIONINGSUBTABLES_H -#define __ATTACHMENTPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "ValueRecords.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct AttachmentPositioningSubtable : GlyphPositioningSubtable -{ - Offset baseCoverageTableOffset; - le_uint16 classCount; - Offset markArrayOffset; - Offset baseArrayOffset; - - inline le_int32 getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphId, LEErrorCode &success) const; - - le_uint32 process(GlyphIterator *glyphIterator) const; -}; - -inline le_int32 AttachmentPositioningSubtable::getBaseCoverage(const LETableReference &base, LEGlyphID baseGlyphID, LEErrorCode &success) const -{ - return getGlyphCoverage(base, baseCoverageTableOffset, baseGlyphID, success); -} - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/CanonData.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3649 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 03/12/2008 03:14:34 PM HST - */ - -#include "LETypes.h" -#include "CanonShaping.h" - -U_NAMESPACE_BEGIN - -const le_uint8 CanonShaping::glyphSubstitutionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x34, 0x02, 0x46, 0x00, 0x10, 0x61, 0x72, 0x61, 0x62, - 0x00, 0x62, 0x62, 0x61, 0x6C, 0x69, 0x00, 0x76, 0x62, 0x65, 0x6E, 0x67, 0x00, 0x82, 0x63, 0x79, - 0x72, 0x6C, 0x00, 0x8E, 0x64, 0x65, 0x76, 0x61, 0x00, 0x9A, 0x67, 0x72, 0x65, 0x6B, 0x00, 0xA6, - 0x68, 0x69, 0x72, 0x61, 0x00, 0xB2, 0x6B, 0x61, 0x6E, 0x61, 0x00, 0xBE, 0x6B, 0x6E, 0x64, 0x61, - 0x00, 0xCA, 0x6C, 0x61, 0x74, 0x6E, 0x00, 0xD6, 0x6D, 0x6C, 0x79, 0x6D, 0x00, 0xE2, 0x6D, 0x79, - 0x6D, 0x72, 0x00, 0xEE, 0x6F, 0x72, 0x79, 0x61, 0x00, 0xFA, 0x73, 0x69, 0x6E, 0x68, 0x01, 0x06, - 0x74, 0x61, 0x6D, 0x6C, 0x01, 0x12, 0x74, 0x65, 0x6C, 0x75, 0x01, 0x1E, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x00, 0x13, 0x00, 0x10, 0x00, 0x12, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x03, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x06, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0B, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x01, 0x00, 0x0E, 0x00, 0x14, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x7A, 0x63, 0x63, 0x6D, 0x70, - 0x00, 0x82, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x8A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0x92, 0x63, 0x63, - 0x6D, 0x70, 0x00, 0x9A, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xA2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xAA, - 0x63, 0x63, 0x6D, 0x70, 0x00, 0xB2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xBA, 0x63, 0x63, 0x6D, 0x70, - 0x00, 0xC2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xCA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xD2, 0x63, 0x63, - 0x6D, 0x70, 0x00, 0xDA, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xE2, 0x63, 0x63, 0x6D, 0x70, 0x00, 0xEA, - 0x63, 0x63, 0x6D, 0x70, 0x00, 0xF2, 0x66, 0x69, 0x6E, 0x61, 0x00, 0xFA, 0x69, 0x6E, 0x69, 0x74, - 0x01, 0x00, 0x6C, 0x69, 0x67, 0x61, 0x01, 0x06, 0x6D, 0x65, 0x64, 0x69, 0x01, 0x0C, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x14, 0x00, 0x15, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x17, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x18, 0x00, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x1B, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x24, 0x00, 0x4A, 0x00, 0xC0, 0x01, 0x22, 0x01, 0xEC, - 0x02, 0xB6, 0x03, 0xF0, 0x14, 0xFE, 0x15, 0x26, 0x15, 0x4C, 0x17, 0xFE, 0x1A, 0x74, 0x1A, 0xB0, - 0x1A, 0xE0, 0x4E, 0xDA, 0x8B, 0xBC, 0x8D, 0x2A, 0x8E, 0x4A, 0x8E, 0xA0, 0x8E, 0xFC, 0x90, 0xA2, - 0x91, 0xEA, 0xB1, 0xA2, 0xD5, 0x1E, 0xD5, 0x54, 0xD5, 0x84, 0xD5, 0xA4, 0xD5, 0xC0, 0xD5, 0xF0, - 0xD6, 0x20, 0xD6, 0x68, 0xD6, 0xBA, 0xD6, 0xFE, 0xD7, 0x38, 0xD7, 0x58, 0xD7, 0x74, 0xD8, 0x20, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5E, 0x00, 0x06, 0x00, 0x12, - 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x14, 0x06, 0x22, 0x00, 0x02, 0x06, 0x53, 0x06, 0x23, 0x00, 0x02, 0x06, 0x54, 0x06, 0x25, - 0x00, 0x02, 0x06, 0x55, 0x00, 0x01, 0x00, 0x04, 0x06, 0x24, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, - 0x00, 0x04, 0x06, 0x26, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xC2, 0x00, 0x02, - 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, 0x06, 0xD3, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x04, - 0x06, 0xC0, 0x00, 0x02, 0x06, 0x54, 0x00, 0x01, 0x00, 0x06, 0x06, 0x27, 0x06, 0x48, 0x06, 0x4A, - 0x06, 0xC1, 0x06, 0xD2, 0x06, 0xD5, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, - 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x06, 0x27, 0x06, 0x53, 0x00, 0x02, 0x06, 0x27, 0x06, 0x54, - 0x00, 0x02, 0x06, 0x48, 0x06, 0x54, 0x00, 0x02, 0x06, 0x27, 0x06, 0x55, 0x00, 0x02, 0x06, 0x4A, - 0x06, 0x54, 0x00, 0x02, 0x06, 0xD5, 0x06, 0x54, 0x00, 0x02, 0x06, 0xC1, 0x06, 0x54, 0x00, 0x02, - 0x06, 0xD2, 0x06, 0x54, 0x00, 0x01, 0x00, 0x08, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, - 0x06, 0x26, 0x06, 0xC0, 0x06, 0xC2, 0x06, 0xD3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, 0xFE, 0x8B, 0xFE, 0x91, 0xFE, 0x97, 0xFE, 0x9B, 0xFE, 0x9F, - 0xFE, 0xA3, 0xFE, 0xA7, 0xFE, 0xB3, 0xFE, 0xB7, 0xFE, 0xBB, 0xFE, 0xBF, 0xFE, 0xC3, 0xFE, 0xC7, - 0xFE, 0xCB, 0xFE, 0xCF, 0xFE, 0xD3, 0xFE, 0xD7, 0xFE, 0xDB, 0xFE, 0xDF, 0xFE, 0xE3, 0xFE, 0xE7, - 0xFE, 0xEB, 0xFB, 0xE8, 0xFE, 0xF3, 0xFB, 0x68, 0xFB, 0x60, 0xFB, 0x54, 0xFB, 0x58, 0xFB, 0x64, - 0xFB, 0x5C, 0xFB, 0x78, 0xFB, 0x74, 0xFB, 0x7C, 0xFB, 0x80, 0xFB, 0x6C, 0xFB, 0x70, 0xFB, 0x90, - 0xFB, 0xD5, 0xFB, 0x94, 0xFB, 0x9C, 0xFB, 0x98, 0xFB, 0xA2, 0xFB, 0xAC, 0xFB, 0xA8, 0xFB, 0xFE, - 0xFB, 0xE6, 0x00, 0x01, 0x00, 0x2E, 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, - 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, - 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, - 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, - 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, - 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, - 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x62, 0x00, 0x2E, - 0xFE, 0x8C, 0xFE, 0x92, 0xFE, 0x98, 0xFE, 0x9C, 0xFE, 0xA0, 0xFE, 0xA4, 0xFE, 0xA8, 0xFE, 0xB4, - 0xFE, 0xB8, 0xFE, 0xBC, 0xFE, 0xC0, 0xFE, 0xC4, 0xFE, 0xC8, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0xD4, - 0xFE, 0xD8, 0xFE, 0xDC, 0xFE, 0xE0, 0xFE, 0xE4, 0xFE, 0xE8, 0xFE, 0xEC, 0xFB, 0xE9, 0xFE, 0xF4, - 0xFB, 0x69, 0xFB, 0x61, 0xFB, 0x55, 0xFB, 0x59, 0xFB, 0x65, 0xFB, 0x5D, 0xFB, 0x79, 0xFB, 0x75, - 0xFB, 0x7D, 0xFB, 0x81, 0xFB, 0x6D, 0xFB, 0x71, 0xFB, 0x91, 0xFB, 0xD6, 0xFB, 0x95, 0xFB, 0x9D, - 0xFB, 0x99, 0xFB, 0xA3, 0xFB, 0xAD, 0xFB, 0xA9, 0xFB, 0xFF, 0xFB, 0xE7, 0x00, 0x01, 0x00, 0x2E, - 0x06, 0x26, 0x06, 0x28, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x33, - 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, - 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x49, 0x06, 0x4A, - 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, - 0x06, 0x86, 0x06, 0x87, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, - 0x06, 0xB3, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC1, 0x06, 0xCC, 0x06, 0xD0, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x9A, 0x00, 0x4A, 0xFE, 0x82, 0xFE, 0x84, 0xFE, 0x86, - 0xFE, 0x88, 0xFE, 0x8A, 0xFE, 0x8E, 0xFE, 0x90, 0xFE, 0x94, 0xFE, 0x96, 0xFE, 0x9A, 0xFE, 0x9E, - 0xFE, 0xA2, 0xFE, 0xA6, 0xFE, 0xAA, 0xFE, 0xAC, 0xFE, 0xAE, 0xFE, 0xB0, 0xFE, 0xB2, 0xFE, 0xB6, - 0xFE, 0xBA, 0xFE, 0xBE, 0xFE, 0xC2, 0xFE, 0xC6, 0xFE, 0xCA, 0xFE, 0xCE, 0xFE, 0xD2, 0xFE, 0xD6, - 0xFE, 0xDA, 0xFE, 0xDE, 0xFE, 0xE2, 0xFE, 0xE6, 0xFE, 0xEA, 0xFE, 0xEE, 0xFE, 0xF0, 0xFE, 0xF2, - 0xFB, 0x51, 0xFB, 0x67, 0xFB, 0x5F, 0xFB, 0x53, 0xFB, 0x57, 0xFB, 0x63, 0xFB, 0x5B, 0xFB, 0x77, - 0xFB, 0x73, 0xFB, 0x7B, 0xFB, 0x7F, 0xFB, 0x89, 0xFB, 0x85, 0xFB, 0x83, 0xFB, 0x87, 0xFB, 0x8D, - 0xFB, 0x8B, 0xFB, 0x6B, 0xFB, 0x6F, 0xFB, 0x8F, 0xFB, 0xD4, 0xFB, 0x93, 0xFB, 0x9B, 0xFB, 0x97, - 0xFB, 0x9F, 0xFB, 0xA1, 0xFB, 0xAB, 0xFB, 0xA5, 0xFB, 0xA7, 0xFB, 0xE1, 0xFB, 0xDA, 0xFB, 0xD8, - 0xFB, 0xDC, 0xFB, 0xE3, 0xFB, 0xDF, 0xFB, 0xFD, 0xFB, 0xE5, 0xFB, 0xAF, 0xFB, 0xB1, 0x00, 0x01, - 0x00, 0x4A, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, - 0x06, 0x29, 0x06, 0x2A, 0x06, 0x2B, 0x06, 0x2C, 0x06, 0x2D, 0x06, 0x2E, 0x06, 0x2F, 0x06, 0x30, - 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, - 0x06, 0x39, 0x06, 0x3A, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, - 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4A, 0x06, 0x71, 0x06, 0x79, 0x06, 0x7A, 0x06, 0x7B, - 0x06, 0x7E, 0x06, 0x7F, 0x06, 0x80, 0x06, 0x83, 0x06, 0x84, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, - 0x06, 0x8C, 0x06, 0x8D, 0x06, 0x8E, 0x06, 0x91, 0x06, 0x98, 0x06, 0xA4, 0x06, 0xA6, 0x06, 0xA9, - 0x06, 0xAD, 0x06, 0xAF, 0x06, 0xB1, 0x06, 0xB3, 0x06, 0xBA, 0x06, 0xBB, 0x06, 0xBE, 0x06, 0xC0, - 0x06, 0xC1, 0x06, 0xC5, 0x06, 0xC6, 0x06, 0xC7, 0x06, 0xC8, 0x06, 0xC9, 0x06, 0xCB, 0x06, 0xCC, - 0x06, 0xD0, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x10, 0x98, 0x00, 0x35, 0x00, 0x70, 0x00, 0x7A, 0x01, 0x0C, 0x01, 0x86, 0x01, 0xA8, 0x01, 0xB2, - 0x02, 0x0C, 0x02, 0x62, 0x03, 0x02, 0x03, 0x8A, 0x03, 0xB4, 0x03, 0xF6, 0x04, 0x46, 0x04, 0x8A, - 0x04, 0xBC, 0x04, 0xEC, 0x05, 0x26, 0x05, 0x38, 0x05, 0x42, 0x05, 0x64, 0x05, 0xF8, 0x06, 0x6C, - 0x06, 0xEC, 0x07, 0x80, 0x08, 0x1E, 0x08, 0x56, 0x08, 0xBA, 0x08, 0xF2, 0x09, 0x38, 0x09, 0x66, - 0x09, 0x78, 0x09, 0x82, 0x09, 0xD4, 0x0A, 0x0E, 0x0A, 0x40, 0x0A, 0x70, 0x0A, 0xCC, 0x0A, 0xF2, - 0x0B, 0x38, 0x0B, 0x68, 0x0B, 0xDC, 0x0C, 0x2A, 0x0C, 0xD6, 0x0D, 0x72, 0x0E, 0x16, 0x0E, 0x50, - 0x0E, 0xC8, 0x0F, 0x5A, 0x0F, 0xA8, 0x0F, 0xB6, 0x0F, 0xC0, 0x0F, 0xCA, 0x10, 0x2E, 0x00, 0x01, - 0x00, 0x04, 0xFB, 0xDD, 0x00, 0x02, 0x06, 0x74, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, - 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFB, 0xEC, - 0x00, 0x02, 0x00, 0x01, 0xFB, 0xF0, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF2, 0x00, 0x02, 0xFB, 0xDA, - 0xFB, 0xF4, 0x00, 0x02, 0xFB, 0xDC, 0xFB, 0xF6, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xF8, 0x00, 0x02, - 0xFB, 0xE7, 0xFB, 0xEA, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x00, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x97, - 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x01, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x98, 0x00, 0x02, 0xFE, 0xA4, - 0xFC, 0x99, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x02, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0x9A, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0x9B, 0x00, 0x02, 0xFE, 0xEC, 0xFB, 0xEE, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xF9, - 0x00, 0x02, 0xFE, 0xF0, 0xFB, 0xFB, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, - 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, - 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0xFB, 0xED, 0x00, 0x02, 0x00, 0x01, - 0xFB, 0xF1, 0x00, 0x02, 0xFB, 0xD8, 0xFB, 0xF3, 0x00, 0x02, 0xFB, 0xDA, 0xFB, 0xF5, 0x00, 0x02, - 0xFB, 0xDC, 0xFB, 0xF7, 0x00, 0x02, 0xFB, 0xE5, 0xFB, 0xEB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x64, - 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x65, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x66, 0x00, 0x02, 0xFE, 0xE2, - 0xFC, 0xDF, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x67, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE0, 0x00, 0x02, - 0xFE, 0xEC, 0xFB, 0xEF, 0x00, 0x02, 0xFE, 0xEE, 0xFB, 0xFA, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x69, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFD, 0x3D, 0x00, 0x02, - 0x06, 0x4B, 0xFD, 0xF3, 0x00, 0x04, 0xFE, 0xDB, 0xFE, 0x92, 0xFE, 0xAE, 0xFD, 0xF2, 0x00, 0x04, - 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3C, 0x00, 0x02, 0x06, 0x4B, - 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, - 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0xFC, 0x05, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x9C, - 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x06, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x9D, 0x00, 0x02, 0xFE, 0xA4, - 0xFC, 0x07, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0x9E, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x08, 0x00, 0x02, - 0xFE, 0xE2, 0xFC, 0x9F, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA0, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x09, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x0A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, - 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, - 0xFD, 0xC2, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x9E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, - 0xFC, 0x6A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x6B, 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x6C, 0x00, 0x02, - 0xFE, 0xE2, 0xFC, 0xE1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x6D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE2, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x6E, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x6F, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x50, - 0x00, 0x56, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, - 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9A, 0xFC, 0x0B, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x50, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xA1, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x0C, 0x00, 0x02, 0xFE, 0xA2, - 0xFD, 0x52, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0x53, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, - 0xFC, 0xA2, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x0D, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x54, 0x00, 0x03, - 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xA3, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x0E, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0x55, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x56, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, - 0xFD, 0x57, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFC, 0xA4, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xA5, - 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x0F, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x10, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x0F, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x38, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, - 0xFD, 0xA0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x9F, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, - 0xFD, 0x51, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0x9E, 0xFD, 0xA2, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, - 0xFD, 0xA1, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFC, 0x70, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x71, - 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x72, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xA4, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF0, 0xFD, 0xA3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xE3, 0x00, 0x02, 0xFE, 0xE4, - 0xFC, 0x73, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xE4, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x74, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0x75, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0xFC, 0x11, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0x12, 0x00, 0x02, 0xFE, 0xE2, - 0xFC, 0xA6, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x14, 0x00, 0x02, - 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x36, 0x00, 0x3C, 0xFC, 0x76, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x77, 0x00, 0x02, 0xFE, 0xB0, - 0xFC, 0x78, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xE5, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x79, 0x00, 0x02, - 0xFE, 0xE6, 0xFC, 0xE6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x7A, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7B, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x36, - 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4A, 0xFC, 0x15, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xA7, 0x00, 0x02, - 0xFE, 0xA4, 0xFD, 0xFB, 0x00, 0x08, 0xFE, 0xDE, 0x00, 0x20, 0xFE, 0x9F, 0xFE, 0xE0, 0xFE, 0x8E, - 0xFE, 0xDF, 0xFE, 0xEA, 0xFC, 0x16, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x59, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xA4, 0xFC, 0xA8, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x01, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x02, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, - 0x00, 0x38, 0x00, 0x3E, 0xFD, 0xA6, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xBE, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x58, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xA7, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xA5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1D, 0x00, 0x02, - 0xFE, 0xF0, 0xFD, 0x1E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, - 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x17, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xA9, 0x00, 0x02, - 0xFE, 0xA0, 0xFC, 0x18, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xAA, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xFF, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x00, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, - 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0xBF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x5B, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x5A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFD, 0x1B, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1C, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, - 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0xFC, 0x19, 0x00, 0x02, 0xFE, 0x9E, - 0xFC, 0xAB, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1A, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0x1B, 0x00, 0x02, - 0xFE, 0xE2, 0xFC, 0xAC, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x03, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x04, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFD, 0x1F, 0x00, 0x02, 0xFE, 0xF0, - 0xFD, 0x20, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5B, 0x00, 0x02, 0x06, 0x70, - 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x18, 0xFC, 0x5C, 0x00, 0x02, 0x06, 0x70, 0xFD, 0xFC, - 0x00, 0x04, 0xFB, 0xFE, 0xFE, 0x8E, 0xFE, 0xDD, 0xFD, 0xF6, 0x00, 0x04, 0xFE, 0xB3, 0xFE, 0xEE, - 0xFE, 0xDD, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, - 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFC, 0x1C, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x5D, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xA4, 0xFC, 0xAD, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, 0x02, 0xFE, 0xA2, - 0xFD, 0x5C, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFC, 0xAE, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x1E, - 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xAF, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0E, 0x00, 0x02, 0xFE, 0xAE, - 0xFC, 0x1F, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x61, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x60, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x63, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB0, - 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x31, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFB, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0xFC, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x68, - 0x00, 0x6E, 0xFD, 0x5E, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, 0xFD, 0x34, 0x00, 0x02, 0xFE, 0xA0, - 0xFD, 0x35, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xA8, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF0, 0xFD, 0xC6, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, 0xFD, 0x36, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x2A, 0x00, 0x02, - 0xFE, 0xAE, 0xFD, 0x5F, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x62, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE2, 0xFC, 0xE7, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xE8, 0x00, 0x02, 0xFE, 0xEC, 0xFD, 0x17, - 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x18, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0F, 0x00, 0x20, 0x00, 0x26, - 0x00, 0x2C, 0x00, 0x32, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, - 0x00, 0x60, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0xFD, 0x09, 0x00, 0x02, 0xFE, 0x9E, - 0xFD, 0x2D, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0x0A, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x68, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xE4, 0xFD, 0x2E, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x0B, 0x00, 0x02, 0xFE, 0xA6, - 0xFD, 0x2F, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0D, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x0C, 0x00, 0x02, - 0xFE, 0xE2, 0xFD, 0x6B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA8, 0xFD, 0x6D, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE4, 0xFD, 0x30, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x32, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0xFD, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFE, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, - 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, - 0x00, 0x66, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, 0xFD, 0x25, - 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x69, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x37, 0x00, 0x02, - 0xFE, 0xA0, 0xFD, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x67, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, - 0xFD, 0xAA, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x38, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0x27, - 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x39, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x29, 0x00, 0x02, 0xFE, 0xAE, - 0xFD, 0x28, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x6A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA6, 0xFD, 0x6C, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFC, 0xE9, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xEA, 0x00, 0x02, - 0xFE, 0xEC, 0xFD, 0x19, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x1A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, - 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x50, - 0x00, 0x76, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x92, 0x00, 0x98, 0xFC, 0x20, 0x00, 0x02, - 0xFE, 0xA2, 0xFD, 0x65, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA4, 0xFC, 0xB1, 0x00, 0x02, 0xFE, 0xA4, - 0xFC, 0xB2, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x0F, 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0xF0, 0x00, 0x03, - 0xFE, 0xE0, 0xFB, 0xAF, 0xFD, 0xF5, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xCC, 0xFE, 0xE2, 0xFD, 0xFA, - 0x00, 0x12, 0xFE, 0xE0, 0xFE, 0xF0, 0x00, 0x20, 0xFE, 0x8D, 0xFE, 0xDF, 0xFE, 0xE0, 0xFE, 0xEA, - 0x00, 0x20, 0xFE, 0xCB, 0xFE, 0xE0, 0xFE, 0xF4, 0xFE, 0xEA, 0x00, 0x20, 0xFE, 0xED, 0xFE, 0xB3, - 0xFE, 0xE0, 0xFE, 0xE2, 0xFD, 0xF9, 0x00, 0x03, 0xFE, 0xE0, 0xFE, 0xF0, 0xFC, 0x21, 0x00, 0x02, - 0xFE, 0xE2, 0xFD, 0xC5, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xB3, 0x00, 0x02, 0xFE, 0xE4, - 0xFD, 0x05, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x06, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x64, 0x00, 0x03, 0xFE, 0xA4, - 0xFE, 0xA2, 0xFD, 0xA9, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x2B, 0x00, 0x02, 0xFE, 0xAE, - 0xFD, 0x66, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0x21, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x22, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, - 0x00, 0x38, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0xFC, 0x22, - 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xB4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x23, 0x00, 0x02, 0xFE, 0xA2, - 0xFC, 0xB5, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x24, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x70, 0x00, 0x03, - 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xB6, 0x00, 0x02, 0xFE, 0xA8, 0xFD, 0x10, 0x00, 0x02, 0xFE, 0xAE, - 0xFC, 0x25, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xB7, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x07, 0x00, 0x02, - 0xFE, 0xF0, 0xFD, 0x08, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, - 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0xFD, 0x6E, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0xAB, - 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0x6F, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0x2C, - 0x00, 0x02, 0xFE, 0xAE, 0xFD, 0x23, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x24, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, - 0x00, 0x40, 0xFC, 0x26, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xB8, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x27, - 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x72, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFD, 0x73, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xE4, 0xFD, 0x33, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF5, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0xF6, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, - 0x00, 0x28, 0xFD, 0x71, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x74, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF2, 0xFD, 0x3A, 0x00, 0x02, 0xFE, 0xE4, 0xFD, 0x11, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x12, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0xFC, 0x28, 0x00, 0x02, 0xFE, 0xE2, - 0xFC, 0xB9, 0x00, 0x02, 0xFE, 0xE4, 0x00, 0x01, 0x00, 0x04, 0xFD, 0x3B, 0x00, 0x02, 0xFE, 0xE4, - 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x32, 0x00, 0x38, 0x00, 0x40, - 0x00, 0x46, 0x00, 0x4C, 0xFC, 0x29, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0xC4, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xE4, 0xFC, 0xBA, 0x00, 0x02, 0xFE, 0xA0, 0xFD, 0xF7, 0x00, 0x04, 0xFE, 0xE0, 0xFE, 0xF4, - 0xFE, 0xEA, 0xFC, 0x2A, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x77, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, - 0xFC, 0xBB, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xF7, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xF8, 0x00, 0x02, - 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x34, - 0xFD, 0x75, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x76, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, - 0xFD, 0x78, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0xB6, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, - 0xFD, 0x13, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x14, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0xFC, 0x2B, 0x00, 0x02, 0xFE, 0x9E, - 0xFC, 0xBC, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x2C, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xBD, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0xF9, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0xFA, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, - 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0xFD, 0x79, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE2, 0xFD, 0x7B, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF0, 0xFD, 0x7A, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF2, 0xFD, 0x15, 0x00, 0x02, 0xFE, 0xF0, 0xFD, 0x16, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0B, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x44, - 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0xFC, 0x2D, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xBE, 0x00, 0x02, - 0xFE, 0xA0, 0xFC, 0x2E, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xBF, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x2F, - 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x7D, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xC0, 0x00, 0x02, - 0xFE, 0xA8, 0xFC, 0x30, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xC1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x31, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x32, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, - 0x00, 0x1A, 0x00, 0x20, 0xFD, 0x7C, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFD, 0xC1, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7C, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x7D, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, - 0x00, 0x40, 0xFC, 0x33, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC2, 0x00, 0x02, 0xFE, 0xA4, 0xFD, 0xF1, - 0x00, 0x03, 0xFE, 0xE0, 0xFB, 0xAF, 0xFC, 0x34, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB4, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xC3, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x35, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x36, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, - 0x00, 0x2A, 0xFD, 0x7E, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0x7F, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xE2, 0xFD, 0xB2, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0x7E, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x7F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x6E, 0xFC, 0x37, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x38, 0x00, 0x02, 0xFE, 0x9E, - 0xFC, 0xC4, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x39, 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xC5, 0x00, 0x02, - 0xFE, 0xA4, 0xFC, 0x3A, 0x00, 0x02, 0xFE, 0xA6, 0xFC, 0xC6, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x3B, - 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xC7, 0x00, 0x02, 0xFE, 0xE0, 0xFC, 0x3C, 0x00, 0x02, 0xFE, 0xE2, - 0xFD, 0xC3, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xC8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x3D, - 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x3E, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, - 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0x80, - 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x81, 0x00, 0x02, 0xFE, 0xDE, 0xFC, 0xEB, 0x00, 0x02, 0xFE, 0xE0, - 0xFC, 0x82, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xBB, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, 0xFD, 0xB7, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEC, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x83, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0x84, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, - 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x50, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, - 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, - 0x00, 0xA6, 0xFE, 0xF5, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF7, 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xF9, - 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFB, 0x00, 0x02, 0xFE, 0x8E, 0xFC, 0x3F, 0x00, 0x02, 0xFE, 0x9E, - 0xFD, 0x83, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA0, 0xFD, 0xBA, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE4, - 0xFC, 0xC9, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x40, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0xB5, 0x00, 0x03, - 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCA, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x41, 0x00, 0x02, 0xFE, 0xA6, - 0xFD, 0x86, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xCB, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x42, - 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x88, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA4, 0xFC, 0xCC, 0x00, 0x02, - 0xFE, 0xE4, 0xFC, 0xCD, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x43, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x44, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x11, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, - 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7A, - 0x00, 0x82, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0xFE, 0xF6, 0x00, 0x02, 0xFE, 0x82, 0xFE, 0xF8, - 0x00, 0x02, 0xFE, 0x84, 0xFE, 0xFA, 0x00, 0x02, 0xFE, 0x88, 0xFE, 0xFC, 0x00, 0x02, 0xFE, 0x8E, - 0xFD, 0x84, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0x9E, 0xFD, 0xBC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, - 0xFD, 0xAC, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x80, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE2, - 0xFD, 0x82, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, 0xFD, 0x81, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, - 0xFD, 0x85, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE2, 0xFC, 0x85, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x87, - 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA2, 0xFD, 0xAD, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xED, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x86, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x87, 0x00, 0x02, 0xFE, 0xF2, - 0x00, 0x12, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, - 0x00, 0x58, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8C, - 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0xFC, 0x45, 0x00, 0x02, 0xFE, 0x9E, 0xFD, 0x8C, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x92, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA8, 0xFD, 0x8D, 0x00, 0x03, - 0xFE, 0xA0, 0xFE, 0xE4, 0xFC, 0xCE, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x46, 0x00, 0x02, 0xFE, 0xA2, - 0xFD, 0x89, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xA0, 0xFD, 0xF4, 0x00, 0x04, 0xFE, 0xA4, 0xFE, 0xE4, - 0xFE, 0xAA, 0xFD, 0x8A, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xCF, 0x00, 0x02, 0xFE, 0xA4, - 0xFC, 0x47, 0x00, 0x02, 0xFE, 0xA6, 0xFD, 0x8E, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xA0, 0xFD, 0x8F, - 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xE4, 0xFC, 0xD0, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x48, 0x00, 0x02, - 0xFE, 0xE2, 0xFC, 0xD1, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x49, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x4A, - 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, - 0x00, 0x32, 0xFC, 0x88, 0x00, 0x02, 0xFE, 0x8E, 0xFD, 0xC0, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, - 0xFD, 0x8B, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFD, 0xB9, 0x00, 0x03, 0xFE, 0xA8, 0xFE, 0xF2, - 0xFC, 0x89, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0xB1, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0x00, 0x0E, - 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4E, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, 0x00, 0x72, 0xFC, 0x4B, 0x00, 0x02, - 0xFE, 0x9E, 0xFD, 0xB8, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA4, 0xFD, 0x98, 0x00, 0x03, 0xFE, 0xA0, - 0xFE, 0xE4, 0xFC, 0xD2, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x4C, 0x00, 0x02, 0xFE, 0xA2, 0xFD, 0x95, - 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xE4, 0xFC, 0xD3, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x4D, 0x00, 0x02, - 0xFE, 0xA6, 0xFC, 0xD4, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x4E, 0x00, 0x02, 0xFE, 0xE2, 0xFC, 0xD5, - 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xD6, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x4F, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x50, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x3A, - 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, - 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0xFD, 0xBD, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xA2, - 0xFD, 0x97, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xE2, 0xFD, 0x99, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF0, - 0xFD, 0xC7, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0x96, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF0, - 0xFD, 0xB3, 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x8A, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x8B, - 0x00, 0x02, 0xFE, 0xB0, 0xFC, 0x8C, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9B, 0x00, 0x03, 0xFE, 0xE4, - 0xFE, 0xF0, 0xFD, 0x9A, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xEE, 0x00, 0x02, 0xFE, 0xE4, - 0xFC, 0x8D, 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xEF, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x8E, 0x00, 0x02, - 0xFE, 0xF0, 0xFC, 0x8F, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, - 0x00, 0x26, 0x00, 0x2C, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0xFC, 0xD9, 0x00, 0x02, - 0x06, 0x70, 0xFC, 0x51, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xD7, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x52, - 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x93, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xA0, 0xFD, 0x94, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xD8, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x53, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x54, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x04, 0xFD, 0xF8, 0x00, 0x04, 0xFE, 0xB3, - 0xFE, 0xE0, 0xFE, 0xE2, 0x00, 0x01, 0x00, 0x04, 0xFC, 0x5D, 0x00, 0x02, 0x06, 0x70, 0x00, 0x01, - 0x00, 0x04, 0xFC, 0x90, 0x00, 0x02, 0x06, 0x70, 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, - 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, - 0x00, 0x5E, 0xFC, 0x55, 0x00, 0x02, 0xFE, 0x9E, 0xFC, 0xDA, 0x00, 0x02, 0xFE, 0xA0, 0xFC, 0x56, - 0x00, 0x02, 0xFE, 0xA2, 0xFC, 0xDB, 0x00, 0x02, 0xFE, 0xA4, 0xFC, 0x57, 0x00, 0x02, 0xFE, 0xA6, - 0xFC, 0xDC, 0x00, 0x02, 0xFE, 0xA8, 0xFC, 0x58, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9D, 0x00, 0x03, - 0xFE, 0xE4, 0xFE, 0xE4, 0xFC, 0xDD, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0xDE, 0x00, 0x02, 0xFE, 0xEC, - 0xFC, 0x59, 0x00, 0x02, 0xFE, 0xF0, 0xFC, 0x5A, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x0C, 0x00, 0x1A, - 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x52, - 0x00, 0x58, 0x00, 0x5E, 0x00, 0x64, 0xFD, 0xAF, 0x00, 0x03, 0xFE, 0xA0, 0xFE, 0xF2, 0xFD, 0xAE, - 0x00, 0x03, 0xFE, 0xA4, 0xFE, 0xF2, 0xFC, 0x91, 0x00, 0x02, 0xFE, 0xAE, 0xFC, 0x92, 0x00, 0x02, - 0xFE, 0xB0, 0xFC, 0x93, 0x00, 0x02, 0xFE, 0xE2, 0xFD, 0x9C, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xE2, - 0xFD, 0xB0, 0x00, 0x03, 0xFE, 0xE4, 0xFE, 0xF2, 0xFC, 0xF0, 0x00, 0x02, 0xFE, 0xE4, 0xFC, 0x94, - 0x00, 0x02, 0xFE, 0xE6, 0xFC, 0xF1, 0x00, 0x02, 0xFE, 0xEC, 0xFC, 0x95, 0x00, 0x02, 0xFE, 0xF0, - 0xFC, 0x96, 0x00, 0x02, 0xFE, 0xF2, 0x00, 0x01, 0x00, 0x35, 0xFB, 0xD7, 0xFE, 0x8B, 0xFE, 0x8C, - 0xFE, 0x8D, 0xFE, 0x8E, 0xFE, 0x91, 0xFE, 0x92, 0xFE, 0x97, 0xFE, 0x98, 0xFE, 0x9B, 0xFE, 0x9C, - 0xFE, 0x9F, 0xFE, 0xA0, 0xFE, 0xA3, 0xFE, 0xA4, 0xFE, 0xA7, 0xFE, 0xA8, 0xFE, 0xAB, 0xFE, 0xAD, - 0xFE, 0xB3, 0xFE, 0xB4, 0xFE, 0xB7, 0xFE, 0xB8, 0xFE, 0xBB, 0xFE, 0xBC, 0xFE, 0xBF, 0xFE, 0xC0, - 0xFE, 0xC3, 0xFE, 0xC4, 0xFE, 0xC7, 0xFE, 0xC8, 0xFE, 0xCB, 0xFE, 0xCC, 0xFE, 0xCF, 0xFE, 0xD0, - 0xFE, 0xD3, 0xFE, 0xD4, 0xFE, 0xD7, 0xFE, 0xD8, 0xFE, 0xDB, 0xFE, 0xDC, 0xFE, 0xDF, 0xFE, 0xE0, - 0xFE, 0xE3, 0xFE, 0xE4, 0xFE, 0xE7, 0xFE, 0xE8, 0xFE, 0xEB, 0xFE, 0xED, 0xFE, 0xEF, 0xFE, 0xF0, - 0xFE, 0xF3, 0xFE, 0xF4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A, - 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x09, 0xCB, 0x00, 0x02, 0x09, 0xBE, - 0x09, 0xCC, 0x00, 0x02, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x01, 0x09, 0xC7, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x02, - 0x09, 0xC7, 0x09, 0xBE, 0x00, 0x02, 0x09, 0xC7, 0x09, 0xD7, 0x00, 0x01, 0x00, 0x02, 0x09, 0xCB, - 0x09, 0xCC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x02, 0x66, 0x00, 0x20, - 0x00, 0x46, 0x00, 0x50, 0x00, 0x62, 0x00, 0x74, 0x00, 0x96, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xDC, - 0x00, 0xEE, 0x00, 0xF8, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x4A, 0x01, 0x5C, - 0x01, 0x7E, 0x01, 0x90, 0x01, 0x9A, 0x01, 0xC4, 0x01, 0xD6, 0x01, 0xE0, 0x02, 0x02, 0x02, 0x0C, - 0x02, 0x16, 0x02, 0x20, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3E, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5C, - 0x00, 0x01, 0x00, 0x04, 0x04, 0x07, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, - 0x04, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD2, 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x04, 0x03, 0x00, 0x02, 0x03, 0x01, 0x04, 0x03, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, - 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD6, - 0x00, 0x02, 0x03, 0x06, 0x04, 0x01, 0x00, 0x02, 0x03, 0x08, 0x04, 0x00, 0x00, 0x02, 0x03, 0x40, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xDC, 0x00, 0x02, - 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDE, 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x04, 0x0D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE2, - 0x00, 0x02, 0x03, 0x04, 0x04, 0x19, 0x00, 0x02, 0x03, 0x06, 0x04, 0xE4, 0x00, 0x02, 0x03, 0x08, - 0x04, 0x0D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x0C, 0x00, 0x02, - 0x03, 0x01, 0x04, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x04, 0xE6, 0x00, 0x02, - 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEE, 0x00, 0x02, - 0x03, 0x04, 0x04, 0x0E, 0x00, 0x02, 0x03, 0x06, 0x04, 0xF0, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF2, - 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF4, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, - 0x00, 0x04, 0x04, 0xF8, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEC, 0x00, 0x02, - 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xD1, 0x00, 0x02, 0x03, 0x06, 0x04, 0xD3, - 0x00, 0x02, 0x03, 0x08, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x53, 0x00, 0x02, 0x03, 0x01, - 0x04, 0x53, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, - 0x04, 0x50, 0x00, 0x02, 0x03, 0x00, 0x04, 0xD7, 0x00, 0x02, 0x03, 0x06, 0x04, 0x51, 0x00, 0x02, - 0x03, 0x08, 0x04, 0x50, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x04, 0xC2, - 0x00, 0x02, 0x03, 0x06, 0x04, 0xDD, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDF, - 0x00, 0x02, 0x03, 0x08, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, - 0x04, 0x5D, 0x00, 0x02, 0x03, 0x00, 0x04, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x04, 0x39, 0x00, 0x02, - 0x03, 0x06, 0x04, 0xE5, 0x00, 0x02, 0x03, 0x08, 0x04, 0x5D, 0x00, 0x02, 0x03, 0x40, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x01, 0x04, 0x5C, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x01, 0x00, 0x04, 0x04, 0xE7, 0x00, 0x02, 0x03, 0x08, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x04, 0xEF, 0x00, 0x02, 0x03, 0x04, 0x04, 0x5E, 0x00, 0x02, 0x03, 0x06, - 0x04, 0xF1, 0x00, 0x02, 0x03, 0x08, 0x04, 0xF3, 0x00, 0x02, 0x03, 0x0B, 0x00, 0x01, 0x00, 0x04, - 0x04, 0xF5, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xF9, 0x00, 0x02, 0x03, 0x08, - 0x00, 0x01, 0x00, 0x04, 0x04, 0xED, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x57, - 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0x76, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, - 0x00, 0x04, 0x04, 0x77, 0x00, 0x02, 0x03, 0x0F, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDA, 0x00, 0x02, - 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xDB, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, - 0x04, 0xEA, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x04, 0xEB, 0x00, 0x02, 0x03, 0x08, - 0x00, 0x01, 0x00, 0x20, 0x04, 0x06, 0x04, 0x10, 0x04, 0x13, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, - 0x04, 0x18, 0x04, 0x1A, 0x04, 0x1E, 0x04, 0x23, 0x04, 0x27, 0x04, 0x2B, 0x04, 0x2D, 0x04, 0x30, - 0x04, 0x33, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x3A, 0x04, 0x3E, 0x04, 0x43, - 0x04, 0x47, 0x04, 0x4B, 0x04, 0x4D, 0x04, 0x56, 0x04, 0x74, 0x04, 0x75, 0x04, 0xD8, 0x04, 0xD9, - 0x04, 0xE8, 0x04, 0xE9, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x02, 0x1C, 0x00, 0x01, - 0x01, 0xA6, 0x00, 0x34, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, - 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, - 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, - 0x00, 0xF2, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0A, 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, - 0x01, 0x22, 0x01, 0x28, 0x01, 0x2E, 0x01, 0x34, 0x01, 0x3A, 0x01, 0x40, 0x01, 0x46, 0x01, 0x4C, - 0x01, 0x52, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7C, - 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x00, 0x02, 0x04, 0x15, - 0x03, 0x00, 0x00, 0x02, 0x04, 0x15, 0x03, 0x08, 0x00, 0x02, 0x04, 0x13, 0x03, 0x01, 0x00, 0x02, - 0x04, 0x06, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x01, 0x00, 0x02, 0x04, 0x18, 0x03, 0x00, - 0x00, 0x02, 0x04, 0x23, 0x03, 0x06, 0x00, 0x02, 0x04, 0x18, 0x03, 0x06, 0x00, 0x02, 0x04, 0x38, - 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x00, 0x00, 0x02, 0x04, 0x35, 0x03, 0x08, 0x00, 0x02, - 0x04, 0x33, 0x03, 0x01, 0x00, 0x02, 0x04, 0x56, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x01, - 0x00, 0x02, 0x04, 0x38, 0x03, 0x00, 0x00, 0x02, 0x04, 0x43, 0x03, 0x06, 0x00, 0x02, 0x04, 0x74, - 0x03, 0x0F, 0x00, 0x02, 0x04, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x04, 0x16, 0x03, 0x06, 0x00, 0x02, - 0x04, 0x36, 0x03, 0x06, 0x00, 0x02, 0x04, 0x10, 0x03, 0x06, 0x00, 0x02, 0x04, 0x30, 0x03, 0x06, - 0x00, 0x02, 0x04, 0x10, 0x03, 0x08, 0x00, 0x02, 0x04, 0x30, 0x03, 0x08, 0x00, 0x02, 0x04, 0x15, - 0x03, 0x06, 0x00, 0x02, 0x04, 0x35, 0x03, 0x06, 0x00, 0x02, 0x04, 0xD8, 0x03, 0x08, 0x00, 0x02, - 0x04, 0xD9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x16, 0x03, 0x08, 0x00, 0x02, 0x04, 0x36, 0x03, 0x08, - 0x00, 0x02, 0x04, 0x17, 0x03, 0x08, 0x00, 0x02, 0x04, 0x37, 0x03, 0x08, 0x00, 0x02, 0x04, 0x18, - 0x03, 0x04, 0x00, 0x02, 0x04, 0x38, 0x03, 0x04, 0x00, 0x02, 0x04, 0x18, 0x03, 0x08, 0x00, 0x02, - 0x04, 0x38, 0x03, 0x08, 0x00, 0x02, 0x04, 0x1E, 0x03, 0x08, 0x00, 0x02, 0x04, 0x3E, 0x03, 0x08, - 0x00, 0x02, 0x04, 0xE8, 0x03, 0x08, 0x00, 0x02, 0x04, 0xE9, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2D, - 0x03, 0x08, 0x00, 0x02, 0x04, 0x4D, 0x03, 0x08, 0x00, 0x02, 0x04, 0x23, 0x03, 0x04, 0x00, 0x02, - 0x04, 0x43, 0x03, 0x04, 0x00, 0x02, 0x04, 0x23, 0x03, 0x08, 0x00, 0x02, 0x04, 0x43, 0x03, 0x08, - 0x00, 0x02, 0x04, 0x23, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x43, 0x03, 0x0B, 0x00, 0x02, 0x04, 0x27, - 0x03, 0x08, 0x00, 0x02, 0x04, 0x47, 0x03, 0x08, 0x00, 0x02, 0x04, 0x2B, 0x03, 0x08, 0x00, 0x02, - 0x04, 0x4B, 0x03, 0x08, 0x00, 0x01, 0x00, 0x34, 0x04, 0x00, 0x04, 0x01, 0x04, 0x03, 0x04, 0x07, - 0x04, 0x0C, 0x04, 0x0D, 0x04, 0x0E, 0x04, 0x19, 0x04, 0x39, 0x04, 0x50, 0x04, 0x51, 0x04, 0x53, - 0x04, 0x57, 0x04, 0x5C, 0x04, 0x5D, 0x04, 0x5E, 0x04, 0x76, 0x04, 0x77, 0x04, 0xC1, 0x04, 0xC2, - 0x04, 0xD0, 0x04, 0xD1, 0x04, 0xD2, 0x04, 0xD3, 0x04, 0xD6, 0x04, 0xD7, 0x04, 0xDA, 0x04, 0xDB, - 0x04, 0xDC, 0x04, 0xDD, 0x04, 0xDE, 0x04, 0xDF, 0x04, 0xE2, 0x04, 0xE3, 0x04, 0xE4, 0x04, 0xE5, - 0x04, 0xE6, 0x04, 0xE7, 0x04, 0xEA, 0x04, 0xEB, 0x04, 0xEC, 0x04, 0xED, 0x04, 0xEE, 0x04, 0xEF, - 0x04, 0xF0, 0x04, 0xF1, 0x04, 0xF2, 0x04, 0xF3, 0x04, 0xF4, 0x04, 0xF5, 0x04, 0xF8, 0x04, 0xF9, - 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, - 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x02, 0x04, 0x15, 0x03, 0x40, 0x00, 0x02, 0x04, 0x13, - 0x03, 0x41, 0x00, 0x02, 0x04, 0x1A, 0x03, 0x41, 0x00, 0x02, 0x04, 0x18, 0x03, 0x40, 0x00, 0x02, - 0x04, 0x35, 0x03, 0x40, 0x00, 0x02, 0x04, 0x33, 0x03, 0x41, 0x00, 0x02, 0x04, 0x3A, 0x03, 0x41, - 0x00, 0x02, 0x04, 0x38, 0x03, 0x40, 0x00, 0x01, 0x00, 0x08, 0x04, 0x00, 0x04, 0x03, 0x04, 0x0C, - 0x04, 0x0D, 0x04, 0x50, 0x04, 0x53, 0x04, 0x5C, 0x04, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x16, 0x00, 0x20, 0x00, 0x01, - 0x00, 0x04, 0x09, 0x29, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x31, 0x00, 0x02, - 0x09, 0x3C, 0x00, 0x01, 0x00, 0x04, 0x09, 0x34, 0x00, 0x02, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, - 0x09, 0x28, 0x09, 0x30, 0x09, 0x33, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x09, 0x28, 0x09, 0x3C, - 0x00, 0x02, 0x09, 0x30, 0x09, 0x3C, 0x00, 0x02, 0x09, 0x33, 0x09, 0x3C, 0x00, 0x01, 0x00, 0x03, - 0x09, 0x29, 0x09, 0x31, 0x09, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x33, 0x04, 0x00, 0x75, 0x00, 0xF0, 0x01, 0x1A, 0x04, 0x5A, 0x05, 0x0C, 0x08, 0x3C, 0x09, 0x24, - 0x09, 0xD6, 0x09, 0xE0, 0x0A, 0x54, 0x0D, 0x84, 0x0D, 0x8E, 0x0D, 0x98, 0x11, 0x44, 0x11, 0xF6, - 0x15, 0x92, 0x16, 0xBC, 0x17, 0x6E, 0x17, 0x88, 0x18, 0xB2, 0x1C, 0x4E, 0x1C, 0x78, 0x1C, 0xA2, - 0x1C, 0xAC, 0x1C, 0xC6, 0x1D, 0x5C, 0x1D, 0xF2, 0x1D, 0xFC, 0x1E, 0x06, 0x1E, 0x10, 0x1E, 0x1A, - 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0xC4, 0x1F, 0x5A, 0x1F, 0x64, 0x1F, 0x6E, 0x1F, 0x78, 0x1F, 0x82, - 0x1F, 0x8C, 0x1F, 0x96, 0x1F, 0xB8, 0x1F, 0xDA, 0x1F, 0xFC, 0x20, 0x1E, 0x20, 0xB4, 0x21, 0x4A, - 0x21, 0x54, 0x21, 0x5E, 0x21, 0x68, 0x21, 0x72, 0x21, 0x7C, 0x21, 0x86, 0x22, 0x1C, 0x22, 0xB2, - 0x22, 0xBC, 0x22, 0xC6, 0x22, 0xD0, 0x22, 0xDA, 0x22, 0xE4, 0x22, 0xEE, 0x23, 0x18, 0x23, 0x42, - 0x23, 0x6C, 0x23, 0x96, 0x23, 0xB8, 0x23, 0xDA, 0x23, 0xFC, 0x24, 0x1E, 0x24, 0x48, 0x24, 0x72, - 0x24, 0x9C, 0x25, 0x32, 0x25, 0xC8, 0x25, 0xD2, 0x25, 0xDC, 0x25, 0xE6, 0x25, 0xF0, 0x25, 0xFA, - 0x26, 0x04, 0x26, 0x9A, 0x27, 0x30, 0x27, 0x3A, 0x27, 0x44, 0x27, 0x4E, 0x27, 0x58, 0x27, 0x62, - 0x27, 0x6C, 0x27, 0x76, 0x27, 0x80, 0x27, 0x8A, 0x27, 0x94, 0x27, 0x9E, 0x27, 0xA8, 0x27, 0xD2, - 0x27, 0xFC, 0x28, 0x26, 0x28, 0x50, 0x28, 0x7A, 0x28, 0xA4, 0x28, 0xCE, 0x28, 0xF8, 0x29, 0x22, - 0x29, 0x4C, 0x29, 0x76, 0x29, 0xA0, 0x2A, 0x78, 0x2A, 0x82, 0x2B, 0x32, 0x2C, 0x5C, 0x2C, 0x86, - 0x2D, 0x5E, 0x2D, 0x68, 0x2E, 0x18, 0x2E, 0xF0, 0x2E, 0xFA, 0x2F, 0xAA, 0x2F, 0xD4, 0x00, 0x05, - 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x00, - 0x03, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xED, 0x00, 0x02, 0x03, 0x40, 0x03, 0x85, 0x00, 0x02, - 0x03, 0x41, 0x1F, 0xC1, 0x00, 0x02, 0x03, 0x42, 0x00, 0x4C, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xA6, - 0x00, 0xAC, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xE0, 0x00, 0xE8, - 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x16, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x34, - 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4C, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x70, 0x01, 0x7A, - 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, - 0x01, 0xCE, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, 0x01, 0xF2, 0x01, 0xFC, 0x02, 0x04, - 0x02, 0x0E, 0x02, 0x16, 0x02, 0x20, 0x02, 0x28, 0x02, 0x32, 0x02, 0x3A, 0x02, 0x44, 0x02, 0x4C, - 0x02, 0x56, 0x02, 0x60, 0x02, 0x6A, 0x02, 0x74, 0x02, 0x7E, 0x02, 0x86, 0x02, 0x8C, 0x02, 0x96, - 0x02, 0xA0, 0x02, 0xAA, 0x02, 0xB4, 0x02, 0xBE, 0x02, 0xC6, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, - 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x00, 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, - 0x03, 0x3A, 0x1F, 0xBA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x86, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xB9, - 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB8, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, - 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x08, - 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x8B, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0x89, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x09, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xBA, - 0x00, 0x02, 0x03, 0x40, 0x03, 0x86, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x08, - 0x00, 0x02, 0x03, 0x43, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x8B, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x89, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, - 0x1F, 0x8E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x43, 0x1F, 0xBC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, - 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, - 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, - 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x03, 0x88, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, - 0x03, 0x13, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x01, 0x1F, 0x1B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x41, 0x1F, 0x19, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x88, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x01, 0x1F, 0x1A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x41, 0x1F, 0x18, 0x00, 0x02, 0x03, 0x43, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, - 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, - 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, - 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, - 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, - 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, - 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, - 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, - 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, - 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, - 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x89, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, - 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, - 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, - 0x1F, 0x28, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, - 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x29, 0x00, 0x02, 0x03, 0x14, - 0x1F, 0xCA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x89, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9A, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, - 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, - 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, - 0x1F, 0x28, 0x00, 0x02, 0x03, 0x43, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, - 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, - 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x9D, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x42, 0x1F, 0x99, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x43, 0x1F, 0xCC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x19, 0x00, 0x34, 0x00, 0x3A, - 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, - 0x00, 0x7A, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xAE, - 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x1F, 0xDA, - 0x00, 0x02, 0x03, 0x00, 0x03, 0x8A, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD9, 0x00, 0x02, 0x03, 0x04, - 0x1F, 0xD8, 0x00, 0x02, 0x03, 0x06, 0x03, 0xAA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x3A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x3F, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x42, 0x1F, 0x39, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xDA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8A, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x3C, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x38, 0x00, 0x02, - 0x03, 0x43, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, - 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x00, - 0x03, 0x8C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x4C, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x4A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x4C, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x48, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x4B, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x4B, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x49, 0x00, 0x02, - 0x03, 0x14, 0x1F, 0xF8, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x4A, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x4A, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x48, - 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xEC, 0x00, 0x02, 0x03, 0x14, 0x00, 0x0D, - 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, - 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x00, - 0x03, 0x8E, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE9, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE8, 0x00, 0x02, - 0x03, 0x06, 0x03, 0xAB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, - 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, - 0x1F, 0x5D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x59, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xEA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8E, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, - 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, - 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, - 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, - 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, - 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, - 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, - 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, - 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, - 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, - 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, - 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, - 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, - 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x57, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xBE, 0x00, 0xC6, - 0x00, 0xCC, 0x00, 0xD2, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, - 0x01, 0x0E, 0x01, 0x18, 0x01, 0x20, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, - 0x01, 0x5A, 0x01, 0x64, 0x01, 0x6C, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, - 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB2, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD6, 0x01, 0xE0, - 0x01, 0xEA, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1A, 0x02, 0x22, - 0x02, 0x28, 0x02, 0x30, 0x02, 0x36, 0x02, 0x40, 0x02, 0x48, 0x02, 0x52, 0x02, 0x5A, 0x02, 0x64, - 0x02, 0x6C, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, - 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD8, 0x02, 0xE0, 0x02, 0xEA, 0x02, 0xF4, - 0x02, 0xFE, 0x03, 0x08, 0x03, 0x12, 0x03, 0x1A, 0x03, 0x24, 0x03, 0x2E, 0x03, 0x38, 0x03, 0x42, - 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, 0x03, 0x64, 0x03, 0x6C, 0x03, 0x76, 0x03, 0x80, 0x03, 0x8A, - 0x03, 0x94, 0x03, 0x9E, 0x03, 0xA6, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x70, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0xB1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xB0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0x82, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, - 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, - 0x1F, 0x06, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, - 0x1F, 0x86, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x45, 0x1F, 0x00, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, - 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x01, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, - 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x42, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, - 0x1F, 0x85, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x01, 0x00, 0x02, - 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x70, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xB7, - 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0xB6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, - 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, - 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, - 0x1F, 0x00, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xB4, - 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, - 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, - 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x85, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x42, 0x1F, 0x81, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0x84, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xB3, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, - 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x00, - 0x03, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x14, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x14, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x10, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x13, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0x15, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x11, 0x00, 0x02, - 0x03, 0x14, 0x1F, 0x72, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x12, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x12, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x14, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x10, - 0x00, 0x02, 0x03, 0x43, 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, - 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, - 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, - 0x01, 0x62, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, - 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, - 0x01, 0xF6, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, - 0x02, 0x30, 0x02, 0x38, 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, - 0x02, 0x78, 0x02, 0x80, 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, - 0x02, 0xC0, 0x02, 0xC8, 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, - 0x03, 0x0A, 0x03, 0x14, 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, - 0x03, 0x54, 0x03, 0x5C, 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, - 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, - 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, - 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, - 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, - 0x1F, 0x20, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, - 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x95, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0x91, 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x21, 0x00, 0x02, 0x03, 0x14, - 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x74, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xC4, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x03, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, - 0x03, 0x42, 0x03, 0x45, 0x1F, 0xC6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x20, - 0x00, 0x02, 0x03, 0x43, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x40, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0x93, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x01, 0x1F, 0x93, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x91, 0x00, 0x03, 0x03, 0x45, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, - 0x1F, 0xC4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x42, 0x1F, 0x90, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xC3, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, - 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, - 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, - 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, - 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, - 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, - 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, - 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, - 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, - 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, - 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, - 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, - 0x00, 0x72, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, - 0x00, 0xAC, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCC, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x42, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x44, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x40, - 0x00, 0x02, 0x03, 0x13, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x45, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x41, 0x1F, 0x41, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x78, 0x00, 0x02, 0x03, 0x40, - 0x03, 0xCC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x44, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x44, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x40, 0x00, 0x02, 0x03, 0x43, 0x00, 0x03, 0x00, 0x08, - 0x00, 0x0E, 0x00, 0x14, 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xE5, 0x00, 0x02, 0x03, 0x14, - 0x1F, 0xE4, 0x00, 0x02, 0x03, 0x43, 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, - 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, - 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, - 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, - 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x24, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x00, 0x03, 0xCD, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE1, 0x00, 0x02, 0x03, 0x04, 0x1F, 0xE0, 0x00, 0x02, 0x03, 0x06, - 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, - 0x1F, 0xE2, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, - 0x1F, 0xE7, 0x00, 0x03, 0x03, 0x08, 0x03, 0x42, 0x03, 0xCB, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x52, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x52, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x56, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x53, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x53, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x42, 0x1F, 0x51, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x7A, 0x00, 0x02, 0x03, 0x40, - 0x03, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x52, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x00, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x56, 0x00, 0x03, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0x50, 0x00, 0x02, 0x03, 0x43, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x44, - 0x00, 0x55, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xD2, 0x00, 0xDA, - 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, 0x01, 0x22, - 0x01, 0x2C, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x6C, - 0x01, 0x74, 0x01, 0x7E, 0x01, 0x86, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA2, 0x01, 0xAA, 0x01, 0xB4, - 0x01, 0xBC, 0x01, 0xC6, 0x01, 0xD0, 0x01, 0xDA, 0x01, 0xE4, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFC, - 0x02, 0x04, 0x02, 0x0A, 0x02, 0x12, 0x02, 0x18, 0x02, 0x20, 0x02, 0x26, 0x02, 0x30, 0x02, 0x38, - 0x02, 0x42, 0x02, 0x4A, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x78, 0x02, 0x80, - 0x02, 0x8A, 0x02, 0x94, 0x02, 0x9E, 0x02, 0xA8, 0x02, 0xB2, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC8, - 0x02, 0xD0, 0x02, 0xDA, 0x02, 0xE4, 0x02, 0xEE, 0x02, 0xF8, 0x03, 0x02, 0x03, 0x0A, 0x03, 0x14, - 0x03, 0x1E, 0x03, 0x28, 0x03, 0x32, 0x03, 0x3C, 0x03, 0x44, 0x03, 0x4C, 0x03, 0x54, 0x03, 0x5C, - 0x03, 0x66, 0x03, 0x70, 0x03, 0x7A, 0x03, 0x84, 0x03, 0x8E, 0x03, 0x96, 0x1F, 0xF2, 0x00, 0x03, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x01, - 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, - 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x01, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, - 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, - 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, - 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, - 0x1F, 0x63, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, - 0x03, 0x45, 0x1F, 0x65, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x42, 0x03, 0x45, 0x1F, 0x67, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, - 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA1, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x45, 0x1F, 0x61, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, - 0x03, 0x40, 0x03, 0x45, 0x1F, 0x7C, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x41, - 0x03, 0x45, 0x03, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, - 0x1F, 0xF6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, - 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x40, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, - 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x60, 0x00, 0x02, 0x03, 0x43, - 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, - 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xA3, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xA3, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x14, 0x1F, 0xF2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, - 0x1F, 0xA2, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, - 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xF3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x00, 0x03, 0x90, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x02, 0x03, 0x40, 0x03, 0x90, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0xD7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1F, 0xE2, 0x00, 0x02, 0x03, 0x00, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xE2, - 0x00, 0x02, 0x03, 0x40, 0x03, 0xB0, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xE7, 0x00, 0x02, 0x03, 0x42, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x14, 0x03, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x03, 0xD4, 0x00, 0x02, 0x03, 0x08, 0x03, 0xD3, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, - 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, - 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x02, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x02, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0x84, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x04, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, - 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x06, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x83, 0x00, 0x03, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x03, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x05, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, - 0x1F, 0x03, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x05, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x07, 0x00, 0x02, - 0x03, 0x42, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x85, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x81, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x83, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x86, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, - 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, - 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8A, - 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, - 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x0A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, - 0x1F, 0x0C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0E, - 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x88, 0x00, 0x90, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x0B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8D, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x0D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, - 0x03, 0x42, 0x03, 0x45, 0x1F, 0x0F, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8A, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8E, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x8F, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x12, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0x14, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x12, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0x14, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, - 0x1F, 0x13, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x13, 0x00, 0x02, - 0x03, 0x40, 0x1F, 0x15, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, - 0x00, 0x1C, 0x1F, 0x1A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x1A, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x1B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x1D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x10, 0x00, 0x22, - 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, - 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x92, - 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, - 0x03, 0x01, 0x03, 0x45, 0x1F, 0x24, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x22, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, - 0x1F, 0x24, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x26, - 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x41, 0x1F, 0x96, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x88, 0x00, 0x90, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x93, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x23, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x25, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, - 0x03, 0x42, 0x03, 0x45, 0x1F, 0x27, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x93, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x92, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0x94, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x97, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, - 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, - 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2A, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x2A, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, - 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x9A, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, - 0x03, 0x45, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0x9B, 0x00, 0x03, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x2D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, - 0x1F, 0x2B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x2D, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x2F, 0x00, 0x02, - 0x03, 0x42, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9B, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9E, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x34, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x34, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0x36, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1F, 0x33, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x33, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0x35, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x02, 0x03, 0x42, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3A, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x3A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3C, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x3D, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0x3B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x3D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x3F, - 0x00, 0x02, 0x03, 0x42, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x42, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0x44, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x42, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, - 0x1F, 0x43, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x43, 0x00, 0x02, - 0x03, 0x40, 0x1F, 0x45, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, - 0x00, 0x1C, 0x1F, 0x4A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x4A, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4C, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x4B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x54, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0x52, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x54, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0x56, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1F, 0x53, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x53, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0x55, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x57, 0x00, 0x02, 0x03, 0x42, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x5B, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0x5D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x5B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x5D, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x5F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xA2, 0x00, 0x03, - 0x03, 0x00, 0x03, 0x45, 0x1F, 0x62, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x01, - 0x03, 0x45, 0x1F, 0x64, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, - 0x1F, 0x62, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x64, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x66, 0x00, 0x02, - 0x03, 0x42, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, - 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, - 0x00, 0x90, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x00, - 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, - 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x63, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x65, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x42, - 0x03, 0x45, 0x1F, 0x67, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, - 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, - 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA4, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xA7, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, - 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, - 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x02, 0x03, 0x42, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x45, 0x00, 0x10, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x68, - 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x00, - 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x6D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x02, - 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6F, 0x00, 0x02, 0x03, 0x42, - 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x01, - 0x1F, 0xAB, 0x00, 0x03, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x45, 0x03, 0x41, - 0x1F, 0xAF, 0x00, 0x03, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAB, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAE, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x04, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB2, - 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xC4, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x45, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x45, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1F, 0x82, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0x84, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x02, 0x03, 0x42, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x83, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0x85, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x85, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8E, - 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, - 0x1F, 0x8B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x02, - 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, - 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x00, - 0x1F, 0x94, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x92, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x02, - 0x03, 0x41, 0x1F, 0x96, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x93, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x93, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x97, 0x00, 0x02, - 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9A, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x02, 0x03, 0x40, - 0x1F, 0x9C, 0x00, 0x02, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x00, 0x1F, 0x9D, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x02, 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0x9F, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1F, 0xA2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA2, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x02, 0x03, 0x42, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xA3, 0x00, 0x02, - 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xA3, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xA5, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0xA7, 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAE, - 0x00, 0x02, 0x03, 0x42, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, - 0x1F, 0xAB, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x02, - 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, - 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, - 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, - 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xB2, - 0x00, 0x02, 0x03, 0x00, 0x1F, 0xB4, 0x00, 0x02, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x00, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x40, 0x1F, 0x84, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x42, 0x1F, 0x80, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, - 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x83, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, - 0x1F, 0x85, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x87, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, - 0x1F, 0x81, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xB2, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xB4, 0x00, 0x02, - 0x03, 0x41, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, - 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x82, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0x84, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x86, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, - 0x1F, 0x80, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, 0x1F, 0xB7, 0x00, 0x02, 0x03, 0x45, - 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, - 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, - 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x8C, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x8C, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x88, - 0x00, 0x02, 0x03, 0x13, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x8D, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x01, 0x1F, 0x8B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x8D, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x41, 0x1F, 0x8F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x89, 0x00, 0x02, - 0x03, 0x14, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x01, 0x1F, 0x8A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x8C, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x41, 0x1F, 0x8E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x88, 0x00, 0x02, 0x03, 0x43, - 0x00, 0x20, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, - 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, - 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, - 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, - 0x01, 0x24, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x00, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x01, 0x1F, 0xD1, - 0x00, 0x02, 0x03, 0x04, 0x1F, 0xD0, 0x00, 0x02, 0x03, 0x06, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x00, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1F, 0xD2, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x40, 0x03, 0x90, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x1F, 0xD7, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x42, 0x03, 0xCA, 0x00, 0x02, 0x03, 0x08, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, - 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, - 0x1F, 0x34, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, - 0x1F, 0x30, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x35, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x33, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x35, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x37, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x31, - 0x00, 0x02, 0x03, 0x14, 0x1F, 0x76, 0x00, 0x02, 0x03, 0x40, 0x03, 0xAF, 0x00, 0x02, 0x03, 0x41, - 0x1F, 0xD6, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x34, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x32, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x34, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x36, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x30, - 0x00, 0x02, 0x03, 0x43, 0x03, 0x90, 0x00, 0x02, 0x03, 0x44, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xCE, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0xCD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xCE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xCF, - 0x00, 0x02, 0x03, 0x42, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, - 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, - 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, 0x00, 0xC2, - 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xC2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, - 0x1F, 0x92, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, - 0x1F, 0x96, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x93, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x93, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0x95, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x97, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0x91, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xC2, 0x00, 0x02, - 0x03, 0x40, 0x1F, 0xC4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x42, 0x1F, 0x92, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x92, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0x94, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x96, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0x90, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, 0x00, 0x04, - 0x1F, 0xC7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, 0x00, 0x3E, - 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x7C, - 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0x9A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x00, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x40, 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, - 0x03, 0x13, 0x03, 0x42, 0x1F, 0x98, 0x00, 0x02, 0x03, 0x13, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x00, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0x9B, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x40, 0x1F, 0x9D, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0x9F, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x42, 0x1F, 0x99, 0x00, 0x02, 0x03, 0x14, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, - 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0x9A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0x9C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0x9E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, - 0x1F, 0x98, 0x00, 0x02, 0x03, 0x43, 0x00, 0x17, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x44, - 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, - 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB2, 0x00, 0xBA, - 0x00, 0xC2, 0x00, 0xCA, 0x00, 0xD2, 0x1F, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xF4, 0x00, 0x02, - 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x01, 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x13, - 0x03, 0x41, 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x13, - 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, - 0x1F, 0xA3, 0x00, 0x03, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xA5, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, - 0x1F, 0xA7, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA1, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xF2, - 0x00, 0x02, 0x03, 0x40, 0x1F, 0xF4, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x42, - 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, - 0x1F, 0xA2, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xA4, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, - 0x1F, 0xA6, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA0, 0x00, 0x02, 0x03, 0x43, 0x00, 0x01, - 0x00, 0x04, 0x1F, 0xF7, 0x00, 0x02, 0x03, 0x45, 0x00, 0x12, 0x00, 0x26, 0x00, 0x2E, 0x00, 0x36, - 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x74, - 0x00, 0x7C, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x9A, 0x00, 0xA2, 0x00, 0xAA, 0x1F, 0xAA, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x03, 0x03, 0x43, - 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x02, 0x03, 0x43, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x01, - 0x1F, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1F, 0xDE, 0x00, 0x02, 0x03, 0x41, 0x1F, 0xDF, 0x00, 0x02, - 0x03, 0x42, 0x00, 0x4A, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA2, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBE, - 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, - 0x01, 0x10, 0x01, 0x1A, 0x01, 0x24, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x4E, - 0x01, 0x58, 0x01, 0x60, 0x01, 0x6A, 0x01, 0x72, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8E, 0x01, 0x96, - 0x01, 0xA0, 0x01, 0xAA, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD6, 0x01, 0xDC, - 0x01, 0xE2, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFE, 0x02, 0x06, 0x02, 0x10, 0x02, 0x18, 0x02, 0x22, - 0x02, 0x2A, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x46, 0x02, 0x50, 0x02, 0x5A, 0x02, 0x64, 0x02, 0x6E, - 0x02, 0x76, 0x02, 0x7C, 0x02, 0x86, 0x02, 0x90, 0x02, 0x9A, 0x02, 0xA4, 0x02, 0xAE, 0x02, 0xB6, - 0x02, 0xC0, 0x02, 0xCA, 0x02, 0xD4, 0x02, 0xDE, 0x02, 0xE8, 0x02, 0xF0, 0x02, 0xFA, 0x03, 0x04, - 0x03, 0x0E, 0x03, 0x18, 0x03, 0x22, 0x03, 0x2A, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x00, 0x03, 0x8F, - 0x00, 0x02, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, - 0x00, 0x03, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x13, 0x03, 0x42, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x13, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x13, 0x1F, 0xAB, - 0x00, 0x04, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, 0x03, 0x14, 0x03, 0x00, - 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x1F, 0x6D, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x1F, 0x6B, 0x00, 0x03, - 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6D, - 0x00, 0x03, 0x03, 0x14, 0x03, 0x41, 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, - 0x1F, 0x6F, 0x00, 0x03, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, - 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x14, - 0x03, 0x45, 0x1F, 0x69, 0x00, 0x02, 0x03, 0x14, 0x1F, 0xFA, 0x00, 0x02, 0x03, 0x40, 0x03, 0x8F, - 0x00, 0x02, 0x03, 0x41, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x1F, 0x6A, - 0x00, 0x03, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, - 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x40, - 0x03, 0x45, 0x1F, 0x6A, 0x00, 0x03, 0x03, 0x43, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, - 0x03, 0x41, 0x03, 0x45, 0x1F, 0x6C, 0x00, 0x03, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x1F, 0x6E, 0x00, 0x03, 0x03, 0x43, 0x03, 0x42, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x43, 0x03, 0x45, 0x1F, 0x68, 0x00, 0x02, 0x03, 0x43, 0x1F, 0xAA, - 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, - 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x13, 0x1F, 0xAB, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x00, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x1F, 0xAB, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x1F, 0xAD, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, - 0x1F, 0xAF, 0x00, 0x04, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x1F, 0xA9, 0x00, 0x03, 0x03, 0x45, - 0x03, 0x14, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x1F, 0xAC, 0x00, 0x04, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x1F, 0xAA, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x1F, 0xAC, 0x00, 0x04, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x1F, 0xAE, 0x00, 0x04, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x42, 0x1F, 0xA8, 0x00, 0x03, 0x03, 0x45, 0x03, 0x43, 0x1F, 0xFC, 0x00, 0x02, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x75, 0x00, 0xA8, 0x03, 0x91, 0x03, 0x95, 0x03, 0x97, 0x03, 0x99, - 0x03, 0x9F, 0x03, 0xA1, 0x03, 0xA5, 0x03, 0xA9, 0x03, 0xAC, 0x03, 0xAE, 0x03, 0xB1, 0x03, 0xB5, - 0x03, 0xB7, 0x03, 0xB9, 0x03, 0xBF, 0x03, 0xC1, 0x03, 0xC5, 0x03, 0xC9, 0x03, 0xCA, 0x03, 0xCB, - 0x03, 0xCE, 0x03, 0xD2, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, - 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, - 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x20, 0x1F, 0x21, - 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, - 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, - 0x1F, 0x38, 0x1F, 0x39, 0x1F, 0x40, 0x1F, 0x41, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x50, 0x1F, 0x51, - 0x1F, 0x59, 0x1F, 0x60, 0x1F, 0x61, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, - 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, - 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x71, 0x1F, 0x74, 0x1F, 0x75, 0x1F, 0x7C, 0x1F, 0x7D, 0x1F, 0x80, - 0x1F, 0x81, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0xA0, - 0x1F, 0xA1, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xB3, 0x1F, 0xB6, 0x1F, 0xBC, 0x1F, 0xBE, 0x1F, 0xBF, - 0x1F, 0xC3, 0x1F, 0xC6, 0x1F, 0xCC, 0x1F, 0xF3, 0x1F, 0xF6, 0x1F, 0xFC, 0x1F, 0xFE, 0x21, 0x26, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x4C, 0x09, 0x66, 0x11, 0x1A, 0x17, 0x08, 0x1C, 0xC2, - 0x20, 0xBC, 0x24, 0x9E, 0x27, 0x3C, 0x29, 0x7A, 0x2B, 0x42, 0x2D, 0x22, 0x2E, 0xD2, 0x30, 0x80, - 0x31, 0xE8, 0x33, 0x50, 0x34, 0xB8, 0x35, 0x94, 0x36, 0x70, 0x37, 0x4C, 0x38, 0x1A, 0x38, 0xE8, - 0x39, 0xB6, 0x3A, 0x68, 0x3B, 0x1A, 0x3B, 0x40, 0x3B, 0x66, 0x3B, 0x8C, 0x3B, 0xB2, 0x3B, 0xD8, - 0x3B, 0xFE, 0x3C, 0x24, 0x3C, 0x4A, 0x3C, 0x70, 0x3C, 0x96, 0x3C, 0xBC, 0x00, 0x01, 0x07, 0x46, - 0x00, 0xE8, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, - 0x02, 0x00, 0x02, 0x06, 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, - 0x02, 0x30, 0x02, 0x36, 0x02, 0x3C, 0x02, 0x42, 0x02, 0x48, 0x02, 0x4E, 0x02, 0x54, 0x02, 0x5A, - 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8A, - 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB4, 0x02, 0xBA, - 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, 0x02, 0xD2, 0x02, 0xD8, 0x02, 0xDE, 0x02, 0xE4, 0x02, 0xEA, - 0x02, 0xF0, 0x02, 0xF6, 0x02, 0xFC, 0x03, 0x02, 0x03, 0x08, 0x03, 0x0E, 0x03, 0x14, 0x03, 0x1A, - 0x03, 0x20, 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x44, 0x03, 0x4A, - 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6E, 0x03, 0x74, 0x03, 0x7A, - 0x03, 0x80, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, - 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDA, - 0x03, 0xE0, 0x03, 0xE6, 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, - 0x04, 0x10, 0x04, 0x16, 0x04, 0x1C, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, - 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, - 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, - 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, - 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, - 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, - 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, - 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, - 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, - 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, 0x05, 0xD8, 0x05, 0xDE, 0x05, 0xE4, 0x05, 0xEA, - 0x05, 0xF0, 0x05, 0xF6, 0x05, 0xFC, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0E, 0x06, 0x14, 0x06, 0x1A, - 0x06, 0x20, 0x06, 0x26, 0x06, 0x2C, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3E, 0x06, 0x44, 0x06, 0x4A, - 0x06, 0x50, 0x06, 0x56, 0x06, 0x5C, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6E, 0x06, 0x74, 0x06, 0x7A, - 0x06, 0x80, 0x06, 0x86, 0x06, 0x8C, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9E, 0x06, 0xA4, 0x06, 0xAA, - 0x06, 0xB0, 0x06, 0xB6, 0x06, 0xBC, 0x06, 0xC2, 0x06, 0xC8, 0x06, 0xCE, 0x06, 0xD4, 0x06, 0xDA, - 0x06, 0xE0, 0x06, 0xE6, 0x06, 0xEC, 0x06, 0xF2, 0x06, 0xF8, 0x06, 0xFE, 0x07, 0x04, 0x07, 0x0A, - 0x07, 0x10, 0x07, 0x16, 0x07, 0x1C, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2E, 0x07, 0x34, 0x07, 0x3A, - 0x07, 0x40, 0x00, 0x02, 0x00, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x03, 0x91, 0x03, 0x01, 0x00, 0x02, - 0x03, 0x95, 0x03, 0x01, 0x00, 0x02, 0x03, 0x97, 0x03, 0x01, 0x00, 0x02, 0x03, 0x99, 0x03, 0x01, - 0x00, 0x02, 0x03, 0x9F, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xA9, - 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x44, 0x00, 0x02, 0x03, 0x99, 0x03, 0x08, 0x00, 0x02, - 0x03, 0xA5, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x01, - 0x00, 0x02, 0x03, 0xB7, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, - 0x03, 0x44, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x08, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x08, 0x00, 0x02, - 0x03, 0xBF, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x01, - 0x00, 0x02, 0x03, 0xD2, 0x03, 0x01, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x08, 0x00, 0x02, 0x03, 0xB1, - 0x03, 0x13, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0x01, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x01, - 0x00, 0x02, 0x1F, 0x00, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, - 0x03, 0x13, 0x00, 0x02, 0x03, 0x91, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0x09, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x01, - 0x00, 0x02, 0x1F, 0x08, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, - 0x03, 0x13, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0x11, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x10, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x01, - 0x00, 0x02, 0x03, 0x95, 0x03, 0x13, 0x00, 0x02, 0x03, 0x95, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x18, - 0x03, 0x00, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x01, 0x00, 0x02, - 0x1F, 0x19, 0x03, 0x01, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x20, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x20, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x21, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x13, 0x00, 0x02, 0x03, 0x97, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x28, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x28, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x29, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x30, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x30, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x31, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x13, 0x00, 0x02, 0x03, 0x99, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x38, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x38, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x39, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x13, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x40, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x40, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x41, 0x03, 0x01, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x13, 0x00, 0x02, - 0x03, 0x9F, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0x48, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x01, 0x00, 0x02, 0x03, 0xC5, - 0x03, 0x13, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0x51, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x01, - 0x00, 0x02, 0x1F, 0x50, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, - 0x03, 0x14, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x01, 0x00, 0x02, - 0x1F, 0x59, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x60, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x60, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x61, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x13, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x14, - 0x00, 0x02, 0x1F, 0x68, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x68, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x69, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x00, - 0x00, 0x02, 0x03, 0xB7, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xBF, - 0x03, 0x00, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x02, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x03, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x04, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x05, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x06, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x07, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0x08, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0A, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x0B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0D, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x0F, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0x20, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x22, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x23, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x24, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x25, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x26, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x27, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0x28, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x29, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2A, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x2B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2D, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x2F, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0x60, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x62, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x63, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x64, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x65, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x66, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x67, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0x68, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6A, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x6B, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6C, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6D, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6E, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x6F, 0x03, 0x45, 0x00, 0x02, - 0x03, 0xB1, 0x03, 0x06, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x04, 0x00, 0x02, 0x1F, 0x70, 0x03, 0x45, - 0x00, 0x02, 0x03, 0xB1, 0x03, 0x45, 0x00, 0x02, 0x03, 0xAC, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB1, - 0x03, 0x42, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, 0x03, 0x06, 0x00, 0x02, - 0x03, 0x91, 0x03, 0x04, 0x00, 0x02, 0x03, 0x91, 0x03, 0x00, 0x00, 0x02, 0x03, 0x91, 0x03, 0x45, - 0x00, 0x02, 0x00, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x74, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, - 0x03, 0x45, 0x00, 0x02, 0x03, 0xAE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xC3, 0x03, 0x42, 0x00, 0x02, 0x03, 0x95, 0x03, 0x00, 0x00, 0x02, 0x03, 0x97, 0x03, 0x00, - 0x00, 0x02, 0x03, 0x97, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xBF, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x06, 0x00, 0x02, - 0x03, 0xB9, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x42, - 0x00, 0x02, 0x03, 0xCA, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x06, 0x00, 0x02, 0x03, 0x99, - 0x03, 0x04, 0x00, 0x02, 0x03, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x02, - 0x1F, 0xFE, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x42, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x06, - 0x00, 0x02, 0x03, 0xC5, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x00, 0x00, 0x02, 0x03, 0xC1, - 0x03, 0x13, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x14, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x42, 0x00, 0x02, - 0x03, 0xCB, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x06, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x04, - 0x00, 0x02, 0x03, 0xA5, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA1, 0x03, 0x14, 0x00, 0x02, 0x00, 0xA8, - 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7C, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x45, 0x00, 0x02, - 0x03, 0xCE, 0x03, 0x45, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x42, - 0x00, 0x02, 0x03, 0x9F, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x03, 0xA9, - 0x03, 0x45, 0x00, 0x01, 0x00, 0xE8, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, - 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAA, 0x03, 0xAB, 0x03, 0xAC, 0x03, 0xAD, - 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCB, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, - 0x03, 0xD3, 0x03, 0xD4, 0x1F, 0x00, 0x1F, 0x01, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, - 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, - 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x11, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, - 0x1F, 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x20, 0x1F, 0x21, - 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, 0x1F, 0x29, - 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, - 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x39, - 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x41, - 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, - 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, 0x1F, 0x51, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, - 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x61, - 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, 0x1F, 0x68, 0x1F, 0x69, - 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x70, 0x1F, 0x72, - 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, - 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, - 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, - 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, - 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, - 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, - 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB0, 0x1F, 0xB1, 0x1F, 0xB2, - 0x1F, 0xB3, 0x1F, 0xB4, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, 0xB8, 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBC, - 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC4, 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, - 0x1F, 0xCC, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, - 0x1F, 0xD7, 0x1F, 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, 0xE0, - 0x1F, 0xE1, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE5, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, 0xE8, 0x1F, 0xE9, - 0x1F, 0xEA, 0x1F, 0xEC, 0x1F, 0xED, 0x1F, 0xF2, 0x1F, 0xF3, 0x1F, 0xF4, 0x1F, 0xF6, 0x1F, 0xF7, - 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x06, 0x30, 0x00, 0xC0, 0x01, 0x86, 0x01, 0x8C, - 0x01, 0x92, 0x01, 0x98, 0x01, 0x9E, 0x01, 0xA4, 0x01, 0xAA, 0x01, 0xB0, 0x01, 0xB6, 0x01, 0xBC, - 0x01, 0xC2, 0x01, 0xC8, 0x01, 0xCE, 0x01, 0xD4, 0x01, 0xDA, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xEC, - 0x01, 0xF2, 0x01, 0xF8, 0x01, 0xFE, 0x02, 0x04, 0x02, 0x0A, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1E, - 0x02, 0x26, 0x02, 0x2C, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3E, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, - 0x02, 0x5A, 0x02, 0x60, 0x02, 0x66, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, - 0x02, 0x8A, 0x02, 0x90, 0x02, 0x96, 0x02, 0x9C, 0x02, 0xA2, 0x02, 0xA8, 0x02, 0xAE, 0x02, 0xB6, - 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, - 0x02, 0xF2, 0x02, 0xF8, 0x02, 0xFE, 0x03, 0x04, 0x03, 0x0A, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, - 0x03, 0x26, 0x03, 0x2C, 0x03, 0x32, 0x03, 0x38, 0x03, 0x3E, 0x03, 0x46, 0x03, 0x4E, 0x03, 0x54, - 0x03, 0x5A, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6C, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7E, 0x03, 0x84, - 0x03, 0x8A, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9C, 0x03, 0xA2, 0x03, 0xA8, 0x03, 0xB0, 0x03, 0xB8, - 0x03, 0xBE, 0x03, 0xC4, 0x03, 0xCC, 0x03, 0xD2, 0x03, 0xD8, 0x03, 0xDE, 0x03, 0xE4, 0x03, 0xEA, - 0x03, 0xF2, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, - 0x04, 0x26, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4C, 0x04, 0x52, - 0x04, 0x58, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, - 0x04, 0x88, 0x04, 0x8E, 0x04, 0x94, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAC, 0x04, 0xB2, - 0x04, 0xB8, 0x04, 0xBE, 0x04, 0xC4, 0x04, 0xCA, 0x04, 0xD0, 0x04, 0xD6, 0x04, 0xDC, 0x04, 0xE2, - 0x04, 0xE8, 0x04, 0xEE, 0x04, 0xF4, 0x04, 0xFA, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0C, 0x05, 0x12, - 0x05, 0x18, 0x05, 0x1E, 0x05, 0x24, 0x05, 0x2A, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, - 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, - 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, - 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x05, 0xBA, 0x05, 0xC0, 0x05, 0xC6, 0x05, 0xCC, 0x05, 0xD2, - 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, 0x05, 0xF2, 0x05, 0xF8, 0x06, 0x00, 0x06, 0x06, - 0x06, 0x0C, 0x06, 0x12, 0x06, 0x18, 0x06, 0x1E, 0x06, 0x24, 0x06, 0x2A, 0x00, 0x02, 0x00, 0xA8, - 0x03, 0x41, 0x00, 0x02, 0x03, 0x91, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x41, 0x00, 0x02, - 0x03, 0x97, 0x03, 0x41, 0x00, 0x02, 0x03, 0x99, 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x41, - 0x00, 0x02, 0x03, 0xA5, 0x03, 0x41, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCA, - 0x03, 0x01, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x41, 0x00, 0x02, - 0x03, 0xB7, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x01, - 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x08, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x41, 0x00, 0x02, 0x03, 0xC5, - 0x03, 0x41, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x41, 0x00, 0x02, 0x03, 0xD2, 0x03, 0x41, 0x00, 0x02, - 0x03, 0xB1, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x00, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x40, - 0x00, 0x02, 0x1F, 0x00, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x01, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, - 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x91, - 0x03, 0x43, 0x00, 0x02, 0x1F, 0x08, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0x08, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x09, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, - 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x43, - 0x00, 0x02, 0x1F, 0x10, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x10, - 0x03, 0x41, 0x00, 0x02, 0x1F, 0x11, 0x03, 0x41, 0x00, 0x02, 0x03, 0x95, 0x03, 0x43, 0x00, 0x02, - 0x1F, 0x18, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x19, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x18, 0x03, 0x41, - 0x00, 0x02, 0x1F, 0x19, 0x03, 0x41, 0x00, 0x02, 0x03, 0xB7, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x20, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x21, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x20, 0x03, 0x41, 0x00, 0x02, - 0x1F, 0x21, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, - 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x97, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x40, - 0x00, 0x02, 0x1F, 0x29, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x28, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x29, - 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, - 0x03, 0x42, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x14, 0x00, 0x02, - 0x1F, 0x30, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x31, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x30, 0x03, 0x41, - 0x00, 0x02, 0x1F, 0x31, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, - 0x03, 0xB9, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0x99, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x38, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x39, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x38, 0x03, 0x41, 0x00, 0x02, - 0x1F, 0x39, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, - 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xBF, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x40, - 0x00, 0x02, 0x1F, 0x41, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x40, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x41, - 0x03, 0x41, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0x49, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x48, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x49, 0x03, 0x41, - 0x00, 0x02, 0x03, 0xC5, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x51, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x50, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x51, 0x03, 0x41, 0x00, 0x03, - 0x03, 0xC5, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0x59, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x59, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, - 0x03, 0x42, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x43, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0x61, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x60, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x61, 0x03, 0x41, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, - 0x00, 0x02, 0x03, 0xA9, 0x03, 0x43, 0x00, 0x02, 0x21, 0x26, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x68, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x69, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x68, 0x03, 0x41, 0x00, 0x02, - 0x1F, 0x69, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, - 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x03, 0xB1, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB5, 0x03, 0x40, - 0x00, 0x02, 0x03, 0xB7, 0x03, 0x40, 0x00, 0x02, 0x03, 0xB9, 0x03, 0x40, 0x00, 0x02, 0x03, 0xBF, - 0x03, 0x40, 0x00, 0x02, 0x03, 0xC5, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC9, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0xB3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0x81, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x81, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x81, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xBC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0x89, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x89, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x88, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xC3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0x91, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x91, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xCC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xCC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0x99, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x01, 0x00, 0x02, 0x1F, 0x99, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x42, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xF3, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA1, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xFC, 0x03, 0x13, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x14, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA9, - 0x03, 0x01, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x42, 0x00, 0x02, - 0x1F, 0xB3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x71, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB6, 0x03, 0x45, - 0x00, 0x02, 0x03, 0x91, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x75, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x95, 0x03, 0x40, 0x00, 0x02, - 0x03, 0x97, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBF, 0x03, 0x41, - 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x06, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x04, 0x00, 0x02, 0x03, 0xCA, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x42, - 0x00, 0x02, 0x03, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xFE, - 0x03, 0x41, 0x00, 0x02, 0x03, 0xCB, 0x03, 0x40, 0x00, 0x02, 0x03, 0xC1, 0x03, 0x43, 0x00, 0x03, - 0x03, 0xC5, 0x03, 0x08, 0x03, 0x42, 0x00, 0x02, 0x03, 0xA5, 0x03, 0x40, 0x00, 0x02, 0x00, 0xA8, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x00, 0x00, 0x02, 0x1F, 0x7D, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0xF6, 0x03, 0x45, 0x00, 0x02, 0x03, 0x9F, 0x03, 0x40, 0x00, 0x02, 0x03, 0xA9, 0x03, 0x40, - 0x00, 0x02, 0x21, 0x26, 0x03, 0x45, 0x00, 0x01, 0x00, 0xC0, 0x03, 0x85, 0x03, 0x86, 0x03, 0x88, - 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0x90, 0x03, 0xAC, 0x03, 0xAD, - 0x03, 0xAE, 0x03, 0xAF, 0x03, 0xB0, 0x03, 0xCA, 0x03, 0xCC, 0x03, 0xCD, 0x03, 0xCE, 0x03, 0xD3, - 0x1F, 0x00, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, 0x1F, 0x07, 0x1F, 0x08, - 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, 0x10, 0x1F, 0x12, - 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x18, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, - 0x1F, 0x20, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x27, 0x1F, 0x28, - 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, 0x30, 0x1F, 0x31, - 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x38, 0x1F, 0x3A, - 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, 0x40, 0x1F, 0x42, 0x1F, 0x43, - 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x48, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x50, - 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, 0x1F, 0x57, 0x1F, 0x5B, 0x1F, 0x5D, - 0x1F, 0x5F, 0x1F, 0x60, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x67, - 0x1F, 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, - 0x1F, 0x70, 0x1F, 0x72, 0x1F, 0x74, 0x1F, 0x76, 0x1F, 0x78, 0x1F, 0x7A, 0x1F, 0x7C, 0x1F, 0x80, - 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, - 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, - 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, - 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, - 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, - 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, - 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xBA, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xC8, 0x1F, 0xCA, - 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xD0, 0x1F, 0xD1, 0x1F, 0xD2, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, 0xDA, - 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xE2, 0x1F, 0xE4, 0x1F, 0xE7, 0x1F, 0xEA, 0x1F, 0xED, 0x1F, 0xF2, - 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xF8, 0x1F, 0xFA, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0xE0, 0x00, 0x85, - 0x01, 0x10, 0x01, 0x16, 0x01, 0x1C, 0x01, 0x22, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, - 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, - 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, - 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x01, 0xE0, 0x01, 0xE8, 0x01, 0xF0, 0x01, 0xF8, 0x02, 0x00, - 0x02, 0x08, 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, - 0x02, 0x46, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, - 0x02, 0x86, 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, - 0x02, 0xC6, 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, - 0x03, 0x06, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, 0x03, 0x2C, 0x03, 0x34, 0x03, 0x3C, - 0x03, 0x42, 0x03, 0x48, 0x03, 0x50, 0x03, 0x56, 0x03, 0x5C, 0x03, 0x62, 0x03, 0x68, 0x03, 0x70, - 0x03, 0x78, 0x03, 0x7E, 0x03, 0x86, 0x03, 0x8C, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA6, - 0x03, 0xAE, 0x03, 0xB4, 0x03, 0xBC, 0x03, 0xC2, 0x03, 0xC8, 0x03, 0xCE, 0x03, 0xD4, 0x03, 0xDC, - 0x03, 0xE4, 0x03, 0xEA, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x04, 0x04, 0x0A, 0x04, 0x12, - 0x04, 0x1A, 0x04, 0x20, 0x04, 0x28, 0x04, 0x2E, 0x04, 0x34, 0x04, 0x3A, 0x04, 0x40, 0x04, 0x48, - 0x04, 0x50, 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7E, - 0x04, 0x86, 0x04, 0x8C, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA0, 0x04, 0xA6, 0x04, 0xAE, 0x04, 0xB6, - 0x04, 0xBE, 0x04, 0xC6, 0x04, 0xCC, 0x04, 0xD2, 0x04, 0xDA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x01, - 0x00, 0x02, 0x03, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x01, 0x00, 0x02, 0x03, 0xCB, - 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, - 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, - 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, - 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, - 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, - 0x03, 0x42, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, - 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, - 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, - 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, - 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, - 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, - 0x03, 0x01, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, - 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, - 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, - 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x13, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xB9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x00, - 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0x99, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xBF, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x03, 0x9F, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC5, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x02, 0x21, 0x26, 0x03, 0x13, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, - 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, - 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, - 0x21, 0x26, 0x03, 0x14, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x00, 0x00, 0x02, 0x1F, 0xB3, - 0x03, 0x43, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x40, - 0x00, 0x02, 0x1F, 0x81, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x80, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x81, - 0x03, 0x41, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x42, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0xBC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0x88, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x88, - 0x03, 0x41, 0x00, 0x02, 0x1F, 0x89, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x09, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x43, 0x00, 0x03, - 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x91, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x90, 0x03, 0x41, 0x00, 0x02, 0x1F, 0x91, 0x03, 0x41, 0x00, 0x03, - 0x1F, 0x20, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0xCC, 0x03, 0x43, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0x98, - 0x03, 0x40, 0x00, 0x02, 0x1F, 0x99, 0x03, 0x40, 0x00, 0x02, 0x1F, 0x98, 0x03, 0x41, 0x00, 0x02, - 0x1F, 0x99, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x43, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, - 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA1, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x42, - 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xFC, 0x03, 0x43, - 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x40, 0x00, 0x02, - 0x1F, 0xA9, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xA8, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xA9, 0x03, 0x41, - 0x00, 0x03, 0x1F, 0x68, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xC3, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x00, - 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x40, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x02, 0x21, 0x26, 0x03, 0x00, 0x00, 0x01, 0x00, 0x85, 0x03, 0x8F, - 0x03, 0x90, 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x06, - 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, - 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, - 0x1F, 0x25, 0x1F, 0x26, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x30, - 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x37, 0x1F, 0x3A, 0x1F, 0x3B, - 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, 0x1F, 0x4A, - 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, 0x1F, 0x56, - 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x66, 0x1F, 0x68, - 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, 0x76, 0x1F, 0x80, - 0x1F, 0x81, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, - 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, - 0x1F, 0x91, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, - 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, - 0x1F, 0xA1, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, - 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, - 0x1F, 0xB4, 0x1F, 0xB7, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xD7, 0x1F, 0xE2, - 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, 0x1F, 0xFA, 0x00, 0x01, 0x04, 0xC0, 0x00, 0x7B, 0x00, 0xFC, - 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, - 0x01, 0x3E, 0x01, 0x46, 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, - 0x01, 0x7E, 0x01, 0x86, 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, - 0x01, 0xBE, 0x01, 0xC6, 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, - 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, - 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, 0x02, 0x6C, 0x02, 0x74, - 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, - 0x02, 0xBA, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, 0x02, 0xE8, 0x02, 0xF0, - 0x02, 0xF8, 0x03, 0x00, 0x03, 0x08, 0x03, 0x10, 0x03, 0x18, 0x03, 0x20, 0x03, 0x28, 0x03, 0x30, - 0x03, 0x38, 0x03, 0x40, 0x03, 0x48, 0x03, 0x50, 0x03, 0x58, 0x03, 0x60, 0x03, 0x68, 0x03, 0x70, - 0x03, 0x78, 0x03, 0x80, 0x03, 0x88, 0x03, 0x90, 0x03, 0x98, 0x03, 0xA0, 0x03, 0xA8, 0x03, 0xB0, - 0x03, 0xB8, 0x03, 0xC0, 0x03, 0xC8, 0x03, 0xD0, 0x03, 0xD8, 0x03, 0xE0, 0x03, 0xE8, 0x03, 0xF0, - 0x03, 0xF8, 0x04, 0x00, 0x04, 0x08, 0x04, 0x10, 0x04, 0x18, 0x04, 0x20, 0x04, 0x28, 0x04, 0x30, - 0x04, 0x38, 0x04, 0x40, 0x04, 0x48, 0x04, 0x50, 0x04, 0x58, 0x04, 0x60, 0x04, 0x68, 0x04, 0x70, - 0x04, 0x76, 0x04, 0x7E, 0x04, 0x86, 0x04, 0x8C, 0x04, 0x94, 0x04, 0x9C, 0x04, 0xA4, 0x04, 0xAC, - 0x04, 0xB2, 0x04, 0xBA, 0x00, 0x02, 0x21, 0x26, 0x03, 0x41, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x44, - 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, - 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0xB1, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, - 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, - 0x03, 0xB5, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0xB5, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, - 0x03, 0x95, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0x95, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, - 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0xB7, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, - 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, - 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, - 0x1F, 0xBE, 0x03, 0x43, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, - 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, - 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA5, - 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA5, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x41, 0x00, 0x02, 0x21, 0x26, - 0x03, 0x43, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, - 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x14, - 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, 0x00, 0x02, 0x1F, 0xBE, 0x03, 0x40, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x00, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x08, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x08, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x20, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x20, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x28, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x28, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x60, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x60, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x60, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, - 0x00, 0x03, 0x1F, 0x68, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x68, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xB3, 0x03, 0x41, 0x00, 0x03, - 0x03, 0xB1, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, - 0x1F, 0xC3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB9, - 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, - 0x03, 0x00, 0x03, 0x45, 0x00, 0x02, 0x1F, 0xF3, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, - 0x03, 0x42, 0x00, 0x02, 0x21, 0x26, 0x03, 0x40, 0x00, 0x01, 0x00, 0x7B, 0x03, 0x8F, 0x03, 0x90, - 0x03, 0xAF, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x03, 0x1F, 0x04, 0x1F, 0x05, 0x1F, 0x0A, 0x1F, 0x0B, - 0x1F, 0x0C, 0x1F, 0x0D, 0x1F, 0x12, 0x1F, 0x13, 0x1F, 0x14, 0x1F, 0x15, 0x1F, 0x1A, 0x1F, 0x1B, - 0x1F, 0x1C, 0x1F, 0x1D, 0x1F, 0x22, 0x1F, 0x23, 0x1F, 0x24, 0x1F, 0x25, 0x1F, 0x2A, 0x1F, 0x2B, - 0x1F, 0x2C, 0x1F, 0x2D, 0x1F, 0x30, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, - 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, 0x3C, 0x1F, 0x3D, 0x1F, 0x42, 0x1F, 0x43, 0x1F, 0x44, 0x1F, 0x45, - 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, 0x4C, 0x1F, 0x4D, 0x1F, 0x52, 0x1F, 0x53, 0x1F, 0x54, 0x1F, 0x55, - 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x62, 0x1F, 0x63, 0x1F, 0x64, 0x1F, 0x65, 0x1F, 0x68, 0x1F, 0x6A, - 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x76, 0x1F, 0x80, 0x1F, 0x81, 0x1F, 0x82, - 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x89, 0x1F, 0x8A, - 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x91, 0x1F, 0x92, - 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x99, 0x1F, 0x9A, - 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA1, 0x1F, 0xA2, - 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, - 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xB7, - 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xC7, 0x1F, 0xD2, 0x1F, 0xE2, 0x1F, 0xF2, 0x1F, 0xF4, 0x1F, 0xF7, - 0x1F, 0xFA, 0x00, 0x01, 0x03, 0x4E, 0x00, 0x54, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, 0x00, 0xC6, - 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, - 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x3E, 0x01, 0x46, - 0x01, 0x4E, 0x01, 0x56, 0x01, 0x5E, 0x01, 0x66, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x86, - 0x01, 0x8E, 0x01, 0x96, 0x01, 0x9E, 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBE, 0x01, 0xC6, - 0x01, 0xCE, 0x01, 0xD6, 0x01, 0xDE, 0x01, 0xE6, 0x01, 0xEE, 0x01, 0xF6, 0x01, 0xFE, 0x02, 0x06, - 0x02, 0x0E, 0x02, 0x16, 0x02, 0x1E, 0x02, 0x26, 0x02, 0x2E, 0x02, 0x36, 0x02, 0x3E, 0x02, 0x46, - 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x86, - 0x02, 0x8E, 0x02, 0x96, 0x02, 0x9E, 0x02, 0xA6, 0x02, 0xAE, 0x02, 0xB6, 0x02, 0xBE, 0x02, 0xC6, - 0x02, 0xCE, 0x02, 0xD6, 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, - 0x03, 0x0E, 0x03, 0x16, 0x03, 0x1E, 0x03, 0x26, 0x03, 0x2E, 0x03, 0x36, 0x03, 0x3E, 0x03, 0x46, - 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x08, 0x03, 0x41, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xB9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x42, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x01, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x01, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x08, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x08, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x21, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x21, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x13, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x28, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x28, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x42, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x61, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x60, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x61, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, - 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x69, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0x69, 0x03, 0x41, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x01, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x54, 0x03, 0x90, 0x03, 0xB0, 0x1F, 0x02, 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, - 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, - 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x36, 0x1F, 0x3A, 0x1F, 0x3C, 0x1F, 0x42, - 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, 0x1F, 0x64, 0x1F, 0x6A, - 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, - 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, - 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, - 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, - 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, - 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB2, - 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x03, 0x3C, - 0x00, 0x51, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, - 0x00, 0xE0, 0x00, 0xE8, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, 0x01, 0x58, - 0x01, 0x60, 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, - 0x01, 0xA0, 0x01, 0xA8, 0x01, 0xB0, 0x01, 0xB8, 0x01, 0xC0, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xDA, - 0x01, 0xE2, 0x01, 0xEA, 0x01, 0xF2, 0x01, 0xFA, 0x02, 0x02, 0x02, 0x0A, 0x02, 0x14, 0x02, 0x1C, - 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4E, 0x02, 0x56, 0x02, 0x5E, - 0x02, 0x66, 0x02, 0x6E, 0x02, 0x76, 0x02, 0x7E, 0x02, 0x88, 0x02, 0x90, 0x02, 0x98, 0x02, 0xA0, - 0x02, 0xA8, 0x02, 0xB0, 0x02, 0xB8, 0x02, 0xC2, 0x02, 0xCA, 0x02, 0xD2, 0x02, 0xDA, 0x02, 0xE2, - 0x02, 0xEA, 0x02, 0xF2, 0x02, 0xFA, 0x03, 0x04, 0x03, 0x0C, 0x03, 0x14, 0x03, 0x1C, 0x03, 0x24, - 0x03, 0x2C, 0x03, 0x34, 0x00, 0x03, 0x03, 0xB9, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x91, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB5, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x95, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x95, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x97, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB9, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB9, - 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0x99, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x99, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xBF, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xBF, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0x9F, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0x9F, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC5, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC5, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x03, 0xA9, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x03, 0xA9, - 0x03, 0x43, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x14, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB1, - 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x01, - 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x00, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x01, - 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, - 0x1F, 0x08, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, - 0x1F, 0x08, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, - 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x01, - 0x00, 0x03, 0x1F, 0x21, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, - 0x03, 0x13, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, - 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x1F, 0x60, - 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x60, - 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, - 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, - 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x00, 0x03, - 0x1F, 0x68, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, - 0x1F, 0x68, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, - 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x00, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x00, - 0x00, 0x03, 0x03, 0xC9, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x51, 0x03, 0x90, 0x1F, 0x02, - 0x1F, 0x04, 0x1F, 0x0A, 0x1F, 0x0C, 0x1F, 0x12, 0x1F, 0x14, 0x1F, 0x1A, 0x1F, 0x1C, 0x1F, 0x22, - 0x1F, 0x24, 0x1F, 0x2A, 0x1F, 0x2C, 0x1F, 0x32, 0x1F, 0x33, 0x1F, 0x34, 0x1F, 0x35, 0x1F, 0x3A, - 0x1F, 0x3C, 0x1F, 0x42, 0x1F, 0x44, 0x1F, 0x4A, 0x1F, 0x4C, 0x1F, 0x52, 0x1F, 0x54, 0x1F, 0x62, - 0x1F, 0x64, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, 0x6C, 0x1F, 0x6D, 0x1F, 0x80, 0x1F, 0x82, 0x1F, 0x83, - 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, - 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, - 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, - 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, - 0x1F, 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, - 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xD2, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, - 0x02, 0x30, 0x00, 0x35, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, - 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD4, 0x00, 0xDC, - 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x30, 0x01, 0x38, 0x01, 0x42, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, - 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7E, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA8, - 0x01, 0xB0, 0x01, 0xBA, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, 0x01, 0xEC, - 0x01, 0xF6, 0x02, 0x00, 0x02, 0x08, 0x02, 0x10, 0x02, 0x18, 0x02, 0x20, 0x02, 0x28, 0x00, 0x03, - 0x1F, 0xBE, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, - 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, - 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, - 0x1F, 0x00, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, - 0x1F, 0x00, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x01, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x42, 0x00, 0x03, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x08, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x03, 0x1F, 0x09, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, - 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, - 0x1F, 0x21, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x20, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, - 0x1F, 0x21, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0x97, 0x03, 0x45, - 0x03, 0x43, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x03, 0x1F, 0x28, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x29, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, - 0x1F, 0x60, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, - 0x1F, 0x60, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x1F, 0x61, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x13, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x42, 0x00, 0x03, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x1F, 0x68, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x03, 0x1F, 0x69, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, - 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, - 0x03, 0xB1, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, - 0x03, 0xB7, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x01, 0x00, 0x03, - 0x03, 0xC9, 0x03, 0x45, 0x03, 0x40, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, - 0x00, 0x35, 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x80, 0x1F, 0x82, - 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x88, 0x1F, 0x8A, 0x1F, 0x8B, - 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, 0x90, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, - 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x98, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, - 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA0, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, - 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, - 0x1F, 0xB2, 0x1F, 0xB4, 0x1F, 0xC2, 0x1F, 0xC4, 0x1F, 0xF2, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0xE0, - 0x00, 0x2D, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, - 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, - 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF0, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x08, 0x01, 0x10, 0x01, 0x1A, - 0x01, 0x24, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x60, - 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x82, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, - 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBE, 0x01, 0xC8, 0x01, 0xD0, 0x01, 0xD8, 0x00, 0x03, 0x1F, 0xBE, - 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, - 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, - 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xC3, - 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xF3, - 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x00, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x42, 0x00, 0x03, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xB7, - 0x03, 0x45, 0x03, 0x41, 0x00, 0x03, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x2D, - 0x03, 0x90, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, - 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x87, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, - 0x1F, 0x8F, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, 0x1F, 0x97, 0x1F, 0x9A, - 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, - 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA7, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, - 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, 0xB4, 0x1F, 0xC4, 0x1F, 0xF4, 0x00, 0x01, 0x01, 0x7C, 0x00, 0x24, - 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, 0x00, 0x6E, 0x00, 0x76, 0x00, 0x7E, 0x00, 0x86, - 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC2, 0x00, 0xCA, - 0x00, 0xD2, 0x00, 0xDA, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFC, 0x01, 0x04, 0x01, 0x0C, - 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x36, 0x01, 0x40, 0x01, 0x48, 0x01, 0x50, - 0x01, 0x58, 0x01, 0x60, 0x01, 0x68, 0x01, 0x72, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x40, - 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x13, 0x03, 0x41, - 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x42, - 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, - 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x14, - 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xC3, - 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, - 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, - 0x1F, 0xCC, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x40, - 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x14, 0x03, 0x41, - 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, - 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, - 0x03, 0x40, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x13, 0x03, 0x41, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x14, - 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x42, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x14, 0x03, 0x42, 0x03, 0x45, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, - 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, - 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, - 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, - 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x94, 0x00, 0x24, 0x00, 0x4E, 0x00, 0x56, 0x00, 0x5E, 0x00, 0x66, - 0x00, 0x6E, 0x00, 0x76, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAE, - 0x00, 0xB6, 0x00, 0xC0, 0x00, 0xCA, 0x00, 0xD2, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEE, 0x00, 0xF8, - 0x01, 0x00, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1C, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x38, 0x01, 0x40, - 0x01, 0x4A, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, 0x01, 0x6E, 0x01, 0x76, 0x01, 0x80, 0x01, 0x8A, - 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x1F, 0xBE, 0x03, 0x43, 0x03, 0x41, - 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x00, 0x03, 0x21, 0x26, 0x03, 0x43, 0x03, 0x41, - 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x00, - 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, - 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, - 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x01, - 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, - 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, - 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, - 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, - 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x00, - 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, - 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x03, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x00, 0x03, - 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x01, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x24, 0x1F, 0x32, 0x1F, 0x34, 0x1F, 0x6A, - 0x1F, 0x6C, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, - 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, - 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, - 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6C, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x60, - 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x98, 0x00, 0xA2, 0x00, 0xAA, - 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF4, - 0x00, 0xFE, 0x01, 0x06, 0x01, 0x10, 0x01, 0x18, 0x01, 0x22, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, - 0x01, 0x46, 0x01, 0x4E, 0x01, 0x58, 0x01, 0x62, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, 0x03, 0x40, - 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xB3, 0x03, 0x43, - 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, - 0x03, 0x91, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xBC, 0x03, 0x43, 0x03, 0x41, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xC3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xB7, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x42, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, - 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xCC, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, - 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, - 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x03, 0x1F, 0xF3, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, - 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x03, - 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, - 0x03, 0xA9, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, 0x00, 0x03, 0x1F, 0xFC, 0x03, 0x43, 0x03, 0x41, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x42, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x42, 0x00, 0x01, - 0x00, 0x20, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, 0x1F, 0x8B, - 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x96, - 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, - 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xA8, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x1F, 0xAF, 0x00, 0x01, 0x01, 0x6E, 0x00, 0x1E, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, - 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, - 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, - 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x01, 0x32, 0x01, 0x3C, 0x01, 0x46, 0x01, 0x50, - 0x01, 0x5A, 0x01, 0x64, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x01, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, - 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, - 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x00, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, - 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, - 0x03, 0x97, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, - 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x04, - 0x03, 0xA9, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, - 0x00, 0x01, 0x00, 0x1E, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x86, 0x1F, 0x8A, - 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, - 0x1F, 0x96, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0xA2, 0x1F, 0xA3, - 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xA6, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, - 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, - 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, - 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, - 0x03, 0x91, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, - 0x03, 0x97, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x14, - 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, - 0x03, 0xA9, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x42, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, - 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, - 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, - 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, - 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, - 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, - 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, - 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, - 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x42, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, - 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, - 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, - 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x00, 0x01, 0x01, 0x32, 0x00, 0x19, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, - 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, - 0x00, 0xBA, 0x00, 0xC4, 0x00, 0xCE, 0x00, 0xD8, 0x00, 0xE2, 0x00, 0xEC, 0x00, 0xF6, 0x01, 0x00, - 0x01, 0x0A, 0x01, 0x14, 0x01, 0x1E, 0x01, 0x28, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0x91, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0x97, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x13, 0x03, 0x45, - 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xA9, 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x42, - 0x03, 0x45, 0x00, 0x01, 0x00, 0x19, 0x1F, 0x82, 0x1F, 0x83, 0x1F, 0x84, 0x1F, 0x85, 0x1F, 0x8A, - 0x1F, 0x8B, 0x1F, 0x8C, 0x1F, 0x8D, 0x1F, 0x92, 0x1F, 0x93, 0x1F, 0x94, 0x1F, 0x95, 0x1F, 0x9A, - 0x1F, 0x9B, 0x1F, 0x9C, 0x1F, 0x9D, 0x1F, 0xA2, 0x1F, 0xA3, 0x1F, 0xA4, 0x1F, 0xA5, 0x1F, 0xAA, - 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, - 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, - 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, - 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, - 0x03, 0xB7, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x00, - 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, - 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, - 0x21, 0x26, 0x03, 0x14, 0x03, 0x01, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, - 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, - 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, - 0x00, 0x42, 0x00, 0x4C, 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, - 0x00, 0x92, 0x00, 0x9C, 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, - 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, - 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, - 0x03, 0x97, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x40, - 0x03, 0x45, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x03, 0xA9, - 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x40, 0x03, 0x45, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, - 0x03, 0x41, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x42, 0x00, 0x01, - 0x00, 0x0F, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, - 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, - 0x00, 0x01, 0x00, 0xBA, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2E, 0x00, 0x38, 0x00, 0x42, 0x00, 0x4C, - 0x00, 0x56, 0x00, 0x60, 0x00, 0x6A, 0x00, 0x74, 0x00, 0x7E, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9C, - 0x00, 0xA6, 0x00, 0xB0, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, - 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x01, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x42, 0x00, 0x01, 0x00, 0x0F, 0x1F, 0x82, - 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, - 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x00, 0x01, 0x00, 0xAE, - 0x00, 0x0E, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, - 0x00, 0x68, 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, - 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, - 0x00, 0x04, 0x03, 0xB7, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, - 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x14, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x43, 0x03, 0x45, 0x03, 0x41, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x14, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, - 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, - 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, - 0x00, 0x22, 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, - 0x00, 0x72, 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, - 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, - 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, - 0x03, 0x14, 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x04, - 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, - 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, - 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0xAE, 0x00, 0x0E, 0x00, 0x22, - 0x00, 0x2C, 0x00, 0x36, 0x00, 0x40, 0x00, 0x4A, 0x00, 0x54, 0x00, 0x5E, 0x00, 0x68, 0x00, 0x72, - 0x00, 0x7C, 0x00, 0x86, 0x00, 0x90, 0x00, 0x9A, 0x00, 0xA4, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, - 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x13, - 0x03, 0x41, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x14, - 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x45, 0x03, 0x14, 0x03, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, - 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, - 0x1F, 0xAB, 0x1F, 0xAC, 0x1F, 0xAD, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x28, - 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, - 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, - 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x00, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xB7, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, - 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, - 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x00, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x0C, - 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, 0x1F, 0x9C, - 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x96, 0x00, 0x0C, 0x00, 0x1E, - 0x00, 0x28, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, - 0x00, 0x78, 0x00, 0x82, 0x00, 0x8C, 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x00, 0x04, 0x03, 0xB1, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x91, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, - 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xB7, 0x03, 0x45, 0x03, 0x43, - 0x03, 0x41, 0x00, 0x04, 0x03, 0x97, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0x97, - 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x00, 0x04, 0x03, 0xC9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x40, 0x00, 0x04, 0x03, 0xA9, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, - 0x00, 0x0C, 0x1F, 0x82, 0x1F, 0x84, 0x1F, 0x8A, 0x1F, 0x8C, 0x1F, 0x92, 0x1F, 0x94, 0x1F, 0x9A, - 0x1F, 0x9C, 0x1F, 0xA2, 0x1F, 0xA4, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, - 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, - 0x21, 0x26, 0x03, 0x13, 0x03, 0x01, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, - 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, - 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, - 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, - 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, - 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x40, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x13, 0x03, 0x45, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, - 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x43, 0x03, 0x00, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x01, 0x03, 0x45, - 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, - 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x40, 0x03, 0x45, 0x00, 0x04, 0x21, 0x26, - 0x03, 0x43, 0x03, 0x41, 0x03, 0x45, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, - 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, - 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, - 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x43, 0x03, 0x45, - 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, - 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x00, 0x00, 0x04, - 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, - 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, - 0x03, 0x13, 0x03, 0x40, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x13, 0x03, 0x41, 0x00, 0x01, - 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x00, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, - 0x03, 0x43, 0x03, 0x01, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, 0x1F, 0xAC, 0x00, 0x01, 0x00, 0x1E, - 0x00, 0x02, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x40, - 0x00, 0x04, 0x21, 0x26, 0x03, 0x45, 0x03, 0x43, 0x03, 0x41, 0x00, 0x01, 0x00, 0x02, 0x1F, 0xAA, - 0x1F, 0xAC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x36, 0x00, 0x16, - 0x00, 0x32, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5A, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x78, - 0x00, 0x82, 0x00, 0x8C, 0x00, 0x96, 0x00, 0xA0, 0x00, 0xAA, 0x00, 0xB4, 0x00, 0xBE, 0x00, 0xC8, - 0x00, 0xD2, 0x00, 0xE4, 0x00, 0xF6, 0x01, 0x08, 0x01, 0x1A, 0x01, 0x2C, 0x00, 0x01, 0x00, 0x04, - 0x30, 0x94, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x4C, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x04, 0x30, 0x4E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x50, - 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x52, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, - 0x00, 0x04, 0x30, 0x54, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x56, 0x00, 0x02, - 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x58, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, - 0x30, 0x5A, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x5C, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x04, 0x30, 0x5E, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x60, - 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x62, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, - 0x00, 0x04, 0x30, 0x65, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x67, 0x00, 0x02, - 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0x69, 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x30, 0x70, 0x00, 0x02, 0x30, 0x99, 0x30, 0x71, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0x30, 0x73, 0x00, 0x02, 0x30, 0x99, 0x30, 0x74, 0x00, 0x02, 0x30, 0x9A, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x76, 0x00, 0x02, 0x30, 0x99, 0x30, 0x77, 0x00, 0x02, - 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x79, 0x00, 0x02, 0x30, 0x99, 0x30, 0x7A, - 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0x7C, 0x00, 0x02, 0x30, 0x99, - 0x30, 0x7D, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, 0x00, 0x04, 0x30, 0x9E, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x16, 0x30, 0x46, 0x30, 0x4B, 0x30, 0x4D, 0x30, 0x4F, 0x30, 0x51, 0x30, 0x53, - 0x30, 0x55, 0x30, 0x57, 0x30, 0x59, 0x30, 0x5B, 0x30, 0x5D, 0x30, 0x5F, 0x30, 0x61, 0x30, 0x64, - 0x30, 0x66, 0x30, 0x68, 0x30, 0x6F, 0x30, 0x72, 0x30, 0x75, 0x30, 0x78, 0x30, 0x7B, 0x30, 0x9D, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0xDE, 0x00, 0x1B, 0x00, 0x3C, - 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6C, - 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x84, 0x00, 0x8A, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9C, - 0x00, 0xA2, 0x00, 0xA8, 0x00, 0xAE, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC0, 0x00, 0xC6, 0x00, 0xCC, - 0x00, 0xD2, 0x00, 0xD8, 0x00, 0x02, 0x30, 0x4B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x4D, 0x30, 0x99, - 0x00, 0x02, 0x30, 0x4F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x51, 0x30, 0x99, 0x00, 0x02, 0x30, 0x53, - 0x30, 0x99, 0x00, 0x02, 0x30, 0x55, 0x30, 0x99, 0x00, 0x02, 0x30, 0x57, 0x30, 0x99, 0x00, 0x02, - 0x30, 0x59, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x5D, 0x30, 0x99, - 0x00, 0x02, 0x30, 0x5F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x61, 0x30, 0x99, 0x00, 0x02, 0x30, 0x64, - 0x30, 0x99, 0x00, 0x02, 0x30, 0x66, 0x30, 0x99, 0x00, 0x02, 0x30, 0x68, 0x30, 0x99, 0x00, 0x02, - 0x30, 0x6F, 0x30, 0x99, 0x00, 0x02, 0x30, 0x6F, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x72, 0x30, 0x99, - 0x00, 0x02, 0x30, 0x72, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x75, 0x30, 0x99, 0x00, 0x02, 0x30, 0x75, - 0x30, 0x9A, 0x00, 0x02, 0x30, 0x78, 0x30, 0x99, 0x00, 0x02, 0x30, 0x78, 0x30, 0x9A, 0x00, 0x02, - 0x30, 0x7B, 0x30, 0x99, 0x00, 0x02, 0x30, 0x7B, 0x30, 0x9A, 0x00, 0x02, 0x30, 0x46, 0x30, 0x99, - 0x00, 0x02, 0x30, 0x9D, 0x30, 0x99, 0x00, 0x01, 0x00, 0x1B, 0x30, 0x4C, 0x30, 0x4E, 0x30, 0x50, - 0x30, 0x52, 0x30, 0x54, 0x30, 0x56, 0x30, 0x58, 0x30, 0x5A, 0x30, 0x5C, 0x30, 0x5E, 0x30, 0x60, - 0x30, 0x62, 0x30, 0x65, 0x30, 0x67, 0x30, 0x69, 0x30, 0x70, 0x30, 0x71, 0x30, 0x73, 0x30, 0x74, - 0x30, 0x76, 0x30, 0x77, 0x30, 0x79, 0x30, 0x7A, 0x30, 0x7C, 0x30, 0x7D, 0x30, 0x94, 0x30, 0x9E, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x03, 0x00, 0x0C, - 0x00, 0x16, 0x00, 0x3A, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xC0, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x04, - 0x00, 0x0A, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x0C, 0xCB, 0x00, 0x03, 0x0C, 0xC2, 0x0C, 0xD5, - 0x0C, 0xCA, 0x00, 0x02, 0x0C, 0xC2, 0x0C, 0xC7, 0x00, 0x02, 0x0C, 0xD5, 0x0C, 0xC8, 0x00, 0x02, - 0x0C, 0xD6, 0x00, 0x01, 0x00, 0x04, 0x0C, 0xCB, 0x00, 0x02, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x03, - 0x0C, 0xBF, 0x0C, 0xC6, 0x0C, 0xCA, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x46, - 0x00, 0x01, 0x00, 0x2E, 0x00, 0x05, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, - 0x00, 0x02, 0x0C, 0xBF, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xD5, 0x00, 0x02, 0x0C, 0xC6, - 0x0C, 0xD6, 0x00, 0x02, 0x0C, 0xC6, 0x0C, 0xC2, 0x00, 0x02, 0x0C, 0xCA, 0x0C, 0xD5, 0x00, 0x01, - 0x00, 0x05, 0x0C, 0xC0, 0x0C, 0xC7, 0x0C, 0xC8, 0x0C, 0xCA, 0x0C, 0xCB, 0x00, 0x01, 0x00, 0x10, - 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x0C, 0xC6, 0x0C, 0xC2, 0x0C, 0xD5, 0x00, 0x01, 0x00, 0x01, - 0x0C, 0xCB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x01, 0x66, 0x00, 0x1A, - 0x00, 0x3A, 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, - 0x00, 0x8A, 0x00, 0x94, 0x00, 0x9E, 0x00, 0xA8, 0x00, 0xB2, 0x00, 0xBC, 0x00, 0xC6, 0x00, 0xD0, - 0x00, 0xDA, 0x00, 0xEC, 0x00, 0xFE, 0x01, 0x10, 0x01, 0x22, 0x01, 0x34, 0x01, 0x3E, 0x01, 0x48, - 0x01, 0x52, 0x01, 0x5C, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF4, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, - 0x00, 0x04, 0x30, 0xAC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xAE, 0x00, 0x02, - 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, - 0x30, 0xB2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB4, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x04, 0x30, 0xB6, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xB8, - 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, - 0x00, 0x04, 0x30, 0xBC, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xBE, 0x00, 0x02, - 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC0, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, - 0x30, 0xC2, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC5, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x04, 0x30, 0xC7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xC9, - 0x00, 0x02, 0x30, 0x99, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD0, 0x00, 0x02, 0x30, 0x99, - 0x30, 0xD1, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD3, 0x00, 0x02, - 0x30, 0x99, 0x30, 0xD4, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x30, 0xD6, - 0x00, 0x02, 0x30, 0x99, 0x30, 0xD7, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, - 0x30, 0xD9, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDA, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x30, 0xDC, 0x00, 0x02, 0x30, 0x99, 0x30, 0xDD, 0x00, 0x02, 0x30, 0x9A, 0x00, 0x01, - 0x00, 0x04, 0x30, 0xF7, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF8, 0x00, 0x02, - 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xF9, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, - 0x30, 0xFA, 0x00, 0x02, 0x30, 0x99, 0x00, 0x01, 0x00, 0x04, 0x30, 0xFE, 0x00, 0x02, 0x30, 0x99, - 0x00, 0x01, 0x00, 0x1A, 0x30, 0xA6, 0x30, 0xAB, 0x30, 0xAD, 0x30, 0xAF, 0x30, 0xB1, 0x30, 0xB3, - 0x30, 0xB5, 0x30, 0xB7, 0x30, 0xB9, 0x30, 0xBB, 0x30, 0xBD, 0x30, 0xBF, 0x30, 0xC1, 0x30, 0xC4, - 0x30, 0xC6, 0x30, 0xC8, 0x30, 0xCF, 0x30, 0xD2, 0x30, 0xD5, 0x30, 0xD8, 0x30, 0xDB, 0x30, 0xEF, - 0x30, 0xF0, 0x30, 0xF1, 0x30, 0xF2, 0x30, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, - 0x00, 0x01, 0x00, 0xFE, 0x00, 0x1F, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, - 0x00, 0x62, 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, - 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB6, 0x00, 0xBC, - 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, - 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x30, 0xAB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xAD, 0x30, 0x99, - 0x00, 0x02, 0x30, 0xAF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB3, - 0x30, 0x99, 0x00, 0x02, 0x30, 0xB5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xB7, 0x30, 0x99, 0x00, 0x02, - 0x30, 0xB9, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xBD, 0x30, 0x99, - 0x00, 0x02, 0x30, 0xBF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC1, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC4, - 0x30, 0x99, 0x00, 0x02, 0x30, 0xC6, 0x30, 0x99, 0x00, 0x02, 0x30, 0xC8, 0x30, 0x99, 0x00, 0x02, - 0x30, 0xCF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xCF, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD2, 0x30, 0x99, - 0x00, 0x02, 0x30, 0xD2, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD5, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD5, - 0x30, 0x9A, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x99, 0x00, 0x02, 0x30, 0xD8, 0x30, 0x9A, 0x00, 0x02, - 0x30, 0xDB, 0x30, 0x99, 0x00, 0x02, 0x30, 0xDB, 0x30, 0x9A, 0x00, 0x02, 0x30, 0xA6, 0x30, 0x99, - 0x00, 0x02, 0x30, 0xEF, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF0, 0x30, 0x99, 0x00, 0x02, 0x30, 0xF1, - 0x30, 0x99, 0x00, 0x02, 0x30, 0xF2, 0x30, 0x99, 0x00, 0x02, 0x30, 0xFD, 0x30, 0x99, 0x00, 0x01, - 0x00, 0x1F, 0x30, 0xAC, 0x30, 0xAE, 0x30, 0xB0, 0x30, 0xB2, 0x30, 0xB4, 0x30, 0xB6, 0x30, 0xB8, - 0x30, 0xBA, 0x30, 0xBC, 0x30, 0xBE, 0x30, 0xC0, 0x30, 0xC2, 0x30, 0xC5, 0x30, 0xC7, 0x30, 0xC9, - 0x30, 0xD0, 0x30, 0xD1, 0x30, 0xD3, 0x30, 0xD4, 0x30, 0xD6, 0x30, 0xD7, 0x30, 0xD9, 0x30, 0xDA, - 0x30, 0xDC, 0x30, 0xDD, 0x30, 0xF4, 0x30, 0xF7, 0x30, 0xF8, 0x30, 0xF9, 0x30, 0xFA, 0x30, 0xFE, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x1E, 0x9A, 0x00, 0x89, 0x01, 0x18, - 0x02, 0x72, 0x02, 0x8C, 0x02, 0xE6, 0x03, 0x18, 0x04, 0x3E, 0x04, 0x48, 0x04, 0x8A, 0x04, 0xC4, - 0x05, 0x6A, 0x05, 0x74, 0x05, 0xA6, 0x05, 0xF4, 0x06, 0x16, 0x06, 0x70, 0x08, 0x56, 0x08, 0x70, - 0x08, 0xCE, 0x09, 0x42, 0x09, 0x7C, 0x0B, 0x14, 0x0B, 0x26, 0x0B, 0x68, 0x0B, 0x7A, 0x0B, 0xD4, - 0x0C, 0x0E, 0x0D, 0x68, 0x0D, 0x82, 0x0D, 0xDC, 0x0E, 0x0E, 0x0F, 0x34, 0x0F, 0x3E, 0x0F, 0x80, - 0x0F, 0xC2, 0x10, 0x60, 0x10, 0x72, 0x10, 0xA4, 0x10, 0xF2, 0x11, 0x14, 0x11, 0x6E, 0x13, 0x54, - 0x13, 0x6E, 0x13, 0xCC, 0x14, 0x40, 0x14, 0x82, 0x16, 0x1A, 0x16, 0x2C, 0x16, 0x76, 0x16, 0x88, - 0x16, 0xEA, 0x17, 0x24, 0x17, 0x5E, 0x17, 0x68, 0x17, 0x7A, 0x17, 0x94, 0x17, 0xA6, 0x17, 0xE0, - 0x17, 0xF2, 0x17, 0xFC, 0x18, 0x06, 0x18, 0x40, 0x18, 0x6A, 0x18, 0x74, 0x18, 0x86, 0x18, 0x90, - 0x18, 0x9A, 0x18, 0xCC, 0x19, 0x06, 0x19, 0x10, 0x19, 0x22, 0x19, 0x3C, 0x19, 0x4E, 0x19, 0x88, - 0x19, 0x9A, 0x19, 0xA4, 0x19, 0xAE, 0x19, 0xE8, 0x1A, 0x12, 0x1A, 0x1C, 0x1A, 0x2E, 0x1A, 0x38, - 0x1A, 0x42, 0x1A, 0x74, 0x1A, 0xAE, 0x1A, 0xE8, 0x1A, 0xF2, 0x1A, 0xFC, 0x1B, 0x1E, 0x1B, 0x40, - 0x1B, 0x4A, 0x1B, 0x54, 0x1B, 0x7E, 0x1B, 0xA8, 0x1B, 0xB2, 0x1B, 0xBC, 0x1B, 0xC6, 0x1B, 0xD0, - 0x1B, 0xEA, 0x1C, 0x04, 0x1C, 0x0E, 0x1C, 0x18, 0x1C, 0x22, 0x1C, 0x5C, 0x1C, 0x96, 0x1C, 0xD0, - 0x1D, 0x0A, 0x1D, 0x14, 0x1D, 0x1E, 0x1D, 0x28, 0x1D, 0x32, 0x1D, 0x3C, 0x1D, 0x46, 0x1D, 0x50, - 0x1D, 0x5A, 0x1D, 0x64, 0x1D, 0x6E, 0x1D, 0x78, 0x1D, 0x82, 0x1D, 0x8C, 0x1D, 0x96, 0x1D, 0xA0, - 0x1D, 0xAA, 0x1D, 0xB4, 0x1D, 0xBE, 0x1D, 0xD0, 0x1D, 0xE2, 0x1D, 0xEC, 0x1D, 0xF6, 0x1E, 0x08, - 0x1E, 0x1A, 0x1E, 0x24, 0x1E, 0x2E, 0x1E, 0x38, 0x1E, 0x42, 0x1E, 0x4C, 0x1E, 0x56, 0x1E, 0x88, - 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, - 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, - 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, - 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, - 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4E, 0x01, 0x54, 0x00, 0xC0, - 0x00, 0x02, 0x03, 0x00, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, - 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x03, 0x03, 0x02, - 0x03, 0x03, 0x1E, 0xA8, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x03, 0x03, 0x02, - 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xA4, 0x00, 0x03, 0x03, 0x02, - 0x03, 0x41, 0x00, 0xC2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xC3, 0x00, 0x02, 0x03, 0x03, 0x01, 0x00, - 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB0, 0x00, 0x03, 0x03, 0x06, 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x03, - 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x03, 0x03, 0x06, 0x03, 0x03, 0x1E, 0xB2, 0x00, 0x03, - 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x06, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x03, - 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAE, 0x00, 0x03, 0x03, 0x06, 0x03, 0x41, 0x01, 0x02, 0x00, 0x02, - 0x03, 0x06, 0x01, 0xE0, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x26, 0x00, 0x02, 0x03, 0x07, - 0x01, 0xDE, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xC4, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA2, - 0x00, 0x02, 0x03, 0x09, 0x01, 0xFA, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x03, - 0x03, 0x0A, 0x03, 0x41, 0x00, 0xC5, 0x00, 0x02, 0x03, 0x0A, 0x01, 0xCD, 0x00, 0x02, 0x03, 0x0C, - 0x02, 0x00, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x02, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xAC, 0x00, 0x03, - 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x03, 0x03, 0x23, 0x03, 0x06, 0x1E, 0xA0, 0x00, 0x02, - 0x03, 0x23, 0x1E, 0x00, 0x00, 0x02, 0x03, 0x25, 0x01, 0x04, 0x00, 0x02, 0x03, 0x28, 0x00, 0xC0, - 0x00, 0x02, 0x03, 0x40, 0x00, 0xC1, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x14, 0x1E, 0x02, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x04, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x06, - 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x01, - 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x01, 0x01, 0x08, 0x00, 0x02, 0x03, 0x02, 0x01, 0x0A, - 0x00, 0x02, 0x03, 0x07, 0x01, 0x0C, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, - 0x03, 0x01, 0x1E, 0x08, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, 0x00, 0xC7, 0x00, 0x02, 0x03, 0x27, - 0x1E, 0x08, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x06, 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, - 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x0A, 0x00, 0x02, - 0x03, 0x07, 0x01, 0x0E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0C, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x10, - 0x00, 0x02, 0x03, 0x27, 0x1E, 0x12, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x0E, 0x00, 0x02, 0x03, 0x31, - 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, - 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, - 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, - 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, - 0x01, 0x1A, 0x01, 0x20, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x00, 0x00, 0xC9, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, - 0x1E, 0xC4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, - 0x1E, 0xC6, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, - 0x1E, 0xBE, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xCA, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBC, - 0x00, 0x02, 0x03, 0x03, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x03, - 0x03, 0x04, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x16, 0x00, 0x03, - 0x03, 0x04, 0x03, 0x41, 0x01, 0x12, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x06, - 0x03, 0x27, 0x01, 0x14, 0x00, 0x02, 0x03, 0x06, 0x01, 0x16, 0x00, 0x02, 0x03, 0x07, 0x00, 0xCB, - 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBA, 0x00, 0x02, 0x03, 0x09, 0x01, 0x1A, 0x00, 0x02, 0x03, 0x0C, - 0x02, 0x04, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x06, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xC6, 0x00, 0x03, - 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x1C, 0x00, 0x03, 0x03, 0x27, - 0x03, 0x06, 0x02, 0x28, 0x00, 0x02, 0x03, 0x27, 0x01, 0x18, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x18, - 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1A, 0x00, 0x02, 0x03, 0x30, 0x00, 0xC8, 0x00, 0x02, 0x03, 0x40, - 0x00, 0xC9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1E, 0x00, 0x02, 0x03, 0x07, - 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, - 0x00, 0x3C, 0x01, 0xF4, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x20, - 0x00, 0x02, 0x03, 0x04, 0x01, 0x1E, 0x00, 0x02, 0x03, 0x06, 0x01, 0x20, 0x00, 0x02, 0x03, 0x07, - 0x01, 0xE6, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x22, 0x00, 0x02, 0x03, 0x27, 0x01, 0xF4, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, - 0x00, 0x34, 0x01, 0x24, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x22, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x26, - 0x00, 0x02, 0x03, 0x08, 0x02, 0x1E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x24, 0x00, 0x02, 0x03, 0x23, - 0x1E, 0x28, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2A, 0x00, 0x02, 0x03, 0x2E, 0x00, 0x14, 0x00, 0x2A, - 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5C, - 0x00, 0x64, 0x00, 0x6A, 0x00, 0x70, 0x00, 0x76, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8E, - 0x00, 0x94, 0x00, 0x9A, 0x00, 0xA0, 0x00, 0xCC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xCD, 0x00, 0x02, - 0x03, 0x01, 0x00, 0xCE, 0x00, 0x02, 0x03, 0x02, 0x01, 0x28, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2A, - 0x00, 0x02, 0x03, 0x04, 0x01, 0x2C, 0x00, 0x02, 0x03, 0x06, 0x01, 0x30, 0x00, 0x02, 0x03, 0x07, - 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, - 0x00, 0xCF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC8, 0x00, 0x02, 0x03, 0x09, 0x01, 0xCF, 0x00, 0x02, - 0x03, 0x0C, 0x02, 0x08, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0A, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCA, - 0x00, 0x02, 0x03, 0x23, 0x01, 0x2E, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x2C, 0x00, 0x02, 0x03, 0x30, - 0x00, 0xCC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xCD, 0x00, 0x02, 0x03, 0x41, 0x1E, 0x2E, 0x00, 0x02, - 0x03, 0x44, 0x00, 0x01, 0x00, 0x04, 0x01, 0x34, 0x00, 0x02, 0x03, 0x02, 0x00, 0x06, 0x00, 0x0E, - 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x01, - 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, 0x00, 0x02, - 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, - 0x00, 0x14, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, - 0x00, 0x48, 0x01, 0x39, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, - 0x01, 0x3D, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x38, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x36, - 0x00, 0x02, 0x03, 0x23, 0x01, 0x3B, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3C, 0x00, 0x02, 0x03, 0x2D, - 0x1E, 0x3A, 0x00, 0x02, 0x03, 0x31, 0x01, 0x39, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, - 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x40, 0x00, 0x02, - 0x03, 0x07, 0x1E, 0x42, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, - 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, - 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF8, 0x00, 0x02, 0x03, 0x00, 0x01, 0x43, 0x00, 0x02, - 0x03, 0x01, 0x00, 0xD1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x44, 0x00, 0x02, 0x03, 0x07, 0x01, 0x47, - 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x46, 0x00, 0x02, 0x03, 0x23, 0x01, 0x45, 0x00, 0x02, 0x03, 0x27, - 0x1E, 0x4A, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x48, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF8, 0x00, 0x02, - 0x03, 0x40, 0x01, 0x43, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, - 0x00, 0x80, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, - 0x00, 0xBE, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, - 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, - 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, - 0x01, 0x68, 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, - 0x01, 0xA6, 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, - 0x01, 0xE0, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x00, - 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD2, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD6, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD4, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD8, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD0, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xD4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4C, 0x00, 0x03, - 0x03, 0x03, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4E, 0x00, 0x03, - 0x03, 0x03, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x03, - 0x03, 0x03, 0x03, 0x41, 0x00, 0xD5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, - 0x03, 0x00, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x04, - 0x03, 0x28, 0x1E, 0x50, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x52, 0x00, 0x03, 0x03, 0x04, - 0x03, 0x41, 0x01, 0x4C, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4E, 0x00, 0x02, 0x03, 0x06, 0x02, 0x30, - 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, 0x02, 0x2E, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2A, 0x00, 0x03, - 0x03, 0x08, 0x03, 0x04, 0x00, 0xD6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x09, - 0x03, 0x1B, 0x1E, 0xCE, 0x00, 0x02, 0x03, 0x09, 0x01, 0x50, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD1, - 0x00, 0x02, 0x03, 0x0C, 0x02, 0x0C, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0E, 0x00, 0x02, 0x03, 0x11, - 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, - 0x1E, 0xE0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, - 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, - 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD8, - 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCC, - 0x00, 0x02, 0x03, 0x23, 0x01, 0xEC, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEA, 0x00, 0x02, - 0x03, 0x28, 0x1E, 0xDC, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xD2, 0x00, 0x02, 0x03, 0x40, - 0x1E, 0xDA, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xD3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, - 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x56, 0x00, 0x02, - 0x03, 0x07, 0x1E, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, - 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, - 0x01, 0x54, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x58, - 0x00, 0x02, 0x03, 0x07, 0x01, 0x58, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x10, 0x00, 0x02, 0x03, 0x0F, - 0x02, 0x12, 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5C, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5A, - 0x00, 0x02, 0x03, 0x23, 0x01, 0x56, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5E, 0x00, 0x02, 0x03, 0x31, - 0x01, 0x54, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, - 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, - 0x00, 0x6E, 0x1E, 0x64, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x01, - 0x01, 0x5C, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x60, - 0x00, 0x02, 0x03, 0x07, 0x1E, 0x66, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x60, 0x00, 0x02, - 0x03, 0x0C, 0x1E, 0x68, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x62, 0x00, 0x02, 0x03, 0x23, - 0x02, 0x18, 0x00, 0x02, 0x03, 0x26, 0x01, 0x5E, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x64, 0x00, 0x03, - 0x03, 0x41, 0x03, 0x07, 0x01, 0x5A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, - 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0x6A, 0x00, 0x02, 0x03, 0x07, - 0x01, 0x64, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6C, 0x00, 0x02, 0x03, 0x23, 0x02, 0x1A, 0x00, 0x02, - 0x03, 0x26, 0x01, 0x62, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x70, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6E, - 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, - 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, - 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, - 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, - 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, - 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, - 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, - 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x00, 0xDB, 0x00, 0x02, - 0x03, 0x02, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x03, - 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, 0x01, 0x68, 0x00, 0x02, 0x03, 0x03, - 0x1E, 0x7A, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6A, 0x00, 0x02, 0x03, 0x04, 0x01, 0x6C, - 0x00, 0x02, 0x03, 0x06, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x03, - 0x03, 0x08, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x01, 0xD9, 0x00, 0x03, - 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x03, 0x03, 0x08, 0x03, 0x40, 0x01, 0xD7, 0x00, 0x03, - 0x03, 0x08, 0x03, 0x41, 0x00, 0xDC, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xEC, 0x00, 0x03, 0x03, 0x09, - 0x03, 0x1B, 0x1E, 0xE6, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6E, 0x00, 0x02, 0x03, 0x0A, 0x01, 0x70, - 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD3, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x14, 0x00, 0x02, 0x03, 0x0F, - 0x02, 0x16, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE8, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xEC, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEA, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xAF, - 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF0, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xE4, 0x00, 0x02, - 0x03, 0x23, 0x1E, 0x72, 0x00, 0x02, 0x03, 0x24, 0x01, 0x72, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x76, - 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x74, 0x00, 0x02, 0x03, 0x30, 0x1E, 0xEA, 0x00, 0x03, 0x03, 0x40, - 0x03, 0x1B, 0x00, 0xD9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, - 0x00, 0xDA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x1E, 0x7C, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7E, 0x00, 0x02, 0x03, 0x23, 0x00, 0x08, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, - 0x1E, 0x80, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x01, 0x01, 0x74, 0x00, 0x02, - 0x03, 0x02, 0x1E, 0x86, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x84, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x88, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0x80, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x82, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8A, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8C, 0x00, 0x02, - 0x03, 0x08, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, - 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x54, 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x00, - 0x00, 0xDD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x76, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF8, 0x00, 0x02, - 0x03, 0x03, 0x02, 0x32, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8E, 0x00, 0x02, 0x03, 0x07, 0x01, 0x78, - 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF6, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF4, 0x00, 0x02, 0x03, 0x23, - 0x1E, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x00, 0xDD, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x01, 0x79, 0x00, 0x02, - 0x03, 0x01, 0x1E, 0x90, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x7D, - 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x92, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x94, 0x00, 0x02, 0x03, 0x31, - 0x01, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x26, 0x00, 0x4E, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x62, - 0x00, 0x6A, 0x00, 0x72, 0x00, 0x7A, 0x00, 0x82, 0x00, 0x8A, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9E, - 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBC, 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, - 0x00, 0xE2, 0x00, 0xEA, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0xFE, 0x01, 0x04, 0x01, 0x0C, 0x01, 0x14, - 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x42, 0x01, 0x48, - 0x01, 0x4E, 0x01, 0x54, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x00, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, - 0x1E, 0xAB, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, - 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, - 0x1E, 0xA5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xE2, 0x00, 0x02, 0x03, 0x02, 0x00, 0xE3, - 0x00, 0x02, 0x03, 0x03, 0x01, 0x01, 0x00, 0x02, 0x03, 0x04, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, - 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x03, 0x03, 0x06, - 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x03, 0x03, 0x06, 0x03, 0x09, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x06, - 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x03, 0x03, 0x06, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x03, 0x03, 0x06, - 0x03, 0x41, 0x01, 0x03, 0x00, 0x02, 0x03, 0x06, 0x01, 0xE1, 0x00, 0x03, 0x03, 0x07, 0x03, 0x04, - 0x02, 0x27, 0x00, 0x02, 0x03, 0x07, 0x01, 0xDF, 0x00, 0x03, 0x03, 0x08, 0x03, 0x04, 0x00, 0xE4, - 0x00, 0x02, 0x03, 0x08, 0x1E, 0xA3, 0x00, 0x02, 0x03, 0x09, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, - 0x03, 0x01, 0x01, 0xFB, 0x00, 0x03, 0x03, 0x0A, 0x03, 0x41, 0x00, 0xE5, 0x00, 0x02, 0x03, 0x0A, - 0x01, 0xCE, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x01, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x03, 0x00, 0x02, - 0x03, 0x11, 0x1E, 0xAD, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x03, 0x03, 0x23, - 0x03, 0x06, 0x1E, 0xA1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x01, 0x00, 0x02, 0x03, 0x25, 0x01, 0x05, - 0x00, 0x02, 0x03, 0x28, 0x00, 0xE0, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE1, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x03, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x05, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0x07, 0x00, 0x02, 0x03, 0x31, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x1E, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, - 0x1E, 0x09, 0x00, 0x03, 0x03, 0x01, 0x03, 0x27, 0x01, 0x07, 0x00, 0x02, 0x03, 0x01, 0x01, 0x09, - 0x00, 0x02, 0x03, 0x02, 0x01, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0D, 0x00, 0x02, 0x03, 0x0C, - 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x01, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x27, 0x03, 0x41, - 0x00, 0xE7, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x09, 0x00, 0x03, 0x03, 0x41, 0x03, 0x27, 0x01, 0x07, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, - 0x00, 0x2C, 0x1E, 0x0B, 0x00, 0x02, 0x03, 0x07, 0x01, 0x0F, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x0D, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0x11, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x13, 0x00, 0x02, 0x03, 0x2D, - 0x1E, 0x0F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x21, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x58, - 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x8E, 0x00, 0x94, - 0x00, 0x9C, 0x00, 0xA4, 0x00, 0xAC, 0x00, 0xB4, 0x00, 0xBA, 0x00, 0xC2, 0x00, 0xC8, 0x00, 0xCE, - 0x00, 0xD4, 0x00, 0xDA, 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x02, - 0x01, 0x08, 0x01, 0x0E, 0x01, 0x14, 0x01, 0x1A, 0x01, 0x20, 0x00, 0xE8, 0x00, 0x02, 0x03, 0x00, - 0x00, 0xE9, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x00, 0x1E, 0xBF, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x03, 0x1E, 0xC3, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x02, 0x03, 0x23, 0x1E, 0xC1, - 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x03, 0x03, 0x02, 0x03, 0x41, 0x00, 0xEA, - 0x00, 0x02, 0x03, 0x02, 0x1E, 0xBD, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, - 0x03, 0x00, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x03, 0x03, 0x04, - 0x03, 0x40, 0x1E, 0x17, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, 0x01, 0x13, 0x00, 0x02, 0x03, 0x04, - 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x06, 0x03, 0x27, 0x01, 0x15, 0x00, 0x02, 0x03, 0x06, 0x01, 0x17, - 0x00, 0x02, 0x03, 0x07, 0x00, 0xEB, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xBB, 0x00, 0x02, 0x03, 0x09, - 0x01, 0x1B, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x05, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x07, 0x00, 0x02, - 0x03, 0x11, 0x1E, 0xC7, 0x00, 0x03, 0x03, 0x23, 0x03, 0x02, 0x1E, 0xB9, 0x00, 0x02, 0x03, 0x23, - 0x1E, 0x1D, 0x00, 0x03, 0x03, 0x27, 0x03, 0x06, 0x02, 0x29, 0x00, 0x02, 0x03, 0x27, 0x01, 0x19, - 0x00, 0x02, 0x03, 0x28, 0x1E, 0x19, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x1B, 0x00, 0x02, 0x03, 0x30, - 0x00, 0xE8, 0x00, 0x02, 0x03, 0x40, 0x00, 0xE9, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, - 0x1E, 0x1F, 0x00, 0x02, 0x03, 0x07, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, - 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x01, 0x01, 0x1D, - 0x00, 0x02, 0x03, 0x02, 0x1E, 0x21, 0x00, 0x02, 0x03, 0x04, 0x01, 0x1F, 0x00, 0x02, 0x03, 0x06, - 0x01, 0x21, 0x00, 0x02, 0x03, 0x07, 0x01, 0xE7, 0x00, 0x02, 0x03, 0x0C, 0x01, 0x23, 0x00, 0x02, - 0x03, 0x27, 0x01, 0xF5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x01, 0x25, 0x00, 0x02, 0x03, 0x02, - 0x1E, 0x23, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x27, 0x00, 0x02, 0x03, 0x08, 0x02, 0x1F, 0x00, 0x02, - 0x03, 0x0C, 0x1E, 0x25, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x29, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x2B, - 0x00, 0x02, 0x03, 0x2E, 0x1E, 0x96, 0x00, 0x02, 0x03, 0x31, 0x00, 0x13, 0x00, 0x28, 0x00, 0x2E, - 0x00, 0x34, 0x00, 0x3A, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x62, - 0x00, 0x68, 0x00, 0x6E, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8C, 0x00, 0x92, - 0x00, 0x98, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x00, 0x00, 0xED, 0x00, 0x02, 0x03, 0x01, 0x00, 0xEE, - 0x00, 0x02, 0x03, 0x02, 0x01, 0x29, 0x00, 0x02, 0x03, 0x03, 0x01, 0x2B, 0x00, 0x02, 0x03, 0x04, - 0x01, 0x2D, 0x00, 0x02, 0x03, 0x06, 0x1E, 0x2F, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x1E, 0x2F, - 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xEF, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xC9, 0x00, 0x02, - 0x03, 0x09, 0x01, 0xD0, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x09, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0B, - 0x00, 0x02, 0x03, 0x11, 0x1E, 0xCB, 0x00, 0x02, 0x03, 0x23, 0x01, 0x2F, 0x00, 0x02, 0x03, 0x28, - 0x1E, 0x2D, 0x00, 0x02, 0x03, 0x30, 0x00, 0xEC, 0x00, 0x02, 0x03, 0x40, 0x00, 0xED, 0x00, 0x02, - 0x03, 0x41, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0x35, - 0x00, 0x02, 0x03, 0x02, 0x01, 0xF0, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, - 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE9, - 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x33, 0x00, 0x02, 0x03, 0x23, 0x01, 0x37, 0x00, 0x02, 0x03, 0x27, - 0x1E, 0x35, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x31, 0x00, 0x02, 0x03, 0x41, 0x00, 0x09, 0x00, 0x14, - 0x00, 0x1A, 0x00, 0x22, 0x00, 0x28, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, - 0x01, 0x3A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x01, 0x3E, - 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x39, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x37, 0x00, 0x02, - 0x03, 0x23, 0x01, 0x3C, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x3D, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x3B, - 0x00, 0x02, 0x03, 0x31, 0x01, 0x3A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x41, 0x00, 0x02, 0x03, 0x07, - 0x1E, 0x43, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x3F, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x48, - 0x00, 0x4E, 0x00, 0x54, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x00, 0x01, 0x44, 0x00, 0x02, 0x03, 0x01, - 0x00, 0xF1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x45, 0x00, 0x02, 0x03, 0x07, 0x01, 0x48, 0x00, 0x02, - 0x03, 0x0C, 0x1E, 0x47, 0x00, 0x02, 0x03, 0x23, 0x01, 0x46, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x4B, - 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x49, 0x00, 0x02, 0x03, 0x31, 0x01, 0xF9, 0x00, 0x02, 0x03, 0x40, - 0x01, 0x44, 0x00, 0x02, 0x03, 0x41, 0x00, 0x34, 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x80, - 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9E, 0x00, 0xA6, 0x00, 0xAE, 0x00, 0xB6, 0x00, 0xBE, - 0x00, 0xC4, 0x00, 0xCC, 0x00, 0xD4, 0x00, 0xDC, 0x00, 0xE4, 0x00, 0xEC, 0x00, 0xF2, 0x00, 0xFA, - 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2E, 0x01, 0x34, - 0x01, 0x3C, 0x01, 0x42, 0x01, 0x4A, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5C, 0x01, 0x62, 0x01, 0x68, - 0x01, 0x70, 0x01, 0x78, 0x01, 0x80, 0x01, 0x88, 0x01, 0x90, 0x01, 0x98, 0x01, 0xA0, 0x01, 0xA6, - 0x01, 0xAE, 0x01, 0xB6, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD2, 0x01, 0xD8, 0x01, 0xE0, - 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, - 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD3, 0x00, 0x03, - 0x03, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x03, 0x03, 0x02, 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x03, - 0x03, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x03, 0x03, 0x02, 0x03, 0x09, 0x1E, 0xD9, 0x00, 0x03, - 0x03, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x03, 0x03, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x03, - 0x03, 0x02, 0x03, 0x41, 0x00, 0xF4, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, - 0x03, 0x01, 0x02, 0x2D, 0x00, 0x03, 0x03, 0x03, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x03, 0x03, 0x03, - 0x03, 0x08, 0x1E, 0xE1, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x03, 0x03, 0x03, - 0x03, 0x41, 0x00, 0xF5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x00, - 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0xED, 0x00, 0x03, 0x03, 0x04, 0x03, 0x28, - 0x1E, 0x51, 0x00, 0x03, 0x03, 0x04, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x03, 0x03, 0x04, 0x03, 0x41, - 0x01, 0x4D, 0x00, 0x02, 0x03, 0x04, 0x01, 0x4F, 0x00, 0x02, 0x03, 0x06, 0x02, 0x31, 0x00, 0x03, - 0x03, 0x07, 0x03, 0x04, 0x02, 0x2F, 0x00, 0x02, 0x03, 0x07, 0x02, 0x2B, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x04, 0x00, 0xF6, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, - 0x1E, 0xCF, 0x00, 0x02, 0x03, 0x09, 0x01, 0x51, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD2, 0x00, 0x02, - 0x03, 0x0C, 0x02, 0x0D, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xDD, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xE1, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xE3, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xDB, - 0x00, 0x03, 0x03, 0x1B, 0x03, 0x41, 0x01, 0xA1, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xD9, 0x00, 0x03, - 0x03, 0x23, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x03, 0x03, 0x23, 0x03, 0x1B, 0x1E, 0xCD, 0x00, 0x02, - 0x03, 0x23, 0x01, 0xED, 0x00, 0x03, 0x03, 0x28, 0x03, 0x04, 0x01, 0xEB, 0x00, 0x02, 0x03, 0x28, - 0x1E, 0xDD, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF2, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xF3, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, - 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x55, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x57, 0x00, 0x02, 0x03, 0x07, - 0x1E, 0x55, 0x00, 0x02, 0x03, 0x41, 0x00, 0x0B, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x2C, - 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x01, 0x55, - 0x00, 0x02, 0x03, 0x01, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x04, 0x03, 0x23, 0x1E, 0x59, 0x00, 0x02, - 0x03, 0x07, 0x01, 0x59, 0x00, 0x02, 0x03, 0x0C, 0x02, 0x11, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x13, - 0x00, 0x02, 0x03, 0x11, 0x1E, 0x5D, 0x00, 0x03, 0x03, 0x23, 0x03, 0x04, 0x1E, 0x5B, 0x00, 0x02, - 0x03, 0x23, 0x01, 0x57, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x5F, 0x00, 0x02, 0x03, 0x31, 0x01, 0x55, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x0D, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x38, - 0x00, 0x3E, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6E, - 0x1E, 0x65, 0x00, 0x03, 0x03, 0x01, 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x01, 0x01, 0x5D, - 0x00, 0x02, 0x03, 0x02, 0x1E, 0x69, 0x00, 0x03, 0x03, 0x07, 0x03, 0x23, 0x1E, 0x61, 0x00, 0x02, - 0x03, 0x07, 0x1E, 0x67, 0x00, 0x03, 0x03, 0x0C, 0x03, 0x07, 0x01, 0x61, 0x00, 0x02, 0x03, 0x0C, - 0x1E, 0x69, 0x00, 0x03, 0x03, 0x23, 0x03, 0x07, 0x1E, 0x63, 0x00, 0x02, 0x03, 0x23, 0x02, 0x19, - 0x00, 0x02, 0x03, 0x26, 0x01, 0x5F, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x65, 0x00, 0x03, 0x03, 0x41, - 0x03, 0x07, 0x01, 0x5B, 0x00, 0x02, 0x03, 0x41, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x00, 0x2A, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3C, 0x1E, 0x6B, 0x00, 0x02, 0x03, 0x07, - 0x1E, 0x97, 0x00, 0x02, 0x03, 0x08, 0x01, 0x65, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x6D, 0x00, 0x02, - 0x03, 0x23, 0x02, 0x1B, 0x00, 0x02, 0x03, 0x26, 0x01, 0x63, 0x00, 0x02, 0x03, 0x27, 0x1E, 0x71, - 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x6F, 0x00, 0x02, 0x03, 0x31, 0x00, 0x2D, 0x00, 0x5C, 0x00, 0x64, - 0x00, 0x6A, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x86, 0x00, 0x8E, 0x00, 0x96, 0x00, 0x9C, - 0x00, 0xA4, 0x00, 0xAA, 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD8, - 0x00, 0xE0, 0x00, 0xE6, 0x00, 0xEE, 0x00, 0xF4, 0x00, 0xFA, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0C, - 0x01, 0x12, 0x01, 0x1A, 0x01, 0x22, 0x01, 0x2A, 0x01, 0x32, 0x01, 0x3A, 0x01, 0x42, 0x01, 0x4A, - 0x01, 0x50, 0x01, 0x58, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, 0x01, 0x7E, - 0x01, 0x84, 0x01, 0x8C, 0x01, 0x92, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x00, 0x03, 0x1B, 0x00, 0xF9, - 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x01, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, - 0x03, 0x01, 0x00, 0xFB, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x01, - 0x1E, 0xEF, 0x00, 0x03, 0x03, 0x03, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x03, 0x03, 0x03, 0x03, 0x41, - 0x01, 0x69, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7B, 0x00, 0x03, 0x03, 0x04, 0x03, 0x08, 0x01, 0x6B, - 0x00, 0x02, 0x03, 0x04, 0x01, 0x6D, 0x00, 0x02, 0x03, 0x06, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x00, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x04, 0x01, 0xDA, 0x00, 0x03, 0x03, 0x08, 0x03, 0x0C, 0x01, 0xDC, 0x00, 0x03, 0x03, 0x08, - 0x03, 0x40, 0x01, 0xD8, 0x00, 0x03, 0x03, 0x08, 0x03, 0x41, 0x00, 0xFC, 0x00, 0x02, 0x03, 0x08, - 0x1E, 0xED, 0x00, 0x03, 0x03, 0x09, 0x03, 0x1B, 0x1E, 0xE7, 0x00, 0x02, 0x03, 0x09, 0x01, 0x6F, - 0x00, 0x02, 0x03, 0x0A, 0x01, 0x71, 0x00, 0x02, 0x03, 0x0B, 0x01, 0xD4, 0x00, 0x02, 0x03, 0x0C, - 0x02, 0x15, 0x00, 0x02, 0x03, 0x0F, 0x02, 0x17, 0x00, 0x02, 0x03, 0x11, 0x1E, 0xEB, 0x00, 0x03, - 0x03, 0x1B, 0x03, 0x00, 0x1E, 0xE9, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x03, - 0x03, 0x1B, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x09, 0x1E, 0xF1, 0x00, 0x03, - 0x03, 0x1B, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x1B, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x03, - 0x03, 0x1B, 0x03, 0x41, 0x01, 0xB0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0xF1, 0x00, 0x03, 0x03, 0x23, - 0x03, 0x1B, 0x1E, 0xE5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0x73, 0x00, 0x02, 0x03, 0x24, 0x01, 0x73, - 0x00, 0x02, 0x03, 0x28, 0x1E, 0x77, 0x00, 0x02, 0x03, 0x2D, 0x1E, 0x75, 0x00, 0x02, 0x03, 0x30, - 0x1E, 0xEB, 0x00, 0x03, 0x03, 0x40, 0x03, 0x1B, 0x00, 0xF9, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, - 0x00, 0x03, 0x03, 0x41, 0x03, 0x1B, 0x00, 0xFA, 0x00, 0x02, 0x03, 0x41, 0x01, 0xD8, 0x00, 0x02, - 0x03, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x7D, 0x00, 0x02, 0x03, 0x03, 0x1E, 0x7F, - 0x00, 0x02, 0x03, 0x23, 0x00, 0x09, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, - 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, 0x00, 0x44, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x83, - 0x00, 0x02, 0x03, 0x01, 0x01, 0x75, 0x00, 0x02, 0x03, 0x02, 0x1E, 0x87, 0x00, 0x02, 0x03, 0x07, - 0x1E, 0x85, 0x00, 0x02, 0x03, 0x08, 0x1E, 0x98, 0x00, 0x02, 0x03, 0x0A, 0x1E, 0x89, 0x00, 0x02, - 0x03, 0x23, 0x1E, 0x81, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x83, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x8B, 0x00, 0x02, 0x03, 0x07, 0x1E, 0x8D, 0x00, 0x02, 0x03, 0x08, - 0x00, 0x0C, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3E, - 0x00, 0x44, 0x00, 0x4A, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5C, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x00, - 0x00, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0x77, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xF9, 0x00, 0x02, - 0x03, 0x03, 0x02, 0x33, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x8F, 0x00, 0x02, 0x03, 0x07, 0x00, 0xFF, - 0x00, 0x02, 0x03, 0x08, 0x1E, 0xF7, 0x00, 0x02, 0x03, 0x09, 0x1E, 0x99, 0x00, 0x02, 0x03, 0x0A, - 0x1E, 0xF5, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xF3, 0x00, 0x02, 0x03, 0x40, 0x00, 0xFD, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, - 0x00, 0x34, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x91, 0x00, 0x02, 0x03, 0x02, 0x01, 0x7C, - 0x00, 0x02, 0x03, 0x07, 0x01, 0x7E, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x93, 0x00, 0x02, 0x03, 0x23, - 0x1E, 0x95, 0x00, 0x02, 0x03, 0x31, 0x01, 0x7A, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA6, 0x00, 0x02, - 0x03, 0x00, 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xAA, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA8, - 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAC, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xA6, 0x00, 0x02, 0x03, 0x40, - 0x1E, 0xA4, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xDE, 0x00, 0x02, 0x03, 0x04, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x01, - 0x01, 0xE2, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFC, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, - 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC0, - 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xC4, 0x00, 0x02, 0x03, 0x03, - 0x1E, 0xC2, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC0, 0x00, 0x02, - 0x03, 0x40, 0x1E, 0xBE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2E, - 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2E, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDC, - 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, - 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD2, - 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xD6, 0x00, 0x02, 0x03, 0x03, - 0x1E, 0xD4, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD2, 0x00, 0x02, - 0x03, 0x40, 0x1E, 0xD0, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, - 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4C, 0x00, 0x02, 0x03, 0x01, 0x02, 0x2C, 0x00, 0x02, 0x03, 0x04, - 0x1E, 0x4E, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4C, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2A, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, - 0x00, 0x0C, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, - 0x00, 0x04, 0x1E, 0xEA, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE8, 0x00, 0x02, - 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, - 0x01, 0xDB, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD7, 0x00, 0x02, 0x03, 0x01, 0x01, 0xD5, 0x00, 0x02, - 0x03, 0x04, 0x01, 0xD9, 0x00, 0x02, 0x03, 0x0C, 0x01, 0xDB, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD7, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, - 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0xAB, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xA9, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xAD, 0x00, 0x02, - 0x03, 0x23, 0x1E, 0xA7, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xA5, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, - 0x00, 0x04, 0x01, 0xDF, 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFB, - 0x00, 0x02, 0x03, 0x01, 0x01, 0xFB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, - 0x00, 0x14, 0x01, 0xFD, 0x00, 0x02, 0x03, 0x01, 0x01, 0xE3, 0x00, 0x02, 0x03, 0x04, 0x01, 0xFD, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x09, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0x09, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, - 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xBF, 0x00, 0x02, - 0x03, 0x01, 0x1E, 0xC5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xC3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xC7, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0xC1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xBF, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0x2F, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x2F, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, - 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, - 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xD1, 0x00, 0x02, - 0x03, 0x01, 0x1E, 0xD7, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xD5, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xD9, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0xD3, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xD1, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x4D, 0x00, 0x02, - 0x03, 0x01, 0x02, 0x2D, 0x00, 0x02, 0x03, 0x04, 0x1E, 0x4F, 0x00, 0x02, 0x03, 0x08, 0x1E, 0xE1, - 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x4D, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x02, 0x2B, - 0x00, 0x02, 0x03, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFF, 0x00, 0x02, 0x03, 0x01, - 0x01, 0xFF, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x1B, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0xE9, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x14, - 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x01, 0xDC, 0x00, 0x02, 0x03, 0x00, 0x01, 0xD8, - 0x00, 0x02, 0x03, 0x01, 0x01, 0xD6, 0x00, 0x02, 0x03, 0x04, 0x01, 0xDA, 0x00, 0x02, 0x03, 0x0C, - 0x01, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x01, 0xD8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, - 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB0, 0x00, 0x02, - 0x03, 0x00, 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xB4, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB2, - 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB0, 0x00, 0x02, 0x03, 0x40, - 0x1E, 0xAE, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, - 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xAF, 0x00, 0x02, - 0x03, 0x01, 0x1E, 0xB5, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xB3, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xB7, - 0x00, 0x02, 0x03, 0x23, 0x1E, 0xB1, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xAF, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0x08, 0x00, 0x02, 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x09, - 0x00, 0x02, 0x03, 0x27, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x1E, 0x14, - 0x00, 0x02, 0x03, 0x00, 0x1E, 0x16, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x14, 0x00, 0x02, 0x03, 0x40, - 0x1E, 0x16, 0x00, 0x02, 0x03, 0x41, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, - 0x1E, 0x15, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x01, 0x1E, 0x15, 0x00, 0x02, - 0x03, 0x40, 0x1E, 0x17, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, - 0x03, 0x27, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x27, 0x00, 0x05, 0x00, 0x0C, - 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x24, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x52, - 0x00, 0x02, 0x03, 0x01, 0x01, 0xEC, 0x00, 0x02, 0x03, 0x28, 0x1E, 0x50, 0x00, 0x02, 0x03, 0x40, - 0x1E, 0x52, 0x00, 0x02, 0x03, 0x41, 0x00, 0x05, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1E, - 0x00, 0x24, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x00, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x01, 0x01, 0xED, - 0x00, 0x02, 0x03, 0x28, 0x1E, 0x51, 0x00, 0x02, 0x03, 0x40, 0x1E, 0x53, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0x64, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x65, - 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x66, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, - 0x00, 0x04, 0x1E, 0x67, 0x00, 0x02, 0x03, 0x07, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, - 0x1E, 0x78, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x78, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x1B, 0x1E, 0x79, 0x00, 0x02, 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, - 0x1E, 0x7A, 0x00, 0x02, 0x03, 0x08, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x7B, 0x00, 0x02, 0x03, 0x08, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0x9B, 0x00, 0x02, 0x03, 0x07, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, - 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x00, - 0x1E, 0xDA, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xE0, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDE, 0x00, 0x02, - 0x03, 0x09, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xDC, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDA, - 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, - 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x01, - 0x1E, 0xE1, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xE3, 0x00, 0x02, - 0x03, 0x23, 0x1E, 0xDD, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xDB, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, - 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEA, - 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEE, 0x00, 0x02, 0x03, 0x03, - 0x1E, 0xEC, 0x00, 0x02, 0x03, 0x09, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEA, 0x00, 0x02, - 0x03, 0x40, 0x1E, 0xE8, 0x00, 0x02, 0x03, 0x41, 0x00, 0x07, 0x00, 0x10, 0x00, 0x16, 0x00, 0x1C, - 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x00, 0x1E, 0xE9, - 0x00, 0x02, 0x03, 0x01, 0x1E, 0xEF, 0x00, 0x02, 0x03, 0x03, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x09, - 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x23, 0x1E, 0xEB, 0x00, 0x02, 0x03, 0x40, 0x1E, 0xE9, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x01, 0x00, 0x04, 0x01, 0xEE, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, - 0x01, 0xEC, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xED, 0x00, 0x02, 0x03, 0x04, - 0x00, 0x01, 0x00, 0x04, 0x01, 0xE0, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x01, 0xE1, - 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x1C, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, - 0x00, 0x04, 0x1E, 0x1D, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x02, 0x30, 0x00, 0x02, - 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x02, 0x31, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, - 0x01, 0xEF, 0x00, 0x02, 0x03, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x38, 0x00, 0x02, 0x03, 0x04, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0x39, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5C, - 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x5D, 0x00, 0x02, 0x03, 0x04, 0x00, 0x01, - 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x69, 0x00, 0x02, - 0x03, 0x23, 0x00, 0x01, 0x00, 0x04, 0x1E, 0x68, 0x00, 0x02, 0x03, 0x07, 0x00, 0x01, 0x00, 0x04, - 0x1E, 0x69, 0x00, 0x02, 0x03, 0x07, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAC, 0x00, 0x02, - 0x03, 0x02, 0x1E, 0xB6, 0x00, 0x02, 0x03, 0x06, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xAD, - 0x00, 0x02, 0x03, 0x02, 0x1E, 0xB7, 0x00, 0x02, 0x03, 0x06, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC6, - 0x00, 0x02, 0x03, 0x02, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xC7, 0x00, 0x02, 0x03, 0x02, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD8, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE2, 0x00, 0x02, 0x03, 0x1B, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x1E, 0xD9, 0x00, 0x02, 0x03, 0x02, 0x1E, 0xE3, 0x00, 0x02, - 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xDE, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, - 0x1E, 0xDF, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF0, 0x00, 0x02, 0x03, 0x1B, - 0x00, 0x01, 0x00, 0x04, 0x1E, 0xF1, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xEC, - 0x00, 0x02, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x1E, 0xED, 0x00, 0x02, 0x03, 0x1B, 0x00, 0x06, - 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x1E, 0x30, 0x00, 0x02, - 0x03, 0x01, 0x01, 0xE8, 0x00, 0x02, 0x03, 0x0C, 0x1E, 0x32, 0x00, 0x02, 0x03, 0x23, 0x01, 0x36, - 0x00, 0x02, 0x03, 0x27, 0x1E, 0x34, 0x00, 0x02, 0x03, 0x31, 0x1E, 0x30, 0x00, 0x02, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x01, 0xFA, 0x00, 0x02, 0x03, 0x01, 0x01, 0xFA, 0x00, 0x02, - 0x03, 0x41, 0x00, 0x01, 0x00, 0x89, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, - 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x4D, - 0x00, 0x4E, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, - 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, - 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6A, 0x00, 0x6B, 0x00, 0x6C, - 0x00, 0x6D, 0x00, 0x6E, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, - 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7A, 0x00, 0xC2, 0x00, 0xC4, 0x00, 0xC5, - 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xCA, 0x00, 0xCF, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, - 0x00, 0xD6, 0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE2, 0x00, 0xE4, 0x00, 0xE5, - 0x00, 0xE6, 0x00, 0xE7, 0x00, 0xEA, 0x00, 0xEF, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, - 0x00, 0xF6, 0x00, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFC, 0x01, 0x02, 0x01, 0x03, 0x01, 0x06, - 0x01, 0x07, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x5A, - 0x01, 0x5B, 0x01, 0x60, 0x01, 0x61, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x7F, - 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xB7, 0x01, 0xEA, 0x01, 0xEB, 0x02, 0x26, - 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x92, 0x1E, 0x36, 0x1E, 0x37, - 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0xA0, 0x1E, 0xA1, - 0x1E, 0xB8, 0x1E, 0xB9, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xE4, 0x1E, 0xE5, - 0x1E, 0xE6, 0x1E, 0xE7, 0x21, 0x2A, 0x21, 0x2B, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x14, - 0x13, 0x88, 0x1A, 0x9E, 0x1E, 0x3C, 0x21, 0xAE, 0x22, 0x6C, 0x22, 0xFA, 0x00, 0x01, 0x0F, 0x8E, - 0x01, 0xF1, 0x03, 0xE8, 0x03, 0xEE, 0x03, 0xF4, 0x03, 0xFA, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0C, - 0x04, 0x12, 0x04, 0x18, 0x04, 0x1E, 0x04, 0x24, 0x04, 0x2A, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3C, - 0x04, 0x42, 0x04, 0x48, 0x04, 0x4E, 0x04, 0x54, 0x04, 0x5A, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6C, - 0x04, 0x72, 0x04, 0x78, 0x04, 0x7E, 0x04, 0x84, 0x04, 0x8A, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9C, - 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCC, - 0x04, 0xD2, 0x04, 0xD8, 0x04, 0xDE, 0x04, 0xE4, 0x04, 0xEA, 0x04, 0xF0, 0x04, 0xF6, 0x04, 0xFC, - 0x05, 0x02, 0x05, 0x08, 0x05, 0x0E, 0x05, 0x14, 0x05, 0x1A, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2C, - 0x05, 0x32, 0x05, 0x38, 0x05, 0x3E, 0x05, 0x44, 0x05, 0x4A, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5C, - 0x05, 0x62, 0x05, 0x68, 0x05, 0x6E, 0x05, 0x74, 0x05, 0x7A, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8C, - 0x05, 0x92, 0x05, 0x98, 0x05, 0x9E, 0x05, 0xA4, 0x05, 0xAA, 0x05, 0xB0, 0x05, 0xB6, 0x05, 0xBC, - 0x05, 0xC2, 0x05, 0xC8, 0x05, 0xCE, 0x05, 0xD4, 0x05, 0xDA, 0x05, 0xE0, 0x05, 0xE6, 0x05, 0xEC, - 0x05, 0xF2, 0x05, 0xF8, 0x05, 0xFE, 0x06, 0x04, 0x06, 0x0A, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1C, - 0x06, 0x22, 0x06, 0x28, 0x06, 0x2E, 0x06, 0x34, 0x06, 0x3A, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4C, - 0x06, 0x52, 0x06, 0x58, 0x06, 0x5E, 0x06, 0x64, 0x06, 0x6A, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7C, - 0x06, 0x82, 0x06, 0x88, 0x06, 0x8E, 0x06, 0x94, 0x06, 0x9A, 0x06, 0xA0, 0x06, 0xA6, 0x06, 0xAC, - 0x06, 0xB2, 0x06, 0xB8, 0x06, 0xBE, 0x06, 0xC4, 0x06, 0xCA, 0x06, 0xD0, 0x06, 0xD6, 0x06, 0xDC, - 0x06, 0xE2, 0x06, 0xE8, 0x06, 0xEE, 0x06, 0xF4, 0x06, 0xFA, 0x07, 0x00, 0x07, 0x06, 0x07, 0x0C, - 0x07, 0x12, 0x07, 0x18, 0x07, 0x1E, 0x07, 0x24, 0x07, 0x2A, 0x07, 0x30, 0x07, 0x36, 0x07, 0x3C, - 0x07, 0x42, 0x07, 0x48, 0x07, 0x4E, 0x07, 0x54, 0x07, 0x5A, 0x07, 0x60, 0x07, 0x66, 0x07, 0x6C, - 0x07, 0x72, 0x07, 0x78, 0x07, 0x7E, 0x07, 0x84, 0x07, 0x8A, 0x07, 0x90, 0x07, 0x96, 0x07, 0x9C, - 0x07, 0xA2, 0x07, 0xA8, 0x07, 0xAE, 0x07, 0xB4, 0x07, 0xBA, 0x07, 0xC0, 0x07, 0xC6, 0x07, 0xCC, - 0x07, 0xD2, 0x07, 0xD8, 0x07, 0xDE, 0x07, 0xE4, 0x07, 0xEA, 0x07, 0xF0, 0x07, 0xF6, 0x07, 0xFC, - 0x08, 0x02, 0x08, 0x08, 0x08, 0x0E, 0x08, 0x14, 0x08, 0x1A, 0x08, 0x20, 0x08, 0x26, 0x08, 0x2C, - 0x08, 0x32, 0x08, 0x38, 0x08, 0x3E, 0x08, 0x44, 0x08, 0x4A, 0x08, 0x50, 0x08, 0x56, 0x08, 0x5C, - 0x08, 0x62, 0x08, 0x68, 0x08, 0x6E, 0x08, 0x74, 0x08, 0x7A, 0x08, 0x80, 0x08, 0x86, 0x08, 0x8C, - 0x08, 0x92, 0x08, 0x98, 0x08, 0x9E, 0x08, 0xA4, 0x08, 0xAA, 0x08, 0xB0, 0x08, 0xB6, 0x08, 0xBC, - 0x08, 0xC2, 0x08, 0xC8, 0x08, 0xCE, 0x08, 0xD4, 0x08, 0xDA, 0x08, 0xE0, 0x08, 0xE6, 0x08, 0xEC, - 0x08, 0xF2, 0x08, 0xF8, 0x08, 0xFE, 0x09, 0x04, 0x09, 0x0A, 0x09, 0x10, 0x09, 0x16, 0x09, 0x1C, - 0x09, 0x22, 0x09, 0x28, 0x09, 0x2E, 0x09, 0x34, 0x09, 0x3A, 0x09, 0x40, 0x09, 0x46, 0x09, 0x4C, - 0x09, 0x52, 0x09, 0x58, 0x09, 0x5E, 0x09, 0x64, 0x09, 0x6A, 0x09, 0x70, 0x09, 0x76, 0x09, 0x7C, - 0x09, 0x82, 0x09, 0x88, 0x09, 0x8E, 0x09, 0x94, 0x09, 0x9A, 0x09, 0xA0, 0x09, 0xA6, 0x09, 0xAC, - 0x09, 0xB2, 0x09, 0xB8, 0x09, 0xBE, 0x09, 0xC4, 0x09, 0xCA, 0x09, 0xD0, 0x09, 0xD6, 0x09, 0xDC, - 0x09, 0xE2, 0x09, 0xE8, 0x09, 0xEE, 0x09, 0xF4, 0x09, 0xFA, 0x0A, 0x00, 0x0A, 0x06, 0x0A, 0x0C, - 0x0A, 0x12, 0x0A, 0x18, 0x0A, 0x1E, 0x0A, 0x24, 0x0A, 0x2A, 0x0A, 0x30, 0x0A, 0x36, 0x0A, 0x3C, - 0x0A, 0x42, 0x0A, 0x48, 0x0A, 0x4E, 0x0A, 0x54, 0x0A, 0x5A, 0x0A, 0x60, 0x0A, 0x66, 0x0A, 0x6C, - 0x0A, 0x72, 0x0A, 0x78, 0x0A, 0x7E, 0x0A, 0x84, 0x0A, 0x8A, 0x0A, 0x90, 0x0A, 0x96, 0x0A, 0x9C, - 0x0A, 0xA2, 0x0A, 0xA8, 0x0A, 0xAE, 0x0A, 0xB4, 0x0A, 0xBA, 0x0A, 0xC0, 0x0A, 0xC6, 0x0A, 0xCC, - 0x0A, 0xD2, 0x0A, 0xD8, 0x0A, 0xDE, 0x0A, 0xE4, 0x0A, 0xEA, 0x0A, 0xF0, 0x0A, 0xF6, 0x0A, 0xFC, - 0x0B, 0x02, 0x0B, 0x08, 0x0B, 0x0E, 0x0B, 0x14, 0x0B, 0x1A, 0x0B, 0x20, 0x0B, 0x26, 0x0B, 0x2C, - 0x0B, 0x32, 0x0B, 0x38, 0x0B, 0x3E, 0x0B, 0x44, 0x0B, 0x4A, 0x0B, 0x50, 0x0B, 0x56, 0x0B, 0x5C, - 0x0B, 0x62, 0x0B, 0x68, 0x0B, 0x6E, 0x0B, 0x74, 0x0B, 0x7A, 0x0B, 0x80, 0x0B, 0x86, 0x0B, 0x8C, - 0x0B, 0x92, 0x0B, 0x98, 0x0B, 0x9E, 0x0B, 0xA4, 0x0B, 0xAA, 0x0B, 0xB0, 0x0B, 0xB6, 0x0B, 0xBC, - 0x0B, 0xC2, 0x0B, 0xC8, 0x0B, 0xCE, 0x0B, 0xD4, 0x0B, 0xDA, 0x0B, 0xE0, 0x0B, 0xE6, 0x0B, 0xEC, - 0x0B, 0xF2, 0x0B, 0xF8, 0x0B, 0xFE, 0x0C, 0x04, 0x0C, 0x0A, 0x0C, 0x10, 0x0C, 0x16, 0x0C, 0x1C, - 0x0C, 0x22, 0x0C, 0x28, 0x0C, 0x2E, 0x0C, 0x34, 0x0C, 0x3A, 0x0C, 0x40, 0x0C, 0x46, 0x0C, 0x4C, - 0x0C, 0x52, 0x0C, 0x58, 0x0C, 0x5E, 0x0C, 0x64, 0x0C, 0x6A, 0x0C, 0x70, 0x0C, 0x76, 0x0C, 0x7C, - 0x0C, 0x82, 0x0C, 0x88, 0x0C, 0x8E, 0x0C, 0x94, 0x0C, 0x9A, 0x0C, 0xA0, 0x0C, 0xA6, 0x0C, 0xAC, - 0x0C, 0xB2, 0x0C, 0xB8, 0x0C, 0xBE, 0x0C, 0xC4, 0x0C, 0xCA, 0x0C, 0xD0, 0x0C, 0xD6, 0x0C, 0xDC, - 0x0C, 0xE2, 0x0C, 0xE8, 0x0C, 0xEE, 0x0C, 0xF4, 0x0C, 0xFA, 0x0D, 0x00, 0x0D, 0x06, 0x0D, 0x0C, - 0x0D, 0x12, 0x0D, 0x18, 0x0D, 0x1E, 0x0D, 0x24, 0x0D, 0x2A, 0x0D, 0x30, 0x0D, 0x36, 0x0D, 0x3C, - 0x0D, 0x42, 0x0D, 0x48, 0x0D, 0x4E, 0x0D, 0x54, 0x0D, 0x5A, 0x0D, 0x60, 0x0D, 0x66, 0x0D, 0x6C, - 0x0D, 0x72, 0x0D, 0x78, 0x0D, 0x7E, 0x0D, 0x84, 0x0D, 0x8A, 0x0D, 0x90, 0x0D, 0x96, 0x0D, 0x9C, - 0x0D, 0xA2, 0x0D, 0xA8, 0x0D, 0xAE, 0x0D, 0xB4, 0x0D, 0xBA, 0x0D, 0xC0, 0x0D, 0xC6, 0x0D, 0xCC, - 0x0D, 0xD2, 0x0D, 0xD8, 0x0D, 0xDE, 0x0D, 0xE4, 0x0D, 0xEA, 0x0D, 0xF0, 0x0D, 0xF6, 0x0D, 0xFC, - 0x0E, 0x02, 0x0E, 0x08, 0x0E, 0x0E, 0x0E, 0x14, 0x0E, 0x1A, 0x0E, 0x20, 0x0E, 0x26, 0x0E, 0x2C, - 0x0E, 0x32, 0x0E, 0x38, 0x0E, 0x3E, 0x0E, 0x44, 0x0E, 0x4A, 0x0E, 0x50, 0x0E, 0x56, 0x0E, 0x5C, - 0x0E, 0x62, 0x0E, 0x68, 0x0E, 0x6E, 0x0E, 0x74, 0x0E, 0x7A, 0x0E, 0x80, 0x0E, 0x86, 0x0E, 0x8C, - 0x0E, 0x92, 0x0E, 0x98, 0x0E, 0x9E, 0x0E, 0xA4, 0x0E, 0xAA, 0x0E, 0xB0, 0x0E, 0xB6, 0x0E, 0xBC, - 0x0E, 0xC2, 0x0E, 0xC8, 0x0E, 0xCE, 0x0E, 0xD4, 0x0E, 0xDA, 0x0E, 0xE0, 0x0E, 0xE6, 0x0E, 0xEC, - 0x0E, 0xF2, 0x0E, 0xF8, 0x0E, 0xFE, 0x0F, 0x04, 0x0F, 0x0A, 0x0F, 0x10, 0x0F, 0x16, 0x0F, 0x1C, - 0x0F, 0x22, 0x0F, 0x28, 0x0F, 0x2E, 0x0F, 0x34, 0x0F, 0x3A, 0x0F, 0x40, 0x0F, 0x46, 0x0F, 0x4C, - 0x0F, 0x52, 0x0F, 0x58, 0x0F, 0x5E, 0x0F, 0x64, 0x0F, 0x6A, 0x0F, 0x70, 0x0F, 0x76, 0x0F, 0x7C, - 0x0F, 0x82, 0x0F, 0x88, 0x00, 0x02, 0x00, 0x41, 0x03, 0x00, 0x00, 0x02, 0x00, 0x41, 0x03, 0x01, - 0x00, 0x02, 0x00, 0x41, 0x03, 0x02, 0x00, 0x02, 0x00, 0x41, 0x03, 0x03, 0x00, 0x02, 0x00, 0x41, - 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x43, 0x03, 0x27, 0x00, 0x02, - 0x00, 0x45, 0x03, 0x00, 0x00, 0x02, 0x00, 0x45, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, 0x03, 0x02, - 0x00, 0x02, 0x00, 0x45, 0x03, 0x08, 0x00, 0x02, 0x00, 0x49, 0x03, 0x00, 0x00, 0x02, 0x00, 0x49, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x49, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x08, 0x00, 0x02, - 0x00, 0x4E, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x01, - 0x00, 0x02, 0x00, 0x4F, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x4F, - 0x03, 0x08, 0x00, 0x02, 0x00, 0x55, 0x03, 0x00, 0x00, 0x02, 0x00, 0x55, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x55, 0x03, 0x02, 0x00, 0x02, 0x00, 0x55, 0x03, 0x08, 0x00, 0x02, 0x00, 0x59, 0x03, 0x01, - 0x00, 0x02, 0x00, 0x61, 0x03, 0x00, 0x00, 0x02, 0x00, 0x61, 0x03, 0x01, 0x00, 0x02, 0x00, 0x61, - 0x03, 0x02, 0x00, 0x02, 0x00, 0x61, 0x03, 0x03, 0x00, 0x02, 0x00, 0x61, 0x03, 0x08, 0x00, 0x02, - 0x00, 0x61, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x63, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x00, - 0x00, 0x02, 0x00, 0x65, 0x03, 0x01, 0x00, 0x02, 0x00, 0x65, 0x03, 0x02, 0x00, 0x02, 0x00, 0x65, - 0x03, 0x08, 0x00, 0x02, 0x00, 0x69, 0x03, 0x00, 0x00, 0x02, 0x00, 0x69, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x69, 0x03, 0x02, 0x00, 0x02, 0x00, 0x69, 0x03, 0x08, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x03, - 0x00, 0x02, 0x00, 0x6F, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6F, - 0x03, 0x02, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x03, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x08, 0x00, 0x02, - 0x00, 0x75, 0x03, 0x00, 0x00, 0x02, 0x00, 0x75, 0x03, 0x01, 0x00, 0x02, 0x00, 0x75, 0x03, 0x02, - 0x00, 0x02, 0x00, 0x75, 0x03, 0x08, 0x00, 0x02, 0x00, 0x79, 0x03, 0x01, 0x00, 0x02, 0x00, 0x79, - 0x03, 0x08, 0x00, 0x02, 0x00, 0x41, 0x03, 0x04, 0x00, 0x02, 0x00, 0x61, 0x03, 0x04, 0x00, 0x02, - 0x00, 0x41, 0x03, 0x06, 0x00, 0x02, 0x00, 0x61, 0x03, 0x06, 0x00, 0x02, 0x00, 0x41, 0x03, 0x28, - 0x00, 0x02, 0x00, 0x61, 0x03, 0x28, 0x00, 0x02, 0x00, 0x43, 0x03, 0x01, 0x00, 0x02, 0x00, 0x63, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x43, 0x03, 0x02, 0x00, 0x02, 0x00, 0x63, 0x03, 0x02, 0x00, 0x02, - 0x00, 0x43, 0x03, 0x07, 0x00, 0x02, 0x00, 0x63, 0x03, 0x07, 0x00, 0x02, 0x00, 0x43, 0x03, 0x0C, - 0x00, 0x02, 0x00, 0x63, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x44, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x64, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x45, 0x03, 0x04, 0x00, 0x02, 0x00, 0x65, 0x03, 0x04, 0x00, 0x02, - 0x00, 0x45, 0x03, 0x06, 0x00, 0x02, 0x00, 0x65, 0x03, 0x06, 0x00, 0x02, 0x00, 0x45, 0x03, 0x07, - 0x00, 0x02, 0x00, 0x65, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x28, 0x00, 0x02, 0x00, 0x65, - 0x03, 0x28, 0x00, 0x02, 0x00, 0x45, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0C, 0x00, 0x02, - 0x00, 0x47, 0x03, 0x02, 0x00, 0x02, 0x00, 0x67, 0x03, 0x02, 0x00, 0x02, 0x00, 0x47, 0x03, 0x06, - 0x00, 0x02, 0x00, 0x67, 0x03, 0x06, 0x00, 0x02, 0x00, 0x47, 0x03, 0x07, 0x00, 0x02, 0x00, 0x67, - 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, 0x03, 0x27, 0x00, 0x02, 0x00, 0x67, 0x03, 0x27, 0x00, 0x02, - 0x00, 0x48, 0x03, 0x02, 0x00, 0x02, 0x00, 0x68, 0x03, 0x02, 0x00, 0x02, 0x00, 0x49, 0x03, 0x03, - 0x00, 0x02, 0x00, 0x69, 0x03, 0x03, 0x00, 0x02, 0x00, 0x49, 0x03, 0x04, 0x00, 0x02, 0x00, 0x69, - 0x03, 0x04, 0x00, 0x02, 0x00, 0x49, 0x03, 0x06, 0x00, 0x02, 0x00, 0x69, 0x03, 0x06, 0x00, 0x02, - 0x00, 0x49, 0x03, 0x28, 0x00, 0x02, 0x00, 0x69, 0x03, 0x28, 0x00, 0x02, 0x00, 0x49, 0x03, 0x07, - 0x00, 0x02, 0x00, 0x4A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x4B, - 0x03, 0x27, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x6C, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x27, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x27, - 0x00, 0x02, 0x00, 0x4C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4E, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x27, 0x00, 0x02, - 0x00, 0x6E, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x0C, - 0x00, 0x02, 0x00, 0x4F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, - 0x03, 0x06, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x06, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0B, 0x00, 0x02, - 0x00, 0x6F, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x52, 0x03, 0x01, 0x00, 0x02, 0x00, 0x72, 0x03, 0x01, - 0x00, 0x02, 0x00, 0x52, 0x03, 0x27, 0x00, 0x02, 0x00, 0x72, 0x03, 0x27, 0x00, 0x02, 0x00, 0x52, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x53, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x73, 0x03, 0x01, 0x00, 0x02, 0x00, 0x53, 0x03, 0x02, 0x00, 0x02, 0x00, 0x73, 0x03, 0x02, - 0x00, 0x02, 0x00, 0x53, 0x03, 0x27, 0x00, 0x02, 0x00, 0x73, 0x03, 0x27, 0x00, 0x02, 0x00, 0x53, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x73, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x54, 0x03, 0x27, 0x00, 0x02, - 0x00, 0x74, 0x03, 0x27, 0x00, 0x02, 0x00, 0x54, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x74, 0x03, 0x0C, - 0x00, 0x02, 0x00, 0x55, 0x03, 0x03, 0x00, 0x02, 0x00, 0x75, 0x03, 0x03, 0x00, 0x02, 0x00, 0x55, - 0x03, 0x04, 0x00, 0x02, 0x00, 0x75, 0x03, 0x04, 0x00, 0x02, 0x00, 0x55, 0x03, 0x06, 0x00, 0x02, - 0x00, 0x75, 0x03, 0x06, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0A, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0A, - 0x00, 0x02, 0x00, 0x55, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0B, 0x00, 0x02, 0x00, 0x55, - 0x03, 0x28, 0x00, 0x02, 0x00, 0x75, 0x03, 0x28, 0x00, 0x02, 0x00, 0x57, 0x03, 0x02, 0x00, 0x02, - 0x00, 0x77, 0x03, 0x02, 0x00, 0x02, 0x00, 0x59, 0x03, 0x02, 0x00, 0x02, 0x00, 0x79, 0x03, 0x02, - 0x00, 0x02, 0x00, 0x59, 0x03, 0x08, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x02, 0x00, 0x7A, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x5A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x1B, - 0x00, 0x02, 0x00, 0x6F, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x55, 0x03, 0x1B, 0x00, 0x02, 0x00, 0x75, - 0x03, 0x1B, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0C, 0x00, 0x02, - 0x00, 0x49, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x0C, - 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x55, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x75, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x04, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x04, 0x00, 0x02, - 0x00, 0x55, 0x03, 0x44, 0x00, 0x02, 0x00, 0x75, 0x03, 0x44, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x0C, - 0x00, 0x02, 0x00, 0xFC, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x00, 0x00, 0x02, 0x00, 0xFC, - 0x03, 0x00, 0x00, 0x02, 0x00, 0xC4, 0x03, 0x04, 0x00, 0x02, 0x00, 0xE4, 0x03, 0x04, 0x00, 0x02, - 0x02, 0x26, 0x03, 0x04, 0x00, 0x02, 0x02, 0x27, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC6, 0x03, 0x04, - 0x00, 0x02, 0x00, 0xE6, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x67, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x0C, 0x00, 0x02, - 0x00, 0x4F, 0x03, 0x28, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x28, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x28, - 0x00, 0x02, 0x01, 0x4D, 0x03, 0x28, 0x00, 0x02, 0x01, 0xB7, 0x03, 0x0C, 0x00, 0x02, 0x02, 0x92, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x6A, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x47, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x67, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x00, - 0x00, 0x02, 0x00, 0xC5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xC6, - 0x03, 0x01, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x01, 0x00, 0x02, - 0x00, 0xF8, 0x03, 0x01, 0x00, 0x02, 0x00, 0x41, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x61, 0x03, 0x0F, - 0x00, 0x02, 0x00, 0x41, 0x03, 0x11, 0x00, 0x02, 0x00, 0x61, 0x03, 0x11, 0x00, 0x02, 0x00, 0x45, - 0x03, 0x0F, 0x00, 0x02, 0x00, 0x65, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x45, 0x03, 0x11, 0x00, 0x02, - 0x00, 0x65, 0x03, 0x11, 0x00, 0x02, 0x00, 0x49, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x69, 0x03, 0x0F, - 0x00, 0x02, 0x00, 0x49, 0x03, 0x11, 0x00, 0x02, 0x00, 0x69, 0x03, 0x11, 0x00, 0x02, 0x00, 0x4F, - 0x03, 0x0F, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x11, 0x00, 0x02, - 0x00, 0x6F, 0x03, 0x11, 0x00, 0x02, 0x00, 0x52, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x72, 0x03, 0x0F, - 0x00, 0x02, 0x00, 0x52, 0x03, 0x11, 0x00, 0x02, 0x00, 0x72, 0x03, 0x11, 0x00, 0x02, 0x00, 0x55, - 0x03, 0x0F, 0x00, 0x02, 0x00, 0x75, 0x03, 0x0F, 0x00, 0x02, 0x00, 0x55, 0x03, 0x11, 0x00, 0x02, - 0x00, 0x75, 0x03, 0x11, 0x00, 0x02, 0x00, 0x53, 0x03, 0x26, 0x00, 0x02, 0x00, 0x73, 0x03, 0x26, - 0x00, 0x02, 0x00, 0x54, 0x03, 0x26, 0x00, 0x02, 0x00, 0x74, 0x03, 0x26, 0x00, 0x02, 0x00, 0x48, - 0x03, 0x0C, 0x00, 0x02, 0x00, 0x68, 0x03, 0x0C, 0x00, 0x02, 0x00, 0x41, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x61, 0x03, 0x07, 0x00, 0x02, 0x00, 0x45, 0x03, 0x27, 0x00, 0x02, 0x00, 0x65, 0x03, 0x27, - 0x00, 0x02, 0x00, 0xD6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xF6, 0x03, 0x04, 0x00, 0x02, 0x00, 0xD5, - 0x03, 0x04, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x6F, 0x03, 0x07, 0x00, 0x02, 0x02, 0x2E, 0x03, 0x04, 0x00, 0x02, 0x02, 0x2F, 0x03, 0x04, - 0x00, 0x02, 0x00, 0x59, 0x03, 0x04, 0x00, 0x02, 0x00, 0x79, 0x03, 0x04, 0x00, 0x02, 0x00, 0x41, - 0x03, 0x25, 0x00, 0x02, 0x00, 0x61, 0x03, 0x25, 0x00, 0x02, 0x00, 0x42, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x62, 0x03, 0x07, 0x00, 0x02, 0x00, 0x42, 0x03, 0x23, 0x00, 0x02, 0x00, 0x62, 0x03, 0x23, - 0x00, 0x02, 0x00, 0x42, 0x03, 0x31, 0x00, 0x02, 0x00, 0x62, 0x03, 0x31, 0x00, 0x02, 0x00, 0xC7, - 0x03, 0x01, 0x00, 0x02, 0x00, 0xE7, 0x03, 0x01, 0x00, 0x02, 0x00, 0x44, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x64, 0x03, 0x07, 0x00, 0x02, 0x00, 0x44, 0x03, 0x23, 0x00, 0x02, 0x00, 0x64, 0x03, 0x23, - 0x00, 0x02, 0x00, 0x44, 0x03, 0x31, 0x00, 0x02, 0x00, 0x64, 0x03, 0x31, 0x00, 0x02, 0x00, 0x44, - 0x03, 0x27, 0x00, 0x02, 0x00, 0x64, 0x03, 0x27, 0x00, 0x02, 0x00, 0x44, 0x03, 0x2D, 0x00, 0x02, - 0x00, 0x64, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x12, 0x03, 0x00, 0x00, 0x02, 0x01, 0x13, 0x03, 0x00, - 0x00, 0x02, 0x01, 0x12, 0x03, 0x01, 0x00, 0x02, 0x01, 0x13, 0x03, 0x01, 0x00, 0x02, 0x00, 0x45, - 0x03, 0x2D, 0x00, 0x02, 0x00, 0x65, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x45, 0x03, 0x30, 0x00, 0x02, - 0x00, 0x65, 0x03, 0x30, 0x00, 0x02, 0x01, 0x14, 0x03, 0x27, 0x00, 0x02, 0x01, 0x15, 0x03, 0x27, - 0x00, 0x02, 0x00, 0x46, 0x03, 0x07, 0x00, 0x02, 0x00, 0x66, 0x03, 0x07, 0x00, 0x02, 0x00, 0x47, - 0x03, 0x04, 0x00, 0x02, 0x00, 0x67, 0x03, 0x04, 0x00, 0x02, 0x00, 0x48, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x68, 0x03, 0x07, 0x00, 0x02, 0x00, 0x48, 0x03, 0x23, 0x00, 0x02, 0x00, 0x68, 0x03, 0x23, - 0x00, 0x02, 0x00, 0x48, 0x03, 0x08, 0x00, 0x02, 0x00, 0x68, 0x03, 0x08, 0x00, 0x02, 0x00, 0x48, - 0x03, 0x27, 0x00, 0x02, 0x00, 0x68, 0x03, 0x27, 0x00, 0x02, 0x00, 0x48, 0x03, 0x2E, 0x00, 0x02, - 0x00, 0x68, 0x03, 0x2E, 0x00, 0x02, 0x00, 0x49, 0x03, 0x30, 0x00, 0x02, 0x00, 0x69, 0x03, 0x30, - 0x00, 0x02, 0x00, 0x49, 0x03, 0x44, 0x00, 0x02, 0x00, 0x69, 0x03, 0x44, 0x00, 0x02, 0x00, 0x4B, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x6B, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x31, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x31, - 0x00, 0x02, 0x00, 0x4C, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x36, - 0x03, 0x04, 0x00, 0x02, 0x1E, 0x37, 0x03, 0x04, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x31, 0x00, 0x02, - 0x00, 0x6C, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x2D, - 0x00, 0x02, 0x00, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x4D, - 0x03, 0x07, 0x00, 0x02, 0x00, 0x6D, 0x03, 0x07, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x6D, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x07, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x07, - 0x00, 0x02, 0x00, 0x4E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4E, - 0x03, 0x31, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x31, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x2D, 0x00, 0x02, - 0x00, 0x6E, 0x03, 0x2D, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x01, - 0x00, 0x02, 0x00, 0xD5, 0x03, 0x08, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, - 0x03, 0x00, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x00, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x01, 0x00, 0x02, - 0x01, 0x4D, 0x03, 0x01, 0x00, 0x02, 0x00, 0x50, 0x03, 0x01, 0x00, 0x02, 0x00, 0x70, 0x03, 0x01, - 0x00, 0x02, 0x00, 0x50, 0x03, 0x07, 0x00, 0x02, 0x00, 0x70, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, - 0x03, 0x07, 0x00, 0x02, 0x00, 0x72, 0x03, 0x07, 0x00, 0x02, 0x00, 0x52, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x72, 0x03, 0x23, 0x00, 0x02, 0x1E, 0x5A, 0x03, 0x04, 0x00, 0x02, 0x1E, 0x5B, 0x03, 0x04, - 0x00, 0x02, 0x00, 0x52, 0x03, 0x31, 0x00, 0x02, 0x00, 0x72, 0x03, 0x31, 0x00, 0x02, 0x00, 0x53, - 0x03, 0x07, 0x00, 0x02, 0x00, 0x73, 0x03, 0x07, 0x00, 0x02, 0x00, 0x53, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x73, 0x03, 0x23, 0x00, 0x02, 0x01, 0x5A, 0x03, 0x07, 0x00, 0x02, 0x01, 0x5B, 0x03, 0x07, - 0x00, 0x02, 0x01, 0x60, 0x03, 0x07, 0x00, 0x02, 0x01, 0x61, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x60, - 0x03, 0x23, 0x00, 0x02, 0x1E, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x54, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x74, 0x03, 0x07, 0x00, 0x02, 0x00, 0x54, 0x03, 0x23, 0x00, 0x02, 0x00, 0x74, 0x03, 0x23, - 0x00, 0x02, 0x00, 0x54, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x31, 0x00, 0x02, 0x00, 0x54, - 0x03, 0x2D, 0x00, 0x02, 0x00, 0x74, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x55, 0x03, 0x24, 0x00, 0x02, - 0x00, 0x75, 0x03, 0x24, 0x00, 0x02, 0x00, 0x55, 0x03, 0x30, 0x00, 0x02, 0x00, 0x75, 0x03, 0x30, - 0x00, 0x02, 0x00, 0x55, 0x03, 0x2D, 0x00, 0x02, 0x00, 0x75, 0x03, 0x2D, 0x00, 0x02, 0x01, 0x68, - 0x03, 0x01, 0x00, 0x02, 0x01, 0x69, 0x03, 0x01, 0x00, 0x02, 0x01, 0x6A, 0x03, 0x08, 0x00, 0x02, - 0x01, 0x6B, 0x03, 0x08, 0x00, 0x02, 0x00, 0x56, 0x03, 0x03, 0x00, 0x02, 0x00, 0x76, 0x03, 0x03, - 0x00, 0x02, 0x00, 0x56, 0x03, 0x23, 0x00, 0x02, 0x00, 0x76, 0x03, 0x23, 0x00, 0x02, 0x00, 0x57, - 0x03, 0x00, 0x00, 0x02, 0x00, 0x77, 0x03, 0x00, 0x00, 0x02, 0x00, 0x57, 0x03, 0x01, 0x00, 0x02, - 0x00, 0x77, 0x03, 0x01, 0x00, 0x02, 0x00, 0x57, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, 0x03, 0x08, - 0x00, 0x02, 0x00, 0x57, 0x03, 0x07, 0x00, 0x02, 0x00, 0x77, 0x03, 0x07, 0x00, 0x02, 0x00, 0x57, - 0x03, 0x23, 0x00, 0x02, 0x00, 0x77, 0x03, 0x23, 0x00, 0x02, 0x00, 0x58, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x78, 0x03, 0x07, 0x00, 0x02, 0x00, 0x58, 0x03, 0x08, 0x00, 0x02, 0x00, 0x78, 0x03, 0x08, - 0x00, 0x02, 0x00, 0x59, 0x03, 0x07, 0x00, 0x02, 0x00, 0x79, 0x03, 0x07, 0x00, 0x02, 0x00, 0x5A, - 0x03, 0x02, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x02, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x7A, 0x03, 0x23, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x31, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x31, - 0x00, 0x02, 0x00, 0x68, 0x03, 0x31, 0x00, 0x02, 0x00, 0x74, 0x03, 0x08, 0x00, 0x02, 0x00, 0x77, - 0x03, 0x0A, 0x00, 0x02, 0x00, 0x79, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x7F, 0x03, 0x07, 0x00, 0x02, - 0x00, 0x41, 0x03, 0x23, 0x00, 0x02, 0x00, 0x61, 0x03, 0x23, 0x00, 0x02, 0x00, 0x41, 0x03, 0x09, - 0x00, 0x02, 0x00, 0x61, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x01, 0x00, 0x02, 0x00, 0xE2, - 0x03, 0x01, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x00, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x00, 0x00, 0x02, - 0x00, 0xC2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x09, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x03, - 0x00, 0x02, 0x00, 0xE2, 0x03, 0x03, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x23, 0x00, 0x02, 0x00, 0xE2, - 0x03, 0x23, 0x00, 0x02, 0x01, 0x02, 0x03, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x01, 0x00, 0x02, - 0x01, 0x02, 0x03, 0x00, 0x00, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x02, 0x01, 0x02, 0x03, 0x09, - 0x00, 0x02, 0x01, 0x03, 0x03, 0x09, 0x00, 0x02, 0x01, 0x02, 0x03, 0x03, 0x00, 0x02, 0x01, 0x03, - 0x03, 0x03, 0x00, 0x02, 0x01, 0x02, 0x03, 0x23, 0x00, 0x02, 0x01, 0x03, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x45, 0x03, 0x23, 0x00, 0x02, 0x00, 0x65, 0x03, 0x23, 0x00, 0x02, 0x00, 0x45, 0x03, 0x09, - 0x00, 0x02, 0x00, 0x65, 0x03, 0x09, 0x00, 0x02, 0x00, 0x45, 0x03, 0x03, 0x00, 0x02, 0x00, 0x65, - 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x01, 0x00, 0x02, - 0x00, 0xCA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x00, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x09, - 0x00, 0x02, 0x00, 0xEA, 0x03, 0x09, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x03, 0x00, 0x02, 0x00, 0xEA, - 0x03, 0x03, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x23, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x23, 0x00, 0x02, - 0x00, 0x49, 0x03, 0x09, 0x00, 0x02, 0x00, 0x69, 0x03, 0x09, 0x00, 0x02, 0x00, 0x49, 0x03, 0x23, - 0x00, 0x02, 0x00, 0x69, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x23, 0x00, 0x02, 0x00, 0x6F, - 0x03, 0x23, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x09, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x09, 0x00, 0x02, - 0x00, 0xD4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x01, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x00, - 0x00, 0x02, 0x00, 0xF4, 0x03, 0x00, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x09, 0x00, 0x02, 0x00, 0xF4, - 0x03, 0x09, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x03, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x03, 0x00, 0x02, - 0x00, 0xD4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x23, 0x00, 0x02, 0x00, 0xD3, 0x03, 0x1B, - 0x00, 0x02, 0x00, 0xF3, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD2, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF2, - 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x09, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x09, 0x00, 0x02, - 0x00, 0xD5, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xF5, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x23, - 0x00, 0x02, 0x01, 0xA1, 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x23, 0x00, 0x02, 0x00, 0x75, - 0x03, 0x23, 0x00, 0x02, 0x00, 0x55, 0x03, 0x09, 0x00, 0x02, 0x00, 0x75, 0x03, 0x09, 0x00, 0x02, - 0x00, 0xDA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xFA, 0x03, 0x1B, 0x00, 0x02, 0x00, 0xD9, 0x03, 0x1B, - 0x00, 0x02, 0x00, 0xF9, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x09, 0x00, 0x02, 0x01, 0xB0, - 0x03, 0x09, 0x00, 0x02, 0x01, 0x68, 0x03, 0x1B, 0x00, 0x02, 0x01, 0x69, 0x03, 0x1B, 0x00, 0x02, - 0x01, 0xAF, 0x03, 0x23, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x00, - 0x00, 0x02, 0x00, 0x79, 0x03, 0x00, 0x00, 0x02, 0x00, 0x59, 0x03, 0x23, 0x00, 0x02, 0x00, 0x79, - 0x03, 0x23, 0x00, 0x02, 0x00, 0x59, 0x03, 0x09, 0x00, 0x02, 0x00, 0x79, 0x03, 0x09, 0x00, 0x02, - 0x00, 0x59, 0x03, 0x03, 0x00, 0x02, 0x00, 0x79, 0x03, 0x03, 0x00, 0x01, 0x01, 0xF1, 0x00, 0xC0, - 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC8, 0x00, 0xC9, - 0x00, 0xCA, 0x00, 0xCB, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, 0xD1, 0x00, 0xD2, - 0x00, 0xD3, 0x00, 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, 0xDC, - 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE5, 0x00, 0xE7, - 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x00, 0xEB, 0x00, 0xEC, 0x00, 0xED, 0x00, 0xEE, 0x00, 0xEF, - 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFA, - 0x00, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFF, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, - 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, 0x0A, 0x01, 0x0B, - 0x01, 0x0C, 0x01, 0x0D, 0x01, 0x0E, 0x01, 0x0F, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, - 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1A, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, - 0x01, 0x1E, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, - 0x01, 0x28, 0x01, 0x29, 0x01, 0x2A, 0x01, 0x2B, 0x01, 0x2C, 0x01, 0x2D, 0x01, 0x2E, 0x01, 0x2F, - 0x01, 0x30, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x39, 0x01, 0x3A, 0x01, 0x3B, - 0x01, 0x3C, 0x01, 0x3D, 0x01, 0x3E, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, - 0x01, 0x48, 0x01, 0x4C, 0x01, 0x4D, 0x01, 0x4E, 0x01, 0x4F, 0x01, 0x50, 0x01, 0x51, 0x01, 0x54, - 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5A, 0x01, 0x5B, 0x01, 0x5C, - 0x01, 0x5D, 0x01, 0x5E, 0x01, 0x5F, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, - 0x01, 0x65, 0x01, 0x68, 0x01, 0x69, 0x01, 0x6A, 0x01, 0x6B, 0x01, 0x6C, 0x01, 0x6D, 0x01, 0x6E, - 0x01, 0x6F, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, - 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7A, 0x01, 0x7B, 0x01, 0x7C, 0x01, 0x7D, 0x01, 0x7E, - 0x01, 0xA0, 0x01, 0xA1, 0x01, 0xAF, 0x01, 0xB0, 0x01, 0xCD, 0x01, 0xCE, 0x01, 0xCF, 0x01, 0xD0, - 0x01, 0xD1, 0x01, 0xD2, 0x01, 0xD3, 0x01, 0xD4, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, - 0x01, 0xD9, 0x01, 0xDA, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, - 0x01, 0xE2, 0x01, 0xE3, 0x01, 0xE6, 0x01, 0xE7, 0x01, 0xE8, 0x01, 0xE9, 0x01, 0xEA, 0x01, 0xEB, - 0x01, 0xEC, 0x01, 0xED, 0x01, 0xEE, 0x01, 0xEF, 0x01, 0xF0, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, - 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x00, - 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, - 0x02, 0x09, 0x02, 0x0A, 0x02, 0x0B, 0x02, 0x0C, 0x02, 0x0D, 0x02, 0x0E, 0x02, 0x0F, 0x02, 0x10, - 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, - 0x02, 0x19, 0x02, 0x1A, 0x02, 0x1B, 0x02, 0x1E, 0x02, 0x1F, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, - 0x02, 0x29, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x2E, 0x02, 0x2F, 0x02, 0x30, - 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x1E, 0x00, 0x1E, 0x01, 0x1E, 0x02, 0x1E, 0x03, 0x1E, 0x04, - 0x1E, 0x05, 0x1E, 0x06, 0x1E, 0x07, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x0A, 0x1E, 0x0B, 0x1E, 0x0C, - 0x1E, 0x0D, 0x1E, 0x0E, 0x1E, 0x0F, 0x1E, 0x10, 0x1E, 0x11, 0x1E, 0x12, 0x1E, 0x13, 0x1E, 0x14, - 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x18, 0x1E, 0x19, 0x1E, 0x1A, 0x1E, 0x1B, 0x1E, 0x1C, - 0x1E, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1E, 0x20, 0x1E, 0x21, 0x1E, 0x22, 0x1E, 0x23, 0x1E, 0x24, - 0x1E, 0x25, 0x1E, 0x26, 0x1E, 0x27, 0x1E, 0x28, 0x1E, 0x29, 0x1E, 0x2A, 0x1E, 0x2B, 0x1E, 0x2C, - 0x1E, 0x2D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x33, 0x1E, 0x34, - 0x1E, 0x35, 0x1E, 0x36, 0x1E, 0x37, 0x1E, 0x38, 0x1E, 0x39, 0x1E, 0x3A, 0x1E, 0x3B, 0x1E, 0x3C, - 0x1E, 0x3D, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x40, 0x1E, 0x41, 0x1E, 0x42, 0x1E, 0x43, 0x1E, 0x44, - 0x1E, 0x45, 0x1E, 0x46, 0x1E, 0x47, 0x1E, 0x48, 0x1E, 0x49, 0x1E, 0x4A, 0x1E, 0x4B, 0x1E, 0x4C, - 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, - 0x1E, 0x55, 0x1E, 0x56, 0x1E, 0x57, 0x1E, 0x58, 0x1E, 0x59, 0x1E, 0x5A, 0x1E, 0x5B, 0x1E, 0x5C, - 0x1E, 0x5D, 0x1E, 0x5E, 0x1E, 0x5F, 0x1E, 0x60, 0x1E, 0x61, 0x1E, 0x62, 0x1E, 0x63, 0x1E, 0x64, - 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x6A, 0x1E, 0x6B, 0x1E, 0x6C, - 0x1E, 0x6D, 0x1E, 0x6E, 0x1E, 0x6F, 0x1E, 0x70, 0x1E, 0x71, 0x1E, 0x72, 0x1E, 0x73, 0x1E, 0x74, - 0x1E, 0x75, 0x1E, 0x76, 0x1E, 0x77, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, 0x1E, 0x7B, 0x1E, 0x7C, - 0x1E, 0x7D, 0x1E, 0x7E, 0x1E, 0x7F, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0x84, - 0x1E, 0x85, 0x1E, 0x86, 0x1E, 0x87, 0x1E, 0x88, 0x1E, 0x89, 0x1E, 0x8A, 0x1E, 0x8B, 0x1E, 0x8C, - 0x1E, 0x8D, 0x1E, 0x8E, 0x1E, 0x8F, 0x1E, 0x90, 0x1E, 0x91, 0x1E, 0x92, 0x1E, 0x93, 0x1E, 0x94, - 0x1E, 0x95, 0x1E, 0x96, 0x1E, 0x97, 0x1E, 0x98, 0x1E, 0x99, 0x1E, 0x9B, 0x1E, 0xA0, 0x1E, 0xA1, - 0x1E, 0xA2, 0x1E, 0xA3, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, - 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, - 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xB8, 0x1E, 0xB9, - 0x1E, 0xBA, 0x1E, 0xBB, 0x1E, 0xBC, 0x1E, 0xBD, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, - 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xC8, 0x1E, 0xC9, - 0x1E, 0xCA, 0x1E, 0xCB, 0x1E, 0xCC, 0x1E, 0xCD, 0x1E, 0xCE, 0x1E, 0xCF, 0x1E, 0xD0, 0x1E, 0xD1, - 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, - 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, - 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE4, 0x1E, 0xE5, 0x1E, 0xE6, 0x1E, 0xE7, 0x1E, 0xE8, 0x1E, 0xE9, - 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, - 0x1E, 0xF2, 0x1E, 0xF3, 0x1E, 0xF4, 0x1E, 0xF5, 0x1E, 0xF6, 0x1E, 0xF7, 0x1E, 0xF8, 0x1E, 0xF9, - 0x00, 0x01, 0x05, 0xBA, 0x00, 0xAC, 0x01, 0x5E, 0x01, 0x64, 0x01, 0x6A, 0x01, 0x70, 0x01, 0x76, - 0x01, 0x7C, 0x01, 0x82, 0x01, 0x88, 0x01, 0x8E, 0x01, 0x94, 0x01, 0x9A, 0x01, 0xA0, 0x01, 0xA6, - 0x01, 0xAC, 0x01, 0xB2, 0x01, 0xB8, 0x01, 0xBE, 0x01, 0xC4, 0x01, 0xCA, 0x01, 0xD0, 0x01, 0xD6, - 0x01, 0xDC, 0x01, 0xE2, 0x01, 0xE8, 0x01, 0xEE, 0x01, 0xF4, 0x01, 0xFA, 0x02, 0x00, 0x02, 0x06, - 0x02, 0x0C, 0x02, 0x12, 0x02, 0x18, 0x02, 0x1E, 0x02, 0x24, 0x02, 0x2A, 0x02, 0x30, 0x02, 0x38, - 0x02, 0x40, 0x02, 0x46, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x62, 0x02, 0x68, 0x02, 0x70, - 0x02, 0x78, 0x02, 0x80, 0x02, 0x88, 0x02, 0x8E, 0x02, 0x94, 0x02, 0x9A, 0x02, 0xA0, 0x02, 0xA6, - 0x02, 0xAC, 0x02, 0xB2, 0x02, 0xB8, 0x02, 0xBE, 0x02, 0xC4, 0x02, 0xCA, 0x02, 0xD0, 0x02, 0xD6, - 0x02, 0xDE, 0x02, 0xE6, 0x02, 0xEE, 0x02, 0xF6, 0x02, 0xFE, 0x03, 0x06, 0x03, 0x0C, 0x03, 0x12, - 0x03, 0x18, 0x03, 0x1E, 0x03, 0x24, 0x03, 0x2A, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3C, 0x03, 0x42, - 0x03, 0x48, 0x03, 0x4E, 0x03, 0x54, 0x03, 0x5A, 0x03, 0x62, 0x03, 0x6A, 0x03, 0x70, 0x03, 0x76, - 0x03, 0x7C, 0x03, 0x82, 0x03, 0x8A, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9E, 0x03, 0xA4, 0x03, 0xAA, - 0x03, 0xB0, 0x03, 0xB6, 0x03, 0xBE, 0x03, 0xC6, 0x03, 0xCE, 0x03, 0xD6, 0x03, 0xDE, 0x03, 0xE6, - 0x03, 0xEC, 0x03, 0xF2, 0x03, 0xF8, 0x03, 0xFE, 0x04, 0x06, 0x04, 0x0E, 0x04, 0x14, 0x04, 0x1A, - 0x04, 0x20, 0x04, 0x26, 0x04, 0x2C, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3E, 0x04, 0x46, 0x04, 0x4E, - 0x04, 0x56, 0x04, 0x5E, 0x04, 0x64, 0x04, 0x6A, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7C, 0x04, 0x82, - 0x04, 0x8A, 0x04, 0x92, 0x04, 0x9A, 0x04, 0xA2, 0x04, 0xA8, 0x04, 0xAE, 0x04, 0xB4, 0x04, 0xBA, - 0x04, 0xC0, 0x04, 0xC6, 0x04, 0xCE, 0x04, 0xD6, 0x04, 0xDE, 0x04, 0xE6, 0x04, 0xEC, 0x04, 0xF2, - 0x04, 0xF8, 0x04, 0xFE, 0x05, 0x04, 0x05, 0x0A, 0x05, 0x12, 0x05, 0x1A, 0x05, 0x22, 0x05, 0x2A, - 0x05, 0x30, 0x05, 0x36, 0x05, 0x3C, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4E, 0x05, 0x54, 0x05, 0x5A, - 0x05, 0x60, 0x05, 0x66, 0x05, 0x6C, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7E, 0x05, 0x84, 0x05, 0x8A, - 0x05, 0x90, 0x05, 0x96, 0x05, 0x9C, 0x05, 0xA2, 0x05, 0xA8, 0x05, 0xAE, 0x05, 0xB4, 0x00, 0x02, - 0x00, 0x41, 0x03, 0x40, 0x00, 0x02, 0x00, 0x41, 0x03, 0x41, 0x00, 0x02, 0x00, 0x45, 0x03, 0x40, - 0x00, 0x02, 0x00, 0x45, 0x03, 0x41, 0x00, 0x02, 0x00, 0x49, 0x03, 0x40, 0x00, 0x02, 0x00, 0x49, - 0x03, 0x41, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x4F, 0x03, 0x41, 0x00, 0x02, - 0x00, 0x55, 0x03, 0x40, 0x00, 0x02, 0x00, 0x55, 0x03, 0x41, 0x00, 0x02, 0x00, 0x59, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x61, 0x03, 0x40, 0x00, 0x02, 0x00, 0x61, 0x03, 0x41, 0x00, 0x02, 0x00, 0x65, - 0x03, 0x40, 0x00, 0x02, 0x00, 0x65, 0x03, 0x41, 0x00, 0x02, 0x00, 0x69, 0x03, 0x40, 0x00, 0x02, - 0x00, 0x69, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6F, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x75, 0x03, 0x40, 0x00, 0x02, 0x00, 0x75, 0x03, 0x41, 0x00, 0x02, 0x00, 0x79, - 0x03, 0x41, 0x00, 0x02, 0x00, 0x43, 0x03, 0x41, 0x00, 0x02, 0x00, 0x63, 0x03, 0x41, 0x00, 0x02, - 0x21, 0x2A, 0x03, 0x27, 0x00, 0x02, 0x00, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6C, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x4E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6E, 0x03, 0x41, 0x00, 0x02, 0x00, 0x52, - 0x03, 0x41, 0x00, 0x02, 0x00, 0x72, 0x03, 0x41, 0x00, 0x02, 0x00, 0x53, 0x03, 0x41, 0x00, 0x02, - 0x00, 0x73, 0x03, 0x41, 0x00, 0x02, 0x00, 0x5A, 0x03, 0x41, 0x00, 0x02, 0x00, 0x7A, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x04, - 0x00, 0x02, 0x00, 0xDC, 0x03, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, - 0x03, 0x08, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x0C, 0x00, 0x02, 0x00, 0xDC, - 0x03, 0x40, 0x00, 0x02, 0x00, 0xFC, 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x08, 0x03, 0x04, - 0x00, 0x03, 0x00, 0x61, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x41, 0x03, 0x07, 0x03, 0x04, - 0x00, 0x03, 0x00, 0x61, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x0C, 0x00, 0x02, - 0x01, 0xEA, 0x03, 0x04, 0x00, 0x02, 0x01, 0xEB, 0x03, 0x04, 0x00, 0x02, 0x00, 0x47, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x67, 0x03, 0x41, 0x00, 0x02, 0x00, 0x4E, 0x03, 0x40, 0x00, 0x02, 0x00, 0x6E, - 0x03, 0x40, 0x00, 0x02, 0x00, 0xC5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE5, 0x03, 0x41, 0x00, 0x02, - 0x00, 0xC6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE6, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD8, 0x03, 0x41, - 0x00, 0x02, 0x00, 0xF8, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, - 0x00, 0x6F, 0x03, 0x08, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, - 0x00, 0x6F, 0x03, 0x03, 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x03, - 0x00, 0x6F, 0x03, 0x07, 0x03, 0x04, 0x00, 0x02, 0x00, 0xC7, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE7, - 0x03, 0x41, 0x00, 0x02, 0x01, 0x12, 0x03, 0x40, 0x00, 0x02, 0x01, 0x13, 0x03, 0x40, 0x00, 0x02, - 0x01, 0x12, 0x03, 0x41, 0x00, 0x02, 0x01, 0x13, 0x03, 0x41, 0x00, 0x02, 0x02, 0x28, 0x03, 0x06, - 0x00, 0x02, 0x02, 0x29, 0x03, 0x06, 0x00, 0x02, 0x00, 0xCF, 0x03, 0x01, 0x00, 0x02, 0x00, 0xEF, - 0x03, 0x01, 0x00, 0x02, 0x00, 0x4B, 0x03, 0x41, 0x00, 0x02, 0x00, 0x6B, 0x03, 0x41, 0x00, 0x02, - 0x21, 0x2A, 0x03, 0x23, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x31, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x04, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x04, 0x03, 0x23, 0x00, 0x02, 0x00, 0x4D, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x6D, 0x03, 0x41, 0x00, 0x02, 0x00, 0xD5, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF5, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x08, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, - 0x03, 0x08, 0x00, 0x02, 0x01, 0x4C, 0x03, 0x40, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x40, 0x00, 0x02, - 0x01, 0x4C, 0x03, 0x41, 0x00, 0x02, 0x01, 0x4D, 0x03, 0x41, 0x00, 0x02, 0x00, 0x50, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x70, 0x03, 0x41, 0x00, 0x03, 0x00, 0x52, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, - 0x00, 0x72, 0x03, 0x04, 0x03, 0x23, 0x00, 0x03, 0x00, 0x53, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, - 0x00, 0x73, 0x03, 0x01, 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x03, - 0x00, 0x73, 0x03, 0x0C, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x62, 0x03, 0x07, 0x00, 0x02, 0x1E, 0x63, - 0x03, 0x07, 0x00, 0x02, 0x01, 0x68, 0x03, 0x41, 0x00, 0x02, 0x01, 0x69, 0x03, 0x41, 0x00, 0x03, - 0x00, 0x55, 0x03, 0x04, 0x03, 0x08, 0x00, 0x03, 0x00, 0x75, 0x03, 0x04, 0x03, 0x08, 0x00, 0x02, - 0x00, 0x57, 0x03, 0x40, 0x00, 0x02, 0x00, 0x77, 0x03, 0x40, 0x00, 0x02, 0x00, 0x57, 0x03, 0x41, - 0x00, 0x02, 0x00, 0x77, 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x41, 0x00, 0x02, 0x00, 0xE2, - 0x03, 0x41, 0x00, 0x02, 0x00, 0xC2, 0x03, 0x40, 0x00, 0x02, 0x00, 0xE2, 0x03, 0x40, 0x00, 0x03, - 0x00, 0x41, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, - 0x00, 0x41, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, - 0x1E, 0xA0, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x02, 0x00, 0x02, 0x01, 0x02, 0x03, 0x41, - 0x00, 0x02, 0x01, 0x03, 0x03, 0x41, 0x00, 0x02, 0x01, 0x02, 0x03, 0x40, 0x00, 0x02, 0x01, 0x03, - 0x03, 0x40, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x09, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, - 0x03, 0x09, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x03, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, - 0x03, 0x03, 0x00, 0x02, 0x1E, 0xA0, 0x03, 0x06, 0x00, 0x02, 0x1E, 0xA1, 0x03, 0x06, 0x00, 0x02, - 0x00, 0xCA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEA, 0x03, 0x41, 0x00, 0x02, 0x00, 0xCA, 0x03, 0x40, - 0x00, 0x02, 0x00, 0xEA, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, - 0x00, 0x65, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x03, 0x00, 0x03, - 0x00, 0x65, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xB8, 0x03, 0x02, 0x00, 0x02, 0x1E, 0xB9, - 0x03, 0x02, 0x00, 0x02, 0x00, 0xD4, 0x03, 0x41, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x41, 0x00, 0x02, - 0x00, 0xD4, 0x03, 0x40, 0x00, 0x02, 0x00, 0xF4, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, - 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x09, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, - 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x02, - 0x00, 0x02, 0x1E, 0xCD, 0x03, 0x02, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x01, 0x00, 0x02, 0x01, 0xA1, - 0x03, 0x01, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x00, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x00, 0x00, 0x02, - 0x1E, 0xCE, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCF, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x03, - 0x00, 0x02, 0x01, 0xA1, 0x03, 0x03, 0x00, 0x02, 0x1E, 0xCC, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xCD, - 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x01, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x01, 0x00, 0x02, - 0x01, 0xAF, 0x03, 0x00, 0x00, 0x02, 0x01, 0xB0, 0x03, 0x00, 0x00, 0x02, 0x1E, 0xE6, 0x03, 0x1B, - 0x00, 0x02, 0x1E, 0xE7, 0x03, 0x1B, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x03, 0x00, 0x02, 0x01, 0xB0, - 0x03, 0x03, 0x00, 0x02, 0x1E, 0xE4, 0x03, 0x1B, 0x00, 0x02, 0x1E, 0xE5, 0x03, 0x1B, 0x00, 0x02, - 0x00, 0x59, 0x03, 0x40, 0x00, 0x02, 0x00, 0x79, 0x03, 0x40, 0x00, 0x01, 0x00, 0xAC, 0x00, 0xC0, - 0x00, 0xC1, 0x00, 0xC8, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xD2, 0x00, 0xD3, 0x00, 0xD9, - 0x00, 0xDA, 0x00, 0xDD, 0x00, 0xE0, 0x00, 0xE1, 0x00, 0xE8, 0x00, 0xE9, 0x00, 0xEC, 0x00, 0xED, - 0x00, 0xF2, 0x00, 0xF3, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFD, 0x01, 0x06, 0x01, 0x07, 0x01, 0x36, - 0x01, 0x39, 0x01, 0x3A, 0x01, 0x43, 0x01, 0x44, 0x01, 0x54, 0x01, 0x55, 0x01, 0x5A, 0x01, 0x5B, - 0x01, 0x79, 0x01, 0x7A, 0x01, 0xD5, 0x01, 0xD6, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xD9, 0x01, 0xDA, - 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xDE, 0x01, 0xDF, 0x01, 0xE0, 0x01, 0xE1, 0x01, 0xE8, 0x01, 0xEC, - 0x01, 0xED, 0x01, 0xF4, 0x01, 0xF5, 0x01, 0xF8, 0x01, 0xF9, 0x01, 0xFA, 0x01, 0xFB, 0x01, 0xFC, - 0x01, 0xFD, 0x01, 0xFE, 0x01, 0xFF, 0x02, 0x2A, 0x02, 0x2B, 0x02, 0x2C, 0x02, 0x2D, 0x02, 0x30, - 0x02, 0x31, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, 0x1E, 0x1C, - 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x31, 0x1E, 0x32, 0x1E, 0x34, 0x1E, 0x38, - 0x1E, 0x39, 0x1E, 0x3E, 0x1E, 0x3F, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x4E, 0x1E, 0x4F, 0x1E, 0x50, - 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x54, 0x1E, 0x55, 0x1E, 0x5C, 0x1E, 0x5D, 0x1E, 0x64, - 0x1E, 0x65, 0x1E, 0x66, 0x1E, 0x67, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0x7A, - 0x1E, 0x7B, 0x1E, 0x80, 0x1E, 0x81, 0x1E, 0x82, 0x1E, 0x83, 0x1E, 0xA4, 0x1E, 0xA5, 0x1E, 0xA6, - 0x1E, 0xA7, 0x1E, 0xA8, 0x1E, 0xA9, 0x1E, 0xAA, 0x1E, 0xAB, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, - 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, 0x1E, 0xB2, 0x1E, 0xB3, 0x1E, 0xB4, 0x1E, 0xB5, 0x1E, 0xB6, - 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC2, 0x1E, 0xC3, 0x1E, 0xC4, - 0x1E, 0xC5, 0x1E, 0xC6, 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD4, - 0x1E, 0xD5, 0x1E, 0xD6, 0x1E, 0xD7, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, - 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, 0x1E, 0xE8, - 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, 0x1E, 0xF0, - 0x1E, 0xF1, 0x1E, 0xF2, 0x1E, 0xF3, 0x00, 0x01, 0x02, 0xFC, 0x00, 0x4F, 0x00, 0xA4, 0x00, 0xAA, - 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xD0, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE4, - 0x00, 0xEA, 0x00, 0xF2, 0x00, 0xFA, 0x01, 0x02, 0x01, 0x0A, 0x01, 0x12, 0x01, 0x1A, 0x01, 0x20, - 0x01, 0x26, 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, - 0x01, 0x64, 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, - 0x01, 0xA4, 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, - 0x01, 0xE4, 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, - 0x02, 0x24, 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, - 0x02, 0x64, 0x02, 0x6C, 0x02, 0x72, 0x02, 0x78, 0x02, 0x7E, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, - 0x02, 0x9C, 0x02, 0xA4, 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBA, 0x02, 0xC0, 0x02, 0xC6, 0x02, 0xCC, - 0x02, 0xD4, 0x02, 0xDC, 0x02, 0xE4, 0x02, 0xEC, 0x02, 0xF4, 0x00, 0x02, 0x00, 0xDC, 0x03, 0x41, - 0x00, 0x02, 0x00, 0xFC, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, - 0x00, 0x75, 0x03, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x03, - 0x00, 0x6F, 0x03, 0x04, 0x03, 0x28, 0x00, 0x02, 0x21, 0x2B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, - 0x03, 0x0A, 0x03, 0x01, 0x00, 0x02, 0x01, 0x06, 0x03, 0x27, 0x00, 0x02, 0x01, 0x07, 0x03, 0x27, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x00, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x01, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x06, 0x03, 0x27, 0x00, 0x03, 0x00, 0x65, 0x03, 0x06, 0x03, 0x27, - 0x00, 0x02, 0x00, 0xCF, 0x03, 0x41, 0x00, 0x02, 0x00, 0xEF, 0x03, 0x41, 0x00, 0x02, 0x21, 0x2A, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x4C, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6C, 0x03, 0x23, - 0x03, 0x04, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x52, 0x03, 0x23, 0x03, 0x04, 0x00, 0x03, 0x00, 0x72, 0x03, 0x23, - 0x03, 0x04, 0x00, 0x03, 0x00, 0x53, 0x03, 0x41, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x41, - 0x03, 0x07, 0x00, 0x03, 0x00, 0x53, 0x03, 0x07, 0x03, 0x23, 0x00, 0x03, 0x00, 0x73, 0x03, 0x07, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x01, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x00, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x23, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, - 0x03, 0x23, 0x00, 0x02, 0x01, 0xA0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x41, 0x00, 0x02, - 0x01, 0xA0, 0x03, 0x40, 0x00, 0x02, 0x01, 0xA1, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x09, - 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, - 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, - 0x03, 0x23, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x41, - 0x00, 0x02, 0x01, 0xB0, 0x03, 0x41, 0x00, 0x02, 0x01, 0xAF, 0x03, 0x40, 0x00, 0x02, 0x01, 0xB0, - 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x09, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x09, - 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, - 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x23, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, - 0x03, 0x23, 0x00, 0x01, 0x00, 0x4F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, - 0x01, 0xED, 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, - 0x1E, 0x17, 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x38, 0x1E, 0x39, - 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x5C, 0x1E, 0x5D, - 0x1E, 0x64, 0x1E, 0x65, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, 0x1E, 0xA5, - 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, 0x1E, 0xB1, - 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, 0x1E, 0xC7, - 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, 0x1E, 0xDB, - 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, 0x1E, 0xE3, - 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, 0x1E, 0xEF, - 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x02, 0xDC, 0x00, 0x49, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA8, - 0x00, 0xB0, 0x00, 0xB8, 0x00, 0xC0, 0x00, 0xC8, 0x00, 0xCE, 0x00, 0xD6, 0x00, 0xDE, 0x00, 0xE6, - 0x00, 0xEE, 0x00, 0xF6, 0x00, 0xFE, 0x01, 0x06, 0x01, 0x0E, 0x01, 0x16, 0x01, 0x1E, 0x01, 0x26, - 0x01, 0x2C, 0x01, 0x34, 0x01, 0x3C, 0x01, 0x44, 0x01, 0x4C, 0x01, 0x54, 0x01, 0x5C, 0x01, 0x64, - 0x01, 0x6C, 0x01, 0x74, 0x01, 0x7C, 0x01, 0x84, 0x01, 0x8C, 0x01, 0x94, 0x01, 0x9C, 0x01, 0xA4, - 0x01, 0xAC, 0x01, 0xB4, 0x01, 0xBC, 0x01, 0xC4, 0x01, 0xCC, 0x01, 0xD4, 0x01, 0xDC, 0x01, 0xE4, - 0x01, 0xEC, 0x01, 0xF4, 0x01, 0xFC, 0x02, 0x04, 0x02, 0x0C, 0x02, 0x14, 0x02, 0x1C, 0x02, 0x24, - 0x02, 0x2C, 0x02, 0x34, 0x02, 0x3C, 0x02, 0x44, 0x02, 0x4C, 0x02, 0x54, 0x02, 0x5C, 0x02, 0x64, - 0x02, 0x6C, 0x02, 0x74, 0x02, 0x7C, 0x02, 0x84, 0x02, 0x8C, 0x02, 0x94, 0x02, 0x9C, 0x02, 0xA4, - 0x02, 0xAC, 0x02, 0xB4, 0x02, 0xBC, 0x02, 0xC4, 0x02, 0xCC, 0x02, 0xD4, 0x00, 0x03, 0x00, 0x55, - 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, - 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x40, 0x00, 0x03, 0x00, 0x4F, - 0x03, 0x28, 0x03, 0x04, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x28, 0x03, 0x04, 0x00, 0x02, 0x21, 0x2B, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x01, - 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x01, 0x03, 0x27, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, - 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x45, 0x03, 0x04, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x45, 0x03, 0x27, - 0x03, 0x06, 0x00, 0x03, 0x00, 0x65, 0x03, 0x27, 0x03, 0x06, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, 0x03, 0x01, 0x00, 0x02, 0x21, 0x2A, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x03, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x04, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x04, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x53, 0x03, 0x23, 0x03, 0x07, 0x00, 0x03, 0x00, 0x73, 0x03, 0x23, 0x03, 0x07, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x03, 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x03, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x02, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x02, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x41, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x06, 0x03, 0x40, 0x00, 0x03, 0x00, 0x61, 0x03, 0x06, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x23, 0x03, 0x06, 0x00, 0x03, 0x00, 0x61, 0x03, 0x23, 0x03, 0x06, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x65, 0x03, 0x02, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x45, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x65, 0x03, 0x23, 0x03, 0x02, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x41, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x02, 0x03, 0x40, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x02, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x02, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x02, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x01, 0x03, 0x1B, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x00, 0x03, 0x1B, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x09, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x03, - 0x00, 0x03, 0x00, 0x4F, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x23, 0x03, 0x1B, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x01, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x01, 0x03, 0x1B, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x00, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x00, 0x03, 0x1B, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x09, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x09, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x03, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x03, - 0x00, 0x03, 0x00, 0x55, 0x03, 0x23, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x23, 0x03, 0x1B, - 0x00, 0x01, 0x00, 0x49, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xDB, 0x01, 0xDC, 0x01, 0xEC, 0x01, 0xED, - 0x01, 0xFA, 0x01, 0xFB, 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0x14, 0x1E, 0x15, 0x1E, 0x16, 0x1E, 0x17, - 0x1E, 0x1C, 0x1E, 0x1D, 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0x30, 0x1E, 0x4C, 0x1E, 0x4D, 0x1E, 0x50, - 0x1E, 0x51, 0x1E, 0x52, 0x1E, 0x53, 0x1E, 0x68, 0x1E, 0x69, 0x1E, 0x78, 0x1E, 0x79, 0x1E, 0xA4, - 0x1E, 0xA5, 0x1E, 0xA6, 0x1E, 0xA7, 0x1E, 0xAC, 0x1E, 0xAD, 0x1E, 0xAE, 0x1E, 0xAF, 0x1E, 0xB0, - 0x1E, 0xB1, 0x1E, 0xB6, 0x1E, 0xB7, 0x1E, 0xBE, 0x1E, 0xBF, 0x1E, 0xC0, 0x1E, 0xC1, 0x1E, 0xC6, - 0x1E, 0xC7, 0x1E, 0xD0, 0x1E, 0xD1, 0x1E, 0xD2, 0x1E, 0xD3, 0x1E, 0xD8, 0x1E, 0xD9, 0x1E, 0xDA, - 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xDE, 0x1E, 0xDF, 0x1E, 0xE0, 0x1E, 0xE1, 0x1E, 0xE2, - 0x1E, 0xE3, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, 0x1E, 0xEB, 0x1E, 0xEC, 0x1E, 0xED, 0x1E, 0xEE, - 0x1E, 0xEF, 0x1E, 0xF0, 0x1E, 0xF1, 0x00, 0x01, 0x00, 0x9C, 0x00, 0x0F, 0x00, 0x24, 0x00, 0x2C, - 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, - 0x00, 0x74, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0x03, 0x00, 0x55, 0x03, 0x08, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x75, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x01, 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x49, 0x03, 0x08, 0x03, 0x41, 0x00, 0x03, 0x00, 0x69, 0x03, 0x08, - 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, - 0x03, 0x00, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x01, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, - 0x03, 0x01, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x00, 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, - 0x03, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x01, 0xD7, 0x01, 0xD8, 0x01, 0xFA, 0x1E, 0x08, 0x1E, 0x09, - 0x1E, 0x2E, 0x1E, 0x2F, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, - 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x74, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x2C, - 0x00, 0x34, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x5C, 0x00, 0x64, 0x00, 0x6C, - 0x00, 0x03, 0x00, 0x41, 0x03, 0x0A, 0x03, 0x41, 0x00, 0x03, 0x00, 0x43, 0x03, 0x27, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x63, 0x03, 0x27, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x4F, 0x03, 0x1B, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x6F, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x41, - 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x41, 0x00, 0x03, 0x00, 0x55, 0x03, 0x1B, 0x03, 0x40, - 0x00, 0x03, 0x00, 0x75, 0x03, 0x1B, 0x03, 0x40, 0x00, 0x01, 0x00, 0x0B, 0x01, 0xFA, 0x1E, 0x08, - 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, 0x1E, 0xEA, - 0x1E, 0xEB, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x32, - 0x00, 0x3A, 0x00, 0x42, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x5A, 0x00, 0x62, 0x00, 0x03, 0x00, 0x43, - 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x63, 0x03, 0x41, 0x03, 0x27, 0x00, 0x03, 0x00, 0x4F, - 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x4F, - 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x6F, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, - 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x41, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x55, - 0x03, 0x40, 0x03, 0x1B, 0x00, 0x03, 0x00, 0x75, 0x03, 0x40, 0x03, 0x1B, 0x00, 0x01, 0x00, 0x0A, - 0x1E, 0x08, 0x1E, 0x09, 0x1E, 0xDA, 0x1E, 0xDB, 0x1E, 0xDC, 0x1E, 0xDD, 0x1E, 0xE8, 0x1E, 0xE9, - 0x1E, 0xEA, 0x1E, 0xEB, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, - 0x00, 0x02, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x0D, 0x4A, 0x00, 0x02, - 0x0D, 0x3E, 0x0D, 0x4C, 0x00, 0x02, 0x0D, 0x57, 0x00, 0x01, 0x00, 0x04, 0x0D, 0x4B, 0x00, 0x02, - 0x0D, 0x3E, 0x00, 0x01, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, - 0x0D, 0x46, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x47, 0x0D, 0x3E, 0x00, 0x02, 0x0D, 0x46, 0x0D, 0x57, - 0x00, 0x01, 0x00, 0x03, 0x0D, 0x4A, 0x0D, 0x4B, 0x0D, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x10, 0x26, - 0x00, 0x02, 0x10, 0x2E, 0x00, 0x01, 0x00, 0x01, 0x10, 0x25, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x10, 0x25, 0x10, 0x2E, - 0x00, 0x01, 0x00, 0x01, 0x10, 0x26, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x22, 0x00, 0x01, 0x00, 0x08, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x14, 0x0B, 0x4B, - 0x00, 0x02, 0x0B, 0x3E, 0x0B, 0x48, 0x00, 0x02, 0x0B, 0x56, 0x0B, 0x4C, 0x00, 0x02, 0x0B, 0x57, - 0x00, 0x01, 0x00, 0x01, 0x0B, 0x47, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x1E, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x18, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x56, - 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x3E, 0x00, 0x02, 0x0B, 0x47, 0x0B, 0x57, 0x00, 0x01, 0x00, 0x03, - 0x0B, 0x48, 0x0B, 0x4B, 0x0B, 0x4C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x38, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x2E, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x10, 0x00, 0x18, - 0x00, 0x1E, 0x0D, 0xDA, 0x00, 0x02, 0x0D, 0xCA, 0x0D, 0xDD, 0x00, 0x03, 0x0D, 0xCF, 0x0D, 0xCA, - 0x0D, 0xDC, 0x00, 0x02, 0x0D, 0xCF, 0x0D, 0xDE, 0x00, 0x02, 0x0D, 0xDF, 0x00, 0x01, 0x00, 0x04, - 0x0D, 0xDD, 0x00, 0x02, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDC, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x01, 0x00, 0x26, 0x00, 0x04, 0x00, 0x0E, - 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, - 0x0D, 0xCF, 0x00, 0x02, 0x0D, 0xDC, 0x0D, 0xCA, 0x00, 0x02, 0x0D, 0xD9, 0x0D, 0xDF, 0x00, 0x01, - 0x00, 0x04, 0x0D, 0xDA, 0x0D, 0xDC, 0x0D, 0xDD, 0x0D, 0xDE, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x03, 0x0D, 0xD9, 0x0D, 0xCF, 0x0D, 0xCA, 0x00, 0x01, 0x00, 0x01, 0x0D, 0xDD, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, 0x00, 0x03, 0x00, 0x0C, - 0x00, 0x16, 0x00, 0x28, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x00, 0x02, 0x0B, 0xD7, 0x00, 0x02, - 0x00, 0x06, 0x00, 0x0C, 0x0B, 0xCA, 0x00, 0x02, 0x0B, 0xBE, 0x0B, 0xCC, 0x00, 0x02, 0x0B, 0xD7, - 0x00, 0x01, 0x00, 0x04, 0x0B, 0xCB, 0x00, 0x02, 0x0B, 0xBE, 0x00, 0x01, 0x00, 0x03, 0x0B, 0x92, - 0x0B, 0xC6, 0x0B, 0xC7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x26, - 0x00, 0x04, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x02, 0x0B, 0x92, 0x0B, 0xD7, - 0x00, 0x02, 0x0B, 0xC6, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC7, 0x0B, 0xBE, 0x00, 0x02, 0x0B, 0xC6, - 0x0B, 0xD7, 0x00, 0x01, 0x00, 0x04, 0x0B, 0x94, 0x0B, 0xCA, 0x0B, 0xCB, 0x0B, 0xCC, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x04, 0x0C, 0x48, 0x00, 0x02, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x46, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, - 0x0C, 0x46, 0x0C, 0x56, 0x00, 0x01, 0x00, 0x01, 0x0C, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x01, 0x00, 0x8A, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3A, - 0x00, 0x44, 0x00, 0x4E, 0x00, 0x58, 0x00, 0x62, 0x00, 0x6C, 0x00, 0x76, 0x00, 0x80, 0x00, 0x01, - 0x00, 0x04, 0x1B, 0x06, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x08, 0x00, 0x02, - 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0A, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, - 0x1B, 0x0C, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x0E, 0x00, 0x02, 0x1B, 0x35, - 0x00, 0x01, 0x00, 0x04, 0x1B, 0x12, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3B, - 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x3D, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, - 0x00, 0x04, 0x1B, 0x40, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x41, 0x00, 0x02, - 0x1B, 0x35, 0x00, 0x01, 0x00, 0x04, 0x1B, 0x43, 0x00, 0x02, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, - 0x1B, 0x05, 0x1B, 0x07, 0x1B, 0x09, 0x1B, 0x0B, 0x1B, 0x0D, 0x1B, 0x11, 0x1B, 0x3A, 0x1B, 0x3C, - 0x1B, 0x3E, 0x1B, 0x3F, 0x1B, 0x42, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, - 0x00, 0x5E, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x34, 0x00, 0x3A, - 0x00, 0x40, 0x00, 0x46, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x58, 0x00, 0x02, 0x1B, 0x05, 0x1B, 0x35, - 0x00, 0x02, 0x1B, 0x07, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x09, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0B, - 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x0D, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x11, 0x1B, 0x35, 0x00, 0x02, - 0x1B, 0x3A, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3C, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x3E, 0x1B, 0x35, - 0x00, 0x02, 0x1B, 0x3F, 0x1B, 0x35, 0x00, 0x02, 0x1B, 0x42, 0x1B, 0x35, 0x00, 0x01, 0x00, 0x0B, - 0x1B, 0x06, 0x1B, 0x08, 0x1B, 0x0A, 0x1B, 0x0C, 0x1B, 0x0E, 0x1B, 0x12, 0x1B, 0x3B, 0x1B, 0x3D, - 0x1B, 0x40, 0x1B, 0x41, 0x1B, 0x43 -}; - -const le_uint8 CanonShaping::glyphDefinitionTable[] = { - 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x28, - 0x06, 0x0B, 0x06, 0x0F, 0x00, 0x01, 0x06, 0x10, 0x06, 0x15, 0x00, 0x03, 0x06, 0x1B, 0x06, 0x1B, - 0x00, 0x01, 0x06, 0x1E, 0x06, 0x1F, 0x00, 0x01, 0x06, 0x21, 0x06, 0x21, 0x00, 0x01, 0x06, 0x22, - 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x3A, 0x00, 0x01, 0x06, 0x40, 0x06, 0x4A, 0x00, 0x01, - 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x03, 0x06, 0x60, 0x06, 0x6F, 0x00, 0x01, 0x06, 0x70, 0x06, 0x70, - 0x00, 0x03, 0x06, 0x71, 0x06, 0xBF, 0x00, 0x01, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x02, 0x06, 0xC1, - 0x06, 0xC1, 0x00, 0x01, 0x06, 0xC2, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, 0x06, 0xD2, 0x00, 0x01, - 0x06, 0xD3, 0x06, 0xD3, 0x00, 0x02, 0x06, 0xD4, 0x06, 0xD5, 0x00, 0x01, 0x06, 0xD6, 0x06, 0xDC, - 0x00, 0x03, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x03, 0x06, 0xE5, 0x06, 0xE6, 0x00, 0x01, 0x06, 0xE7, - 0x06, 0xE8, 0x00, 0x03, 0x06, 0xE9, 0x06, 0xE9, 0x00, 0x01, 0x06, 0xEA, 0x06, 0xED, 0x00, 0x03, - 0x06, 0xEE, 0x06, 0xFF, 0x00, 0x01, 0x07, 0x50, 0x07, 0x6D, 0x00, 0x01, 0xFB, 0x50, 0xFB, 0xB1, - 0x00, 0x01, 0xFB, 0xD3, 0xFB, 0xDC, 0x00, 0x01, 0xFB, 0xDD, 0xFB, 0xDD, 0x00, 0x02, 0xFB, 0xDE, - 0xFB, 0xE9, 0x00, 0x01, 0xFB, 0xEA, 0xFB, 0xFB, 0x00, 0x02, 0xFB, 0xFC, 0xFB, 0xFF, 0x00, 0x01, - 0xFC, 0x00, 0xFC, 0x5D, 0x00, 0x02, 0xFC, 0x64, 0xFC, 0xF1, 0x00, 0x02, 0xFC, 0xF5, 0xFD, 0x3D, - 0x00, 0x02, 0xFD, 0x50, 0xFD, 0x8F, 0x00, 0x02, 0xFD, 0x92, 0xFD, 0xC7, 0x00, 0x02, 0xFD, 0xF0, - 0xFD, 0xFC, 0x00, 0x02, 0xFE, 0x80, 0xFE, 0xF4, 0x00, 0x01, 0xFE, 0xF5, 0xFE, 0xFC, 0x00, 0x02, - 0x00, 0x02, 0x00, 0xCE, 0x03, 0x00, 0x03, 0x14, 0x00, 0xE6, 0x03, 0x15, 0x03, 0x15, 0x00, 0xE8, - 0x03, 0x16, 0x03, 0x19, 0x00, 0xDC, 0x03, 0x1A, 0x03, 0x1A, 0x00, 0xE8, 0x03, 0x1B, 0x03, 0x1B, - 0x00, 0xD8, 0x03, 0x1C, 0x03, 0x20, 0x00, 0xDC, 0x03, 0x21, 0x03, 0x22, 0x00, 0xCA, 0x03, 0x23, - 0x03, 0x26, 0x00, 0xDC, 0x03, 0x27, 0x03, 0x28, 0x00, 0xCA, 0x03, 0x29, 0x03, 0x33, 0x00, 0xDC, - 0x03, 0x34, 0x03, 0x38, 0x00, 0x01, 0x03, 0x39, 0x03, 0x3C, 0x00, 0xDC, 0x03, 0x3D, 0x03, 0x44, - 0x00, 0xE6, 0x03, 0x45, 0x03, 0x45, 0x00, 0xF0, 0x03, 0x46, 0x03, 0x46, 0x00, 0xE6, 0x03, 0x47, - 0x03, 0x49, 0x00, 0xDC, 0x03, 0x4A, 0x03, 0x4C, 0x00, 0xE6, 0x03, 0x4D, 0x03, 0x4E, 0x00, 0xDC, - 0x03, 0x50, 0x03, 0x52, 0x00, 0xE6, 0x03, 0x53, 0x03, 0x56, 0x00, 0xDC, 0x03, 0x57, 0x03, 0x57, - 0x00, 0xE6, 0x03, 0x58, 0x03, 0x58, 0x00, 0xE8, 0x03, 0x59, 0x03, 0x5A, 0x00, 0xDC, 0x03, 0x5B, - 0x03, 0x5B, 0x00, 0xE6, 0x03, 0x5C, 0x03, 0x5C, 0x00, 0xE9, 0x03, 0x5D, 0x03, 0x5E, 0x00, 0xEA, - 0x03, 0x5F, 0x03, 0x5F, 0x00, 0xE9, 0x03, 0x60, 0x03, 0x61, 0x00, 0xEA, 0x03, 0x62, 0x03, 0x62, - 0x00, 0xE9, 0x03, 0x63, 0x03, 0x6F, 0x00, 0xE6, 0x04, 0x83, 0x04, 0x86, 0x00, 0xE6, 0x05, 0x91, - 0x05, 0x91, 0x00, 0xDC, 0x05, 0x92, 0x05, 0x95, 0x00, 0xE6, 0x05, 0x96, 0x05, 0x96, 0x00, 0xDC, - 0x05, 0x97, 0x05, 0x98, 0x00, 0xE6, 0x05, 0x99, 0x05, 0x99, 0x00, 0xE8, 0x05, 0x9A, 0x05, 0x9A, - 0x00, 0xDE, 0x05, 0x9B, 0x05, 0x9B, 0x00, 0xDC, 0x05, 0x9C, 0x05, 0xA1, 0x00, 0xE6, 0x05, 0xA2, - 0x05, 0xA7, 0x00, 0xDC, 0x05, 0xA8, 0x05, 0xA8, 0x00, 0xE6, 0x05, 0xA9, 0x05, 0xA9, 0x00, 0xE8, - 0x05, 0xAA, 0x05, 0xAA, 0x00, 0xDC, 0x05, 0xAB, 0x05, 0xAC, 0x00, 0xE6, 0x05, 0xAD, 0x05, 0xAD, - 0x00, 0xDE, 0x05, 0xAE, 0x05, 0xAE, 0x00, 0xE8, 0x05, 0xAF, 0x05, 0xAF, 0x00, 0xE6, 0x05, 0xB0, - 0x05, 0xB8, 0x00, 0xDC, 0x05, 0xB9, 0x05, 0xB9, 0x00, 0x1B, 0x05, 0xBA, 0x05, 0xBA, 0x00, 0x13, - 0x05, 0xBB, 0x05, 0xBB, 0x00, 0xDC, 0x05, 0xBC, 0x05, 0xBC, 0x00, 0x15, 0x05, 0xBD, 0x05, 0xBD, - 0x00, 0xDC, 0x05, 0xBF, 0x05, 0xBF, 0x00, 0x17, 0x05, 0xC1, 0x05, 0xC1, 0x00, 0x0A, 0x05, 0xC2, - 0x05, 0xC2, 0x00, 0x0B, 0x05, 0xC4, 0x05, 0xC4, 0x00, 0xE6, 0x05, 0xC5, 0x05, 0xC5, 0x00, 0xDC, - 0x05, 0xC7, 0x05, 0xC7, 0x00, 0x12, 0x06, 0x10, 0x06, 0x15, 0x00, 0xE6, 0x06, 0x4B, 0x06, 0x4C, - 0x00, 0x1F, 0x06, 0x4D, 0x06, 0x4D, 0x00, 0x1E, 0x06, 0x4E, 0x06, 0x4F, 0x00, 0x1F, 0x06, 0x50, - 0x06, 0x50, 0x00, 0x1E, 0x06, 0x51, 0x06, 0x51, 0x00, 0x1C, 0x06, 0x52, 0x06, 0x52, 0x00, 0x1F, - 0x06, 0x53, 0x06, 0x53, 0x00, 0x20, 0x06, 0x54, 0x06, 0x55, 0x00, 0x1B, 0x06, 0x56, 0x06, 0x56, - 0x00, 0x1D, 0x06, 0x57, 0x06, 0x58, 0x00, 0x1F, 0x06, 0x59, 0x06, 0x5B, 0x00, 0xE6, 0x06, 0x5C, - 0x06, 0x5C, 0x00, 0xDC, 0x06, 0x5D, 0x06, 0x5E, 0x00, 0xE6, 0x06, 0x70, 0x06, 0x70, 0x00, 0x1D, - 0x06, 0xD6, 0x06, 0xDC, 0x00, 0xE6, 0x06, 0xDF, 0x06, 0xE0, 0x00, 0xE6, 0x06, 0xE1, 0x06, 0xE1, - 0x00, 0x1F, 0x06, 0xE2, 0x06, 0xE2, 0x00, 0xE6, 0x06, 0xE3, 0x06, 0xE3, 0x00, 0xDC, 0x06, 0xE4, - 0x06, 0xE4, 0x00, 0xE6, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0xE6, 0x06, 0xEA, 0x06, 0xEA, 0x00, 0xDC, - 0x06, 0xEB, 0x06, 0xEC, 0x00, 0xE6, 0x06, 0xED, 0x06, 0xED, 0x00, 0xDC, 0x07, 0x11, 0x07, 0x11, - 0x00, 0x24, 0x07, 0x30, 0x07, 0x30, 0x00, 0xE6, 0x07, 0x31, 0x07, 0x31, 0x00, 0xDC, 0x07, 0x32, - 0x07, 0x33, 0x00, 0xE6, 0x07, 0x34, 0x07, 0x34, 0x00, 0xDC, 0x07, 0x35, 0x07, 0x36, 0x00, 0xE6, - 0x07, 0x37, 0x07, 0x39, 0x00, 0xDC, 0x07, 0x3A, 0x07, 0x3A, 0x00, 0xE6, 0x07, 0x3B, 0x07, 0x3C, - 0x00, 0xDC, 0x07, 0x3D, 0x07, 0x3D, 0x00, 0xE6, 0x07, 0x3E, 0x07, 0x3E, 0x00, 0xDC, 0x07, 0x3F, - 0x07, 0x41, 0x00, 0xE6, 0x07, 0x42, 0x07, 0x42, 0x00, 0xDC, 0x07, 0x43, 0x07, 0x43, 0x00, 0xE6, - 0x07, 0x44, 0x07, 0x44, 0x00, 0xDC, 0x07, 0x45, 0x07, 0x45, 0x00, 0xE6, 0x07, 0x46, 0x07, 0x46, - 0x00, 0xDC, 0x07, 0x47, 0x07, 0x47, 0x00, 0xE6, 0x07, 0x48, 0x07, 0x48, 0x00, 0xDC, 0x07, 0x49, - 0x07, 0x4A, 0x00, 0xE6, 0x07, 0xEB, 0x07, 0xF1, 0x00, 0xE6, 0x07, 0xF2, 0x07, 0xF2, 0x00, 0xDC, - 0x07, 0xF3, 0x07, 0xF3, 0x00, 0xE6, 0x09, 0x3C, 0x09, 0x3C, 0x00, 0x07, 0x09, 0x4D, 0x09, 0x4D, - 0x00, 0x09, 0x09, 0x51, 0x09, 0x51, 0x00, 0xE6, 0x09, 0x52, 0x09, 0x52, 0x00, 0xDC, 0x09, 0x53, - 0x09, 0x54, 0x00, 0xE6, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x07, 0x09, 0xCD, 0x09, 0xCD, 0x00, 0x09, - 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x07, 0x0A, 0x4D, 0x0A, 0x4D, 0x00, 0x09, 0x0A, 0xBC, 0x0A, 0xBC, - 0x00, 0x07, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x09, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x07, 0x0B, 0x4D, - 0x0B, 0x4D, 0x00, 0x09, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x09, 0x0C, 0x4D, 0x0C, 0x4D, 0x00, 0x09, - 0x0C, 0x55, 0x0C, 0x55, 0x00, 0x54, 0x0C, 0x56, 0x0C, 0x56, 0x00, 0x5B, 0x0C, 0xBC, 0x0C, 0xBC, - 0x00, 0x07, 0x0C, 0xCD, 0x0C, 0xCD, 0x00, 0x09, 0x0D, 0x4D, 0x0D, 0x4D, 0x00, 0x09, 0x0D, 0xCA, - 0x0D, 0xCA, 0x00, 0x09, 0x0E, 0x38, 0x0E, 0x39, 0x00, 0x67, 0x0E, 0x3A, 0x0E, 0x3A, 0x00, 0x09, - 0x0E, 0x48, 0x0E, 0x4B, 0x00, 0x6B, 0x0E, 0xB8, 0x0E, 0xB9, 0x00, 0x76, 0x0E, 0xC8, 0x0E, 0xCB, - 0x00, 0x7A, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0xDC, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0xDC, 0x0F, 0x37, - 0x0F, 0x37, 0x00, 0xDC, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0xD8, 0x0F, 0x71, 0x0F, 0x71, 0x00, 0x81, - 0x0F, 0x72, 0x0F, 0x72, 0x00, 0x82, 0x0F, 0x74, 0x0F, 0x74, 0x00, 0x84, 0x0F, 0x7A, 0x0F, 0x7D, - 0x00, 0x82, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x82, 0x0F, 0x82, 0x0F, 0x83, 0x00, 0xE6, 0x0F, 0x84, - 0x0F, 0x84, 0x00, 0x09, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0xE6, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0xDC, - 0x10, 0x37, 0x10, 0x37, 0x00, 0x07, 0x10, 0x39, 0x10, 0x39, 0x00, 0x09, 0x13, 0x5F, 0x13, 0x5F, - 0x00, 0xE6, 0x17, 0x14, 0x17, 0x14, 0x00, 0x09, 0x17, 0x34, 0x17, 0x34, 0x00, 0x09, 0x17, 0xD2, - 0x17, 0xD2, 0x00, 0x09, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0xE6, 0x18, 0xA9, 0x18, 0xA9, 0x00, 0xE4, - 0x19, 0x39, 0x19, 0x39, 0x00, 0xDE, 0x19, 0x3A, 0x19, 0x3A, 0x00, 0xE6, 0x19, 0x3B, 0x19, 0x3B, - 0x00, 0xDC, 0x1A, 0x17, 0x1A, 0x17, 0x00, 0xE6, 0x1A, 0x18, 0x1A, 0x18, 0x00, 0xDC, 0x1B, 0x34, - 0x1B, 0x34, 0x00, 0x07, 0x1B, 0x44, 0x1B, 0x44, 0x00, 0x09, 0x1B, 0x6B, 0x1B, 0x6B, 0x00, 0xE6, - 0x1B, 0x6C, 0x1B, 0x6C, 0x00, 0xDC, 0x1B, 0x6D, 0x1B, 0x73, 0x00, 0xE6, 0x1D, 0xC0, 0x1D, 0xC1, - 0x00, 0xE6, 0x1D, 0xC2, 0x1D, 0xC2, 0x00, 0xDC, 0x1D, 0xC3, 0x1D, 0xC9, 0x00, 0xE6, 0x1D, 0xCA, - 0x1D, 0xCA, 0x00, 0xDC, 0x1D, 0xFE, 0x1D, 0xFE, 0x00, 0xE6, 0x1D, 0xFF, 0x1D, 0xFF, 0x00, 0xDC, - 0x20, 0xD0, 0x20, 0xD1, 0x00, 0xE6, 0x20, 0xD2, 0x20, 0xD3, 0x00, 0x01, 0x20, 0xD4, 0x20, 0xD7, - 0x00, 0xE6, 0x20, 0xD8, 0x20, 0xDA, 0x00, 0x01, 0x20, 0xDB, 0x20, 0xDC, 0x00, 0xE6, 0x20, 0xE1, - 0x20, 0xE1, 0x00, 0xE6, 0x20, 0xE5, 0x20, 0xE6, 0x00, 0x01, 0x20, 0xE7, 0x20, 0xE7, 0x00, 0xE6, - 0x20, 0xE8, 0x20, 0xE8, 0x00, 0xDC, 0x20, 0xE9, 0x20, 0xE9, 0x00, 0xE6, 0x20, 0xEA, 0x20, 0xEB, - 0x00, 0x01, 0x20, 0xEC, 0x20, 0xEF, 0x00, 0xDC, 0x30, 0x2A, 0x30, 0x2A, 0x00, 0xDA, 0x30, 0x2B, - 0x30, 0x2B, 0x00, 0xE4, 0x30, 0x2C, 0x30, 0x2C, 0x00, 0xE8, 0x30, 0x2D, 0x30, 0x2D, 0x00, 0xDE, - 0x30, 0x2E, 0x30, 0x2F, 0x00, 0xE0, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x08, 0xA8, 0x06, 0xA8, 0x06, - 0x00, 0x09, 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x1A, 0xFE, 0x20, 0xFE, 0x23, 0x00, 0xE6, 0x0A, 0x0D, - 0x0A, 0x0D, 0x00, 0xDC, 0x0A, 0x0F, 0x0A, 0x0F, 0x00, 0xE6, 0x0A, 0x38, 0x0A, 0x38, 0x00, 0xE6, - 0x0A, 0x39, 0x0A, 0x39, 0x00, 0x01, 0x0A, 0x3A, 0x0A, 0x3A, 0x00, 0xDC, 0x0A, 0x3F, 0x0A, 0x3F, - 0x00, 0x09, 0xD1, 0x65, 0xD1, 0x66, 0x00, 0xD8, 0xD1, 0x67, 0xD1, 0x69, 0x00, 0x01, 0xD1, 0x6D, - 0xD1, 0x6D, 0x00, 0xE2, 0xD1, 0x6E, 0xD1, 0x72, 0x00, 0xD8, 0xD1, 0x7B, 0xD1, 0x82, 0x00, 0xDC, - 0xD1, 0x85, 0xD1, 0x89, 0x00, 0xE6, 0xD1, 0x8A, 0xD1, 0x8B, 0x00, 0xDC, 0xD1, 0xAA, 0xD1, 0xAD, - 0x00, 0xE6, 0xD2, 0x42, 0xD2, 0x44, 0x00, 0xE6 -}; - - -const size_t CanonShaping::glyphSubstitutionTableLen = sizeof(glyphSubstitutionTable)/sizeof(glyphSubstitutionTable[0]); - -const size_t CanonShaping::glyphDefinitionTableLen = sizeof(glyphDefinitionTable)/sizeof(glyphDefinitionTable[0]); - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/CanonShaping.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphStorage.h" -#include "CanonShaping.h" -#include "GlyphDefinitionTables.h" -#include "ClassDefinitionTables.h" - -U_NAMESPACE_BEGIN - -void CanonShaping::sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit) -{ - for (le_int32 j = index + 1; j < limit; j += 1) { - le_int32 i; - le_int32 v = indices[j]; - le_int32 c = combiningClasses[v]; - - for (i = j - 1; i >= index; i -= 1) { - if (c >= combiningClasses[indices[i]]) { - break; - } - - indices[i + 1] = indices[i]; - } - - indices[i + 1] = v; - } -} - -void CanonShaping::reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, - LEUnicode *outChars, LEGlyphStorage &glyphStorage) -{ - LEErrorCode success = LE_NO_ERROR; - LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(LETableReference::kStaticData, CanonShaping::glyphDefinitionTable, CanonShaping::glyphDefinitionTableLen); - LEReferenceTo<ClassDefinitionTable> classTable = gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success); - le_int32 *combiningClasses = LE_NEW_ARRAY(le_int32, charCount); - le_int32 *indices = LE_NEW_ARRAY(le_int32, charCount); - le_int32 i; - - if (combiningClasses == NULL || indices == NULL) { - if (combiningClasses != NULL) { - LE_DELETE_ARRAY(combiningClasses); - } - if (indices != NULL) { - LE_DELETE_ARRAY(indices); - } - return; - } - - for (i = 0; i < charCount; i += 1) { - combiningClasses[i] = classTable->getGlyphClass(classTable, (LEGlyphID) inChars[i], success); - indices[i] = i; - } - - for (i = 0; i < charCount; i += 1) { - if (combiningClasses[i] != 0) { - le_int32 mark; - - for (mark = i; mark < charCount; mark += 1) { - if (combiningClasses[mark] == 0) { - break; - } - } - - sortMarks(indices, combiningClasses, i, mark); - } - } - - le_int32 out = 0, dir = 1; - - if (rightToLeft) { - out = charCount - 1; - dir = -1; - } - - for (i = 0; i < charCount; i += 1, out += dir) { - le_int32 index = indices[i]; - - outChars[i] = inChars[index]; - glyphStorage.setCharIndex(out, index, success); - } - - LE_DELETE_ARRAY(indices); - LE_DELETE_ARRAY(combiningClasses); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/CanonShaping.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __CANONSHAPING_H -#define __CANONSHAPING_H - -#include "LETypes.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class U_LAYOUT_API CanonShaping /* not : public UObject because all members are static */ -{ -public: - static const le_uint8 glyphSubstitutionTable[]; - static const size_t glyphSubstitutionTableLen; - static const le_uint8 glyphDefinitionTable[]; - static const size_t glyphDefinitionTableLen; - - static void reorderMarks(const LEUnicode *inChars, le_int32 charCount, le_bool rightToLeft, - LEUnicode *outChars, LEGlyphStorage &glyphStorage); - -private: - static void sortMarks(le_int32 *indices, const le_int32 *combiningClasses, le_int32 index, le_int32 limit); -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/CharSubstitutionFilter.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __CHARSUBSTITUTIONFILTER_H -#define __CHARSUBSTITUTIONFILTER_H - -#include "LETypes.h" -#include "LEGlyphFilter.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; - -/** - * This filter is used by character-based GSUB processors. It - * accepts only those characters which the given font can display. - * - * Note: Implementation is in ArabicLayoutEngine.cpp - * - * @internal - */ -class CharSubstitutionFilter : public UMemory, public LEGlyphFilter -{ -private: - /** - * Holds the font which is used to test the characters. - * - * @internal - */ - const LEFontInstance *fFontInstance; - - /** - * The copy constructor. Not allowed! - * - * @internal - */ - CharSubstitutionFilter(const CharSubstitutionFilter &other); // forbid copying of this class - - /** - * The replacement operator. Not allowed! - * - * @internal - */ - CharSubstitutionFilter &operator=(const CharSubstitutionFilter &other); // forbid copying of this class - -public: - /** - * The constructor. - * - * @param fontInstance - the font to use to test the characters. - * - * @internal - */ - CharSubstitutionFilter(const LEFontInstance *fontInstance); - - /** - * The destructor. - * - * @internal - */ - ~CharSubstitutionFilter(); - - /** - * This method is used to test if a particular - * character can be displayed by the filter's - * font. - * - * @param glyph - the Unicode character code to be tested - * - * @return TRUE if the filter's font can display this character. - * - * @internal - */ - le_bool accept(LEGlyphID glyph, LEErrorCode &success) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ClassDefinitionTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "ClassDefinitionTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_int32 ClassDefinitionTable::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const -{ - LEReferenceTo<ClassDefinitionTable> thisRef(base, success); - if (LE_FAILURE(success)) return 0; - - switch(SWAPW(classFormat)) { - case 0: - return 0; - - case 1: - { - const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); - return f1Table->getGlyphClass(f1Table, glyphID, success); - } - - case 2: - { - const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); - return f2Table->getGlyphClass(f2Table, glyphID, success); - } - - default: - return 0; - } -} - -le_bool ClassDefinitionTable::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const -{ - LEReferenceTo<ClassDefinitionTable> thisRef(base, success); - if (LE_FAILURE(success)) return 0; - - switch(SWAPW(classFormat)) { - case 0: - return 0; - - case 1: - { - const LEReferenceTo<ClassDefFormat1Table> f1Table(thisRef, success); - return f1Table->hasGlyphClass(f1Table, glyphClass, success); - } - - case 2: - { - const LEReferenceTo<ClassDefFormat2Table> f2Table(thisRef, success); - return f2Table->hasGlyphClass(f2Table, glyphClass, success); - } - - default: - return 0; - } -} - -le_int32 ClassDefFormat1Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return 0; - - le_uint16 count = SWAPW(glyphCount); - LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); - TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); - TTGlyphID firstGlyph = SWAPW(startGlyph); - TTGlyphID lastGlyph = firstGlyph + count; - - if (LE_SUCCESS(success) && ttGlyphID >= firstGlyph && ttGlyphID < lastGlyph) { - return SWAPW( classValueArrayRef(ttGlyphID - firstGlyph, success) ); - } - - return 0; -} - -le_bool ClassDefFormat1Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return 0; - le_uint16 count = SWAPW(glyphCount); - LEReferenceToArrayOf<le_uint16> classValueArrayRef(base, success, &classValueArray[0], count); - int i; - - for (i = 0; LE_SUCCESS(success)&& (i < count); i += 1) { - if (SWAPW(classValueArrayRef(i,success)) == glyphClass) { - return TRUE; - } - } - - return FALSE; -} - -le_int32 ClassDefFormat2Table::getGlyphClass(const LETableReference& base, LEGlyphID glyphID, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return 0; - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyphID); - le_uint16 rangeCount = SWAPW(classRangeCount); - LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); - le_int32 rangeIndex = - OpenTypeUtilities::getGlyphRangeIndex(ttGlyph, classRangeRecordArrayRef, success); - - if (rangeIndex < 0 || LE_FAILURE(success)) { - return 0; - } - - return SWAPW(classRangeRecordArrayRef(rangeIndex, success).rangeValue); -} - -le_bool ClassDefFormat2Table::hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return 0; - le_uint16 rangeCount = SWAPW(classRangeCount); - LEReferenceToArrayOf<GlyphRangeRecord> classRangeRecordArrayRef(base, success, &classRangeRecordArray[0], rangeCount); - int i; - - for (i = 0; i < rangeCount && LE_SUCCESS(success); i += 1) { - if (SWAPW(classRangeRecordArrayRef(i,success).rangeValue) == glyphClass) { - return TRUE; - } - } - - return FALSE; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ClassDefinitionTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __CLASSDEFINITIONTABLES_H -#define __CLASSDEFINITIONTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct ClassDefinitionTable -{ - le_uint16 classFormat; - - le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; - le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; - -#if LE_ENABLE_RAW - le_int32 getGlyphClass(LEGlyphID glyphID) const { - LETableReference base((const le_uint8*)this); - LEErrorCode ignored = LE_NO_ERROR; - return getGlyphClass(base,glyphID,ignored); - } - - le_bool hasGlyphClass(le_int32 glyphClass) const { - LETableReference base((const le_uint8*)this); - LEErrorCode ignored = LE_NO_ERROR; - return hasGlyphClass(base,glyphClass,ignored); - } -#endif -}; - -struct ClassDefFormat1Table : ClassDefinitionTable -{ - TTGlyphID startGlyph; - le_uint16 glyphCount; - le_uint16 classValueArray[ANY_NUMBER]; - - le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; - le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(ClassDefFormat1Table, classValueArray) - - -struct ClassRangeRecord -{ - TTGlyphID start; - TTGlyphID end; - le_uint16 classValue; -}; - -struct ClassDefFormat2Table : ClassDefinitionTable -{ - le_uint16 classRangeCount; - GlyphRangeRecord classRangeRecordArray[ANY_NUMBER]; - - le_int32 getGlyphClass(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; - le_bool hasGlyphClass(const LETableReference &base, le_int32 glyphClass, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(ClassDefFormat2Table, classRangeRecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphInsertion.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALGLYPHINSERTION_H -#define __CONTEXTUALGLYPHINSERTION_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "StateTables.h" -#include "MorphTables.h" -#include "MorphStateTables.h" - -U_NAMESPACE_BEGIN - -struct ContextualGlyphInsertionHeader : MorphStateTableHeader -{ -}; - -struct ContextualGlyphInsertionHeader2 : MorphStateTableHeader2 -{ - le_uint32 insertionTableOffset; -}; - -enum ContextualGlyphInsertionFlags -{ - cgiSetMark = 0x8000, - cgiDontAdvance = 0x4000, - cgiCurrentIsKashidaLike = 0x2000, - cgiMarkedIsKashidaLike = 0x1000, - cgiCurrentInsertBefore = 0x0800, - cgiMarkInsertBefore = 0x0400, - cgiCurrentInsertCountMask = 0x03E0, - cgiMarkedInsertCountMask = 0x001F -}; - -struct ContextualGlyphInsertionStateEntry : StateEntry -{ - ByteOffset currentInsertionListOffset; - ByteOffset markedInsertionListOffset; -}; - -struct ContextualGlyphInsertionStateEntry2 : StateEntry2 -{ - le_uint16 currentInsertionListIndex; - le_uint16 markedInsertionListIndex; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphInsertionProc2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "ContextualGlyphInsertionProc2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphInsertionProcessor2) - -ContextualGlyphInsertionProcessor2::ContextualGlyphInsertionProcessor2( - const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor2(morphSubtableHeader, success) -{ - contextualGlyphHeader = LEReferenceTo<ContextualGlyphInsertionHeader2>(morphSubtableHeader, success); - if(LE_FAILURE(success) || !contextualGlyphHeader.isValid()) return; - le_uint32 insertionTableOffset = SWAPL(contextualGlyphHeader->insertionTableOffset); - insertionTable = LEReferenceToArrayOf<le_uint16>(stHeader, success, insertionTableOffset, LE_UNBOUNDED_ARRAY); - entryTable = LEReferenceToArrayOf<ContextualGlyphInsertionStateEntry2>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY); -} - -ContextualGlyphInsertionProcessor2::~ContextualGlyphInsertionProcessor2() -{ -} - -void ContextualGlyphInsertionProcessor2::beginStateTable() -{ - markGlyph = 0; -} - -void ContextualGlyphInsertionProcessor2::doInsertion(LEGlyphStorage &glyphStorage, - le_int16 atGlyph, - le_int16 &index, - le_int16 count, - le_bool /* isKashidaLike */, - le_bool isBefore, - LEErrorCode &success) { - LEGlyphID *insertGlyphs = glyphStorage.insertGlyphs(atGlyph, count + 1, success); - - if(LE_FAILURE(success) || insertGlyphs==NULL) { - return; - } - - // Note: Kashida vs Split Vowel seems to only affect selection and highlighting. - // We note the flag, but do not layout different. - // https://developer.apple.com/fonts/TTRefMan/RM06/Chap6mort.html - - le_int16 targetIndex = 0; - if(isBefore) { - // insert at beginning - insertGlyphs[targetIndex++] = glyphStorage[atGlyph]; - } else { - // insert at end - insertGlyphs[count] = glyphStorage[atGlyph]; - } - - while(count--) { - insertGlyphs[targetIndex++] = insertionTable.getObject(index++, success); - } - glyphStorage.applyInsertions(); -} - -le_uint16 ContextualGlyphInsertionProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, - EntryTableIndex2 index, LEErrorCode &success) -{ - const ContextualGlyphInsertionStateEntry2 *entry = entryTable.getAlias(index, success); - - if(LE_FAILURE(success)) return 0; // TODO- which state? - - le_uint16 newState = SWAPW(entry->newStateIndex); - le_uint16 flags = SWAPW(entry->flags); - - le_int16 markIndex = SWAPW(entry->markedInsertionListIndex); - if (markIndex > 0) { - if (markGlyph < 0 || markGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - le_int16 count = (flags & cgiMarkedInsertCountMask) >> 5; - le_bool isKashidaLike = (flags & cgiMarkedIsKashidaLike); - le_bool isBefore = (flags & cgiMarkInsertBefore); - doInsertion(glyphStorage, markGlyph, markIndex, count, isKashidaLike, isBefore, success); - } - - le_int16 currIndex = SWAPW(entry->currentInsertionListIndex); - if (currIndex > 0) { - if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - le_int16 count = flags & cgiCurrentInsertCountMask; - le_bool isKashidaLike = (flags & cgiCurrentIsKashidaLike); - le_bool isBefore = (flags & cgiCurrentInsertBefore); - doInsertion(glyphStorage, currGlyph, currIndex, count, isKashidaLike, isBefore, success); - } - - if (flags & cgiSetMark) { - markGlyph = currGlyph; - } - - if (!(flags & cgiDontAdvance)) { - currGlyph += dir; - } - - return newState; -} - -void ContextualGlyphInsertionProcessor2::endStateTable() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphInsertionProc2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 2013 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALGLYPHINSERTIONPROCESSOR2_H -#define __CONTEXTUALGLYPHINSERTIONPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "ContextualGlyphInsertionProc2.h" -#include "ContextualGlyphInsertion.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class ContextualGlyphInsertionProcessor2 : public StateTableProcessor2 -{ -public: - virtual void beginStateTable(); - - virtual le_uint16 processStateEntry(LEGlyphStorage &glyphStorage, - le_int32 &currGlyph, EntryTableIndex2 index, LEErrorCode &success); - - virtual void endStateTable(); - - ContextualGlyphInsertionProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - virtual ~ContextualGlyphInsertionProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - ContextualGlyphInsertionProcessor2(); - - /** - * Perform the actual insertion - * @param atGlyph index of glyph to insert at - * @param index index into the insertionTable (in/out) - * @param count number of insertions - * @param isKashidaLike Kashida like (vs Split Vowel like). No effect currently. - * @param isBefore if true, insert extra glyphs before the marked glyph - */ - void doInsertion(LEGlyphStorage &glyphStorage, - le_int16 atGlyph, - le_int16 &index, - le_int16 count, - le_bool isKashidaLike, - le_bool isBefore, - LEErrorCode &success); - - -protected: - le_int32 markGlyph; - LEReferenceToArrayOf<le_uint16> insertionTable; - LEReferenceToArrayOf<ContextualGlyphInsertionStateEntry2> entryTable; - LEReferenceTo<ContextualGlyphInsertionHeader2> contextualGlyphHeader; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphSubstProc.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "ContextualGlyphSubstProc.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) - -ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor(morphSubtableHeader, success), entryTable(), contextualGlyphSubstitutionHeader(morphSubtableHeader, success) -{ - if (LE_FAILURE(success)) return; - contextualGlyphSubstitutionHeader.orphan(); - substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset); - - - entryTable = LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry>(stateTableHeader, success, - (const ContextualGlyphSubstitutionStateEntry*)(&stateTableHeader->stHeader), - entryTableOffset, LE_UNBOUNDED_ARRAY); - int16Table = LEReferenceToArrayOf<le_int16>(stateTableHeader, success, (const le_int16*)(&stateTableHeader->stHeader), - 0, LE_UNBOUNDED_ARRAY); // rest of the table as le_int16s -} - -ContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor() -{ -} - -void ContextualGlyphSubstitutionProcessor::beginStateTable() -{ - markGlyph = 0; -} - -ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success) -{ - const ContextualGlyphSubstitutionStateEntry *entry = entryTable.getAlias(index, success); - if (LE_FAILURE(success)) return 0; - ByteOffset newState = SWAPW(entry->newStateOffset); - le_int16 flags = SWAPW(entry->flags); - WordOffset markOffset = SWAPW(entry->markOffset); - WordOffset currOffset = SWAPW(entry->currOffset); - - if (markOffset != 0 && LE_SUCCESS(success)) { - if (markGlyph < 0 || markGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - LEGlyphID mGlyph = glyphStorage[markGlyph]; - TTGlyphID newGlyph = SWAPW(int16Table.getObject(markOffset + LE_GET_GLYPH(mGlyph), success)); // whew. - - glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); - } - - if (currOffset != 0) { - if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - LEGlyphID thisGlyph = glyphStorage[currGlyph]; - TTGlyphID newGlyph = SWAPW(int16Table.getObject(currOffset + LE_GET_GLYPH(thisGlyph), success)); // whew. - - glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - - if (flags & cgsSetMark) { - markGlyph = currGlyph; - } - - if (!(flags & cgsDontAdvance)) { - // should handle reverse too! - currGlyph += 1; - } - - return newState; -} - -void ContextualGlyphSubstitutionProcessor::endStateTable() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphSubstProc.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H -#define __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "ContextualGlyphSubstitution.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class ContextualGlyphSubstitutionProcessor : public StateTableProcessor -{ -public: - virtual void beginStateTable(); - - virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success); - - virtual void endStateTable(); - - ContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - virtual ~ContextualGlyphSubstitutionProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - ContextualGlyphSubstitutionProcessor(); - -protected: - ByteOffset substitutionTableOffset; - LEReferenceToArrayOf<ContextualGlyphSubstitutionStateEntry> entryTable; - LEReferenceToArrayOf<le_int16> int16Table; - le_int32 markGlyph; - - LEReferenceTo<ContextualGlyphSubstitutionHeader> contextualGlyphSubstitutionHeader; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphSubstProc2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "ContextualGlyphSubstProc2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor2) - -ContextualGlyphSubstitutionProcessor2::ContextualGlyphSubstitutionProcessor2( - const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor2(morphSubtableHeader, success), contextualGlyphHeader(morphSubtableHeader, success) -{ - if(LE_FAILURE(success)) return; - le_uint32 perGlyphTableOffset = SWAPL(contextualGlyphHeader->perGlyphTableOffset); - perGlyphTable = LEReferenceToArrayOf<le_uint32> (stHeader, success, perGlyphTableOffset, LE_UNBOUNDED_ARRAY); - entryTable = LEReferenceToArrayOf<ContextualGlyphStateEntry2>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY); -} - -ContextualGlyphSubstitutionProcessor2::~ContextualGlyphSubstitutionProcessor2() -{ -} - -void ContextualGlyphSubstitutionProcessor2::beginStateTable() -{ - markGlyph = 0; -} - -le_uint16 ContextualGlyphSubstitutionProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, - EntryTableIndex2 index, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return 0; - const ContextualGlyphStateEntry2 *entry = entryTable.getAlias(index, success); - if(LE_FAILURE(success)) return 0; - le_uint16 newState = SWAPW(entry->newStateIndex); - le_uint16 flags = SWAPW(entry->flags); - le_uint16 markIndex = SWAPW(entry->markIndex); - le_uint16 currIndex = SWAPW(entry->currIndex); - - if (markIndex != 0x0FFFF) { - if (markGlyph < 0 || markGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - le_uint32 offset = SWAPL(perGlyphTable(markIndex, success)); - LEGlyphID mGlyph = glyphStorage[markGlyph]; - TTGlyphID newGlyph = lookup(offset, mGlyph, success); - glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); - } - - if (currIndex != 0x0FFFF) { - if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - le_uint32 offset = SWAPL(perGlyphTable(currIndex, success)); - LEGlyphID thisGlyph = glyphStorage[currGlyph]; - TTGlyphID newGlyph = lookup(offset, thisGlyph, success); - glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - - if (flags & cgsSetMark) { - markGlyph = currGlyph; - } - - if (!(flags & cgsDontAdvance)) { - currGlyph += dir; - } - - return newState; -} - -TTGlyphID ContextualGlyphSubstitutionProcessor2::lookup(le_uint32 offset, LEGlyphID gid, LEErrorCode &success) -{ - TTGlyphID newGlyph = 0xFFFF; - if(LE_FAILURE(success)) return newGlyph; - LEReferenceTo<LookupTable> lookupTable(perGlyphTable, success, offset); - if(LE_FAILURE(success)) return newGlyph; - le_int16 format = SWAPW(lookupTable->format); - - switch (format) { - case ltfSimpleArray: { -#ifdef TEST_FORMAT - // Disabled pending for design review - LEReferenceTo<SimpleArrayLookupTable> lookupTable0(lookupTable, success); - LEReferenceToArrayOf<LookupValue> valueArray(lookupTable0, success, &lookupTable0->valueArray[0], LE_UNBOUNDED_ARRAY); - if(LE_FAILURE(success)) return newGlyph; - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid); - newGlyph = SWAPW(lookupTable0->valueArray(glyphCode, success)); -#endif - break; - } - case ltfSegmentSingle: { -#ifdef TEST_FORMAT - // Disabled pending for design review - LEReferenceTo<SegmentSingleLookupTable> lookupTable2 = (SegmentSingleLookupTable *) lookupTable; - const LookupSegment *segment = lookupTable2->lookupSegment(lookupTable2->segments, gid); - if (segment != NULL) { - newGlyph = SWAPW(segment->value); - } -#endif - break; - } - case ltfSegmentArray: { - //printf("Context Lookup Table Format4: specific interpretation needed!\n"); - break; - } - case ltfSingleTable: - { -#ifdef TEST_FORMAT - // Disabled pending for design review - LEReferenceTo<SingleTableLookupTable> lookupTable6 = (SingleTableLookupTable *) lookupTable; - const LEReferenceTo<LookupSingle> segment = lookupTable6->lookupSingle(lookupTable6->entries, gid); - if (segment != NULL) { - newGlyph = SWAPW(segment->value); - } -#endif - break; - } - case ltfTrimmedArray: { - LEReferenceTo<TrimmedArrayLookupTable> lookupTable8(lookupTable, success); - if (LE_FAILURE(success)) return newGlyph; - TTGlyphID firstGlyph = SWAPW(lookupTable8->firstGlyph); - TTGlyphID glyphCount = SWAPW(lookupTable8->glyphCount); - TTGlyphID lastGlyph = firstGlyph + glyphCount; - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid); - if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) { - LEReferenceToArrayOf<LookupValue> valueArray(lookupTable8, success, &lookupTable8->valueArray[0], glyphCount); - if (LE_FAILURE(success)) { return newGlyph; } - newGlyph = SWAPW(valueArray(glyphCode - firstGlyph, success)); - } - } - default: - break; - } - return newGlyph; -} - -void ContextualGlyphSubstitutionProcessor2::endStateTable() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphSubstProc2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR2_H -#define __CONTEXTUALGLYPHSUBSTITUTIONPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "ContextualGlyphSubstitution.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class ContextualGlyphSubstitutionProcessor2 : public StateTableProcessor2 -{ -public: - virtual void beginStateTable(); - - virtual le_uint16 processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex2 index, LEErrorCode &success); - - virtual void endStateTable(); - - ContextualGlyphSubstitutionProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - virtual ~ContextualGlyphSubstitutionProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - ContextualGlyphSubstitutionProcessor2(); - TTGlyphID lookup(le_uint32 offset, LEGlyphID gid, LEErrorCode &success); - -protected: - LEReferenceToArrayOf<le_uint32> perGlyphTable; - LEReferenceToArrayOf<ContextualGlyphStateEntry2> entryTable; - - le_int16 perGlyphTableFormat; - le_int32 markGlyph; - - LEReferenceTo<ContextualGlyphHeader2> contextualGlyphHeader; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualGlyphSubstitution.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALGLYPHSUBSTITUTION_H -#define __CONTEXTUALGLYPHSUBSTITUTION_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "StateTables.h" -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -struct ContextualGlyphSubstitutionHeader : MorphStateTableHeader -{ - ByteOffset substitutionTableOffset; -}; - -struct ContextualGlyphHeader2 : MorphStateTableHeader2 -{ - le_uint32 perGlyphTableOffset; // no more substitution tables -}; - -enum ContextualGlyphSubstitutionFlags -{ - cgsSetMark = 0x8000, - cgsDontAdvance = 0x4000, - cgsReserved = 0x3FFF -}; - -struct ContextualGlyphSubstitutionStateEntry : StateEntry -{ - WordOffset markOffset; - WordOffset currOffset; -}; - -struct ContextualGlyphStateEntry2 : StateEntry2 -{ - le_uint16 markIndex; - le_uint16 currIndex; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,702 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "ContextualSubstSubtables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" -#include "CoverageTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -/* - NOTE: This could be optimized somewhat by keeping track - of the previous sequenceIndex in the loop and doing next() - or prev() of the delta between that and the current - sequenceIndex instead of always resetting to the front. -*/ -void ContextualSubstitutionBase::applySubstitutionLookups( - const LookupProcessor *lookupProcessor, - const LEReferenceToArrayOf<SubstitutionLookupRecord>& substLookupRecordArray, - le_uint16 substCount, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - le_int32 position, - LEErrorCode& success) -{ - if (LE_FAILURE(success)) { - return; - } - - GlyphIterator tempIterator(*glyphIterator); - const SubstitutionLookupRecord *substLookupRecordArrayPtr = substLookupRecordArray.getAlias(); // OK to dereference, range checked against substCount below. - - for (le_int16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { - le_uint16 sequenceIndex = SWAPW(substLookupRecordArrayPtr[subst].sequenceIndex); - le_uint16 lookupListIndex = SWAPW(substLookupRecordArrayPtr[subst].lookupListIndex); - - tempIterator.setCurrStreamPosition(position); - tempIterator.next(sequenceIndex); - - lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); - } -} - -le_bool ContextualSubstitutionBase::matchGlyphIDs(const LEReferenceToArrayOf<TTGlyphID>& glyphArray, le_uint16 glyphCount, - GlyphIterator *glyphIterator, le_bool backtrack) -{ - le_int32 direction = 1; - le_int32 match = 0; - - if (backtrack) { - match = glyphCount -1; - direction = -1; - } - - while (glyphCount > 0) { - if (! glyphIterator->next()) { - return FALSE; - } - - TTGlyphID glyph = (TTGlyphID) glyphIterator->getCurrGlyphID(); - - if (glyph != SWAPW(glyphArray[match])) { - return FALSE; - } - - glyphCount -= 1; - match += direction; - } - - return TRUE; -} - -le_bool ContextualSubstitutionBase::matchGlyphClasses( - const LEReferenceToArrayOf<le_uint16> &classArray, - le_uint16 glyphCount, - GlyphIterator *glyphIterator, - const LEReferenceTo<ClassDefinitionTable> &classDefinitionTable, - LEErrorCode &success, - le_bool backtrack) -{ - if (LE_FAILURE(success)) { return FALSE; } - - le_int32 direction = 1; - le_int32 match = 0; - - if (backtrack) { - match = glyphCount - 1; - direction = -1; - } - - while (glyphCount > 0) { - if (! glyphIterator->next()) { - return FALSE; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 glyphClass = classDefinitionTable->getGlyphClass(classDefinitionTable, glyph, success); - le_int32 matchClass = SWAPW(classArray[match]); - - if (glyphClass != matchClass) { - // Some fonts, e.g. Traditional Arabic, have classes - // in the class array which aren't in the class definition - // table. If we're looking for such a class, pretend that - // we found it. - if (classDefinitionTable->hasGlyphClass(classDefinitionTable, matchClass, success)) { - return FALSE; - } - } - - glyphCount -= 1; - match += direction; - } - - return TRUE; -} - -le_bool ContextualSubstitutionBase::matchGlyphCoverages(const LEReferenceToArrayOf<Offset> &coverageTableOffsetArray, le_uint16 glyphCount, -GlyphIterator *glyphIterator, const LETableReference &offsetBase, LEErrorCode &success, le_bool backtrack) -{ - le_int32 direction = 1; - le_int32 glyph = 0; - - if (backtrack) { - glyph = glyphCount - 1; - direction = -1; - } - - while (glyphCount > 0) { - Offset coverageTableOffset = SWAPW(coverageTableOffsetArray[glyph]); - LEReferenceTo<CoverageTable> coverageTable(offsetBase, success, coverageTableOffset); - - if (LE_FAILURE(success) || ! glyphIterator->next()) { - return FALSE; - } - - if (coverageTable->getGlyphCoverage(coverageTable, - (LEGlyphID) glyphIterator->getCurrGlyphID(), - success) < 0) { - return FALSE; - } - - glyphCount -= 1; - glyph += direction; - } - - return TRUE; -} - -le_uint32 ContextualSubstitutionSubtable::process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - switch(SWAPW(subtableFormat)) - { - case 0: - return 0; - - case 1: - { - LEReferenceTo<ContextualSubstitutionFormat1Subtable> subtable(base, success, (const ContextualSubstitutionFormat1Subtable *) this); - if( LE_FAILURE(success) ) { - return 0; - } - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - case 2: - { - LEReferenceTo<ContextualSubstitutionFormat2Subtable> subtable(base, success, (const ContextualSubstitutionFormat2Subtable *) this); - if( LE_FAILURE(success) ) { - return 0; - } - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - case 3: - { - LEReferenceTo<ContextualSubstitutionFormat3Subtable> subtable(base, success, (const ContextualSubstitutionFormat3Subtable *) this); - if( LE_FAILURE(success) ) { - return 0; - } - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - default: - return 0; - } -} - -le_uint32 ContextualSubstitutionFormat1Subtable::process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - le_uint16 srSetCount = SWAPW(subRuleSetCount); - - if (coverageIndex < srSetCount) { - LEReferenceToArrayOf<Offset> - subRuleSetTableOffsetArrayRef(base, success, subRuleSetTableOffsetArray, srSetCount); - if (LE_FAILURE(success)) { - return 0; - } - Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]); - LEReferenceTo<SubRuleSetTable> subRuleSetTable(base, success, subRuleSetTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); - - LEReferenceToArrayOf<Offset> subRuleTableOffsetArrayRef(base, success, - subRuleSetTable->subRuleTableOffsetArray, subRuleCount); - if (LE_FAILURE(success)) { - return 0; - } - for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) { - Offset subRuleTableOffset = - SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]); - LEReferenceTo<SubRuleTable> - subRuleTable(subRuleSetTable, success, subRuleTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 matchCount = SWAPW(subRuleTable->glyphCount) - 1; - le_uint16 substCount = SWAPW(subRuleTable->substCount); - LEReferenceToArrayOf<TTGlyphID> inputGlyphArray(base, success, subRuleTable->inputGlyphArray, matchCount+2); - if (LE_FAILURE(success)) { return 0; } - if (matchGlyphIDs(inputGlyphArray, matchCount, glyphIterator)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount], substCount); - - applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - - return matchCount + 1; - } - - glyphIterator->setCurrStreamPosition(position); - } - } - - // XXX If we get here, the table is mal-formed... - } - - return 0; -} - -le_uint32 ContextualSubstitutionFormat2Subtable::process(const LETableReference &base, - const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - LEReferenceTo<ClassDefinitionTable> classDefinitionTable(base, success, SWAPW(classDefTableOffset)); - if (LE_FAILURE(success)) { return 0; } - le_uint16 scSetCount = SWAPW(subClassSetCount); - le_int32 setClass = classDefinitionTable->getGlyphClass(classDefinitionTable, - glyphIterator->getCurrGlyphID(), - success); - - if (setClass < scSetCount) { - LEReferenceToArrayOf<Offset> - subClassSetTableOffsetArrayRef(base, success, subClassSetTableOffsetArray, scSetCount); - if (LE_FAILURE(success)) { return 0; } - if (subClassSetTableOffsetArray[setClass] != 0) { - - Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); - LEReferenceTo<SubClassSetTable> subClassSetTable(base, success, subClassSetTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); - LEReferenceToArrayOf<Offset> - subClassRuleTableOffsetArrayRef(base, success, subClassSetTable->subClassRuleTableOffsetArray, subClassRuleCount); - if (LE_FAILURE(success)) { - return 0; - } - for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { - Offset subClassRuleTableOffset = - SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); - LEReferenceTo<SubClassRuleTable> - subClassRuleTable(subClassSetTable, success, subClassRuleTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 matchCount = SWAPW(subClassRuleTable->glyphCount) - 1; - le_uint16 substCount = SWAPW(subClassRuleTable->substCount); - - LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1); - - if (LE_FAILURE(success)) { return 0; } - if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount); - - applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - - return matchCount + 1; - } - - glyphIterator->setCurrStreamPosition(position); - } - } - } - - // XXX If we get here, the table is mal-formed... - } - - return 0; -} - -le_uint32 ContextualSubstitutionFormat3Subtable::process(const LETableReference &base, - const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success)const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint16 gCount = SWAPW(glyphCount); - le_uint16 subCount = SWAPW(substCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); - - // Back up the glyph iterator so that we - // can call next() before the check, which - // will leave it pointing at the last glyph - // that matched when we're done. - glyphIterator->prev(); - - LEReferenceToArrayOf<Offset> covTableOffsetArray(base, success, coverageTableOffsetArray, gCount); - - if( LE_FAILURE(success) ) { return 0; } - - if (ContextualSubstitutionBase::matchGlyphCoverages(covTableOffsetArray, gCount, glyphIterator, base, success)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &coverageTableOffsetArray[gCount], subCount); - - ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, subCount, glyphIterator, fontInstance, position, success); - - return gCount + 1; - } - - glyphIterator->setCurrStreamPosition(position); - - return 0; -} - -le_uint32 ChainingContextualSubstitutionSubtable::process(const LEReferenceTo<ChainingContextualSubstitutionSubtable> &base, - const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - switch(SWAPW(subtableFormat)) - { - case 0: - return 0; - - case 1: - { - LEReferenceTo<ChainingContextualSubstitutionFormat1Subtable> subtable(base, success, (ChainingContextualSubstitutionFormat1Subtable *) this); - if(LE_FAILURE(success)) return 0; - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - case 2: - { - LEReferenceTo<ChainingContextualSubstitutionFormat2Subtable> subtable(base, success, (const ChainingContextualSubstitutionFormat2Subtable *) this); - if( LE_FAILURE(success) ) { return 0; } - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - case 3: - { - LEReferenceTo<ChainingContextualSubstitutionFormat3Subtable> subtable(base, success, (const ChainingContextualSubstitutionFormat3Subtable *) this); - if( LE_FAILURE(success) ) { return 0; } - return subtable->process(subtable, lookupProcessor, glyphIterator, fontInstance, success); - } - - default: - return 0; - } -} - -// NOTE: This could be a #define, but that seems to confuse -// the Visual Studio .NET 2003 compiler on the calls to the -// GlyphIterator constructor. It somehow can't decide if -// emptyFeatureList matches an le_uint32 or an le_uint16... -static const FeatureMask emptyFeatureList = 0x00000000UL; - -le_uint32 ChainingContextualSubstitutionFormat1Subtable::process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); - - if (coverageIndex < srSetCount) { - LEReferenceToArrayOf<Offset> - chainSubRuleSetTableOffsetArrayRef(base, success, chainSubRuleSetTableOffsetArray, srSetCount); - if (LE_FAILURE(success)) { - return 0; - } - Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]); - LEReferenceTo<ChainSubRuleSetTable> chainSubRuleSetTable(base, success, chainSubRuleSetTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); - GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); - LEReferenceToArrayOf<Offset> - chainSubRuleTableOffsetArrayRef(base, success, chainSubRuleSetTable->chainSubRuleTableOffsetArray, chainSubRuleCount); - if (LE_FAILURE(success)) { - return 0; - } - for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) { - Offset chainSubRuleTableOffset = - SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]); - LEReferenceTo<ChainSubRuleTable> - chainSubRuleTable = LEReferenceTo<ChainSubRuleTable>(chainSubRuleSetTable, success, chainSubRuleTableOffset); - if( LE_FAILURE(success) ) { return 0; } - le_uint16 backtrackGlyphCount = SWAPW(chainSubRuleTable->backtrackGlyphCount); - LEReferenceToArrayOf<TTGlyphID> backtrackGlyphArray(base, success, chainSubRuleTable->backtrackGlyphArray, backtrackGlyphCount); - if( LE_FAILURE(success) ) { return 0; } - le_uint16 inputGlyphCount = (le_uint16) SWAPW(chainSubRuleTable->backtrackGlyphArray[backtrackGlyphCount]) - 1; - LEReferenceToArrayOf<TTGlyphID> inputGlyphArray(base, success, &chainSubRuleTable->backtrackGlyphArray[backtrackGlyphCount + 1], inputGlyphCount+2); - - if( LE_FAILURE(success) ) { return 0; } - le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputGlyphArray[inputGlyphCount]); - LEReferenceToArrayOf<TTGlyphID> lookaheadGlyphArray(base, success, inputGlyphArray.getAlias(inputGlyphCount + 1,success), lookaheadGlyphCount+2); - if( LE_FAILURE(success) ) { return 0; } - le_uint16 substCount = (le_uint16) SWAPW(lookaheadGlyphArray[lookaheadGlyphCount]); - - tempIterator.setCurrStreamPosition(position); - - if (! tempIterator.prev(backtrackGlyphCount)) { - continue; - } - - tempIterator.prev(); - - if (! matchGlyphIDs(backtrackGlyphArray, backtrackGlyphCount, &tempIterator, TRUE)) { - continue; - } - - tempIterator.setCurrStreamPosition(position); - tempIterator.next(inputGlyphCount); - if (!matchGlyphIDs(lookaheadGlyphArray, lookaheadGlyphCount, &tempIterator)) { - continue; - } - - if (matchGlyphIDs(inputGlyphArray, inputGlyphCount, glyphIterator)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) lookaheadGlyphArray.getAlias(lookaheadGlyphCount + 1,success), substCount); - - applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - - return inputGlyphCount + 1; - } - - glyphIterator->setCurrStreamPosition(position); - } - } - - // XXX If we get here, the table is mal-formed... - } - - return 0; -} - -le_uint32 ChainingContextualSubstitutionFormat2Subtable::process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(lookupProcessor->getReference(), glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - LEReferenceTo<ClassDefinitionTable> - backtrackClassDefinitionTable(base, success, SWAPW(backtrackClassDefTableOffset)); - LEReferenceTo<ClassDefinitionTable> - inputClassDefinitionTable(base, success, SWAPW(inputClassDefTableOffset)); - LEReferenceTo<ClassDefinitionTable> - lookaheadClassDefinitionTable(base, success, SWAPW(lookaheadClassDefTableOffset)); - le_uint16 scSetCount = SWAPW(chainSubClassSetCount); - le_int32 setClass = inputClassDefinitionTable->getGlyphClass(inputClassDefinitionTable, - glyphIterator->getCurrGlyphID(), - success); - LEReferenceToArrayOf<Offset> - chainSubClassSetTableOffsetArrayRef(base, success, chainSubClassSetTableOffsetArray, scSetCount); - if (LE_FAILURE(success)) { - return 0; - } - - if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) { - Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]); - LEReferenceTo<ChainSubClassSetTable> - chainSubClassSetTable(base, success, chainSubClassSetTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount); - le_int32 position = glyphIterator->getCurrStreamPosition(); - GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); - LEReferenceToArrayOf<Offset> - chainSubClassRuleTableOffsetArrayRef(base, success, chainSubClassSetTable->chainSubClassRuleTableOffsetArray, chainSubClassRuleCount); - if (LE_FAILURE(success)) { - return 0; - } - for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) { - Offset chainSubClassRuleTableOffset = - SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]); - LEReferenceTo<ChainSubClassRuleTable> - chainSubClassRuleTable(chainSubClassSetTable, success, chainSubClassRuleTableOffset); - if (LE_FAILURE(success)) { return 0; } - le_uint16 backtrackGlyphCount = SWAPW(chainSubClassRuleTable->backtrackGlyphCount); - LEReferenceToArrayOf<le_uint16> backtrackClassArray(base, success, chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount); - if( LE_FAILURE(success) ) { return 0; } - le_uint16 inputGlyphCount = SWAPW(chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount]) - 1; - LEReferenceToArrayOf<le_uint16> inputClassArray(base, success, &chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount + 1],inputGlyphCount+2); // +2 for the lookaheadGlyphCount count - le_uint16 lookaheadGlyphCount = SWAPW(inputClassArray.getObject(inputGlyphCount, success)); - LEReferenceToArrayOf<le_uint16> lookaheadClassArray(base, success, inputClassArray.getAlias(inputGlyphCount + 1,success), lookaheadGlyphCount+2); // +2 for the substCount - - if( LE_FAILURE(success) ) { return 0; } - le_uint16 substCount = SWAPW(lookaheadClassArray[lookaheadGlyphCount]); - - - tempIterator.setCurrStreamPosition(position); - - if (! tempIterator.prev(backtrackGlyphCount)) { - continue; - } - - tempIterator.prev(); - if (! matchGlyphClasses(backtrackClassArray, backtrackGlyphCount, - &tempIterator, backtrackClassDefinitionTable, success, TRUE)) { - continue; - } - - tempIterator.setCurrStreamPosition(position); - tempIterator.next(inputGlyphCount); - if (! matchGlyphClasses(lookaheadClassArray, lookaheadGlyphCount, &tempIterator, lookaheadClassDefinitionTable, success)) { - continue; - } - - if (matchGlyphClasses(inputClassArray, inputGlyphCount, glyphIterator, inputClassDefinitionTable, success)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) lookaheadClassArray.getAlias(lookaheadGlyphCount + 1, success), substCount); - if (LE_FAILURE(success)) { return 0; } - applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - - return inputGlyphCount + 1; - } - - glyphIterator->setCurrStreamPosition(position); - } - } - - // XXX If we get here, the table is mal-formed... - } - - return 0; -} - -le_uint32 ChainingContextualSubstitutionFormat3Subtable::process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode & success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); - LEReferenceToArrayOf<Offset> backtrackGlyphArrayRef(base, success, backtrackCoverageTableOffsetArray, backtrkGlyphCount); - if (LE_FAILURE(success)) { - return 0; - } - le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); - LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset - if (LE_FAILURE(success)) { return 0; } - const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]); - LEReferenceToArrayOf<Offset> lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2); - - if( LE_FAILURE(success) ) { return 0; } - le_uint16 substCount = (le_uint16) SWAPW(lookaheadCoverageTableOffsetArray[lookaheadGlyphCount]); - le_int32 position = glyphIterator->getCurrStreamPosition(); - GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); - - if (! tempIterator.prev(backtrkGlyphCount)) { - return 0; - } - - tempIterator.prev(); - if (! ContextualSubstitutionBase::matchGlyphCoverages(backtrackCoverageTableOffsetArray, - backtrkGlyphCount, &tempIterator, base, success, TRUE)) { - return 0; - } - - tempIterator.setCurrStreamPosition(position); - tempIterator.next(inputGlyphCount - 1); - if (! ContextualSubstitutionBase::matchGlyphCoverages(lookaheadCoverageTableOffsetArray, - lookaheadGlyphCount, &tempIterator, base, success)) { - return 0; - } - - // Back up the glyph iterator so that we - // can call next() before the check, which - // will leave it pointing at the last glyph - // that matched when we're done. - glyphIterator->prev(); - - if (ContextualSubstitutionBase::matchGlyphCoverages(inputCoverageTableOffsetArray, - inputGlyphCount, glyphIterator, base, success)) { - LEReferenceToArrayOf<SubstitutionLookupRecord> - substLookupRecordArray(base, success, - (const SubstitutionLookupRecord *) lookaheadCoverageTableOffsetArray.getAlias(lookaheadGlyphCount + 1,success), substCount); - - ContextualSubstitutionBase::applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success); - - return inputGlyphCount; - } - - glyphIterator->setCurrStreamPosition(position); - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,271 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __CONTEXTUALSUBSTITUTIONSUBTABLES_H -#define __CONTEXTUALSUBSTITUTIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" -#include "LETableReference.h" - -U_NAMESPACE_BEGIN - -struct SubstitutionLookupRecord -{ - le_uint16 sequenceIndex; - le_uint16 lookupListIndex; -}; - -struct ContextualSubstitutionBase : GlyphSubstitutionSubtable -{ - static le_bool matchGlyphIDs( - const LEReferenceToArrayOf<TTGlyphID> &glyphArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, - le_bool backtrack = FALSE); - - static le_bool matchGlyphClasses( - const LEReferenceToArrayOf<le_uint16> &classArray, le_uint16 glyphCount, GlyphIterator *glyphIterator, - const LEReferenceTo<ClassDefinitionTable> &classDefinitionTable, LEErrorCode &success, le_bool backtrack = FALSE); - - static le_bool matchGlyphCoverages( - const LEReferenceToArrayOf<Offset> &coverageTableOffsetArray, le_uint16 glyphCount, - GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE); - - /** - * little shim to wrap the Offset array in range checking - * @private - */ - static le_bool matchGlyphCoverages( - const Offset *coverageTableOffsetArray, le_uint16 glyphCount, - GlyphIterator *glyphIterator, const LETableReference& offsetBase, LEErrorCode &success, le_bool backtrack = FALSE) { - LEReferenceToArrayOf<Offset> ref(offsetBase, success, coverageTableOffsetArray, glyphCount); - if( LE_FAILURE(success) ) { return FALSE; } - return matchGlyphCoverages(ref, glyphCount, glyphIterator, offsetBase, success, backtrack); - } - - static void applySubstitutionLookups( - const LookupProcessor *lookupProcessor, - const LEReferenceToArrayOf<SubstitutionLookupRecord>& substLookupRecordArray, - le_uint16 substCount, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - le_int32 position, - LEErrorCode& success); -}; - -struct ContextualSubstitutionSubtable : ContextualSubstitutionBase -{ - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; - -struct ContextualSubstitutionFormat1Subtable : ContextualSubstitutionSubtable -{ - le_uint16 subRuleSetCount; - Offset subRuleSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ContextualSubstitutionFormat1Subtable, subRuleSetTableOffsetArray) - - -struct SubRuleSetTable -{ - le_uint16 subRuleCount; - Offset subRuleTableOffsetArray[ANY_NUMBER]; - -}; -LE_VAR_ARRAY(SubRuleSetTable, subRuleTableOffsetArray) - -// NOTE: Multiple variable size arrays!! -struct SubRuleTable -{ - le_uint16 glyphCount; - le_uint16 substCount; - TTGlyphID inputGlyphArray[ANY_NUMBER]; - //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SubRuleTable, inputGlyphArray) - -struct ContextualSubstitutionFormat2Subtable : ContextualSubstitutionSubtable -{ - Offset classDefTableOffset; - le_uint16 subClassSetCount; - Offset subClassSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ContextualSubstitutionFormat2Subtable, subClassSetTableOffsetArray) - - -struct SubClassSetTable -{ - le_uint16 subClassRuleCount; - Offset subClassRuleTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SubClassSetTable, subClassRuleTableOffsetArray) - - -// NOTE: Multiple variable size arrays!! -struct SubClassRuleTable -{ - le_uint16 glyphCount; - le_uint16 substCount; - le_uint16 classArray[ANY_NUMBER]; - //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SubClassRuleTable, classArray) - - -// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause -// it has an array of coverage tables instead of a single coverage table... -// -// NOTE: Multiple variable size arrays!! -struct ContextualSubstitutionFormat3Subtable -{ - le_uint16 substFormat; - le_uint16 glyphCount; - le_uint16 substCount; - Offset coverageTableOffsetArray[ANY_NUMBER]; - //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ContextualSubstitutionFormat3Subtable, coverageTableOffsetArray) - -struct ChainingContextualSubstitutionSubtable : ContextualSubstitutionBase -{ - le_uint32 process(const LEReferenceTo<ChainingContextualSubstitutionSubtable> &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; - -struct ChainingContextualSubstitutionFormat1Subtable : ChainingContextualSubstitutionSubtable -{ - le_uint16 chainSubRuleSetCount; - Offset chainSubRuleSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ChainingContextualSubstitutionFormat1Subtable, chainSubRuleSetTableOffsetArray) - - -struct ChainSubRuleSetTable -{ - le_uint16 chainSubRuleCount; - Offset chainSubRuleTableOffsetArray[ANY_NUMBER]; - -}; -LE_VAR_ARRAY(ChainSubRuleSetTable, chainSubRuleTableOffsetArray) - -// NOTE: Multiple variable size arrays!! -struct ChainSubRuleTable -{ - le_uint16 backtrackGlyphCount; - TTGlyphID backtrackGlyphArray[ANY_NUMBER]; - //le_uint16 inputGlyphCount; - //TTGlyphID inputGlyphArray[ANY_NUMBER]; - //le_uint16 lookaheadGlyphCount; - //TTGlyphID lookaheadGlyphArray[ANY_NUMBER]; - //le_uint16 substCount; - //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ChainSubRuleTable, backtrackGlyphArray) - -struct ChainingContextualSubstitutionFormat2Subtable : ChainingContextualSubstitutionSubtable -{ - Offset backtrackClassDefTableOffset; - Offset inputClassDefTableOffset; - Offset lookaheadClassDefTableOffset; - le_uint16 chainSubClassSetCount; - Offset chainSubClassSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ChainingContextualSubstitutionFormat2Subtable, chainSubClassSetTableOffsetArray) - -struct ChainSubClassSetTable -{ - le_uint16 chainSubClassRuleCount; - Offset chainSubClassRuleTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ChainSubClassSetTable, chainSubClassRuleTableOffsetArray) - - -// NOTE: Multiple variable size arrays!! -struct ChainSubClassRuleTable -{ - le_uint16 backtrackGlyphCount; - le_uint16 backtrackClassArray[ANY_NUMBER]; - //le_uint16 inputGlyphCount; - //le_uint16 inputClassArray[ANY_NUMBER]; - //le_uint16 lookaheadGlyphCount; - //le_uint16 lookaheadClassArray[ANY_NUMBER]; - //le_uint16 substCount; - //SubstitutionLookupRecord substLookupRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ChainSubClassRuleTable, backtrackClassArray) - -// NOTE: This isn't a subclass of GlyphSubstitutionSubtable 'cause -// it has arrays of coverage tables instead of a single coverage table... -// -// NOTE: Multiple variable size arrays!! -struct ChainingContextualSubstitutionFormat3Subtable -{ - le_uint16 substFormat; - le_uint16 backtrackGlyphCount; - Offset backtrackCoverageTableOffsetArray[ANY_NUMBER]; - //le_uint16 inputGlyphCount; - //Offset inputCoverageTableOffsetArray[ANY_NUMBER]; - //le_uint16 lookaheadGlyphCount; - //le_uint16 lookaheadCoverageTableOffsetArray[ANY_NUMBER]; - //le_uint16 substCount; - //SubstitutionLookupRecord substLookupRecord[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, const LookupProcessor *lookupProcessor, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; -LE_VAR_ARRAY(ChainingContextualSubstitutionFormat3Subtable, backtrackCoverageTableOffsetArray) - - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/CoverageTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "CoverageTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_int32 CoverageTable::getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return -1; - - switch(SWAPW(coverageFormat)) - { - case 0: - return -1; - - case 1: - { - LEReferenceTo<CoverageFormat1Table> f1Table(base, success); - - return f1Table->getGlyphCoverage(f1Table, glyphID, success); - } - - case 2: - { - LEReferenceTo<CoverageFormat2Table> f2Table(base, success); - - return f2Table->getGlyphCoverage(f2Table, glyphID, success); - } - - default: - return -1; - } -} - -le_int32 CoverageFormat1Table::getGlyphCoverage(LEReferenceTo<CoverageFormat1Table> &base, LEGlyphID glyphID, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return -1; - - TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); - le_uint16 count = SWAPW(glyphCount); - le_uint8 bit = OpenTypeUtilities::highBit(count); - le_uint16 power = 1 << bit; - le_uint16 extra = count - power; - le_uint16 probe = power; - le_uint16 index = 0; - - if (count == 0) { - return -1; - } - - LEReferenceToArrayOf<TTGlyphID>(base, success, glyphArray, count); - if(LE_FAILURE(success)) return -1; // range checks array - - - if (SWAPW(glyphArray[extra]) <= ttGlyphID) { - index = extra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (SWAPW(glyphArray[index + probe]) <= ttGlyphID) { - index += probe; - } - } - - if (SWAPW(glyphArray[index]) == ttGlyphID) { - return index; - } - - return -1; -} - -le_int32 CoverageFormat2Table::getGlyphCoverage(LEReferenceTo<CoverageFormat2Table> &base, LEGlyphID glyphID, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return -1; - - TTGlyphID ttGlyphID = (TTGlyphID) LE_GET_GLYPH(glyphID); - le_uint16 count = SWAPW(rangeCount); - - LEReferenceToArrayOf<GlyphRangeRecord> rangeRecordArrayRef(base, success, rangeRecordArray, count); - le_int32 rangeIndex = - OpenTypeUtilities::getGlyphRangeIndex(ttGlyphID, rangeRecordArrayRef, success); - - if (rangeIndex < 0 || LE_FAILURE(success)) { // could fail if array out of bounds - return -1; - } - - TTGlyphID firstInRange = SWAPW(rangeRecordArray[rangeIndex].firstGlyph); - le_uint16 startCoverageIndex = SWAPW(rangeRecordArray[rangeIndex].rangeValue); - - return startCoverageIndex + (ttGlyphID - firstInRange); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/CoverageTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __COVERAGETABLES_H -#define __COVERAGETABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct CoverageTable -{ - le_uint16 coverageFormat; - - le_int32 getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; -}; - -struct CoverageFormat1Table : CoverageTable -{ - le_uint16 glyphCount; - TTGlyphID glyphArray[ANY_NUMBER]; - - le_int32 getGlyphCoverage(LEReferenceTo<CoverageFormat1Table> &base, LEGlyphID glyphID, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(CoverageFormat1Table, glyphArray) - - -struct CoverageFormat2Table : CoverageTable -{ - le_uint16 rangeCount; - GlyphRangeRecord rangeRecordArray[ANY_NUMBER]; - - le_int32 getGlyphCoverage(LEReferenceTo<CoverageFormat2Table> &base, LEGlyphID glyphID, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(CoverageFormat2Table, rangeRecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/CursiveAttachmentSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "CursiveAttachmentSubtables.h" -#include "AnchorTables.h" -#include "GlyphIterator.h" -#include "OpenTypeUtilities.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 CursiveAttachmentSubtable::process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID glyphID = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyphID, success); - le_uint16 eeCount = SWAPW(entryExitCount); - - LEReferenceToArrayOf<EntryExitRecord> - entryExitRecordsArrayRef(base, success, entryExitRecords, eeCount); - - if (coverageIndex < 0 || coverageIndex >= eeCount || LE_FAILURE(success)) { - glyphIterator->setCursiveGlyph(); - return 0; - } - - LEPoint entryAnchor, exitAnchor; - Offset entryOffset = SWAPW(entryExitRecords[coverageIndex].entryAnchor); - Offset exitOffset = SWAPW(entryExitRecords[coverageIndex].exitAnchor); - - if (entryOffset != 0) { - LEReferenceTo<AnchorTable> entryAnchorTable(base, success, entryOffset); - - if( LE_SUCCESS(success) ) { - entryAnchorTable->getAnchor(entryAnchorTable, glyphID, fontInstance, entryAnchor, success); - glyphIterator->setCursiveEntryPoint(entryAnchor); - } - } else { - //glyphIterator->clearCursiveEntryPoint(); - } - - if (exitOffset != 0) { - LEReferenceTo<AnchorTable> exitAnchorTable(base, success, exitOffset); - - if( LE_SUCCESS(success) ) { - exitAnchorTable->getAnchor(exitAnchorTable, glyphID, fontInstance, exitAnchor, success); - glyphIterator->setCursiveExitPoint(exitAnchor); - } - } else { - //glyphIterator->clearCursiveExitPoint(); - } - - return 1; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/CursiveAttachmentSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __CURSIVEATTACHMENTSUBTABLES_H -#define __CURSIVEATTACHMENTSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class GlyphIterator; - -struct EntryExitRecord -{ - Offset entryAnchor; - Offset exitAnchor; -}; - -struct CursiveAttachmentSubtable : GlyphPositioningSubtable -{ - le_uint16 entryExitCount; - EntryExitRecord entryExitRecords[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<CursiveAttachmentSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(CursiveAttachmentSubtable, entryExitRecords) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/DefaultCharMapper.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __DEFAULTCHARMAPPER_H -#define __DEFAULTCHARMAPPER_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" - -U_NAMESPACE_BEGIN - -/** - * This class is an instance of LECharMapper which - * implements control character filtering and bidi - * mirroring. - * - * @see LECharMapper - */ -class DefaultCharMapper : public UMemory, public LECharMapper -{ -private: - le_bool fFilterControls; - le_bool fMirror; - le_bool fZWJ; - - static const LEUnicode32 controlChars[]; - - static const le_int32 controlCharsCount; - - static const LEUnicode32 controlCharsZWJ[]; - - static const le_int32 controlCharsZWJCount; - - static const LEUnicode32 mirroredChars[]; - static const LEUnicode32 srahCderorrim[]; - - static const le_int32 mirroredCharsCount; - -public: - DefaultCharMapper(le_bool filterControls, le_bool mirror, le_bool zwj = 0) - : fFilterControls(filterControls), fMirror(mirror), fZWJ(zwj) - { - // nothing - }; - - ~DefaultCharMapper() - { - // nada - }; - - LEUnicode32 mapChar(LEUnicode32 ch) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/DeviceTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "DeviceTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -const le_uint16 DeviceTable::fieldMasks[] = {0x0003, 0x000F, 0x00FF}; -const le_uint16 DeviceTable::fieldSignBits[] = {0x0002, 0x0008, 0x0080}; -const le_uint16 DeviceTable::fieldBits[] = { 2, 4, 8}; - -#define FORMAT_COUNT LE_ARRAY_SIZE(fieldBits) - -le_int16 DeviceTable::getAdjustment(const LEReferenceTo<DeviceTable>&base, le_uint16 ppem, LEErrorCode &success) const -{ - le_int16 result = 0; - if (LE_FAILURE(success)) { - return result; - } - le_uint16 start = SWAPW(startSize); - le_uint16 format = SWAPW(deltaFormat) - 1; - - if (ppem >= start && ppem <= SWAPW(endSize) && format < FORMAT_COUNT) { - le_uint16 sizeIndex = ppem - start; - le_uint16 bits = fieldBits[format]; - le_uint16 count = 16 / bits; - - LEReferenceToArrayOf<le_uint16> deltaValuesRef(base, success, deltaValues, (sizeIndex / count)); - - if(LE_FAILURE(success)) { - return result; - } - - le_uint16 word = SWAPW(deltaValues[sizeIndex / count]); - le_uint16 fieldIndex = sizeIndex % count; - le_uint16 shift = 16 - (bits * (fieldIndex + 1)); - le_uint16 field = (word >> shift) & fieldMasks[format]; - - result = field; - - if ((field & fieldSignBits[format]) != 0) { - result |= ~ fieldMasks[format]; - } - } - - return result; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/DeviceTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __DEVICETABLES_H -#define __DEVICETABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct DeviceTable -{ - le_uint16 startSize; - le_uint16 endSize; - le_uint16 deltaFormat; - le_uint16 deltaValues[ANY_NUMBER]; - - le_int16 getAdjustment(const LEReferenceTo<DeviceTable> &base, le_uint16 ppem, LEErrorCode &success) const; - -private: - static const le_uint16 fieldMasks[]; - static const le_uint16 fieldSignBits[]; - static const le_uint16 fieldBits[]; -}; -LE_VAR_ARRAY(DeviceTable, deltaValues) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ExtensionSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 2002 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "LookupProcessor.h" -#include "ExtensionSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -// read a 32-bit value that might only be 16-bit-aligned in memory -#define READ_LONG(code) (le_uint32)((SWAPW(*(le_uint16*)&code) << 16) + SWAPW(*(((le_uint16*)&code) + 1))) - -// FIXME: should look at the format too... maybe have a sub-class for it? -le_uint32 ExtensionSubtable::process(const LEReferenceTo<ExtensionSubtable> &thisRef, - const LookupProcessor *lookupProcessor, le_uint16 lookupType, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint16 elt = SWAPW(extensionLookupType); - - if (elt != lookupType) { - le_uint32 extOffset = READ_LONG(extensionOffset); - LEReferenceTo<LookupSubtable> subtable(thisRef, success, extOffset); - - if(LE_SUCCESS(success)) { - return lookupProcessor->applySubtable(subtable, elt, glyphIterator, fontInstance, success); - } - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ExtensionSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 2002-2003 - All Rights Reserved - * - */ - -#ifndef __EXTENSIONSUBTABLES_H -#define __EXTENSIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "LookupProcessor.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct ExtensionSubtable //: GlyphSubstitutionSubtable -{ - le_uint16 substFormat; - le_uint16 extensionLookupType; - le_uint32 extensionOffset; - - le_uint32 process(const LEReferenceTo<ExtensionSubtable> &base, const LookupProcessor *lookupProcessor, le_uint16 lookupType, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/Features.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeUtilities.h" -#include "OpenTypeTables.h" -#include "ICUFeatures.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const -{ - LEReferenceToArrayOf<FeatureRecord> - featureRecordArrayRef(base, success, featureRecordArray, SWAPW(featureCount)); - - if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return LEReferenceTo<FeatureTable>(); - } - - Offset featureTableOffset = featureRecordArray[featureIndex].featureTableOffset; - - *featureTag = SWAPT(featureRecordArray[featureIndex].featureTag); - - return LEReferenceTo<FeatureTable>(base, success, SWAPW(featureTableOffset)); -} - -#if 0 -/* - * Note: according to the OpenType Spec. v 1.4, the entries in the Feature - * List Table are sorted alphabetically by feature tag; however, there seem - * to be some fonts which have an unsorted list; that's why the binary search - * is #if 0'd out and replaced by a linear search. - * - * Also note: as of ICU 2.6, this method isn't called anyhow... - */ -const FeatureTable *FeatureListTable::getFeatureTable(LETag featureTag) const -{ -#if 0 - Offset featureTableOffset = - OpenTypeUtilities::getTagOffset(featureTag, (TagAndOffsetRecord *) featureRecordArray, SWAPW(featureCount)); - - if (featureTableOffset == 0) { - return 0; - } - - return (const FeatureTable *) ((char *) this + SWAPW(featureTableOffset)); -#else - int count = SWAPW(featureCount); - - for (int i = 0; i < count; i += 1) { - if (SWAPT(featureRecordArray[i].featureTag) == featureTag) { - return (const FeatureTable *) ((char *) this + SWAPW(featureRecordArray[i].featureTableOffset)); - } - } - - return 0; -#endif -} -#endif - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GDEFMarkFilter.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "GDEFMarkFilter.h" -#include "GlyphDefinitionTables.h" - -U_NAMESPACE_BEGIN - -GDEFMarkFilter::GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success) - : classDefTable(gdefTable->getGlyphClassDefinitionTable(gdefTable, success)) -{ - if(!classDefTable.isValid()) { - success = LE_INTERNAL_ERROR; - } -} - -GDEFMarkFilter::~GDEFMarkFilter() -{ - // nothing to do? -} - -le_bool GDEFMarkFilter::accept(LEGlyphID glyph, LEErrorCode &success) const -{ - le_int32 glyphClass = classDefTable->getGlyphClass(classDefTable, glyph, success); - - return glyphClass == gcdMarkGlyph; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GDEFMarkFilter.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __GDEFMARKFILTER__H -#define __GDEFMARKFILTER__H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "GlyphDefinitionTables.h" - -U_NAMESPACE_BEGIN - -class GDEFMarkFilter : public UMemory, public LEGlyphFilter -{ -private: - const LEReferenceTo<GlyphClassDefinitionTable> classDefTable; - - GDEFMarkFilter(const GDEFMarkFilter &other); // forbid copying of this class - GDEFMarkFilter &operator=(const GDEFMarkFilter &other); // forbid copying of this class - -public: - GDEFMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success); - virtual ~GDEFMarkFilter(); - - virtual le_bool accept(LEGlyphID glyph, LEErrorCode &success) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GXLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutEngine.h" -#include "GXLayoutEngine.h" -#include "LEGlyphStorage.h" - -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine) - - GXLayoutEngine::GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success) - : LayoutEngine(fontInstance, scriptCode, languageCode, 0, success), fMorphTable(morphTable) -{ - fMorphTable.orphan(); - // nothing else to do? -} - -GXLayoutEngine::~GXLayoutEngine() -{ - reset(); -} - -// apply 'mort' table -le_int32 GXLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - mapCharsToGlyphs(chars, offset, count, FALSE, rightToLeft, glyphStorage, success); - - if (LE_FAILURE(success)) { - return 0; - } - - fMorphTable->process(fMorphTable, glyphStorage, success); - - return glyphStorage.getGlyphCount(); -} - -// apply positional tables -void GXLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, - LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - // FIXME: no positional processing yet... -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GXLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __GXLAYOUTENGINE_H -#define __GXLAYOUTENGINE_H - -#include "LETypes.h" -#include "LayoutEngine.h" - -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class LEGlyphStorage; - -/** - * This class implements layout for QuickDraw GX or Apple Advanced Typograyph (AAT) - * fonts. A font is a GX or AAT font if it contains a 'mort' table. See Apple's - * TrueType Reference Manual (http://fonts.apple.com/TTRefMan/index.html) for details. - * Information about 'mort' tables is in the chapter titled "Font Files." - * - * @internal - */ -class GXLayoutEngine : public LayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of GXLayoutEngine for - * a particular font, script and language. It takes the 'mort' table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the 'mort' table to know that it has a - * GX font. - * - * Note: GX and AAT fonts don't contain any script and language specific tables, so - * the script and language are ignored. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param morphTable - the 'mort' table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - GXLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader> &morphTable, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~GXLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * The address of the 'mort' table - * - * @internal - */ - LEReferenceTo<MorphTableHeader> fMorphTable; - - /** - * This method does GX layout using the font's 'mort' table. It converts the - * input character codes to glyph indices using mapCharsToGlyphs, and then - * applies the 'mort' table. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the glyph index array - * - * @internal - */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method adjusts the glyph positions using the font's - * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables. - * - * Input parameters: - * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/GXLayoutEngine2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutEngine.h" -#include "GXLayoutEngine2.h" -#include "LEGlyphStorage.h" -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(GXLayoutEngine2) - -GXLayoutEngine2::GXLayoutEngine2(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader2> &morphTable, le_int32 typoFlags, LEErrorCode &success) - : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMorphTable(morphTable) -{ - // nothing else to do? -} - -GXLayoutEngine2::~GXLayoutEngine2() -{ - reset(); -} - -// apply 'morx' table -le_int32 GXLayoutEngine2::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); - - if (LE_FAILURE(success)) { - return 0; - } - - fMorphTable->process(fMorphTable, glyphStorage, fTypoFlags, success); - return glyphStorage.getGlyphCount(); -} - -// apply positional tables -void GXLayoutEngine2::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, - LEGlyphStorage &/*glyphStorage*/, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - // FIXME: no positional processing yet... -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GXLayoutEngine2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,149 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __GXLAYOUTENGINE2_H -#define __GXLAYOUTENGINE2_H - -#include "LETypes.h" -#include "LayoutEngine.h" - -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class LEGlyphStorage; - -/** - * This class implements layout for QuickDraw GX or Apple Advanced Typograyph (AAT) - * fonts. A font is a GX or AAT font if it contains a 'mort' table. See Apple's - * TrueType Reference Manual (http://fonts.apple.com/TTRefMan/index.html) for details. - * Information about 'mort' tables is in the chapter titled "Font Files." - * - * @internal - */ -class GXLayoutEngine2 : public LayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of GXLayoutEngine for - * a particular font, script and language. It takes the 'mort' table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the 'mort' table to know that it has a - * GX font. - * - * Note: GX and AAT fonts don't contain any script and language specific tables, so - * the script and language are ignored. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param morphTable - the 'mort' table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - GXLayoutEngine2(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, const LEReferenceTo<MorphTableHeader2> &morphTable, le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~GXLayoutEngine2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * The address of the 'mort' table - * - * @internal - */ - const LEReferenceTo<MorphTableHeader2> fMorphTable; - - /** - * This method does GX layout using the font's 'mort' table. It converts the - * input character codes to glyph indices using mapCharsToGlyphs, and then - * applies the 'mort' table. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the glyph index array - * - * @internal - */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method adjusts the glyph positions using the font's - * 'kern', 'trak', 'bsln', 'opbd' and 'just' tables. - * - * Input parameters: - * @param glyphStorage - the object holding the glyph storage. The positions will be updated as needed. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphDefinitionTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphDefinitionTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -const LEReferenceTo<GlyphClassDefinitionTable> -GlyphDefinitionTableHeader::getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return LEReferenceTo<GlyphClassDefinitionTable>(); - return LEReferenceTo<GlyphClassDefinitionTable>(base, success, SWAPW(glyphClassDefOffset)); -} - -const LEReferenceTo<AttachmentListTable> -GlyphDefinitionTableHeader::getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return LEReferenceTo<AttachmentListTable>(); - return LEReferenceTo<AttachmentListTable>(base, success, SWAPW(attachListOffset)); -} - -const LEReferenceTo<LigatureCaretListTable> -GlyphDefinitionTableHeader::getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return LEReferenceTo<LigatureCaretListTable>(); - return LEReferenceTo<LigatureCaretListTable>(base, success, SWAPW(ligCaretListOffset)); -} - -const LEReferenceTo<MarkAttachClassDefinitionTable> -GlyphDefinitionTableHeader::getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return LEReferenceTo<MarkAttachClassDefinitionTable>(); - return LEReferenceTo<MarkAttachClassDefinitionTable>(base, success, SWAPW(MarkAttachClassDefOffset)); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphDefinitionTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __GLYPHDEFINITIONTABLES_H -#define __GLYPHDEFINITIONTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "ClassDefinitionTables.h" - -U_NAMESPACE_BEGIN - -typedef ClassDefinitionTable GlyphClassDefinitionTable; - -enum GlyphClassDefinitions -{ - gcdNoGlyphClass = 0, - gcdSimpleGlyph = 1, - gcdLigatureGlyph = 2, - gcdMarkGlyph = 3, - gcdComponentGlyph = 4 -}; - -struct AttachmentListTable -{ - Offset coverageTableOffset; - le_uint16 glyphCount; - Offset attachPointTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(AttachmentListTable, attachPointTableOffsetArray) - -struct AttachPointTable -{ - le_uint16 pointCount; - le_uint16 pointIndexArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(AttachPointTable, pointIndexArray) - -struct LigatureCaretListTable -{ - Offset coverageTableOffset; - le_uint16 ligGlyphCount; - Offset ligGlyphTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureCaretListTable, ligGlyphTableOffsetArray) - -struct LigatureGlyphTable -{ - le_uint16 caretCount; - Offset caretValueTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureGlyphTable, caretValueTableOffsetArray) - -struct CaretValueTable -{ - le_uint16 caretValueFormat; -}; - -struct CaretValueFormat1Table : CaretValueTable -{ - le_int16 coordinate; -}; - -struct CaretValueFormat2Table : CaretValueTable -{ - le_uint16 caretValuePoint; -}; - -struct CaretValueFormat3Table : CaretValueTable -{ - le_int16 coordinate; - Offset deviceTableOffset; -}; - -typedef ClassDefinitionTable MarkAttachClassDefinitionTable; - -struct GlyphDefinitionTableHeader -{ - fixed32 version; - Offset glyphClassDefOffset; - Offset attachListOffset; - Offset ligCaretListOffset; - Offset MarkAttachClassDefOffset; - - const LEReferenceTo<GlyphClassDefinitionTable> - getGlyphClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const; - const LEReferenceTo<AttachmentListTable> - getAttachmentListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success)const ; - const LEReferenceTo<LigatureCaretListTable> - getLigatureCaretListTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const; - const LEReferenceTo<MarkAttachClassDefinitionTable> - getMarkAttachClassDefinitionTable(const LEReferenceTo<GlyphDefinitionTableHeader>& base, - LEErrorCode &success) const; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphIterator.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,559 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositionAdjustments.h" -#include "GlyphIterator.h" -#include "LEGlyphStorage.h" -#include "Lookups.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -GlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, - FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader, LEErrorCode &success) - : direction(1), position(-1), nextLimit(-1), prevLimit(-1), - glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments), - srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0), - glyphClassDefinitionTable(), markAttachClassDefinitionTable() - -{ - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - if (theGlyphDefinitionTableHeader.isValid()) { - glyphClassDefinitionTable = theGlyphDefinitionTableHeader - -> getGlyphClassDefinitionTable(theGlyphDefinitionTableHeader, success); - markAttachClassDefinitionTable = theGlyphDefinitionTableHeader - ->getMarkAttachClassDefinitionTable(theGlyphDefinitionTableHeader, success); - } - - nextLimit = glyphCount; - - if (rightToLeft) { - direction = -1; - position = glyphCount; - nextLimit = -1; - prevLimit = glyphCount; - } - filterResetCache(); -} - -GlyphIterator::GlyphIterator(GlyphIterator &that) - : glyphStorage(that.glyphStorage) -{ - direction = that.direction; - position = that.position; - nextLimit = that.nextLimit; - prevLimit = that.prevLimit; - - glyphPositionAdjustments = that.glyphPositionAdjustments; - srcIndex = that.srcIndex; - destIndex = that.destIndex; - lookupFlags = that.lookupFlags; - featureMask = that.featureMask; - glyphGroup = that.glyphGroup; - glyphClassDefinitionTable = that.glyphClassDefinitionTable; - markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; - filterResetCache(); -} - -GlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask) - : glyphStorage(that.glyphStorage) -{ - direction = that.direction; - position = that.position; - nextLimit = that.nextLimit; - prevLimit = that.prevLimit; - - glyphPositionAdjustments = that.glyphPositionAdjustments; - srcIndex = that.srcIndex; - destIndex = that.destIndex; - lookupFlags = that.lookupFlags; - featureMask = newFeatureMask; - glyphGroup = 0; - glyphClassDefinitionTable = that.glyphClassDefinitionTable; - markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; - filterResetCache(); -} - -GlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags) - : glyphStorage(that.glyphStorage) -{ - direction = that.direction; - position = that.position; - nextLimit = that.nextLimit; - prevLimit = that.prevLimit; - - glyphPositionAdjustments = that.glyphPositionAdjustments; - srcIndex = that.srcIndex; - destIndex = that.destIndex; - lookupFlags = newLookupFlags; - featureMask = that.featureMask; - glyphGroup = that.glyphGroup; - glyphClassDefinitionTable = that.glyphClassDefinitionTable; - markAttachClassDefinitionTable = that.markAttachClassDefinitionTable; - filterResetCache(); -} - -GlyphIterator::~GlyphIterator() -{ - // nothing to do, right? -} - -void GlyphIterator::reset(le_uint16 newLookupFlags, FeatureMask newFeatureMask) -{ - position = prevLimit; - featureMask = newFeatureMask; - glyphGroup = 0; - lookupFlags = newLookupFlags; - filterResetCache(); -} - -LEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success) -{ - return glyphStorage.insertGlyphs(position, count, success); -} - -le_int32 GlyphIterator::applyInsertions() -{ - le_int32 newGlyphCount = glyphStorage.applyInsertions(); - - if (direction < 0) { - prevLimit = newGlyphCount; - } else { - nextLimit = newGlyphCount; - } - - return newGlyphCount; -} - -le_int32 GlyphIterator::getCurrStreamPosition() const -{ - return position; -} - -le_bool GlyphIterator::isRightToLeft() const -{ - return direction < 0; -} - -le_bool GlyphIterator::ignoresMarks() const -{ - return (lookupFlags & lfIgnoreMarks) != 0; -} - -le_bool GlyphIterator::baselineIsLogicalEnd() const -{ - return (lookupFlags & lfBaselineIsLogicalEnd) != 0; -} - -LEGlyphID GlyphIterator::getCurrGlyphID() const -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return 0xFFFF; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return 0xFFFF; - } - } - - return glyphStorage[position]; -} - -void GlyphIterator::getCursiveEntryPoint(LEPoint &entryPoint) const -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->getEntryPoint(position, entryPoint); -} - -void GlyphIterator::getCursiveExitPoint(LEPoint &exitPoint) const -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->getExitPoint(position, exitPoint); -} - -void GlyphIterator::setCurrGlyphID(TTGlyphID glyphID) -{ - LEGlyphID glyph = glyphStorage[position]; - - glyphStorage[position] = LE_SET_GLYPH(glyph, glyphID); -} - -void GlyphIterator::setCurrStreamPosition(le_int32 newPosition) -{ - if (direction < 0) { - if (newPosition >= prevLimit) { - position = prevLimit; - return; - } - - if (newPosition <= nextLimit) { - position = nextLimit; - return; - } - } else { - if (newPosition <= prevLimit) { - position = prevLimit; - return; - } - - if (newPosition >= nextLimit) { - position = nextLimit; - return; - } - } - - position = newPosition - direction; - next(); -} - -void GlyphIterator::setCurrGlyphBaseOffset(le_int32 baseOffset) -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->setBaseOffset(position, baseOffset); -} - -void GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, - float xAdvanceAdjust, float yAdvanceAdjust) -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->adjustXPlacement(position, xPlacementAdjust); - glyphPositionAdjustments->adjustYPlacement(position, yPlacementAdjust); - glyphPositionAdjustments->adjustXAdvance(position, xAdvanceAdjust); - glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust); -} - -void GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, - float xAdvanceAdjust, float yAdvanceAdjust) -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->setXPlacement(position, xPlacementAdjust); - glyphPositionAdjustments->setYPlacement(position, yPlacementAdjust); - glyphPositionAdjustments->setXAdvance(position, xAdvanceAdjust); - glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust); -} - -void GlyphIterator::clearCursiveEntryPoint() -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->clearEntryPoint(position); -} - -void GlyphIterator::clearCursiveExitPoint() -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->clearExitPoint(position); -} - -void GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint) -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->setEntryPoint(position, entryPoint, baselineIsLogicalEnd()); -} - -void GlyphIterator::setCursiveExitPoint(LEPoint &exitPoint) -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->setExitPoint(position, exitPoint, baselineIsLogicalEnd()); -} - -void GlyphIterator::setCursiveGlyph() -{ - if (direction < 0) { - if (position <= nextLimit || position >= prevLimit) { - return; - } - } else { - if (position <= prevLimit || position >= nextLimit) { - return; - } - } - - glyphPositionAdjustments->setCursiveGlyph(position, baselineIsLogicalEnd()); -} - -void GlyphIterator::filterResetCache(void) { - filterCacheValid = FALSE; -} - -le_bool GlyphIterator::filterGlyph(le_uint32 index) -{ - LEGlyphID glyphID = glyphStorage[index]; - - if (!filterCacheValid || filterCache.id != glyphID) { - filterCache.id = glyphID; - - le_bool &filterResult = filterCache.result; // NB: Making this a reference to accept the updated value, in case - // we want more fancy cacheing in the future. - if (LE_GET_GLYPH(glyphID) >= 0xFFFE) { - filterResult = TRUE; - } else { - LEErrorCode success = LE_NO_ERROR; - le_int32 glyphClass = gcdNoGlyphClass; - if (glyphClassDefinitionTable.isValid()) { - glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphClassDefinitionTable, glyphID, success); - } - switch (glyphClass) { - case gcdNoGlyphClass: - filterResult = FALSE; - break; - - case gcdSimpleGlyph: - filterResult = (lookupFlags & lfIgnoreBaseGlyphs) != 0; - break; - - case gcdLigatureGlyph: - filterResult = (lookupFlags & lfIgnoreLigatures) != 0; - break; - - case gcdMarkGlyph: - if ((lookupFlags & lfIgnoreMarks) != 0) { - filterResult = TRUE; - } else { - le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift; - - if ((markAttachType != 0) && (markAttachClassDefinitionTable.isValid())) { - filterResult = (markAttachClassDefinitionTable - -> getGlyphClass(markAttachClassDefinitionTable, glyphID, success) != markAttachType); - } else { - filterResult = FALSE; - } - } - break; - - case gcdComponentGlyph: - filterResult = ((lookupFlags & lfIgnoreBaseGlyphs) != 0); - break; - - default: - filterResult = FALSE; - break; - } - } - filterCacheValid = TRUE; - } - - return filterCache.result; -} - -le_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const -{ - if (featureMask == 0) { - return TRUE; - } - - LEErrorCode success = LE_NO_ERROR; - FeatureMask fm = glyphStorage.getAuxData(position, success); - - return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup); -} - -le_bool GlyphIterator::findFeatureTag() -{ - //glyphGroup = 0; - - while (nextInternal()) { - if (hasFeatureTag(FALSE)) { - LEErrorCode success = LE_NO_ERROR; - - glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK); - return TRUE; - } - } - - return FALSE; -} - - -le_bool GlyphIterator::nextInternal(le_uint32 delta) -{ - le_int32 newPosition = position; - - while (newPosition != nextLimit && delta > 0) { - do { - newPosition += direction; - //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta); - } while (newPosition != nextLimit && filterGlyph(newPosition)); - - delta -= 1; - } - - position = newPosition; - - //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta); - return position != nextLimit; -} - -le_bool GlyphIterator::next(le_uint32 delta) -{ - return nextInternal(delta) && hasFeatureTag(TRUE); -} - -le_bool GlyphIterator::prevInternal(le_uint32 delta) -{ - le_int32 newPosition = position; - - while (newPosition != prevLimit && delta > 0) { - do { - newPosition -= direction; - //fprintf(stderr,"%s:%d:%s: newPosition = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, newPosition, delta); - } while (newPosition != prevLimit && filterGlyph(newPosition)); - - delta -= 1; - } - - position = newPosition; - - //fprintf(stderr,"%s:%d:%s: exit position = %d, delta = %d\n", __FILE__, __LINE__, __FUNCTION__, position, delta); - return position != prevLimit; -} - -le_bool GlyphIterator::prev(le_uint32 delta) -{ - return prevInternal(delta) && hasFeatureTag(TRUE); -} - -le_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const -{ - le_int32 component = 0; - le_int32 posn; - - for (posn = position; posn != markPosition; posn += direction) { - if (glyphStorage[posn] == 0xFFFE) { - component += 1; - } - } - - return component; -} - -// This is basically prevInternal except that it -// doesn't take a delta argument, and it doesn't -// filter out 0xFFFE glyphs. -le_bool GlyphIterator::findMark2Glyph() -{ - le_int32 newPosition = position; - - do { - newPosition -= direction; - } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition)); - - position = newPosition; - - return position != prevLimit; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphIterator.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHITERATOR_H -#define __GLYPHITERATOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "GlyphDefinitionTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; -class GlyphPositionAdjustments; - -class GlyphIterator : public UMemory { -public: - GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, - FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader, LEErrorCode &success); - - GlyphIterator(GlyphIterator &that); - - GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask); - - GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags); - - virtual ~GlyphIterator(); - - void reset(le_uint16 newLookupFlags, LETag newFeatureTag); - - le_bool next(le_uint32 delta = 1); - le_bool prev(le_uint32 delta = 1); - le_bool findFeatureTag(); - - le_bool isRightToLeft() const; - le_bool ignoresMarks() const; - - le_bool baselineIsLogicalEnd() const; - - LEGlyphID getCurrGlyphID() const; - le_int32 getCurrStreamPosition() const; - - le_int32 getMarkComponent(le_int32 markPosition) const; - le_bool findMark2Glyph(); - - void getCursiveEntryPoint(LEPoint &entryPoint) const; - void getCursiveExitPoint(LEPoint &exitPoint) const; - - void setCurrGlyphID(TTGlyphID glyphID); - void setCurrStreamPosition(le_int32 position); - void setCurrGlyphBaseOffset(le_int32 baseOffset); - void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, - float xAdvanceAdjust, float yAdvanceAdjust); - - void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust, - float xAdvanceAdjust, float yAdvanceAdjust); - - void clearCursiveEntryPoint(); - void clearCursiveExitPoint(); - void setCursiveEntryPoint(LEPoint &entryPoint); - void setCursiveExitPoint(LEPoint &exitPoint); - void setCursiveGlyph(); - - LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success); - le_int32 applyInsertions(); - -private: - le_bool filterGlyph(le_uint32 index); - le_bool hasFeatureTag(le_bool matchGroup) const; - le_bool nextInternal(le_uint32 delta = 1); - le_bool prevInternal(le_uint32 delta = 1); - - le_int32 direction; - le_int32 position; - le_int32 nextLimit; - le_int32 prevLimit; - - LEGlyphStorage &glyphStorage; - GlyphPositionAdjustments *glyphPositionAdjustments; - - le_int32 srcIndex; - le_int32 destIndex; - le_uint16 lookupFlags; - FeatureMask featureMask; - le_int32 glyphGroup; - - LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable; - LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable; - - GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class - - struct { - LEGlyphID id; - le_bool result; - } filterCache; - le_bool filterCacheValid; - - void filterResetCache(void); -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphLookupTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "ScriptAndLanguage.h" -#include "GlyphLookupTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_bool GlyphLookupTableHeader::coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const -{ - LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset)); - - return (scriptListOffset != 0) && scriptListTable->findScript(scriptListTable, scriptTag, success) .isValid(); -} - -le_bool GlyphLookupTableHeader::coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const -{ - LEReferenceTo<ScriptListTable> scriptListTable(base, success, SWAPW(scriptListOffset)); - LEReferenceTo<LangSysTable> langSysTable = scriptListTable->findLanguage(scriptListTable, - scriptTag, languageTag, success, exactMatch); - - // FIXME: could check featureListOffset, lookupListOffset, and lookup count... - // Note: don't have to SWAPW langSysTable->featureCount to check for non-zero. - return LE_SUCCESS(success)&&langSysTable.isValid() && langSysTable->featureCount != 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphLookupTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __GLYPHLOOKUPTABLES_H -#define __GLYPHLOOKUPTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct GlyphLookupTableHeader -{ - fixed32 version; - Offset scriptListOffset; - Offset featureListOffset; - Offset lookupListOffset; - - le_bool coversScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const; - le_bool coversScriptAndLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; -}; - -U_NAMESPACE_END - -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPositionAdjustments.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,210 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "GlyphPositionAdjustments.h" -#include "LEGlyphStorage.h" -#include "LEFontInstance.h" - -U_NAMESPACE_BEGIN - -#define CHECK_ALLOCATE_ARRAY(array, type, size) \ - if (array == NULL) { \ - array = (type *) new type[size]; \ - } - -GlyphPositionAdjustments::GlyphPositionAdjustments(le_int32 glyphCount) - : fGlyphCount(glyphCount), fEntryExitPoints(NULL), fAdjustments(NULL) -{ - fAdjustments = (Adjustment *) new Adjustment[glyphCount]; -} - -GlyphPositionAdjustments::~GlyphPositionAdjustments() -{ - delete[] fEntryExitPoints; - delete[] fAdjustments; -} - -const LEPoint *GlyphPositionAdjustments::getEntryPoint(le_int32 index, LEPoint &entryPoint) const -{ - if (fEntryExitPoints == NULL) { - return NULL; - } - - return fEntryExitPoints[index].getEntryPoint(entryPoint); -} - -const LEPoint *GlyphPositionAdjustments::getExitPoint(le_int32 index, LEPoint &exitPoint)const -{ - if (fEntryExitPoints == NULL) { - return NULL; - } - - return fEntryExitPoints[index].getExitPoint(exitPoint); -} - -void GlyphPositionAdjustments::clearEntryPoint(le_int32 index) -{ - CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); - - fEntryExitPoints[index].clearEntryPoint(); -} - -void GlyphPositionAdjustments::clearExitPoint(le_int32 index) -{ - CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); - - fEntryExitPoints[index].clearExitPoint(); -} - -void GlyphPositionAdjustments::setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) -{ - CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); - - fEntryExitPoints[index].setEntryPoint(newEntryPoint, baselineIsLogicalEnd); -} - -void GlyphPositionAdjustments::setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) -{ - CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); - - fEntryExitPoints[index].setExitPoint(newExitPoint, baselineIsLogicalEnd); -} - -void GlyphPositionAdjustments::setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd) -{ - CHECK_ALLOCATE_ARRAY(fEntryExitPoints, EntryExitPoint, fGlyphCount); - - fEntryExitPoints[index].setCursiveGlyph(baselineIsLogicalEnd); -} - -void GlyphPositionAdjustments::applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance) -{ - if (! hasCursiveGlyphs()) { - return; - } - - le_int32 start = 0, end = fGlyphCount, dir = 1; - le_int32 firstExitPoint = -1, lastExitPoint = -1; - LEPoint entryAnchor, exitAnchor, pixels; - LEGlyphID lastExitGlyphID = 0; - float baselineAdjustment = 0; - - // This removes a possible warning about - // using exitAnchor before it's been initialized. - exitAnchor.fX = exitAnchor.fY = 0; - - if (rightToLeft) { - start = fGlyphCount - 1; - end = -1; - dir = -1; - } - - for (le_int32 i = start; i != end; i += dir) { - LEGlyphID glyphID = glyphStorage[i]; - - if (isCursiveGlyph(i)) { - if (lastExitPoint >= 0 && getEntryPoint(i, entryAnchor) != NULL) { - float anchorDiffX = exitAnchor.fX - entryAnchor.fX; - float anchorDiffY = exitAnchor.fY - entryAnchor.fY; - - baselineAdjustment += anchorDiffY; - adjustYPlacement(i, baselineAdjustment); - - if (rightToLeft) { - LEPoint secondAdvance; - - fontInstance->getGlyphAdvance(glyphID, pixels); - fontInstance->pixelsToUnits(pixels, secondAdvance); - - adjustXAdvance(i, -(anchorDiffX + secondAdvance.fX)); - } else { - LEPoint firstAdvance; - - fontInstance->getGlyphAdvance(lastExitGlyphID, pixels); - fontInstance->pixelsToUnits(pixels, firstAdvance); - - adjustXAdvance(lastExitPoint, anchorDiffX - firstAdvance.fX); - } - } - - lastExitPoint = i; - - if (getExitPoint(i, exitAnchor) != NULL) { - if (firstExitPoint < 0) { - firstExitPoint = i; - } - - lastExitGlyphID = glyphID; - } else { - if (baselineIsLogicalEnd(i) && firstExitPoint >= 0 && lastExitPoint >= 0) { - le_int32 limit = lastExitPoint /*+ dir*/; - LEPoint dummyAnchor; - - if (getEntryPoint(i, dummyAnchor) != NULL) { - limit += dir; - } - - for (le_int32 j = firstExitPoint; j != limit; j += dir) { - if (isCursiveGlyph(j)) { - adjustYPlacement(j, -baselineAdjustment); - } - } - } - - firstExitPoint = lastExitPoint = -1; - baselineAdjustment = 0; - } - } - } -} - -LEPoint *GlyphPositionAdjustments::EntryExitPoint::getEntryPoint(LEPoint &entryPoint) const -{ - if (fFlags & EEF_HAS_ENTRY_POINT) { - entryPoint = fEntryPoint; - return &entryPoint; - } - - return NULL; -} - -LEPoint *GlyphPositionAdjustments::EntryExitPoint::getExitPoint(LEPoint &exitPoint) const -{ - if (fFlags & EEF_HAS_EXIT_POINT) { - exitPoint = fExitPoint; - return &exitPoint; - } - - return NULL; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPositionAdjustments.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,401 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHPOSITIONADJUSTMENTS_H -#define __GLYPHPOSITIONADJUSTMENTS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; -class LEFontInstance; - -class GlyphPositionAdjustments : public UMemory -{ -private: - class Adjustment : public UMemory { - public: - - inline Adjustment(); - inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1); - inline ~Adjustment(); - - inline float getXPlacement() const; - inline float getYPlacement() const; - inline float getXAdvance() const; - inline float getYAdvance() const; - - inline le_int32 getBaseOffset() const; - - inline void setXPlacement(float newXPlacement); - inline void setYPlacement(float newYPlacement); - inline void setXAdvance(float newXAdvance); - inline void setYAdvance(float newYAdvance); - - inline void setBaseOffset(le_int32 newBaseOffset); - - inline void adjustXPlacement(float xAdjustment); - inline void adjustYPlacement(float yAdjustment); - inline void adjustXAdvance(float xAdjustment); - inline void adjustYAdvance(float yAdjustment); - - private: - float xPlacement; - float yPlacement; - float xAdvance; - float yAdvance; - - le_int32 baseOffset; - - // allow copying of this class because all of its fields are simple types - }; - - class EntryExitPoint : public UMemory - { - public: - inline EntryExitPoint(); - inline ~EntryExitPoint(); - - inline le_bool isCursiveGlyph() const; - inline le_bool baselineIsLogicalEnd() const; - - LEPoint *getEntryPoint(LEPoint &entryPoint) const; - LEPoint *getExitPoint(LEPoint &exitPoint) const; - - inline void clearEntryPoint(); - inline void clearExitPoint(); - inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); - inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); - inline void setCursiveGlyph(le_bool baselineIsLogicalEnd); - - private: - enum EntryExitFlags - { - EEF_HAS_ENTRY_POINT = 0x80000000L, - EEF_HAS_EXIT_POINT = 0x40000000L, - EEF_IS_CURSIVE_GLYPH = 0x20000000L, - EEF_BASELINE_IS_LOGICAL_END = 0x10000000L - }; - - le_uint32 fFlags; - LEPoint fEntryPoint; - LEPoint fExitPoint; - }; - - le_int32 fGlyphCount; - EntryExitPoint *fEntryExitPoints; - Adjustment *fAdjustments; - - GlyphPositionAdjustments(); - -public: - GlyphPositionAdjustments(le_int32 glyphCount); - ~GlyphPositionAdjustments(); - - inline le_bool hasCursiveGlyphs() const; - inline le_bool isCursiveGlyph(le_int32 index) const; - inline le_bool baselineIsLogicalEnd(le_int32 index) const; - - const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const; - const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const; - - inline float getXPlacement(le_int32 index) const; - inline float getYPlacement(le_int32 index) const; - inline float getXAdvance(le_int32 index) const; - inline float getYAdvance(le_int32 index) const; - - inline le_int32 getBaseOffset(le_int32 index) const; - - inline void setXPlacement(le_int32 index, float newXPlacement); - inline void setYPlacement(le_int32 index, float newYPlacement); - inline void setXAdvance(le_int32 index, float newXAdvance); - inline void setYAdvance(le_int32 index, float newYAdvance); - - inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset); - - inline void adjustXPlacement(le_int32 index, float xAdjustment); - inline void adjustYPlacement(le_int32 index, float yAdjustment); - inline void adjustXAdvance(le_int32 index, float xAdjustment); - inline void adjustYAdvance(le_int32 index, float yAdjustment); - - void clearEntryPoint(le_int32 index); - void clearExitPoint(le_int32 index); - void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); - void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); - void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); - - void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance); -}; - -inline GlyphPositionAdjustments::Adjustment::Adjustment() - : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1) -{ - // nothing else to do! -} - -inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff) - : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff) -{ - // nothing else to do! -} - -inline GlyphPositionAdjustments::Adjustment::~Adjustment() -{ - // nothing to do! -} - -inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const -{ - return xPlacement; -} - -inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const -{ - return yPlacement; -} - -inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const -{ - return xAdvance; -} - -inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const -{ - return yAdvance; -} - -inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const -{ - return baseOffset; -} - -inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement) -{ - xPlacement = newXPlacement; -} - -inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement) -{ - yPlacement = newYPlacement; -} - -inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance) -{ - xAdvance = newXAdvance; -} - -inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance) -{ - yAdvance = newYAdvance; -} - -inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset) -{ - baseOffset = newBaseOffset; -} - -inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment) -{ - xPlacement += xAdjustment; -} - -inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment) -{ - yPlacement += yAdjustment; -} - -inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment) -{ - xAdvance += xAdjustment; -} - -inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment) -{ - yAdvance += yAdjustment; -} - -inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint() - : fFlags(0) -{ - fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0; -} - -inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint() -{ - // nothing special to do -} - -inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const -{ - return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0; -} - -inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const -{ - return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; -} - -inline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint() -{ - fFlags &= ~EEF_HAS_ENTRY_POINT; -} - -inline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint() -{ - fFlags &= ~EEF_HAS_EXIT_POINT; -} - -inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) -{ - if (baselineIsLogicalEnd) { - fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); - } else { - fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH); - } - - fEntryPoint = newEntryPoint; -} - -inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) -{ - if (baselineIsLogicalEnd) { - fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); - } else { - fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH); - } - - fExitPoint = newExitPoint; -} - -inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd) -{ - if (baselineIsLogicalEnd) { - fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); - } else { - fFlags |= EEF_IS_CURSIVE_GLYPH; - } -} - -inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const -{ - return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph(); -} - -inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const -{ - return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd(); -} - -inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const -{ - return fAdjustments[index].getXPlacement(); -} - -inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const -{ - return fAdjustments[index].getYPlacement(); -} - -inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const -{ - return fAdjustments[index].getXAdvance(); -} - -inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const -{ - return fAdjustments[index].getYAdvance(); -} - - -inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const -{ - return fAdjustments[index].getBaseOffset(); -} - -inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement) -{ - fAdjustments[index].setXPlacement(newXPlacement); -} - -inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement) -{ - fAdjustments[index].setYPlacement(newYPlacement); -} - -inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance) -{ - fAdjustments[index].setXAdvance(newXAdvance); -} - -inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance) -{ - fAdjustments[index].setYAdvance(newYAdvance); -} - -inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset) -{ - fAdjustments[index].setBaseOffset(newBaseOffset); -} - -inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment) -{ - fAdjustments[index].adjustXPlacement(xAdjustment); -} - -inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment) -{ - fAdjustments[index].adjustYPlacement(yAdjustment); -} - -inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment) -{ - fAdjustments[index].adjustXAdvance(xAdjustment); -} - -inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment) -{ - fAdjustments[index].adjustYAdvance(yAdjustment); -} - -inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const -{ - return fEntryExitPoints != NULL; -} - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPositioningTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" -#include "GlyphPosnLookupProc.h" -#include "CursiveAttachmentSubtables.h" -#include "LEGlyphStorage.h" -#include "GlyphPositionAdjustments.h" - -U_NAMESPACE_BEGIN - -void GlyphPositioningTableHeader::process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, le_bool rightToLeft, - LETag scriptTag, LETag languageTag, - const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success, - const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const -{ - if (LE_FAILURE(success)) { - return; - } - - GlyphPositioningLookupProcessor processor(base, scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success); - if (LE_FAILURE(success)) { - return; - } - - processor.process(glyphStorage, glyphPositionAdjustments, rightToLeft, glyphDefinitionTableHeader, fontInstance, success); - - glyphPositionAdjustments->applyCursiveAdjustments(glyphStorage, rightToLeft, fontInstance); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPositioningTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHPOSITIONINGTABLES_H -#define __GLYPHPOSITIONINGTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "GlyphLookupTables.h" -#include "LETableReference.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class LEGlyphStorage; -class LEGlyphFilter; -class GlyphPositionAdjustments; -struct GlyphDefinitionTableHeader; - -struct GlyphPositioningTableHeader : public GlyphLookupTableHeader -{ - void process(const LEReferenceTo<GlyphPositioningTableHeader> &base, LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, - le_bool rightToLeft, LETag scriptTag, LETag languageTag, - const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, LEErrorCode &success, - const LEFontInstance *fontInstance, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool featureOrder) const; -}; - -enum GlyphPositioningSubtableTypes -{ - gpstSingle = 1, - gpstPair = 2, - gpstCursive = 3, - gpstMarkToBase = 4, - gpstMarkToLigature = 5, - gpstMarkToMark = 6, - gpstContext = 7, - gpstChainedContext = 8, - gpstExtension = 9 -}; - -typedef LookupSubtable GlyphPositioningSubtable; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPosnLookupProc.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,194 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998 - 2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "ICUFeatures.h" -#include "Lookups.h" -#include "ScriptAndLanguage.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" -#include "SinglePositioningSubtables.h" -#include "PairPositioningSubtables.h" -#include "CursiveAttachmentSubtables.h" -#include "MarkToBasePosnSubtables.h" -#include "MarkToLigaturePosnSubtables.h" -#include "MarkToMarkPosnSubtables.h" -//#include "ContextualPositioningSubtables.h" -#include "ContextualSubstSubtables.h" -#include "ExtensionSubtables.h" -#include "LookupProcessor.h" -#include "GlyphPosnLookupProc.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -// Aside from the names, the contextual positioning subtables are -// the same as the contextual substitution subtables. -typedef ContextualSubstitutionSubtable ContextualPositioningSubtable; -typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable; - -GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor( - const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader, - LETag scriptTag, - LETag languageTag, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode& success) - : LookupProcessor( - glyphPositioningTableHeader, - SWAPW(glyphPositioningTableHeader->scriptListOffset), - SWAPW(glyphPositioningTableHeader->featureListOffset), - SWAPW(glyphPositioningTableHeader->lookupListOffset), - scriptTag, - languageTag, - featureMap, - featureMapCount, - featureOrder, - success - ) -{ - // anything? -} - -GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor() -{ -} - -le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint32 delta = 0; - - //_LETRACE("attempting lookupType #%d", lookupType); - - switch(lookupType) - { - case 0: - break; - - case gpstSingle: - { - LEReferenceTo<SinglePositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstPair: - { - LEReferenceTo<PairPositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstCursive: - { - LEReferenceTo<CursiveAttachmentSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstMarkToBase: - { - LEReferenceTo<MarkToBasePositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstMarkToLigature: - { - LEReferenceTo<MarkToLigaturePositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstMarkToMark: - { - LEReferenceTo<MarkToMarkPositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, fontInstance, success); - break; - } - - case gpstContext: - { - LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this , glyphIterator, fontInstance, success); - break; - } - - case gpstChainedContext: - { - const LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this, glyphIterator, fontInstance, success); - break; - } - - case gpstExtension: - { - const LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this, lookupType, glyphIterator, fontInstance, success); - break; - } - - default: - break; - } - -#if LE_TRACE - if(delta != 0) { - _LETRACE("GlyphPositioningLookupProcessor applied #%d -> delta %d @ %d", lookupType, delta, glyphIterator->getCurrStreamPosition()); - } -#endif - - return delta; -} - -GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphPosnLookupProc.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHPOSITIONINGLOOKUPPROCESSOR_H -#define __GLYPHPOSITIONINGLOOKUPPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "ICUFeatures.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" - -U_NAMESPACE_BEGIN - -class GlyphPositioningLookupProcessor : public LookupProcessor -{ -public: - GlyphPositioningLookupProcessor(const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader, - LETag scriptTag, - LETag languageTag, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode& success); - - virtual ~GlyphPositioningLookupProcessor(); - - virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; - -protected: - GlyphPositioningLookupProcessor(); - -private: - - GlyphPositioningLookupProcessor(const GlyphPositioningLookupProcessor &other); // forbid copying of this class - GlyphPositioningLookupProcessor &operator=(const GlyphPositioningLookupProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphSubstLookupProc.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "ICUFeatures.h" -#include "Lookups.h" -#include "ScriptAndLanguage.h" -#include "GlyphDefinitionTables.h" -#include "GlyphSubstitutionTables.h" -#include "SingleSubstitutionSubtables.h" -#include "MultipleSubstSubtables.h" -#include "AlternateSubstSubtables.h" -#include "LigatureSubstSubtables.h" -#include "ContextualSubstSubtables.h" -#include "ExtensionSubtables.h" -#include "LookupProcessor.h" -#include "GlyphSubstLookupProc.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor( - const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader, - LETag scriptTag, - LETag languageTag, - const LEGlyphFilter *filter, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode& success) - : LookupProcessor( - glyphSubstitutionTableHeader, - SWAPW(glyphSubstitutionTableHeader->scriptListOffset), - SWAPW(glyphSubstitutionTableHeader->featureListOffset), - SWAPW(glyphSubstitutionTableHeader->lookupListOffset), - scriptTag, languageTag, featureMap, featureMapCount, featureOrder, success), fFilter(filter) -{ - // anything? -} - -GlyphSubstitutionLookupProcessor::GlyphSubstitutionLookupProcessor() -{ -} - -le_uint32 GlyphSubstitutionLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint32 delta = 0; - - switch(lookupType) - { - case 0: - break; - - case gsstSingle: - { - const LEReferenceTo<SingleSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, success, fFilter); - break; - } - - case gsstMultiple: - { - const LEReferenceTo<MultipleSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, success, fFilter); - break; - } - - case gsstAlternate: - { - const LEReferenceTo<AlternateSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, success, fFilter); - break; - } - - case gsstLigature: - { - const LEReferenceTo<LigatureSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, glyphIterator, success, fFilter); - break; - } - - case gsstContext: - { - const LEReferenceTo<ContextualSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this, glyphIterator, fontInstance, success); - break; - } - - case gsstChainingContext: - { - const LEReferenceTo<ChainingContextualSubstitutionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this, glyphIterator, fontInstance, success); - break; - } - - case gsstExtension: - { - const LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success); - - delta = subtable->process(subtable, this, lookupType, glyphIterator, fontInstance, success); - break; - } - - default: - break; - } - - return delta; -} - -GlyphSubstitutionLookupProcessor::~GlyphSubstitutionLookupProcessor() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphSubstLookupProc.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H -#define __GLYPHSUBSTITUTIONLOOKUPPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "ICUFeatures.h" -#include "GlyphDefinitionTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" - -U_NAMESPACE_BEGIN - -class GlyphSubstitutionLookupProcessor : public LookupProcessor -{ -public: - GlyphSubstitutionLookupProcessor(const LEReferenceTo<GlyphSubstitutionTableHeader> &glyphSubstitutionTableHeader, - LETag scriptTag, - LETag languageTag, - const LEGlyphFilter *filter, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode& success); - - virtual ~GlyphSubstitutionLookupProcessor(); - - virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const; - -protected: - GlyphSubstitutionLookupProcessor(); - -private: - const LEGlyphFilter *fFilter; - - GlyphSubstitutionLookupProcessor(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class - GlyphSubstitutionLookupProcessor &operator=(const GlyphSubstitutionLookupProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphSubstitutionTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "GlyphDefinitionTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphSubstLookupProc.h" -#include "ScriptAndLanguage.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_int32 GlyphSubstitutionTableHeader::process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base, - LEGlyphStorage &glyphStorage, - le_bool rightToLeft, - LETag scriptTag, - LETag languageTag, - const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, - const LEGlyphFilter *filter, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - GlyphSubstitutionLookupProcessor processor(base, scriptTag, languageTag, filter, featureMap, featureMapCount, featureOrder, success); - return processor.process(glyphStorage, NULL, rightToLeft, glyphDefinitionTableHeader, NULL, success); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/GlyphSubstitutionTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __GLYPHSUBSTITUTIONTABLES_H -#define __GLYPHSUBSTITUTIONTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "GlyphLookupTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; -class LEGlyphFilter; -struct GlyphDefinitionTableHeader; - -struct GlyphSubstitutionTableHeader : public GlyphLookupTableHeader -{ - le_int32 process(const LEReferenceTo<GlyphSubstitutionTableHeader> &base, - LEGlyphStorage &glyphStorage, - le_bool rightToLeft, - LETag scriptTag, - LETag languageTag, - const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, - const LEGlyphFilter *filter, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool featureOrder, - LEErrorCode &success) const; -}; - -enum GlyphSubstitutionSubtableTypes -{ - gsstSingle = 1, - gsstMultiple = 2, - gsstAlternate = 3, - gsstLigature = 4, - gsstContext = 5, - gsstChainingContext = 6, - gsstExtension = 7, - gsstReverseChaining = 8 -}; - -typedef LookupSubtable GlyphSubstitutionSubtable; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/HanLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * HanLayoutEngine.cpp: OpenType processing for Han fonts. - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LELanguages.h" - -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" -#include "HanLayoutEngine.h" -#include "ScriptAndLanguageTags.h" -#include "LEGlyphStorage.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HanOpenTypeLayoutEngine) - -#define loclFeatureTag LE_LOCL_FEATURE_TAG -#define smplFeatureTag LE_SMPL_FEATURE_TAG -#define tradFeatureTag LE_TRAD_FEATURE_TAG - -#define loclFeatureMask 0x80000000UL -#define smplFeatureMask 0x40000000UL -#define tradFeatureMask 0x20000000UL - -static const FeatureMap featureMap[] = -{ - {loclFeatureTag, loclFeatureMask}, - {smplFeatureTag, smplFeatureMask}, - {tradFeatureTag, tradFeatureMask} -}; - -static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); - -#define features (loclFeatureMask) - -HanOpenTypeLayoutEngine::HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) -{ - fFeatureMap = featureMap; - fFeatureMapCount = featureMapCount; -} - -HanOpenTypeLayoutEngine::~HanOpenTypeLayoutEngine() -{ - // nothing to do -} - -le_int32 HanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(count, FALSE, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - return 0; - } - - // FIXME: do we want to add the 'trad' feature for 'ZHT' and the - // 'smpl' feature for 'ZHS'? If we do this, we can remove the exact - // flag from the language tag lookups, so we can use these features - // with the default LangSys... - for (le_int32 i = 0; i < count; i += 1) { - glyphStorage.setAuxData(i, features, success); - } - - return count; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/HanLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * HanLayoutEngine.h: OpenType processing for Han fonts. - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved. - */ - -#ifndef __HANLAYOUTENGINE_H -#define __HANLAYOUTENGINE_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" - -#include "GlyphSubstitutionTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -/** - * This class implements OpenType layout for Han fonts. It overrides - * the characerProcessing method to assign the correct OpenType feature - * tags for the CJK language-specific forms. - * - * @internal - */ -class HanOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of HanOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has a - * Han OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - HanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTablem, LEErrorCode &success); - - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~HanOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Han OpenType character processing. It assigns the OpenType feature - * tags to the characters to generate the correct language-specific variants. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param glyphStorage - the object holding the glyph storage. The char index and auxillary data arrays will be set. - * - * Output parameters: - * @param outChars - the output character arrayt - * @param charIndices - the output character index array - * @param featureTags - the output feature tag array - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/HangulLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,363 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * HangulLayoutEngine.cpp: OpenType processing for Han fonts. - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved. - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LELanguages.h" - -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" -#include "HangulLayoutEngine.h" -#include "ScriptAndLanguageTags.h" -#include "LEGlyphStorage.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(HangulOpenTypeLayoutEngine) - - -#define FEATURE_MAP(name) {name ## FeatureTag, name ## FeatureMask} - -#define LJMO_FIRST 0x1100 -#define LJMO_LAST 0x1159 -#define LJMO_FILL 0x115F -#define LJMO_COUNT 19 - -#define VJMO_FIRST 0x1161 -#define VJMO_LAST 0x11A2 -#define VJMO_FILL 0x1160 -#define VJMO_COUNT 21 - -#define TJMO_FIRST 0x11A7 -#define TJMO_LAST 0x11F9 -#define TJMO_COUNT 28 - -#define HSYL_FIRST 0xAC00 -#define HSYL_COUNT 11172 -#define HSYL_LVCNT (VJMO_COUNT * TJMO_COUNT) - -// Character classes -enum -{ - CC_L = 0, - CC_V, - CC_T, - CC_LV, - CC_LVT, - CC_X, - CC_COUNT -}; - -// Action flags -#define AF_L 1 -#define AF_V 2 -#define AF_T 4 - -// Actions -#define a_N 0 -#define a_L (AF_L) -#define a_V (AF_V) -#define a_T (AF_T) -#define a_VT (AF_V | AF_T) -#define a_LV (AF_L | AF_V) -#define a_LVT (AF_L | AF_V | AF_T) - -typedef struct -{ - le_int32 newState; - le_int32 actionFlags; -} StateTransition; - -static const StateTransition stateTable[][CC_COUNT] = -{ -// L V T LV LVT X - { {1, a_L}, {2, a_LV}, {3, a_LVT}, {2, a_LV}, {3, a_LVT}, {4, a_T}}, // 0 - start - { {1, a_L}, {2, a_V}, {3, a_VT}, {2, a_LV}, {3, a_LVT}, {-1, a_V}}, // 1 - L+ - {{-1, a_N}, {2, a_V}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 2 - L+V+ - {{-1, a_N}, {-1, a_N}, {3, a_T}, {-1, a_N}, {-1, a_N}, {-1, a_N}}, // 3 - L+V+T* - {{-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {-1, a_N}, {4, a_T}} // 4 - X+ -}; - - -#define ccmpFeatureTag LE_CCMP_FEATURE_TAG -#define ljmoFeatureTag LE_LJMO_FEATURE_TAG -#define vjmoFeatureTag LE_VJMO_FEATURE_TAG -#define tjmoFeatureTag LE_TJMO_FEATURE_TAG - -#define ccmpFeatureMask 0x80000000UL -#define ljmoFeatureMask 0x40000000UL -#define vjmoFeatureMask 0x20000000UL -#define tjmoFeatureMask 0x10000000UL - -static const FeatureMap featureMap[] = -{ - {ccmpFeatureTag, ccmpFeatureMask}, - {ljmoFeatureTag, ljmoFeatureMask}, - {vjmoFeatureTag, vjmoFeatureMask}, - {tjmoFeatureTag, tjmoFeatureMask} -}; - -static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); - -#define nullFeatures 0 -#define ljmoFeatures (ccmpFeatureMask | ljmoFeatureMask) -#define vjmoFeatures (ccmpFeatureMask | vjmoFeatureMask | ljmoFeatureMask | tjmoFeatureMask) -#define tjmoFeatures (ccmpFeatureMask | tjmoFeatureMask | ljmoFeatureMask | vjmoFeatureMask) - -static le_int32 compose(LEUnicode lead, LEUnicode vowel, LEUnicode trail, LEUnicode &syllable) -{ - le_int32 lIndex = lead - LJMO_FIRST; - le_int32 vIndex = vowel - VJMO_FIRST; - le_int32 tIndex = trail - TJMO_FIRST; - le_int32 result = 3; - - if ((lIndex < 0 || lIndex >= LJMO_COUNT ) || (vIndex < 0 || vIndex >= VJMO_COUNT)) { - return 0; - } - - if (tIndex <= 0 || tIndex >= TJMO_COUNT) { - tIndex = 0; - result = 2; - } - - syllable = (LEUnicode) ((lIndex * VJMO_COUNT + vIndex) * TJMO_COUNT + tIndex + HSYL_FIRST); - - return result; -} - -static le_int32 decompose(LEUnicode syllable, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) -{ - le_int32 sIndex = syllable - HSYL_FIRST; - - if (sIndex < 0 || sIndex >= HSYL_COUNT) { - return 0; - } - - lead = (LEUnicode)(LJMO_FIRST + (sIndex / HSYL_LVCNT)); - vowel = VJMO_FIRST + (sIndex % HSYL_LVCNT) / TJMO_COUNT; - trail = TJMO_FIRST + (sIndex % TJMO_COUNT); - - if (trail == TJMO_FIRST) { - return 2; - } - - return 3; -} - -static le_int32 getCharClass(LEUnicode ch, LEUnicode &lead, LEUnicode &vowel, LEUnicode &trail) -{ - lead = LJMO_FILL; - vowel = VJMO_FILL; - trail = TJMO_FIRST; - - if (ch >= LJMO_FIRST && ch <= LJMO_LAST) { - lead = ch; - return CC_L; - } - - if (ch >= VJMO_FIRST && ch <= VJMO_LAST) { - vowel = ch; - return CC_V; - } - - if (ch > TJMO_FIRST && ch <= TJMO_LAST) { - trail = ch; - return CC_T; - } - - le_int32 c = decompose(ch, lead, vowel, trail); - - if (c == 2) { - return CC_LV; - } - - if (c == 3) { - return CC_LVT; - } - - trail = ch; - return CC_X; -} - -HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, gsubTable, success) -{ - fFeatureMap = featureMap; - fFeatureMapCount = featureMapCount; - fFeatureOrder = TRUE; -} - -HangulOpenTypeLayoutEngine::HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 /*languageCode*/, - le_int32 typoFlags, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, korLanguageCode, typoFlags, success) -{ - fFeatureMap = featureMap; - fFeatureMapCount = featureMapCount; - fFeatureOrder = TRUE; -} - -HangulOpenTypeLayoutEngine::~HangulOpenTypeLayoutEngine() -{ - // nothing to do -} - -le_int32 HangulOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - le_int32 worstCase = count * 3; - - outChars = LE_NEW_ARRAY(LEUnicode, worstCase); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - le_int32 outCharCount = 0; - le_int32 limit = offset + count; - le_int32 i = offset; - - while (i < limit) { - le_int32 state = 0; - le_int32 inStart = i; - le_int32 outStart = outCharCount; - - while( i < limit) { - LEUnicode lead = 0; - LEUnicode vowel = 0; - LEUnicode trail = 0; - le_int32 chClass = getCharClass(chars[i], lead, vowel, trail); - const StateTransition transition = stateTable[state][chClass]; - - if (chClass == CC_X) { - /* Any character of type X will be stored as a trail jamo */ - if ((transition.actionFlags & AF_T) != 0) { - outChars[outCharCount] = trail; - glyphStorage.setCharIndex(outCharCount, i-offset, success); - glyphStorage.setAuxData(outCharCount++, nullFeatures, success); - } - } else { - /* Any Hangul will be fully decomposed. Output the decomposed characters. */ - if ((transition.actionFlags & AF_L) != 0) { - outChars[outCharCount] = lead; - glyphStorage.setCharIndex(outCharCount, i-offset, success); - glyphStorage.setAuxData(outCharCount++, ljmoFeatures, success); - } - - if ((transition.actionFlags & AF_V) != 0) { - outChars[outCharCount] = vowel; - glyphStorage.setCharIndex(outCharCount, i-offset, success); - glyphStorage.setAuxData(outCharCount++, vjmoFeatures, success); - } - - if ((transition.actionFlags & AF_T) != 0) { - outChars[outCharCount] = trail; - glyphStorage.setCharIndex(outCharCount, i-offset, success); - glyphStorage.setAuxData(outCharCount++, tjmoFeatures, success); - } - } - - state = transition.newState; - - /* Negative next state means stop. */ - if (state < 0) { - break; - } - - i += 1; - } - - le_int32 inLength = i - inStart; - le_int32 outLength = outCharCount - outStart; - - /* - * See if the syllable can be composed into a single character. There are 5 - * possible cases: - * - * Input Decomposed to Compose to - * LV L, V LV - * LVT L, V, T LVT - * L, V L, V LV, DEL - * LV, T L, V, T LVT, DEL - * L, V, T L, V, T LVT, DEL, DEL - */ - if ((inLength >= 1 && inLength <= 3) && (outLength == 2 || outLength == 3)) { - LEUnicode syllable = 0x0000; - LEUnicode lead = outChars[outStart]; - LEUnicode vowel = outChars[outStart + 1]; - LEUnicode trail = outLength == 3? outChars[outStart + 2] : TJMO_FIRST; - - /* - * If the composition consumes the whole decomposed syllable, - * we can use it. - */ - if (compose(lead, vowel, trail, syllable) == outLength) { - outCharCount = outStart; - outChars[outCharCount] = syllable; - glyphStorage.setCharIndex(outCharCount, inStart-offset, success); - glyphStorage.setAuxData(outCharCount++, nullFeatures, success); - - /* - * Replace the rest of the input characters with DEL. - */ - for(le_int32 d = inStart + 1; d < i; d += 1) { - outChars[outCharCount] = 0xFFFF; - glyphStorage.setCharIndex(outCharCount, d - offset, success); - glyphStorage.setAuxData(outCharCount++, nullFeatures, success); - } - } - } - } - - glyphStorage.adoptGlyphCount(outCharCount); - return outCharCount; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/HangulLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __HANGULAYOUTENGINE_H -#define __HANGULAYOUTENGINE_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "LEGlyphFilter.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -class MPreFixups; -class LEGlyphStorage; - -/** - * This class implements OpenType layout for Old Hangul OpenType fonts, as - * specified by Microsoft in "Creating and Supporting OpenType Fonts for - * The Korean Hangul Script" (http://www.microsoft.com/typography/otfntdev/hangulot/default.htm) - * - * This class overrides the characterProcessing method to do Hangul character processing. - * (See the MS spec. for more details) - * - * @internal - */ -class HangulOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of HangulOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * Hangul OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - HangulOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~HangulOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Hangul OpenType character processing. It assigns the OpenType feature - * tags to the characters, and may compose a character sequence into a modern Hangul syllable, - * or decompose a modern Hangul syllable if it forms part of an old Hangul syllable. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. - * the auxillary data array will be set to the feature tags. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/ICUFeatures.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __ICUFEATURES_H -#define __ICUFEATURES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct FeatureRecord -{ - ATag featureTag; - Offset featureTableOffset; -}; - -struct FeatureTable -{ - Offset featureParamsOffset; - le_uint16 lookupCount; - le_uint16 lookupListIndexArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(FeatureTable, lookupListIndexArray) - -struct FeatureListTable -{ - le_uint16 featureCount; - FeatureRecord featureRecordArray[ANY_NUMBER]; - - LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const; - -#if 0 - const LEReferenceTo<FeatureTable> getFeatureTable(const LETableReference &base, LETag featureTag, LEErrorCode &success) const; -#endif -}; - -LE_VAR_ARRAY(FeatureListTable, featureRecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicClassTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,493 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "IndicReordering.h" - -U_NAMESPACE_BEGIN - -// Split matra table indices -#define _x1 (1 << CF_INDEX_SHIFT) -#define _x2 (2 << CF_INDEX_SHIFT) -#define _x3 (3 << CF_INDEX_SHIFT) -#define _x4 (4 << CF_INDEX_SHIFT) -#define _x5 (5 << CF_INDEX_SHIFT) -#define _x6 (6 << CF_INDEX_SHIFT) -#define _x7 (7 << CF_INDEX_SHIFT) -#define _x8 (8 << CF_INDEX_SHIFT) -#define _x9 (9 << CF_INDEX_SHIFT) - -// simple classes -#define _xx (CC_RESERVED) -#define _ma (CC_VOWEL_MODIFIER | CF_POS_ABOVE) -#define _mp (CC_VOWEL_MODIFIER | CF_POS_AFTER) -#define _sa (CC_STRESS_MARK | CF_POS_ABOVE) -#define _sb (CC_STRESS_MARK | CF_POS_BELOW) -#define _iv (CC_INDEPENDENT_VOWEL) -#define _i2 (CC_INDEPENDENT_VOWEL_2) -#define _i3 (CC_INDEPENDENT_VOWEL_3) -#define _ct (CC_CONSONANT | CF_CONSONANT) -#define _cn (CC_CONSONANT_WITH_NUKTA | CF_CONSONANT) -#define _nu (CC_NUKTA) -#define _dv (CC_DEPENDENT_VOWEL) -#define _dl (_dv | CF_POS_BEFORE) -#define _db (_dv | CF_POS_BELOW) -#define _da (_dv | CF_POS_ABOVE) -#define _dr (_dv | CF_POS_AFTER) -#define _lm (_dv | CF_LENGTH_MARK) -#define _l1 (CC_SPLIT_VOWEL_PIECE_1 | CF_POS_BEFORE) -#define _a1 (CC_SPLIT_VOWEL_PIECE_1 | CF_POS_ABOVE) -#define _b2 (CC_SPLIT_VOWEL_PIECE_2 | CF_POS_BELOW) -#define _r2 (CC_SPLIT_VOWEL_PIECE_2 | CF_POS_AFTER) -#define _m2 (CC_SPLIT_VOWEL_PIECE_2 | CF_LENGTH_MARK) -#define _m3 (CC_SPLIT_VOWEL_PIECE_3 | CF_LENGTH_MARK) -#define _vr (CC_VIRAMA) -#define _al (CC_AL_LAKUNA) - -// split matras -#define _s1 (_dv | _x1) -#define _s2 (_dv | _x2) -#define _s3 (_dv | _x3) -#define _s4 (_dv | _x4) -#define _s5 (_dv | _x5) -#define _s6 (_dv | _x6) -#define _s7 (_dv | _x7) -#define _s8 (_dv | _x8) -#define _s9 (_dv | _x9) - -// consonants with special forms -// NOTE: this assumes that no consonants with nukta have -// special forms... (Bengali RA?) -#define _bb (_ct | CF_BELOW_BASE) -#define _pb (_ct | CF_POST_BASE) -#define _fb (_ct | CF_PRE_BASE) -#define _vt (_bb | CF_VATTU) -#define _rv (_vt | CF_REPH) -#define _rp (_pb | CF_REPH) -#define _rb (_bb | CF_REPH) - -// -// Character class tables -// -static const IndicClassTable::CharClass devaCharClasses[] = -{ - _xx, _ma, _ma, _mp, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0900 - 090F - _iv, _iv, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0910 - 091F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _ct, // 0920 - 092F - _rv, _cn, _ct, _ct, _cn, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0930 - 093F - _dr, _db, _db, _db, _db, _da, _da, _da, _da, _dr, _dr, _dr, _dr, _vr, _xx, _xx, // 0940 - 094F - _xx, _sa, _sb, _sa, _sa, _xx, _xx, _xx, _cn, _cn, _cn, _cn, _cn, _cn, _cn, _cn, // 0950 - 095F - _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0960 - 096F - _xx // 0970 -}; - -static const IndicClassTable::CharClass bengCharClasses[] = -{ - _xx, _ma, _mp, _mp, _xx, _i2, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _i2, // 0980 - 098F - _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0990 - 099F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _bb, _ct, _ct, _pb, // 09A0 - 09AF - _rv, _xx, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _dl, // 09B0 - 09BF - _dr, _db, _db, _db, _db, _xx, _xx, _l1, _dl, _xx, _xx, _s1, _s2, _vr, _xx, _xx, // 09C0 - 09CF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 09D0 - 09DF - _iv, _iv, _dv, _dv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 09E0 - 09EF - _rv, _ct, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 09F0 - 09FA -}; - -static const IndicClassTable::CharClass punjCharClasses[] = -{ - _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _xx, _iv, // 0A00 - 0A0F - _iv, _xx, _xx, _i3, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0A10 - 0A1F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _bb, // 0A20 - 0A2F - _vt, _xx, _ct, _cn, _xx, _bb, _cn, _xx, _ct, _bb, _xx, _xx, _nu, _xx, _dr, _dl, // 0A30 - 0A3F - _dr, _b2, _db, _xx, _xx, _xx, _xx, _da, _da, _xx, _xx, _a1, _da, _vr, _xx, _xx, // 0A40 - 0A4F - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _cn, _cn, _cn, _ct, _xx, _cn, _xx, // 0A50 - 0A5F - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0A60 - 0A6F - _ma, _ma, _xx, _xx, _xx // 0A70 - 0A74 -}; - -static const IndicClassTable::CharClass gujrCharClasses[] = -{ - _xx, _ma, _ma, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _xx, _iv, // 0A80 - 0A8F - _iv, _iv, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0A90 - 0A9F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0AA0 - 0AAF - _rv, _xx, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _dr, _dl, // 0AB0 - 0ABF - _dr, _db, _db, _db, _db, _da, _xx, _da, _da, _dr, _xx, _dr, _dr, _vr, _xx, _xx, // 0AC0 - 0ACF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0AD0 - 0ADF - _iv, _iv, _db, _db, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0AE0 - 0AEF -}; - -#if 1 -static const IndicClassTable::CharClass oryaCharClasses[] = -{ - _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, /* 0B00 - 0B0F */ - _iv, _xx, _xx, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _ct, _bb, /* 0B10 - 0B1F */ - _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _pb, /* 0B20 - 0B2F */ - _rb, _xx, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _nu, _xx, _dr, _da, /* 0B30 - 0B3F */ - _dr, _db, _db, _db, _xx, _xx, _xx, _dl, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, /* 0B40 - 0B4F */ - _xx, _xx, _xx, _xx, _xx, _xx, _da, _dr, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _pb, /* 0B50 - 0B5F */ - _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, /* 0B60 - 0B6F */ - _xx, _bb /* 0B70 - 0B71 */ -}; -#else -static const IndicClassTable::CharClass oryaCharClasses[] = -{ - _xx, _ma, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _iv, // 0B00 - 0B0F - _iv, _xx, _xx, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0B10 - 0B1F - _ct, _ct, _ct, _ct, _bb, _ct, _ct, _ct, _bb, _xx, _ct, _ct, _bb, _bb, _bb, _pb, // 0B20 - 0B2F - _rb, _xx, _bb, _bb, _xx, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _nu, _xx, _r2, _da, // 0B30 - 0B3F - _dr, _db, _db, _db, _xx, _xx, _xx, _l1, _s1, _xx, _xx, _s2, _s3, _vr, _xx, _xx, // 0B40 - 0B4F - _xx, _xx, _xx, _xx, _xx, _xx, _m2, _m2, _xx, _xx, _xx, _xx, _cn, _cn, _xx, _cn, // 0B50 - 0B5F - _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0B60 - 0B6F - _xx, _ct // 0B70 - 0B71 -}; -#endif - -static const IndicClassTable::CharClass tamlCharClasses[] = -{ - _xx, _xx, _ma, _xx, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _iv, _iv, // 0B80 - 0B8F - _iv, _xx, _iv, _iv, _iv, _ct, _xx, _xx, _xx, _ct, _ct, _xx, _ct, _xx, _ct, _ct, // 0B90 - 0B9F - _xx, _xx, _xx, _ct, _ct, _xx, _xx, _xx, _ct, _ct, _ct, _xx, _xx, _xx, _ct, _ct, // 0BA0 - 0BAF - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0BB0 - 0BBF - _da, _dr, _dr, _xx, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0BC0 - 0BCF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BD0 - 0BDF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0BE0 - 0BEF - _xx, _xx, _xx // 0BF0 - 0BF2 -}; - -// FIXME: Should some of the bb's be pb's? (KA, NA, MA, YA, VA, etc. (approx 13)) -// U+C43 and U+C44 are _lm here not _dr. Similar to the situation with U+CC3 and -// U+CC4 in Kannada below. -static const IndicClassTable::CharClass teluCharClasses[] = -{ - _xx, _mp, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C00 - 0C0F - _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C10 - 0C1F - _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0C20 - 0C2F - _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _da, _da, // 0C30 - 0C3F - _da, _dr, _dr, _lm, _lm, _xx, _a1, _da, _s1, _xx, _da, _da, _da, _vr, _xx, _xx, // 0C40 - 0C4F - _xx, _xx, _xx, _xx, _xx, _da, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0C50 - 0C5F - _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0C60 - 0C6F -}; - -// U+CC3 and U+CC4 are _lm here not _dr since the Kannada rendering -// rules want them below and to the right of the entire cluster -// -// There's some information about this in: -// -// http://brahmi.sourceforge.net/docs/KannadaComputing.html -static const IndicClassTable::CharClass kndaCharClasses[] = -{ - _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C80 - 0C8F - _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F - _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF - _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF - _s1, _dr, _r2, _lm, _lm, _xx, _a1, _s2, _s3, _xx, _s4, _s5, _da, _vr, _xx, _xx, // 0CC0 - 0CCF - _xx, _xx, _xx, _xx, _xx, _m3, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _ct, _xx, // 0CD0 - 0CDF - _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0CE0 - 0CEF -}; - -// FIXME: this is correct for old-style Malayalam (MAL) but not for reformed Malayalam (MLR) -// FIXME: should there be a REPH for old-style Malayalam? -static const IndicClassTable::CharClass mlymCharClasses[] = -{ - _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0D00 - 0D0F - _iv, _xx, _iv, _iv, _iv, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0D10 - 0D1F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _pb, // 0D20 - 0D2F - _fb, _fb, _bb, _ct, _ct, _pb, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _xx, _r2, _dr, // 0D30 - 0D3F - _dr, _dr, _dr, _dr, _xx, _xx, _l1, _l1, _dl, _xx, _s1, _s2, _s3, _vr, _xx, _xx, // 0D40 - 0D4F - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _m2, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0D50 - 0D5F - _iv, _iv, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx // 0D60 - 0D6F -}; - -static const IndicClassTable::CharClass sinhCharClasses[] = -{ - _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, // 0D80 - 0D8F - _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _xx, _xx, _ct, _ct, _ct, _ct, _ct, _ct, // 0D90 - 0D9F - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, // 0DA0 - 0DAF - _ct, _ct, _xx, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _ct, _xx, _xx, // 0DB0 - 0DBF - _ct, _ct, _ct, _ct, _ct, _ct, _ct, _xx, _xx, _xx, _al, _xx, _xx, _xx, _xx, _dr, // 0DC0 - 0DCF - _dr, _dr, _da, _da, _db, _xx, _db, _xx, _dr, _dl, _s1, _dl, _s2, _s3, _s4, _dr, // 0DD0 - 0DDF - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0DE0 - 0DEF - _xx, _xx, _dr, _dr, _xx // 0DF0 - 0DF4 -}; - -// -// Split matra tables -// -static const SplitMatra bengSplitTable[] = {{0x09C7, 0x09BE}, {0x09C7, 0x09D7}}; - -static const SplitMatra oryaSplitTable[] = {{0x0B47, 0x0B56}, {0x0B47, 0x0B3E}, {0x0B47, 0x0B57}}; - -static const SplitMatra tamlSplitTable[] = {{0x0BC6, 0x0BBE}, {0x0BC7, 0x0BBE}, {0x0BC6, 0x0BD7}}; - -static const SplitMatra teluSplitTable[] = {{0x0C46, 0x0C56}}; - -static const SplitMatra kndaSplitTable[] = {{0x0CBF, 0x0CD5}, {0x0CC6, 0x0CD5}, {0x0CC6, 0x0CD6}, {0x0CC6, 0x0CC2}, - {0x0CC6, 0x0CC2, 0x0CD5}}; - -static const SplitMatra mlymSplitTable[] = {{0x0D46, 0x0D3E}, {0x0D47, 0x0D3E}, {0x0D46, 0x0D57}}; - - -static const SplitMatra sinhSplitTable[] = {{0x0DD9, 0x0DCA}, {0x0DD9, 0x0DCF}, {0x0DD9, 0x0DCF,0x0DCA}, - {0x0DD9, 0x0DDF}}; -// -// Script Flags -// - -// FIXME: post 'GSUB' reordering of MATRA_PRE's for Malayalam and Tamil -// FIXME: reformed Malayalam needs to reorder VATTU to before base glyph... -// FIXME: not sure passing ZWJ/ZWNJ is best way to render Malayalam Cillu... -// FIXME: eyelash RA only for Devanagari?? -#define DEVA_SCRIPT_FLAGS (SF_EYELASH_RA | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define BENG_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define PUNJ_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define GUJR_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define ORYA_SCRIPT_FLAGS (SF_REPH_AFTER_BELOW | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define TAML_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT | SF_FILTER_ZERO_WIDTH) -#define TELU_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) -#define KNDA_SCRIPT_FLAGS (SF_MATRAS_AFTER_BASE | SF_FILTER_ZERO_WIDTH | 3) -#define MLYM_SCRIPT_FLAGS (SF_MPRE_FIXUP | SF_NO_POST_BASE_LIMIT /*| SF_FILTER_ZERO_WIDTH*/) -#define SINH_SCRIPT_FLAGS (SF_NO_POST_BASE_LIMIT) - -// -// Indic Class Tables -// -static const IndicClassTable devaClassTable = {0x0900, 0x0970, 2, DEVA_SCRIPT_FLAGS, devaCharClasses, NULL}; - -static const IndicClassTable bengClassTable = {0x0980, 0x09FA, 3, BENG_SCRIPT_FLAGS, bengCharClasses, bengSplitTable}; - -static const IndicClassTable punjClassTable = {0x0A00, 0x0A74, 2, PUNJ_SCRIPT_FLAGS, punjCharClasses, NULL}; - -static const IndicClassTable gujrClassTable = {0x0A80, 0x0AEF, 2, GUJR_SCRIPT_FLAGS, gujrCharClasses, NULL}; - -static const IndicClassTable oryaClassTable = {0x0B00, 0x0B71, 3, ORYA_SCRIPT_FLAGS, oryaCharClasses, oryaSplitTable}; - -static const IndicClassTable tamlClassTable = {0x0B80, 0x0BF2, 3, TAML_SCRIPT_FLAGS, tamlCharClasses, tamlSplitTable}; - -static const IndicClassTable teluClassTable = {0x0C00, 0x0C6F, 3, TELU_SCRIPT_FLAGS, teluCharClasses, teluSplitTable}; - -static const IndicClassTable kndaClassTable = {0x0C80, 0x0CEF, 4, KNDA_SCRIPT_FLAGS, kndaCharClasses, kndaSplitTable}; - -static const IndicClassTable mlymClassTable = {0x0D00, 0x0D6F, 3, MLYM_SCRIPT_FLAGS, mlymCharClasses, mlymSplitTable}; - -static const IndicClassTable sinhClassTable = {0x0D80, 0x0DF4, 4, SINH_SCRIPT_FLAGS, sinhCharClasses, sinhSplitTable}; - -// -// IndicClassTable addresses -// -static const IndicClassTable * const indicClassTables[scriptCodeCount] = { - NULL, /* 'zyyy' (COMMON) */ - NULL, /* 'qaai' (INHERITED) */ - NULL, /* 'arab' (ARABIC) */ - NULL, /* 'armn' (ARMENIAN) */ - &bengClassTable, /* 'beng' (BENGALI) */ - NULL, /* 'bopo' (BOPOMOFO) */ - NULL, /* 'cher' (CHEROKEE) */ - NULL, /* 'copt' (COPTIC) */ - NULL, /* 'cyrl' (CYRILLIC) */ - NULL, /* 'dsrt' (DESERET) */ - &devaClassTable, /* 'deva' (DEVANAGARI) */ - NULL, /* 'ethi' (ETHIOPIC) */ - NULL, /* 'geor' (GEORGIAN) */ - NULL, /* 'goth' (GOTHIC) */ - NULL, /* 'grek' (GREEK) */ - &gujrClassTable, /* 'gujr' (GUJARATI) */ - &punjClassTable, /* 'guru' (GURMUKHI) */ - NULL, /* 'hani' (HAN) */ - NULL, /* 'hang' (HANGUL) */ - NULL, /* 'hebr' (HEBREW) */ - NULL, /* 'hira' (HIRAGANA) */ - &kndaClassTable, /* 'knda' (KANNADA) */ - NULL, /* 'kata' (KATAKANA) */ - NULL, /* 'khmr' (KHMER) */ - NULL, /* 'laoo' (LAO) */ - NULL, /* 'latn' (LATIN) */ - &mlymClassTable, /* 'mlym' (MALAYALAM) */ - NULL, /* 'mong' (MONGOLIAN) */ - NULL, /* 'mymr' (MYANMAR) */ - NULL, /* 'ogam' (OGHAM) */ - NULL, /* 'ital' (OLD-ITALIC) */ - &oryaClassTable, /* 'orya' (ORIYA) */ - NULL, /* 'runr' (RUNIC) */ - &sinhClassTable, /* 'sinh' (SINHALA) */ - NULL, /* 'syrc' (SYRIAC) */ - &tamlClassTable, /* 'taml' (TAMIL) */ - &teluClassTable, /* 'telu' (TELUGU) */ - NULL, /* 'thaa' (THAANA) */ - NULL, /* 'thai' (THAI) */ - NULL, /* 'tibt' (TIBETAN) */ - NULL, /* 'cans' (CANADIAN-ABORIGINAL) */ - NULL, /* 'yiii' (YI) */ - NULL, /* 'tglg' (TAGALOG) */ - NULL, /* 'hano' (HANUNOO) */ - NULL, /* 'buhd' (BUHID) */ - NULL, /* 'tagb' (TAGBANWA) */ - NULL, /* 'brai' (BRAILLE) */ - NULL, /* 'cprt' (CYPRIOT) */ - NULL, /* 'limb' (LIMBU) */ - NULL, /* 'linb' (LINEAR_B) */ - NULL, /* 'osma' (OSMANYA) */ - NULL, /* 'shaw' (SHAVIAN) */ - NULL, /* 'tale' (TAI_LE) */ - NULL, /* 'ugar' (UGARITIC) */ - NULL, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ - NULL, /* 'bugi' (BUGINESE) */ - NULL, /* 'glag' (GLAGOLITIC) */ - NULL, /* 'khar' (KHAROSHTHI) */ - NULL, /* 'sylo' (SYLOTI_NAGRI) */ - NULL, /* 'talu' (NEW_TAI_LUE) */ - NULL, /* 'tfng' (TIFINAGH) */ - NULL, /* 'xpeo' (OLD_PERSIAN) */ - NULL, /* 'bali' (BALINESE) */ - NULL, /* 'batk' (BATK) */ - NULL, /* 'blis' (BLIS) */ - NULL, /* 'brah' (BRAH) */ - NULL, /* 'cham' (CHAM) */ - NULL, /* 'cirt' (CIRT) */ - NULL, /* 'cyrs' (CYRS) */ - NULL, /* 'egyd' (EGYD) */ - NULL, /* 'egyh' (EGYH) */ - NULL, /* 'egyp' (EGYP) */ - NULL, /* 'geok' (GEOK) */ - NULL, /* 'hans' (HANS) */ - NULL, /* 'hant' (HANT) */ - NULL, /* 'hmng' (HMNG) */ - NULL, /* 'hung' (HUNG) */ - NULL, /* 'inds' (INDS) */ - NULL, /* 'java' (JAVA) */ - NULL, /* 'kali' (KALI) */ - NULL, /* 'latf' (LATF) */ - NULL, /* 'latg' (LATG) */ - NULL, /* 'lepc' (LEPC) */ - NULL, /* 'lina' (LINA) */ - NULL, /* 'mand' (MAND) */ - NULL, /* 'maya' (MAYA) */ - NULL, /* 'mero' (MERO) */ - NULL, /* 'nko ' (NKO) */ - NULL, /* 'orkh' (ORKH) */ - NULL, /* 'perm' (PERM) */ - NULL, /* 'phag' (PHAGS_PA) */ - NULL, /* 'phnx' (PHOENICIAN) */ - NULL, /* 'plrd' (PLRD) */ - NULL, /* 'roro' (RORO) */ - NULL, /* 'sara' (SARA) */ - NULL, /* 'syre' (SYRE) */ - NULL, /* 'syrj' (SYRJ) */ - NULL, /* 'syrn' (SYRN) */ - NULL, /* 'teng' (TENG) */ - NULL, /* 'vai ' (VAII) */ - NULL, /* 'visp' (VISP) */ - NULL, /* 'xsux' (CUNEIFORM) */ - NULL, /* 'zxxx' (ZXXX) */ - NULL, /* 'zzzz' (UNKNOWN) */ - NULL, /* 'cari' (CARI) */ - NULL, /* 'jpan' (JPAN) */ - NULL, /* 'lana' (LANA) */ - NULL, /* 'lyci' (LYCI) */ - NULL, /* 'lydi' (LYDI) */ - NULL, /* 'olck' (OLCK) */ - NULL, /* 'rjng' (RJNG) */ - NULL, /* 'saur' (SAUR) */ - NULL, /* 'sgnw' (SGNW) */ - NULL, /* 'sund' (SUND) */ - NULL, /* 'moon' (MOON) */ - NULL, /* 'mtei' (MTEI) */ - NULL, /* 'armi' (ARMI) */ - NULL, /* 'avst' (AVST) */ - NULL, /* 'cakm' (CAKM) */ - NULL, /* 'kore' (KORE) */ - NULL, /* 'kthi' (KTHI) */ - NULL, /* 'mani' (MANI) */ - NULL, /* 'phli' (PHLI) */ - NULL, /* 'phlp' (PHLP) */ - NULL, /* 'phlv' (PHLV) */ - NULL, /* 'prti' (PRTI) */ - NULL, /* 'samr' (SAMR) */ - NULL, /* 'tavt' (TAVT) */ - NULL, /* 'zmth' (ZMTH) */ - NULL, /* 'zsym' (ZSYM) */ - NULL, /* 'bamu' (BAMUM) */ - NULL, /* 'lisu' (LISU) */ - NULL, /* 'nkgb' (NKGB) */ - NULL /* 'sarb' (OLD_SOUTH_ARABIAN) */ -}; - -IndicClassTable::CharClass IndicClassTable::getCharClass(LEUnicode ch) const -{ - if (ch == C_SIGN_ZWJ) { - return CF_CONSONANT | CC_ZERO_WIDTH_MARK; - } - - if (ch == C_SIGN_ZWNJ) { - return CC_ZERO_WIDTH_MARK; - } - - if (ch < firstChar || ch > lastChar) { - return CC_RESERVED; - } - - return classTable[ch - firstChar]; -} - -const IndicClassTable *IndicClassTable::getScriptClassTable(le_int32 scriptCode) -{ - if (scriptCode < 0 || scriptCode >= scriptCodeCount) { - return NULL; - } - - return indicClassTables[scriptCode]; -} - -le_int32 IndicReordering::getWorstCaseExpansion(le_int32 scriptCode) -{ - const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); - - if (classTable == NULL) { - return 1; - } - - return classTable->getWorstCaseExpansion(); -} - -le_bool IndicReordering::getFilterZeroWidth(le_int32 scriptCode) -{ - const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); - - if (classTable == NULL) { - return TRUE; - } - - return classTable->getFilterZeroWidth(); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" -#include "IndicLayoutEngine.h" -#include "ScriptAndLanguageTags.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -#include "GDEFMarkFilter.h" -#include "LEGlyphStorage.h" - -#include "IndicReordering.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicOpenTypeLayoutEngine) - -IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success), fMPreFixups(NULL) -{ - if ( version2 ) { - fFeatureMap = IndicReordering::getv2FeatureMap(fFeatureMapCount); - } else { - fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); - } - fFeatureOrder = TRUE; - fVersion2 = version2; - fFilterZeroWidth = IndicReordering::getFilterZeroWidth(fScriptCode); -} - -IndicOpenTypeLayoutEngine::IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fMPreFixups(NULL) -{ - fFeatureMap = IndicReordering::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; - fVersion2 = FALSE; -} - -IndicOpenTypeLayoutEngine::~IndicOpenTypeLayoutEngine() -{ - // nothing to do -} - -// Input: characters, tags -// Output: glyphs, char indices -le_int32 IndicOpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - _LETRACE("IOTLE::gp, calling parent"); - le_int32 retCount = OpenTypeLayoutEngine::glyphProcessing(chars, offset, count, max, rightToLeft, glyphStorage, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (fVersion2) { - _LETRACE("IOTLE::gp, v2 final,"); - IndicReordering::finalReordering(glyphStorage,retCount); - _LETRACE("IOTLE::gp, v2 pres"); - IndicReordering::applyPresentationForms(glyphStorage,retCount); - _LETRACE("IOTLE::gp, parent gsub"); - OpenTypeLayoutEngine::glyphSubstitution(count,max, rightToLeft, glyphStorage, success); - } else { - _LETRACE("IOTLE::gp, adjust mpres"); - IndicReordering::adjustMPres(fMPreFixups, glyphStorage, success); - } - return retCount; -} - -// Input: characters -// Output: characters, char indices, tags -// Returns: output character count -le_int32 IndicOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - _LETRACE("IOTLE: charProc"); - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - le_int32 worstCase = count * IndicReordering::getWorstCaseExpansion(fScriptCode); - - outChars = LE_NEW_ARRAY(LEUnicode, worstCase); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - // NOTE: assumes this allocates featureTags... - // (probably better than doing the worst case stuff here...) - - le_int32 outCharCount; - if (fVersion2) { - _LETRACE("v2process"); - outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage, success); - } else { - _LETRACE("reorder"); - outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success); - } - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - glyphStorage.adoptGlyphCount(outCharCount); - return outCharCount; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved - * - */ - -#ifndef __INDICLAYOUTENGINE_H -#define __INDICLAYOUTENGINE_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "LEGlyphFilter.h" -#include "LayoutEngine.h" -#include "OpenTypeLayoutEngine.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -class MPreFixups; -class LEGlyphStorage; - -/** - * This class implements OpenType layout for Indic OpenType fonts, as - * specified by Microsoft in "Creating and Supporting OpenType Fonts for - * Indic Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) - * - * This class overrides the characterProcessing method to do Indic character processing - * and reordering, and the glyphProcessing method to implement post-GSUB processing for - * left matras. (See the MS spec. for more details) - * - * @internal - */ -class IndicOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of IndicOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * Indic OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, le_bool version2, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - IndicOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~IndicOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Indic OpenType character processing. It assigns the OpenType feature - * tags to the characters, and may generate output characters which have been reordered. For - * some Indic scripts, it may also split some vowels, resulting in more output characters - * than input characters. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. - * the auxillary data array will be set to the feature tags. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does character to glyph mapping, applies the GSUB table and applies - * any post GSUB fixups for left matras. It calls OpenTypeLayoutEngine::glyphProcessing - * to do the character to glyph mapping, and apply the GSUB table. - * - * Note that in the case of "canned" GSUB tables, the output glyph indices may be - * "fake" glyph indices that need to be converted to "real" glyph indices by the - * glyphPostProcessing method. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param featureTags - the feature tag array - * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the output glyph index array - * - * Note: if the character index array was already set by the characterProcessing - * method, this method won't change it. - * - * @internal - */ - virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - le_bool fVersion2; - -private: - - MPreFixups *fMPreFixups; - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicRearrangement.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __INDICREARRANGEMENT_H -#define __INDICREARRANGEMENT_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "StateTables.h" -#include "MorphTables.h" -#include "MorphStateTables.h" - -U_NAMESPACE_BEGIN - -struct IndicRearrangementSubtableHeader : MorphStateTableHeader -{ -}; - -struct IndicRearrangementSubtableHeader2 : MorphStateTableHeader2 -{ -}; - -enum IndicRearrangementFlags -{ - irfMarkFirst = 0x8000, - irfDontAdvance = 0x4000, - irfMarkLast = 0x2000, - irfReserved = 0x1FF0, - irfVerbMask = 0x000F -}; - -enum IndicRearrangementVerb -{ - irvNoAction = 0x0000, /* no action */ - irvxA = 0x0001, /* Ax => xA */ - irvDx = 0x0002, /* xD => Dx */ - irvDxA = 0x0003, /* AxD => DxA */ - - irvxAB = 0x0004, /* ABx => xAB */ - irvxBA = 0x0005, /* ABx => xBA */ - irvCDx = 0x0006, /* xCD => CDx */ - irvDCx = 0x0007, /* xCD => DCx */ - - irvCDxA = 0x0008, /* AxCD => CDxA */ - irvDCxA = 0x0009, /* AxCD => DCxA */ - irvDxAB = 0x000A, /* ABxD => DxAB */ - irvDxBA = 0x000B, /* ABxD => DxBA */ - - irvCDxAB = 0x000C, /* ABxCD => CDxAB */ - irvCDxBA = 0x000D, /* ABxCD => CDxBA */ - irvDCxAB = 0x000E, /* ABxCD => DCxAB */ - irvDCxBA = 0x000F /* ABxCD => DCxBA */ -}; - -struct IndicRearrangementStateEntry : StateEntry -{ -}; - -struct IndicRearrangementStateEntry2 : StateEntry2 -{ -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicRearrangementProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,504 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "IndicRearrangementProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor) - - IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor(morphSubtableHeader, success), - indicRearrangementSubtableHeader(morphSubtableHeader, success), - entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader), - entryTableOffset, LE_UNBOUNDED_ARRAY), - int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY) - -{ -} - -IndicRearrangementProcessor::~IndicRearrangementProcessor() -{ -} - -void IndicRearrangementProcessor::beginStateTable() -{ - firstGlyph = 0; - lastGlyph = 0; -} - -ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success) -{ - const IndicRearrangementStateEntry *entry = entryTable.getAlias(index, success); - if (LE_FAILURE(success)) return 0; - ByteOffset newState = SWAPW(entry->newStateOffset); - IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags); - - if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - - if (flags & irfMarkFirst) { - firstGlyph = currGlyph; - } - - if (flags & irfMarkLast) { - lastGlyph = currGlyph; - } - - doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success); - - if (!(flags & irfDontAdvance)) { - // XXX: Should handle reverse too... - currGlyph += 1; - } - - return newState; -} - -void IndicRearrangementProcessor::endStateTable() -{ -} - -void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const -{ - LEGlyphID a, b, c, d; - le_int32 ia, ib, ic, id, ix, x; - - if (LE_FAILURE(success)) return; - - if (verb == irvNoAction) { - return; - } - if (firstGlyph > lastGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - switch(verb) - { - case irvxA: - if (firstGlyph == lastGlyph) break; - if (firstGlyph + 1 < firstGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - x = firstGlyph + 1; - - while (x <= lastGlyph) { - glyphStorage[x - 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 1, ix, success); - x += 1; - } - - glyphStorage[lastGlyph] = a; - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDx: - if (firstGlyph == lastGlyph) break; - if (lastGlyph - 1 > lastGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - d = glyphStorage[lastGlyph]; - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 1; - - while (x >= firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage.setCharIndex(firstGlyph, id, success); - break; - - case irvDxA: - a = glyphStorage[firstGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvxAB: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error. - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - x = firstGlyph + 2; - - while (x <= lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvxBA: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - x = firstGlyph + 2; - - while (x <= lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvCDx: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x >= firstGlyph) { - glyphStorage[x + 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 2, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = c; - glyphStorage[firstGlyph + 1] = d; - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - break; - - case irvDCx: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x >= firstGlyph) { - glyphStorage[x + 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 2, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[firstGlyph + 1] = c; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - break; - - case irvCDxA: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x > firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = c; - glyphStorage[firstGlyph + 1] = d; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDCxA: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x > firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[firstGlyph + 1] = c; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDxAB: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = firstGlyph + 2; - - while (x < lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvDxBA: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = firstGlyph + 2; - - while (x < lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvCDxAB: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvCDxBA: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDCxAB: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvDCxBA: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - default: - break; - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicRearrangementProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __INDICREARRANGEMENTPROCESSOR_H -#define __INDICREARRANGEMENTPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "IndicRearrangement.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class IndicRearrangementProcessor : public StateTableProcessor -{ -public: - virtual void beginStateTable(); - - virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success); - - virtual void endStateTable(); - - void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const; - - IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - virtual ~IndicRearrangementProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - le_int32 firstGlyph; - le_int32 lastGlyph; - - LEReferenceTo<IndicRearrangementSubtableHeader> indicRearrangementSubtableHeader; - LEReferenceToArrayOf<IndicRearrangementStateEntry> entryTable; - LEReferenceToArrayOf<le_int16> int16Table; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicRearrangementProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,502 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "IndicRearrangementProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndicRearrangementProcessor2) - -IndicRearrangementProcessor2::IndicRearrangementProcessor2( - const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor2(morphSubtableHeader, success), indicRearrangementSubtableHeader(morphSubtableHeader, success), - entryTable(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY) -{ -} - -IndicRearrangementProcessor2::~IndicRearrangementProcessor2() -{ -} - -void IndicRearrangementProcessor2::beginStateTable() -{ - firstGlyph = 0; - lastGlyph = 0; -} - -le_uint16 IndicRearrangementProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, - EntryTableIndex2 index, LEErrorCode &success) -{ - const IndicRearrangementStateEntry2 *entry = entryTable.getAlias(index, success); - if (LE_FAILURE(success)) return 0; // TODO - what to return in bad state? - le_uint16 newState = SWAPW(entry->newStateIndex); // index to the new state - IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags); - - if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - - if (flags & irfMarkFirst) { - firstGlyph = currGlyph; - } - - if (flags & irfMarkLast) { - lastGlyph = currGlyph; - } - - doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success); - - if (!(flags & irfDontAdvance)) { - currGlyph += dir; - } - - return newState; // index to new state -} - -void IndicRearrangementProcessor2::endStateTable() -{ -} - -void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const -{ - LEGlyphID a, b, c, d; - le_int32 ia, ib, ic, id, ix, x; - - if (LE_FAILURE(success)) return; - - if (verb == irvNoAction) { - return; - } - if (firstGlyph > lastGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - switch(verb) - { - case irvxA: - if (firstGlyph == lastGlyph) break; - if (firstGlyph + 1 < firstGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - x = firstGlyph + 1; - - while (x <= lastGlyph) { - glyphStorage[x - 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 1, ix, success); - x += 1; - } - - glyphStorage[lastGlyph] = a; - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDx: - if (firstGlyph == lastGlyph) break; - if (lastGlyph - 1 > lastGlyph) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - d = glyphStorage[lastGlyph]; - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 1; - - while (x >= firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage.setCharIndex(firstGlyph, id, success); - break; - - case irvDxA: - a = glyphStorage[firstGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvxAB: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error. - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - x = firstGlyph + 2; - - while (x <= lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvxBA: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - x = firstGlyph + 2; - - while (x <= lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvCDx: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x >= firstGlyph) { - glyphStorage[x + 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 2, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = c; - glyphStorage[firstGlyph + 1] = d; - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - break; - - case irvDCx: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 1)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x >= firstGlyph) { - glyphStorage[x + 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 2, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[firstGlyph + 1] = c; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - break; - - case irvCDxA: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x > firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = c; - glyphStorage[firstGlyph + 1] = d; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDCxA: - if ((lastGlyph - 2 > lastGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - c = glyphStorage[lastGlyph - 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = lastGlyph - 2; - - while (x > firstGlyph) { - glyphStorage[x + 1] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x + 1, ix, success); - x -= 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[firstGlyph + 1] = c; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDxAB: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = firstGlyph + 2; - - while (x < lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvDxBA: - if ((firstGlyph + 2 < firstGlyph) || - (lastGlyph - firstGlyph < 2)) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - d = glyphStorage[lastGlyph]; - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - x = firstGlyph + 2; - - while (x < lastGlyph) { - glyphStorage[x - 2] = glyphStorage[x]; - ix = glyphStorage.getCharIndex(x, success); - glyphStorage.setCharIndex(x - 2, ix, success); - x += 1; - } - - glyphStorage[firstGlyph] = d; - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvCDxAB: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvCDxBA: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph - 1]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph]; - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, ic, success); - glyphStorage.setCharIndex(firstGlyph + 1, id, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - case irvDCxAB: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - - glyphStorage[lastGlyph - 1] = a; - glyphStorage[lastGlyph] = b; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ia, success); - glyphStorage.setCharIndex(lastGlyph, ib, success); - break; - - case irvDCxBA: - if (lastGlyph - firstGlyph < 3) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - break; - } - a = glyphStorage[firstGlyph]; - b = glyphStorage[firstGlyph + 1]; - - glyphStorage[firstGlyph] = glyphStorage[lastGlyph]; - glyphStorage[firstGlyph + 1] = glyphStorage[lastGlyph - 1]; - - glyphStorage[lastGlyph - 1] = b; - glyphStorage[lastGlyph] = a; - - ia = glyphStorage.getCharIndex(firstGlyph, success); - ib = glyphStorage.getCharIndex(firstGlyph + 1, success); - ic = glyphStorage.getCharIndex(lastGlyph - 1, success); - id = glyphStorage.getCharIndex(lastGlyph, success); - - glyphStorage.setCharIndex(firstGlyph, id, success); - glyphStorage.setCharIndex(firstGlyph + 1, ic, success); - - glyphStorage.setCharIndex(lastGlyph - 1, ib, success); - glyphStorage.setCharIndex(lastGlyph, ia, success); - break; - - default: - break; - } - -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicRearrangementProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __INDICREARRANGEMENTPROCESSOR2_H -#define __INDICREARRANGEMENTPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor2.h" -#include "IndicRearrangement.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class IndicRearrangementProcessor2 : public StateTableProcessor2 -{ -public: - virtual void beginStateTable(); - - virtual le_uint16 processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex2 index, LEErrorCode &success); - - virtual void endStateTable(); - - void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const; - - IndicRearrangementProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - virtual ~IndicRearrangementProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - le_int32 firstGlyph; - le_int32 lastGlyph; - - LEReferenceToArrayOf<IndicRearrangementStateEntry2> entryTable; - LEReferenceTo<IndicRearrangementSubtableHeader2> indicRearrangementSubtableHeader; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicReordering.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1264 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2009 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "IndicReordering.h" -#include "LEGlyphStorage.h" -#include "MPreFixups.h" - -U_NAMESPACE_BEGIN - -#define loclFeatureTag LE_LOCL_FEATURE_TAG -#define initFeatureTag LE_INIT_FEATURE_TAG -#define nuktFeatureTag LE_NUKT_FEATURE_TAG -#define akhnFeatureTag LE_AKHN_FEATURE_TAG -#define rphfFeatureTag LE_RPHF_FEATURE_TAG -#define rkrfFeatureTag LE_RKRF_FEATURE_TAG -#define blwfFeatureTag LE_BLWF_FEATURE_TAG -#define halfFeatureTag LE_HALF_FEATURE_TAG -#define pstfFeatureTag LE_PSTF_FEATURE_TAG -#define vatuFeatureTag LE_VATU_FEATURE_TAG -#define presFeatureTag LE_PRES_FEATURE_TAG -#define blwsFeatureTag LE_BLWS_FEATURE_TAG -#define abvsFeatureTag LE_ABVS_FEATURE_TAG -#define pstsFeatureTag LE_PSTS_FEATURE_TAG -#define halnFeatureTag LE_HALN_FEATURE_TAG -#define cjctFeatureTag LE_CJCT_FEATURE_TAG -#define blwmFeatureTag LE_BLWM_FEATURE_TAG -#define abvmFeatureTag LE_ABVM_FEATURE_TAG -#define distFeatureTag LE_DIST_FEATURE_TAG -#define caltFeatureTag LE_CALT_FEATURE_TAG -#define kernFeatureTag LE_KERN_FEATURE_TAG - -#define loclFeatureMask 0x80000000UL -#define rphfFeatureMask 0x40000000UL -#define blwfFeatureMask 0x20000000UL -#define halfFeatureMask 0x10000000UL -#define pstfFeatureMask 0x08000000UL -#define nuktFeatureMask 0x04000000UL -#define akhnFeatureMask 0x02000000UL -#define vatuFeatureMask 0x01000000UL -#define presFeatureMask 0x00800000UL -#define blwsFeatureMask 0x00400000UL -#define abvsFeatureMask 0x00200000UL -#define pstsFeatureMask 0x00100000UL -#define halnFeatureMask 0x00080000UL -#define blwmFeatureMask 0x00040000UL -#define abvmFeatureMask 0x00020000UL -#define distFeatureMask 0x00010000UL -#define initFeatureMask 0x00008000UL -#define cjctFeatureMask 0x00004000UL -#define rkrfFeatureMask 0x00002000UL -#define caltFeatureMask 0x00001000UL -#define kernFeatureMask 0x00000800UL - -// Syllable structure bits -#define baseConsonantMask 0x00000400UL -#define consonantMask 0x00000200UL -#define halfConsonantMask 0x00000100UL -#define rephConsonantMask 0x00000080UL -#define matraMask 0x00000040UL -#define vowelModifierMask 0x00000020UL -#define markPositionMask 0x00000018UL - -#define postBasePosition 0x00000000UL -#define preBasePosition 0x00000008UL -#define aboveBasePosition 0x00000010UL -#define belowBasePosition 0x00000018UL - -#define repositionedGlyphMask 0x00000002UL - -#define basicShapingFormsMask ( loclFeatureMask | nuktFeatureMask | akhnFeatureMask | rkrfFeatureMask | blwfFeatureMask | halfFeatureMask | vatuFeatureMask | cjctFeatureMask ) -#define positioningFormsMask ( kernFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask ) -#define presentationFormsMask ( presFeatureMask | abvsFeatureMask | blwsFeatureMask | pstsFeatureMask | halnFeatureMask | caltFeatureMask ) - - -#define C_MALAYALAM_VOWEL_SIGN_U 0x0D41 -#define C_DOTTED_CIRCLE 0x25CC -#define NO_GLYPH 0xFFFF - -// Some level of debate as to the proper value for MAX_CONSONANTS_PER_SYLLABLE. Ticket 5588 states that 4 -// is the magic number according to ISCII, but 5 seems to be the more consistent with XP. -#define MAX_CONSONANTS_PER_SYLLABLE 5 - -#define INDIC_BLOCK_SIZE 0x7F - -class IndicReorderingOutput : public UMemory { -private: - le_int32 fSyllableCount; - le_int32 fOutIndex; - LEUnicode *fOutChars; - - LEGlyphStorage &fGlyphStorage; - - LEUnicode fMpre; - le_int32 fMpreIndex; - - LEUnicode fMbelow; - le_int32 fMbelowIndex; - - LEUnicode fMabove; - le_int32 fMaboveIndex; - - LEUnicode fMpost; - le_int32 fMpostIndex; - - LEUnicode fLengthMark; - le_int32 fLengthMarkIndex; - - LEUnicode fAlLakuna; - le_int32 fAlLakunaIndex; - - FeatureMask fMatraFeatures; - - le_int32 fMPreOutIndex; - MPreFixups *fMPreFixups; - - LEUnicode fVMabove; - LEUnicode fVMpost; - le_int32 fVMIndex; - FeatureMask fVMFeatures; - - LEUnicode fSMabove; - LEUnicode fSMbelow; - le_int32 fSMIndex; - FeatureMask fSMFeatures; - - LEUnicode fPreBaseConsonant; - LEUnicode fPreBaseVirama; - le_int32 fPBCIndex; - FeatureMask fPBCFeatures; - - void saveMatra(LEUnicode matra, le_int32 matraIndex, IndicClassTable::CharClass matraClass) - { - // FIXME: check if already set, or if not a matra... - if (IndicClassTable::isLengthMark(matraClass)) { - fLengthMark = matra; - fLengthMarkIndex = matraIndex; - } else if (IndicClassTable::isAlLakuna(matraClass)) { - fAlLakuna = matra; - fAlLakunaIndex = matraIndex; - } else { - switch (matraClass & CF_POS_MASK) { - case CF_POS_BEFORE: - fMpre = matra; - fMpreIndex = matraIndex; - break; - - case CF_POS_BELOW: - fMbelow = matra; - fMbelowIndex = matraIndex; - break; - - case CF_POS_ABOVE: - fMabove = matra; - fMaboveIndex = matraIndex; - break; - - case CF_POS_AFTER: - fMpost = matra; - fMpostIndex = matraIndex; - break; - - default: - // can't get here... - break; - } - } - } - -public: - IndicReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage, MPreFixups *mpreFixups) - : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage), - fMpre(0), fMpreIndex(0), fMbelow(0), fMbelowIndex(0), fMabove(0), fMaboveIndex(0), - fMpost(0), fMpostIndex(0), fLengthMark(0), fLengthMarkIndex(0), fAlLakuna(0), fAlLakunaIndex(0), - fMatraFeatures(0), fMPreOutIndex(-1), fMPreFixups(mpreFixups), - fVMabove(0), fVMpost(0), fVMIndex(0), fVMFeatures(0), - fSMabove(0), fSMbelow(0), fSMIndex(0), fSMFeatures(0), - fPreBaseConsonant(0), fPreBaseVirama(0), fPBCIndex(0), fPBCFeatures(0) - { - // nothing else to do... - } - - ~IndicReorderingOutput() - { - // nothing to do here... - } - - void reset() - { - fSyllableCount += 1; - - fMpre = fMbelow = fMabove = fMpost = fLengthMark = fAlLakuna = 0; - fMPreOutIndex = -1; - - fVMabove = fVMpost = 0; - fSMabove = fSMbelow = 0; - - fPreBaseConsonant = fPreBaseVirama = 0; - } - - void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) - { - LEErrorCode success = LE_NO_ERROR; - - fOutChars[fOutIndex] = ch; - - fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); - fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); - - fOutIndex += 1; - } - - void setFeatures ( le_uint32 charIndex, FeatureMask charFeatures) - { - LEErrorCode success = LE_NO_ERROR; - - fGlyphStorage.setAuxData( charIndex, charFeatures, success ); - - } - - FeatureMask getFeatures ( le_uint32 charIndex ) - { - LEErrorCode success = LE_NO_ERROR; - return fGlyphStorage.getAuxData(charIndex,success); - } - - void decomposeReorderMatras ( const IndicClassTable *classTable, le_int32 beginSyllable, le_int32 nextSyllable, le_int32 inv_count ) { - le_int32 i; - LEErrorCode success = LE_NO_ERROR; - - for ( i = beginSyllable ; i < nextSyllable ; i++ ) { - if ( classTable->isMatra(fOutChars[i+inv_count])) { - IndicClassTable::CharClass matraClass = classTable->getCharClass(fOutChars[i+inv_count]); - if ( classTable->isSplitMatra(matraClass)) { - le_int32 saveIndex = fGlyphStorage.getCharIndex(i+inv_count,success); - le_uint32 saveAuxData = fGlyphStorage.getAuxData(i+inv_count,success); - const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass); - int j; - for (j = 0 ; j < SM_MAX_PIECES && *(splitMatra)[j] != 0 ; j++) { - LEUnicode piece = (*splitMatra)[j]; - if ( j == 0 ) { - fOutChars[i+inv_count] = piece; - matraClass = classTable->getCharClass(piece); - } else { - insertCharacter(piece,i+1+inv_count,saveIndex,saveAuxData); - nextSyllable++; - } - } - } - - if ((matraClass & CF_POS_MASK) == CF_POS_BEFORE) { - moveCharacter(i+inv_count,beginSyllable+inv_count); - } - } - } - } - - void moveCharacter( le_int32 fromPosition, le_int32 toPosition ) { - le_int32 i,saveIndex; - le_uint32 saveAuxData; - LEUnicode saveChar = fOutChars[fromPosition]; - LEErrorCode success = LE_NO_ERROR; - LEErrorCode success2 = LE_NO_ERROR; - saveIndex = fGlyphStorage.getCharIndex(fromPosition,success); - saveAuxData = fGlyphStorage.getAuxData(fromPosition,success); - - if ( fromPosition > toPosition ) { - for ( i = fromPosition ; i > toPosition ; i-- ) { - fOutChars[i] = fOutChars[i-1]; - fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success2),success); - fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success2), success); - - } - } else { - for ( i = fromPosition ; i < toPosition ; i++ ) { - fOutChars[i] = fOutChars[i+1]; - fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success2),success); - fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success2), success); - } - - } - fOutChars[toPosition] = saveChar; - fGlyphStorage.setCharIndex(toPosition,saveIndex,success); - fGlyphStorage.setAuxData(toPosition,saveAuxData,success); - - } - void insertCharacter( LEUnicode ch, le_int32 toPosition, le_int32 charIndex, le_uint32 auxData ) { - LEErrorCode success = LE_NO_ERROR; - le_int32 i; - fOutIndex += 1; - - for ( i = fOutIndex ; i > toPosition ; i--) { - fOutChars[i] = fOutChars[i-1]; - fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i-1,success),success); - fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i-1,success), success); - } - - fOutChars[toPosition] = ch; - fGlyphStorage.setCharIndex(toPosition,charIndex,success); - fGlyphStorage.setAuxData(toPosition,auxData,success); - - } - void removeCharacter( le_int32 fromPosition ) { - LEErrorCode success = LE_NO_ERROR; - le_int32 i; - fOutIndex -= 1; - - for ( i = fromPosition ; i < fOutIndex ; i--) { - fOutChars[i] = fOutChars[i+1]; - fGlyphStorage.setCharIndex(i,fGlyphStorage.getCharIndex(i+1,success),success); - fGlyphStorage.setAuxData(i,fGlyphStorage.getAuxData(i+1,success), success); - } - } - - le_bool noteMatra(const IndicClassTable *classTable, LEUnicode matra, le_uint32 matraIndex, FeatureMask matraFeatures, le_bool wordStart) - { - IndicClassTable::CharClass matraClass = classTable->getCharClass(matra); - - fMatraFeatures = matraFeatures; - - if (wordStart) { - fMatraFeatures |= initFeatureMask; - } - - if (IndicClassTable::isMatra(matraClass)) { - if (IndicClassTable::isSplitMatra(matraClass)) { - const SplitMatra *splitMatra = classTable->getSplitMatra(matraClass); - int i; - - for (i = 0; i < SM_MAX_PIECES && (*splitMatra)[i] != 0; i += 1) { - LEUnicode piece = (*splitMatra)[i]; - IndicClassTable::CharClass pieceClass = classTable->getCharClass(piece); - - saveMatra(piece, matraIndex, pieceClass); - } - } else { - saveMatra(matra, matraIndex, matraClass); - } - - return TRUE; - } - - return FALSE; - } - - void noteVowelModifier(const IndicClassTable *classTable, LEUnicode vowelModifier, le_uint32 vowelModifierIndex, FeatureMask vowelModifierFeatures) - { - IndicClassTable::CharClass vmClass = classTable->getCharClass(vowelModifier); - - fVMIndex = vowelModifierIndex; - fVMFeatures = vowelModifierFeatures; - - if (IndicClassTable::isVowelModifier(vmClass)) { - switch (vmClass & CF_POS_MASK) { - case CF_POS_ABOVE: - fVMabove = vowelModifier; - break; - - case CF_POS_AFTER: - fVMpost = vowelModifier; - break; - - default: - // FIXME: this is an error... - break; - } - } - } - - void noteStressMark(const IndicClassTable *classTable, LEUnicode stressMark, le_uint32 stressMarkIndex, FeatureMask stressMarkFeatures) - { - IndicClassTable::CharClass smClass = classTable->getCharClass(stressMark); - - fSMIndex = stressMarkIndex; - fSMFeatures = stressMarkFeatures; - - if (IndicClassTable::isStressMark(smClass)) { - switch (smClass & CF_POS_MASK) { - case CF_POS_ABOVE: - fSMabove = stressMark; - break; - - case CF_POS_BELOW: - fSMbelow = stressMark; - break; - - default: - // FIXME: this is an error... - break; - } - } - } - - void notePreBaseConsonant(le_uint32 index,LEUnicode PBConsonant, LEUnicode PBVirama, FeatureMask features) - { - fPBCIndex = index; - fPreBaseConsonant = PBConsonant; - fPreBaseVirama = PBVirama; - fPBCFeatures = features; - } - - void noteBaseConsonant() - { - if (fMPreFixups != NULL && fMPreOutIndex >= 0) { - fMPreFixups->add(fOutIndex, fMPreOutIndex); - } - } - - // Handles Al-Lakuna in Sinhala split vowels. - void writeAlLakuna() - { - if (fAlLakuna != 0) { - writeChar(fAlLakuna, fAlLakunaIndex, fMatraFeatures); - } - } - - void writeMpre() - { - if (fMpre != 0) { - fMPreOutIndex = fOutIndex; - writeChar(fMpre, fMpreIndex, fMatraFeatures); - } - } - - void writeMbelow() - { - if (fMbelow != 0) { - writeChar(fMbelow, fMbelowIndex, fMatraFeatures); - } - } - - void writeMabove() - { - if (fMabove != 0) { - writeChar(fMabove, fMaboveIndex, fMatraFeatures); - } - } - - void writeMpost() - { - if (fMpost != 0) { - writeChar(fMpost, fMpostIndex, fMatraFeatures); - } - } - - void writeLengthMark() - { - if (fLengthMark != 0) { - writeChar(fLengthMark, fLengthMarkIndex, fMatraFeatures); - } - } - - void writeVMabove() - { - if (fVMabove != 0) { - writeChar(fVMabove, fVMIndex, fVMFeatures); - } - } - - void writeVMpost() - { - if (fVMpost != 0) { - writeChar(fVMpost, fVMIndex, fVMFeatures); - } - } - - void writeSMabove() - { - if (fSMabove != 0) { - writeChar(fSMabove, fSMIndex, fSMFeatures); - } - } - - void writeSMbelow() - { - if (fSMbelow != 0) { - writeChar(fSMbelow, fSMIndex, fSMFeatures); - } - } - - void writePreBaseConsonant() - { - // The TDIL spec says that consonant + virama + RRA should produce a rakar in Malayalam. However, - // it seems that almost none of the fonts for Malayalam are set up to handle this. - // So, we're going to force the issue here by using the rakar as defined with RA in most fonts. - - if (fPreBaseConsonant == 0x0d31) { // RRA - fPreBaseConsonant = 0x0d30; // RA - } - - if (fPreBaseConsonant != 0) { - writeChar(fPreBaseConsonant, fPBCIndex, fPBCFeatures); - writeChar(fPreBaseVirama,fPBCIndex-1,fPBCFeatures); - } - } - - le_int32 getOutputIndex() - { - return fOutIndex; - } -}; - - - -// TODO: Find better names for these! -#define tagArray4 (loclFeatureMask | nuktFeatureMask | akhnFeatureMask | vatuFeatureMask | presFeatureMask | blwsFeatureMask | abvsFeatureMask | pstsFeatureMask | halnFeatureMask | blwmFeatureMask | abvmFeatureMask | distFeatureMask) -#define tagArray3 (pstfFeatureMask | tagArray4) -#define tagArray2 (halfFeatureMask | tagArray3) -#define tagArray1 (blwfFeatureMask | tagArray2) -#define tagArray0 (rphfFeatureMask | tagArray1) - -static const FeatureMap featureMap[] = { - {loclFeatureTag, loclFeatureMask}, - {initFeatureTag, initFeatureMask}, - {nuktFeatureTag, nuktFeatureMask}, - {akhnFeatureTag, akhnFeatureMask}, - {rphfFeatureTag, rphfFeatureMask}, - {blwfFeatureTag, blwfFeatureMask}, - {halfFeatureTag, halfFeatureMask}, - {pstfFeatureTag, pstfFeatureMask}, - {vatuFeatureTag, vatuFeatureMask}, - {presFeatureTag, presFeatureMask}, - {blwsFeatureTag, blwsFeatureMask}, - {abvsFeatureTag, abvsFeatureMask}, - {pstsFeatureTag, pstsFeatureMask}, - {halnFeatureTag, halnFeatureMask}, - {blwmFeatureTag, blwmFeatureMask}, - {abvmFeatureTag, abvmFeatureMask}, - {distFeatureTag, distFeatureMask} -}; - -static const le_int32 featureCount = LE_ARRAY_SIZE(featureMap); - -static const FeatureMap v2FeatureMap[] = { - {loclFeatureTag, loclFeatureMask}, - {nuktFeatureTag, nuktFeatureMask}, - {akhnFeatureTag, akhnFeatureMask}, - {rphfFeatureTag, rphfFeatureMask}, - {rkrfFeatureTag, rkrfFeatureMask}, - {blwfFeatureTag, blwfFeatureMask}, - {halfFeatureTag, halfFeatureMask}, - {vatuFeatureTag, vatuFeatureMask}, - {cjctFeatureTag, cjctFeatureMask}, - {presFeatureTag, presFeatureMask}, - {abvsFeatureTag, abvsFeatureMask}, - {blwsFeatureTag, blwsFeatureMask}, - {pstsFeatureTag, pstsFeatureMask}, - {halnFeatureTag, halnFeatureMask}, - {caltFeatureTag, caltFeatureMask}, - {kernFeatureTag, kernFeatureMask}, - {distFeatureTag, distFeatureMask}, - {abvmFeatureTag, abvmFeatureMask}, - {blwmFeatureTag, blwmFeatureMask} -}; - -static const le_int32 v2FeatureMapCount = LE_ARRAY_SIZE(v2FeatureMap); - -static const le_int8 stateTable[][CC_COUNT] = -{ -// xx vm sm iv i2 i3 ct cn nu dv s1 s2 s3 vr zw al - { 1, 6, 1, 5, 8, 11, 3, 2, 1, 5, 9, 5, 5, 1, 1, 1}, // 0 - ground state - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state - {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, 12, -1}, // 2 - consonant with nukta - {-1, 6, 1, -1, -1, -1, -1, -1, 2, 5, 9, 5, 5, 4, 12, 13}, // 3 - consonant - {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, 7, -1}, // 4 - consonant virama - {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 5 - dependent vowels - {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - vowel mark - {-1, -1, -1, -1, -1, -1, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1}, // 7 - consonant virama ZWJ, consonant ZWJ virama - {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1}, // 8 - independent vowels that can take a virama - {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, -1, -1, -1}, // 9 - first part of split vowel - {-1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1}, // 10 - second part of split vowel - {-1, 6, 1, -1, -1, -1, -1, -1, -1, 5, 9, 5, 5, 4, -1, -1}, // 11 - independent vowels that can take an iv - {-1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, 7}, // 12 - consonant ZWJ (TODO: Take everything else that can be after a consonant?) - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1} // 13 - consonant al-lakuna ZWJ consonant -}; - - -const FeatureMap *IndicReordering::getFeatureMap(le_int32 &count) -{ - count = featureCount; - - return featureMap; -} - -const FeatureMap *IndicReordering::getv2FeatureMap(le_int32 &count) -{ - count = v2FeatureMapCount; - - return v2FeatureMap; -} - -le_int32 IndicReordering::findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) -{ - le_int32 cursor = prev; - le_int8 state = 0; - le_int8 consonant_count = 0; - - while (cursor < charCount) { - IndicClassTable::CharClass charClass = classTable->getCharClass(chars[cursor]); - - if ( IndicClassTable::isConsonant(charClass) ) { - consonant_count++; - if ( consonant_count > MAX_CONSONANTS_PER_SYLLABLE ) { - break; - } - } - - state = stateTable[state][charClass & CF_CLASS_MASK]; - - if (state < 0) { - break; - } - - cursor += 1; - } - - return cursor; -} - -le_int32 IndicReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage, - MPreFixups **outMPreFixups, LEErrorCode& success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - MPreFixups *mpreFixups = NULL; - const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); - - if(classTable==NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - if (classTable->scriptFlags & SF_MPRE_FIXUP) { - mpreFixups = new MPreFixups(charCount); - if (mpreFixups == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - } - - IndicReorderingOutput output(outChars, glyphStorage, mpreFixups); - le_int32 i, prev = 0; - le_bool lastInWord = FALSE; - - while (prev < charCount) { - le_int32 syllable = findSyllable(classTable, chars, prev, charCount); - le_int32 matra, markStart = syllable; - - output.reset(); - - if (classTable->isStressMark(chars[markStart - 1])) { - markStart -= 1; - output.noteStressMark(classTable, chars[markStart], markStart, tagArray1); - } - - if (markStart != prev && classTable->isVowelModifier(chars[markStart - 1])) { - markStart -= 1; - output.noteVowelModifier(classTable, chars[markStart], markStart, tagArray1); - } - - matra = markStart - 1; - - while (output.noteMatra(classTable, chars[matra], matra, tagArray1, !lastInWord) && matra != prev) { - matra -= 1; - } - - lastInWord = TRUE; - - switch (classTable->getCharClass(chars[prev]) & CF_CLASS_MASK) { - case CC_RESERVED: - lastInWord = FALSE; - /* fall through */ - - case CC_INDEPENDENT_VOWEL: - case CC_ZERO_WIDTH_MARK: - for (i = prev; i < syllable; i += 1) { - output.writeChar(chars[i], i, tagArray1); - } - - break; - - case CC_AL_LAKUNA: - case CC_NUKTA: - output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); - output.writeChar(chars[prev], prev, tagArray1); - break; - - case CC_VIRAMA: - // A lone virama is illegal unless it follows a - // MALAYALAM_VOWEL_SIGN_U. Such a usage is called - // "samvruthokaram". - if (chars[prev - 1] != C_MALAYALAM_VOWEL_SIGN_U) { - output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); - } - - output.writeChar(chars[prev], prev, tagArray1); - break; - - case CC_DEPENDENT_VOWEL: - case CC_SPLIT_VOWEL_PIECE_1: - case CC_SPLIT_VOWEL_PIECE_2: - case CC_SPLIT_VOWEL_PIECE_3: - case CC_VOWEL_MODIFIER: - case CC_STRESS_MARK: - output.writeMpre(); - - output.writeChar(C_DOTTED_CIRCLE, prev, tagArray1); - - output.writeMbelow(); - output.writeSMbelow(); - output.writeMabove(); - - if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { - output.writeMpost(); - } - - if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) != 0) { - output.writeVMabove(); - output.writeSMabove(); // FIXME: there are no SM's in these scripts... - } - - if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { - output.writeMpost(); - } - - output.writeLengthMark(); - output.writeAlLakuna(); - - if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { - output.writeVMabove(); - output.writeSMabove(); - } - - output.writeVMpost(); - break; - - case CC_INDEPENDENT_VOWEL_2: - case CC_INDEPENDENT_VOWEL_3: - case CC_CONSONANT: - case CC_CONSONANT_WITH_NUKTA: - { - le_uint32 length = markStart - prev; - le_int32 lastConsonant = markStart - 1; - le_int32 baseLimit = prev; - - // Check for REPH at front of syllable - if (length > 2 && classTable->isReph(chars[prev]) && classTable->isVirama(chars[prev + 1]) && chars[prev + 2] != C_SIGN_ZWNJ) { - baseLimit += 2; - - // Check for eyelash RA, if the script supports it - if ((classTable->scriptFlags & SF_EYELASH_RA) != 0 && - chars[baseLimit] == C_SIGN_ZWJ) { - if (length > 3) { - baseLimit += 1; - } else { - baseLimit -= 2; - } - } - } - - while (lastConsonant > baseLimit && !classTable->isConsonant(chars[lastConsonant])) { - lastConsonant -= 1; - } - - - IndicClassTable::CharClass charClass = CC_RESERVED; - IndicClassTable::CharClass nextClass = CC_RESERVED; - le_int32 baseConsonant = lastConsonant; - le_int32 postBase = lastConsonant + 1; - le_int32 postBaseLimit = classTable->scriptFlags & SF_POST_BASE_LIMIT_MASK; - le_bool seenVattu = FALSE; - le_bool seenBelowBaseForm = FALSE; - le_bool seenPreBaseForm = FALSE; - le_bool hasNukta = FALSE; - le_bool hasBelowBaseForm = FALSE; - le_bool hasPostBaseForm = FALSE; - le_bool hasPreBaseForm = FALSE; - - if (postBase < markStart && classTable->isNukta(chars[postBase])) { - charClass = CC_NUKTA; - postBase += 1; - } - - while (baseConsonant > baseLimit) { - nextClass = charClass; - hasNukta = IndicClassTable::isNukta(nextClass); - charClass = classTable->getCharClass(chars[baseConsonant]); - - hasBelowBaseForm = IndicClassTable::hasBelowBaseForm(charClass) && !hasNukta; - hasPostBaseForm = IndicClassTable::hasPostBaseForm(charClass) && !hasNukta; - hasPreBaseForm = IndicClassTable::hasPreBaseForm(charClass) && !hasNukta; - - if (IndicClassTable::isConsonant(charClass)) { - if (postBaseLimit == 0 || seenVattu || - (baseConsonant > baseLimit && !classTable->isVirama(chars[baseConsonant - 1])) || - !(hasBelowBaseForm || hasPostBaseForm || hasPreBaseForm)) { - break; - } - - // Note any pre-base consonants - if ( baseConsonant == lastConsonant && lastConsonant > 0 && - hasPreBaseForm && classTable->isVirama(chars[baseConsonant - 1])) { - output.notePreBaseConsonant(lastConsonant,chars[lastConsonant],chars[lastConsonant-1],tagArray2); - seenPreBaseForm = TRUE; - - } - // consonants with nuktas are never vattus - seenVattu = IndicClassTable::isVattu(charClass) && !hasNukta; - - // consonants with nuktas never have below- or post-base forms - if (hasPostBaseForm) { - if (seenBelowBaseForm) { - break; - } - - postBase = baseConsonant; - } else if (hasBelowBaseForm) { - seenBelowBaseForm = TRUE; - } - - postBaseLimit -= 1; - } - - baseConsonant -= 1; - } - - // Write Mpre - output.writeMpre(); - - // Write eyelash RA - // NOTE: baseLimit == prev + 3 iff eyelash RA present... - if (baseLimit == prev + 3) { - output.writeChar(chars[prev], prev, tagArray2); - output.writeChar(chars[prev + 1], prev + 1, tagArray2); - output.writeChar(chars[prev + 2], prev + 2, tagArray2); - } - - // write any pre-base consonants - output.writePreBaseConsonant(); - - le_bool supressVattu = TRUE; - - for (i = baseLimit; i < baseConsonant; i += 1) { - LEUnicode ch = chars[i]; - // Don't put 'pstf' or 'blwf' on anything before the base consonant. - FeatureMask features = tagArray1 & ~( pstfFeatureMask | blwfFeatureMask ); - - charClass = classTable->getCharClass(ch); - nextClass = classTable->getCharClass(chars[i + 1]); - hasNukta = IndicClassTable::isNukta(nextClass); - - if (IndicClassTable::isConsonant(charClass)) { - if (IndicClassTable::isVattu(charClass) && !hasNukta && supressVattu) { - features = tagArray4; - } - - supressVattu = IndicClassTable::isVattu(charClass) && !hasNukta; - } else if (IndicClassTable::isVirama(charClass) && chars[i + 1] == C_SIGN_ZWNJ) - { - features = tagArray4; - } - - output.writeChar(ch, i, features); - } - - le_int32 bcSpan = baseConsonant + 1; - - if (bcSpan < markStart && classTable->isNukta(chars[bcSpan])) { - bcSpan += 1; - } - - if (baseConsonant == lastConsonant && bcSpan < markStart && - (classTable->isVirama(chars[bcSpan]) || classTable->isAlLakuna(chars[bcSpan]))) { - bcSpan += 1; - - if (bcSpan < markStart && chars[bcSpan] == C_SIGN_ZWNJ) { - bcSpan += 1; - } - } - - // note the base consonant for post-GSUB fixups - output.noteBaseConsonant(); - - // write base consonant - for (i = baseConsonant; i < bcSpan; i += 1) { - output.writeChar(chars[i], i, tagArray4); - } - - if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) != 0) { - output.writeMbelow(); - output.writeSMbelow(); // FIXME: there are no SMs in these scripts... - output.writeMabove(); - output.writeMpost(); - } - - // write below-base consonants - if (baseConsonant != lastConsonant && !seenPreBaseForm) { - for (i = bcSpan + 1; i < postBase; i += 1) { - output.writeChar(chars[i], i, tagArray1); - } - - if (postBase > lastConsonant) { - // write halant that was after base consonant - output.writeChar(chars[bcSpan], bcSpan, tagArray1); - } - } - - // write Mbelow, SMbelow, Mabove - if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { - output.writeMbelow(); - output.writeSMbelow(); - output.writeMabove(); - } - - if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) != 0) { - if (baseLimit == prev + 2) { - output.writeChar(chars[prev], prev, tagArray0); - output.writeChar(chars[prev + 1], prev + 1, tagArray0); - } - - output.writeVMabove(); - output.writeSMabove(); // FIXME: there are no SM's in these scripts... - } - - // write post-base consonants - // FIXME: does this put the right tags on post-base consonants? - if (baseConsonant != lastConsonant && !seenPreBaseForm) { - if (postBase <= lastConsonant) { - for (i = postBase; i <= lastConsonant; i += 1) { - output.writeChar(chars[i], i, tagArray3); - } - - // write halant that was after base consonant - output.writeChar(chars[bcSpan], bcSpan, tagArray1); - } - - // write the training halant, if there is one - if (lastConsonant < matra && classTable->isVirama(chars[matra])) { - output.writeChar(chars[matra], matra, tagArray4); - } - } - - // write Mpost - if ((classTable->scriptFlags & SF_MATRAS_AFTER_BASE) == 0) { - output.writeMpost(); - } - - output.writeLengthMark(); - output.writeAlLakuna(); - - // write reph - if ((classTable->scriptFlags & SF_REPH_AFTER_BELOW) == 0) { - if (baseLimit == prev + 2) { - output.writeChar(chars[prev], prev, tagArray0); - output.writeChar(chars[prev + 1], prev + 1, tagArray0); - } - - output.writeVMabove(); - output.writeSMabove(); - } - - output.writeVMpost(); - - break; - } - - default: - break; - } - - prev = syllable; - } - - *outMPreFixups = mpreFixups; - - return output.getOutputIndex(); -} - -void IndicReordering::adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success) -{ - if (mpreFixups != NULL) { - mpreFixups->apply(glyphStorage, success); - - delete mpreFixups; - } -} - -void IndicReordering::applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count) -{ - LEErrorCode success = LE_NO_ERROR; - -// This sets us up for 2nd pass of glyph substitution as well as setting the feature masks for the -// GPOS table lookups - - for ( le_int32 i = 0 ; i < count ; i++ ) { - glyphStorage.setAuxData(i, ( presentationFormsMask | positioningFormsMask ), success); - } - -} -void IndicReordering::finalReordering(LEGlyphStorage &glyphStorage, le_int32 count) -{ - LEErrorCode success = LE_NO_ERROR; - - // Reposition REPH as appropriate - - for ( le_int32 i = 0 ; i < count ; i++ ) { - - le_int32 tmpAuxData = glyphStorage.getAuxData(i,success); - LEGlyphID tmpGlyph = glyphStorage.getGlyphID(i,success); - - if ( ( tmpGlyph != NO_GLYPH ) && (tmpAuxData & rephConsonantMask) && !(tmpAuxData & repositionedGlyphMask)) { - - le_bool targetPositionFound = false; - le_int32 targetPosition = i+1; - le_int32 baseConsonantData; - - while (!targetPositionFound) { - tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); - tmpAuxData = glyphStorage.getAuxData(targetPosition,success); - - if ( tmpAuxData & baseConsonantMask ) { - baseConsonantData = tmpAuxData; - targetPositionFound = true; - } else { - targetPosition++; - } - } - - // Make sure we are not putting the reph into an empty hole - - le_bool targetPositionHasGlyph = false; - while (!targetPositionHasGlyph) { - tmpGlyph = glyphStorage.getGlyphID(targetPosition,success); - if ( tmpGlyph != NO_GLYPH ) { - targetPositionHasGlyph = true; - } else { - targetPosition--; - } - } - - // Make sure that REPH is positioned after any above base or post base matras - // - le_bool checkMatraDone = false; - le_int32 checkMatraPosition = targetPosition+1; - while ( !checkMatraDone ) { - tmpAuxData = glyphStorage.getAuxData(checkMatraPosition,success); - if ( checkMatraPosition >= count || ( (tmpAuxData ^ baseConsonantData) & LE_GLYPH_GROUP_MASK)) { - checkMatraDone = true; - continue; - } - if ( (tmpAuxData & matraMask) && - (((tmpAuxData & markPositionMask) == aboveBasePosition) || - ((tmpAuxData & markPositionMask) == postBasePosition))) { - targetPosition = checkMatraPosition; - } - checkMatraPosition++; - } - - glyphStorage.moveGlyph(i,targetPosition,repositionedGlyphMask); - } - } -} - - -le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success) -{ - const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); - if (classTable == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - DynamicProperties dynProps[INDIC_BLOCK_SIZE]; - IndicReordering::getDynamicProperties(dynProps,classTable); - - IndicReorderingOutput output(outChars, glyphStorage, NULL); - le_int32 i, firstConsonant, baseConsonant, secondConsonant, inv_count = 0, beginSyllable = 0; - //le_bool lastInWord = FALSE; - - while (beginSyllable < charCount) { - le_int32 nextSyllable = findSyllable(classTable, chars, beginSyllable, charCount); - - output.reset(); - - // Find the First Consonant - for ( firstConsonant = beginSyllable ; firstConsonant < nextSyllable ; firstConsonant++ ) { - if ( classTable->isConsonant(chars[firstConsonant]) ) { - break; - } - } - - // Find the base consonant - - baseConsonant = nextSyllable - 1; - secondConsonant = firstConsonant; - - // TODO: Use Dynamic Properties for hasBelowBaseForm and hasPostBaseForm() - - while ( baseConsonant > firstConsonant ) { - if ( classTable->isConsonant(chars[baseConsonant]) && - !classTable->hasBelowBaseForm(chars[baseConsonant]) && - !classTable->hasPostBaseForm(chars[baseConsonant]) ) { - break; - } - else { - if ( classTable->isConsonant(chars[baseConsonant]) ) { - secondConsonant = baseConsonant; - } - baseConsonant--; - } - } - - // If the syllable starts with Ra + Halant ( in a script that has Reph ) and has more than one - // consonant, Ra is excluced from candidates for base consonants - - if ( classTable->isReph(chars[beginSyllable]) && - beginSyllable+1 < nextSyllable && classTable->isVirama(chars[beginSyllable+1]) && - secondConsonant != firstConsonant) { - baseConsonant = secondConsonant; - } - - // Populate the output - for ( i = beginSyllable ; i < nextSyllable ; i++ ) { - - // Handle invalid combinartions - - if ( classTable->isVirama(chars[beginSyllable]) || - classTable->isMatra(chars[beginSyllable]) || - classTable->isVowelModifier(chars[beginSyllable]) || - classTable->isNukta(chars[beginSyllable]) ) { - output.writeChar(C_DOTTED_CIRCLE,beginSyllable,basicShapingFormsMask); - inv_count++; - } - output.writeChar(chars[i],i, basicShapingFormsMask); - - } - - // Adjust features and set syllable structure bits - - for ( i = beginSyllable ; i < nextSyllable ; i++ ) { - - FeatureMask outMask = output.getFeatures(i+inv_count); - FeatureMask saveMask = outMask; - - // Since reph can only validly occur at the beginning of a syllable - // We only apply it to the first 2 characters in the syllable, to keep it from - // conflicting with other features ( i.e. rkrf ) - - // TODO : Use the dynamic property for determining isREPH - if ( i == beginSyllable && i < baseConsonant && classTable->isReph(chars[i]) && - i+1 < nextSyllable && classTable->isVirama(chars[i+1])) { - outMask |= rphfFeatureMask; - outMask |= rephConsonantMask; - output.setFeatures(i+1+inv_count,outMask); - - } - - if ( i == baseConsonant ) { - outMask |= baseConsonantMask; - } - - if ( classTable->isMatra(chars[i])) { - outMask |= matraMask; - if ( classTable->hasAboveBaseForm(chars[i])) { - outMask |= aboveBasePosition; - } else if ( classTable->hasBelowBaseForm(chars[i])) { - outMask |= belowBasePosition; - } - } - - // Don't apply half form to virama that stands alone at the end of a syllable - // to prevent half forms from forming when syllable ends with virama - - if ( classTable->isVirama(chars[i]) && (i+1 == nextSyllable) ) { - outMask ^= halfFeatureMask; - if ( classTable->isConsonant(chars[i-1]) ) { - FeatureMask tmp = output.getFeatures(i-1+inv_count); - tmp ^= halfFeatureMask; - output.setFeatures(i-1+inv_count,tmp); - } - } - - if ( outMask != saveMask ) { - output.setFeatures(i+inv_count,outMask); - } - } - - output.decomposeReorderMatras(classTable,beginSyllable,nextSyllable,inv_count); - - beginSyllable = nextSyllable; - } - - - return output.getOutputIndex(); -} - - -void IndicReordering::getDynamicProperties( DynamicProperties *, const IndicClassTable *classTable ) { - - - LEUnicode currentChar; - LEUnicode workChars[2]; - LEGlyphStorage workGlyphs; - - IndicReorderingOutput workOutput(workChars, workGlyphs, NULL); - - //le_int32 offset = 0; - -#if 0 -// TODO: Should this section of code have actually been doing something? - // First find the relevant virama for the script we are dealing with - LEUnicode virama; - for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { - if ( classTable->isVirama(currentChar)) { - virama = currentChar; - break; - } - } -#endif - - for ( currentChar = classTable->firstChar ; currentChar <= classTable->lastChar ; currentChar++ ) { - if ( classTable->isConsonant(currentChar)) { - workOutput.reset(); - } - } - - -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/IndicReordering.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,383 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __INDICREORDERING_H -#define __INDICREORDERING_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -// Characters that get referred to by name... -#define C_SIGN_ZWNJ 0x200C -#define C_SIGN_ZWJ 0x200D - -// Character class values -#define CC_RESERVED 0U -#define CC_VOWEL_MODIFIER 1U -#define CC_STRESS_MARK 2U -#define CC_INDEPENDENT_VOWEL 3U -#define CC_INDEPENDENT_VOWEL_2 4U -#define CC_INDEPENDENT_VOWEL_3 5U -#define CC_CONSONANT 6U -#define CC_CONSONANT_WITH_NUKTA 7U -#define CC_NUKTA 8U -#define CC_DEPENDENT_VOWEL 9U -#define CC_SPLIT_VOWEL_PIECE_1 10U -#define CC_SPLIT_VOWEL_PIECE_2 11U -#define CC_SPLIT_VOWEL_PIECE_3 12U -#define CC_VIRAMA 13U -#define CC_ZERO_WIDTH_MARK 14U -#define CC_AL_LAKUNA 15U -#define CC_COUNT 16U - -// Character class flags -#define CF_CLASS_MASK 0x0000FFFFU - -#define CF_CONSONANT 0x80000000U - -#define CF_REPH 0x40000000U -#define CF_VATTU 0x20000000U -#define CF_BELOW_BASE 0x10000000U -#define CF_POST_BASE 0x08000000U -#define CF_LENGTH_MARK 0x04000000U -#define CF_PRE_BASE 0x02000000U - -#define CF_POS_BEFORE 0x00300000U -#define CF_POS_BELOW 0x00200000U -#define CF_POS_ABOVE 0x00100000U -#define CF_POS_AFTER 0x00000000U -#define CF_POS_MASK 0x00300000U - -#define CF_INDEX_MASK 0x000F0000U -#define CF_INDEX_SHIFT 16 - -// Script flag bits -#define SF_MATRAS_AFTER_BASE 0x80000000U -#define SF_REPH_AFTER_BELOW 0x40000000U -#define SF_EYELASH_RA 0x20000000U -#define SF_MPRE_FIXUP 0x10000000U -#define SF_FILTER_ZERO_WIDTH 0x08000000U - -#define SF_POST_BASE_LIMIT_MASK 0x0000FFFFU -#define SF_NO_POST_BASE_LIMIT 0x00007FFFU - -#define SM_MAX_PIECES 3 - -typedef LEUnicode SplitMatra[SM_MAX_PIECES]; - -class MPreFixups; -class LEGlyphStorage; - -// Dynamic Properties ( v2 fonts only ) -typedef le_uint32 DynamicProperties; - -#define DP_REPH 0x80000000U -#define DP_HALF 0x40000000U -#define DP_PREF 0x20000000U -#define DP_BLWF 0x10000000U -#define DP_PSTF 0x08000000U - -struct IndicClassTable -{ - typedef le_uint32 CharClass; - typedef le_uint32 ScriptFlags; - - LEUnicode firstChar; - LEUnicode lastChar; - le_int32 worstCaseExpansion; - ScriptFlags scriptFlags; - const CharClass *classTable; - const SplitMatra *splitMatraTable; - - inline le_int32 getWorstCaseExpansion() const; - inline le_bool getFilterZeroWidth() const; - - CharClass getCharClass(LEUnicode ch) const; - - inline const SplitMatra *getSplitMatra(CharClass charClass) const; - - inline le_bool isVowelModifier(LEUnicode ch) const; - inline le_bool isStressMark(LEUnicode ch) const; - inline le_bool isConsonant(LEUnicode ch) const; - inline le_bool isReph(LEUnicode ch) const; - inline le_bool isVirama(LEUnicode ch) const; - inline le_bool isAlLakuna(LEUnicode ch) const; - inline le_bool isNukta(LEUnicode ch) const; - inline le_bool isVattu(LEUnicode ch) const; - inline le_bool isMatra(LEUnicode ch) const; - inline le_bool isSplitMatra(LEUnicode ch) const; - inline le_bool isLengthMark(LEUnicode ch) const; - inline le_bool hasPostOrBelowBaseForm(LEUnicode ch) const; - inline le_bool hasPostBaseForm(LEUnicode ch) const; - inline le_bool hasBelowBaseForm(LEUnicode ch) const; - inline le_bool hasAboveBaseForm(LEUnicode ch) const; - inline le_bool hasPreBaseForm(LEUnicode ch) const; - - inline static le_bool isVowelModifier(CharClass charClass); - inline static le_bool isStressMark(CharClass charClass); - inline static le_bool isConsonant(CharClass charClass); - inline static le_bool isReph(CharClass charClass); - inline static le_bool isVirama(CharClass charClass); - inline static le_bool isAlLakuna(CharClass charClass); - inline static le_bool isNukta(CharClass charClass); - inline static le_bool isVattu(CharClass charClass); - inline static le_bool isMatra(CharClass charClass); - inline static le_bool isSplitMatra(CharClass charClass); - inline static le_bool isLengthMark(CharClass charClass); - inline static le_bool hasPostOrBelowBaseForm(CharClass charClass); - inline static le_bool hasPostBaseForm(CharClass charClass); - inline static le_bool hasBelowBaseForm(CharClass charClass); - inline static le_bool hasAboveBaseForm(CharClass charClass); - inline static le_bool hasPreBaseForm(CharClass charClass); - - static const IndicClassTable *getScriptClassTable(le_int32 scriptCode); -}; - -class IndicReordering /* not : public UObject because all methods are static */ { -public: - static le_int32 getWorstCaseExpansion(le_int32 scriptCode); - - static le_bool getFilterZeroWidth(le_int32 scriptCode); - - static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage, - MPreFixups **outMPreFixups, LEErrorCode& success); - - static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success); - - static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success); - - static const FeatureMap *getFeatureMap(le_int32 &count); - - static const FeatureMap *getv2FeatureMap(le_int32 &count); - - static void applyPresentationForms(LEGlyphStorage &glyphStorage, le_int32 count); - - static void finalReordering(LEGlyphStorage &glyphStorage, le_int32 count); - - static void getDynamicProperties(DynamicProperties *dProps, const IndicClassTable *classTable); - -private: - // do not instantiate - IndicReordering(); - - static le_int32 findSyllable(const IndicClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); - -}; - -inline le_int32 IndicClassTable::getWorstCaseExpansion() const -{ - return worstCaseExpansion; -} - -inline le_bool IndicClassTable::getFilterZeroWidth() const -{ - return (scriptFlags & SF_FILTER_ZERO_WIDTH) != 0; -} - -inline const SplitMatra *IndicClassTable::getSplitMatra(CharClass charClass) const -{ - le_int32 index = (charClass & CF_INDEX_MASK) >> CF_INDEX_SHIFT; - - return &splitMatraTable[index - 1]; -} - -inline le_bool IndicClassTable::isVowelModifier(CharClass charClass) -{ - return (charClass & CF_CLASS_MASK) == CC_VOWEL_MODIFIER; -} - -inline le_bool IndicClassTable::isStressMark(CharClass charClass) -{ - return (charClass & CF_CLASS_MASK) == CC_STRESS_MARK; -} - -inline le_bool IndicClassTable::isConsonant(CharClass charClass) -{ - return (charClass & CF_CONSONANT) != 0; -} - -inline le_bool IndicClassTable::isReph(CharClass charClass) -{ - return (charClass & CF_REPH) != 0; -} - -inline le_bool IndicClassTable::isNukta(CharClass charClass) -{ - return (charClass & CF_CLASS_MASK) == CC_NUKTA; -} - -inline le_bool IndicClassTable::isVirama(CharClass charClass) -{ - return (charClass & CF_CLASS_MASK) == CC_VIRAMA; -} - -inline le_bool IndicClassTable::isAlLakuna(CharClass charClass) -{ - return (charClass & CF_CLASS_MASK) == CC_AL_LAKUNA; -} - -inline le_bool IndicClassTable::isVattu(CharClass charClass) -{ - return (charClass & CF_VATTU) != 0; -} - -inline le_bool IndicClassTable::isMatra(CharClass charClass) -{ - charClass &= CF_CLASS_MASK; - - return charClass >= CC_DEPENDENT_VOWEL && charClass <= CC_SPLIT_VOWEL_PIECE_3; -} - -inline le_bool IndicClassTable::isSplitMatra(CharClass charClass) -{ - return (charClass & CF_INDEX_MASK) != 0; -} - -inline le_bool IndicClassTable::isLengthMark(CharClass charClass) -{ - return (charClass & CF_LENGTH_MARK) != 0; -} - -inline le_bool IndicClassTable::hasPostOrBelowBaseForm(CharClass charClass) -{ - return (charClass & (CF_POST_BASE | CF_BELOW_BASE)) != 0; -} - -inline le_bool IndicClassTable::hasPostBaseForm(CharClass charClass) -{ - return (charClass & CF_POST_BASE) != 0; -} - -inline le_bool IndicClassTable::hasPreBaseForm(CharClass charClass) -{ - return (charClass & CF_PRE_BASE) != 0; -} - -inline le_bool IndicClassTable::hasBelowBaseForm(CharClass charClass) -{ - return (charClass & CF_BELOW_BASE) != 0; -} - -inline le_bool IndicClassTable::hasAboveBaseForm(CharClass charClass) -{ - return ((charClass & CF_POS_MASK) == CF_POS_ABOVE); -} - -inline le_bool IndicClassTable::isVowelModifier(LEUnicode ch) const -{ - return isVowelModifier(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isStressMark(LEUnicode ch) const -{ - return isStressMark(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isConsonant(LEUnicode ch) const -{ - return isConsonant(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isReph(LEUnicode ch) const -{ - return isReph(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isVirama(LEUnicode ch) const -{ - return isVirama(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isAlLakuna(LEUnicode ch) const -{ - return isAlLakuna(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isNukta(LEUnicode ch) const -{ - return isNukta(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isVattu(LEUnicode ch) const -{ - return isVattu(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isMatra(LEUnicode ch) const -{ - return isMatra(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isSplitMatra(LEUnicode ch) const -{ - return isSplitMatra(getCharClass(ch)); -} - -inline le_bool IndicClassTable::isLengthMark(LEUnicode ch) const -{ - return isLengthMark(getCharClass(ch)); -} - -inline le_bool IndicClassTable::hasPostOrBelowBaseForm(LEUnicode ch) const -{ - return hasPostOrBelowBaseForm(getCharClass(ch)); -} - -inline le_bool IndicClassTable::hasPostBaseForm(LEUnicode ch) const -{ - return hasPostBaseForm(getCharClass(ch)); -} - -inline le_bool IndicClassTable::hasBelowBaseForm(LEUnicode ch) const -{ - return hasBelowBaseForm(getCharClass(ch)); -} - -inline le_bool IndicClassTable::hasPreBaseForm(LEUnicode ch) const -{ - return hasPreBaseForm(getCharClass(ch)); -} - -inline le_bool IndicClassTable::hasAboveBaseForm(LEUnicode ch) const -{ - return hasAboveBaseForm(getCharClass(ch)); -} -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/KernTable.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,288 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 2004-2010 - All Rights Reserved - * - */ - -#include "KernTable.h" -#include "LEFontInstance.h" -#include "LEGlyphStorage.h" - -#include "LESwaps.h" -#include "OpenTypeUtilities.h" - -#include <stdio.h> - -#define DEBUG_KERN_TABLE 0 - -U_NAMESPACE_BEGIN - -struct PairInfo { - le_uint32 key; // sigh, MSVC compiler gags on union here - le_int16 value; // fword, kern value in funits -}; -#define KERN_PAIRINFO_SIZE 6 -LE_CORRECT_SIZE(PairInfo, KERN_PAIRINFO_SIZE) -struct Subtable_0 { - le_uint16 nPairs; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; -}; -#define KERN_SUBTABLE_0_HEADER_SIZE 8 -LE_CORRECT_SIZE(Subtable_0, KERN_SUBTABLE_0_HEADER_SIZE) - -// Kern table version 0 only -struct SubtableHeader { - le_uint16 version; - le_uint16 length; - le_uint16 coverage; -}; -#define KERN_SUBTABLE_HEADER_SIZE 6 -LE_CORRECT_SIZE(SubtableHeader, KERN_SUBTABLE_HEADER_SIZE) - -// Version 0 only, version 1 has different layout -struct KernTableHeader { - le_uint16 version; - le_uint16 nTables; -}; -#define KERN_TABLE_HEADER_SIZE 4 -LE_CORRECT_SIZE(KernTableHeader, KERN_TABLE_HEADER_SIZE) - -#define COVERAGE_HORIZONTAL 0x1 -#define COVERAGE_MINIMUM 0x2 -#define COVERAGE_CROSS 0x4 -#define COVERAGE_OVERRIDE 0x8 - -/* - * This implementation has support for only one subtable, so if the font has - * multiple subtables, only the first will be used. If this turns out to - * be a problem in practice we should add it. - * - * This also supports only version 0 of the kern table header, only - * Apple supports the latter. - * - * This implementation isn't careful about the kern table flags, and - * might invoke kerning when it is not supposed to. That too I'm - * leaving for a bug fix. - * - * TODO: support multiple subtables - * TODO: respect header flags - */ -KernTable::KernTable(const LETableReference& base, LEErrorCode &success) - : pairsSwapped(NULL), fTable(base) -{ - if(LE_FAILURE(success) || (fTable.isEmpty())) { -#if DEBUG_KERN_TABLE - fprintf(stderr, "no kern data\n"); -#endif - return; - } - LEReferenceTo<KernTableHeader> header(fTable, success); - -#if DEBUG_KERN_TABLE - // dump first 32 bytes of header - for (int i = 0; i < 64; ++i) { - fprintf(stderr, "%0.2x ", ((const char*)header.getAlias())[i]&0xff); - if (((i+1)&0xf) == 0) { - fprintf(stderr, "\n"); - } else if (((i+1)&0x7) == 0) { - fprintf(stderr, " "); - } - } -#endif - - if(LE_FAILURE(success)) return; - - if (!header.isEmpty() && header->version == 0 && SWAPW(header->nTables) > 0) { - LEReferenceTo<SubtableHeader> subhead(header, success, KERN_TABLE_HEADER_SIZE); - - if (LE_SUCCESS(success) && !subhead.isEmpty() && subhead->version == 0) { - coverage = SWAPW(subhead->coverage); - if (coverage & COVERAGE_HORIZONTAL) { // only handle horizontal kerning - LEReferenceTo<Subtable_0> table(subhead, success, KERN_SUBTABLE_HEADER_SIZE); - - if(table.isEmpty() || LE_FAILURE(success)) return; - - nPairs = SWAPW(table->nPairs); - -#if 0 // some old fonts have bad values here... - searchRange = SWAPW(table->searchRange); - entrySelector = SWAPW(table->entrySelector); - rangeShift = SWAPW(table->rangeShift); -#else - entrySelector = OpenTypeUtilities::highBit(nPairs); - searchRange = (1 << entrySelector) * KERN_PAIRINFO_SIZE; - rangeShift = (nPairs * KERN_PAIRINFO_SIZE) - searchRange; -#endif - - if(LE_SUCCESS(success) && nPairs>0) { - // pairsSwapped is an instance member, and table is on the stack. - // set 'pairsSwapped' based on table.getAlias(). This will range check it. - - pairsSwapped = (PairInfo*)(fTable.getFont()->getKernPairs()); - if (pairsSwapped == NULL) { - LEReferenceToArrayOf<PairInfo>pairs = - LEReferenceToArrayOf<PairInfo>(fTable, // based on overall table - success, - (const PairInfo*)table.getAlias(), // subtable 0 + .. - KERN_SUBTABLE_0_HEADER_SIZE, // .. offset of header size - nPairs); // count - if (LE_SUCCESS(success) && pairs.isValid()) { - pairsSwapped = (PairInfo*)(malloc(nPairs*sizeof(PairInfo))); - PairInfo *p = (PairInfo*)pairsSwapped; - for (int i = 0; LE_SUCCESS(success) && i < nPairs; i++, p++) { - memcpy(p, pairs.getAlias(i,success), KERN_PAIRINFO_SIZE); - p->key = SWAPL(p->key); - } - fTable.getFont()->setKernPairs((void*)pairsSwapped); // store it - } - } - } - -#if 0 - fprintf(stderr, "coverage: %0.4x nPairs: %d pairs %p\n", coverage, nPairs, pairsSwapped); - fprintf(stderr, " searchRange: %d entrySelector: %d rangeShift: %d\n", searchRange, entrySelector, rangeShift); - fprintf(stderr, "[[ ignored font table entries: range %d selector %d shift %d ]]\n", SWAPW(table->searchRange), SWAPW(table->entrySelector), SWAPW(table->rangeShift)); -#endif -#if DEBUG_KERN_TABLE - fprintf(stderr, "coverage: %0.4x nPairs: %d pairs 0x%x\n", coverage, nPairs, pairsSwapped); - fprintf(stderr, - " searchRange(pairs): %d entrySelector: %d rangeShift(pairs): %d\n", - searchRange, entrySelector, rangeShift); - - if (LE_SUCCESS(success)) { - // dump part of the pair list - char ids[256]; - for (int i = 256; --i >= 0;) { - LEGlyphID id = font->mapCharToGlyph(i); - if (id < 256) { - ids[id] = (char)i; - } - } - PairInfo *p = pairsSwapped; - for (int i = 0; i < nPairs; ++i, p++) { - le_uint32 k = p->key; - le_uint16 left = (k >> 16) & 0xffff; - le_uint16 right = k & 0xffff; - if (left < 256 && right < 256) { - char c = ids[left]; - if (c > 0x20 && c < 0x7f) { - fprintf(stderr, "%c/", c & 0xff); - } else { - fprintf(stderr, "%0.2x/", c & 0xff); - } - c = ids[right]; - if (c > 0x20 && c < 0x7f) { - fprintf(stderr, "%c ", c & 0xff); - } else { - fprintf(stderr, "%0.2x ", c & 0xff); - } - } - } - } -#endif - } - } - } -} - - -/* - * Process the glyph positions. The positions array has two floats for each - * glyph, plus a trailing pair to mark the end of the last glyph. - */ -void KernTable::process(LEGlyphStorage& storage, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return; - - if (pairsSwapped) { - success = LE_NO_ERROR; - - le_uint32 key = storage[0]; // no need to mask off high bits - float adjust = 0; - - for (int i = 1, e = storage.getGlyphCount(); LE_SUCCESS(success)&& i < e; ++i) { - key = key << 16 | (storage[i] & 0xffff); - - // argh, to do a binary search, we need to have the pair list in sorted order - // but it is not in sorted order on win32 platforms because of the endianness difference - // so either I have to swap the element each time I examine it, or I have to swap - // all the elements ahead of time and store them in the font - - const PairInfo* p = pairsSwapped; - const PairInfo* tp = (const PairInfo*)(p + (rangeShift/KERN_PAIRINFO_SIZE)); /* rangeshift is in original table bytes */ - if (key > tp->key) { - p = tp; - } - -#if DEBUG_KERN_TABLE - fprintf(stderr, "binary search for %0.8x\n", key); -#endif - - le_uint32 probe = searchRange; - while (probe > 1) { - probe >>= 1; - tp = (const PairInfo*)(p + (probe/KERN_PAIRINFO_SIZE)); - le_uint32 tkey = tp->key; -#if DEBUG_KERN_TABLE - fprintf(stdout, " %.3d (%0.8x)\n", (tp - pairsSwapped), tkey); -#endif - if (tkey <= key) { - if (tkey == key) { - le_int16 value = SWAPW(tp->value); -#if DEBUG_KERN_TABLE - fprintf(stdout, "binary found kerning pair %x:%x at %d, value: 0x%x (%g)\n", - storage[i-1], storage[i], i, value & 0xffff, font->xUnitsToPoints(value)); - fflush(stdout); -#endif - // Have to undo the device transform. - // REMIND either find a way to do this only if there is a - // device transform, or a faster way, such as moving the - // entire kern table up to Java. - LEPoint pt; - pt.fX = fTable.getFont()->xUnitsToPoints(value); - pt.fY = 0; - - fTable.getFont()->getKerningAdjustment(pt); - adjust += pt.fX; - break; - } - p = tp; - } - } - - storage.adjustPosition(i, adjust, 0, success); - } - storage.adjustPosition(storage.getGlyphCount(), adjust, 0, success); - } -} - -U_NAMESPACE_END -
--- a/src/java.desktop/share/native/libfontmanager/layout/KernTable.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 2004-2013 - All Rights Reserved - * - */ - -#ifndef __KERNTABLE_H -#define __KERNTABLE_H - -#ifndef __LETYPES_H -#include "LETypes.h" -#endif - -#include "LETypes.h" -#include "LETableReference.h" -//#include "LEFontInstance.h" -//#include "LEGlyphStorage.h" - -#include <stdio.h> - -U_NAMESPACE_BEGIN -struct PairInfo; -class LEFontInstance; -class LEGlyphStorage; - -/** - * Windows type 0 kerning table support only for now. - */ -class U_LAYOUT_API KernTable -{ - private: - le_uint16 coverage; - le_uint16 nPairs; - PairInfo *pairsSwapped; - const LETableReference &fTable; - le_uint16 searchRange; - le_uint16 entrySelector; - le_uint16 rangeShift; - - public: - KernTable(const LETableReference &table, LEErrorCode &success); - - /* - * Process the glyph positions. - */ - void process(LEGlyphStorage& storage, LEErrorCode &success); -}; - -U_NAMESPACE_END - -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/KhmerLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved - * - * This file is a modification of the ICU file IndicLayoutEngine.cpp - * by Jens Herden and Javier Sola for Khmer language - * - */ - - -#include "OpenTypeLayoutEngine.h" -#include "KhmerLayoutEngine.h" -#include "LEGlyphStorage.h" -#include "KhmerReordering.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(KhmerOpenTypeLayoutEngine) - -KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) -{ - fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; -} - -KhmerOpenTypeLayoutEngine::KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) -{ - fFeatureMap = KhmerReordering::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; -} - -KhmerOpenTypeLayoutEngine::~KhmerOpenTypeLayoutEngine() -{ - // nothing to do -} - -// Input: characters -// Output: characters, char indices, tags -// Returns: output character count -le_int32 KhmerOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough - - outChars = LE_NEW_ARRAY(LEUnicode, worstCase); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - // NOTE: assumes this allocates featureTags... - // (probably better than doing the worst case stuff here...) - le_int32 outCharCount = KhmerReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); - - glyphStorage.adoptGlyphCount(outCharCount); - return outCharCount; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/KhmerLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved - * - * This file is a modification of the ICU file IndicLayoutEngine.h - * by Jens Herden and Javier Sola for Khmer language - * - */ - -#ifndef __KHMERLAYOUTENGINE_H -#define __KHMERLAYOUTENGINE_H - -// #include "LETypes.h" -// #include "LEFontInstance.h" -// #include "LEGlyphFilter.h" -// #include "LayoutEngine.h" -// #include "OpenTypeLayoutEngine.h" - -// #include "GlyphSubstitutionTables.h" -// #include "GlyphDefinitionTables.h" -// #include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -// class MPreFixups; -// class LEGlyphStorage; - -/** - * This class implements OpenType layout for Khmer OpenType fonts, as - * specified by Microsoft in "Creating and Supporting OpenType Fonts for - * Khmer Scripts" (http://www.microsoft.com/typography/otspec/indicot/default.htm) TODO: change url - * - * This class overrides the characterProcessing method to do Khmer character processing - * and reordering (See the MS spec. for more details) - * - * @internal - */ -class KhmerOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of KhmerOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * Khmer OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - KhmerOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~KhmerOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Khmer OpenType character processing. It assigns the OpenType feature - * tags to the characters, and may generate output characters which have been reordered. - * It may also split some vowels, resulting in more output characters than input characters. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. - * the auxillary data array will be set to the feature tags. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/KhmerReordering.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,524 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved - * - * This file is a modification of the ICU file IndicReordering.cpp - * by Jens Herden and Javier Sola for Khmer language - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "KhmerReordering.h" -#include "LEGlyphStorage.h" - - -U_NAMESPACE_BEGIN - -// Characters that get referred to by name... -enum -{ - C_SIGN_ZWNJ = 0x200C, - C_SIGN_ZWJ = 0x200D, - C_DOTTED_CIRCLE = 0x25CC, - C_RO = 0x179A, - C_VOWEL_AA = 0x17B6, - C_SIGN_NIKAHIT = 0x17C6, - C_VOWEL_E = 0x17C1, - C_COENG = 0x17D2 -}; - - -enum -{ - // simple classes, they are used in the statetable (in this file) to control the length of a syllable - // they are also used to know where a character should be placed (location in reference to the base character) - // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to - // indicate error in syllable construction - _xx = KhmerClassTable::CC_RESERVED, - _sa = KhmerClassTable::CC_SIGN_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_POS_ABOVE, - _sp = KhmerClassTable::CC_SIGN_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE| KhmerClassTable::CF_POS_AFTER, - _c1 = KhmerClassTable::CC_CONSONANT | KhmerClassTable::CF_CONSONANT, - _c2 = KhmerClassTable::CC_CONSONANT2 | KhmerClassTable::CF_CONSONANT, - _c3 = KhmerClassTable::CC_CONSONANT3 | KhmerClassTable::CF_CONSONANT, - _rb = KhmerClassTable::CC_ROBAT | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE, - _cs = KhmerClassTable::CC_CONSONANT_SHIFTER | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_SHIFTER, - _dl = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BEFORE | KhmerClassTable::CF_DOTTED_CIRCLE, - _db = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_BELOW | KhmerClassTable::CF_DOTTED_CIRCLE, - _da = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_ABOVE | KhmerClassTable::CF_DOTTED_CIRCLE | KhmerClassTable::CF_ABOVE_VOWEL, - _dr = KhmerClassTable::CC_DEPENDENT_VOWEL | KhmerClassTable::CF_POS_AFTER | KhmerClassTable::CF_DOTTED_CIRCLE, - _co = KhmerClassTable::CC_COENG | KhmerClassTable::CF_COENG | KhmerClassTable::CF_DOTTED_CIRCLE, - - // split vowel - _va = _da | KhmerClassTable::CF_SPLIT_VOWEL, - _vr = _dr | KhmerClassTable::CF_SPLIT_VOWEL -}; - - -// Character class tables -// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs... -// _sa Sign placed above the base -// _sp Sign placed after the base -// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants) -// _c2 Consonant of type 2 (only RO) -// _c3 Consonant of type 3 -// _rb Khmer sign robat u17CC. combining mark for subscript consonants -// _cd Consonant-shifter -// _dl Dependent vowel placed before the base (left of the base) -// _db Dependent vowel placed below the base -// _da Dependent vowel placed above the base -// _dr Dependent vowel placed behind the base (right of the base) -// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following -// it to create a subscript consonant or independent vowel -// _va Khmer split vowel in wich the first part is before the base and the second one above the base -// _vr Khmer split vowel in wich the first part is before the base and the second one behind (right of) the base - -static const KhmerClassTable::CharClass khmerCharClasses[] = -{ - _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, // 1780 - 178F - _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, // 1790 - 179F - _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, // 17A0 - 17AF - _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, // 17B0 - 17BF - _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, // 17C0 - 17CF - _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx, // 17D0 - 17DF -}; - - -// -// Khmer Class Tables -// - -// -// The range of characters defined in the above table is defined here. FOr Khmer 1780 to 17DF -// Even if the Khmer range is bigger, all other characters are not combinable, and therefore treated -// as _xx -static const KhmerClassTable khmerClassTable = {0x1780, 0x17df, khmerCharClasses}; - - -// Below we define how a character in the input string is either in the khmerCharClasses table -// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear -// within the syllable, but are not in the table) we also get their type back, or an unknown object -// in which case we get _xx (CC_RESERVED) back -KhmerClassTable::CharClass KhmerClassTable::getCharClass(LEUnicode ch) const -{ - - if (ch == C_SIGN_ZWJ) { - return CC_ZERO_WIDTH_J_MARK; - } - - if (ch == C_SIGN_ZWNJ) { - return CC_ZERO_WIDTH_NJ_MARK; - } - - if (ch < firstChar || ch > lastChar) { - return CC_RESERVED; - } - - return classTable[ch - firstChar]; -} - -const KhmerClassTable *KhmerClassTable::getKhmerClassTable() -{ - return &khmerClassTable; -} - - - -class KhmerReorderingOutput : public UMemory { -private: - le_int32 fSyllableCount; - le_int32 fOutIndex; - LEUnicode *fOutChars; - - LEGlyphStorage &fGlyphStorage; - - -public: - KhmerReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) - : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) - { - // nothing else to do... - } - - ~KhmerReorderingOutput() - { - // nothing to do here... - } - - void reset() - { - fSyllableCount += 1; - } - - void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask charFeatures) - { - LEErrorCode success = LE_NO_ERROR; - - fOutChars[fOutIndex] = ch; - - fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); - fGlyphStorage.setAuxData(fOutIndex, charFeatures | (fSyllableCount & LE_GLYPH_GROUP_MASK), success); - - fOutIndex += 1; - } - - le_int32 getOutputIndex() - { - return fOutIndex; - } -}; - - -#define blwfFeatureTag LE_BLWF_FEATURE_TAG -#define pstfFeatureTag LE_PSTF_FEATURE_TAG -#define presFeatureTag LE_PRES_FEATURE_TAG -#define blwsFeatureTag LE_BLWS_FEATURE_TAG -#define abvsFeatureTag LE_ABVS_FEATURE_TAG -#define pstsFeatureTag LE_PSTS_FEATURE_TAG - -#define blwmFeatureTag LE_BLWM_FEATURE_TAG -#define abvmFeatureTag LE_ABVM_FEATURE_TAG -#define distFeatureTag LE_DIST_FEATURE_TAG - -#define prefFeatureTag LE_PREF_FEATURE_TAG -#define abvfFeatureTag LE_ABVF_FEATURE_TAG -#define cligFeatureTag LE_CLIG_FEATURE_TAG -#define mkmkFeatureTag LE_MKMK_FEATURE_TAG - -#define prefFeatureMask 0x80000000UL -#define blwfFeatureMask 0x40000000UL -#define abvfFeatureMask 0x20000000UL -#define pstfFeatureMask 0x10000000UL -#define presFeatureMask 0x08000000UL -#define blwsFeatureMask 0x04000000UL -#define abvsFeatureMask 0x02000000UL -#define pstsFeatureMask 0x01000000UL -#define cligFeatureMask 0x00800000UL -#define distFeatureMask 0x00400000UL -#define blwmFeatureMask 0x00200000UL -#define abvmFeatureMask 0x00100000UL -#define mkmkFeatureMask 0x00080000UL - -#define tagPref (prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) -#define tagAbvf (abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) -#define tagPstf (blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) -#define tagBlwf (blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) -#define tagDefault (prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) - - - -// These are in the order in which the features need to be applied -// for correct processing -static const FeatureMap featureMap[] = -{ - // Shaping features - {prefFeatureTag, prefFeatureMask}, - {blwfFeatureTag, blwfFeatureMask}, - {abvfFeatureTag, abvfFeatureMask}, - {pstfFeatureTag, pstfFeatureMask}, - {presFeatureTag, presFeatureMask}, - {blwsFeatureTag, blwsFeatureMask}, - {abvsFeatureTag, abvsFeatureMask}, - {pstsFeatureTag, pstsFeatureMask}, - {cligFeatureTag, cligFeatureMask}, - - // Positioning features - {distFeatureTag, distFeatureMask}, - {blwmFeatureTag, blwmFeatureMask}, - {abvmFeatureTag, abvmFeatureMask}, - {mkmkFeatureTag, mkmkFeatureMask}, -}; - -static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); - -// The stateTable is used to calculate the end (the length) of a well -// formed Khmer Syllable. -// -// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable -// CharClassValues in KhmerReordering.h This coincidence of values allows the -// follow up of the table. -// -// Each line corresponds to a state, which does not necessarily need to be a type -// of component... for example, state 2 is a base, with is always a first character -// in the syllable, but the state could be produced a consonant of any type when -// it is the first character that is analysed (in ground state). -// -// Differentiating 3 types of consonants is necessary in order to -// forbid the use of certain combinations, such as having a second -// coeng after a coeng RO, -// The inexistent possibility of having a type 3 after another type 3 is permitted, -// eliminating it would very much complicate the table, and it does not create typing -// problems, as the case above. -// -// The table is quite complex, in order to limit the number of coeng consonants -// to 2 (by means of the table). -// -// There a peculiarity, as far as Unicode is concerned: -// - The consonant-shifter is considered in two possible different -// locations, the one considered in Unicode 3.0 and the one considered in -// Unicode 4.0. (there is a backwards compatibility problem in this standard). - - -// xx independent character, such as a number, punctuation sign or non-khmer char -// -// c1 Khmer consonant of type 1 or an independent vowel -// that is, a letter in which the subscript for is only under the -// base, not taking any space to the right or to the left -// -// c2 Khmer consonant of type 2, the coeng form takes space under -// and to the left of the base (only RO is of this type) -// -// c3 Khmer consonant of type 3. Its subscript form takes space under -// and to the right of the base. -// -// cs Khmer consonant shifter -// -// rb Khmer robat -// -// co coeng character (u17D2) -// -// dv dependent vowel (including split vowels, they are treated in the same way). -// even if dv is not defined above, the component that is really tested for is -// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels -// -// zwj Zero Width joiner -// -// zwnj Zero width non joiner -// -// sa above sign -// -// sp post sign -// -// there are lines with equal content but for an easier understanding -// (and maybe change in the future) we did not join them -// -static const le_int8 khmerStateTable[][KhmerClassTable::CC_COUNT] = -{ - -// xx c1 c2 c3 zwnj cs rb co dv sa sp zwj - { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, // 0 - ground state - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 1 - exit state (or sign to the right of the syllable) - {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, // 2 - Base consonant - {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, // 3 - First ZWNJ before a register shifter - // It can only be followed by a shifter or a vowel - {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, // 4 - First register shifter - {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, // 5 - Robat - {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, // 6 - First Coeng - {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 7 - First consonant of type 1 after coeng - {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, // 8 - First consonant of type 2 after coeng - {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, // 9 - First consonant or type 3 after ceong - {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, // 10 - Second Coeng (no register shifter before) - {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 11 - Second coeng consonant (or ind. vowel) no register shifter before - {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, // 12 - Second ZWNJ before a register shifter - {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, // 13 - Second register shifter - {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 14 - ZWJ before vowel - {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, // 15 - ZWNJ before vowel - {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, // 16 - dependent vowel - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, // 17 - sign above - {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, // 18 - ZWJ after vowel - {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, // 19 - Third coeng - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, // 20 - dependent vowel after a Robat - -}; - - -const FeatureMap *KhmerReordering::getFeatureMap(le_int32 &count) -{ - count = featureMapCount; - - return featureMap; -} - - -// Given an input string of characters and a location in which to start looking -// calculate, using the state table, which one is the last character of the syllable -// that starts in the starting position. -le_int32 KhmerReordering::findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) -{ - le_int32 cursor = prev; - le_int8 state = 0; - - while (cursor < charCount) { - KhmerClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & KhmerClassTable::CF_CLASS_MASK); - - state = khmerStateTable[state][charClass]; - - if (state < 0) { - break; - } - - cursor += 1; - } - - return cursor; -} - - -// This is the real reordering function as applied to the Khmer language - -le_int32 KhmerReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32 /*scriptCode*/, - LEUnicode *outChars, LEGlyphStorage &glyphStorage) -{ - const KhmerClassTable *classTable = KhmerClassTable::getKhmerClassTable(); - - KhmerReorderingOutput output(outChars, glyphStorage); - KhmerClassTable::CharClass charClass; - le_int32 i, prev = 0, coengRo; - - - // This loop only exits when we reach the end of a run, which may contain - // several syllables. - while (prev < charCount) { - le_int32 syllable = findSyllable(classTable, chars, prev, charCount); - - output.reset(); - - // write a pre vowel or the pre part of a split vowel first - // and look out for coeng + ro. RO is the only vowel of type 2, and - // therefore the only one that requires saving space before the base. - coengRo = -1; // There is no Coeng Ro, if found this value will change - for (i = prev; i < syllable; i += 1) { - charClass = classTable->getCharClass(chars[i]); - - // if a split vowel, write the pre part. In Khmer the pre part - // is the same for all split vowels, same glyph as pre vowel C_VOWEL_E - if (charClass & KhmerClassTable::CF_SPLIT_VOWEL) { - output.writeChar(C_VOWEL_E, i, tagPref); - break; // there can be only one vowel - } - - // if a vowel with pos before write it out - if (charClass & KhmerClassTable::CF_POS_BEFORE) { - output.writeChar(chars[i], i, tagPref); - break; // there can be only one vowel - } - - // look for coeng + ro and remember position - // works because coeng + ro is always in front of a vowel (if there is a vowel) - // and because CC_CONSONANT2 is enough to identify it, as it is the only consonant - // with this flag - if ( (charClass & KhmerClassTable::CF_COENG) && (i + 1 < syllable) && - ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == KhmerClassTable::CC_CONSONANT2) ) - { - coengRo = i; - } - } - - // write coeng + ro if found - if (coengRo > -1) { - output.writeChar(C_COENG, coengRo, tagPref); - output.writeChar(C_RO, coengRo + 1, tagPref); - } - - // shall we add a dotted circle? - // If in the position in which the base should be (first char in the string) there is - // a character that has the Dotted circle flag (a character that cannot be a base) - // then write a dotted circle - if (classTable->getCharClass(chars[prev]) & KhmerClassTable::CF_DOTTED_CIRCLE) { - output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); - } - - // copy what is left to the output, skipping before vowels and coeng Ro if they are present - for (i = prev; i < syllable; i += 1) { - charClass = classTable->getCharClass(chars[i]); - - // skip a before vowel, it was already processed - if (charClass & KhmerClassTable::CF_POS_BEFORE) { - continue; - } - - // skip coeng + ro, it was already processed - if (i == coengRo) { - i += 1; - continue; - } - - switch (charClass & KhmerClassTable::CF_POS_MASK) { - case KhmerClassTable::CF_POS_ABOVE : - output.writeChar(chars[i], i, tagAbvf); - break; - - case KhmerClassTable::CF_POS_AFTER : - output.writeChar(chars[i], i, tagPstf); - break; - - case KhmerClassTable::CF_POS_BELOW : - output.writeChar(chars[i], i, tagBlwf); - break; - - default: - // assign the correct flags to a coeng consonant - // Consonants of type 3 are taged as Post forms and those type 1 as below forms - if ( (charClass & KhmerClassTable::CF_COENG) && i + 1 < syllable ) { - if ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) - == KhmerClassTable::CC_CONSONANT3) { - output.writeChar(chars[i], i, tagPstf); - i += 1; - output.writeChar(chars[i], i, tagPstf); - } - else { - output.writeChar(chars[i], i, tagBlwf); - i += 1; - output.writeChar(chars[i], i, tagBlwf); - } - break; - } - // if a shifter is followed by an above vowel change the shifter to below form, - // an above vowel can have two possible positions i + 1 or i + 3 - // (position i+1 corresponds to unicode 3, position i+3 to Unicode 4) - // and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two - // different positions, right after the shifter or after a vowel (Unicode 4) - if ( (charClass & KhmerClassTable::CF_SHIFTER) && (i + 1 < syllable) ) { - if ((classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_ABOVE_VOWEL) - || (i + 2 < syllable - && ( (classTable->getCharClass(chars[i + 1]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) - && ( (classTable->getCharClass(chars[i + 2]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT)) - || (i + 3 < syllable && (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_ABOVE_VOWEL)) - || (i + 4 < syllable - && ( (classTable->getCharClass(chars[i + 3]) & KhmerClassTable::CF_CLASS_MASK) == C_VOWEL_AA) - && ( (classTable->getCharClass(chars[i + 4]) & KhmerClassTable::CF_CLASS_MASK) == C_SIGN_NIKAHIT) ) ) - { - output.writeChar(chars[i], i, tagBlwf); - break; - } - - } - // default - any other characters - output.writeChar(chars[i], i, tagDefault); - break; - } // switch - } // for - - prev = syllable; // move the pointer to the start of next syllable - } - - return output.getOutputIndex(); -} - - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/KhmerReordering.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - * This file is a modification of the ICU file IndicReordering.h - * by Jens Herden and Javier Sola for Khmer language - * - */ - -#ifndef __KHMERREORDERING_H -#define __KHMERREORDERING_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -// Vocabulary -// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the -// center of the syllable, it can be souranded by coeng (subscript) consonants, vowels, -// split vowels, signs... but there is only one base in a syllable, it has to be coded as -// the first character of the syllable. -// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant). -// Khmer language has five of them. Khmer split vowels either have one part before the -// base and one after the base or they have a part before the base and a part above the base. -// The first part of all Khmer split vowels is the same character, identical to -// the glyph of Khmer dependent vowel SRA EI -// coeng --> modifier used in Khmer to construct coeng (subscript) consonants -// Differently than indian languages, the coeng modifies the consonant that follows it, -// not the one preceding it Each consonant has two forms, the base form and the subscript form -// the base form is the normal one (using the consonants code-point), the subscript form is -// displayed when the combination coeng + consonant is encountered. -// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant -// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO) -// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA) -// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds -// if it is attached to a consonant of the first series or a consonant of the second series -// Most consonants have an equivalent in the other series, but some of theme exist only in -// one series (for example SA). If we want to use the consonant SA with a vowel sound that -// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant -// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN -// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and -// MUSIKATOAN a second series consonant to have a first series vowel sound. -// Consonant shifter are both normally supercript marks, but, when they are followed by a -// superscript, they change shape and take the form of subscript dependent vowel SRA U. -// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they -// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should -// be placed after the coeng consonant. -// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base -// Each vowel has its own position. Only one vowel per syllable is allowed. -// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are -// Allowed in a syllable. -// -// - -struct KhmerClassTable // This list must include all types of components that can be used inside a syllable -{ - enum CharClassValues // order is important here! This order must be the same that is found in each horizontal - // line in the statetable for Khmer (file KhmerReordering.cpp). - { - CC_RESERVED = 0, - CC_CONSONANT = 1, // consonant of type 1 or independent vowel - CC_CONSONANT2 = 2, // Consonant of type 2 - CC_CONSONANT3 = 3, // Consonant of type 3 - CC_ZERO_WIDTH_NJ_MARK = 4, // Zero Width non joiner character (0x200C) - CC_CONSONANT_SHIFTER = 5, - CC_ROBAT = 6, // Khmer special diacritic accent -treated differently in state table - CC_COENG = 7, // Subscript consonant combining character - CC_DEPENDENT_VOWEL = 8, - CC_SIGN_ABOVE = 9, - CC_SIGN_AFTER = 10, - CC_ZERO_WIDTH_J_MARK = 11, // Zero width joiner character - CC_COUNT = 12 // This is the number of character classes - }; - - enum CharClassFlags - { - CF_CLASS_MASK = 0x0000FFFF, - - CF_CONSONANT = 0x01000000, // flag to speed up comparing - CF_SPLIT_VOWEL = 0x02000000, // flag for a split vowel -> the first part is added in front of the syllable - CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable - CF_COENG = 0x08000000, // flag to speed up comparing - CF_SHIFTER = 0x10000000, // flag to speed up comparing - CF_ABOVE_VOWEL = 0x20000000, // flag to speed up comparing - - // position flags - CF_POS_BEFORE = 0x00080000, - CF_POS_BELOW = 0x00040000, - CF_POS_ABOVE = 0x00020000, - CF_POS_AFTER = 0x00010000, - CF_POS_MASK = 0x000f0000 - }; - - typedef le_uint32 CharClass; - - typedef le_int32 ScriptFlags; - - LEUnicode firstChar; // for Khmer this will become x1780 - LEUnicode lastChar; // and this x17DF - const CharClass *classTable; - - CharClass getCharClass(LEUnicode ch) const; - - static const KhmerClassTable *getKhmerClassTable(); -}; - - -class KhmerReordering /* not : public UObject because all methods are static */ { -public: - static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage); - - static const FeatureMap *getFeatureMap(le_int32 &count); - -private: - // do not instantiate - KhmerReordering(); - - static le_int32 findSyllable(const KhmerClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); - -}; - - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEFontInstance.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - ******************************************************************************* - * - * Copyright (C) 1999-2007, International Business Machines - * Corporation and others. All Rights Reserved. - * - ******************************************************************************* - * file name: LEFontInstance.cpp - * - * created on: 02/06/2003 - * created by: Eric R. Mader - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LEFontInstance.h" -#include "LEGlyphStorage.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEFontInstance) - -LECharMapper::~LECharMapper() -{ - // nothing to do. -} - -LEFontInstance::~LEFontInstance() -{ - // nothing to do -} - -const LEFontInstance *LEFontInstance::getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, - le_int32 script, LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return NULL; - } - - if (chars == NULL || *offset < 0 || limit < 0 || *offset >= limit || script < 0 || script >= scriptCodeCount) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - - *offset = limit; - return this; -} - -void LEFontInstance::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, - le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const -{ - le_int32 i, out = 0, dir = 1; - - if (reverse) { - out = count - 1; - dir = -1; - } - - for (i = offset; i < offset + count; i += 1, out += dir) { - LEUnicode16 high = chars[i]; - LEUnicode32 code = high; - - if (i < offset + count - 1 && high >= 0xD800 && high <= 0xDBFF) { - LEUnicode16 low = chars[i + 1]; - - if (low >= 0xDC00 && low <= 0xDFFF) { - code = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; - } - } - - glyphStorage[out] = mapCharToGlyph(code, mapper, filterZeroWidth); - - if (code >= 0x10000) { - i += 1; - glyphStorage[out += dir] = 0xFFFF; - } - } -} - -LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const -{ - return mapCharToGlyph(ch, mapper, TRUE); -} - -LEGlyphID LEFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const -{ - LEUnicode32 mappedChar = mapper->mapChar(ch); - - if (mappedChar == 0xFFFE || mappedChar == 0xFFFF) { - return 0xFFFF; - } - - if (filterZeroWidth && (mappedChar == 0x200C || mappedChar == 0x200D)) { - return canDisplay(mappedChar)? 0x0001 : 0xFFFF; - } - - return mapCharToGlyph(mappedChar); -} - -le_bool LEFontInstance::canDisplay(LEUnicode32 ch) const -{ - return LE_GET_GLYPH(mapCharToGlyph(ch)) != 0; -} - -float LEFontInstance::xUnitsToPoints(float xUnits) const -{ - return (xUnits * getXPixelsPerEm()) / (float) getUnitsPerEM(); -} - -float LEFontInstance::yUnitsToPoints(float yUnits) const -{ - return (yUnits * getYPixelsPerEm()) / (float) getUnitsPerEM(); -} - -void LEFontInstance::unitsToPoints(LEPoint &units, LEPoint &points) const -{ - points.fX = xUnitsToPoints(units.fX); - points.fY = yUnitsToPoints(units.fY); -} - -float LEFontInstance::xPixelsToUnits(float xPixels) const -{ - return (xPixels * getUnitsPerEM()) / (float) getXPixelsPerEm(); -} - -float LEFontInstance::yPixelsToUnits(float yPixels) const -{ - return (yPixels * getUnitsPerEM()) / (float) getYPixelsPerEm(); -} - -void LEFontInstance::pixelsToUnits(LEPoint &pixels, LEPoint &units) const -{ - units.fX = xPixelsToUnits(pixels.fX); - units.fY = yPixelsToUnits(pixels.fY); -} - -void LEFontInstance::transformFunits(float xFunits, float yFunits, LEPoint &pixels) const -{ - pixels.fX = xUnitsToPoints(xFunits) * getScaleFactorX(); - pixels.fY = yUnitsToPoints(yFunits) * getScaleFactorY(); -} - -le_int32 LEFontInstance::getLineHeight() const -{ - return getAscent() + getDescent() + getLeading(); -} - -U_NAMESPACE_END -
--- a/src/java.desktop/share/native/libfontmanager/layout/LEFontInstance.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,558 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved - * - */ - -#ifndef __LEFONTINSTANCE_H -#define __LEFONTINSTANCE_H - -#include "LETypes.h" -/** - * \file - * \brief C++ API: Layout Engine Font Instance object - */ - -U_NAMESPACE_BEGIN - -/** - * Instances of this class are used by <code>LEFontInstance::mapCharsToGlyphs</code> and - * <code>LEFontInstance::mapCharToGlyph</code> to adjust character codes before the character - * to glyph mapping process. Examples of this are filtering out control characters - * and character mirroring - replacing a character which has both a left and a right - * hand form with the opposite form. - * - * @stable ICU 3.2 - */ -class LECharMapper /* not : public UObject because this is an interface/mixin class */ -{ -public: - /** - * Destructor. - * @stable ICU 3.2 - */ - virtual ~LECharMapper(); - - /** - * This method does the adjustments. - * - * @param ch - the input character - * - * @return the adjusted character - * - * @stable ICU 2.8 - */ - virtual LEUnicode32 mapChar(LEUnicode32 ch) const = 0; -}; - -/** - * This is a forward reference to the class which holds the per-glyph - * storage. - * - * @stable ICU 3.0 - */ -class LEGlyphStorage; - -/** - * This is a virtual base class that serves as the interface between a LayoutEngine - * and the platform font environment. It allows a LayoutEngine to access font tables, do - * character to glyph mapping, and obtain metrics information without knowing any platform - * specific details. There are also a few utility methods for converting between points, - * pixels and funits. (font design units) - * - * An instance of an <code>LEFontInstance</code> represents a font at a particular point - * size. Each instance can represent either a single physical font, or a composite font. - * A composite font is a collection of physical fonts, each of which contains a subset of - * the characters contained in the composite font. - * - * Note: with the exception of <code>getSubFont</code>, the methods in this class only - * make sense for a physical font. If you have an <code>LEFontInstance</code> which - * represents a composite font you should only call the methods below which have - * an <code>LEGlyphID</code>, an <code>LEUnicode</code> or an <code>LEUnicode32</code> - * as one of the arguments because these can be used to select a particular subfont. - * - * Subclasses which implement composite fonts should supply an implementation of these - * methods with some default behavior such as returning constant values, or using the - * values from the first subfont. - * - * @stable ICU 3.0 - */ -class U_LAYOUT_API LEFontInstance : public UObject -{ -public: - - /** - * This virtual destructor is here so that the subclass - * destructors can be invoked through the base class. - * - * @stable ICU 2.8 - */ - virtual ~LEFontInstance(); - - /** - * Get a physical font which can render the given text. For composite fonts, - * if there is no single physical font which can render all of the text, - * return a physical font which can render an initial substring of the text, - * and set the <code>offset</code> parameter to the end of that substring. - * - * Internally, the LayoutEngine works with runs of text all in the same - * font and script, so it is best to call this method with text which is - * in a single script, passing the script code in as a hint. If you don't - * know the script of the text, you can use zero, which is the script code - * for characters used in more than one script. - * - * The default implementation of this method is intended for instances of - * <code>LEFontInstance</code> which represent a physical font. It returns - * <code>this</code> and indicates that the entire string can be rendered. - * - * This method will return a valid <code>LEFontInstance</code> unless you - * have passed illegal parameters, or an internal error has been encountered. - * For composite fonts, it may return the warning <code>LE_NO_SUBFONT_WARNING</code> - * to indicate that the returned font may not be able to render all of - * the text. Whenever a valid font is returned, the <code>offset</code> parameter - * will be advanced by at least one. - * - * Subclasses which implement composite fonts must override this method. - * Where it makes sense, they should use the script code as a hint to render - * characters from the COMMON script in the font which is used for the given - * script. For example, if the input text is a series of Arabic words separated - * by spaces, and the script code passed in is <code>arabScriptCode</code> you - * should return the font used for Arabic characters for all of the input text, - * including the spaces. If, on the other hand, the input text contains characters - * which cannot be rendered by the font used for Arabic characters, but which can - * be rendered by another font, you should return that font for those characters. - * - * @param chars - the array of Unicode characters. - * @param offset - a pointer to the starting offset in the text. On exit this - * will be set the the limit offset of the text which can be - * rendered using the returned font. - * @param limit - the limit offset for the input text. - * @param script - the script hint. - * @param success - set to an error code if the arguments are illegal, or no font - * can be returned for some reason. May also be set to - * <code>LE_NO_SUBFONT_WARNING</code> if the subfont which - * was returned cannot render all of the text. - * - * @return an <code>LEFontInstance</code> for the sub font which can render the characters, or - * <code>NULL</code> if there is an error. - * - * @see LEScripts.h - * - * @stable ICU 3.2 - */ - virtual const LEFontInstance *getSubFont(const LEUnicode chars[], le_int32 *offset, le_int32 limit, le_int32 script, LEErrorCode &success) const; - - // - // Font file access - // - - /** - * This method reads a table from the font. Note that in general, - * it only makes sense to call this method on an <code>LEFontInstance</code> - * which represents a physical font - i.e. one which has been returned by - * <code>getSubFont()</code>. This is because each subfont in a composite font - * will have different tables, and there's no way to know which subfont to access. - * - * Subclasses which represent composite fonts should always return <code>NULL</code>. - * - * This version sets a length, for range checking. - * Note that range checking can only be accomplished if this function is - * implemented in subclasses. - * - * @param tableTag - the four byte table tag. (e.g. 'cmap') - * @param length - ignored on entry, on exit will be the length of the table if known, or -1 if unknown. - * @return the address of the table in memory, or <code>NULL</code> - * if the table doesn't exist. - * @internal - */ - virtual const void* getFontTable(LETag tableTag, size_t &length) const = 0; - - virtual void *getKernPairs() const = 0; - virtual void setKernPairs(void *pairs) const = 0; - - /** - * This method is used to determine if the font can - * render the given character. This can usually be done - * by looking the character up in the font's character - * to glyph mapping. - * - * The default implementation of this method will return - * <code>TRUE</code> if <code>mapCharToGlyph(ch)</code> - * returns a non-zero value. - * - * @param ch - the character to be tested - * - * @return <code>TRUE</code> if the font can render ch. - * - * @stable ICU 3.2 - */ - virtual le_bool canDisplay(LEUnicode32 ch) const; - - /** - * This method returns the number of design units in - * the font's EM square. - * - * @return the number of design units pre EM. - * - * @stable ICU 2.8 - */ - virtual le_int32 getUnitsPerEM() const = 0; - - /** - * This method maps an array of character codes to an array of glyph - * indices, using the font's character to glyph map. - * - * The default implementation iterates over all of the characters and calls - * <code>mapCharToGlyph(ch, mapper)</code> on each one. It also handles surrogate - * characters, storing the glyph ID for the high surrogate, and a deleted glyph (0xFFFF) - * for the low surrogate. - * - * Most sublcasses will not need to implement this method. - * - * @param chars - the character array - * @param offset - the index of the first character - * @param count - the number of characters - * @param reverse - if <code>TRUE</code>, store the glyph indices in reverse order. - * @param mapper - the character mapper. - * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. - * @param glyphStorage - the object which contains the output glyph array - * - * @see LECharMapper - * - * @stable ICU 3.6 - */ - virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, le_bool filterZeroWidth, LEGlyphStorage &glyphStorage) const; - - /** - * This method maps a single character to a glyph index, using the - * font's character to glyph map. The default implementation of this - * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. - * - * @param ch - the character - * @param mapper - the character mapper - * @param filterZeroWidth - <code>TRUE</code> if ZWJ / ZWNJ characters should map to a glyph w/ no contours. - * - * @return the glyph index - * - * @see LECharMapper - * - * @stable ICU 3.6 - */ - virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const; - - /** - * This method maps a single character to a glyph index, using the - * font's character to glyph map. The default implementation of this - * method calls the mapper, and then calls <code>mapCharToGlyph(mappedCh)</code>. - * - * @param ch - the character - * @param mapper - the character mapper - * - * @return the glyph index - * - * @see LECharMapper - * - * @stable ICU 3.2 - */ - virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const; - - /** - * This method maps a single character to a glyph index, using the - * font's character to glyph map. There is no default implementation - * of this method because it requires information about the platform - * font implementation. - * - * @param ch - the character - * - * @return the glyph index - * - * @stable ICU 3.2 - */ - virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch) const = 0; - - // - // Metrics - // - - /** - * This method gets the X and Y advance of a particular glyph, in pixels. - * - * @param glyph - the glyph index - * @param advance - the X and Y pixel values will be stored here - * - * @stable ICU 3.2 - */ - virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const = 0; - - virtual void getKerningAdjustment(LEPoint &adjustment) const = 0; - - /** - * This method gets the hinted X and Y pixel coordinates of a particular - * point in the outline of the given glyph. - * - * @param glyph - the glyph index - * @param pointNumber - the number of the point - * @param point - the point's X and Y pixel values will be stored here - * - * @return <code>TRUE</code> if the point coordinates could be stored. - * - * @stable ICU 2.8 - */ - virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const = 0; - - /** - * This method returns the width of the font's EM square - * in pixels. - * - * @return the pixel width of the EM square - * - * @stable ICU 2.8 - */ - virtual float getXPixelsPerEm() const = 0; - - /** - * This method returns the height of the font's EM square - * in pixels. - * - * @return the pixel height of the EM square - * - * @stable ICU 2.8 - */ - virtual float getYPixelsPerEm() const = 0; - - /** - * This method converts font design units in the - * X direction to points. - * - * @param xUnits - design units in the X direction - * - * @return points in the X direction - * - * @stable ICU 3.2 - */ - virtual float xUnitsToPoints(float xUnits) const; - - /** - * This method converts font design units in the - * Y direction to points. - * - * @param yUnits - design units in the Y direction - * - * @return points in the Y direction - * - * @stable ICU 3.2 - */ - virtual float yUnitsToPoints(float yUnits) const; - - /** - * This method converts font design units to points. - * - * @param units - X and Y design units - * @param points - set to X and Y points - * - * @stable ICU 3.2 - */ - virtual void unitsToPoints(LEPoint &units, LEPoint &points) const; - - /** - * This method converts pixels in the - * X direction to font design units. - * - * @param xPixels - pixels in the X direction - * - * @return font design units in the X direction - * - * @stable ICU 3.2 - */ - virtual float xPixelsToUnits(float xPixels) const; - - /** - * This method converts pixels in the - * Y direction to font design units. - * - * @param yPixels - pixels in the Y direction - * - * @return font design units in the Y direction - * - * @stable ICU 3.2 - */ - virtual float yPixelsToUnits(float yPixels) const; - - /** - * This method converts pixels to font design units. - * - * @param pixels - X and Y pixel - * @param units - set to X and Y font design units - * - * @stable ICU 3.2 - */ - virtual void pixelsToUnits(LEPoint &pixels, LEPoint &units) const; - - /** - * Get the X scale factor from the font's transform. The default - * implementation of <code>transformFunits()</code> will call this method. - * - * @return the X scale factor. - * - * - * @see transformFunits - * - * @stable ICU 3.2 - */ - virtual float getScaleFactorX() const = 0; - - /** - * Get the Y scale factor from the font's transform. The default - * implementation of <code>transformFunits()</code> will call this method. - * - * @return the Yscale factor. - * - * @see transformFunits - * - * @stable ICU 3.2 - */ - virtual float getScaleFactorY() const = 0; - - /** - * This method transforms an X, Y point in font design units to a - * pixel coordinate, applying the font's transform. The default - * implementation of this method calls <code>getScaleFactorX()</code> - * and <code>getScaleFactorY()</code>. - * - * @param xFunits - the X coordinate in font design units - * @param yFunits - the Y coordinate in font design units - * @param pixels - the tranformed co-ordinate in pixels - * - * @see getScaleFactorX - * @see getScaleFactorY - * - * @stable ICU 3.2 - */ - virtual void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const; - - /** - * This is a convenience method used to convert - * values in a 16.16 fixed point format to floating point. - * - * @param fixed - the fixed point value - * - * @return the floating point value - * - * @stable ICU 2.8 - */ - static inline float fixedToFloat(le_int32 fixed); - - /** - * This is a convenience method used to convert - * floating point values to 16.16 fixed point format. - * - * @param theFloat - the floating point value - * - * @return the fixed point value - * - * @stable ICU 2.8 - */ - static inline le_int32 floatToFixed(float theFloat); - - // - // These methods won't ever be called by the LayoutEngine, - // but are useful for clients of <code>LEFontInstance</code> who - // need to render text. - // - - /** - * Get the font's ascent. - * - * @return the font's ascent, in points. This value - * will always be positive. - * - * @stable ICU 3.2 - */ - virtual le_int32 getAscent() const = 0; - - /** - * Get the font's descent. - * - * @return the font's descent, in points. This value - * will always be positive. - * - * @stable ICU 3.2 - */ - virtual le_int32 getDescent() const = 0; - - /** - * Get the font's leading. - * - * @return the font's leading, in points. This value - * will always be positive. - * - * @stable ICU 3.2 - */ - virtual le_int32 getLeading() const = 0; - - /** - * Get the line height required to display text in - * this font. The default implementation of this method - * returns the sum of the ascent, descent, and leading. - * - * @return the line height, in points. This vaule will - * always be positive. - * - * @stable ICU 3.2 - */ - virtual le_int32 getLineHeight() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 3.2 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 3.2 - */ - static UClassID getStaticClassID(); - -}; - -inline float LEFontInstance::fixedToFloat(le_int32 fixed) -{ - return (float) (fixed / 65536.0); -} - -inline le_int32 LEFontInstance::floatToFixed(float theFloat) -{ - return (le_int32) (theFloat * 65536.0); -} - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEGlyphFilter.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __LEGLYPHFILTER__H -#define __LEGLYPHFILTER__H - -#include "LETypes.h" - -U_NAMESPACE_BEGIN - -#ifndef U_HIDE_INTERNAL_API -/** - * This is a helper class that is used to - * recognize a set of glyph indices. - * - * @internal - */ -class LEGlyphFilter /* not : public UObject because this is an interface/mixin class */ { -public: - /** - * Destructor. - * @internal - */ - virtual ~LEGlyphFilter(); - - /** - * This method is used to test a particular - * glyph index to see if it is in the set - * recognized by the filter. - * - * @param glyph - the glyph index to be tested - * - * @return TRUE if the glyph index is in the set. - * - * @internal - */ - virtual le_bool accept(LEGlyphID glyph, LEErrorCode &success) const = 0; -}; -#endif /* U_HIDE_INTERNAL_API */ - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEGlyphStorage.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,696 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - ********************************************************************** - * Copyright (C) 1998-2009, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#include "LETypes.h" -#include "LEInsertionList.h" -#include "LEGlyphStorage.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEGlyphStorage) - -LEInsertionCallback::~LEInsertionCallback() -{ - // nothing to do... -} - -LEGlyphStorage::LEGlyphStorage() - : fGlyphCount(0), fGlyphs(NULL), fCharIndices(NULL), fPositions(NULL), - fAuxData(NULL), fInsertionList(NULL), fSrcIndex(0), fDestIndex(0) -{ - // nothing else to do! -} - -LEGlyphStorage::~LEGlyphStorage() -{ - reset(); -} - -void LEGlyphStorage::reset() -{ - fGlyphCount = 0; - - if (fPositions != NULL) { - LE_DELETE_ARRAY(fPositions); - fPositions = NULL; - } - - if (fAuxData != NULL) { - LE_DELETE_ARRAY(fAuxData); - fAuxData = NULL; - } - - if (fInsertionList != NULL) { - delete fInsertionList; - fInsertionList = NULL; - } - - if (fCharIndices != NULL) { - LE_DELETE_ARRAY(fCharIndices); - fCharIndices = NULL; - } - - if (fGlyphs != NULL) { - LE_DELETE_ARRAY(fGlyphs); - fGlyphs = NULL; - } -} - -// FIXME: This might get called more than once, for various reasons. Is -// testing for pre-existing glyph and charIndices arrays good enough? -void LEGlyphStorage::allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (initialGlyphCount <= 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fGlyphs == NULL) { - fGlyphCount = initialGlyphCount; - fGlyphs = LE_NEW_ARRAY(LEGlyphID, fGlyphCount); - - if (fGlyphs == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - } - - if (fCharIndices == NULL) { - fCharIndices = LE_NEW_ARRAY(le_int32, fGlyphCount); - - if (fCharIndices == NULL) { - LE_DELETE_ARRAY(fGlyphs); - fGlyphs = NULL; - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - - // Initialize the charIndices array - le_int32 i, count = fGlyphCount, dir = 1, out = 0; - - if (rightToLeft) { - out = fGlyphCount - 1; - dir = -1; - } - - for (i = 0; i < count; i += 1, out += dir) { - fCharIndices[out] = i; - } - } - - if (fInsertionList == NULL) { - // FIXME: check this for failure? - fInsertionList = new LEInsertionList(rightToLeft); - if (fInsertionList == NULL) { - LE_DELETE_ARRAY(fCharIndices); - fCharIndices = NULL; - - LE_DELETE_ARRAY(fGlyphs); - fGlyphs = NULL; - - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } -} -} - -// FIXME: do we want to initialize the positions to [0, 0]? -le_int32 LEGlyphStorage::allocatePositions(LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return -1; - } - - if (fPositions != NULL) { - success = LE_INTERNAL_ERROR; - return -1; - } - - fPositions = LE_NEW_ARRAY(float, 2 * (fGlyphCount + 1)); - - if (fPositions == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return -1; - } - - return fGlyphCount; -} - -// FIXME: do we want to initialize the aux data to NULL? -le_int32 LEGlyphStorage::allocateAuxData(LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return -1; - } - - if (fAuxData != NULL) { - success = LE_INTERNAL_ERROR; - return -1; - } - - fAuxData = LE_NEW_ARRAY(le_uint32, fGlyphCount); - - if (fAuxData == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return -1; - } - - return fGlyphCount; -} - -void LEGlyphStorage::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const -{ - le_int32 i; - - if (LE_FAILURE(success)) { - return; - } - - if (charIndices == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - for (i = 0; i < fGlyphCount; i += 1) { - charIndices[i] = fCharIndices[i] + indexBase; - } -} - -void LEGlyphStorage::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return; - } - - if (charIndices == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(charIndices, fCharIndices, fGlyphCount); -} - -// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits -void LEGlyphStorage::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const -{ - le_int32 i; - - if (LE_FAILURE(success)) { - return; - } - - if (glyphs == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - for (i = 0; i < fGlyphCount; i += 1) { - glyphs[i] = fGlyphs[i] | extraBits; - } -} - -void LEGlyphStorage::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return; - } - - if (glyphs == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(glyphs, fGlyphs, fGlyphCount); -} - -LEGlyphID LEGlyphStorage::getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return 0xFFFF; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - return 0xFFFF; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0xFFFF; - } - - return fGlyphs[glyphIndex]; -} - -void LEGlyphStorage::setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (fGlyphs == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - fGlyphs[glyphIndex] = glyphID; -} - -le_int32 LEGlyphStorage::getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return -1; - } - - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return -1; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return -1; - } - - return fCharIndices[glyphIndex]; -} - -void LEGlyphStorage::setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (fCharIndices == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - fCharIndices[glyphIndex] = charIndex; -} - -void LEGlyphStorage::getAuxData(le_uint32 auxData[], LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return; - } - - if (auxData == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fAuxData == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(auxData, fAuxData, fGlyphCount); -} - -le_uint32 LEGlyphStorage::getAuxData(le_int32 glyphIndex, LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (fAuxData == NULL) { - success = LE_NO_LAYOUT_ERROR; - return 0; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - - return fAuxData[glyphIndex]; -} - -void LEGlyphStorage::setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (fAuxData == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - if (glyphIndex < 0 || glyphIndex >= fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - fAuxData[glyphIndex] = auxData; -} - -void LEGlyphStorage::getGlyphPositions(float positions[], LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return; - } - - if (positions == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fPositions == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - LE_ARRAY_COPY(positions, fPositions, fGlyphCount * 2 + 2); -} - -void LEGlyphStorage::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const -{ - if (LE_FAILURE(success)) { - return; - } - - if (glyphIndex < 0 || glyphIndex > fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - if (fPositions == NULL) { - success = LE_NO_LAYOUT_ERROR; - return; - } - - x = fPositions[glyphIndex * 2]; - y = fPositions[glyphIndex * 2 + 1]; -} - -void LEGlyphStorage::setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (glyphIndex < 0 || glyphIndex > fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - _LETRACE("set%-4d\t(%.2f, %.2f)", glyphIndex, x, y); - fPositions[glyphIndex * 2] = x; - fPositions[glyphIndex * 2 + 1] = y; -} - -void LEGlyphStorage::adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (glyphIndex < 0 || glyphIndex > fGlyphCount) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } - - fPositions[glyphIndex * 2] += xAdjust; - fPositions[glyphIndex * 2 + 1] += yAdjust; -} - -void LEGlyphStorage::adoptGlyphArray(LEGlyphStorage &from) -{ - if (fGlyphs != NULL) { - LE_DELETE_ARRAY(fGlyphs); - } - - fGlyphs = from.fGlyphs; - from.fGlyphs = NULL; - - if (fInsertionList != NULL) { - delete fInsertionList; - } - - fInsertionList = from.fInsertionList; - from.fInsertionList = NULL; -} - -void LEGlyphStorage::adoptCharIndicesArray(LEGlyphStorage &from) -{ - if (fCharIndices != NULL) { - LE_DELETE_ARRAY(fCharIndices); - } - - fCharIndices = from.fCharIndices; - from.fCharIndices = NULL; -} - -void LEGlyphStorage::adoptPositionArray(LEGlyphStorage &from) -{ - if (fPositions != NULL) { - LE_DELETE_ARRAY(fPositions); - } - - fPositions = from.fPositions; - from.fPositions = NULL; -} - -void LEGlyphStorage::adoptAuxDataArray(LEGlyphStorage &from) -{ - if (fAuxData != NULL) { - LE_DELETE_ARRAY(fAuxData); - } - - fAuxData = from.fAuxData; - from.fAuxData = NULL; -} - -void LEGlyphStorage::adoptGlyphCount(LEGlyphStorage &from) -{ - fGlyphCount = from.fGlyphCount; -} - -void LEGlyphStorage::adoptGlyphCount(le_int32 newGlyphCount) -{ - fGlyphCount = newGlyphCount; -} - -// Move a glyph to a different position in the LEGlyphStorage ( used for Indic v2 processing ) - -void LEGlyphStorage::moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker ) -{ - - LEErrorCode success = LE_NO_ERROR; - - LEGlyphID holdGlyph = getGlyphID(fromPosition,success); - le_int32 holdCharIndex = getCharIndex(fromPosition,success); - le_uint32 holdAuxData = getAuxData(fromPosition,success); - - if ( fromPosition < toPosition ) { - for ( le_int32 i = fromPosition ; i < toPosition ; i++ ) { - setGlyphID(i,getGlyphID(i+1,success),success); - setCharIndex(i,getCharIndex(i+1,success),success); - setAuxData(i,getAuxData(i+1,success),success); - } - } else { - for ( le_int32 i = toPosition ; i > fromPosition ; i-- ) { - setGlyphID(i,getGlyphID(i-1,success),success); - setCharIndex(i,getCharIndex(i-1,success),success); - setAuxData(i,getAuxData(i-1,success),success); - - } - } - - setGlyphID(toPosition,holdGlyph,success); - setCharIndex(toPosition,holdCharIndex,success); - setAuxData(toPosition,holdAuxData | marker,success); - -} - -// Glue code for existing stable API -LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount) -{ - LEErrorCode ignored = LE_NO_LAYOUT_ERROR; - return insertGlyphs(atIndex, insertCount, ignored); -} - -// FIXME: add error checking? -LEGlyphID *LEGlyphStorage::insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success) -{ - return fInsertionList->insert(atIndex, insertCount, success); -} - -le_int32 LEGlyphStorage::applyInsertions() -{ - le_int32 growAmount = fInsertionList->getGrowAmount(); - - if (growAmount <= 0) { - return fGlyphCount; - } - - le_int32 newGlyphCount = fGlyphCount + growAmount; - - LEGlyphID *newGlyphs = (LEGlyphID *) LE_GROW_ARRAY(fGlyphs, newGlyphCount); - if (newGlyphs == NULL) { - // Could not grow the glyph array - return fGlyphCount; - } - fGlyphs = newGlyphs; - - le_int32 *newCharIndices = (le_int32 *) LE_GROW_ARRAY(fCharIndices, newGlyphCount); - if (newCharIndices == NULL) { - // Could not grow the glyph array - return fGlyphCount; - } - fCharIndices = newCharIndices; - - if (fAuxData != NULL) { - le_uint32 *newAuxData = (le_uint32 *) LE_GROW_ARRAY(fAuxData, newGlyphCount); - if (newAuxData == NULL) { - // could not grow the aux data array - return fGlyphCount; - } - fAuxData = (le_uint32 *)newAuxData; - } - - if (fGlyphCount > 0) { - fSrcIndex = fGlyphCount - 1; - } - fDestIndex = newGlyphCount - 1; - -#if 0 - // If the current position is at the end of the array - // update it to point to the end of the new array. The - // insertion callback will handle all other cases. - // FIXME: this is left over from GlyphIterator, but there's no easy - // way to implement this here... it seems that GlyphIterator doesn't - // really need it 'cause the insertions don't get applied until after a - // complete pass over the glyphs, after which the iterator gets reset anyhow... - // probably better to just document that for LEGlyphStorage and GlyphIterator... - if (position == glyphCount) { - position = newGlyphCount; - } -#endif - - fInsertionList->applyInsertions(this); - - fInsertionList->reset(); - - return fGlyphCount = newGlyphCount; -} - -le_bool LEGlyphStorage::applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) -{ -#if 0 - // if the current position is within the block we're shifting - // it needs to be updated to the current glyph's - // new location. - // FIXME: this is left over from GlyphIterator, but there's no easy - // way to implement this here... it seems that GlyphIterator doesn't - // really need it 'cause the insertions don't get applied until after a - // complete pass over the glyphs, after which the iterator gets reset anyhow... - // probably better to just document that for LEGlyphStorage and GlyphIterator... - if (position >= atPosition && position <= fSrcIndex) { - position += fDestIndex - fSrcIndex; - } -#endif - - if (atPosition < 0 || fSrcIndex < 0 || fDestIndex < 0) { - return FALSE; - } - - if (fAuxData != NULL) { - le_int32 src = fSrcIndex, dest = fDestIndex; - - while (src > atPosition) { - fAuxData[dest--] = fAuxData[src--]; - } - - for (le_int32 i = count - 1; i >= 0; i -= 1) { - fAuxData[dest--] = fAuxData[atPosition]; - } - } - - while (fSrcIndex > atPosition && fSrcIndex >= 0 && fDestIndex >= 0) { - fGlyphs[fDestIndex] = fGlyphs[fSrcIndex]; - fCharIndices[fDestIndex] = fCharIndices[fSrcIndex]; - - fDestIndex -= 1; - fSrcIndex -= 1; - } - - for (le_int32 i = count - 1; i >= 0 && fDestIndex >= 0; i -= 1) { - fGlyphs[fDestIndex] = newGlyphs[i]; - fCharIndices[fDestIndex] = fCharIndices[atPosition]; - - fDestIndex -= 1; - } - - // the source glyph we're pointing at - // just got replaced by the insertion - fSrcIndex -= 1; - - return FALSE; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LEGlyphStorage.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,570 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - ********************************************************************** - * Copyright (C) 1998-2010, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#ifndef __LEGLYPHSTORAGE_H -#define __LEGLYPHSTORAGE_H - -#include "LETypes.h" -#include "LEInsertionList.h" - -/** - * \file - * \brief C++ API: This class encapsulates the per-glyph storage used by the ICU LayoutEngine. - */ - -U_NAMESPACE_BEGIN - -/** - * This class encapsulates the per-glyph storage used by the ICU LayoutEngine. - * For each glyph it holds the glyph ID, the index of the backing store character - * which produced the glyph, the X and Y position of the glyph and an auxillary data - * pointer. - * - * The storage is growable using the <code>LEInsertionList</code> class. - * - * - * @see LEInsertionList.h - * - * @stable ICU 3.6 - */ -class U_LAYOUT_API LEGlyphStorage : public UObject, protected LEInsertionCallback -{ -private: - /** - * The number of entries in the per-glyph arrays. - * - * @internal - */ - le_int32 fGlyphCount; - - /** - * The glyph ID array. - * - * @internal - */ - LEGlyphID *fGlyphs; - - /** - * The char indices array. - * - * @internal - */ - le_int32 *fCharIndices; - - /** - * The glyph positions array. - * - * @internal - */ - float *fPositions; - - /** - * The auxillary data array. - * - * @internal - */ - le_uint32 *fAuxData; - - - /** - * The insertion list, used to grow the above arrays. - * - * @internal - */ - LEInsertionList *fInsertionList; - - /** - * The source index while growing the data arrays. - * - * @internal - */ - le_int32 fSrcIndex; - - /** - * The destination index used while growing the data arrays. - * - * @internal - */ - le_int32 fDestIndex; - -protected: - /** - * This implements <code>LEInsertionCallback</code>. The <code>LEInsertionList</code> - * will call this method once for each insertion. - * - * @param atPosition the position of the insertion - * @param count the number of glyphs being inserted - * @param newGlyphs the address of the new glyph IDs - * - * @return <code>true</code> if <code>LEInsertionList</code> should stop - * processing the insertion list after this insertion. - * - * @see LEInsertionList.h - * - * @stable ICU 3.0 - */ - virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]); - -public: - - /** - * Allocates an empty <code>LEGlyphStorage</code> object. You must call - * <code>allocateGlyphArray, allocatePositions and allocateAuxData</code> - * to allocate the data. - * - * @stable ICU 3.0 - */ - LEGlyphStorage(); - - /** - * The destructor. This will deallocate all of the arrays. - * - * @stable ICU 3.0 - */ - ~LEGlyphStorage(); - - /** - * This method returns the number of glyphs in the glyph array. - * - * @return the number of glyphs in the glyph array - * - * @stable ICU 3.0 - */ - inline le_int32 getGlyphCount() const; - - /** - * This method copies the glyph array into a caller supplied array. - * The caller must ensure that the array is large enough to hold all - * the glyphs. - * - * @param glyphs - the destiniation glyph array - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; - - /** - * This method copies the glyph array into a caller supplied array, - * ORing in extra bits. (This functionality is needed by the JDK, - * which uses 32 bits pre glyph idex, with the high 16 bits encoding - * the composite font slot number) - * - * @param glyphs - the destination (32 bit) glyph array - * @param extraBits - this value will be ORed with each glyph index - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; - - /** - * This method copies the character index array into a caller supplied array. - * The caller must ensure that the array is large enough to hold a - * character index for each glyph. - * - * @param charIndices - the destiniation character index array - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; - - /** - * This method copies the character index array into a caller supplied array. - * The caller must ensure that the array is large enough to hold a - * character index for each glyph. - * - * @param charIndices - the destiniation character index array - * @param indexBase - an offset which will be added to each index - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; - - /** - * This method copies the position array into a caller supplied array. - * The caller must ensure that the array is large enough to hold an - * X and Y position for each glyph, plus an extra X and Y for the - * advance of the last glyph. - * - * @param positions - the destiniation position array - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getGlyphPositions(float positions[], LEErrorCode &success) const; - - /** - * This method returns the X and Y position of the glyph at - * the given index. - * - * Input parameters: - * @param glyphIndex - the index of the glyph - * - * Output parameters: - * @param x - the glyph's X position - * @param y - the glyph's Y position - * @param success - set to an error code if the operation fails - * - * @stable ICU 3.0 - */ - void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; - - /** - * This method allocates the glyph array, the char indices array and the insertion list. You - * must call this method before using the object. This method also initializes the char indices - * array. - * - * @param initialGlyphCount the initial size of the glyph and char indices arrays. - * @param rightToLeft <code>true</code> if the original input text is right to left. - * @param success set to an error code if the storage cannot be allocated of if the initial - * glyph count is not positive. - * - * @stable ICU 3.0 - */ - void allocateGlyphArray(le_int32 initialGlyphCount, le_bool rightToLeft, LEErrorCode &success); - - /** - * This method allocates the storage for the glyph positions. It allocates one extra X, Y - * position pair for the position just after the last glyph. - * - * @param success set to an error code if the positions array cannot be allocated. - * - * @return the number of X, Y position pairs allocated. - * - * @stable ICU 3.0 - */ - le_int32 allocatePositions(LEErrorCode &success); - - /** - * This method allocates the storage for the auxillary glyph data. - * - * @param success set to an error code if the aulillary data array cannot be allocated. - * - * @return the size of the auxillary data array. - * - * @stable ICU 3.6 - */ - le_int32 allocateAuxData(LEErrorCode &success); - - /** - * Copy the entire auxillary data array. - * - * @param auxData the auxillary data array will be copied to this address - * @param success set to an error code if the data cannot be copied - * - * @stable ICU 3.6 - */ - void getAuxData(le_uint32 auxData[], LEErrorCode &success) const; - - /** - * Get the glyph ID for a particular glyph. - * - * @param glyphIndex the index into the glyph array - * @param success set to an error code if the glyph ID cannot be retrieved. - * - * @return the glyph ID - * - * @stable ICU 3.0 - */ - LEGlyphID getGlyphID(le_int32 glyphIndex, LEErrorCode &success) const; - - /** - * Get the char index for a particular glyph. - * - * @param glyphIndex the index into the glyph array - * @param success set to an error code if the char index cannot be retrieved. - * - * @return the character index - * - * @stable ICU 3.0 - */ - le_int32 getCharIndex(le_int32 glyphIndex, LEErrorCode &success) const; - - - /** - * Get the auxillary data for a particular glyph. - * - * @param glyphIndex the index into the glyph array - * @param success set to an error code if the auxillary data cannot be retrieved. - * - * @return the auxillary data - * - * @stable ICU 3.6 - */ - le_uint32 getAuxData(le_int32 glyphIndex, LEErrorCode &success) const; - - /** - * This operator allows direct access to the glyph array - * using the index operator. - * - * @param glyphIndex the index into the glyph array - * - * @return a reference to the given location in the glyph array - * - * @stable ICU 3.0 - */ - inline LEGlyphID &operator[](le_int32 glyphIndex) const; - - /** - * Call this method to replace a single glyph in the glyph array - * with multiple glyphs. This method uses the <code>LEInsertionList</code> - * to do the insertion. It returns the address of storage where the new - * glyph IDs can be stored. They will not actually be inserted into the - * glyph array until <code>applyInsertions</code> is called. - * - * @param atIndex the index of the glyph to be replaced - * @param insertCount the number of glyphs to replace it with - * @param success set to an error code if the auxillary data cannot be retrieved. - * - * @return the address at which to store the replacement glyphs. - * - * @see LEInsertionList.h - * - * @stable ICU 4.2 - */ - LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount, LEErrorCode& success); - - /** - * Call this method to replace a single glyph in the glyph array - * with multiple glyphs. This method uses the <code>LEInsertionList</code> - * to do the insertion. It returns the address of storage where the new - * glyph IDs can be stored. They will not actually be inserted into the - * glyph array until <code>applyInsertions</code> is called. - * - * Note: Don't use this version, use the other version of this function which has an error code. - * - * @param atIndex the index of the glyph to be replaced - * @param insertCount the number of glyphs to replace it with - * - * @return the address at which to store the replacement glyphs. - * - * @see LEInsertionList.h - * - * @stable ICU 3.0 - */ - LEGlyphID *insertGlyphs(le_int32 atIndex, le_int32 insertCount); - - /** - * This method is used to reposition glyphs during Indic v2 processing. It moves - * all of the relevant glyph information ( glyph, indices, positions, and auxData ), - * from the source position to the target position, and also allows for a marker bit - * to be set in the target glyph's auxData so that it won't be reprocessed later in the - * cycle. - * - * @param fromPosition - position of the glyph to be moved - * @param toPosition - target position of the glyph - * @param marker marker bit - * - * @stable ICU 4.2 - */ - void moveGlyph(le_int32 fromPosition, le_int32 toPosition, le_uint32 marker); - - /** - * This method causes all of the glyph insertions recorded by - * <code>insertGlyphs</code> to be applied to the glyph array. The - * new slots in the char indices and the auxillary data arrays - * will be filled in with the values for the glyph being replaced. - * - * @return the new size of the glyph array - * - * @see LEInsertionList.h - * - * @stable ICU 3.0 - */ - le_int32 applyInsertions(); - - /** - * Set the glyph ID for a particular glyph. - * - * @param glyphIndex the index of the glyph - * @param glyphID the new glyph ID - * @param success will be set to an error code if the glyph ID cannot be set. - * - * @stable ICU 3.0 - */ - void setGlyphID(le_int32 glyphIndex, LEGlyphID glyphID, LEErrorCode &success); - - /** - * Set the char index for a particular glyph. - * - * @param glyphIndex the index of the glyph - * @param charIndex the new char index - * @param success will be set to an error code if the char index cannot be set. - * - * @stable ICU 3.0 - */ - void setCharIndex(le_int32 glyphIndex, le_int32 charIndex, LEErrorCode &success); - - /** - * Set the X, Y position for a particular glyph. - * - * @param glyphIndex the index of the glyph - * @param x the new X position - * @param y the new Y position - * @param success will be set to an error code if the position cannot be set. - * - * @stable ICU 3.0 - */ - void setPosition(le_int32 glyphIndex, float x, float y, LEErrorCode &success); - - /** - * Adjust the X, Y position for a particular glyph. - * - * @param glyphIndex the index of the glyph - * @param xAdjust the adjustment to the glyph's X position - * @param yAdjust the adjustment to the glyph's Y position - * @param success will be set to an error code if the glyph's position cannot be adjusted. - * - * @stable ICU 3.0 - */ - void adjustPosition(le_int32 glyphIndex, float xAdjust, float yAdjust, LEErrorCode &success); - - /** - * Set the auxillary 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. - * - * @stable ICU 3.6 - */ - void setAuxData(le_int32 glyphIndex, le_uint32 auxData, LEErrorCode &success); - - /** - * Delete the glyph array and replace it with the one - * in <code>from</code>. Set the glyph array pointer - * in <code>from</code> to <code>NULL</code>. - * - * @param from the <code>LEGlyphStorage</code> object from which - * to get the new glyph array. - * - * @stable ICU 3.0 - */ - void adoptGlyphArray(LEGlyphStorage &from); - - /** - * Delete the char indices array and replace it with the one - * in <code>from</code>. Set the char indices array pointer - * in <code>from</code> to <code>NULL</code>. - * - * @param from the <code>LEGlyphStorage</code> object from which - * to get the new char indices array. - * - * @stable ICU 3.0 - */ - void adoptCharIndicesArray(LEGlyphStorage &from); - - /** - * Delete the position array and replace it with the one - * in <code>from</code>. Set the position array pointer - * in <code>from</code> to <code>NULL</code>. - * - * @param from the <code>LEGlyphStorage</code> object from which - * to get the new position array. - * - * @stable ICU 3.0 - */ - void adoptPositionArray(LEGlyphStorage &from); - - /** - * Delete the auxillary data array and replace it with the one - * in <code>from</code>. Set the auxillary data array pointer - * in <code>from</code> to <code>NULL</code>. - * - * @param from the <code>LEGlyphStorage</code> object from which - * to get the new auxillary data array. - * - * @stable ICU 3.0 - */ - void adoptAuxDataArray(LEGlyphStorage &from); - - /** - * Change the glyph count of this object to be the same - * as the one in <code>from</code>. - * - * @param from the <code>LEGlyphStorage</code> object from which - * to get the new glyph count. - * - * @stable ICU 3.0 - */ - void adoptGlyphCount(LEGlyphStorage &from); - - /** - * Change the glyph count of this object to the given value. - * - * @param newGlyphCount the new glyph count. - * - * @stable ICU 3.0 - */ - void adoptGlyphCount(le_int32 newGlyphCount); - - /** - * This method frees the glyph, character index, position and - * auxillary data arrays so that the LayoutEngine can be reused - * to layout a different characer array. (This method is also called - * by the destructor) - * - * @stable ICU 3.0 - */ - void reset(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 3.0 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 3.0 - */ - static UClassID getStaticClassID(); -}; - -inline le_int32 LEGlyphStorage::getGlyphCount() const -{ - return fGlyphCount; -} - -inline LEGlyphID &LEGlyphStorage::operator[](le_int32 glyphIndex) const -{ - return fGlyphs[glyphIndex]; -} - - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEInsertionList.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - ********************************************************************** - * Copyright (C) 1998-2008, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#include "LETypes.h" -#include "LEInsertionList.h" - -U_NAMESPACE_BEGIN - -#define ANY_NUMBER 1 - -struct InsertionRecord -{ - InsertionRecord *next; - le_int32 position; - le_int32 count; - LEGlyphID glyphs[ANY_NUMBER]; -}; - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LEInsertionList) - -LEInsertionList::LEInsertionList(le_bool rightToLeft) -: head(NULL), tail(NULL), growAmount(0), append(rightToLeft) -{ - tail = (InsertionRecord *) &head; -} - -LEInsertionList::~LEInsertionList() -{ - reset(); -} - -void LEInsertionList::reset() -{ - while (head != NULL) { - InsertionRecord *record = head; - - head = head->next; - LE_DELETE_ARRAY(record); - } - - tail = (InsertionRecord *) &head; - growAmount = 0; -} - -le_int32 LEInsertionList::getGrowAmount() -{ - return growAmount; -} - -LEGlyphID *LEInsertionList::insert(le_int32 position, le_int32 count, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - InsertionRecord *insertion = (InsertionRecord *) LE_NEW_ARRAY(char, sizeof(InsertionRecord) + (count - ANY_NUMBER) * sizeof (LEGlyphID)); - if (insertion == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - insertion->position = position; - insertion->count = count; - - growAmount += count - 1; - - if (append) { - // insert on end of list... - insertion->next = NULL; - tail->next = insertion; - tail = insertion; - } else { - // insert on front of list... - insertion->next = head; - head = insertion; - } - - return insertion->glyphs; -} - -le_bool LEInsertionList::applyInsertions(LEInsertionCallback *callback) -{ - for (InsertionRecord *rec = head; rec != NULL; rec = rec->next) { - if (callback->applyInsertion(rec->position, rec->count, rec->glyphs)) { - return TRUE; - } - } - - return FALSE; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LEInsertionList.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - ********************************************************************** - * Copyright (C) 1998-2013, International Business Machines - * Corporation and others. All Rights Reserved. - ********************************************************************** - */ - -#ifndef __LEINSERTIONLIST_H -#define __LEINSERTIONLIST_H - -#include "LETypes.h" - -U_NAMESPACE_BEGIN - -struct InsertionRecord; - -#ifndef U_HIDE_INTERNAL_API -/** - * This class encapsulates the callback used by <code>LEInsertionList</code> - * to apply an insertion from the insertion list. - * - * @internal - */ -class U_LAYOUT_API LEInsertionCallback -{ -public: - /** - * This method will be called by <code>LEInsertionList::applyInsertions</code> for each - * entry on the insertion list. - * - * @param atPosition the position of the insertion - * @param count the number of glyphs to insert - * @param newGlyphs the address of the glyphs to insert - * - * @return <code>TRUE</code> if <code>LEInsertions::applyInsertions</code> should - * stop after applying this insertion. - * - * @internal - */ - virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0; - - /** - * The destructor - */ - virtual ~LEInsertionCallback(); -}; - -/** - * This class is used to keep track of insertions to an array of - * <code>LEGlyphIDs</code>. The insertions are kept on a linked - * list of <code>InsertionRecords</code> so that the glyph array - * doesn't have to be grown for each insertion. The insertions are - * stored on the list from leftmost to rightmost to make it easier - * to do the insertions. - * - * The insertions are applied to the array by calling the - * <code>applyInsertions</code> method, which calls a client - * supplied <code>LEInsertionCallback</code> object to actually - * apply the individual insertions. - * - * @internal - */ -class LEInsertionList : public UObject -{ -public: - /** - * Construct an empty insertion list. - * - * @param rightToLeft <code>TRUE</code> if the glyphs are stored - * in the array in right to left order. - * - * @internal - */ - LEInsertionList(le_bool rightToLeft); - - /** - * The destructor. - */ - ~LEInsertionList(); - - /** - * Add an entry to the insertion list. - * - * @param position the glyph at this position in the array will be - * replaced by the new glyphs. - * @param count the number of new glyphs - * @param success set to an error code if the auxillary data cannot be retrieved. - * - * @return the address of an array in which to store the new glyphs. This will - * <em>not</em> be in the glyph array. - * - * @internal - */ - LEGlyphID *insert(le_int32 position, le_int32 count, LEErrorCode &success); - - /** - * Return the number of new glyphs that have been inserted. - * - * @return the number of new glyphs which have been inserted - * - * @internal - */ - le_int32 getGrowAmount(); - - /** - * Call the <code>LEInsertionCallback</code> once for each - * entry on the insertion list. - * - * @param callback the <code>LEInsertionCallback</code> to call for each insertion. - * - * @return <code>TRUE</code> if <code>callback</code> returned <code>TRUE</code> to - * terminate the insertion list processing. - * - * @internal - */ - le_bool applyInsertions(LEInsertionCallback *callback); - - /** - * Empty the insertion list and free all associated - * storage. - * - * @internal - */ - void reset(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - - /** - * The head of the insertion list. - * - * @internal - */ - InsertionRecord *head; - - /** - * The tail of the insertion list. - * - * @internal - */ - InsertionRecord *tail; - - /** - * The total number of new glyphs on the insertion list. - * - * @internal - */ - le_int32 growAmount; - - /** - * Set to <code>TRUE</code> if the glyphs are in right - * to left order. Since we want the rightmost insertion - * to be first on the list, we need to append the - * insertions in this case. Otherwise they're prepended. - * - * @internal - */ - le_bool append; -}; -#endif /* U_HIDE_INTERNAL_API */ - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/LELanguages.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 10/26/2010 02:53:33 PM PDT - */ - -#ifndef __LELANGUAGES_H -#define __LELANGUAGES_H - -#include "LETypes.h" - -/** - * \file - * \brief C++ API: List of language codes for LayoutEngine - */ - -U_NAMESPACE_BEGIN - -/** - * A provisional list of language codes. For now, - * this is just a list of languages which the LayoutEngine - * supports. - * - * @stable ICU 2.6 - */ - -enum LanguageCodes { - nullLanguageCode = 0, - araLanguageCode = 1, - asmLanguageCode = 2, - benLanguageCode = 3, - farLanguageCode = 4, - gujLanguageCode = 5, - hinLanguageCode = 6, - iwrLanguageCode = 7, - jiiLanguageCode = 8, - janLanguageCode = 9, - kanLanguageCode = 10, - kokLanguageCode = 11, - korLanguageCode = 12, - kshLanguageCode = 13, - malLanguageCode = 14, - marLanguageCode = 15, - mlrLanguageCode = 16, - mniLanguageCode = 17, - oriLanguageCode = 18, - sanLanguageCode = 19, - sndLanguageCode = 20, - snhLanguageCode = 21, - syrLanguageCode = 22, - tamLanguageCode = 23, - telLanguageCode = 24, - thaLanguageCode = 25, - urdLanguageCode = 26, - zhpLanguageCode = 27, - zhsLanguageCode = 28, - zhtLanguageCode = 29, - - /** New language codes added 03/13/2008 @stable ICU 4.0 */ - afkLanguageCode = 30, - belLanguageCode = 31, - bgrLanguageCode = 32, - catLanguageCode = 33, - cheLanguageCode = 34, - copLanguageCode = 35, - csyLanguageCode = 36, - danLanguageCode = 37, - deuLanguageCode = 38, - dznLanguageCode = 39, - ellLanguageCode = 40, - engLanguageCode = 41, - espLanguageCode = 42, - etiLanguageCode = 43, - euqLanguageCode = 44, - finLanguageCode = 45, - fraLanguageCode = 46, - gaeLanguageCode = 47, - hauLanguageCode = 48, - hrvLanguageCode = 49, - hunLanguageCode = 50, - hyeLanguageCode = 51, - indLanguageCode = 52, - itaLanguageCode = 53, - khmLanguageCode = 54, - mngLanguageCode = 55, - mtsLanguageCode = 56, - nepLanguageCode = 57, - nldLanguageCode = 58, - pasLanguageCode = 59, - plkLanguageCode = 60, - ptgLanguageCode = 61, - romLanguageCode = 62, - rusLanguageCode = 63, - skyLanguageCode = 64, - slvLanguageCode = 65, - sqiLanguageCode = 66, - srbLanguageCode = 67, - sveLanguageCode = 68, - tibLanguageCode = 69, - trkLanguageCode = 70, - welLanguageCode = 71, - - languageCodeCount = 72 -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEScripts.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,272 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 11/01/2011 04:08:09 PM PDT - */ - -#ifndef __LESCRIPTS_H -#define __LESCRIPTS_H - -#include "LETypes.h" - -/** - * \file - * \brief C++ API: Constants for Unicode script values - */ - -U_NAMESPACE_BEGIN - -/** - * Constants for Unicode script values, generated using - * ICU4J's <code>UScript</code> class. - * - * @stable ICU 2.2 - */ - -enum ScriptCodes { - zyyyScriptCode = 0, - zinhScriptCode = 1, - qaaiScriptCode = zinhScriptCode, /* manually added alias, for API stability */ - arabScriptCode = 2, - armnScriptCode = 3, - bengScriptCode = 4, - bopoScriptCode = 5, - cherScriptCode = 6, - coptScriptCode = 7, - cyrlScriptCode = 8, - dsrtScriptCode = 9, - devaScriptCode = 10, - ethiScriptCode = 11, - georScriptCode = 12, - gothScriptCode = 13, - grekScriptCode = 14, - gujrScriptCode = 15, - guruScriptCode = 16, - haniScriptCode = 17, - hangScriptCode = 18, - hebrScriptCode = 19, - hiraScriptCode = 20, - kndaScriptCode = 21, - kanaScriptCode = 22, - khmrScriptCode = 23, - laooScriptCode = 24, - latnScriptCode = 25, - mlymScriptCode = 26, - mongScriptCode = 27, - mymrScriptCode = 28, - ogamScriptCode = 29, - italScriptCode = 30, - oryaScriptCode = 31, - runrScriptCode = 32, - sinhScriptCode = 33, - syrcScriptCode = 34, - tamlScriptCode = 35, - teluScriptCode = 36, - thaaScriptCode = 37, - thaiScriptCode = 38, - tibtScriptCode = 39, -/** - * @stable ICU 2.6 - */ - - cansScriptCode = 40, -/** - * @stable ICU 2.2 - */ - - yiiiScriptCode = 41, - tglgScriptCode = 42, - hanoScriptCode = 43, - buhdScriptCode = 44, - tagbScriptCode = 45, -/** - * @stable ICU 2.6 - */ - - braiScriptCode = 46, - cprtScriptCode = 47, - limbScriptCode = 48, - linbScriptCode = 49, - osmaScriptCode = 50, - shawScriptCode = 51, - taleScriptCode = 52, - ugarScriptCode = 53, -/** - * @stable ICU 3.0 - */ - - hrktScriptCode = 54, -/** - * @stable ICU 3.4 - */ - - bugiScriptCode = 55, - glagScriptCode = 56, - kharScriptCode = 57, - syloScriptCode = 58, - taluScriptCode = 59, - tfngScriptCode = 60, - xpeoScriptCode = 61, -/** - * @stable ICU 3.6 - */ - - baliScriptCode = 62, - batkScriptCode = 63, - blisScriptCode = 64, - brahScriptCode = 65, - chamScriptCode = 66, - cirtScriptCode = 67, - cyrsScriptCode = 68, - egydScriptCode = 69, - egyhScriptCode = 70, - egypScriptCode = 71, - geokScriptCode = 72, - hansScriptCode = 73, - hantScriptCode = 74, - hmngScriptCode = 75, - hungScriptCode = 76, - indsScriptCode = 77, - javaScriptCode = 78, - kaliScriptCode = 79, - latfScriptCode = 80, - latgScriptCode = 81, - lepcScriptCode = 82, - linaScriptCode = 83, - mandScriptCode = 84, - mayaScriptCode = 85, - meroScriptCode = 86, - nkooScriptCode = 87, - orkhScriptCode = 88, - permScriptCode = 89, - phagScriptCode = 90, - phnxScriptCode = 91, - plrdScriptCode = 92, - roroScriptCode = 93, - saraScriptCode = 94, - syreScriptCode = 95, - syrjScriptCode = 96, - syrnScriptCode = 97, - tengScriptCode = 98, - vaiiScriptCode = 99, - vispScriptCode = 100, - xsuxScriptCode = 101, - zxxxScriptCode = 102, - zzzzScriptCode = 103, -/** - * @stable ICU 3.8 - */ - - cariScriptCode = 104, - jpanScriptCode = 105, - lanaScriptCode = 106, - lyciScriptCode = 107, - lydiScriptCode = 108, - olckScriptCode = 109, - rjngScriptCode = 110, - saurScriptCode = 111, - sgnwScriptCode = 112, - sundScriptCode = 113, - moonScriptCode = 114, - mteiScriptCode = 115, -/** - * @stable ICU 4.0 - */ - - armiScriptCode = 116, - avstScriptCode = 117, - cakmScriptCode = 118, - koreScriptCode = 119, - kthiScriptCode = 120, - maniScriptCode = 121, - phliScriptCode = 122, - phlpScriptCode = 123, - phlvScriptCode = 124, - prtiScriptCode = 125, - samrScriptCode = 126, - tavtScriptCode = 127, - zmthScriptCode = 128, - zsymScriptCode = 129, -/** - * @stable ICU 4.4 - */ - - bamuScriptCode = 130, - lisuScriptCode = 131, - nkgbScriptCode = 132, - sarbScriptCode = 133, -/** - * @stable ICU 4.6 - */ - - bassScriptCode = 134, - duplScriptCode = 135, - elbaScriptCode = 136, - granScriptCode = 137, - kpelScriptCode = 138, - lomaScriptCode = 139, - mendScriptCode = 140, - mercScriptCode = 141, - narbScriptCode = 142, - nbatScriptCode = 143, - palmScriptCode = 144, - sindScriptCode = 145, - waraScriptCode = 146, -/** - * @stable ICU 4.8 - */ - - afakScriptCode = 147, - jurcScriptCode = 148, - mrooScriptCode = 149, - nshuScriptCode = 150, - shrdScriptCode = 151, - soraScriptCode = 152, - takrScriptCode = 153, - tangScriptCode = 154, - woleScriptCode = 155, -/** - * @stable ICU 49 - */ - - hluwScriptCode = 156, /* bump to match current ICU */ - khojScriptCode = 157, - tirhScriptCode = 158, - -/** - * @stable ICU 2.2 - */ - scriptCodeCount -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LEStandalone.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#ifndef __LESTANDALONE -#define __LESTANDALONE - -#ifndef U_COPYRIGHT_STRING -#define U_COPYRIGHT_STRING " (C) Copyright IBM Corp and Others. 1998-2010 - All Rights Reserved" -#endif - -/* ICU Version number */ -#ifndef U_ICU_VERSION -#define U_ICU_VERSION "4.6" -#endif - -/* Definitions to make Layout Engine work away from ICU. */ -#ifndef U_NAMESPACE_BEGIN -#define U_NAMESPACE_BEGIN -#endif - -#ifndef U_NAMESPACE_END -#define U_NAMESPACE_END -#endif - -/* RTTI Definition */ -typedef const char *UClassID; -#ifndef UOBJECT_DEFINE_RTTI_IMPLEMENTATION -#define UOBJECT_DEFINE_RTTI_IMPLEMENTATION(x) UClassID x::getStaticClassID(){static char z=0; return (UClassID)&z; } UClassID x::getDynamicClassID() const{return x::getStaticClassID(); } -#endif - -/* UMemory's functions aren't used by the layout engine. */ -struct UMemory {}; -/* UObject's functions aren't used by the layout engine. */ -struct UObject {}; - -/* String handling */ -#include <stdlib.h> -#include <string.h> - -/** - * A convenience macro to test for the success of a LayoutEngine call. - * - * @stable ICU 2.4 - */ -#define LE_SUCCESS(code) ((code)<=LE_NO_ERROR) - -/** - * A convenience macro to test for the failure of a LayoutEngine call. - * - * @stable ICU 2.4 - */ -#define LE_FAILURE(code) ((code)>LE_NO_ERROR) - - -#ifndef _LP64 -typedef long le_int32; -typedef unsigned long le_uint32; -#else -typedef int le_int32; -typedef unsigned int le_uint32; -#endif - -#define HAVE_LE_INT32 1 -#define HAVE_LE_UINT32 1 - -typedef unsigned short UChar; -typedef le_uint32 UChar32; - -typedef short le_int16; -#define HAVE_LE_INT16 1 - -typedef unsigned short le_uint16; -#define HAVE_LE_UINT16 - -typedef signed char le_int8; -#define HAVE_LE_INT8 - -typedef unsigned char le_uint8; -#define HAVE_LE_UINT8 - -typedef char UBool; - -/** - * Error codes returned by the LayoutEngine. - * - * @stable ICU 2.4 - */ -enum LEErrorCode { - /* informational */ - LE_NO_SUBFONT_WARNING = -127, // U_USING_DEFAULT_WARNING, - - /* success */ - LE_NO_ERROR = 0, // U_ZERO_ERROR, - - /* failures */ - LE_ILLEGAL_ARGUMENT_ERROR = 1, // U_ILLEGAL_ARGUMENT_ERROR, - LE_MEMORY_ALLOCATION_ERROR = 7, // U_MEMORY_ALLOCATION_ERROR, - LE_INDEX_OUT_OF_BOUNDS_ERROR = 8, //U_INDEX_OUTOFBOUNDS_ERROR, - LE_NO_LAYOUT_ERROR = 16, // U_UNSUPPORTED_ERROR, - LE_INTERNAL_ERROR = 5, // U_INTERNAL_PROGRAM_ERROR, - LE_FONT_FILE_NOT_FOUND_ERROR = 4, // U_FILE_ACCESS_ERROR, - LE_MISSING_FONT_TABLE_ERROR = 2 // U_MISSING_RESOURCE_ERROR -}; -#define HAVE_LEERRORCODE - -#define U_LAYOUT_API - -#define uprv_malloc malloc -#define uprv_free free -#define uprv_memcpy memcpy -#define uprv_realloc realloc - -#define U_EXPORT2 -#define U_CAPI extern "C" - -#if !defined(U_IS_BIG_ENDIAN) - #ifdef _LITTLE_ENDIAN - #define U_IS_BIG_ENDIAN 0 - #endif -#endif - -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LESwaps.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __LESWAPS_H -#define __LESWAPS_H - -#include "LETypes.h" - -/** - * \file - * \brief C++ API: Endian independent access to data for LayoutEngine - */ - -U_NAMESPACE_BEGIN - -/** - * A convenience macro which invokes the swapWord member function - * from a concise call. - * - * @stable ICU 2.8 - */ -#if defined(U_IS_BIG_ENDIAN) - #if U_IS_BIG_ENDIAN - #define SWAPW(value) (value) - #else - #define SWAPW(value) LESwaps::swapWord(value) - #endif -#else - #define SWAPW(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapWord(value)) -#endif - -/** - * A convenience macro which invokes the swapLong member function - * from a concise call. - * - * @stable ICU 2.8 - */ -#if defined(U_IS_BIG_ENDIAN) - #if U_IS_BIG_ENDIAN - #define SWAPL(value) (value) - #else - #define SWAPL(value) LESwaps::swapLong(value) - #endif -#else - #define SWAPL(value) (LESwaps::isBigEndian() ? (value) : LESwaps::swapLong(value)) -#endif - -/** - * This class is used to access data which stored in big endian order - * regardless of the conventions of the platform. It has been designed - * to automatically detect the endian-ness of the platform, so that a - * compilation flag is not needed. - * - * All methods are static and inline in an attempt to induce the compiler - * to do most of the calculations at compile time. - * - * @stable ICU 2.8 - */ -class U_LAYOUT_API LESwaps /* not : public UObject because all methods are static */ { -public: - -#if !defined(U_IS_BIG_ENDIAN) - /** - * This method detects the endian-ness of the platform by - * casting a pointer to a word to a pointer to a byte. On - * big endian platforms the FF will be in the byte with the - * lowest address. On little endian platforms, the FF will - * be in the byte with the highest address. - * - * @return TRUE if the platform is big endian - * - * @stable ICU 2.8 - */ - static le_uint8 isBigEndian() - { - const le_uint16 word = 0xFF00; - - return *((le_uint8 *) &word); - }; -#endif - - /** - * This method does the byte swap required on little endian platforms - * to correctly access a (16-bit) word. - * - * @param value - the word to be byte swapped - * - * @return the byte swapped word - * - * @stable ICU 2.8 - */ - static le_uint16 swapWord(le_uint16 value) - { - return (((le_uint8) (value >> 8)) | (value << 8)); - }; - - /** - * This method does the byte swapping required on little endian platforms - * to correctly access a (32-bit) long. - * - * @param value - the long to be byte swapped - * - * @return the byte swapped long - * - * @stable ICU 2.8 - */ - static le_uint32 swapLong(le_uint32 value) - { - return swapWord((le_uint16) (value >> 16)) | (swapWord((le_uint16) value) << 16); - }; - -private: - LESwaps() {} // private - forbid instantiation -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LETableReference.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,551 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * -*- c++ -*- - * - * (C) Copyright IBM Corp. and others 2013 - All Rights Reserved - * - * Range checking - * - */ - -#ifndef __LETABLEREFERENCE_H -#define __LETABLEREFERENCE_H - -#include "LETypes.h" -#include "LEFontInstance.h" - -/** - * \def LE_ENABLE_RAW - * If this is 1, enables old non-safe raw access - */ -#ifndef LE_ENABLE_RAW -#define LE_ENABLE_RAW 0 -#endif - -#define kQuestionmarkTableTag 0x3F3F3F3FUL /* ???? */ -#define kStaticTableTag 0x30303030UL /* 0000 */ -#define kTildeTableTag 0x7e7e7e7eUL /* ~~~~ */ -#ifdef __cplusplus - -// internal - interface for range checking -U_NAMESPACE_BEGIN - -#if LE_ASSERT_BAD_FONT - -#ifndef LE_TRACE_TR -#define LE_TRACE_TR 0 -#endif - -class LETableReference; // fwd -/** - * defined in OpenTypeUtilities.cpp - * @internal - */ -U_CAPI void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len); - -#define LE_DEBUG_TR(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0); -#define LE_DEBUG_TR3(x,y,z) _debug_LETableReference(__FILE__, __LINE__, x, this, (const void*)y, (size_t)z); -#if LE_TRACE_TR -#define _TRTRACE(x) _debug_LETableReference(__FILE__, __LINE__, x, this, NULL, 0); -#else -#define _TRTRACE(x) -#endif - -#else -#define LE_DEBUG_TR(x) -#define LE_DEBUG_TR3(x,y,z) -#define _TRTRACE(x) -#endif - -/** - * @internal - */ -class LETableReference { -public: - - /** - * Dummy enum asserting that a value is actually static data - * and does not need to be range checked - */ - enum EStaticData { kStaticData = 0 }; - -/** - * @internal - * Construct from a specific tag - */ - LETableReference(const LEFontInstance* font, LETag tableTag, LEErrorCode &success) : - fFont(font), fTag(tableTag), fParent(NULL), fStart(NULL),fLength(LE_UINTPTR_MAX) { - loadTable(success); - _TRTRACE("INFO: new table load") - } - - LETableReference(const LETableReference &parent, LEErrorCode &success) : fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), fStart(parent.fStart), fLength(parent.fLength) { - if(LE_FAILURE(success)) { - clear(); - } - _TRTRACE("INFO: new clone") - } - -#if LE_ENABLE_RAW - /** - * Construct without a parent LETR. - */ - LETableReference(const le_uint8* data, size_t length = LE_UINTPTR_MAX) : - fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) { - _TRTRACE("INFO: new raw") - } -#endif - - /** - * Construct without a parent LETR. - */ - LETableReference(EStaticData /* NOTUSED */, const le_uint8* data, size_t length) : - fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(data), fLength(length) { - _TRTRACE("INFO: new EStaticData") - } - - LETableReference() : - fFont(NULL), fTag(kQuestionmarkTableTag), fParent(NULL), fStart(NULL), fLength(0) { - _TRTRACE("INFO: new empty") - } - - ~LETableReference() { - fTag= (LETag)kTildeTableTag; - _TRTRACE("INFO: new dtor") - } - - /** - * @internal - * @param length if LE_UINTPTR_MAX means "whole table" - * subset - */ - LETableReference(const LETableReference &parent, size_t offset, size_t length, - LEErrorCode &err) : - fFont(parent.fFont), fTag(parent.fTag), fParent(&parent), - fStart((parent.fStart)+offset), fLength(length) { - if(LE_SUCCESS(err)) { - if(isEmpty()) { - //err = LE_MISSING_FONT_TABLE_ERROR; - clear(); // it's just empty. Not an error. - } else if(offset >= fParent->fLength || (offset & 0x01)) { - LE_DEBUG_TR3("offset out of range or odd alignment: (%p) +%d", NULL, offset); - err = LE_INDEX_OUT_OF_BOUNDS_ERROR; - clear(); - } else { - if(fLength == LE_UINTPTR_MAX && - fParent->fLength != LE_UINTPTR_MAX) { - fLength = (fParent->fLength) - offset; // decrement length as base address is incremented - } - if(fLength != LE_UINTPTR_MAX) { // if we have bounds: - if((offset+fLength < offset) || (offset+fLength > fParent->fLength)) { - LE_DEBUG_TR3("offset+fLength out of range: (%p) +%d", NULL, offset+fLength); - err = LE_INDEX_OUT_OF_BOUNDS_ERROR; // exceeded - clear(); - } - } - } - } else { - clear(); - } - _TRTRACE("INFO: new subset") - } - - const void* getAlias() const { return (const void*)fStart; } -#ifndef LE_ENABLE_RAW - const void* getAliasRAW() const { LE_DEBUG_TR("getAliasRAW()"); return (const void*)fStart; } -#endif - le_bool isEmpty() const { return fStart==NULL || fLength==0; } - le_bool isValid() const { return !isEmpty(); } - le_bool hasBounds() const { return fLength!=LE_UINTPTR_MAX; } - void clear() { fLength=0; fStart=NULL; } - size_t getLength() const { return fLength; } - const LEFontInstance* getFont() const { return fFont; } - LETag getTag() const { return fTag; } - const LETableReference* getParent() const { return fParent; } - - void addOffset(size_t offset, LEErrorCode &success) { - if(hasBounds()) { - if(offset >= fLength) { - LE_DEBUG_TR("addOffset off end"); - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return; - } else { - fLength -= offset; - } - } - fStart += offset; - } - - size_t ptrToOffset(const void *atPtr, LEErrorCode &success) const { - if(atPtr==NULL) return 0; - if(LE_FAILURE(success)) return LE_UINTPTR_MAX; - if((atPtr < fStart) || - (hasBounds() && (atPtr >= fStart+fLength))) { - LE_DEBUG_TR3("ptrToOffset args out of range: %p", atPtr, 0); - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return LE_UINTPTR_MAX; - } - return ((const le_uint8*)atPtr)-fStart; - } - - /** - * Clamp down the length, for range checking. - */ - size_t contractLength(size_t newLength) { - if(fLength!=LE_UINTPTR_MAX&&newLength>0&&newLength<=fLength) { - fLength = newLength; - } - return fLength; - } - - /** - * Throw an error if offset+length off end - */ -public: - size_t verifyLength(size_t offset, size_t length, LEErrorCode &success) { - if(isValid()&& - LE_SUCCESS(success) && - fLength!=LE_UINTPTR_MAX && length!=LE_UINTPTR_MAX && offset!=LE_UINTPTR_MAX && - (offset+length)>fLength) { - LE_DEBUG_TR3("verifyLength failed (%p) %d",NULL, offset+length); - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; -#if LE_ASSERT_BAD_FONT - fprintf(stderr, "offset=%lu, len=%lu, would be at %p, (%lu) off end. End at %p\n", offset,length, fStart+offset+length, (offset+length-fLength), (offset+length-fLength)+fStart); -#endif - } - return fLength; - } - - /** - * Throw an error if size*count overflows - */ - size_t verifyLength(size_t offset, size_t size, le_uint32 count, LEErrorCode &success) { - if(count!=0 && size>LE_UINT32_MAX/count) { - LE_DEBUG_TR3("verifyLength failed size=%u, count=%u", size, count); - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return 0; - } - return verifyLength(offset, size*count, success); - } - - /** - * Change parent link to another - */ - LETableReference &reparent(const LETableReference &base) { - fParent = &base; - return *this; - } - - /** - * remove parent link. Factory functions should do this. - */ - void orphan(void) { - fParent=NULL; - } - -protected: - const LEFontInstance* fFont; - LETag fTag; - const LETableReference *fParent; - const le_uint8 *fStart; // keep as 8 bit internally, for pointer math - size_t fLength; - - void loadTable(LEErrorCode &success) { - if(LE_SUCCESS(success)) { - fStart = (const le_uint8*)(fFont->getFontTable(fTag, fLength)); // note - a null table is not an error. - } - } - - void setRaw(const void *data, size_t length = LE_UINTPTR_MAX) { - fFont = NULL; - fTag = (LETag)kQuestionmarkTableTag; - fParent = NULL; - fStart = (const le_uint8*)data; - fLength = length; - } - - /** - * set this object pointing to static data - */ - void setTo(EStaticData /*notused*/, const void *data, size_t length) { - fFont = NULL; - fTag = (LETag)kStaticTableTag; - fParent = NULL; - fStart = (const le_uint8*)data; - fLength = length; - } -}; - - -template<class T> -class LETableVarSizer { - public: - inline static size_t getSize(); -}; - -// base definition- could override for adjustments -template<class T> inline -size_t LETableVarSizer<T>::getSize() { - return sizeof(T); -} - -/** - * \def LE_VAR_ARRAY - * @param x Type (T) - * @param y some member that is of length ANY_NUMBER - * Call this after defining a class, for example: - * LE_VAR_ARRAY(FeatureListTable,featureRecordArray) - * this is roughly equivalent to: - * template<> inline size_t LETableVarSizer<FeatureListTable>::getSize() { return sizeof(FeatureListTable) - (sizeof(le_uint16)*ANY_NUMBER); } - * it's a specialization that informs the LETableReference subclasses to NOT include the variable array in the size. - * dereferencing NULL is valid here because we never actually dereference it, just inside sizeof. - */ -#define LE_VAR_ARRAY(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return sizeof(x) - (sizeof(((const x*)0)->y)); } -/** - * \def LE_CORRECT_SIZE - * @param x type (T) - * @param y fixed size for T - */ -#define LE_CORRECT_SIZE(x,y) template<> inline size_t LETableVarSizer<x>::getSize() { return y; } - -/** - * Open a new entry based on an existing table - */ - -template<class T> -class LEReferenceTo : public LETableReference { -public: - /** - * open a sub reference. - * @param parent parent reference - * @param success error status - * @param atPtr location of reference - if NULL, will be at offset zero (i.e. downcast of parent). Otherwise must be a pointer within parent's bounds. - */ - inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr) - : LETableReference(parent, parent.ptrToOffset(atPtr, success), LE_UINTPTR_MAX, success) { - verifyLength(0, LETableVarSizer<T>::getSize(), success); - if(LE_FAILURE(success)) clear(); - } - /** - * ptr plus offset - */ - inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, const void* atPtr, size_t offset) - : LETableReference(parent, parent.ptrToOffset(atPtr, success)+offset, LE_UINTPTR_MAX, success) { - verifyLength(0, LETableVarSizer<T>::getSize(), success); - if(LE_FAILURE(success)) clear(); - } - inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success, size_t offset) - : LETableReference(parent, offset, LE_UINTPTR_MAX, success) { - verifyLength(0, LETableVarSizer<T>::getSize(), success); - if(LE_FAILURE(success)) clear(); - } - inline LEReferenceTo(const LETableReference &parent, LEErrorCode &success) - : LETableReference(parent, 0, LE_UINTPTR_MAX, success) { - verifyLength(0, LETableVarSizer<T>::getSize(), success); - if(LE_FAILURE(success)) clear(); - } - inline LEReferenceTo(const LEFontInstance *font, LETag tableTag, LEErrorCode &success) - : LETableReference(font, tableTag, success) { - verifyLength(0, LETableVarSizer<T>::getSize(), success); - if(LE_FAILURE(success)) clear(); - } -#if LE_ENABLE_RAW - inline LEReferenceTo(const le_uint8 *data, size_t length = LE_UINTPTR_MAX) : LETableReference(data, length) {} - inline LEReferenceTo(const T *data, size_t length = LE_UINTPTR_MAX) : LETableReference((const le_uint8*)data, length) {} -#endif - inline LEReferenceTo(EStaticData staticData, const le_uint8 *data, size_t length) : LETableReference(staticData, data, length) {} - inline LEReferenceTo(EStaticData staticData, const T *data, size_t length) : LETableReference(staticData, (const le_uint8*)data, length) {} - - inline LEReferenceTo() : LETableReference() {} - -#if LE_ENABLE_RAW - inline LEReferenceTo<T>& operator=(const T* other) { - setRaw(other); - return *this; - } -#endif - - LEReferenceTo<T>& setTo(LETableReference::EStaticData staticData, const T* other, size_t length) { - LETableReference::setTo(staticData, other, length); - return *this; - } - - LEReferenceTo<T> &reparent(const LETableReference &base) { - fParent = &base; - return *this; - } - - /** - * roll forward by one <T> size. - * same as addOffset(LETableVarSizer<T>::getSize(),success) - */ - void addObject(LEErrorCode &success) { - addOffset(LETableVarSizer<T>::getSize(), success); - } - void addObject(size_t count, LEErrorCode &success) { - addOffset(LETableVarSizer<T>::getSize()*count, success); - } - - const T *operator->() const { return getAlias(); } - const T *operator*() const { return getAlias(); } - const T *getAlias() const { return (const T*)fStart; } -#if LE_ENABLE_RAW - const T *getAliasRAW() const { LE_DEBUG_TR("getAliasRAW<>"); return (const T*)fStart; } -#endif - -}; - - -/** - * \def LE_UNBOUNDED_ARRAY - * define an array with no *known* bound. Will trim to available size. - * @internal - */ -#define LE_UNBOUNDED_ARRAY LE_UINT32_MAX - -template<class T> -class LEReferenceToArrayOf : public LETableReference { -public: - LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, size_t offset, le_uint32 count) - : LETableReference(parent, offset, LE_UINTPTR_MAX, success), fCount(count) { - _TRTRACE("INFO: new RTAO by offset") - if(LE_SUCCESS(success)) { - if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length - fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size - } - LETableReference::verifyLength(0, LETableVarSizer<T>::getSize(), fCount, success); - } - if(LE_FAILURE(success)) { - fCount=0; - clear(); - } - } - - LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, le_uint32 count) - : LETableReference(parent, parent.ptrToOffset(array, success), LE_UINTPTR_MAX, success), fCount(count) { -_TRTRACE("INFO: new RTAO") - if(LE_SUCCESS(success)) { - if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length - fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size - } - LETableReference::verifyLength(0, LETableVarSizer<T>::getSize(), fCount, success); - } - if(LE_FAILURE(success)) clear(); - } - LEReferenceToArrayOf(const LETableReference &parent, LEErrorCode &success, const T* array, size_t offset, le_uint32 count) - : LETableReference(parent, parent.ptrToOffset(array, success)+offset, LE_UINTPTR_MAX, success), fCount(count) { -_TRTRACE("INFO: new RTAO") - if(LE_SUCCESS(success)) { - if(fCount == LE_UNBOUNDED_ARRAY) { // not a known length - fCount = getLength()/LETableVarSizer<T>::getSize(); // fit to max size - } - LETableReference::verifyLength(0, LETableVarSizer<T>::getSize(), fCount, success); - } - if(LE_FAILURE(success)) clear(); - } - - LEReferenceToArrayOf() :LETableReference(), fCount(0) {} - - le_uint32 getCount() const { return fCount; } - - const T *getAlias() const { return (const T*)fStart; } - - const T *getAlias(le_uint32 i, LEErrorCode &success) const { - return ((const T*)(((const char*)getAlias())+getOffsetFor(i, success))); - } - -#ifndef LE_ENABLE_RAW - const T *getAliasRAW() const { LE_DEBUG_TR("getAliasRAW<>"); return (const T*)fStart; } -#endif - - const T& getObject(le_uint32 i, LEErrorCode &success) const { - const T *ret = getAlias(i, success); - if (LE_FAILURE(success) || ret==NULL) { - return *(new T(0)); - } else { - return *ret; - } - } - - /** - * by-value array accessor for integral types. - */ - const T operator[](le_uint32 i) const { - LEErrorCode success = LE_NO_ERROR; - const T *ret = getAlias(i, success); - if(LE_FAILURE(success) || ret==NULL) { -#if LE_ASSERT_BAD_FONT - LE_DEBUG_TR3("Range error, out of bounds? (%p) #%d", NULL, i); -#endif - return T(0); // will not work for all types. - } - return *ret; - } - - const LEReferenceTo<T> getReference(le_uint32 i, LEErrorCode &success) const { - if(LE_FAILURE(success)) return LEReferenceTo<T>(); - return LEReferenceTo<T>(*this, success, getAlias(i,success)); - } - - const T& operator()(le_uint32 i, LEErrorCode &success) const { - return *getAlias(i,success); - } - - size_t getOffsetFor(le_uint32 i, LEErrorCode &success) const { - if(LE_SUCCESS(success)&&i<getCount()) { - return LETableVarSizer<T>::getSize()*i; - } else { - LE_DEBUG_TR3("getOffsetFor failed (%p) index=%d",NULL, i); - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - } - return 0; - } - - LEReferenceToArrayOf<T> &reparent(const LETableReference &base) { - fParent = &base; - return *this; - } - - LEReferenceToArrayOf(const LETableReference& parent, LEErrorCode & success) : LETableReference(parent,0, LE_UINTPTR_MAX, success), fCount(0) { - _TRTRACE("INFO: null RTAO") - } - -private: - le_uint32 fCount; -}; - - - - -#ifdef _TRTRACE -#undef _TRTRACE -#endif - -U_NAMESPACE_END - -#endif - -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LETypes.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,807 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __LETYPES_H -#define __LETYPES_H - -/** - * If LE_Standalone is defined, it must exist and contain - * definitions for some core ICU defines. - */ -#ifdef LE_STANDALONE -#include "LEStandalone.h" -#endif - -#ifdef LE_STANDALONE -/* Stand-alone Layout Engine- without ICU. */ -#include "LEStandalone.h" -#define LE_USE_CMEMORY -#else -#if !defined(LE_USE_CMEMORY) && (defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION) || defined(U_STATIC_IMPLEMENTATION) || defined(U_COMBINED_IMPLEMENTATION)) -#define LE_USE_CMEMORY -#endif - -#include "unicode/utypes.h" - -#ifdef __cplusplus -#include "unicode/uobject.h" -#endif - -#ifdef LE_USE_CMEMORY -#include "cmemory.h" -#endif -#endif - -/*! - * \file - * \brief Basic definitions for the ICU LayoutEngine - */ - -/** - * A type used for signed, 32-bit integers. - * - * @stable ICU 2.4 - */ -#ifndef HAVE_LE_INT32 -typedef int32_t le_int32; -#endif - -/** - * A type used for unsigned, 32-bit integers. - * - * @stable ICU 2.4 - */ -#ifndef HAVE_LE_UINT32 -typedef uint32_t le_uint32; -#endif - -/** - * A type used for signed, 16-bit integers. - * - * @stable ICU 2.4 - */ -#ifndef HAVE_LE_INT16 -typedef int16_t le_int16; -#endif - -#ifndef HAVE_LE_UINT16 -/** - * A type used for unsigned, 16-bit integers. - * - * @stable ICU 2.4 - */ -typedef uint16_t le_uint16; -#endif - -#ifndef HAVE_LE_INT8 -/** - * A type used for signed, 8-bit integers. - * - * @stable ICU 2.4 - */ -typedef int8_t le_int8; -#endif - -#ifndef HAVE_LE_UINT8 -/** - * A type used for unsigned, 8-bit integers. - * - * @stable ICU 2.4 - */ -typedef uint8_t le_uint8; -#endif - -/** -* A type used for boolean values. -* -* @stable ICU 2.4 -*/ -typedef UBool le_bool; - -#ifndef TRUE -/** - * Used for <code>le_bool</code> values which are <code>true</code>. - * - * @stable ICU 2.4 - */ -#define TRUE 1 -#endif - -#ifndef FALSE -/** - * Used for <code>le_bool</code> values which are <code>false</code>. - * - * @stable ICU 2.4 - */ -#define FALSE 0 -#endif - -#ifndef NULL -/** - * Used to represent empty pointers. - * - * @stable ICU 2.4 - */ -#define NULL 0 -#endif - -/** - * Used for four character tags. - * - * @stable ICU 2.4 - */ -typedef le_uint32 LETag; - -/** - * Used for 16-bit glyph indices as they're represented - * in TrueType font tables. - * - * @stable ICU 3.2 - */ -typedef le_uint16 TTGlyphID; - -/** - * Used for glyph indices. The low-order 16 bits are - * the glyph ID within the font. The next 8 bits are - * the sub-font ID within a compound font. The high- - * order 8 bits are client defined. The LayoutEngine - * will never change or look at the client defined bits. - * - * @stable ICU 3.2 - */ -typedef le_uint32 LEGlyphID; - -/** - * Used to mask off the glyph ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_GLYPH_MASK 0x0000FFFF - -/** - * Used to shift the glyph ID part of an LEGlyphID - * into the low-order bits. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_GLYPH_SHIFT 0 - - -/** - * Used to mask off the sub-font ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_SUB_FONT_MASK 0x00FF0000 - -/** - * Used to shift the sub-font ID part of an LEGlyphID - * into the low-order bits. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_SUB_FONT_SHIFT 16 - - -/** - * Used to mask off the client-defined part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_CLIENT_MASK 0xFF000000 - -/** - * Used to shift the sub-font ID part of an LEGlyphID - * into the low-order bits. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_CLIENT_SHIFT 24 - - -/** - * A convenience macro to get the Glyph ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_GET_GLYPH(gid) ((gid & LE_GLYPH_MASK) >> LE_GLYPH_SHIFT) - -/** - * A convenience macro to get the sub-font ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_GET_SUB_FONT(gid) ((gid & LE_SUB_FONT_MASK) >> LE_SUB_FONT_SHIFT) - -/** - * A convenience macro to get the client-defined part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_GET_CLIENT(gid) ((gid & LE_CLIENT_MASK) >> LE_CLIENT_SHIFT) - - -/** - * A convenience macro to set the Glyph ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_SET_GLYPH(gid, glyph) ((gid & ~LE_GLYPH_MASK) | ((glyph << LE_GLYPH_SHIFT) & LE_GLYPH_MASK)) - -/** - * A convenience macro to set the sub-font ID part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_SET_SUB_FONT(gid, font) ((gid & ~LE_SUB_FONT_MASK) | ((font << LE_SUB_FONT_SHIFT) & LE_SUB_FONT_MASK)) - -/** - * A convenience macro to set the client-defined part of an LEGlyphID. - * - * @see LEGlyphID - * @stable ICU 3.2 - */ -#define LE_SET_CLIENT(gid, client) ((gid & ~LE_CLIENT_MASK) | ((client << LE_CLIENT_SHIFT) & LE_CLIENT_MASK)) - - -/** - * Used to represent 16-bit Unicode code points. - * - * @stable ICU 2.4 - */ -typedef UChar LEUnicode16; - -/** - * Used to represent 32-bit Unicode code points. - * - * @stable ICU 2.4 - */ -typedef UChar32 LEUnicode32; - -#ifndef U_HIDE_DEPRECATED_API -/** - * Used to represent 16-bit Unicode code points. - * - * @deprecated since ICU 2.4. Use LEUnicode16 instead - */ -typedef UChar LEUnicode; -#endif /* U_HIDE_DEPRECATED_API */ - -/** - * Used to hold a pair of (x, y) values which represent a point. - * - * @stable ICU 2.4 - */ -struct LEPoint -{ - /** - * The x coordinate of the point. - * - * @stable ICU 2.4 - */ - float fX; - - /** - * The y coordinate of the point. - * - * @stable ICU 2.4 - */ - float fY; -}; - -#ifndef __cplusplus -/** - * Used to hold a pair of (x, y) values which represent a point. - * - * @stable ICU 2.4 - */ -typedef struct LEPoint LEPoint; -#endif - -/** - * \def LE_TRACE - * @internal - */ -#ifndef LE_TRACE -# define LE_TRACE 0 -#endif - -#if LE_TRACE -# include <stdio.h> -# define _LETRACE printf("\n%s:%d: LE: ", __FILE__, __LINE__),printf -#else -# define _LETRACE 0&& -#endif - -#ifndef U_HIDE_INTERNAL_API - -#ifndef LE_ASSERT_BAD_FONT -#define LE_ASSERT_BAD_FONT 0 -#endif - -#if LE_ASSERT_BAD_FONT -#include <stdio.h> -#define LE_DEBUG_BAD_FONT(x) fprintf(stderr,"%s:%d: BAD FONT: %s\n", __FILE__, __LINE__, (x)); -#else -#define LE_DEBUG_BAD_FONT(x) -#endif - -/** - * Max value representable by a uintptr - */ - -#ifndef UINT32_MAX -#define LE_UINT32_MAX 0xFFFFFFFFU -#else -#define LE_UINT32_MAX UINT32_MAX -#endif - -#ifndef UINTPTR_MAX -#define LE_UINTPTR_MAX LE_UINT32_MAX -#else -#define LE_UINTPTR_MAX UINTPTR_MAX -#endif - -/** - * Range check for overflow - */ -#define LE_RANGE_CHECK(type, count, ptrfn) (( (LE_UINTPTR_MAX / sizeof(type)) < count ) ? NULL : (ptrfn)) -/** - * A convenience macro to get the length of an array. - * - * @internal - */ -#define LE_ARRAY_SIZE(array) (sizeof array / sizeof array[0]) - -#ifdef LE_USE_CMEMORY -/** - * A convenience macro for copying an array. - * - * @internal - */ -#define LE_ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) - -/** - * Allocate an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_NEW_ARRAY(type, count) (type *) LE_RANGE_CHECK(type,count,uprv_malloc((count) * sizeof(type))) - -/** - * Re-allocate an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0]) - - /** - * Free an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_DELETE_ARRAY(array) uprv_free((void *) (array)) -#else -/* !LE_USE_CMEMORY - Not using ICU memory - use C std lib versions */ - -#include <stdlib.h> -#include <string.h> - -/** - * A convenience macro to get the length of an array. - * - * @internal - */ -#define LE_ARRAY_SIZE(array) (sizeof array / sizeof array[0]) - -/** - * A convenience macro for copying an array. - * - * @internal - */ -#define LE_ARRAY_COPY(dst, src, count) memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) - -/** - * Allocate an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_NEW_ARRAY(type, count) LE_RANGE_CHECK(type,count,(type *) malloc((count) * sizeof(type))) - -/** - * Re-allocate an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_GROW_ARRAY(array, newSize) realloc((void *) (array), (newSize) * sizeof (array)[0]) - - /** - * Free an array of basic types. This is used to isolate the rest of - * the LayoutEngine code from cmemory.h. - * - * @internal - */ -#define LE_DELETE_ARRAY(array) free((void *) (array)) - -#endif /* LE_USE_CMEMORY */ -#endif /* U_HIDE_INTERNAL_API */ - -/** - * A macro to construct the four-letter tags used to - * label TrueType tables, and for script, language and - * feature tags in OpenType tables. - * - * WARNING: THIS MACRO WILL ONLY WORK CORRECTLY IF - * THE ARGUMENT CHARACTERS ARE ASCII. - * - * @stable ICU 3.2 - */ -#define LE_MAKE_TAG(a, b, c, d) \ - (((le_uint32)(a) << 24) | \ - ((le_uint32)(b) << 16) | \ - ((le_uint32)(c) << 8) | \ - (le_uint32)(d)) - -/** - * This enumeration defines constants for the standard - * TrueType, OpenType and AAT table tags. - * - * @stable ICU 3.2 - */ -enum LETableTags { - LE_ACNT_TABLE_TAG = 0x61636E74UL, /**< 'acnt' */ - LE_AVAR_TABLE_TAG = 0x61766172UL, /**< 'avar' */ - LE_BASE_TABLE_TAG = 0x42415345UL, /**< 'BASE' */ - LE_BDAT_TABLE_TAG = 0x62646174UL, /**< 'bdat' */ - LE_BHED_TABLE_TAG = 0x62686564UL, /**< 'bhed' */ - LE_BLOC_TABLE_TAG = 0x626C6F63UL, /**< 'bloc' */ - LE_BSLN_TABLE_TAG = 0x62736C6EUL, /**< 'bsln' */ - LE_CFF__TABLE_TAG = 0x43464620UL, /**< 'CFF ' */ - LE_CMAP_TABLE_TAG = 0x636D6170UL, /**< 'cmap' */ - LE_CVAR_TABLE_TAG = 0x63766172UL, /**< 'cvar' */ - LE_CVT__TABLE_TAG = 0x63767420UL, /**< 'cvt ' */ - LE_DSIG_TABLE_TAG = 0x44534947UL, /**< 'DSIG' */ - LE_EBDT_TABLE_TAG = 0x45424454UL, /**< 'EBDT' */ - LE_EBLC_TABLE_TAG = 0x45424C43UL, /**< 'EBLC' */ - LE_EBSC_TABLE_TAG = 0x45425343UL, /**< 'EBSC' */ - LE_FDSC_TABLE_TAG = 0x66647363UL, /**< 'fdsc' */ - LE_FEAT_TABLE_TAG = 0x66656174UL, /**< 'feat' */ - LE_FMTX_TABLE_TAG = 0x666D7478UL, /**< 'fmtx' */ - LE_FPGM_TABLE_TAG = 0x6670676DUL, /**< 'fpgm' */ - LE_FVAR_TABLE_TAG = 0x66766172UL, /**< 'fvar' */ - LE_GASP_TABLE_TAG = 0x67617370UL, /**< 'gasp' */ - LE_GDEF_TABLE_TAG = 0x47444546UL, /**< 'GDEF' */ - LE_GLYF_TABLE_TAG = 0x676C7966UL, /**< 'glyf' */ - LE_GPOS_TABLE_TAG = 0x47504F53UL, /**< 'GPOS' */ - LE_GSUB_TABLE_TAG = 0x47535542UL, /**< 'GSUB' */ - LE_GVAR_TABLE_TAG = 0x67766172UL, /**< 'gvar' */ - LE_HDMX_TABLE_TAG = 0x68646D78UL, /**< 'hdmx' */ - LE_HEAD_TABLE_TAG = 0x68656164UL, /**< 'head' */ - LE_HHEA_TABLE_TAG = 0x68686561UL, /**< 'hhea' */ - LE_HMTX_TABLE_TAG = 0x686D7478UL, /**< 'hmtx' */ - LE_HSTY_TABLE_TAG = 0x68737479UL, /**< 'hsty' */ - LE_JUST_TABLE_TAG = 0x6A757374UL, /**< 'just' */ - LE_JSTF_TABLE_TAG = 0x4A535446UL, /**< 'JSTF' */ - LE_KERN_TABLE_TAG = 0x6B65726EUL, /**< 'kern' */ - LE_LCAR_TABLE_TAG = 0x6C636172UL, /**< 'lcar' */ - LE_LOCA_TABLE_TAG = 0x6C6F6361UL, /**< 'loca' */ - LE_LTSH_TABLE_TAG = 0x4C545348UL, /**< 'LTSH' */ - LE_MAXP_TABLE_TAG = 0x6D617870UL, /**< 'maxp' */ - LE_MORT_TABLE_TAG = 0x6D6F7274UL, /**< 'mort' */ - LE_MORX_TABLE_TAG = 0x6D6F7278UL, /**< 'morx' */ - LE_NAME_TABLE_TAG = 0x6E616D65UL, /**< 'name' */ - LE_OPBD_TABLE_TAG = 0x6F706264UL, /**< 'opbd' */ - LE_OS_2_TABLE_TAG = 0x4F532F32UL, /**< 'OS/2' */ - LE_PCLT_TABLE_TAG = 0x50434C54UL, /**< 'PCLT' */ - LE_POST_TABLE_TAG = 0x706F7374UL, /**< 'post' */ - LE_PREP_TABLE_TAG = 0x70726570UL, /**< 'prep' */ - LE_PROP_TABLE_TAG = 0x70726F70UL, /**< 'prop' */ - LE_TRAK_TABLE_TAG = 0x7472616BUL, /**< 'trak' */ - LE_VDMX_TABLE_TAG = 0x56444D58UL, /**< 'VDMX' */ - LE_VHEA_TABLE_TAG = 0x76686561UL, /**< 'vhea' */ - LE_VMTX_TABLE_TAG = 0x766D7478UL, /**< 'vmtx' */ - LE_VORG_TABLE_TAG = 0x564F5247UL, /**< 'VORG' */ - LE_ZAPF_TABLE_TAG = 0x5A617066UL /**< 'Zapf' */ -}; - -/** - * This enumeration defines constants for all - * the common OpenType feature tags. - * - * @stable ICU 3.2 - */ -enum LEFeatureTags { - LE_AALT_FEATURE_TAG = 0x61616C74UL, /**< 'aalt' */ - LE_ABVF_FEATURE_TAG = 0x61627666UL, /**< 'abvf' */ - LE_ABVM_FEATURE_TAG = 0x6162766DUL, /**< 'abvm' */ - LE_ABVS_FEATURE_TAG = 0x61627673UL, /**< 'abvs' */ - LE_AFRC_FEATURE_TAG = 0x61667263UL, /**< 'afrc' */ - LE_AKHN_FEATURE_TAG = 0x616B686EUL, /**< 'akhn' */ - LE_BLWF_FEATURE_TAG = 0x626C7766UL, /**< 'blwf' */ - LE_BLWM_FEATURE_TAG = 0x626C776DUL, /**< 'blwm' */ - LE_BLWS_FEATURE_TAG = 0x626C7773UL, /**< 'blws' */ - LE_CALT_FEATURE_TAG = 0x63616C74UL, /**< 'calt' */ - LE_CASE_FEATURE_TAG = 0x63617365UL, /**< 'case' */ - LE_CCMP_FEATURE_TAG = 0x63636D70UL, /**< 'ccmp' */ - LE_CJCT_FEATURE_TAG = 0x636A6374UL, /**< 'cjct' */ - LE_CLIG_FEATURE_TAG = 0x636C6967UL, /**< 'clig' */ - LE_CPSP_FEATURE_TAG = 0x63707370UL, /**< 'cpsp' */ - LE_CSWH_FEATURE_TAG = 0x63737768UL, /**< 'cswh' */ - LE_CURS_FEATURE_TAG = 0x63757273UL, /**< 'curs' */ - LE_C2SC_FEATURE_TAG = 0x63327363UL, /**< 'c2sc' */ - LE_C2PC_FEATURE_TAG = 0x63327063UL, /**< 'c2pc' */ - LE_DIST_FEATURE_TAG = 0x64697374UL, /**< 'dist' */ - LE_DLIG_FEATURE_TAG = 0x646C6967UL, /**< 'dlig' */ - LE_DNOM_FEATURE_TAG = 0x646E6F6DUL, /**< 'dnom' */ - LE_EXPT_FEATURE_TAG = 0x65787074UL, /**< 'expt' */ - LE_FALT_FEATURE_TAG = 0x66616C74UL, /**< 'falt' */ - LE_FIN2_FEATURE_TAG = 0x66696E32UL, /**< 'fin2' */ - LE_FIN3_FEATURE_TAG = 0x66696E33UL, /**< 'fin3' */ - LE_FINA_FEATURE_TAG = 0x66696E61UL, /**< 'fina' */ - LE_FRAC_FEATURE_TAG = 0x66726163UL, /**< 'frac' */ - LE_FWID_FEATURE_TAG = 0x66776964UL, /**< 'fwid' */ - LE_HALF_FEATURE_TAG = 0x68616C66UL, /**< 'half' */ - LE_HALN_FEATURE_TAG = 0x68616C6EUL, /**< 'haln' */ - LE_HALT_FEATURE_TAG = 0x68616C74UL, /**< 'halt' */ - LE_HIST_FEATURE_TAG = 0x68697374UL, /**< 'hist' */ - LE_HKNA_FEATURE_TAG = 0x686B6E61UL, /**< 'hkna' */ - LE_HLIG_FEATURE_TAG = 0x686C6967UL, /**< 'hlig' */ - LE_HNGL_FEATURE_TAG = 0x686E676CUL, /**< 'hngl' */ - LE_HWID_FEATURE_TAG = 0x68776964UL, /**< 'hwid' */ - LE_INIT_FEATURE_TAG = 0x696E6974UL, /**< 'init' */ - LE_ISOL_FEATURE_TAG = 0x69736F6CUL, /**< 'isol' */ - LE_ITAL_FEATURE_TAG = 0x6974616CUL, /**< 'ital' */ - LE_JALT_FEATURE_TAG = 0x6A616C74UL, /**< 'jalt' */ - LE_JP78_FEATURE_TAG = 0x6A703738UL, /**< 'jp78' */ - LE_JP83_FEATURE_TAG = 0x6A703833UL, /**< 'jp83' */ - LE_JP90_FEATURE_TAG = 0x6A703930UL, /**< 'jp90' */ - LE_KERN_FEATURE_TAG = 0x6B65726EUL, /**< 'kern' */ - LE_LFBD_FEATURE_TAG = 0x6C666264UL, /**< 'lfbd' */ - LE_LIGA_FEATURE_TAG = 0x6C696761UL, /**< 'liga' */ - LE_LJMO_FEATURE_TAG = 0x6C6A6D6FUL, /**< 'ljmo' */ - LE_LNUM_FEATURE_TAG = 0x6C6E756DUL, /**< 'lnum' */ - LE_LOCL_FEATURE_TAG = 0x6C6F636CUL, /**< 'locl' */ - LE_MARK_FEATURE_TAG = 0x6D61726BUL, /**< 'mark' */ - LE_MED2_FEATURE_TAG = 0x6D656432UL, /**< 'med2' */ - LE_MEDI_FEATURE_TAG = 0x6D656469UL, /**< 'medi' */ - LE_MGRK_FEATURE_TAG = 0x6D67726BUL, /**< 'mgrk' */ - LE_MKMK_FEATURE_TAG = 0x6D6B6D6BUL, /**< 'mkmk' */ - LE_MSET_FEATURE_TAG = 0x6D736574UL, /**< 'mset' */ - LE_NALT_FEATURE_TAG = 0x6E616C74UL, /**< 'nalt' */ - LE_NLCK_FEATURE_TAG = 0x6E6C636BUL, /**< 'nlck' */ - LE_NUKT_FEATURE_TAG = 0x6E756B74UL, /**< 'nukt' */ - LE_NUMR_FEATURE_TAG = 0x6E756D72UL, /**< 'numr' */ - LE_ONUM_FEATURE_TAG = 0x6F6E756DUL, /**< 'onum' */ - LE_OPBD_FEATURE_TAG = 0x6F706264UL, /**< 'opbd' */ - LE_ORDN_FEATURE_TAG = 0x6F72646EUL, /**< 'ordn' */ - LE_ORNM_FEATURE_TAG = 0x6F726E6DUL, /**< 'ornm' */ - LE_PALT_FEATURE_TAG = 0x70616C74UL, /**< 'palt' */ - LE_PCAP_FEATURE_TAG = 0x70636170UL, /**< 'pcap' */ - LE_PNUM_FEATURE_TAG = 0x706E756DUL, /**< 'pnum' */ - LE_PREF_FEATURE_TAG = 0x70726566UL, /**< 'pref' */ - LE_PRES_FEATURE_TAG = 0x70726573UL, /**< 'pres' */ - LE_PSTF_FEATURE_TAG = 0x70737466UL, /**< 'pstf' */ - LE_PSTS_FEATURE_TAG = 0x70737473UL, /**< 'psts' */ - LE_PWID_FEATURE_TAG = 0x70776964UL, /**< 'pwid' */ - LE_QWID_FEATURE_TAG = 0x71776964UL, /**< 'qwid' */ - LE_RAND_FEATURE_TAG = 0x72616E64UL, /**< 'rand' */ - LE_RLIG_FEATURE_TAG = 0x726C6967UL, /**< 'rlig' */ - LE_RPHF_FEATURE_TAG = 0x72706866UL, /**< 'rphf' */ - LE_RKRF_FEATURE_TAG = 0x726B7266UL, /**< 'rkrf' */ - LE_RTBD_FEATURE_TAG = 0x72746264UL, /**< 'rtbd' */ - LE_RTLA_FEATURE_TAG = 0x72746C61UL, /**< 'rtla' */ - LE_RUBY_FEATURE_TAG = 0x72756279UL, /**< 'ruby' */ - LE_SALT_FEATURE_TAG = 0x73616C74UL, /**< 'salt' */ - LE_SINF_FEATURE_TAG = 0x73696E66UL, /**< 'sinf' */ - LE_SIZE_FEATURE_TAG = 0x73697A65UL, /**< 'size' */ - LE_SMCP_FEATURE_TAG = 0x736D6370UL, /**< 'smcp' */ - LE_SMPL_FEATURE_TAG = 0x736D706CUL, /**< 'smpl' */ - LE_SS01_FEATURE_TAG = 0x73733031UL, /**< 'ss01' */ - LE_SS02_FEATURE_TAG = 0x73733032UL, /**< 'ss02' */ - LE_SS03_FEATURE_TAG = 0x73733033UL, /**< 'ss03' */ - LE_SS04_FEATURE_TAG = 0x73733034UL, /**< 'ss04' */ - LE_SS05_FEATURE_TAG = 0x73733035UL, /**< 'ss05' */ - LE_SS06_FEATURE_TAG = 0x73733036UL, /**< 'ss06' */ - LE_SS07_FEATURE_TAG = 0x73733037UL, /**< 'ss07' */ - LE_SS08_FEATURE_TAG = 0x73733038UL, /**< 'ss08' */ - LE_SS09_FEATURE_TAG = 0x73733039UL, /**< 'ss09' */ - LE_SS10_FEATURE_TAG = 0x73733130UL, /**< 'ss10' */ - LE_SS11_FEATURE_TAG = 0x73733131UL, /**< 'ss11' */ - LE_SS12_FEATURE_TAG = 0x73733132UL, /**< 'ss12' */ - LE_SS13_FEATURE_TAG = 0x73733133UL, /**< 'ss13' */ - LE_SS14_FEATURE_TAG = 0x73733134UL, /**< 'ss14' */ - LE_SS15_FEATURE_TAG = 0x73733135UL, /**< 'ss15' */ - LE_SS16_FEATURE_TAG = 0x73733136UL, /**< 'ss16' */ - LE_SS17_FEATURE_TAG = 0x73733137UL, /**< 'ss17' */ - LE_SS18_FEATURE_TAG = 0x73733138UL, /**< 'ss18' */ - LE_SS19_FEATURE_TAG = 0x73733139UL, /**< 'ss19' */ - LE_SS20_FEATURE_TAG = 0x73733230UL, /**< 'ss20' */ - LE_SUBS_FEATURE_TAG = 0x73756273UL, /**< 'subs' */ - LE_SUPS_FEATURE_TAG = 0x73757073UL, /**< 'sups' */ - LE_SWSH_FEATURE_TAG = 0x73777368UL, /**< 'swsh' */ - LE_TITL_FEATURE_TAG = 0x7469746CUL, /**< 'titl' */ - LE_TJMO_FEATURE_TAG = 0x746A6D6FUL, /**< 'tjmo' */ - LE_TNAM_FEATURE_TAG = 0x746E616DUL, /**< 'tnam' */ - LE_TNUM_FEATURE_TAG = 0x746E756DUL, /**< 'tnum' */ - LE_TRAD_FEATURE_TAG = 0x74726164UL, /**< 'trad' */ - LE_TWID_FEATURE_TAG = 0x74776964UL, /**< 'twid' */ - LE_UNIC_FEATURE_TAG = 0x756E6963UL, /**< 'unic' */ - LE_VALT_FEATURE_TAG = 0x76616C74UL, /**< 'valt' */ - LE_VATU_FEATURE_TAG = 0x76617475UL, /**< 'vatu' */ - LE_VERT_FEATURE_TAG = 0x76657274UL, /**< 'vert' */ - LE_VHAL_FEATURE_TAG = 0x7668616CUL, /**< 'vhal' */ - LE_VJMO_FEATURE_TAG = 0x766A6D6FUL, /**< 'vjmo' */ - LE_VKNA_FEATURE_TAG = 0x766B6E61UL, /**< 'vkna' */ - LE_VKRN_FEATURE_TAG = 0x766B726EUL, /**< 'vkrn' */ - LE_VPAL_FEATURE_TAG = 0x7670616CUL, /**< 'vpal' */ - LE_VRT2_FEATURE_TAG = 0x76727432UL, /**< 'vrt2' */ - LE_ZERO_FEATURE_TAG = 0x7A65726FUL /**< 'zero' */ -}; - -/** - * @internal - */ -enum LEFeatureENUMs { - LE_Kerning_FEATURE_ENUM = 0, /**< Requests Kerning. Formerly LayoutEngine::kTypoFlagKern */ - LE_Ligatures_FEATURE_ENUM = 1, /**< Requests Ligatures. Formerly LayoutEngine::kTypoFlagLiga */ - LE_NoCanon_FEATURE_ENUM = 2, /**< Requests No Canonical Processing */ - LE_CLIG_FEATURE_ENUM, /**< Feature specific enum */ - LE_DLIG_FEATURE_ENUM, /**< Feature specific enum */ - LE_HLIG_FEATURE_ENUM, /**< Feature specific enum */ - LE_LIGA_FEATURE_ENUM, /**< Feature specific enum */ - LE_RLIG_FEATURE_ENUM, /**< Feature specific enum */ - LE_SMCP_FEATURE_ENUM, /**< Feature specific enum */ - LE_FRAC_FEATURE_ENUM, /**< Feature specific enum */ - LE_AFRC_FEATURE_ENUM, /**< Feature specific enum */ - LE_ZERO_FEATURE_ENUM, /**< Feature specific enum */ - LE_SWSH_FEATURE_ENUM, /**< Feature specific enum */ - LE_CSWH_FEATURE_ENUM, /**< Feature specific enum */ - LE_SALT_FEATURE_ENUM, /**< Feature specific enum */ - LE_NALT_FEATURE_ENUM, /**< Feature specific enum */ - LE_RUBY_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS01_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS02_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS03_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS04_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS05_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS06_FEATURE_ENUM, /**< Feature specific enum */ - LE_SS07_FEATURE_ENUM, /**< Feature specific enum */ - - LE_CHAR_FILTER_FEATURE_ENUM = 31, /**< Apply CharSubstitutionFilter */ - LE_FEATURE_ENUM_MAX = LE_CHAR_FILTER_FEATURE_ENUM -}; - - -/** - * Flags for typographic features. - * @internal - * @{ - */ -#define LE_Kerning_FEATURE_FLAG (1 << LE_Kerning_FEATURE_ENUM) -#define LE_Ligatures_FEATURE_FLAG (1 << LE_Ligatures_FEATURE_ENUM) -#define LE_NoCanon_FEATURE_FLAG (1 << LE_NoCanon_FEATURE_ENUM) -#define LE_CLIG_FEATURE_FLAG (1 << LE_CLIG_FEATURE_ENUM) -#define LE_DLIG_FEATURE_FLAG (1 << LE_DLIG_FEATURE_ENUM) -#define LE_HLIG_FEATURE_FLAG (1 << LE_HLIG_FEATURE_ENUM) -#define LE_LIGA_FEATURE_FLAG (1 << LE_LIGA_FEATURE_ENUM) -#define LE_RLIG_FEATURE_FLAG (1 << LE_RLIG_FEATURE_ENUM) -#define LE_SMCP_FEATURE_FLAG (1 << LE_SMCP_FEATURE_ENUM) -#define LE_FRAC_FEATURE_FLAG (1 << LE_FRAC_FEATURE_ENUM) -#define LE_AFRC_FEATURE_FLAG (1 << LE_AFRC_FEATURE_ENUM) -#define LE_ZERO_FEATURE_FLAG (1 << LE_ZERO_FEATURE_ENUM) -#define LE_SWSH_FEATURE_FLAG (1 << LE_SWSH_FEATURE_ENUM) -#define LE_CSWH_FEATURE_FLAG (1 << LE_CSWH_FEATURE_ENUM) -#define LE_SALT_FEATURE_FLAG (1 << LE_SALT_FEATURE_ENUM) -#define LE_NALT_FEATURE_FLAG (1 << LE_NALT_FEATURE_ENUM) -#define LE_RUBY_FEATURE_FLAG (1 << LE_RUBY_FEATURE_ENUM) -#define LE_SS01_FEATURE_FLAG (1 << LE_SS01_FEATURE_ENUM) -#define LE_SS02_FEATURE_FLAG (1 << LE_SS02_FEATURE_ENUM) -#define LE_SS03_FEATURE_FLAG (1 << LE_SS03_FEATURE_ENUM) -#define LE_SS04_FEATURE_FLAG (1 << LE_SS04_FEATURE_ENUM) -#define LE_SS05_FEATURE_FLAG (1 << LE_SS05_FEATURE_ENUM) -#define LE_SS06_FEATURE_FLAG (1 << LE_SS06_FEATURE_ENUM) -#define LE_SS07_FEATURE_FLAG (1 << LE_SS07_FEATURE_ENUM) - -#define LE_CHAR_FILTER_FEATURE_FLAG (1 << LE_CHAR_FILTER_FEATURE_ENUM) -/** - * @} - */ - -#define LE_DEFAULT_FEATURE_FLAG (LE_Kerning_FEATURE_FLAG | LE_Ligatures_FEATURE_FLAG) /**< default features */ - -/** - * Error codes returned by the LayoutEngine. - * - * @stable ICU 2.4 - */ -#ifndef HAVE_LEERRORCODE -enum LEErrorCode { - /* informational */ - LE_NO_SUBFONT_WARNING = U_USING_DEFAULT_WARNING, /**< The font does not contain subfonts. */ - - /* success */ - LE_NO_ERROR = U_ZERO_ERROR, /**< No error, no warning. */ - - /* failures */ - LE_ILLEGAL_ARGUMENT_ERROR = U_ILLEGAL_ARGUMENT_ERROR, /**< An illegal argument was detected. */ - LE_MEMORY_ALLOCATION_ERROR = U_MEMORY_ALLOCATION_ERROR, /**< Memory allocation error. */ - LE_INDEX_OUT_OF_BOUNDS_ERROR = U_INDEX_OUTOFBOUNDS_ERROR, /**< Trying to access an index that is out of bounds. */ - LE_NO_LAYOUT_ERROR = U_UNSUPPORTED_ERROR, /**< You must call layoutChars() first. */ - LE_INTERNAL_ERROR = U_INTERNAL_PROGRAM_ERROR, /**< An internal error was encountered. */ - LE_FONT_FILE_NOT_FOUND_ERROR = U_FILE_ACCESS_ERROR, /**< The requested font file cannot be opened. */ - LE_MISSING_FONT_TABLE_ERROR = U_MISSING_RESOURCE_ERROR /**< The requested font table does not exist. */ -}; -#endif - -#ifndef __cplusplus -/** - * Error codes returned by the LayoutEngine. - * - * @stable ICU 2.4 - */ -typedef enum LEErrorCode LEErrorCode; -#endif - -/** - * A convenience macro to test for the success of a LayoutEngine call. - * - * @stable ICU 2.4 - */ -#ifndef LE_SUCCESS -#define LE_SUCCESS(code) (U_SUCCESS((UErrorCode)code)) -#endif - -/** - * A convenience macro to test for the failure of a LayoutEngine call. - * - * @stable ICU 2.4 - */ -#ifndef LE_FAILURE -#define LE_FAILURE(code) (U_FAILURE((UErrorCode)code)) -#endif - -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,740 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LELanguages.h" -#include "LESwaps.h" - -#include "LayoutEngine.h" -#include "ArabicLayoutEngine.h" -#include "CanonShaping.h" -#include "HanLayoutEngine.h" -#include "HangulLayoutEngine.h" -#include "IndicLayoutEngine.h" -#include "KhmerLayoutEngine.h" -#include "ThaiLayoutEngine.h" -#include "TibetanLayoutEngine.h" -#include "GXLayoutEngine.h" -#include "GXLayoutEngine2.h" - -#include "ScriptAndLanguageTags.h" -#include "CharSubstitutionFilter.h" - -#include "LEGlyphStorage.h" - -#include "OpenTypeUtilities.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "MorphTables.h" - -#include "DefaultCharMapper.h" - -#include "KernTable.h" - -U_NAMESPACE_BEGIN - -/* Leave this copyright notice here! It needs to go somewhere in this library. */ -static const char copyright[] = U_COPYRIGHT_STRING; - -/* TODO: remove these? */ -const le_int32 LayoutEngine::kTypoFlagKern = LE_Kerning_FEATURE_FLAG; -const le_int32 LayoutEngine::kTypoFlagLiga = LE_Ligatures_FEATURE_FLAG; - -const LEUnicode32 DefaultCharMapper::controlChars[] = { - 0x0009, 0x000A, 0x000D, - /*0x200C, 0x200D,*/ 0x200E, 0x200F, - 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, - 0x206A, 0x206B, 0x206C, 0x206D, 0x206E, 0x206F -}; - -const le_int32 DefaultCharMapper::controlCharsCount = LE_ARRAY_SIZE(controlChars); - -const LEUnicode32 DefaultCharMapper::controlCharsZWJ[] = { - 0x0009, 0x000A, 0x000D, - 0x200C, 0x200D, 0x200E, 0x200F, - 0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, - 0x206A, 0x206B, 0x206C, 0x206D, 0x206E, 0x206F -}; - -const le_int32 DefaultCharMapper::controlCharsZWJCount = LE_ARRAY_SIZE(controlCharsZWJ); - -LEUnicode32 DefaultCharMapper::mapChar(LEUnicode32 ch) const -{ - if (fZWJ) { - if (ch < 0x20) { - if (ch == 0x0a || ch == 0x0d || ch == 0x09) { - return 0xffff; - } - } else if (ch >= 0x200c && ch <= 0x206f) { - le_int32 index = OpenTypeUtilities::search((le_uint32)ch, - (le_uint32 *)controlCharsZWJ, - controlCharsZWJCount); - if (controlCharsZWJ[index] == ch) { - return 0xffff; - } - } - return ch; // note ZWJ bypasses fFilterControls and fMirror - } - - if (fFilterControls) { - le_int32 index = OpenTypeUtilities::search((le_uint32)ch, (le_uint32 *)controlChars, controlCharsCount); - - if (controlChars[index] == ch) { - return 0xFFFF; - } - } - - if (fMirror) { - le_int32 index = OpenTypeUtilities::search((le_uint32) ch, (le_uint32 *)DefaultCharMapper::mirroredChars, DefaultCharMapper::mirroredCharsCount); - - if (mirroredChars[index] == ch) { - return DefaultCharMapper::srahCderorrim[index]; - } - } - - return ch; -} - -// This is here to get it out of LEGlyphFilter.h. -// No particular reason to put it here, other than -// this is a good central location... -LEGlyphFilter::~LEGlyphFilter() -{ - // nothing to do -} - -CharSubstitutionFilter::CharSubstitutionFilter(const LEFontInstance *fontInstance) - : fFontInstance(fontInstance) -{ - // nothing to do -} - -CharSubstitutionFilter::~CharSubstitutionFilter() -{ - // nothing to do -} - -class CanonMarkFilter : public UMemory, public LEGlyphFilter -{ -private: - const LEReferenceTo<GlyphClassDefinitionTable> classDefTable; - - CanonMarkFilter(const CanonMarkFilter &other); // forbid copying of this class - CanonMarkFilter &operator=(const CanonMarkFilter &other); // forbid copying of this class - -public: - CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success); - virtual ~CanonMarkFilter(); - - virtual le_bool accept(LEGlyphID glyph, LEErrorCode &success) const; -}; - -CanonMarkFilter::CanonMarkFilter(const LEReferenceTo<GlyphDefinitionTableHeader> &gdefTable, LEErrorCode &success) - : classDefTable(gdefTable->getMarkAttachClassDefinitionTable(gdefTable, success)) -{ -} - -CanonMarkFilter::~CanonMarkFilter() -{ - // nothing to do? -} - -le_bool CanonMarkFilter::accept(LEGlyphID glyph, LEErrorCode &success) const -{ - le_int32 glyphClass = classDefTable->getGlyphClass(classDefTable, glyph, success); - if(LE_FAILURE(success)) return false; - return glyphClass != 0; -} - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LayoutEngine) - -#define ccmpFeatureTag LE_CCMP_FEATURE_TAG - -#define ccmpFeatureMask 0x80000000UL - -#define canonFeatures (ccmpFeatureMask) - -static const FeatureMap canonFeatureMap[] = -{ - {ccmpFeatureTag, ccmpFeatureMask} -}; - -static const le_int32 canonFeatureMapCount = LE_ARRAY_SIZE(canonFeatureMap); - -LayoutEngine::LayoutEngine(const LEFontInstance *fontInstance, - le_int32 scriptCode, - le_int32 languageCode, - le_int32 typoFlags, - LEErrorCode &success) - : fGlyphStorage(NULL), fFontInstance(fontInstance), fScriptCode(scriptCode), fLanguageCode(languageCode), - fTypoFlags(typoFlags), fFilterZeroWidth(TRUE) -{ - if (LE_FAILURE(success)) { - return; - } - - fGlyphStorage = new LEGlyphStorage(); - if (fGlyphStorage == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - } -} - -le_int32 LayoutEngine::getGlyphCount() const -{ - return fGlyphStorage->getGlyphCount(); -} - -void LayoutEngine::getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const -{ - fGlyphStorage->getCharIndices(charIndices, indexBase, success); -} - -void LayoutEngine::getCharIndices(le_int32 charIndices[], LEErrorCode &success) const -{ - fGlyphStorage->getCharIndices(charIndices, success); -} - -// Copy the glyphs into caller's (32-bit) glyph array, OR in extraBits -void LayoutEngine::getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const -{ - fGlyphStorage->getGlyphs(glyphs, extraBits, success); -} - -void LayoutEngine::getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const -{ - fGlyphStorage->getGlyphs(glyphs, success); -} - - -void LayoutEngine::getGlyphPositions(float positions[], LEErrorCode &success) const -{ - fGlyphStorage->getGlyphPositions(positions, success); -} - -void LayoutEngine::getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const -{ - fGlyphStorage->getGlyphPosition(glyphIndex, x, y, success); -} - -le_int32 LayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if ((fTypoFlags & LE_NoCanon_FEATURE_FLAG) == 0) { // no canonical processing - return count; - } - - LEReferenceTo<GlyphSubstitutionTableHeader> canonGSUBTable(LETableReference::kStaticData, - (GlyphSubstitutionTableHeader *) CanonShaping::glyphSubstitutionTable, - CanonShaping::glyphSubstitutionTableLen); - LETag scriptTag = OpenTypeLayoutEngine::getScriptTag(fScriptCode); - LETag langSysTag = OpenTypeLayoutEngine::getLangSysTag(fLanguageCode); - le_int32 i, dir = 1, out = 0, outCharCount = count; - - if (canonGSUBTable->coversScript(canonGSUBTable,scriptTag, success) || LE_SUCCESS(success)) { - CharSubstitutionFilter *substitutionFilter = new CharSubstitutionFilter(fFontInstance); - if (substitutionFilter == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - const LEUnicode *inChars = &chars[offset]; - LEUnicode *reordered = NULL; - LEGlyphStorage fakeGlyphStorage; - - fakeGlyphStorage.allocateGlyphArray(count, rightToLeft, success); - - if (LE_FAILURE(success)) { - delete substitutionFilter; - return 0; - } - - // This is the cheapest way to get mark reordering only for Hebrew. - // We could just do the mark reordering for all scripts, but most - // of them probably don't need it... - if (fScriptCode == hebrScriptCode) { - reordered = LE_NEW_ARRAY(LEUnicode, count); - - if (reordered == NULL) { - delete substitutionFilter; - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, reordered, fakeGlyphStorage); - inChars = reordered; - } - - fakeGlyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - delete substitutionFilter; - return 0; - } - - if (rightToLeft) { - out = count - 1; - dir = -1; - } - - for (i = 0; i < count; i += 1, out += dir) { - fakeGlyphStorage[out] = (LEGlyphID) inChars[i]; - fakeGlyphStorage.setAuxData(out, canonFeatures, success); - } - - if (reordered != NULL) { - LE_DELETE_ARRAY(reordered); - } - - const LEReferenceTo<GlyphDefinitionTableHeader> noGDEF; // empty gdef header - outCharCount = canonGSUBTable->process(canonGSUBTable, fakeGlyphStorage, rightToLeft, scriptTag, langSysTag, noGDEF, substitutionFilter, canonFeatureMap, canonFeatureMapCount, FALSE, success); - - if (LE_FAILURE(success)) { - delete substitutionFilter; - return 0; - } - - out = (rightToLeft? outCharCount - 1 : 0); - - /* - * The char indices array in fakeGlyphStorage has the correct mapping - * back to the original input characters. Save it in glyphStorage. The - * subsequent call to glyphStoratge.allocateGlyphArray will keep this - * array rather than allocating and initializing a new one. - */ - glyphStorage.adoptCharIndicesArray(fakeGlyphStorage); - - outChars = LE_NEW_ARRAY(LEUnicode, outCharCount); - - if (outChars == NULL) { - delete substitutionFilter; - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - for (i = 0; i < outCharCount; i += 1, out += dir) { - outChars[out] = (LEUnicode) LE_GET_GLYPH(fakeGlyphStorage[i]); - } - - delete substitutionFilter; - } - - return outCharCount; -} - -le_int32 LayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - LEUnicode *outChars = NULL; - le_int32 outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, glyphStorage, success); - - if (outChars != NULL) { - mapCharsToGlyphs(outChars, 0, outCharCount, rightToLeft, rightToLeft, glyphStorage, success); - LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... - } else { - mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); - } - - return glyphStorage.getGlyphCount(); -} - -// Input: glyphs -// Output: positions -void LayoutEngine::positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - glyphStorage.allocatePositions(success); - - if (LE_FAILURE(success)) { - return; - } - - le_int32 i, glyphCount = glyphStorage.getGlyphCount(); - - for (i = 0; i < glyphCount; i += 1) { - LEPoint advance; - - glyphStorage.setPosition(i, x, y, success); - _LETRACE("g#%-4d (%.2f, %.2f)", i, x, y); - - fFontInstance->getGlyphAdvance(glyphStorage[i], advance); - x += advance.fX; - y += advance.fY; - - - } - - glyphStorage.setPosition(glyphCount, x, y, success); -} - -void LayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - LEReferenceTo<GlyphDefinitionTableHeader> gdefTable(LETableReference::kStaticData, (GlyphDefinitionTableHeader *) CanonShaping::glyphDefinitionTable, - CanonShaping::glyphDefinitionTableLen); - CanonMarkFilter filter(gdefTable, success); - - adjustMarkGlyphs(&chars[offset], count, reverse, glyphStorage, &filter, success); - - if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ - LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); - KernTable kt(kernTable, success); - kt.process(glyphStorage, success); - } - - // default is no adjustments - return; -} - -void LayoutEngine::adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) -{ - float xAdjust = 0; - le_int32 p, glyphCount = glyphStorage.getGlyphCount(); - - if (LE_FAILURE(success)) { - return; - } - - if (markFilter == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - float ignore, prev; - - glyphStorage.getGlyphPosition(0, prev, ignore, success); - - for (p = 0; p < glyphCount; p += 1) { - float next, xAdvance; - - glyphStorage.getGlyphPosition(p + 1, next, ignore, success); - - xAdvance = next - prev; - _LETRACE("p#%d (%.2f,%.2f)", p, xAdvance, 0); - glyphStorage.adjustPosition(p, xAdjust, 0, success); - - if (markFilter->accept(glyphStorage[p], success)) { - xAdjust -= xAdvance; - } - - prev = next; - } - - glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); -} - -void LayoutEngine::adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success) -{ - float xAdjust = 0; - le_int32 c = 0, direction = 1, p; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - if (LE_FAILURE(success)) { - return; - } - - if (markFilter == NULL) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (reverse) { - c = glyphCount - 1; - direction = -1; - } - - float ignore, prev; - - glyphStorage.getGlyphPosition(0, prev, ignore, success); - - for (p = 0; p < charCount; p += 1, c += direction) { - float next, xAdvance; - - glyphStorage.getGlyphPosition(p + 1, next, ignore, success); - - xAdvance = next - prev; - - _LETRACE("p#%d (%.2f,%.2f)", p, xAdvance, 0); - - - glyphStorage.adjustPosition(p, xAdjust, 0, success); - - if (markFilter->accept(chars[c], success)) { - xAdjust -= xAdvance; - } - - prev = next; - } - - glyphStorage.adjustPosition(glyphCount, xAdjust, 0, success); -} - -const void *LayoutEngine::getFontTable(LETag tableTag, size_t &length) const -{ - return fFontInstance->getFontTable(tableTag, length); -} - -void LayoutEngine::mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - glyphStorage.allocateGlyphArray(count, reverse, success); - - DefaultCharMapper charMapper(TRUE, mirror); - - fFontInstance->mapCharsToGlyphs(chars, offset, count, reverse, &charMapper, fFilterZeroWidth, glyphStorage); -} - -// Input: characters, font? -// Output: glyphs, positions, char indices -// Returns: number of glyphs -le_int32 LayoutEngine::layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - float x, float y, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - le_int32 glyphCount; - - if (fGlyphStorage->getGlyphCount() > 0) { - fGlyphStorage->reset(); - } - - glyphCount = computeGlyphs(chars, offset, count, max, rightToLeft, *fGlyphStorage, success); - positionGlyphs(*fGlyphStorage, x, y, success); - adjustGlyphPositions(chars, offset, count, rightToLeft, *fGlyphStorage, success); - - return glyphCount; -} - -void LayoutEngine::reset() -{ - if(fGlyphStorage!=NULL) { - fGlyphStorage->reset(); - } -} - -LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success) -{ - //kerning and ligatures - by default - return LayoutEngine::layoutEngineFactory(fontInstance, scriptCode, languageCode, LE_DEFAULT_FEATURE_FLAG, success); -} - -LayoutEngine *LayoutEngine::layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) -{ - static const le_uint32 gsubTableTag = LE_GSUB_TABLE_TAG; - static const le_uint32 mortTableTag = LE_MORT_TABLE_TAG; - static const le_uint32 morxTableTag = LE_MORX_TABLE_TAG; - - if (LE_FAILURE(success)) { - return NULL; - } - - LEReferenceTo<GlyphSubstitutionTableHeader> gsubTable(fontInstance,gsubTableTag,success); - LayoutEngine *result = NULL; - LETag scriptTag = 0x00000000; - LETag languageTag = 0x00000000; - LETag v2ScriptTag = OpenTypeLayoutEngine::getV2ScriptTag(scriptCode); - - // Right now, only invoke V2 processing for Devanagari. TODO: Allow more V2 scripts as they are - // properly tested. - - if ( v2ScriptTag == dev2ScriptTag && gsubTable.isValid() && gsubTable->coversScript(gsubTable, v2ScriptTag, success )) { - result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, TRUE, gsubTable, success); - } - else if (gsubTable.isValid() && gsubTable->coversScript(gsubTable, scriptTag = OpenTypeLayoutEngine::getScriptTag(scriptCode), success)) { - switch (scriptCode) { - case bengScriptCode: - case devaScriptCode: - case gujrScriptCode: - case kndaScriptCode: - case mlymScriptCode: - case oryaScriptCode: - case guruScriptCode: - case tamlScriptCode: - case teluScriptCode: - case sinhScriptCode: - result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, FALSE, gsubTable, success); - break; - - case arabScriptCode: - result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - - case hebrScriptCode: - // Disable hebrew ligatures since they have only archaic uses, see ticket #8318 - result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags & ~kTypoFlagLiga, gsubTable, success); - break; - - case hangScriptCode: - result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - - case haniScriptCode: - languageTag = OpenTypeLayoutEngine::getLangSysTag(languageCode); - - switch (languageCode) { - case korLanguageCode: - case janLanguageCode: - case zhtLanguageCode: - case zhsLanguageCode: - if (gsubTable->coversScriptAndLanguage(gsubTable, scriptTag, languageTag, success, TRUE)) { - result = new HanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - } - - // note: falling through to default case. - default: - result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - } - - break; - - case tibtScriptCode: - result = new TibetanOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - - case khmrScriptCode: - result = new KhmerOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - - default: - result = new OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success); - break; - } - } else { - LEReferenceTo<MorphTableHeader2> morxTable(fontInstance, morxTableTag, success); - if (LE_SUCCESS(success) && - morxTable.isValid() && - SWAPL(morxTable->version)==0x00020000) { - result = new GXLayoutEngine2(fontInstance, scriptCode, languageCode, morxTable, typoFlags, success); - } else { - LEReferenceTo<MorphTableHeader> mortTable(fontInstance, mortTableTag, success); - if (LE_SUCCESS(success) && mortTable.isValid() && SWAPL(mortTable->version)==0x00010000) { // mort - result = new GXLayoutEngine(fontInstance, scriptCode, languageCode, mortTable, success); - } else { - switch (scriptCode) { - case bengScriptCode: - case devaScriptCode: - case gujrScriptCode: - case kndaScriptCode: - case mlymScriptCode: - case oryaScriptCode: - case guruScriptCode: - case tamlScriptCode: - case teluScriptCode: - case sinhScriptCode: - { - result = new IndicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); - break; - } - - case arabScriptCode: - result = new UnicodeArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); - break; - - //case hebrScriptCode: - // return new HebrewOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags); - - case thaiScriptCode: - result = new ThaiLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); - break; - - case hangScriptCode: - result = new HangulOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); - break; - - default: - result = new LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success); - break; - } - } - } - } - - if (result && LE_FAILURE(success)) { - delete result; - result = NULL; - } - - if (result == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - } - - return result; -} - -LayoutEngine::~LayoutEngine() { - delete fGlyphStorage; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,539 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __LAYOUTENGINE_H -#define __LAYOUTENGINE_H - -#include "LETypes.h" - -/** - * \file - * \brief C++ API: Virtual base class for complex text layout. - */ - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class LEGlyphFilter; -class LEGlyphStorage; - -/** - * This is a virtual base class used to do complex text layout. The text must all - * be in a single font, script, and language. An instance of a LayoutEngine can be - * created by calling the layoutEngineFactory method. Fonts are identified by - * instances of the LEFontInstance class. Script and language codes are identified - * by integer codes, which are defined in ScriptAndLanuageTags.h. - * - * Note that this class is not public API. It is declared public so that it can be - * exported from the library that it is a part of. - * - * The input to the layout process is an array of characters in logical order, - * and a starting X, Y position for the text. The output is an array of glyph indices, - * an array of character indices for the glyphs, and an array of glyph positions. - * These arrays are protected members of LayoutEngine which can be retreived by a - * public method. The reset method can be called to free these arrays so that the - * LayoutEngine can be reused. - * - * The layout process is done in three steps. There is a protected virtual method - * for each step. These methods have a default implementation which only does - * character to glyph mapping and default positioning using the glyph's advance - * widths. Subclasses can override these methods for more advanced layout. - * There is a public method which invokes the steps in the correct order. - * - * The steps are: - * - * 1) Glyph processing - character to glyph mapping and any other glyph processing - * such as ligature substitution and contextual forms. - * - * 2) Glyph positioning - position the glyphs based on their advance widths. - * - * 3) Glyph position adjustments - adjustment of glyph positions for kerning, - * accent placement, etc. - * - * NOTE: in all methods below, output parameters are references to pointers so - * the method can allocate and free the storage as needed. All storage allocated - * in this way is owned by the object which created it, and will be freed when it - * is no longer needed, or when the object's destructor is invoked. - * - * @see LEFontInstance - * @see ScriptAndLanguageTags.h - * - * @stable ICU 2.8 - */ -class U_LAYOUT_API LayoutEngine : public UObject { -public: -#ifndef U_HIDE_INTERNAL_API - /** @internal Flag to request kerning. Use LE_Kerning_FEATURE_FLAG instead. */ - static const le_int32 kTypoFlagKern; - /** @internal Flag to request ligatures. Use LE_Ligatures_FEATURE_FLAG instead. */ - static const le_int32 kTypoFlagLiga; -#endif /* U_HIDE_INTERNAL_API */ - -protected: - /** - * The object which holds the glyph storage - * - * @internal - */ - LEGlyphStorage *fGlyphStorage; - - /** - * The font instance for the text font. - * - * @see LEFontInstance - * - * @internal - */ - const LEFontInstance *fFontInstance; - - /** - * The script code for the text - * - * @see ScriptAndLanguageTags.h for script codes. - * - * @internal - */ - le_int32 fScriptCode; - - /** - * The langauge code for the text - * - * @see ScriptAndLanguageTags.h for language codes. - * - * @internal - */ - le_int32 fLanguageCode; - - /** - * The typographic control flags - * - * @internal - */ - le_int32 fTypoFlags; - - /** - * <code>TRUE</code> if <code>mapCharsToGlyphs</code> should replace ZWJ / ZWNJ with a glyph - * with no contours. - * - * @internal - */ - le_bool fFilterZeroWidth; - -#ifndef U_HIDE_INTERNAL_API - /** - * This constructs an instance for a given font, script and language. Subclass constructors - * must call this constructor. - * - * @param fontInstance - the font for the text - * @param scriptCode - the script for the text - * @param languageCode - the language for the text - * @param typoFlags - the typographic control flags for the text (a bitfield). Use kTypoFlagKern - * if kerning is desired, kTypoFlagLiga if ligature formation is desired. Others are reserved. - * @param success - set to an error code if the operation fails - * - * @see LEFontInstance - * @see ScriptAndLanguageTags.h - * - * @internal - */ - LayoutEngine(const LEFontInstance *fontInstance, - le_int32 scriptCode, - le_int32 languageCode, - le_int32 typoFlags, - LEErrorCode &success); -#endif /* U_HIDE_INTERNAL_API */ - - // Do not enclose the protected default constructor with #ifndef U_HIDE_INTERNAL_API - // or else the compiler will create a public default constructor. - /** - * This overrides the default no argument constructor to make it - * difficult for clients to call it. Clients are expected to call - * layoutEngineFactory. - * - * @internal - */ - LayoutEngine(); - - /** - * This method does any required pre-processing to the input characters. It - * may generate output characters that differ from the input charcters due to - * insertions, deletions, or reorderings. In such cases, it will also generate an - * output character index array reflecting these changes. - * - * Subclasses must override this method. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - TRUE if the characters are in a right to left directional run - * @param outChars - the output character array, if different from the input - * @param glyphStorage - the object that holds the per-glyph storage. The character index array may be set. - * @param success - set to an error code if the operation fails - * - * @return the output character count (input character count if no change) - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does the glyph processing. It converts an array of characters - * into an array of glyph indices and character indices. The characters to be - * processed are passed in a surrounding context. The context is specified as - * a starting address and a maximum character count. An offset and a count are - * used to specify the characters to be processed. - * - * The default implementation of this method only does character to glyph mapping. - * Subclasses needing more elaborate glyph processing must override this method. - * - * Input parameters: - * @param chars - the character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the context. - * @param rightToLeft - TRUE if the text is in a right to left directional run - * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char indices arrays - * will be set. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the glyph index array - * - * @internal - */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does basic glyph positioning. The default implementation positions - * the glyphs based on their advance widths. This is sufficient for most uses. It - * is not expected that many subclasses will override this method. - * - * Input parameters: - * @param glyphStorage - the object which holds the per-glyph storage. The glyph position array will be set. - * @param x - the starting X position - * @param y - the starting Y position - * @param success - set to an error code if the operation fails - * - * @internal - */ - virtual void positionGlyphs(LEGlyphStorage &glyphStorage, float x, float y, LEErrorCode &success); - - /** - * This method does positioning adjustments like accent positioning and - * kerning. The default implementation does nothing. Subclasses needing - * position adjustments must override this method. - * - * Note that this method has both characters and glyphs as input so that - * it can use the character codes to determine glyph types if that information - * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF - * table) - * - * @param chars - the input character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered - * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be - * adjusted as needed. - * @param success - output parameter set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method gets a table from the font associated with - * the text. The default implementation gets the table from - * the font instance. Subclasses which need to get the tables - * some other way must override this method. - * - * @param tableTag - the four byte table tag. - * @param length - length to use - * - * @return the address of the table. - * - * @internal - */ - virtual const void *getFontTable(LETag tableTag, size_t &length) const; - - /** - * @deprecated - */ - virtual const void *getFontTable(LETag tableTag) const { size_t ignored; return getFontTable(tableTag, ignored); } - - /** - * This method does character to glyph mapping. The default implementation - * uses the font instance to do the mapping. It will allocate the glyph and - * character index arrays if they're not already allocated. If it allocates the - * character index array, it will fill it. - * - * This method supports right to left - * text with the ability to store the glyphs in reverse order, and by supporting - * character mirroring, which will replace a character which has a left and right - * form, such as parens, with the opposite form before mapping it to a glyph index. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the offset of the first character to be mapped - * @param count - the number of characters to be mapped - * @param reverse - if <code>TRUE</code>, the output will be in reverse order - * @param mirror - if <code>TRUE</code>, do character mirroring - * @param glyphStorage - the object which holds the per-glyph storage. The glyph and char - * indices arrays will be filled in. - * @param success - set to an error code if the operation fails - * - * @see LEFontInstance - * - * @internal - */ - virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, le_bool mirror, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -#ifndef U_HIDE_INTERNAL_API - /** - * This is a convenience method that forces the advance width of mark - * glyphs to be zero, which is required for proper selection and highlighting. - * - * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. - * @param markFilter - used to identify mark glyphs - * @param success - output parameter set to an error code if the operation fails - * - * @see LEGlyphFilter - * - * @internal - */ - static void adjustMarkGlyphs(LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); - - - /** - * This is a convenience method that forces the advance width of mark - * glyphs to be zero, which is required for proper selection and highlighting. - * This method uses the input characters to identify marks. This is required in - * cases where the font does not contain enough information to identify them based - * on the glyph IDs. - * - * @param chars - the array of input characters - * @param charCount - the number of input characers - * @param glyphStorage - the object containing the per-glyph storage. The positions array will be modified. - * @param reverse - <code>TRUE</code> if the glyph array has been reordered - * @param markFilter - used to identify mark glyphs - * @param success - output parameter set to an error code if the operation fails - * - * @see LEGlyphFilter - * - * @internal - */ - static void adjustMarkGlyphs(const LEUnicode chars[], le_int32 charCount, le_bool reverse, LEGlyphStorage &glyphStorage, LEGlyphFilter *markFilter, LEErrorCode &success); -#endif /* U_HIDE_INTERNAL_API */ - -public: - /** - * The destructor. It will free any storage allocated for the - * glyph, character index and position arrays by calling the reset - * method. It is declared virtual so that it will be invoked by the - * subclass destructors. - * - * @stable ICU 2.8 - */ - virtual ~LayoutEngine(); - - /** - * This method will invoke the layout steps in their correct order by calling - * the computeGlyphs, positionGlyphs and adjustGlyphPosition methods. It will - * compute the glyph, character index and position arrays. - * - * @param chars - the input character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - TRUE if the characers are in a right to left directional run - * @param x - the initial X position - * @param y - the initial Y position - * @param success - output parameter set to an error code if the operation fails - * - * @return the number of glyphs in the glyph array - * - * Note: The glyph, character index and position array can be accessed - * using the getter methods below. - * - * Note: If you call this method more than once, you must call the reset() - * method first to free the glyph, character index and position arrays - * allocated by the previous call. - * - * @stable ICU 2.8 - */ - virtual le_int32 layoutChars(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, float x, float y, LEErrorCode &success); - - /** - * This method returns the number of glyphs in the glyph array. Note - * that the number of glyphs will be greater than or equal to the number - * of characters used to create the LayoutEngine. - * - * @return the number of glyphs in the glyph array - * - * @stable ICU 2.8 - */ - le_int32 getGlyphCount() const; - - /** - * This method copies the glyph array into a caller supplied array. - * The caller must ensure that the array is large enough to hold all - * the glyphs. - * - * @param glyphs - the destiniation glyph array - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - void getGlyphs(LEGlyphID glyphs[], LEErrorCode &success) const; - - /** - * This method copies the glyph array into a caller supplied array, - * ORing in extra bits. (This functionality is needed by the JDK, - * which uses 32 bits pre glyph idex, with the high 16 bits encoding - * the composite font slot number) - * - * @param glyphs - the destination (32 bit) glyph array - * @param extraBits - this value will be ORed with each glyph index - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - virtual void getGlyphs(le_uint32 glyphs[], le_uint32 extraBits, LEErrorCode &success) const; - - /** - * This method copies the character index array into a caller supplied array. - * The caller must ensure that the array is large enough to hold a - * character index for each glyph. - * - * @param charIndices - the destiniation character index array - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - void getCharIndices(le_int32 charIndices[], LEErrorCode &success) const; - - /** - * This method copies the character index array into a caller supplied array. - * The caller must ensure that the array is large enough to hold a - * character index for each glyph. - * - * @param charIndices - the destiniation character index array - * @param indexBase - an offset which will be added to each index - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - void getCharIndices(le_int32 charIndices[], le_int32 indexBase, LEErrorCode &success) const; - - /** - * This method copies the position array into a caller supplied array. - * The caller must ensure that the array is large enough to hold an - * X and Y position for each glyph, plus an extra X and Y for the - * advance of the last glyph. - * - * @param positions - the destiniation position array - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - void getGlyphPositions(float positions[], LEErrorCode &success) const; - - /** - * This method returns the X and Y position of the glyph at - * the given index. - * - * Input parameters: - * @param glyphIndex - the index of the glyph - * - * Output parameters: - * @param x - the glyph's X position - * @param y - the glyph's Y position - * @param success - set to an error code if the operation fails - * - * @stable ICU 2.8 - */ - void getGlyphPosition(le_int32 glyphIndex, float &x, float &y, LEErrorCode &success) const; - - /** - * This method frees the glyph, character index and position arrays - * so that the LayoutEngine can be reused to layout a different - * characer array. (This method is also called by the destructor) - * - * @stable ICU 2.8 - */ - virtual void reset(); - - /** - * This method returns a LayoutEngine capable of laying out text - * in the given font, script and langauge. Note that the LayoutEngine - * returned may be a subclass of LayoutEngine. - * - * @param fontInstance - the font of the text - * @param scriptCode - the script of the text - * @param languageCode - the language of the text - * @param success - output parameter set to an error code if the operation fails - * - * @return a LayoutEngine which can layout text in the given font. - * - * @see LEFontInstance - * - * @stable ICU 2.8 - */ - static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, LEErrorCode &success); - - /** - * Override of existing call that provides flags to control typography. - * @stable ICU 3.4 - */ - static LayoutEngine *layoutEngineFactory(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typo_flags, LEErrorCode &success); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LayoutTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __LAYOUTTABLES_H -#define __LAYOUTTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" - -U_NAMESPACE_BEGIN - -#define ANY_NUMBER 1 - -typedef le_int16 ByteOffset; -typedef le_int16 WordOffset; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstProc.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "LigatureSubstProc.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -#define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m)))) -#define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m)) -#define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor) - - LigatureSubstitutionProcessor::LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) -: StateTableProcessor(morphSubtableHeader, success), ligatureSubstitutionHeader(morphSubtableHeader, success) -{ - if(LE_FAILURE(success)) return; - ligatureActionTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureActionTableOffset); - componentTableOffset = SWAPW(ligatureSubstitutionHeader->componentTableOffset); - ligatureTableOffset = SWAPW(ligatureSubstitutionHeader->ligatureTableOffset); - - entryTable = LEReferenceToArrayOf<LigatureSubstitutionStateEntry>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY); -} - -LigatureSubstitutionProcessor::~LigatureSubstitutionProcessor() -{ -} - -void LigatureSubstitutionProcessor::beginStateTable() -{ - m = -1; -} - -ByteOffset LigatureSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success) -{ - const LigatureSubstitutionStateEntry *entry = entryTable.getAlias(index, success); - if (LE_FAILURE(success)) { - currGlyph++; - return 0; - } - - ByteOffset newState = SWAPW(entry->newStateOffset); - le_uint16 flags = SWAPW(entry->flags); - - if (flags & lsfSetComponent) { - if (++m >= nComponents) { - m = 0; - } - - componentStack[m] = currGlyph; - } else if ( m == -1) { - // bad font- skip this glyph. - currGlyph++; - return newState; - } - - ByteOffset actionOffset = flags & lsfActionOffsetMask; - - if (actionOffset != 0) { - LEReferenceTo<LigatureActionEntry> ap(stHeader, success, actionOffset); - if (LE_FAILURE(success)) { - currGlyph++; - return newState; - } - LigatureActionEntry action; - le_int32 offset, i = 0, j = 0; - le_int32 stack[nComponents]; - le_int16 mm = -1; - - do { - le_uint32 componentGlyph = componentStack[m--]; - - if (j++ > 0) { - ap.addObject(success); - if (LE_FAILURE(success)) { - currGlyph++; - return newState; - } - } - - action = SWAPL(*ap.getAlias()); - - if (m < 0) { - m = nComponents - 1; - } - - offset = action & lafComponentOffsetMask; - if (offset != 0) { - LEReferenceToArrayOf<le_int16> offsetTable(stHeader, success, 2 * SignExtend(offset, lafComponentOffsetMask), LE_UNBOUNDED_ARRAY); - - if(LE_FAILURE(success)) { - currGlyph++; - LE_DEBUG_BAD_FONT("off end of ligature substitution header"); - return newState; // get out! bad font - } - if(componentGlyph >= glyphStorage.getGlyphCount()) { - LE_DEBUG_BAD_FONT("preposterous componentGlyph"); - currGlyph++; - return newState; // get out! bad font - } - i += SWAPW(offsetTable.getObject(LE_GET_GLYPH(glyphStorage[componentGlyph]), success)); - if (LE_FAILURE(success)) { - currGlyph++; - return newState; - } - - if (action & (lafLast | lafStore)) { - LEReferenceTo<TTGlyphID> ligatureOffset(stHeader, success, i); - if (LE_FAILURE(success)) { - currGlyph++; - return newState; - } - TTGlyphID ligatureGlyph = SWAPW(*ligatureOffset.getAlias()); - - glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); - if(mm==nComponents) { - LE_DEBUG_BAD_FONT("exceeded nComponents"); - mm--; // don't overrun the stack. - } - stack[++mm] = componentGlyph; - i = 0; - } else { - glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); - } - } -#if LE_ASSERT_BAD_FONT - if(m<0) { - LE_DEBUG_BAD_FONT("m<0") - } -#endif - } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items - - while (mm >= 0) { - if (++m >= nComponents) { - m = 0; - } - - componentStack[m] = stack[mm--]; - } - } - - if (!(flags & lsfDontAdvance)) { - // should handle reverse too! - currGlyph += 1; - } - - return newState; -} - -void LigatureSubstitutionProcessor::endStateTable() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstProc.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __LIGATURESUBSTITUTIONPROCESSOR_H -#define __LIGATURESUBSTITUTIONPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "LigatureSubstitution.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -#define nComponents 16 - -class LigatureSubstitutionProcessor : public StateTableProcessor -{ -public: - virtual void beginStateTable(); - - virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success); - - virtual void endStateTable(); - - LigatureSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - virtual ~LigatureSubstitutionProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - LigatureSubstitutionProcessor(); - -protected: - ByteOffset ligatureActionTableOffset; - ByteOffset componentTableOffset; - ByteOffset ligatureTableOffset; - - LEReferenceToArrayOf<LigatureSubstitutionStateEntry> entryTable; - - le_int32 componentStack[nComponents]; - le_int16 m; - - LEReferenceTo<LigatureSubstitutionHeader> ligatureSubstitutionHeader; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstProc2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp and Others. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "LigatureSubstProc2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -#define ExtendedComplement(m) ((le_int32) (~((le_uint32) (m)))) -#define SignBit(m) ((ExtendedComplement(m) >> 1) & (le_int32)(m)) -#define SignExtend(v,m) (((v) & SignBit(m))? ((v) | ExtendedComplement(m)): (v)) - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(LigatureSubstitutionProcessor2) - -LigatureSubstitutionProcessor2::LigatureSubstitutionProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : StateTableProcessor2(morphSubtableHeader, success), - ligActionOffset(0), - ligatureSubstitutionHeader(morphSubtableHeader, success), componentOffset(0), ligatureOffset(0), entryTable() -{ - if (LE_FAILURE(success)) return; - - ligActionOffset = SWAPL(ligatureSubstitutionHeader->ligActionOffset); - componentOffset = SWAPL(ligatureSubstitutionHeader->componentOffset); - ligatureOffset = SWAPL(ligatureSubstitutionHeader->ligatureOffset); - - entryTable = LEReferenceToArrayOf<LigatureSubstitutionStateEntry2>(stHeader, success, entryTableOffset, LE_UNBOUNDED_ARRAY); -} - -LigatureSubstitutionProcessor2::~LigatureSubstitutionProcessor2() -{ -} - -void LigatureSubstitutionProcessor2::beginStateTable() -{ - m = -1; -} - -le_uint16 LigatureSubstitutionProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex2 index, LEErrorCode &success) -{ - const LigatureSubstitutionStateEntry2 *entry = entryTable.getAlias(index, success); - if(LE_FAILURE(success)) return 0; - - le_uint16 nextStateIndex = SWAPW(entry->nextStateIndex); - le_uint16 flags = SWAPW(entry->entryFlags); - le_uint16 ligActionIndex = SWAPW(entry->ligActionIndex); - - if (flags & lsfSetComponent) { - if (++m >= nComponents) { - m = 0; - } - componentStack[m] = currGlyph; - } else if ( m == -1) { - // bad font- skip this glyph. - //LE_DEBUG_BAD_FONT("m==-1 (componentCount went negative)") - currGlyph+= dir; - return nextStateIndex; - } - - ByteOffset actionOffset = flags & lsfPerformAction; - - if (actionOffset != 0) { - LEReferenceTo<LigatureActionEntry> ap(stHeader, success, ligActionOffset); // byte offset - if (LE_FAILURE(success)) { - currGlyph+= dir; - return nextStateIndex; - } - ap.addObject(ligActionIndex, success); - LEReferenceToArrayOf<TTGlyphID> ligatureTable(stHeader, success, ligatureOffset, LE_UNBOUNDED_ARRAY); - LigatureActionEntry action; - le_int32 offset, i = 0, j = 0; - le_int32 stack[nComponents]; - le_int16 mm = -1; - - LEReferenceToArrayOf<le_uint16> componentTable(stHeader, success, componentOffset, LE_UNBOUNDED_ARRAY); - if(LE_FAILURE(success)) { - currGlyph+= dir; - return nextStateIndex; // get out! bad font - } - - do { - le_uint32 componentGlyph = componentStack[m--]; // pop off - - if (j++ > 0) { - ap.addObject(success); - } - if (LE_FAILURE(success)) { - currGlyph+= dir; - return nextStateIndex; - } - - action = SWAPL(*ap.getAlias()); - - if (m < 0) { - m = nComponents - 1; - } - - offset = action & lafComponentOffsetMask; - if (offset != 0) { - if(componentGlyph >= glyphStorage.getGlyphCount()) { - LE_DEBUG_BAD_FONT("preposterous componentGlyph"); - currGlyph+= dir; - return nextStateIndex; // get out! bad font - } - i += SWAPW(componentTable(LE_GET_GLYPH(glyphStorage[componentGlyph]) + (SignExtend(offset, lafComponentOffsetMask)),success)); - if (LE_FAILURE(success)) { - currGlyph+= dir; - return nextStateIndex; - } - - if (action & (lafLast | lafStore)) { - TTGlyphID ligatureGlyph = SWAPW(ligatureTable(i,success)); - if (LE_FAILURE(success)) { - currGlyph+= dir; - return nextStateIndex; - } - glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], ligatureGlyph); - if(mm==nComponents) { - LE_DEBUG_BAD_FONT("exceeded nComponents"); - mm--; // don't overrun the stack. - } - stack[++mm] = componentGlyph; - i = 0; - } else { - glyphStorage[componentGlyph] = LE_SET_GLYPH(glyphStorage[componentGlyph], 0xFFFF); - } - } -#if LE_ASSERT_BAD_FONT - if(m<0) { - LE_DEBUG_BAD_FONT("m<0") - } -#endif - } while (LE_SUCCESS(success) && !(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items - - while (mm >= 0) { - if (++m >= nComponents) { - m = 0; - } - - componentStack[m] = stack[mm--]; - } - } - - if (!(flags & lsfDontAdvance)) { - currGlyph += dir; - } - - return nextStateIndex; -} - -void LigatureSubstitutionProcessor2::endStateTable() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstProc2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __LIGATURESUBSTITUTIONPROCESSOR2_H -#define __LIGATURESUBSTITUTIONPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "LigatureSubstitution.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -#define nComponents 16 - -class LigatureSubstitutionProcessor2 : public StateTableProcessor2 -{ -public: - virtual void beginStateTable(); - - virtual le_uint16 processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, - EntryTableIndex2 index, LEErrorCode &success); - - virtual void endStateTable(); - - LigatureSubstitutionProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - virtual ~LigatureSubstitutionProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - LigatureSubstitutionProcessor2(); - -protected: - le_uint32 ligActionOffset; - le_uint32 componentOffset; - le_uint32 ligatureOffset; - - LEReferenceToArrayOf<LigatureSubstitutionStateEntry2> entryTable; - - le_int32 componentStack[nComponents]; - le_int16 m; - - const LEReferenceTo<LigatureSubstitutionHeader2> ligatureSubstitutionHeader; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2006 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "LigatureSubstSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 LigatureSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const -{ - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - - if (LE_FAILURE(success)) { - return 0; - } - - LEReferenceToArrayOf<Offset> ligSetTableOffsetArrayRef(base, success, ligSetTableOffsetArray, SWAPW(ligSetCount)); - - if (coverageIndex >= 0 && LE_SUCCESS(success) && (le_uint32)coverageIndex < ligSetTableOffsetArrayRef.getCount()) { - Offset ligSetTableOffset = SWAPW(ligSetTableOffsetArray[coverageIndex]); - LEReferenceTo<LigatureSetTable> ligSetTable(base, success, ligSetTableOffset); - - if( LE_FAILURE(success) ) { return 0; } - le_uint16 ligCount = SWAPW(ligSetTable->ligatureCount); - - LEReferenceToArrayOf<Offset> ligatureTableOffsetArray(base, success, ligSetTable->ligatureTableOffsetArray, ligCount); - for (le_uint16 lig = 0; LE_SUCCESS(success) && lig < ligCount; lig += 1) { - Offset ligTableOffset = SWAPW(ligSetTable->ligatureTableOffsetArray[lig]); - LEReferenceTo<LigatureTable> ligTable(ligSetTable, success, ligTableOffset); - if(LE_FAILURE(success)) { return 0; } - le_uint16 compCount = SWAPW(ligTable->compCount) - 1; - LEReferenceToArrayOf<TTGlyphID> - componentArrayRef(base, success, ligTable->componentArray, compCount); - if (LE_FAILURE(success)) { return 0; } - le_int32 startPosition = glyphIterator->getCurrStreamPosition(); - TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph); - le_uint16 comp; - - for (comp = 0; comp < compCount; comp += 1) { - if (! glyphIterator->next()) { - break; - } - - if (LE_GET_GLYPH(glyphIterator->getCurrGlyphID()) != SWAPW(ligTable->componentArray[comp])) { - break; - } - } - - if (comp == compCount && (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, ligGlyph), success))) { - GlyphIterator tempIterator(*glyphIterator); - TTGlyphID deletedGlyph = tempIterator.ignoresMarks()? 0xFFFE : 0xFFFF; - - while (comp > 0) { - tempIterator.setCurrGlyphID(deletedGlyph); - tempIterator.prev(); - - comp -= 1; - } - - tempIterator.setCurrGlyphID(ligGlyph); - - return compCount + 1; - } - - glyphIterator->setCurrStreamPosition(startPosition); - } - - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __LIGATURESUBSTITUTIONSUBTABLES_H -#define __LIGATURESUBSTITUTIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct LigatureSetTable -{ - le_uint16 ligatureCount; - Offset ligatureTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureSetTable, ligatureTableOffsetArray) - -struct LigatureTable -{ - TTGlyphID ligGlyph; - le_uint16 compCount; - TTGlyphID componentArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureTable, componentArray) - -struct LigatureSubstitutionSubtable : GlyphSubstitutionSubtable -{ - le_uint16 ligSetCount; - Offset ligSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; -}; -LE_VAR_ARRAY(LigatureSubstitutionSubtable, ligSetTableOffsetArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstitution.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __LIGATURESUBSTITUTION_H -#define __LIGATURESUBSTITUTION_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "StateTables.h" -#include "MorphTables.h" -#include "MorphStateTables.h" - -U_NAMESPACE_BEGIN - -struct LigatureSubstitutionHeader : MorphStateTableHeader -{ - ByteOffset ligatureActionTableOffset; - ByteOffset componentTableOffset; - ByteOffset ligatureTableOffset; -}; - -struct LigatureSubstitutionHeader2 : MorphStateTableHeader2 -{ - le_uint32 ligActionOffset; - le_uint32 componentOffset; - le_uint32 ligatureOffset; -}; - -enum LigatureSubstitutionFlags -{ - lsfSetComponent = 0x8000, - lsfDontAdvance = 0x4000, - lsfActionOffsetMask = 0x3FFF, // N/A in morx - lsfPerformAction = 0x2000 -}; - -struct LigatureSubstitutionStateEntry : StateEntry -{ -}; - -struct LigatureSubstitutionStateEntry2 -{ - le_uint16 nextStateIndex; - le_uint16 entryFlags; - le_uint16 ligActionIndex; -}; - -typedef le_uint32 LigatureActionEntry; - -enum LigatureActionFlags -{ - lafLast = 0x80000000, - lafStore = 0x40000000, - lafComponentOffsetMask = 0x3FFFFFFF -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LookupProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,370 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeUtilities.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "ICUFeatures.h" -#include "Lookups.h" -#include "ScriptAndLanguage.h" -#include "GlyphDefinitionTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 LookupProcessor::applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_uint16 lookupType = SWAPW(lookupTable->lookupType); - le_uint16 subtableCount = SWAPW(lookupTable->subTableCount); - le_int32 startPosition = glyphIterator->getCurrStreamPosition(); - le_uint32 delta; - - for (le_uint16 subtable = 0; subtable < subtableCount; subtable += 1) { - LEReferenceTo<LookupSubtable> lookupSubtable = lookupTable->getLookupSubtable(lookupTable, subtable, success); - - delta = applySubtable(lookupSubtable, lookupType, glyphIterator, fontInstance, success); - if (delta > 0 && LE_FAILURE(success)) { -#if LE_TRACE - _LETRACE("Posn #%d, type %X, applied subtable #%d/%d - %s\n", startPosition, lookupType, subtable, subtableCount, u_errorName((UErrorCode)success)); -#endif - return 1; - } - - glyphIterator->setCurrStreamPosition(startPosition); - } - - return 1; -} - -le_int32 LookupProcessor::process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, - le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, - const LEFontInstance *fontInstance, LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - if (lookupSelectArray == NULL) { - return glyphCount; - } - - GlyphIterator glyphIterator(glyphStorage, glyphPositionAdjustments, - rightToLeft, 0, 0, glyphDefinitionTableHeader, success); - le_int32 newGlyphCount = glyphCount; - - for (le_uint16 order = 0; order < lookupOrderCount && LE_SUCCESS(success); order += 1) { - le_uint16 lookup = lookupOrderArray[order]; - FeatureMask selectMask = lookupSelectArray[lookup]; - - if (selectMask != 0) { - _LETRACE("Processing order#%d/%d", order, lookupOrderCount); - const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookup, success); - if (!lookupTable.isValid() ||LE_FAILURE(success) ) { - continue; - } - le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); - - glyphIterator.reset(lookupFlags, selectMask); - - while (glyphIterator.findFeatureTag()) { - applyLookupTable(lookupTable, &glyphIterator, fontInstance, success); - if (LE_FAILURE(success)) { -#if LE_TRACE - _LETRACE("Failure for lookup 0x%x - %s\n", lookup, u_errorName((UErrorCode)success)); -#endif - return 0; - } - } - - newGlyphCount = glyphIterator.applyInsertions(); - } - } - - return newGlyphCount; -} - -le_uint32 LookupProcessor::applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode& success) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - const LEReferenceTo<LookupTable> lookupTable = lookupListTable->getLookupTable(lookupListTable, lookupTableIndex, success); - if (!lookupTable.isValid()) { - success = LE_INTERNAL_ERROR; - return 0; - } - le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); - GlyphIterator tempIterator(*glyphIterator, lookupFlags); - le_uint32 delta = applyLookupTable(lookupTable, &tempIterator, fontInstance, success); - - return delta; -} - -le_int32 LookupProcessor::selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success) -{ - le_uint16 lookupCount = featureTable.isValid()? SWAPW(featureTable->lookupCount) : 0; - le_uint32 store = (le_uint32)order; - - LEReferenceToArrayOf<le_uint16> lookupListIndexArray(featureTable, success, featureTable->lookupListIndexArray, lookupCount); - - for (le_uint16 lookup = 0; LE_SUCCESS(success) && lookup < lookupCount; lookup += 1) { - le_uint16 lookupListIndex = SWAPW(lookupListIndexArray.getObject(lookup,success)); - if (lookupListIndex >= lookupSelectCount) { - continue; - } - if (store >= lookupOrderCount) { - continue; - } - - lookupSelectArray[lookupListIndex] |= featureMask; - lookupOrderArray[store++] = lookupListIndex; - } - - return store - order; -} - -LookupProcessor::LookupProcessor(const LETableReference &baseAddress, - Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, - LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures, - LEErrorCode& success) - : lookupListTable(), featureListTable(), lookupSelectArray(NULL), lookupSelectCount(0), - lookupOrderArray(NULL), lookupOrderCount(0), fReference(baseAddress) -{ - LEReferenceTo<ScriptListTable> scriptListTable; - LEReferenceTo<LangSysTable> langSysTable; - le_uint16 featureCount = 0; - le_uint16 lookupListCount = 0; - le_uint16 requiredFeatureIndex = 0xFFFF; - - if (LE_FAILURE(success)) { - return; - } - - if (scriptListOffset != 0) { - scriptListTable = LEReferenceTo<ScriptListTable>(baseAddress, success, scriptListOffset); - langSysTable = scriptListTable->findLanguage(scriptListTable, scriptTag, languageTag, success); - - if (langSysTable.isValid() && LE_SUCCESS(success)) { - featureCount = SWAPW(langSysTable->featureCount); - } - } - - if (featureListOffset != 0) { - featureListTable = LEReferenceTo<FeatureListTable>(baseAddress, success, featureListOffset); - } - - if (lookupListOffset != 0) { - lookupListTable = LEReferenceTo<LookupListTable>(baseAddress,success, lookupListOffset); - if(LE_SUCCESS(success) && lookupListTable.isValid()) { - lookupListCount = SWAPW(lookupListTable->lookupCount); - } - } - - if (langSysTable.isEmpty() || featureListTable.isEmpty() || lookupListTable.isEmpty() || - featureCount == 0 || lookupListCount == 0) { - return; - } - - if(langSysTable.isValid()) { - requiredFeatureIndex = SWAPW(langSysTable->reqFeatureIndex); - } - - lookupSelectArray = LE_NEW_ARRAY(FeatureMask, lookupListCount); - if (lookupSelectArray == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - - for (int i = 0; i < lookupListCount; i += 1) { - lookupSelectArray[i] = 0; - } - - lookupSelectCount = lookupListCount; - - le_int32 count, order = 0; - le_uint32 featureReferences = 0; - LEReferenceTo<FeatureTable> featureTable; - LETag featureTag; - - LEReferenceTo<FeatureTable> requiredFeatureTable; - LETag requiredFeatureTag = 0x00000000U; - - // Count the total number of lookups referenced by all features. This will - // be the maximum number of entries in the lookupOrderArray. We can't use - // lookupListCount because some lookups might be referenced by more than - // one feature. - if(featureListTable.isValid() && LE_SUCCESS(success)) { - LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); - - for (le_uint32 feature = 0; LE_SUCCESS(success)&&(feature < featureCount); feature += 1) { - le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature, success)); - - featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); - if (!featureTable.isValid() || LE_FAILURE(success)) { - continue; - } - featureReferences += SWAPW(featureTable->lookupCount); - } - } - - if (!featureTable.isValid() || LE_FAILURE(success)) { - success = LE_INTERNAL_ERROR; - return; - } - - if (requiredFeatureIndex != 0xFFFF) { - requiredFeatureTable = featureListTable->getFeatureTable(featureListTable, requiredFeatureIndex, &requiredFeatureTag, success); - if (LE_FAILURE(success)) return; - featureReferences += SWAPW(requiredFeatureTable->lookupCount); - } - - lookupOrderArray = LE_NEW_ARRAY(le_uint16, featureReferences); - if (lookupOrderArray == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - lookupOrderCount = featureReferences; - - for (le_int32 f = 0; f < featureMapCount; f += 1) { - FeatureMap fm = featureMap[f]; - count = 0; - - // If this is the required feature, add its lookups - if (requiredFeatureTag == fm.tag) { - count += selectLookups(requiredFeatureTable, fm.mask, order, success); - } - - if (orderFeatures) { - // If we added lookups from the required feature, sort them - if (count > 1) { - OpenTypeUtilities::sort(lookupOrderArray, order); - } - - for (le_uint16 feature = 0; feature < featureCount; feature += 1) { - LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); - if (LE_FAILURE(success)) { continue; } - le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success)); - - // don't add the required feature to the list more than once... - // TODO: Do we need this check? (Spec. says required feature won't be in feature list...) - if (featureIndex == requiredFeatureIndex) { - continue; - } - - featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); - if (LE_FAILURE(success)) continue; - if (featureTag == fm.tag) { - count += selectLookups(featureTable, fm.mask, order + count, success); - } - } - - if (count > 1) { - OpenTypeUtilities::sort(&lookupOrderArray[order], count); - } - - order += count; - } else if(langSysTable.isValid()) { - LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount); - for (le_uint16 feature = 0; LE_SUCCESS(success)&& (feature < featureCount); feature += 1) { - le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success)); - - // don't add the required feature to the list more than once... - // NOTE: This check is commented out because the spec. says that - // the required feature won't be in the feature list, and because - // any duplicate entries will be removed below. -#if 0 - if (featureIndex == requiredFeatureIndex) { - continue; - } -#endif - - featureTable = featureListTable->getFeatureTable(featureListTable, featureIndex, &featureTag, success); - if (LE_FAILURE(success)) continue; - if (featureTag == fm.tag) { - order += selectLookups(featureTable, fm.mask, order, success); - } - } - } - } - - if (!orderFeatures && (order > 1)) { - OpenTypeUtilities::sort(lookupOrderArray, order); - - // If there's no specified feature order, - // we will apply the lookups in the order - // that they're in the font. If a particular - // lookup may be referenced by more than one feature, - // it will apprear in the lookupOrderArray more than - // once, so remove any duplicate entries in the sorted array. - le_int32 out = 1; - - for (le_int32 in = 1; in < order; in += 1) { - if (lookupOrderArray[out - 1] != lookupOrderArray[in]) { - if (out != in) { - lookupOrderArray[out] = lookupOrderArray[in]; - } - - out += 1; - } - } - - order = out; - } - - lookupOrderCount = order; -} - -LookupProcessor::LookupProcessor() -{ - lookupOrderArray = NULL; - lookupSelectArray = NULL; -} - -LookupProcessor::~LookupProcessor() -{ - LE_DELETE_ARRAY(lookupOrderArray); - LE_DELETE_ARRAY(lookupSelectArray); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LookupProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved - * - */ - -#ifndef __LOOKUPPROCESSOR_H -#define __LOOKUPPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "LETableReference.h" -//#include "Lookups.h" -//#include "Features.h" - -U_NAMESPACE_BEGIN - -class LEFontInstance; -class LEGlyphStorage; -class GlyphIterator; -class GlyphPositionAdjustments; -struct FeatureTable; -struct FeatureListTable; -struct GlyphDefinitionTableHeader; -struct LookupSubtable; -struct LookupTable; - -class LookupProcessor : public UMemory { -public: - le_int32 process(LEGlyphStorage &glyphStorage, GlyphPositionAdjustments *glyphPositionAdjustments, - le_bool rightToLeft, const LEReferenceTo<GlyphDefinitionTableHeader> &glyphDefinitionTableHeader, const LEFontInstance *fontInstance, LEErrorCode& success) const; - - le_uint32 applyLookupTable(const LEReferenceTo<LookupTable> &lookupTable, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; - - le_uint32 applySingleLookup(le_uint16 lookupTableIndex, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const; - - virtual le_uint32 applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 subtableType, - GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode& success) const = 0; - - virtual ~LookupProcessor(); - - const LETableReference &getReference() const { return fReference; } - -protected: - LookupProcessor(const LETableReference &baseAddress, - Offset scriptListOffset, - Offset featureListOffset, - Offset lookupListOffset, - LETag scriptTag, - LETag languageTag, - const FeatureMap *featureMap, - le_int32 featureMapCount, - le_bool orderFeatures, - LEErrorCode& success); - - LookupProcessor(); - - le_int32 selectLookups(const LEReferenceTo<FeatureTable> &featureTable, FeatureMask featureMask, le_int32 order, LEErrorCode &success); - - LEReferenceTo<LookupListTable> lookupListTable; - LEReferenceTo<FeatureListTable> featureListTable; - - FeatureMask *lookupSelectArray; - le_uint32 lookupSelectCount; - - le_uint16 *lookupOrderArray; - le_uint32 lookupOrderCount; - - LETableReference fReference; - -private: - - LookupProcessor(const LookupProcessor &other); // forbid copying of this class - LookupProcessor &operator=(const LookupProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/LookupTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "LookupTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -/* - These are the rolled-up versions of the uniform binary search. - Someday, if we need more performance, we can un-roll them. - - Note: I put these in the base class, so they only have to - be written once. Since the base class doesn't define the - segment table, these routines assume that it's right after - the binary search header. - - Another way to do this is to put each of these routines in one - of the derived classes, and implement it in the others by casting - the "this" pointer to the type that has the implementation. -*/ -const LookupSegment *BinarySearchLookupTable::lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const -{ - - le_int16 unity = SWAPW(unitSize); - le_int16 probe = SWAPW(searchRange); - le_int16 extra = SWAPW(rangeShift); - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); - LEReferenceTo<LookupSegment> entry(base, success, segments); - LEReferenceTo<LookupSegment> trial(entry, success, extra); - - if(LE_FAILURE(success)) return NULL; - - if (SWAPW(trial->lastGlyph) <= ttGlyph) { - entry = trial; - } - - while (probe > unity && LE_SUCCESS(success)) { - probe >>= 1; - trial = entry; // copy - trial.addOffset(probe, success); - - if (SWAPW(trial->lastGlyph) <= ttGlyph) { - entry = trial; - } - } - - if (SWAPW(entry->firstGlyph) <= ttGlyph) { - return entry.getAlias(); - } - - return NULL; -} - -const LookupSingle *BinarySearchLookupTable::lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const -{ - le_int16 unity = SWAPW(unitSize); - le_int16 probe = SWAPW(searchRange); - le_int16 extra = SWAPW(rangeShift); - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph); - LEReferenceTo<LookupSingle> entry(base, success, entries); - LEReferenceTo<LookupSingle> trial(entry, success, extra); - - if (!LE_SUCCESS(success)) { - return NULL; - } - - if (SWAPW(trial->glyph) <= ttGlyph) { - entry = trial; - } - - while (probe > unity && LE_SUCCESS(success)) { - probe >>= 1; - trial = entry; - trial.addOffset(probe, success); - - if (SWAPW(trial->glyph) <= ttGlyph) { - entry = trial; - } - } - - if (SWAPW(entry->glyph) == ttGlyph) { - return entry.getAlias(); - } - - return NULL; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/LookupTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __LOOKUPTABLES_H -#define __LOOKUPTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "LETableReference.h" - -U_NAMESPACE_BEGIN - -enum LookupTableFormat -{ - ltfSimpleArray = 0, - ltfSegmentSingle = 2, - ltfSegmentArray = 4, - ltfSingleTable = 6, - ltfTrimmedArray = 8 -}; - -typedef le_int16 LookupValue; - -struct LookupTable -{ - le_int16 format; -}; - -struct LookupSegment -{ - TTGlyphID lastGlyph; - TTGlyphID firstGlyph; - LookupValue value; -}; - -struct LookupSingle -{ - TTGlyphID glyph; - LookupValue value; -}; - -struct BinarySearchLookupTable : LookupTable -{ - le_int16 unitSize; - le_int16 nUnits; - le_int16 searchRange; - le_int16 entrySelector; - le_int16 rangeShift; - - const LookupSegment *lookupSegment(const LETableReference &base, const LookupSegment *segments, LEGlyphID glyph, LEErrorCode &success) const; - - const LookupSingle *lookupSingle(const LETableReference &base, const LookupSingle *entries, LEGlyphID glyph, LEErrorCode &success) const; -}; - -struct SimpleArrayLookupTable : LookupTable -{ - LookupValue valueArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SimpleArrayLookupTable, valueArray) - -struct SegmentSingleLookupTable : BinarySearchLookupTable -{ - LookupSegment segments[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SegmentSingleLookupTable, segments) - -struct SegmentArrayLookupTable : BinarySearchLookupTable -{ - LookupSegment segments[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SegmentArrayLookupTable, segments) - -struct SingleTableLookupTable : BinarySearchLookupTable -{ - LookupSingle entries[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SingleTableLookupTable, entries) - -struct TrimmedArrayLookupTable : LookupTable -{ - TTGlyphID firstGlyph; - TTGlyphID glyphCount; - LookupValue valueArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(TrimmedArrayLookupTable, valueArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/Lookups.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "Lookups.h" -#include "CoverageTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -const LEReferenceTo<LookupTable> LookupListTable::getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const -{ - LEReferenceToArrayOf<Offset> lookupTableOffsetArrayRef(base, success, (const Offset*)&lookupTableOffsetArray, SWAPW(lookupCount)); - - if(LE_FAILURE(success) || lookupTableIndex>lookupTableOffsetArrayRef.getCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return LEReferenceTo<LookupTable>(); - } else { - return LEReferenceTo<LookupTable>(base, success, SWAPW(lookupTableOffsetArrayRef.getObject(lookupTableIndex, success))); - } -} - -const LEReferenceTo<LookupSubtable> LookupTable::getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const -{ - LEReferenceToArrayOf<Offset> subTableOffsetArrayRef(base, success, (const Offset*)&subTableOffsetArray, SWAPW(subTableCount)); - - if(LE_FAILURE(success) || subtableIndex>subTableOffsetArrayRef.getCount()) { - success = LE_INDEX_OUT_OF_BOUNDS_ERROR; - return LEReferenceTo<LookupSubtable>(); - } else { - return LEReferenceTo<LookupSubtable>(base, success, SWAPW(subTableOffsetArrayRef.getObject(subtableIndex, success))); - } -} - -le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const -{ - const LEReferenceTo<CoverageTable> coverageTable(base, success, SWAPW(tableOffset)); - - if(LE_FAILURE(success)) return 0; - - return coverageTable->getGlyphCoverage(coverageTable, glyphID, success); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/Lookups.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __LOOKUPS_H -#define __LOOKUPS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -enum LookupFlags -{ - lfBaselineIsLogicalEnd = 0x0001, // The MS spec. calls this flag "RightToLeft" but this name is more accurate - lfIgnoreBaseGlyphs = 0x0002, - lfIgnoreLigatures = 0x0004, - lfIgnoreMarks = 0x0008, - lfReservedMask = 0x00F0, - lfMarkAttachTypeMask = 0xFF00, - lfMarkAttachTypeShift = 8 -}; - -struct LookupSubtable -{ - le_uint16 subtableFormat; - Offset coverageTableOffset; - - inline le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const; - - le_int32 getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const; - - // convenience - inline le_int32 getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const; - - inline le_int32 getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const; -}; - -struct LookupTable -{ - le_uint16 lookupType; - le_uint16 lookupFlags; - le_uint16 subTableCount; - Offset subTableOffsetArray[ANY_NUMBER]; - - const LEReferenceTo<LookupSubtable> getLookupSubtable(const LEReferenceTo<LookupTable> &base, le_uint16 subtableIndex, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(LookupTable, subTableOffsetArray) - -struct LookupListTable -{ - le_uint16 lookupCount; - Offset lookupTableOffsetArray[ANY_NUMBER]; - - const LEReferenceTo<LookupTable> getLookupTable(const LEReferenceTo<LookupListTable> &base, le_uint16 lookupTableIndex, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(LookupListTable, lookupTableOffsetArray) - -inline le_int32 LookupSubtable::getGlyphCoverage(const LEReferenceTo<LookupSubtable> &base, LEGlyphID glyphID, LEErrorCode &success) const -{ - return getGlyphCoverage(base, coverageTableOffset, glyphID, success); -} - -inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, LEGlyphID glyphID, LEErrorCode &success) const { - LEReferenceTo<LookupSubtable> thisRef(base, success, this); - return getGlyphCoverage(thisRef, glyphID, success); -} - -inline le_int32 LookupSubtable::getGlyphCoverage(const LETableReference &base, Offset tableOffset, LEGlyphID glyphID, LEErrorCode &success) const { - LEReferenceTo<LookupSubtable> thisRef(base, success, this); - return getGlyphCoverage(thisRef, tableOffset, glyphID, success); -} - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/MPreFixups.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 2002-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphStorage.h" -#include "MPreFixups.h" - -U_NAMESPACE_BEGIN - -struct FixupData -{ - le_int32 fBaseIndex; - le_int32 fMPreIndex; -}; - -MPreFixups::MPreFixups(le_int32 charCount) - : fFixupData(NULL), fFixupCount(0) -{ - fFixupData = LE_NEW_ARRAY(FixupData, charCount); -} - -MPreFixups::~MPreFixups() -{ - LE_DELETE_ARRAY(fFixupData); - fFixupData = NULL; -} - -void MPreFixups::add(le_int32 baseIndex, le_int32 mpreIndex) -{ - // NOTE: don't add the fixup data if the mpre is right - // before the base consonant glyph. - if (baseIndex - mpreIndex > 1) { - fFixupData[fFixupCount].fBaseIndex = baseIndex; - fFixupData[fFixupCount].fMPreIndex = mpreIndex; - - fFixupCount += 1; - } -} - -void MPreFixups::apply(LEGlyphStorage &glyphStorage, LEErrorCode& success) -{ - if (LE_FAILURE(success)) { - return; - } - - for (le_int32 fixup = 0; fixup < fFixupCount; fixup += 1) { - le_int32 baseIndex = fFixupData[fixup].fBaseIndex; - le_int32 mpreIndex = fFixupData[fixup].fMPreIndex; - le_int32 mpreLimit = mpreIndex + 1; - - while (glyphStorage[baseIndex] == 0xFFFF || glyphStorage[baseIndex] == 0xFFFE) { - baseIndex -= 1; - } - - while (glyphStorage[mpreLimit] == 0xFFFF || glyphStorage[mpreLimit] == 0xFFFE) { - mpreLimit += 1; - } - - if (mpreLimit == baseIndex) { - continue; - } - - LEErrorCode success = LE_NO_ERROR; - le_int32 mpreCount = mpreLimit - mpreIndex; - le_int32 moveCount = baseIndex - mpreLimit; - le_int32 mpreDest = baseIndex - mpreCount; - LEGlyphID *mpreSave = LE_NEW_ARRAY(LEGlyphID, mpreCount); - le_int32 *indexSave = LE_NEW_ARRAY(le_int32, mpreCount); - - if (mpreSave == NULL || indexSave == NULL) { - LE_DELETE_ARRAY(mpreSave); - LE_DELETE_ARRAY(indexSave); - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - - le_int32 i; - - for (i = 0; i < mpreCount; i += 1) { - mpreSave[i] = glyphStorage[mpreIndex + i]; - indexSave[i] = glyphStorage.getCharIndex(mpreIndex + i, success); //charIndices[mpreIndex + i]; - } - - for (i = 0; i < moveCount; i += 1) { - LEGlyphID glyph = glyphStorage[mpreLimit + i]; - le_int32 charIndex = glyphStorage.getCharIndex(mpreLimit + i, success); - - glyphStorage[mpreIndex + i] = glyph; - glyphStorage.setCharIndex(mpreIndex + i, charIndex, success); - } - - for (i = 0; i < mpreCount; i += 1) { - glyphStorage[mpreDest + i] = mpreSave[i]; - glyphStorage.setCharIndex(mpreDest, indexSave[i], success); - } - - LE_DELETE_ARRAY(indexSave); - LE_DELETE_ARRAY(mpreSave); - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MPreFixups.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 2002-2008 - All Rights Reserved - * - */ - -#ifndef __MPREFIXUPS_H -#define __MPREFIXUPS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -// Might want to make this a private member... -struct FixupData; - -class MPreFixups : public UMemory -{ -public: - MPreFixups(le_int32 charCount); - ~MPreFixups(); - - void add(le_int32 baseIndex, le_int32 mpreIndex); - - void apply(LEGlyphStorage &glyphStorage, LEErrorCode& success); - -private: - FixupData *fFixupData; - le_int32 fFixupCount; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkArrays.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "AnchorTables.h" -#include "MarkArrays.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_int32 MarkArray::getMarkClass(const LETableReference &base, LEGlyphID glyphID, - le_int32 coverageIndex, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const -{ - le_int32 markClass = -1; - - if ( coverageIndex >= 0 && LE_SUCCESS(success) ) { - le_uint16 mCount = SWAPW(markCount); - if (coverageIndex < mCount) { - LEReferenceToArrayOf<MarkRecord> markRecordArrayRef(base, success, markRecordArray, mCount); - if(LE_FAILURE(success)) { - return markClass; - } - const MarkRecord *markRecord = &markRecordArray[coverageIndex]; - Offset anchorTableOffset = SWAPW(markRecord->markAnchorTableOffset); - LEReferenceTo<AnchorTable> anchorTable(base, success, anchorTableOffset); - - if(LE_FAILURE(success)) { - return markClass; - } - - anchorTable->getAnchor(anchorTable, glyphID, fontInstance, anchor, success); - markClass = SWAPW(markRecord->markClass); - } - - // XXXX If we get here, the table is mal-formed - } - - return markClass; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkArrays.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __MARKARRAYS_H -#define __MARKARRAYS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -struct MarkRecord -{ - le_uint16 markClass; - Offset markAnchorTableOffset; -}; - -struct MarkArray -{ - le_uint16 markCount; - MarkRecord markRecordArray[ANY_NUMBER]; - - le_int32 getMarkClass(const LETableReference &base, LEGlyphID glyphID, - le_int32 coverageIndex, const LEFontInstance *fontInstance, - LEPoint &anchor, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(MarkArray, markRecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToBasePosnSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "AnchorTables.h" -#include "MarkArrays.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "MarkToBasePosnSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -LEGlyphID MarkToBasePositioningSubtable::findBaseGlyph(GlyphIterator *glyphIterator) const -{ - if (glyphIterator->prev()) { - return glyphIterator->getCurrGlyphID(); - } - - return 0xFFFF; -} - -le_int32 MarkToBasePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); - le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (markCoverage < 0) { - // markGlyph isn't a covered mark glyph - return 0; - } - - LEPoint markAnchor; - LEReferenceTo<MarkArray> markArray(base, success, (const MarkArray *) ((char *) this + SWAPW(markArrayOffset))); - if(LE_FAILURE(success)) return 0; - le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success); - le_uint16 mcCount = SWAPW(classCount); - - if (markClass < 0 || markClass >= mcCount || LE_FAILURE(success)) { - // markGlyph isn't in the mark array or its - // mark class is too big. The table is mal-formed! - return 0; - } - - // FIXME: We probably don't want to find a base glyph before a previous ligature... - GlyphIterator baseIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreLigatures*/)); - LEGlyphID baseGlyph = findBaseGlyph(&baseIterator); - le_int32 baseCoverage = getBaseCoverage(base, (LEGlyphID) baseGlyph, success); - LEReferenceTo<BaseArray> baseArray(base, success, (const BaseArray *) ((char *) this + SWAPW(baseArrayOffset))); - if(LE_FAILURE(success)) return 0; - le_uint16 baseCount = SWAPW(baseArray->baseRecordCount); - - if (baseCoverage < 0 || baseCoverage >= baseCount) { - // The base glyph isn't covered, or the coverage - // index is too big. The latter means that the - // table is mal-formed... - return 0; - } - LEReferenceTo<BaseRecord> baseRecord(base, success, &baseArray->baseRecordArray[baseCoverage * mcCount]); - if( LE_FAILURE(success) ) { return 0; } - LEReferenceToArrayOf<Offset> baseAnchorTableOffsetArray(base, success, &(baseRecord->baseAnchorTableOffsetArray[0]), mcCount); - - if( LE_FAILURE(success) ) { return 0; } - Offset anchorTableOffset = SWAPW(baseRecord->baseAnchorTableOffsetArray[markClass]); - LEReferenceTo<AnchorTable> anchorTable(baseArray, success, anchorTableOffset); - if( LE_FAILURE(success) ) { return 0; } - - LEPoint baseAnchor, markAdvance, pixels; - - - anchorTable->getAnchor(anchorTable, baseGlyph, fontInstance, baseAnchor, success); - - fontInstance->getGlyphAdvance(markGlyph, pixels); - fontInstance->pixelsToUnits(pixels, markAdvance); - - float anchorDiffX = baseAnchor.fX - markAnchor.fX; - float anchorDiffY = baseAnchor.fY - markAnchor.fY; - - _LETRACE("Offset: (%.2f, %.2f) glyph 0x%X", anchorDiffX, anchorDiffY, markGlyph); - - glyphIterator->setCurrGlyphBaseOffset(baseIterator.getCurrStreamPosition()); - - if (glyphIterator->isRightToLeft()) { - // FIXME: need similar patch to below; also in MarkToLigature and MarkToMark - // (is there a better way to approach this for all the cases?) - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); - } else { - LEPoint baseAdvance; - - fontInstance->getGlyphAdvance(baseGlyph, pixels); - - //JK: adjustment needs to account for non-zero advance of any marks between base glyph and current mark - GlyphIterator gi(baseIterator, (le_uint16)0); // copy of baseIterator that won't ignore marks - gi.next(); // point beyond the base glyph - while (gi.getCurrStreamPosition() < glyphIterator->getCurrStreamPosition()) { // for all intervening glyphs (marks)... - LEGlyphID otherMark = gi.getCurrGlyphID(); - LEPoint px; - fontInstance->getGlyphAdvance(otherMark, px); // get advance, in case it's non-zero - pixels.fX += px.fX; // and add that to the base glyph's advance - pixels.fY += px.fY; - gi.next(); - } - // end of JK patch - fontInstance->pixelsToUnits(pixels, baseAdvance); - - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - baseAdvance.fX, anchorDiffY - baseAdvance.fY, -markAdvance.fX, -markAdvance.fY); - } - - return 1; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToBasePosnSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __MARKTOBASEPOSITIONINGSUBTABLES_H -#define __MARKTOBASEPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct MarkToBasePositioningSubtable : AttachmentPositioningSubtable -{ - le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; - LEGlyphID findBaseGlyph(GlyphIterator *glyphIterator) const; -}; - -struct BaseRecord -{ - Offset baseAnchorTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(BaseRecord, baseAnchorTableOffsetArray) - -struct BaseArray -{ - le_int16 baseRecordCount; - BaseRecord baseRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(BaseArray, baseRecordArray) - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToLigaturePosnSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "AnchorTables.h" -#include "MarkArrays.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "MarkToLigaturePosnSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -LEGlyphID MarkToLigaturePositioningSubtable::findLigatureGlyph(GlyphIterator *glyphIterator) const -{ - if (glyphIterator->prev()) { - return glyphIterator->getCurrGlyphID(); - } - - return 0xFFFF; -} - -le_int32 MarkToLigaturePositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); - le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (markCoverage < 0) { - // markGlyph isn't a covered mark glyph - return 0; - } - - LEPoint markAnchor; - LEReferenceTo<MarkArray> markArray(base, success, SWAPW(markArrayOffset)); - if( LE_FAILURE(success) ) { - return 0; - } - le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success); - le_uint16 mcCount = SWAPW(classCount); - - if (markClass < 0 || markClass >= mcCount) { - // markGlyph isn't in the mark array or its - // mark class is too big. The table is mal-formed! - return 0; - } - - // FIXME: we probably don't want to find a ligature before a previous base glyph... - GlyphIterator ligatureIterator(*glyphIterator, (le_uint16) (lfIgnoreMarks /*| lfIgnoreBaseGlyphs*/)); - LEGlyphID ligatureGlyph = findLigatureGlyph(&ligatureIterator); - le_int32 ligatureCoverage = getBaseCoverage(base, (LEGlyphID) ligatureGlyph, success); - LEReferenceTo<LigatureArray> ligatureArray(base, success, SWAPW(baseArrayOffset)); - if (LE_FAILURE(success)) { return 0; } - le_uint16 ligatureCount = SWAPW(ligatureArray->ligatureCount); - - if (ligatureCoverage < 0 || ligatureCoverage >= ligatureCount) { - // The ligature glyph isn't covered, or the coverage - // index is too big. The latter means that the - // table is mal-formed... - return 0; - } - - le_int32 markPosition = glyphIterator->getCurrStreamPosition(); - Offset ligatureAttachOffset = SWAPW(ligatureArray->ligatureAttachTableOffsetArray[ligatureCoverage]); - LEReferenceTo<LigatureAttachTable> ligatureAttachTable(ligatureArray, success, ligatureAttachOffset); - if (LE_FAILURE(success)) { return 0; } - le_int32 componentCount = SWAPW(ligatureAttachTable->componentCount); - le_int32 component = ligatureIterator.getMarkComponent(markPosition); - - if (component >= componentCount) { - // should really just bail at this point... - component = componentCount - 1; - } - - LEReferenceTo<ComponentRecord> componentRecord(base, success, &ligatureAttachTable->componentRecordArray[component * mcCount]); - if (LE_FAILURE(success)) { return 0; } - LEReferenceToArrayOf<Offset> ligatureAnchorTableOffsetArray(base, success, &(componentRecord->ligatureAnchorTableOffsetArray[0]), mcCount); - if( LE_FAILURE(success) ) { return 0; } - Offset anchorTableOffset = SWAPW(componentRecord->ligatureAnchorTableOffsetArray[markClass]); - LEReferenceTo<AnchorTable> anchorTable(ligatureAttachTable, success, anchorTableOffset); - if (LE_FAILURE(success)) { return 0; } - LEPoint ligatureAnchor, markAdvance, pixels; - - anchorTable->getAnchor(anchorTable, ligatureGlyph, fontInstance, ligatureAnchor, success); - - fontInstance->getGlyphAdvance(markGlyph, pixels); - fontInstance->pixelsToUnits(pixels, markAdvance); - - float anchorDiffX = ligatureAnchor.fX - markAnchor.fX; - float anchorDiffY = ligatureAnchor.fY - markAnchor.fY; - - glyphIterator->setCurrGlyphBaseOffset(ligatureIterator.getCurrStreamPosition()); - - if (glyphIterator->isRightToLeft()) { - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); - } else { - LEPoint ligatureAdvance; - - fontInstance->getGlyphAdvance(ligatureGlyph, pixels); - fontInstance->pixelsToUnits(pixels, ligatureAdvance); - - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - ligatureAdvance.fX, anchorDiffY - ligatureAdvance.fY, -markAdvance.fX, -markAdvance.fY); - } - - return 1; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToLigaturePosnSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __MARKTOLIGATUREPOSITIONINGSUBTABLES_H -#define __MARKTOLIGATUREPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct MarkToLigaturePositioningSubtable : AttachmentPositioningSubtable -{ - le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; - LEGlyphID findLigatureGlyph(GlyphIterator *glyphIterator) const; -}; - -struct ComponentRecord -{ - Offset ligatureAnchorTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ComponentRecord, ligatureAnchorTableOffsetArray) - -struct LigatureAttachTable -{ - le_uint16 componentCount; - ComponentRecord componentRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureAttachTable, componentRecordArray) - -struct LigatureArray -{ - le_uint16 ligatureCount; - Offset ligatureAttachTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LigatureArray, ligatureAttachTableOffsetArray) - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToMarkPosnSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "AnchorTables.h" -#include "MarkArrays.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "MarkToMarkPosnSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -LEGlyphID MarkToMarkPositioningSubtable::findMark2Glyph(GlyphIterator *glyphIterator) const -{ - if (glyphIterator->findMark2Glyph()) { - return glyphIterator->getCurrGlyphID(); - } - - return 0xFFFF; -} - -le_int32 MarkToMarkPositioningSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID markGlyph = glyphIterator->getCurrGlyphID(); - le_int32 markCoverage = getGlyphCoverage(base, (LEGlyphID) markGlyph, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (markCoverage < 0) { - // markGlyph isn't a covered mark glyph - return 0; - } - - LEPoint markAnchor; - LEReferenceTo<MarkArray> markArray(base, success, SWAPW(markArrayOffset)); - if(LE_FAILURE(success)) { - return 0; - } - le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success); - le_uint16 mcCount = SWAPW(classCount); - - if (markClass < 0 || markClass >= mcCount) { - // markGlyph isn't in the mark array or its - // mark class is too big. The table is mal-formed! - return 0; - } - - GlyphIterator mark2Iterator(*glyphIterator); - LEGlyphID mark2Glyph = findMark2Glyph(&mark2Iterator); - le_int32 mark2Coverage = getBaseCoverage(base, (LEGlyphID) mark2Glyph, success); - LEReferenceTo<Mark2Array> mark2Array(base, success, (const Mark2Array *) ((char *) this + SWAPW(baseArrayOffset))); - if(LE_FAILURE(success)) return 0; - le_uint16 mark2Count = SWAPW(mark2Array->mark2RecordCount); - - if (mark2Coverage < 0 || mark2Coverage >= mark2Count) { - // The mark2 glyph isn't covered, or the coverage - // index is too big. The latter means that the - // table is mal-formed... - return 0; - } - - LEReferenceTo<Mark2Record> mark2Record(base, success, &mark2Array->mark2RecordArray[mark2Coverage * mcCount]); - if(LE_FAILURE(success)) return 0; - Offset anchorTableOffset = SWAPW(mark2Record->mark2AnchorTableOffsetArray[markClass]); - LEReferenceTo<AnchorTable> anchorTable(mark2Array, success, anchorTableOffset); - if(LE_FAILURE(success)) return 0; - LEPoint mark2Anchor, markAdvance, pixels; - - if (anchorTableOffset == 0) { - // this seems to mean that the marks don't attach... - return 0; - } - - anchorTable->getAnchor(anchorTable, mark2Glyph, fontInstance, mark2Anchor, success); - - fontInstance->getGlyphAdvance(markGlyph, pixels); - fontInstance->pixelsToUnits(pixels, markAdvance); - - float anchorDiffX = mark2Anchor.fX - markAnchor.fX; - float anchorDiffY = mark2Anchor.fY - markAnchor.fY; - - _LETRACE("Offset: (%.2f, %.2f) glyph 0x%X mark2 0x%X", anchorDiffX, anchorDiffY, markGlyph, mark2Glyph); - - glyphIterator->setCurrGlyphBaseOffset(mark2Iterator.getCurrStreamPosition()); - - if (glyphIterator->isRightToLeft()) { - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX, anchorDiffY, -markAdvance.fX, -markAdvance.fY); - } else { - LEPoint mark2Advance; - - fontInstance->getGlyphAdvance(mark2Glyph, pixels); - fontInstance->pixelsToUnits(pixels, mark2Advance); - - glyphIterator->setCurrGlyphPositionAdjustment(anchorDiffX - mark2Advance.fX, anchorDiffY - mark2Advance.fY, -markAdvance.fX, -markAdvance.fY); - } - - return 1; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MarkToMarkPosnSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __MARKTOMARKPOSITIONINGSUBTABLES_H -#define __MARKTOMARKPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "AttachmentPosnSubtables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct MarkToMarkPositioningSubtable : AttachmentPositioningSubtable -{ - le_int32 process(const LETableReference &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; - LEGlyphID findMark2Glyph(GlyphIterator *glyphIterator) const; -}; - -struct Mark2Record -{ - Offset mark2AnchorTableOffsetArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(Mark2Record, mark2AnchorTableOffsetArray) - -struct Mark2Array -{ - le_uint16 mark2RecordCount; - Mark2Record mark2RecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(Mark2Array, mark2RecordArray) - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/MirroredCharData.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 07/20/2005 10:43:59 AM PDT - */ - -#include "LETypes.h" -#include "DefaultCharMapper.h" - -U_NAMESPACE_BEGIN - -const LEUnicode32 DefaultCharMapper::mirroredChars[] = { - 0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D, - 0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E, - 0x208D, 0x208E, 0x2208, 0x2209, 0x220A, 0x220B, 0x220C, 0x220D, - 0x2215, 0x223C, 0x223D, 0x2243, 0x2252, 0x2253, 0x2254, 0x2255, - 0x2264, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226A, 0x226B, - 0x226E, 0x226F, 0x2270, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, - 0x2276, 0x2277, 0x2278, 0x2279, 0x227A, 0x227B, 0x227C, 0x227D, - 0x227E, 0x227F, 0x2280, 0x2281, 0x2282, 0x2283, 0x2284, 0x2285, - 0x2286, 0x2287, 0x2288, 0x2289, 0x228A, 0x228B, 0x228F, 0x2290, - 0x2291, 0x2292, 0x2298, 0x22A2, 0x22A3, 0x22A6, 0x22A8, 0x22A9, - 0x22AB, 0x22B0, 0x22B1, 0x22B2, 0x22B3, 0x22B4, 0x22B5, 0x22B6, - 0x22B7, 0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22CD, 0x22D0, 0x22D1, - 0x22D6, 0x22D7, 0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC, 0x22DD, - 0x22DE, 0x22DF, 0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5, - 0x22E6, 0x22E7, 0x22E8, 0x22E9, 0x22EA, 0x22EB, 0x22EC, 0x22ED, - 0x22F0, 0x22F1, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x22FA, - 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x2308, 0x2309, 0x230A, 0x230B, - 0x2329, 0x232A, 0x2768, 0x2769, 0x276A, 0x276B, 0x276C, 0x276D, - 0x276E, 0x276F, 0x2770, 0x2771, 0x2772, 0x2773, 0x2774, 0x2775, - 0x27C3, 0x27C4, 0x27C5, 0x27C6, 0x27D5, 0x27D6, 0x27DD, 0x27DE, - 0x27E2, 0x27E3, 0x27E4, 0x27E5, 0x27E6, 0x27E7, 0x27E8, 0x27E9, - 0x27EA, 0x27EB, 0x2983, 0x2984, 0x2985, 0x2986, 0x2987, 0x2988, - 0x2989, 0x298A, 0x298B, 0x298C, 0x298D, 0x298E, 0x298F, 0x2990, - 0x2991, 0x2992, 0x2993, 0x2994, 0x2995, 0x2996, 0x2997, 0x2998, - 0x29B8, 0x29C0, 0x29C1, 0x29C4, 0x29C5, 0x29CF, 0x29D0, 0x29D1, - 0x29D2, 0x29D4, 0x29D5, 0x29D8, 0x29D9, 0x29DA, 0x29DB, 0x29F5, - 0x29F8, 0x29F9, 0x29FC, 0x29FD, 0x2A2B, 0x2A2C, 0x2A2D, 0x2A2E, - 0x2A34, 0x2A35, 0x2A3C, 0x2A3D, 0x2A64, 0x2A65, 0x2A79, 0x2A7A, - 0x2A7D, 0x2A7E, 0x2A7F, 0x2A80, 0x2A81, 0x2A82, 0x2A83, 0x2A84, - 0x2A8B, 0x2A8C, 0x2A91, 0x2A92, 0x2A93, 0x2A94, 0x2A95, 0x2A96, - 0x2A97, 0x2A98, 0x2A99, 0x2A9A, 0x2A9B, 0x2A9C, 0x2AA1, 0x2AA2, - 0x2AA6, 0x2AA7, 0x2AA8, 0x2AA9, 0x2AAA, 0x2AAB, 0x2AAC, 0x2AAD, - 0x2AAF, 0x2AB0, 0x2AB3, 0x2AB4, 0x2ABB, 0x2ABC, 0x2ABD, 0x2ABE, - 0x2ABF, 0x2AC0, 0x2AC1, 0x2AC2, 0x2AC3, 0x2AC4, 0x2AC5, 0x2AC6, - 0x2ACD, 0x2ACE, 0x2ACF, 0x2AD0, 0x2AD1, 0x2AD2, 0x2AD3, 0x2AD4, - 0x2AD5, 0x2AD6, 0x2ADE, 0x2AE3, 0x2AE4, 0x2AE5, 0x2AEC, 0x2AED, - 0x2AF7, 0x2AF8, 0x2AF9, 0x2AFA, 0x2E02, 0x2E03, 0x2E04, 0x2E05, - 0x2E09, 0x2E0A, 0x2E0C, 0x2E0D, 0x2E1C, 0x2E1D, 0x3008, 0x3009, - 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, - 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x301A, 0x301B, - 0xFF08, 0xFF09, 0xFF1C, 0xFF1E, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, - 0xFF5F, 0xFF60, 0xFF62, 0xFF63 -}; - -const LEUnicode32 DefaultCharMapper::srahCderorrim[] = { - 0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, - 0x00BB, 0x00AB, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, - 0x208E, 0x208D, 0x220B, 0x220C, 0x220D, 0x2208, 0x2209, 0x220A, - 0x29F5, 0x223D, 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, - 0x2265, 0x2264, 0x2267, 0x2266, 0x2269, 0x2268, 0x226B, 0x226A, - 0x226F, 0x226E, 0x2271, 0x2270, 0x2273, 0x2272, 0x2275, 0x2274, - 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, 0x227A, 0x227D, 0x227C, - 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, 0x2285, 0x2284, - 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A, 0x2290, 0x228F, - 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, - 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5, 0x22B4, 0x22B7, - 0x22B6, 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, - 0x22D7, 0x22D6, 0x22D9, 0x22D8, 0x22DB, 0x22DA, 0x22DD, 0x22DC, - 0x22DF, 0x22DE, 0x22E1, 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, - 0x22E7, 0x22E6, 0x22E9, 0x22E8, 0x22EB, 0x22EA, 0x22ED, 0x22EC, - 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22F2, - 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308, 0x230B, 0x230A, - 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, 0x276C, - 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772, 0x2775, 0x2774, - 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27D6, 0x27D5, 0x27DE, 0x27DD, - 0x27E3, 0x27E2, 0x27E5, 0x27E4, 0x27E7, 0x27E6, 0x27E9, 0x27E8, - 0x27EB, 0x27EA, 0x2984, 0x2983, 0x2986, 0x2985, 0x2988, 0x2987, - 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, 0x298E, 0x298D, - 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, 0x2997, - 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, - 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215, - 0x29F9, 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, - 0x2A35, 0x2A34, 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79, - 0x2A7E, 0x2A7D, 0x2A80, 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, - 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, 0x2A94, 0x2A93, 0x2A96, 0x2A95, - 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, 0x2A9B, 0x2AA2, 0x2AA1, - 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, 0x2AAD, 0x2AAC, - 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, 0x2ABD, - 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5, - 0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, - 0x2AD6, 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC, - 0x2AF8, 0x2AF7, 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, - 0x2E0A, 0x2E09, 0x2E0D, 0x2E0C, 0x2E1D, 0x2E1C, 0x3009, 0x3008, - 0x300B, 0x300A, 0x300D, 0x300C, 0x300F, 0x300E, 0x3011, 0x3010, - 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301B, 0x301A, - 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, 0xFF5D, 0xFF5B, - 0xFF60, 0xFF5F, 0xFF63, 0xFF62 -}; - -const le_int32 DefaultCharMapper::mirroredCharsCount = 332; - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MorphStateTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __MORPHSTATETABLES_H -#define __MORPHSTATETABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "MorphTables.h" -#include "StateTables.h" - -U_NAMESPACE_BEGIN - -struct MorphStateTableHeader : MorphSubtableHeader -{ - StateTableHeader stHeader; -}; - -struct MorphStateTableHeader2 : MorphSubtableHeader2 -{ - StateTableHeader2 stHeader; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/MorphTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved - * - */ - - -#include "LETypes.h" -#include "LayoutTables.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "IndicRearrangementProcessor.h" -#include "ContextualGlyphSubstProc.h" -#include "LigatureSubstProc.h" -#include "NonContextualGlyphSubstProc.h" -//#include "ContextualGlyphInsertionProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -void MorphTableHeader::process(const LETableReference &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const -{ - le_uint32 chainCount = SWAPL(this->nChains); - LEReferenceTo<ChainHeader> chainHeader(base, success, chains); // moving header - LEReferenceToArrayOf<ChainHeader> chainHeaderArray(base, success, chains, chainCount); - le_uint32 chain; - - for (chain = 0; LE_SUCCESS(success) && (chain < chainCount); chain += 1) { - if (chain > 0) { - le_uint32 chainLength = SWAPL(chainHeader->chainLength); - if (chainLength & 0x03) { // incorrect alignment for 32 bit tables - success = LE_MEMORY_ALLOCATION_ERROR; // as good a choice as any - return; - } - chainHeader.addOffset(chainLength, success); - } - FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags); - le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries); - le_int16 nSubtables = SWAPW(chainHeader->nSubtables); - LEReferenceTo<MorphSubtableHeader> subtableHeader = - LEReferenceTo<MorphSubtableHeader>(chainHeader,success, &(chainHeader->featureTable[nFeatureEntries])); - le_int16 subtable; - - for (subtable = 0; LE_SUCCESS(success) && (subtable < nSubtables); subtable += 1) { - if (subtable > 0) { - le_int16 length = SWAPW(subtableHeader->length); - if (length & 0x03) { // incorrect alignment for 32 bit tables - success = LE_MEMORY_ALLOCATION_ERROR; // as good a choice as any - return; - } - subtableHeader.addOffset(length, success); - if (LE_FAILURE(success)) break; - } - SubtableCoverage coverage = SWAPW(subtableHeader->coverage); - FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); - - // should check coverage more carefully... - if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0 && LE_SUCCESS(success)) { - subtableHeader->process(subtableHeader, glyphStorage, success); - } - } - } -} - -void MorphSubtableHeader::process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const -{ - SubtableProcessor *processor = NULL; - - if (LE_FAILURE(success)) return; - - switch (SWAPW(coverage) & scfTypeMask) - { - case mstIndicRearrangement: - processor = new IndicRearrangementProcessor(base, success); - break; - - case mstContextualGlyphSubstitution: - processor = new ContextualGlyphSubstitutionProcessor(base, success); - break; - - case mstLigatureSubstitution: - processor = new LigatureSubstitutionProcessor(base, success); - break; - - case mstReservedUnused: - break; - - case mstNonContextualGlyphSubstitution: - processor = NonContextualGlyphSubstitutionProcessor::createInstance(base, success); - break; - - /* - case mstContextualGlyphInsertion: - processor = new ContextualGlyphInsertionProcessor(this); - break; - */ - - default: - break; - } - - if (processor != NULL) { - if(LE_SUCCESS(success)) { - processor->process(glyphStorage, success); - } - delete processor; - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MorphTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,412 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __MORPHTABLES_H -#define __MORPHTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "LETableReference.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -typedef le_uint32 FeatureFlags; - -typedef le_int16 FeatureType; -typedef le_int16 FeatureSetting; - -struct FeatureTableEntry -{ - FeatureType featureType; - FeatureSetting featureSetting; - FeatureFlags enableFlags; - FeatureFlags disableFlags; -}; - -struct ChainHeader -{ - FeatureFlags defaultFlags; - le_uint32 chainLength; - le_int16 nFeatureEntries; - le_int16 nSubtables; - FeatureTableEntry featureTable[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ChainHeader, featureTable) - -struct MorphTableHeader -{ - le_int32 version; - le_uint32 nChains; - ChainHeader chains[ANY_NUMBER]; - - void process(const LETableReference& base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(MorphTableHeader, chains) - -typedef le_int16 SubtableCoverage; -typedef le_uint32 SubtableCoverage2; - -enum SubtableCoverageFlags -{ - scfVertical = 0x8000, - scfReverse = 0x4000, - scfIgnoreVt = 0x2000, - scfReserved = 0x1FF8, - scfTypeMask = 0x0007 -}; - -enum MorphSubtableType -{ - mstIndicRearrangement = 0, - mstContextualGlyphSubstitution = 1, - mstLigatureSubstitution = 2, - mstReservedUnused = 3, - mstNonContextualGlyphSubstitution = 4, - mstContextualGlyphInsertion = 5 -}; - -struct MorphSubtableHeader -{ - le_int16 length; - SubtableCoverage coverage; - FeatureFlags subtableFeatures; - - void process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const; -}; - -enum SubtableCoverageFlags2 -{ - scfVertical2 = 0x80000000, - scfReverse2 = 0x40000000, - scfIgnoreVt2 = 0x20000000, - scfReserved2 = 0x1FFFFF00, - scfTypeMask2 = 0x000000FF -}; - -struct MorphSubtableHeader2 -{ - le_uint32 length; - SubtableCoverage2 coverage; - FeatureFlags subtableFeatures; - - void process(const LEReferenceTo<MorphSubtableHeader2> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const; -}; - -struct ChainHeader2 -{ - FeatureFlags defaultFlags; - le_uint32 chainLength; - le_uint32 nFeatureEntries; - le_uint32 nSubtables; - FeatureTableEntry featureTable[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ChainHeader2, featureTable) - -struct MorphTableHeader2 -{ - le_int32 version; - le_uint32 nChains; - ChainHeader2 chains[ANY_NUMBER]; - - void process(const LEReferenceTo<MorphTableHeader2> &base, LEGlyphStorage &glyphStorage, le_int32 typoFlags, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(MorphTableHeader2, chains) - -/* - * AAT Font Features - * source: https://developer.apple.com/fonts/registry/ - * (plus addition from ATS/SFNTLayoutTypes.h) - */ - -enum { - - allTypographicFeaturesType = 0, - - allTypeFeaturesOnSelector = 0, - allTypeFeaturesOffSelector = 1, - - ligaturesType = 1, - - requiredLigaturesOnSelector = 0, - requiredLigaturesOffSelector = 1, - commonLigaturesOnSelector = 2, - commonLigaturesOffSelector = 3, - rareLigaturesOnSelector = 4, - rareLigaturesOffSelector = 5, - logosOnSelector = 6, - logosOffSelector = 7, - rebusPicturesOnSelector = 8, - rebusPicturesOffSelector = 9, - diphthongLigaturesOnSelector = 10, - diphthongLigaturesOffSelector = 11, - squaredLigaturesOnSelector = 12, - squaredLigaturesOffSelector = 13, - abbrevSquaredLigaturesOnSelector = 14, - abbrevSquaredLigaturesOffSelector = 15, - symbolLigaturesOnSelector = 16, - symbolLigaturesOffSelector = 17, - contextualLigaturesOnSelector = 18, - contextualLigaturesOffSelector = 19, - historicalLigaturesOnSelector = 20, - historicalLigaturesOffSelector = 21, - - cursiveConnectionType = 2, - - unconnectedSelector = 0, - partiallyConnectedSelector = 1, - cursiveSelector = 2, - - letterCaseType = 3, - - upperAndLowerCaseSelector = 0, - allCapsSelector = 1, - allLowerCaseSelector = 2, - smallCapsSelector = 3, - initialCapsSelector = 4, - initialCapsAndSmallCapsSelector = 5, - - verticalSubstitutionType = 4, - - substituteVerticalFormsOnSelector = 0, - substituteVerticalFormsOffSelector = 1, - - linguisticRearrangementType = 5, - - linguisticRearrangementOnSelector = 0, - linguisticRearrangementOffSelector = 1, - - numberSpacingType = 6, - - monospacedNumbersSelector = 0, - proportionalNumbersSelector = 1, - - /* - appleReserved1Type = 7, - */ - - smartSwashType = 8, - - wordInitialSwashesOnSelector = 0, - wordInitialSwashesOffSelector = 1, - wordFinalSwashesOnSelector = 2, - wordFinalSwashesOffSelector = 3, - lineInitialSwashesOnSelector = 4, - lineInitialSwashesOffSelector = 5, - lineFinalSwashesOnSelector = 6, - lineFinalSwashesOffSelector = 7, - nonFinalSwashesOnSelector = 8, - nonFinalSwashesOffSelector = 9, - - diacriticsType = 9, - - showDiacriticsSelector = 0, - hideDiacriticsSelector = 1, - decomposeDiacriticsSelector = 2, - - verticalPositionType = 10, - - normalPositionSelector = 0, - superiorsSelector = 1, - inferiorsSelector = 2, - ordinalsSelector = 3, - - fractionsType = 11, - - noFractionsSelector = 0, - verticalFractionsSelector = 1, - diagonalFractionsSelector = 2, - - /* - appleReserved2Type = 12, - */ - - overlappingCharactersType = 13, - - preventOverlapOnSelector = 0, - preventOverlapOffSelector = 1, - - typographicExtrasType = 14, - - hyphensToEmDashOnSelector = 0, - hyphensToEmDashOffSelector = 1, - hyphenToEnDashOnSelector = 2, - hyphenToEnDashOffSelector = 3, - unslashedZeroOnSelector = 4, - slashedZeroOffSelector = 4, - unslashedZeroOffSelector = 5, - slashedZeroOnSelector = 5, - formInterrobangOnSelector = 6, - formInterrobangOffSelector = 7, - smartQuotesOnSelector = 8, - smartQuotesOffSelector = 9, - periodsToEllipsisOnSelector = 10, - periodsToEllipsisOffSelector = 11, - - mathematicalExtrasType = 15, - - hyphenToMinusOnSelector = 0, - hyphenToMinusOffSelector = 1, - asteriskToMultiplyOnSelector = 2, - asteriskToMultiplyOffSelector = 3, - slashToDivideOnSelector = 4, - slashToDivideOffSelector = 5, - inequalityLigaturesOnSelector = 6, - inequalityLigaturesOffSelector = 7, - exponentsOnSelector = 8, - exponentsOffSelector = 9, - - ornamentSetsType = 16, - - noOrnamentsSelector = 0, - dingbatsSelector = 1, - piCharactersSelector = 2, - fleuronsSelector = 3, - decorativeBordersSelector = 4, - internationalSymbolsSelector = 5, - mathSymbolsSelector = 6, - - characterAlternativesType = 17, - - noAlternatesSelector = 0, - - designComplexityType = 18, - - designLevel1Selector = 0, - designLevel2Selector = 1, - designLevel3Selector = 2, - designLevel4Selector = 3, - designLevel5Selector = 4, - designLevel6Selector = 5, - designLevel7Selector = 6, - - styleOptionsType = 19, - - noStyleOptionsSelector = 0, - displayTextSelector = 1, - engravedTextSelector = 2, - illuminatedCapsSelector = 3, - titlingCapsSelector = 4, - tallCapsSelector = 5, - - characterShapeType = 20, - - traditionalCharactersSelector = 0, - simplifiedCharactersSelector = 1, - jis1978CharactersSelector = 2, - jis1983CharactersSelector = 3, - jis1990CharactersSelector = 4, - traditionalAltOneSelector = 5, - traditionalAltTwoSelector = 6, - traditionalAltThreeSelector = 7, - traditionalAltFourSelector = 8, - traditionalAltFiveSelector = 9, - expertCharactersSelector = 10, - - numberCaseType = 21, - - lowerCaseNumbersSelector = 0, - upperCaseNumbersSelector = 1, - - textSpacingType = 22, - - proportionalTextSelector = 0, - monospacedTextSelector = 1, - halfWidthTextSelector = 2, - normallySpacedTextSelector = 3, - - transliterationType = 23, - - noTransliterationSelector = 0, - hanjaToHangulSelector = 1, - hiraganaToKatakanaSelector = 2, - katakanaToHiraganaSelector = 3, - kanaToRomanizationSelector = 4, - romanizationToHiraganaSelector = 5, - romanizationToKatakanaSelector = 6, - hanjaToHangulAltOneSelector = 7, - hanjaToHangulAltTwoSelector = 8, - hanjaToHangulAltThreeSelector = 9, - - annotationType = 24, - - noAnnotationSelector = 0, - boxAnnotationSelector = 1, - roundedBoxAnnotationSelector = 2, - circleAnnotationSelector = 3, - invertedCircleAnnotationSelector = 4, - parenthesisAnnotationSelector = 5, - periodAnnotationSelector = 6, - romanNumeralAnnotationSelector = 7, - diamondAnnotationSelector = 8, - - kanaSpacingType = 25, - - fullWidthKanaSelector = 0, - proportionalKanaSelector = 1, - - ideographicSpacingType = 26, - - fullWidthIdeographsSelector = 0, - proportionalIdeographsSelector = 1, - - cjkRomanSpacingType = 103, - - halfWidthCJKRomanSelector = 0, - proportionalCJKRomanSelector = 1, - defaultCJKRomanSelector = 2, - fullWidthCJKRomanSelector = 3, - - rubyKanaType = 28, - - rubyKanaOnSelector = 2, - rubyKanaOffSelector = 3, - -/* The following types are provided for compatibility; note that - their use is deprecated. */ - - adobeCharacterSpacingType = 100, /* prefer 22 */ - adobeKanaSpacingType = 101, /* prefer 25 */ - adobeKanjiSpacingType = 102, /* prefer 26 */ - adobeSquareLigatures = 104, /* prefer 1 */ - - lastFeatureType = -1 -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/MorphTables2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. and others 1998 - 2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "IndicRearrangementProcessor2.h" -#include "ContextualGlyphSubstProc2.h" -#include "LigatureSubstProc2.h" -#include "NonContextualGlyphSubstProc2.h" -#include "ContextualGlyphInsertionProc2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -void MorphTableHeader2::process(const LEReferenceTo<MorphTableHeader2> &base, LEGlyphStorage &glyphStorage, - le_int32 typoFlags, LEErrorCode &success) const -{ - if(LE_FAILURE(success)) return; - - le_uint32 chainCount = SWAPL(this->nChains); - LEReferenceTo<ChainHeader2> chainHeader(base, success, &chains[0]); - /* chainHeader and subtableHeader are implemented as a moving pointer rather than an array dereference - * to (slightly) reduce code churn. However, must be careful to preincrement them the 2nd time through. - * We don't want to increment them at the end of the loop, as that would attempt to dereference - * out of range memory. - */ - le_uint32 chain; - - for (chain = 0; LE_SUCCESS(success) && (chain < chainCount); chain++) { - if (chain>0) { - le_uint32 chainLength = SWAPL(chainHeader->chainLength); - if (chainLength & 0x03) { // incorrect alignment for 32 bit tables - success = LE_MEMORY_ALLOCATION_ERROR; // as good a choice as any - return; - } - chainHeader.addOffset(chainLength, success); // Don't increment the first time - } - FeatureFlags flag = SWAPL(chainHeader->defaultFlags); - le_uint32 nFeatureEntries = SWAPL(chainHeader->nFeatureEntries); - le_uint32 nSubtables = SWAPL(chainHeader->nSubtables); - LEReferenceTo<MorphSubtableHeader2> subtableHeader(chainHeader, - success, (const MorphSubtableHeader2 *)&chainHeader->featureTable[nFeatureEntries]); - le_uint32 subtable; - if(LE_FAILURE(success)) break; // malformed table - - if (typoFlags != 0) { - le_uint32 featureEntry; - LEReferenceToArrayOf<FeatureTableEntry> featureTableRef(chainHeader, success, &chainHeader->featureTable[0], nFeatureEntries); - if(LE_FAILURE(success)) break; - // Feature subtables - for (featureEntry = 0; featureEntry < nFeatureEntries; featureEntry++) { - const FeatureTableEntry &featureTableEntry = featureTableRef(featureEntry, success); - le_int16 featureType = SWAPW(featureTableEntry.featureType); - le_int16 featureSetting = SWAPW(featureTableEntry.featureSetting); - le_uint32 enableFlags = SWAPL(featureTableEntry.enableFlags); - le_uint32 disableFlags = SWAPL(featureTableEntry.disableFlags); - switch (featureType) { - case ligaturesType: - if ((typoFlags & LE_Ligatures_FEATURE_ENUM ) && (featureSetting ^ 0x1)){ - flag &= disableFlags; - flag |= enableFlags; - } else { - if (((typoFlags & LE_RLIG_FEATURE_FLAG) && featureSetting == requiredLigaturesOnSelector) || - ((typoFlags & LE_CLIG_FEATURE_FLAG) && featureSetting == contextualLigaturesOnSelector) || - ((typoFlags & LE_HLIG_FEATURE_FLAG) && featureSetting == historicalLigaturesOnSelector) || - ((typoFlags & LE_LIGA_FEATURE_FLAG) && featureSetting == commonLigaturesOnSelector)) { - flag &= disableFlags; - flag |= enableFlags; - } - } - break; - case letterCaseType: - if ((typoFlags & LE_SMCP_FEATURE_FLAG) && featureSetting == smallCapsSelector) { - flag &= disableFlags; - flag |= enableFlags; - } - break; - case verticalSubstitutionType: - break; - case linguisticRearrangementType: - break; - case numberSpacingType: - break; - case smartSwashType: - if ((typoFlags & LE_SWSH_FEATURE_FLAG) && (featureSetting ^ 0x1)){ - flag &= disableFlags; - flag |= enableFlags; - } - break; - case diacriticsType: - break; - case verticalPositionType: - break; - case fractionsType: - if (((typoFlags & LE_FRAC_FEATURE_FLAG) && featureSetting == diagonalFractionsSelector) || - ((typoFlags & LE_AFRC_FEATURE_FLAG) && featureSetting == verticalFractionsSelector)) { - flag &= disableFlags; - flag |= enableFlags; - } else { - flag &= disableFlags; - } - break; - case typographicExtrasType: - if ((typoFlags & LE_ZERO_FEATURE_FLAG) && featureSetting == slashedZeroOnSelector) { - flag &= disableFlags; - flag |= enableFlags; - } - break; - case mathematicalExtrasType: - break; - case ornamentSetsType: - break; - case characterAlternativesType: - break; - case designComplexityType: - if (((typoFlags & LE_SS01_FEATURE_FLAG) && featureSetting == designLevel1Selector) || - ((typoFlags & LE_SS02_FEATURE_FLAG) && featureSetting == designLevel2Selector) || - ((typoFlags & LE_SS03_FEATURE_FLAG) && featureSetting == designLevel3Selector) || - ((typoFlags & LE_SS04_FEATURE_FLAG) && featureSetting == designLevel4Selector) || - ((typoFlags & LE_SS05_FEATURE_FLAG) && featureSetting == designLevel5Selector) || - ((typoFlags & LE_SS06_FEATURE_FLAG) && featureSetting == designLevel6Selector) || - ((typoFlags & LE_SS07_FEATURE_FLAG) && featureSetting == designLevel7Selector)) { - - flag &= disableFlags; - flag |= enableFlags; - } - break; - case styleOptionsType: - break; - case characterShapeType: - break; - case numberCaseType: - break; - case textSpacingType: - break; - case transliterationType: - break; - case annotationType: - if ((typoFlags & LE_NALT_FEATURE_FLAG) && featureSetting == circleAnnotationSelector) { - flag &= disableFlags; - flag |= enableFlags; - } - break; - case kanaSpacingType: - break; - case ideographicSpacingType: - break; - case rubyKanaType: - if ((typoFlags & LE_RUBY_FEATURE_FLAG) && featureSetting == rubyKanaOnSelector) { - flag &= disableFlags; - flag |= enableFlags; - } - break; - case cjkRomanSpacingType: - break; - default: - break; - } - } - } - - for (subtable = 0; LE_SUCCESS(success) && subtable < nSubtables; subtable++) { - if(subtable>0) { - le_uint32 length = SWAPL(subtableHeader->length); - if (length & 0x03) { // incorrect alignment for 32 bit tables - success = LE_MEMORY_ALLOCATION_ERROR; // as good a choice as any - return; - } - subtableHeader.addOffset(length, success); // Don't addOffset for the last entry. - if (LE_FAILURE(success)) break; - } - le_uint32 coverage = SWAPL(subtableHeader->coverage); - FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures); - // should check coverage more carefully... - if (((coverage & scfIgnoreVt2) || !(coverage & scfVertical2)) && (subtableFeatures & flag) != 0) { - subtableHeader->process(subtableHeader, glyphStorage, success); - } - } - } -} - -void MorphSubtableHeader2::process(const LEReferenceTo<MorphSubtableHeader2> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const -{ - SubtableProcessor2 *processor = NULL; - - if (LE_FAILURE(success)) return; - - switch (SWAPL(coverage) & scfTypeMask2) - { - case mstIndicRearrangement: - processor = new IndicRearrangementProcessor2(base, success); - break; - - case mstContextualGlyphSubstitution: - processor = new ContextualGlyphSubstitutionProcessor2(base, success); - break; - - case mstLigatureSubstitution: - processor = new LigatureSubstitutionProcessor2(base, success); - break; - - case mstReservedUnused: - break; - - case mstNonContextualGlyphSubstitution: - processor = NonContextualGlyphSubstitutionProcessor2::createInstance(base, success); - break; - - - case mstContextualGlyphInsertion: - processor = new ContextualGlyphInsertionProcessor2(base, success); - break; - - default: - return; - break; /*NOTREACHED*/ - } - - if (processor != NULL) { - processor->process(glyphStorage, success); - delete processor; - } else { - if(LE_SUCCESS(success)) { - success = LE_MEMORY_ALLOCATION_ERROR; // because ptr is null and we didn't break out. - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MultipleSubstSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "MultipleSubstSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 MultipleSubstitutionSubtable::process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter) const -{ - if (LE_FAILURE(success)) { - return 0; - } - - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - - // If there's a filter, we only want to do the - // substitution if the *input* glyphs doesn't - // exist. - // - // FIXME: is this always the right thing to do? - // FIXME: should this only be done for a non-zero - // glyphCount? - if (filter != NULL && filter->accept(glyph, success)) { - return 0; - } - if(LE_FAILURE(success)) return 0; - - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - le_uint16 seqCount = SWAPW(sequenceCount); - LEReferenceToArrayOf<Offset> - sequenceTableOffsetArrayRef(base, success, sequenceTableOffsetArray, seqCount); - - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0 && coverageIndex < seqCount) { - Offset sequenceTableOffset = SWAPW(sequenceTableOffsetArray[coverageIndex]); - LEReferenceTo<SequenceTable> sequenceTable(base, success, sequenceTableOffset); - if (LE_FAILURE(success)) { - return 0; - } - le_uint16 glyphCount = SWAPW(sequenceTable->glyphCount); - LEReferenceToArrayOf<Offset> - substituteArrayRef(base, success, sequenceTable->substituteArray, glyphCount); - - if (glyphCount == 0) { - glyphIterator->setCurrGlyphID(0xFFFF); - return 1; - } else if (glyphCount == 1) { - TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[0]); - - if (filter != NULL && ! filter->accept(LE_SET_GLYPH(glyph, substitute), success)) { - return 0; - } - - glyphIterator->setCurrGlyphID(substitute); - return 1; - } else { - // If there's a filter, make sure all of the output glyphs - // exist. - if (filter != NULL) { - for (le_int32 i = 0; i < glyphCount; i += 1) { - TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); - - if (! filter->accept(substitute, success)) { - return 0; - } - } - } - - LEGlyphID *newGlyphs = glyphIterator->insertGlyphs(glyphCount, success); - if (LE_FAILURE(success)) { - return 0; - } - - le_int32 insert = 0, direction = 1; - - if (glyphIterator->isRightToLeft()) { - insert = glyphCount - 1; - direction = -1; - } - - for (le_int32 i = 0; i < glyphCount; i += 1) { - TTGlyphID substitute = SWAPW(sequenceTable->substituteArray[i]); - - newGlyphs[insert] = LE_SET_GLYPH(glyph, substitute); - insert += direction; - } - - return 1; - } - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/MultipleSubstSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved - * - */ - -#ifndef __MULTIPLESUBSTITUTIONSUBTABLES_H -#define __MULTIPLESUBSTITUTIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct SequenceTable -{ - le_uint16 glyphCount; - TTGlyphID substituteArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(SequenceTable, substituteArray) - -struct MultipleSubstitutionSubtable : GlyphSubstitutionSubtable -{ - le_uint16 sequenceCount; - Offset sequenceTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LETableReference &base, GlyphIterator *glyphIterator, LEErrorCode& success, const LEGlyphFilter *filter = NULL) const; -}; -LE_VAR_ARRAY(MultipleSubstitutionSubtable, sequenceTableOffsetArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/NonContextualGlyphSubst.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __NONCONTEXTUALGLYPHSUBSTITUTION_H -#define __NONCONTEXTUALGLYPHSUBSTITUTION_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" -#include "LookupTables.h" -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -struct NonContextualGlyphSubstitutionHeader : MorphSubtableHeader -{ - LookupTable table; -}; - -struct NonContextualGlyphSubstitutionHeader2 : MorphSubtableHeader2 -{ - LookupTable table; -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/NonContextualGlyphSubstProc.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "SimpleArrayProcessor.h" -#include "SegmentSingleProcessor.h" -#include "SegmentArrayProcessor.h" -#include "SingleTableProcessor.h" -#include "TrimmedArrayProcessor.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor() -{ -} - -NonContextualGlyphSubstitutionProcessor::NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : SubtableProcessor(morphSubtableHeader, success) -{ -} - -NonContextualGlyphSubstitutionProcessor::~NonContextualGlyphSubstitutionProcessor() -{ -} - -SubtableProcessor *NonContextualGlyphSubstitutionProcessor::createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - - if(LE_FAILURE(success)) return NULL; - - switch (SWAPW(header->table.format)) { - case ltfSimpleArray: - return new SimpleArrayProcessor(morphSubtableHeader, success); - - case ltfSegmentSingle: - return new SegmentSingleProcessor(morphSubtableHeader, success); - - case ltfSegmentArray: - return new SegmentArrayProcessor(morphSubtableHeader, success); - - case ltfSingleTable: - return new SingleTableProcessor(morphSubtableHeader, success); - - case ltfTrimmedArray: - return new TrimmedArrayProcessor(morphSubtableHeader, success); - - default: - return NULL; - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/NonContextualGlyphSubstProc.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H -#define __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class NonContextualGlyphSubstitutionProcessor : public SubtableProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; - - static SubtableProcessor *createInstance(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - -protected: - NonContextualGlyphSubstitutionProcessor(); - NonContextualGlyphSubstitutionProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &status); - - virtual ~NonContextualGlyphSubstitutionProcessor(); - -private: - NonContextualGlyphSubstitutionProcessor(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class - NonContextualGlyphSubstitutionProcessor &operator=(const NonContextualGlyphSubstitutionProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/NonContextualGlyphSubstProc2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "SimpleArrayProcessor2.h" -#include "SegmentSingleProcessor2.h" -#include "SegmentArrayProcessor2.h" -#include "SingleTableProcessor2.h" -#include "TrimmedArrayProcessor2.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -NonContextualGlyphSubstitutionProcessor2::NonContextualGlyphSubstitutionProcessor2() -{ -} - -NonContextualGlyphSubstitutionProcessor2::NonContextualGlyphSubstitutionProcessor2( - const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : SubtableProcessor2(morphSubtableHeader, success) -{ -} - -NonContextualGlyphSubstitutionProcessor2::~NonContextualGlyphSubstitutionProcessor2() -{ -} - -SubtableProcessor2 *NonContextualGlyphSubstitutionProcessor2::createInstance( - const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - if(LE_FAILURE(success)) return NULL; - - switch (SWAPW(header->table.format)) - { - case ltfSimpleArray: - return new SimpleArrayProcessor2(morphSubtableHeader, success); - - case ltfSegmentSingle: - return new SegmentSingleProcessor2(morphSubtableHeader, success); - - case ltfSegmentArray: - return new SegmentArrayProcessor2(morphSubtableHeader, success); - - case ltfSingleTable: - return new SingleTableProcessor2(morphSubtableHeader, success); - - case ltfTrimmedArray: - return new TrimmedArrayProcessor2(morphSubtableHeader, success); - - default: - return NULL; - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/NonContextualGlyphSubstProc2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR2_H -#define __NONCONTEXTUALGLYPHSUBSTITUTIONPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class NonContextualGlyphSubstitutionProcessor2 : public SubtableProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; - - static SubtableProcessor2 *createInstance(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - -protected: - NonContextualGlyphSubstitutionProcessor2(); - NonContextualGlyphSubstitutionProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~NonContextualGlyphSubstitutionProcessor2(); - -private: - NonContextualGlyphSubstitutionProcessor2(const NonContextualGlyphSubstitutionProcessor2 &other); // forbid copying of this class - NonContextualGlyphSubstitutionProcessor2 &operator=(const NonContextualGlyphSubstitutionProcessor2 &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/OpenTypeLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,587 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEScripts.h" -#include "LELanguages.h" - -#include "LayoutEngine.h" -#include "CanonShaping.h" -#include "OpenTypeLayoutEngine.h" -#include "ScriptAndLanguageTags.h" -#include "CharSubstitutionFilter.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -#include "LEGlyphStorage.h" -#include "GlyphPositionAdjustments.h" - -#include "GDEFMarkFilter.h" - -#include "KernTable.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(OpenTypeLayoutEngine) - -#define ccmpFeatureTag LE_CCMP_FEATURE_TAG -#define ligaFeatureTag LE_LIGA_FEATURE_TAG -#define cligFeatureTag LE_CLIG_FEATURE_TAG -#define kernFeatureTag LE_KERN_FEATURE_TAG -#define markFeatureTag LE_MARK_FEATURE_TAG -#define mkmkFeatureTag LE_MKMK_FEATURE_TAG -#define loclFeatureTag LE_LOCL_FEATURE_TAG -#define caltFeatureTag LE_CALT_FEATURE_TAG - -#define dligFeatureTag LE_DLIG_FEATURE_TAG -#define rligFeatureTag LE_RLIG_FEATURE_TAG -#define paltFeatureTag LE_PALT_FEATURE_TAG - -#define hligFeatureTag LE_HLIG_FEATURE_TAG -#define smcpFeatureTag LE_SMCP_FEATURE_TAG -#define fracFeatureTag LE_FRAC_FEATURE_TAG -#define afrcFeatureTag LE_AFRC_FEATURE_TAG -#define zeroFeatureTag LE_ZERO_FEATURE_TAG -#define swshFeatureTag LE_SWSH_FEATURE_TAG -#define cswhFeatureTag LE_CSWH_FEATURE_TAG -#define saltFeatureTag LE_SALT_FEATURE_TAG -#define naltFeatureTag LE_NALT_FEATURE_TAG -#define rubyFeatureTag LE_RUBY_FEATURE_TAG -#define ss01FeatureTag LE_SS01_FEATURE_TAG -#define ss02FeatureTag LE_SS02_FEATURE_TAG -#define ss03FeatureTag LE_SS03_FEATURE_TAG -#define ss04FeatureTag LE_SS04_FEATURE_TAG -#define ss05FeatureTag LE_SS05_FEATURE_TAG -#define ss06FeatureTag LE_SS06_FEATURE_TAG -#define ss07FeatureTag LE_SS07_FEATURE_TAG - -#define ccmpFeatureMask 0x80000000UL -#define ligaFeatureMask 0x40000000UL -#define cligFeatureMask 0x20000000UL -#define kernFeatureMask 0x10000000UL -#define paltFeatureMask 0x08000000UL -#define markFeatureMask 0x04000000UL -#define mkmkFeatureMask 0x02000000UL -#define loclFeatureMask 0x01000000UL -#define caltFeatureMask 0x00800000UL - -#define dligFeatureMask 0x00400000UL -#define rligFeatureMask 0x00200000UL -#define hligFeatureMask 0x00100000UL -#define smcpFeatureMask 0x00080000UL -#define fracFeatureMask 0x00040000UL -#define afrcFeatureMask 0x00020000UL -#define zeroFeatureMask 0x00010000UL -#define swshFeatureMask 0x00008000UL -#define cswhFeatureMask 0x00004000UL -#define saltFeatureMask 0x00002000UL -#define naltFeatureMask 0x00001000UL -#define rubyFeatureMask 0x00000800UL -#define ss01FeatureMask 0x00000400UL -#define ss02FeatureMask 0x00000200UL -#define ss03FeatureMask 0x00000100UL -#define ss04FeatureMask 0x00000080UL -#define ss05FeatureMask 0x00000040UL -#define ss06FeatureMask 0x00000020UL -#define ss07FeatureMask 0x00000010UL - -#define minimalFeatures (ccmpFeatureMask | markFeatureMask | mkmkFeatureMask | loclFeatureMask | caltFeatureMask) - -static const FeatureMap featureMap[] = -{ - {ccmpFeatureTag, ccmpFeatureMask}, - {ligaFeatureTag, ligaFeatureMask}, - {cligFeatureTag, cligFeatureMask}, - {kernFeatureTag, kernFeatureMask}, - {paltFeatureTag, paltFeatureMask}, - {markFeatureTag, markFeatureMask}, - {mkmkFeatureTag, mkmkFeatureMask}, - {loclFeatureTag, loclFeatureMask}, - {caltFeatureTag, caltFeatureMask}, - {hligFeatureTag, hligFeatureMask}, - {smcpFeatureTag, smcpFeatureMask}, - {fracFeatureTag, fracFeatureMask}, - {afrcFeatureTag, afrcFeatureMask}, - {zeroFeatureTag, zeroFeatureMask}, - {swshFeatureTag, swshFeatureMask}, - {cswhFeatureTag, cswhFeatureMask}, - {saltFeatureTag, saltFeatureMask}, - {naltFeatureTag, naltFeatureMask}, - {rubyFeatureTag, rubyFeatureMask}, - {ss01FeatureTag, ss01FeatureMask}, - {ss02FeatureTag, ss02FeatureMask}, - {ss03FeatureTag, ss03FeatureMask}, - {ss04FeatureTag, ss04FeatureMask}, - {ss05FeatureTag, ss05FeatureMask}, - {ss06FeatureTag, ss06FeatureMask}, - {ss07FeatureTag, ss07FeatureMask} -}; - -static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); - -OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureMask(minimalFeatures), - fFeatureMap(featureMap), fFeatureMapCount(featureMapCount), fFeatureOrder(FALSE), - fGSUBTable(gsubTable), - fGDEFTable(fontInstance, LE_GDEF_TABLE_TAG, success), - fGPOSTable(fontInstance, LE_GPOS_TABLE_TAG, success), fSubstitutionFilter(NULL) -{ - applyTypoFlags(); - - setScriptAndLanguageTags(); - -// JK patch, 2008-05-30 - see Sinhala bug report and LKLUG font -// if (gposTable != NULL && gposTable->coversScriptAndLanguage(fScriptTag, fLangSysTag)) { - if (!fGPOSTable.isEmpty()&& !fGPOSTable->coversScript(fGPOSTable, fScriptTag, success)) { - fGPOSTable.clear(); // already loaded - } -} - -void OpenTypeLayoutEngine::applyTypoFlags() { - const le_int32& typoFlags = fTypoFlags; - const LEFontInstance *fontInstance = fFontInstance; - - switch (typoFlags & (LE_SS01_FEATURE_FLAG - | LE_SS02_FEATURE_FLAG - | LE_SS03_FEATURE_FLAG - | LE_SS04_FEATURE_FLAG - | LE_SS05_FEATURE_FLAG - | LE_SS06_FEATURE_FLAG - | LE_SS07_FEATURE_FLAG)) { - case LE_SS01_FEATURE_FLAG: - fFeatureMask |= ss01FeatureMask; - break; - case LE_SS02_FEATURE_FLAG: - fFeatureMask |= ss02FeatureMask; - break; - case LE_SS03_FEATURE_FLAG: - fFeatureMask |= ss03FeatureMask; - break; - case LE_SS04_FEATURE_FLAG: - fFeatureMask |= ss04FeatureMask; - break; - case LE_SS05_FEATURE_FLAG: - fFeatureMask |= ss05FeatureMask; - break; - case LE_SS06_FEATURE_FLAG: - fFeatureMask |= ss06FeatureMask; - break; - case LE_SS07_FEATURE_FLAG: - fFeatureMask |= ss07FeatureMask; - break; - } - - if (typoFlags & LE_Kerning_FEATURE_FLAG) { - fFeatureMask |= (kernFeatureMask | paltFeatureMask); - // Convenience. - } - if (typoFlags & LE_Ligatures_FEATURE_FLAG) { - fFeatureMask |= (ligaFeatureMask | cligFeatureMask); - // Convenience TODO: should add: .. dligFeatureMask | rligFeatureMask ? - } - if (typoFlags & LE_CLIG_FEATURE_FLAG) fFeatureMask |= cligFeatureMask; - if (typoFlags & LE_DLIG_FEATURE_FLAG) fFeatureMask |= dligFeatureMask; - if (typoFlags & LE_HLIG_FEATURE_FLAG) fFeatureMask |= hligFeatureMask; - if (typoFlags & LE_LIGA_FEATURE_FLAG) fFeatureMask |= ligaFeatureMask; - if (typoFlags & LE_RLIG_FEATURE_FLAG) fFeatureMask |= rligFeatureMask; - if (typoFlags & LE_SMCP_FEATURE_FLAG) fFeatureMask |= smcpFeatureMask; - if (typoFlags & LE_FRAC_FEATURE_FLAG) fFeatureMask |= fracFeatureMask; - if (typoFlags & LE_AFRC_FEATURE_FLAG) fFeatureMask |= afrcFeatureMask; - if (typoFlags & LE_ZERO_FEATURE_FLAG) fFeatureMask |= zeroFeatureMask; - if (typoFlags & LE_SWSH_FEATURE_FLAG) fFeatureMask |= swshFeatureMask; - if (typoFlags & LE_CSWH_FEATURE_FLAG) fFeatureMask |= cswhFeatureMask; - if (typoFlags & LE_SALT_FEATURE_FLAG) fFeatureMask |= saltFeatureMask; - if (typoFlags & LE_RUBY_FEATURE_FLAG) fFeatureMask |= rubyFeatureMask; - if (typoFlags & LE_NALT_FEATURE_FLAG) { - // Mutually exclusive with ALL other features. http://www.microsoft.com/typography/otspec/features_ko.htm - fFeatureMask = naltFeatureMask; - } - - if (typoFlags & LE_CHAR_FILTER_FEATURE_FLAG) { - // This isn't a font feature, but requests a Char Substitution Filter - fSubstitutionFilter = new CharSubstitutionFilter(fontInstance); - } - -} - -void OpenTypeLayoutEngine::reset() -{ - // NOTE: if we're called from - // the destructor, LayoutEngine;:reset() - // will have been called already by - // LayoutEngine::~LayoutEngine() - LayoutEngine::reset(); -} - -OpenTypeLayoutEngine::OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success) - : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success), fFeatureOrder(FALSE), - fGSUBTable(), fGDEFTable(), fGPOSTable(), fSubstitutionFilter(NULL) -{ - applyTypoFlags(); - setScriptAndLanguageTags(); -} - -OpenTypeLayoutEngine::~OpenTypeLayoutEngine() -{ - if (fTypoFlags & LE_CHAR_FILTER_FEATURE_FLAG) { - delete fSubstitutionFilter; - fSubstitutionFilter = NULL; - } - - reset(); -} - -LETag OpenTypeLayoutEngine::getScriptTag(le_int32 scriptCode) -{ - if (scriptCode < 0 || scriptCode >= scriptCodeCount) { - return 0xFFFFFFFF; - } - return scriptTags[scriptCode]; -} - -LETag OpenTypeLayoutEngine::getV2ScriptTag(le_int32 scriptCode) -{ - switch (scriptCode) { - case bengScriptCode : return bng2ScriptTag; - case devaScriptCode : return dev2ScriptTag; - case gujrScriptCode : return gjr2ScriptTag; - case guruScriptCode : return gur2ScriptTag; - case kndaScriptCode : return knd2ScriptTag; - case mlymScriptCode : return mlm2ScriptTag; - case oryaScriptCode : return ory2ScriptTag; - case tamlScriptCode : return tml2ScriptTag; - case teluScriptCode : return tel2ScriptTag; - default: return nullScriptTag; - } -} - -LETag OpenTypeLayoutEngine::getLangSysTag(le_int32 languageCode) -{ - if (languageCode < 0 || languageCode >= languageCodeCount) { - return 0xFFFFFFFF; - } - - return languageTags[languageCode]; -} - -void OpenTypeLayoutEngine::setScriptAndLanguageTags() -{ - fScriptTag = getScriptTag(fScriptCode); - fScriptTagV2 = getV2ScriptTag(fScriptCode); - fLangSysTag = getLangSysTag(fLanguageCode); -} - -le_int32 OpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - // This is the cheapest way to get mark reordering only for Hebrew. - // We could just do the mark reordering for all scripts, but most - // of them probably don't need it... Another option would be to - // add a HebrewOpenTypeLayoutEngine subclass, but the only thing it - // would need to do is mark reordering, so that seems like overkill. - if (fScriptCode == hebrScriptCode) { - outChars = LE_NEW_ARRAY(LEUnicode, count); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - CanonShaping::reorderMarks(&chars[offset], count, rightToLeft, outChars, glyphStorage); - } - - if (LE_FAILURE(success)) { - return 0; - } - - glyphStorage.allocateGlyphArray(count, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - for (le_int32 i = 0; i < count; i += 1) { - glyphStorage.setAuxData(i, fFeatureMask, success); - } - - return count; -} - -// Input: characters, tags -// Output: glyphs, char indices -le_int32 OpenTypeLayoutEngine::glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - mapCharsToGlyphs(chars, offset, count, rightToLeft, rightToLeft, glyphStorage, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (fGSUBTable.isValid()) { - if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable, fScriptTagV2, fLangSysTag, success)) { - count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, - fFeatureMap, fFeatureMapCount, fFeatureOrder, success); - - } else { - count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, - fFeatureMap, fFeatureMapCount, fFeatureOrder, success); - } - } - - return count; -} -// Input: characters, tags -// Output: glyphs, char indices -le_int32 OpenTypeLayoutEngine::glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if ( count < 0 || max < 0 ) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - if (fGSUBTable.isValid()) { - if (fScriptTagV2 != nullScriptTag && fGSUBTable->coversScriptAndLanguage(fGSUBTable,fScriptTagV2,fLangSysTag,success)) { - count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTagV2, fLangSysTag, fGDEFTable, fSubstitutionFilter, - fFeatureMap, fFeatureMapCount, fFeatureOrder, success); - - } else { - count = fGSUBTable->process(fGSUBTable, glyphStorage, rightToLeft, fScriptTag, fLangSysTag, fGDEFTable, fSubstitutionFilter, - fFeatureMap, fFeatureMapCount, fFeatureOrder, success); - } - } - - return count; -} -le_int32 OpenTypeLayoutEngine::glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - glyphStorage.adoptGlyphArray(tempGlyphStorage); - glyphStorage.adoptCharIndicesArray(tempGlyphStorage); - glyphStorage.adoptAuxDataArray(tempGlyphStorage); - glyphStorage.adoptGlyphCount(tempGlyphStorage); - - return glyphStorage.getGlyphCount(); -} - -le_int32 OpenTypeLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - LEUnicode *outChars = NULL; - LEGlyphStorage fakeGlyphStorage; - le_int32 outCharCount, outGlyphCount; - - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - outCharCount = characterProcessing(chars, offset, count, max, rightToLeft, outChars, fakeGlyphStorage, success); - - if (LE_FAILURE(success)) { - return 0; - } - - if (outChars != NULL) { - // le_int32 fakeGlyphCount = - glyphProcessing(outChars, 0, outCharCount, outCharCount, rightToLeft, fakeGlyphStorage, success); - LE_DELETE_ARRAY(outChars); // FIXME: a subclass may have allocated this, in which case this delete might not work... - //adjustGlyphs(outChars, 0, outCharCount, rightToLeft, fakeGlyphs, fakeGlyphCount); - } else { - // le_int32 fakeGlyphCount = - glyphProcessing(chars, offset, count, max, rightToLeft, fakeGlyphStorage, success); - //adjustGlyphs(chars, offset, count, rightToLeft, fakeGlyphs, fakeGlyphCount); - } - - if (LE_FAILURE(success)) { - return 0; - } - - outGlyphCount = glyphPostProcessing(fakeGlyphStorage, glyphStorage, success); - - return outGlyphCount; -} - -// apply GPOS table, if any -void OpenTypeLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - _LETRACE("OTLE::adjustGPOS"); - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - le_int32 glyphCount = glyphStorage.getGlyphCount(); - if (glyphCount == 0) { - return; - } - - if (!fGPOSTable.isEmpty()) { - GlyphPositionAdjustments *adjustments = new GlyphPositionAdjustments(glyphCount); - le_int32 i; - - if (adjustments == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return; - } - -#if 0 - // Don't need to do this if we allocate - // the adjustments array w/ new... - for (i = 0; i < glyphCount; i += 1) { - adjustments->setXPlacement(i, 0); - adjustments->setYPlacement(i, 0); - - adjustments->setXAdvance(i, 0); - adjustments->setYAdvance(i, 0); - - adjustments->setBaseOffset(i, -1); - } -#endif - - if (!fGPOSTable.isEmpty()) { - if (fScriptTagV2 != nullScriptTag && - fGPOSTable->coversScriptAndLanguage(fGPOSTable, fScriptTagV2,fLangSysTag,success)) { - _LETRACE("OTLE::process [0]"); - fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTagV2, fLangSysTag, - fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder); - - } else { - _LETRACE("OTLE::process [1]"); - fGPOSTable->process(fGPOSTable, glyphStorage, adjustments, reverse, fScriptTag, fLangSysTag, - fGDEFTable, success, fFontInstance, fFeatureMap, fFeatureMapCount, fFeatureOrder); - } - } else if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ - _LETRACE("OTLE::kerning"); - LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); - KernTable kt(kernTable, success); - kt.process(glyphStorage, success); - } - - float xAdjust = 0, yAdjust = 0; - - for (i = 0; i < glyphCount; i += 1) { - float xAdvance = adjustments->getXAdvance(i); - float yAdvance = adjustments->getYAdvance(i); - float xPlacement = 0; - float yPlacement = 0; - - -#if 0 - // This is where separate kerning adjustments - // should get applied. - xAdjust += xKerning; - yAdjust += yKerning; -#endif - - for (le_int32 base = i; base >= 0; base = adjustments->getBaseOffset(base)) { - xPlacement += adjustments->getXPlacement(base); - yPlacement += adjustments->getYPlacement(base); - } - - xPlacement = fFontInstance->xUnitsToPoints(xPlacement); - yPlacement = fFontInstance->yUnitsToPoints(yPlacement); - _LETRACE("OTLE GPOS: #%d, (%.2f,%.2f)", i, xPlacement, yPlacement); - glyphStorage.adjustPosition(i, xAdjust + xPlacement, -(yAdjust + yPlacement), success); - - xAdjust += fFontInstance->xUnitsToPoints(xAdvance); - yAdjust += fFontInstance->yUnitsToPoints(yAdvance); - } - - glyphStorage.adjustPosition(glyphCount, xAdjust, -yAdjust, success); - - delete adjustments; - } else { - // if there was no GPOS table, maybe there's non-OpenType kerning we can use - LayoutEngine::adjustGlyphPositions(chars, offset, count, reverse, glyphStorage, success); - } - - LEGlyphID zwnj = fFontInstance->mapCharToGlyph(0x200C); - - if (zwnj != 0x0000) { - for (le_int32 g = 0; g < glyphCount; g += 1) { - LEGlyphID glyph = glyphStorage[g]; - - if (glyph == zwnj) { - glyphStorage[g] = LE_SET_GLYPH(glyph, 0xFFFF); - } - } - } - -#if 0 - // Don't know why this is here... - LE_DELETE_ARRAY(fFeatureTags); - fFeatureTags = NULL; -#endif -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/OpenTypeLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,421 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __OPENTYPELAYOUTENGINE_H -#define __OPENTYPELAYOUTENGINE_H - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "LEFontInstance.h" -#include "LayoutEngine.h" -#include "LETableReference.h" - -#include "GlyphSubstitutionTables.h" -#include "GlyphDefinitionTables.h" -#include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -/** - * OpenTypeLayoutEngine implements complex text layout for OpenType fonts - that is - * fonts which have GSUB and GPOS tables associated with them. In order to do this, - * the glyph processsing step described for LayoutEngine is further broken into three - * steps: - * - * 1) Character processing - this step analyses the characters and assigns a list of OpenType - * feature tags to each one. It may also change, remove or add characters, and change - * their order. - * - * 2) Glyph processing - This step performs character to glyph mapping,and uses the GSUB - * table associated with the font to perform glyph substitutions, such as ligature substitution. - * - * 3) Glyph post processing - in cases where the font doesn't directly contain a GSUB table, - * the previous two steps may have generated "fake" glyph indices to use with a "canned" GSUB - * table. This step turns those glyph indices into actual font-specific glyph indices, and may - * perform any other adjustments required by the previous steps. - * - * OpenTypeLayoutEngine will also use the font's GPOS table to apply position adjustments - * such as kerning and accent positioning. - * - * @see LayoutEngine - * - * @internal - */ -class U_LAYOUT_API OpenTypeLayoutEngine : public LayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of OpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @internal - */ - OpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~OpenTypeLayoutEngine(); - - /** - * A convenience method used to convert the script code into - * the four byte script tag required by OpenType. - * For Indic languages where multiple script tags exist, - * the version 1 (old style) tag is returned. - * - * @param scriptCode - the script code - * - * @return the four byte script tag - * - * @internal - */ - static LETag getScriptTag(le_int32 scriptCode); - /** - * A convenience method used to convert the script code into - * the four byte script tag required by OpenType. - * For Indic languages where multiple script tags exist, - * the version 2 tag is returned. - * - * @param scriptCode - the script code - * - * @return the four byte script tag - * - * @internal - */ - static LETag getV2ScriptTag(le_int32 scriptCode); - - /** - * A convenience method used to convert the langauge code into - * the four byte langauge tag required by OpenType. - * - * @param languageCode - the language code - * - * @return the four byte language tag - * - * @internal - */ - static LETag getLangSysTag(le_int32 languageCode); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - - /** - * The array of language tags, indexed by language code. - * - * @internal - */ - static const LETag languageTags[]; - -private: - - /** - * This method is used by the constructors to convert the script - * and language codes to four byte tags and save them. - */ - void setScriptAndLanguageTags(); - - /** - * The array of script tags, indexed by script code. - */ - static const LETag scriptTags[]; - - /** - * apply the typoflags. Only called by the c'tors. - */ - void applyTypoFlags(); - -protected: - /** - * A set of "default" features. The default characterProcessing method - * will apply all of these features to every glyph. - * - * @internal - */ - FeatureMask fFeatureMask; - - /** - * A set of mappings from feature tags to feature masks. These may - * be in the order in which the featues should be applied, but they - * don't need to be. - * - * @internal - */ - const FeatureMap *fFeatureMap; - - /** - * The length of the feature map. - * - * @internal - */ - le_int32 fFeatureMapCount; - - /** - * <code>TRUE</code> if the features in the - * feature map are in the order in which they - * must be applied. - * - * @internal - */ - le_bool fFeatureOrder; - - /** - * The address of the GSUB table. - * - * @internal - */ - LEReferenceTo<GlyphSubstitutionTableHeader> fGSUBTable; - - /** - * The address of the GDEF table. - * - * @internal - */ - LEReferenceTo<GlyphDefinitionTableHeader> fGDEFTable; - - /** - * The address of the GPOS table. - * - * @internal - */ - LEReferenceTo<GlyphPositioningTableHeader> fGPOSTable; - - /** - * An optional filter used to inhibit substitutions - * preformed by the GSUB table. This is used for some - * "canned" GSUB tables to restrict substitutions to - * glyphs that are in the font. - * - * @internal - */ - LEGlyphFilter *fSubstitutionFilter; - - /** - * The four byte script tag. - * - * @internal - */ - LETag fScriptTag; - - /** - * The four byte script tag for V2 fonts. - * - * @internal - */ - LETag fScriptTagV2; - - /** - * The four byte language tag - * - * @internal - */ - LETag fLangSysTag; - - /** - * This method does the OpenType character processing. It assigns the OpenType feature - * tags to the characters, and may generate output characters that differ from the input - * charcters due to insertions, deletions, or reorderings. In such cases, it will also - * generate an output character index array reflecting these changes. - * - * Subclasses must override this method. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - TRUE if the characters are in a right to left directional run - * - * Output parameters: - * @param outChars - the output character array, if different from the input - * @param charIndices - the output character index array - * @param featureTags - the output feature tag array - * @param success - set to an error code if the operation fails - * - * @return the output character count (input character count if no change) - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode /*chars*/[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, - LEUnicode *&/*outChars*/, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does character to glyph mapping, and applies the GSUB table. The - * default implementation calls mapCharsToGlyphs and then applies the GSUB table, - * if there is one. - * - * Note that in the case of "canned" GSUB tables, the output glyph indices may be - * "fake" glyph indices that need to be converted to "real" glyph indices by the - * glyphPostProcessing method. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - TRUE if the characters are in a right to left directional run - * @param featureTags - the feature tag array - * - * Output parameters: - * @param glyphs - the output glyph index array - * @param charIndices - the output character index array - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the output glyph index array - * - * Note: if the character index array was already set by the characterProcessing - * method, this method won't change it. - * - * @internal - */ - virtual le_int32 glyphProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - virtual le_int32 glyphSubstitution(le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does any processing necessary to convert "fake" - * glyph indices used by the glyphProcessing method into "real" glyph - * indices which can be used to render the text. Note that in some - * cases, such as CDAC Indic fonts, several "real" glyphs may be needed - * to render one "fake" glyph. - * - * The default implementation of this method just returns the input glyph - * index and character index arrays, assuming that no "fake" glyph indices - * were needed to do GSUB processing. - * - * Input parameters: - * @param tempGlyphs - the input "fake" glyph index array - * @param tempCharIndices - the input "fake" character index array - * @param tempGlyphCount - the number of "fake" glyph indices - * - * Output parameters: - * @param glyphs - the output glyph index array - * @param charIndices - the output character index array - * @param success - set to an error code if the operation fails - * - * @return the number of glyph indices in the output glyph index array - * - * @internal - */ - virtual le_int32 glyphPostProcessing(LEGlyphStorage &tempGlyphStorage, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method applies the characterProcessing, glyphProcessing and glyphPostProcessing - * methods. Most subclasses will not need to override this method. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - TRUE if the text is in a right to left directional run - * - * Output parameters: - * @param glyphs - the glyph index array - * @param charIndices - the character index array - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the glyph index array - * - * @see LayoutEngine::computeGlyphs - * - * @internal - */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method uses the GPOS table, if there is one, to adjust the glyph positions. - * - * Input parameters: - * @param glyphs - the input glyph array - * @param glyphCount - the number of glyphs in the glyph array - * @param x - the starting X position - * @param y - the starting Y position - * - * Output parameters: - * @param positions - the output X and Y positions (two entries per glyph) - * @param success - set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method frees the feature tag array so that the - * OpenTypeLayoutEngine can be reused for different text. - * It is also called from our destructor. - * - * @internal - */ - virtual void reset(); -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/OpenTypeTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __OPENTYPETABLES_H -#define __OPENTYPETABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LETableReference.h" - -U_NAMESPACE_BEGIN - -#define ANY_NUMBER 1 - -typedef le_uint16 Offset; -typedef le_uint8 ATag[4]; -typedef le_uint32 fixed32; - -#define LE_GLYPH_GROUP_MASK 0x00000001UL -typedef le_uint32 FeatureMask; - -#define SWAPT(atag) ((LETag) (((atag[0]) << 24) + ((atag[1]) << 16) + ((atag[2]) << 8) + (atag[3]))) - -struct TagAndOffsetRecord -{ - ATag tag; - Offset offset; -}; - -struct GlyphRangeRecord -{ - TTGlyphID firstGlyph; - TTGlyphID lastGlyph; - le_int16 rangeValue; -}; - -struct FeatureMap -{ - LETag tag; - FeatureMask mask; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/OpenTypeUtilities.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -// -// Finds the high bit by binary searching -// through the bits in n. -// -le_int8 OpenTypeUtilities::highBit(le_int32 value) -{ - if (value <= 0) { - return -32; - } - - le_uint8 bit = 0; - - if (value >= 1 << 16) { - value >>= 16; - bit += 16; - } - - if (value >= 1 << 8) { - value >>= 8; - bit += 8; - } - - if (value >= 1 << 4) { - value >>= 4; - bit += 4; - } - - if (value >= 1 << 2) { - value >>= 2; - bit += 2; - } - - if (value >= 1 << 1) { - value >>= 1; - bit += 1; - } - - return bit; -} - - -Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return 0; - const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias(); - - le_uint32 recordCount = records.getCount(); - le_uint8 bit = highBit(recordCount); - le_int32 power = 1 << bit; - le_int32 extra = recordCount - power; - le_int32 probe = power; - le_int32 index = 0; - - { - const ATag &aTag = (r0+extra)->tag; - if (SWAPT(aTag) <= tag) { - index = extra; - } - } - - while (probe > (1 << 0)) { - probe >>= 1; - - { - const ATag &aTag = (r0+index+probe)->tag; - if (SWAPT(aTag) <= tag) { - index += probe; - } - } - } - - { - const ATag &aTag = (r0+index)->tag; - if (SWAPT(aTag) == tag) { - return SWAPW((r0+index)->offset); - } - } - - return 0; -} - -le_int32 OpenTypeUtilities::getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return -1; - - le_uint32 recordCount = records.getCount(); - le_uint8 bit = highBit(recordCount); - le_int32 power = 1 << bit; - le_int32 extra = recordCount - power; - le_int32 probe = power; - le_int32 range = 0; - - if (recordCount == 0) { - return -1; - } - - if (SWAPW(records(extra,success).firstGlyph) <= glyphID) { - range = extra; - } - - while (probe > (1 << 0) && LE_SUCCESS(success)) { - probe >>= 1; - - if (SWAPW(records(range + probe,success).firstGlyph) <= glyphID) { - range += probe; - } - } - - if (SWAPW(records(range,success).firstGlyph) <= glyphID && SWAPW(records(range,success).lastGlyph) >= glyphID) { - return range; - } - - return -1; -} - -le_int32 OpenTypeUtilities::search(le_uint32 value, const le_uint32 array[], le_int32 count) -{ - le_int32 power = 1 << highBit(count); - le_int32 extra = count - power; - le_int32 probe = power; - le_int32 index = 0; - - if (value >= array[extra]) { - index = extra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (value >= array[index + probe]) { - index += probe; - } - } - - return index; -} - -le_int32 OpenTypeUtilities::search(le_uint16 value, const le_uint16 array[], le_int32 count) -{ - le_int32 power = 1 << highBit(count); - le_int32 extra = count - power; - le_int32 probe = power; - le_int32 index = 0; - - if (value >= array[extra]) { - index = extra; - } - - while (probe > (1 << 0)) { - probe >>= 1; - - if (value >= array[index + probe]) { - index += probe; - } - } - - return index; -} - -// -// Straight insertion sort from Knuth vol. III, pg. 81 -// -void OpenTypeUtilities::sort(le_uint16 *array, le_int32 count) -{ - for (le_int32 j = 1; j < count; j += 1) { - le_int32 i; - le_uint16 v = array[j]; - - for (i = j - 1; i >= 0; i -= 1) { - if (v >= array[i]) { - break; - } - - array[i + 1] = array[i]; - } - - array[i + 1] = v; - } -} - -U_NAMESPACE_END - -#if LE_ASSERT_BAD_FONT -#include <stdio.h> - -static const char *letagToStr(LETag tag, char *str) { - str[0]= 0xFF & (tag>>24); - str[1]= 0xFF & (tag>>16); - str[2]= 0xFF & (tag>>8); - str[3]= 0xFF & (tag>>0); - str[4]= 0; - return str; -} - -U_CAPI void U_EXPORT2 _debug_LETableReference(const char *f, int l, const char *msg, const LETableReference *what, const void *ptr, size_t len) { - char tagbuf[5]; - - fprintf(stderr, "%s:%d: LETableReference@0x%p: ", f, l, what); - fprintf(stderr, msg, ptr, len); - fprintf(stderr, "\n"); - - for(int depth=0;depth<10&&(what!=NULL);depth++) { - for(int i=0;i<depth;i++) { - fprintf(stderr, " "); // indent - } - if(!what->isValid()) { - fprintf(stderr, "(invalid)"); - } - fprintf(stderr, "@%p: tag (%s) font (0x%p), [0x%p+0x%lx]\n", what, letagToStr(what->getTag(), tagbuf), what->getFont(), - what->getAlias(), what->getLength()); - - what = what->getParent(); - } -} -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/OpenTypeUtilities.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __OPENTYPEUTILITIES_H -#define __OPENTYPEUTILITIES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class OpenTypeUtilities /* not : public UObject because all methods are static */ { -public: - static le_int8 highBit(le_int32 value); - static Offset getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success); -#if LE_ENABLE_RAW - static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const GlyphRangeRecord *records, le_int32 recordCount) { - LEErrorCode success = LE_NO_ERROR; - LETableReference recordRef0((const le_uint8*)records); - LEReferenceToArrayOf<GlyphRangeRecord> recordRef(recordRef0, success, (size_t)0, recordCount); - return getGlyphRangeIndex(glyphID, recordRef, success); - } -#endif - static le_int32 getGlyphRangeIndex(TTGlyphID glyphID, const LEReferenceToArrayOf<GlyphRangeRecord> &records, LEErrorCode &success); - static le_int32 search(le_uint16 value, const le_uint16 array[], le_int32 count); - static le_int32 search(le_uint32 value, const le_uint32 array[], le_int32 count); - static void sort(le_uint16 *array, le_int32 count); - -private: - OpenTypeUtilities() {} // private - forbid instantiation -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/PairPositioningSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "PairPositioningSubtables.h" -#include "ValueRecords.h" -#include "GlyphIterator.h" -#include "OpenTypeUtilities.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 PairPositioningSubtable::process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - switch(SWAPW(subtableFormat)) - { - case 0: - return 0; - - case 1: - { - const LEReferenceTo<PairPositioningFormat1Subtable> subtable(base, success, (const PairPositioningFormat1Subtable *) this); - - if(LE_SUCCESS(success)) - return subtable->process(subtable, glyphIterator, fontInstance, success); - else - return 0; - } - - case 2: - { - const LEReferenceTo<PairPositioningFormat2Subtable> subtable(base, success, (const PairPositioningFormat2Subtable *) this); - - if(LE_SUCCESS(success)) - return subtable->process(subtable, glyphIterator, fontInstance, success); - else - return 0; - } - default: - return 0; - } -} - -le_uint32 PairPositioningFormat1Subtable::process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success); - GlyphIterator tempIterator(*glyphIterator); - - LEReferenceToArrayOf<Offset> pairSetTableOffsetArrayRef(base, success, pairSetTableOffsetArray, SWAPW(pairSetCount)); - - if (LE_SUCCESS(success) && coverageIndex >= 0 && glyphIterator->next() && (le_uint32)coverageIndex < pairSetTableOffsetArrayRef.getCount()) { - Offset pairSetTableOffset = SWAPW(pairSetTableOffsetArray[coverageIndex]); - LEReferenceTo<PairSetTable> pairSetTable(base, success, pairSetTableOffset); - if( LE_FAILURE(success) ) return 0; - le_uint16 pairValueCount = SWAPW(pairSetTable->pairValueCount); - LEReferenceTo<PairValueRecord> pairValueRecordArray(pairSetTable, success, pairSetTable->pairValueRecordArray); - if( LE_FAILURE(success) ) return 0; - le_int16 valueRecord1Size = ValueRecord::getSize(SWAPW(valueFormat1)); - le_int16 valueRecord2Size = ValueRecord::getSize(SWAPW(valueFormat2)); - le_int16 recordSize = sizeof(PairValueRecord) - sizeof(ValueRecord) + valueRecord1Size + valueRecord2Size; - LEGlyphID secondGlyph = glyphIterator->getCurrGlyphID(); - LEReferenceTo<PairValueRecord> pairValueRecord; - - if (pairValueCount != 0) { - pairValueRecord = findPairValueRecord((TTGlyphID) LE_GET_GLYPH(secondGlyph), pairValueRecordArray, pairValueCount, recordSize, success); - } - - if (pairValueRecord.isEmpty() || LE_FAILURE(success)) { - return 0; - } - - if (valueFormat1 != 0) { - pairValueRecord->valueRecord1.adjustPosition(SWAPW(valueFormat1), base, tempIterator, fontInstance, success); - } - - if (valueFormat2 != 0) { - LEReferenceTo<ValueRecord> valueRecord2(base, success, ((char *) &pairValueRecord->valueRecord1 + valueRecord1Size)); - if(LE_SUCCESS(success)) { - valueRecord2->adjustPosition(SWAPW(valueFormat2), base, *glyphIterator, fontInstance, success); - } - } - - // back up glyphIterator so second glyph can be - // first glyph in the next pair - glyphIterator->prev(); - return 1; - } - - return 0; -} - -le_uint32 PairPositioningFormat2Subtable::process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID firstGlyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, firstGlyph, success); - - if (LE_FAILURE(success)) { - return 0; - } - - GlyphIterator tempIterator(*glyphIterator); - - if (coverageIndex >= 0 && glyphIterator->next()) { - LEGlyphID secondGlyph = glyphIterator->getCurrGlyphID(); - const LEReferenceTo<ClassDefinitionTable> classDef1(base, success, SWAPW(classDef1Offset)); - const LEReferenceTo<ClassDefinitionTable> classDef2(base, success, SWAPW(classDef2Offset)); - le_int32 class1 = classDef1->getGlyphClass(classDef1, firstGlyph, success); - le_int32 class2 = classDef2->getGlyphClass(classDef2, secondGlyph, success); - le_int16 valueRecord1Size = ValueRecord::getSize(SWAPW(valueFormat1)); - le_int16 valueRecord2Size = ValueRecord::getSize(SWAPW(valueFormat2)); - le_int16 class2RecordSize = valueRecord1Size + valueRecord2Size; - le_int16 class1RecordSize = class2RecordSize * SWAPW(class2Count); - const LEReferenceTo<Class1Record> class1Record(base, success, (const Class1Record *) ((char *) class1RecordArray + (class1RecordSize * class1))); - const LEReferenceTo<Class2Record> class2Record(base, success, (const Class2Record *) ((char *) class1Record->class2RecordArray + (class2RecordSize * class2))); - - if( LE_SUCCESS(success) ) { - if (valueFormat1 != 0) { - class2Record->valueRecord1.adjustPosition(SWAPW(valueFormat1), base, tempIterator, fontInstance, success); - } - if (valueFormat2 != 0) { - const LEReferenceTo<ValueRecord> valueRecord2(base, success, ((char *) &class2Record->valueRecord1) + valueRecord1Size); - LEReferenceTo<PairPositioningFormat2Subtable> thisRef(base, success, this); - if(LE_SUCCESS(success)) { - valueRecord2->adjustPosition(SWAPW(valueFormat2), thisRef, *glyphIterator, fontInstance, success); - } - } - } - - // back up glyphIterator so second glyph can be - // first glyph in the next pair - glyphIterator->prev(); - return 1; - } - - return 0; -} - -LEReferenceTo<PairValueRecord> -PairPositioningFormat1Subtable::findPairValueRecord(TTGlyphID glyphID, LEReferenceTo<PairValueRecord>& records, - le_uint16 recordCount, - le_uint16 recordSize, LEErrorCode &success) const -{ -#if 1 - // The OpenType spec. says that the ValueRecord table is - // sorted by secondGlyph. Unfortunately, there are fonts - // around that have an unsorted ValueRecord table. - LEReferenceTo<PairValueRecord> record(records); - - for(le_int32 r = 0; r < recordCount; r += 1) { - if (r > 0) { - record.addOffset(recordSize, success); - } - if(LE_FAILURE(success)) return LEReferenceTo<PairValueRecord>(); - if (SWAPW(record->secondGlyph) == glyphID) { - return record; - } - } -#else - #error dead code - not updated. - le_uint8 bit = OpenTypeUtilities::highBit(recordCount); - le_uint16 power = 1 << bit; - le_uint16 extra = (recordCount - power) * recordSize; - le_uint16 probe = power * recordSize; - const PairValueRecord *record = records; - const PairValueRecord *trial = (const PairValueRecord *) ((char *) record + extra); - - if (SWAPW(trial->secondGlyph) <= glyphID) { - record = trial; - } - - while (probe > recordSize) { - probe >>= 1; - trial = (const PairValueRecord *) ((char *) record + probe); - - if (SWAPW(trial->secondGlyph) <= glyphID) { - record = trial; - } - } - - if (SWAPW(record->secondGlyph) == glyphID) { - return record; - } -#endif - - return LEReferenceTo<PairValueRecord>(); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/PairPositioningSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __PAIRPOSITIONINGSUBTABLES_H -#define __PAIRPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "ValueRecords.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -// NOTE: ValueRecord has a variable size -struct PairValueRecord -{ - TTGlyphID secondGlyph; - ValueRecord valueRecord1; -// ValueRecord valueRecord2; -}; - -struct PairSetTable -{ - le_uint16 pairValueCount; - PairValueRecord pairValueRecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(PairSetTable, pairValueRecordArray) - -struct PairPositioningSubtable : GlyphPositioningSubtable -{ - ValueFormat valueFormat1; - ValueFormat valueFormat2; - - le_uint32 process(const LEReferenceTo<PairPositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; - -struct PairPositioningFormat1Subtable : PairPositioningSubtable -{ - le_uint16 pairSetCount; - Offset pairSetTableOffsetArray[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<PairPositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; - -private: - LEReferenceTo<PairValueRecord> findPairValueRecord(TTGlyphID glyphID, LEReferenceTo<PairValueRecord> &records, - le_uint16 recordCount, le_uint16 recordSize, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(PairPositioningFormat1Subtable, pairSetTableOffsetArray) - -// NOTE: ValueRecord has a variable size -struct Class2Record -{ - ValueRecord valueRecord1; -// ValueRecord valurRecord2; -}; - -struct Class1Record -{ - Class2Record class2RecordArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(Class1Record, class2RecordArray) - -struct PairPositioningFormat2Subtable : PairPositioningSubtable -{ - Offset classDef1Offset; - Offset classDef2Offset; - le_uint16 class1Count; - le_uint16 class2Count; - Class1Record class1RecordArray[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<PairPositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(PairPositioningFormat2Subtable, class1RecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguage.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "OpenTypeUtilities.h" -#include "ScriptAndLanguage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -LEReferenceTo<LangSysTable> ScriptTable::findLanguage(const LETableReference& base, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const -{ - le_uint16 count = SWAPW(langSysCount); - Offset langSysTableOffset = exactMatch? 0 : SWAPW(defaultLangSysTableOffset); - - if (count > 0) { - LEReferenceToArrayOf<TagAndOffsetRecord> langSysRecords(base, success, langSysRecordArray, count); - Offset foundOffset = - OpenTypeUtilities::getTagOffset(languageTag, langSysRecords, success); - - if (foundOffset != 0 && LE_SUCCESS(success)) { - langSysTableOffset = foundOffset; - } - } - - if (langSysTableOffset != 0) { - return LEReferenceTo<LangSysTable>(base, success, langSysTableOffset); - } - - return LEReferenceTo<LangSysTable>(); -} - -LEReferenceTo<ScriptTable> ScriptListTable::findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const -{ - if (LE_FAILURE(success) ) { - return LEReferenceTo<ScriptTable>(); // get out - } - /* - * There are some fonts that have a large, bogus value for scriptCount. To try - * and protect against this, we use the offset in the first scriptRecord, - * which we know has to be past the end of the scriptRecordArray, to compute - * a value which is greater than or equal to the actual script count. - * - * Note: normally, the first offset will point to just after the scriptRecordArray, - * but there's no guarantee of this, only that it's *after* the scriptRecordArray. - * Because of this, a binary serach isn't safe, because the new count may include - * data that's not actually in the scriptRecordArray and hence the array will appear - * to be unsorted. - */ - le_uint16 count = SWAPW(scriptCount); - - if (count == 0) { - return LEReferenceTo<ScriptTable>(); // no items, no search - } - - // attempt to construct a ref with at least one element - LEReferenceToArrayOf<ScriptRecord> oneElementTable(base, success, &scriptRecordArray[0], 1); - - if( LE_FAILURE(success) ) { - return LEReferenceTo<ScriptTable>(); // couldn't even read the first record - bad font. - } - - le_uint16 limit = ((SWAPW(scriptRecordArray[0].offset) - sizeof(ScriptListTable)) / sizeof(scriptRecordArray)) + ANY_NUMBER; - Offset scriptTableOffset = 0; - - - if (count > limit) { - // the scriptCount value is bogus; do a linear search - // because limit may still be too large. - LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], limit); - for(le_int32 s = 0; (s < limit)&&LE_SUCCESS(success); s += 1) { - if (SWAPT(scriptRecordArrayRef(s,success).tag) == scriptTag) { - scriptTableOffset = SWAPW(scriptRecordArrayRef(s,success).offset); - break; - } - } - } else { - LEReferenceToArrayOf<ScriptRecord> scriptRecordArrayRef(base, success, &scriptRecordArray[0], count); - - scriptTableOffset = OpenTypeUtilities::getTagOffset(scriptTag, scriptRecordArrayRef, success); - } - - if (scriptTableOffset != 0) { - return LEReferenceTo<ScriptTable>(base, success, scriptTableOffset); - } - - return LEReferenceTo<ScriptTable>(); -} - -LEReferenceTo<LangSysTable> ScriptListTable::findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch) const -{ - const LEReferenceTo<ScriptTable> scriptTable = findScript(base, scriptTag, success); - - if (scriptTable.isEmpty()) { - return LEReferenceTo<LangSysTable>(); - } - - return scriptTable->findLanguage(scriptTable, languageTag, success, exactMatch).reparent(base); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguage.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SCRIPTANDLANGUAGE_H -#define __SCRIPTANDLANGUAGE_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -typedef TagAndOffsetRecord LangSysRecord; - -struct LangSysTable -{ - Offset lookupOrderOffset; - le_uint16 reqFeatureIndex; - le_uint16 featureCount; - le_uint16 featureIndexArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(LangSysTable, featureIndexArray) - -struct ScriptTable -{ - Offset defaultLangSysTableOffset; - le_uint16 langSysCount; - LangSysRecord langSysRecordArray[ANY_NUMBER]; - - LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; -}; -LE_VAR_ARRAY(ScriptTable, langSysRecordArray) - -typedef TagAndOffsetRecord ScriptRecord; - -struct ScriptListTable -{ - le_uint16 scriptCount; - ScriptRecord scriptRecordArray[ANY_NUMBER]; - - LEReferenceTo<ScriptTable> findScript(const LETableReference &base, LETag scriptTag, LEErrorCode &success) const; - LEReferenceTo<LangSysTable> findLanguage(const LETableReference &base, LETag scriptTag, LETag languageTag, LEErrorCode &success, le_bool exactMatch = FALSE) const; -}; -LE_VAR_ARRAY(ScriptListTable, scriptRecordArray) - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguageTags.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,279 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 10/26/2010 02:53:33 PM PDT - */ - -#include "LEScripts.h" -#include "LETypes.h" -#include "ScriptAndLanguageTags.h" -#include "OpenTypeLayoutEngine.h" - -U_NAMESPACE_BEGIN - -const LETag OpenTypeLayoutEngine::scriptTags[scriptCodeCount] = { - zyyyScriptTag, /* 'zyyy' (COMMON) */ - zinhScriptTag, /* 'zinh' (INHERITED) */ - arabScriptTag, /* 'arab' (ARABIC) */ - armnScriptTag, /* 'armn' (ARMENIAN) */ - bengScriptTag, /* 'beng' (BENGALI) */ - bopoScriptTag, /* 'bopo' (BOPOMOFO) */ - cherScriptTag, /* 'cher' (CHEROKEE) */ - coptScriptTag, /* 'copt' (COPTIC) */ - cyrlScriptTag, /* 'cyrl' (CYRILLIC) */ - dsrtScriptTag, /* 'dsrt' (DESERET) */ - devaScriptTag, /* 'deva' (DEVANAGARI) */ - ethiScriptTag, /* 'ethi' (ETHIOPIC) */ - georScriptTag, /* 'geor' (GEORGIAN) */ - gothScriptTag, /* 'goth' (GOTHIC) */ - grekScriptTag, /* 'grek' (GREEK) */ - gujrScriptTag, /* 'gujr' (GUJARATI) */ - guruScriptTag, /* 'guru' (GURMUKHI) */ - haniScriptTag, /* 'hani' (HAN) */ - hangScriptTag, /* 'hang' (HANGUL) */ - hebrScriptTag, /* 'hebr' (HEBREW) */ - hiraScriptTag, /* 'hira' (HIRAGANA) */ - kndaScriptTag, /* 'knda' (KANNADA) */ - kanaScriptTag, /* 'kana' (KATAKANA) */ - khmrScriptTag, /* 'khmr' (KHMER) */ - laooScriptTag, /* 'lao ' (LAO) */ - latnScriptTag, /* 'latn' (LATIN) */ - mlymScriptTag, /* 'mlym' (MALAYALAM) */ - mongScriptTag, /* 'mong' (MONGOLIAN) */ - mymrScriptTag, /* 'mymr' (MYANMAR) */ - ogamScriptTag, /* 'ogam' (OGHAM) */ - italScriptTag, /* 'ital' (OLD_ITALIC) */ - oryaScriptTag, /* 'orya' (ORIYA) */ - runrScriptTag, /* 'runr' (RUNIC) */ - sinhScriptTag, /* 'sinh' (SINHALA) */ - syrcScriptTag, /* 'syrc' (SYRIAC) */ - tamlScriptTag, /* 'taml' (TAMIL) */ - teluScriptTag, /* 'telu' (TELUGU) */ - thaaScriptTag, /* 'thaa' (THAANA) */ - thaiScriptTag, /* 'thai' (THAI) */ - tibtScriptTag, /* 'tibt' (TIBETAN) */ - cansScriptTag, /* 'cans' (CANADIAN_ABORIGINAL) */ - yiiiScriptTag, /* 'yi ' (YI) */ - tglgScriptTag, /* 'tglg' (TAGALOG) */ - hanoScriptTag, /* 'hano' (HANUNOO) */ - buhdScriptTag, /* 'buhd' (BUHID) */ - tagbScriptTag, /* 'tagb' (TAGBANWA) */ - braiScriptTag, /* 'brai' (BRAILLE) */ - cprtScriptTag, /* 'cprt' (CYPRIOT) */ - limbScriptTag, /* 'limb' (LIMBU) */ - linbScriptTag, /* 'linb' (LINEAR_B) */ - osmaScriptTag, /* 'osma' (OSMANYA) */ - shawScriptTag, /* 'shaw' (SHAVIAN) */ - taleScriptTag, /* 'tale' (TAI_LE) */ - ugarScriptTag, /* 'ugar' (UGARITIC) */ - hrktScriptTag, /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ - bugiScriptTag, /* 'bugi' (BUGINESE) */ - glagScriptTag, /* 'glag' (GLAGOLITIC) */ - kharScriptTag, /* 'khar' (KHAROSHTHI) */ - syloScriptTag, /* 'sylo' (SYLOTI_NAGRI) */ - taluScriptTag, /* 'talu' (NEW_TAI_LUE) */ - tfngScriptTag, /* 'tfng' (TIFINAGH) */ - xpeoScriptTag, /* 'xpeo' (OLD_PERSIAN) */ - baliScriptTag, /* 'bali' (BALINESE) */ - batkScriptTag, /* 'batk' (BATAK) */ - blisScriptTag, /* 'blis' (BLIS) */ - brahScriptTag, /* 'brah' (BRAHMI) */ - chamScriptTag, /* 'cham' (CHAM) */ - cirtScriptTag, /* 'cirt' (CIRT) */ - cyrsScriptTag, /* 'cyrs' (CYRS) */ - egydScriptTag, /* 'egyd' (EGYD) */ - egyhScriptTag, /* 'egyh' (EGYH) */ - egypScriptTag, /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ - geokScriptTag, /* 'geok' (GEOK) */ - hansScriptTag, /* 'hans' (HANS) */ - hantScriptTag, /* 'hant' (HANT) */ - hmngScriptTag, /* 'hmng' (HMNG) */ - hungScriptTag, /* 'hung' (HUNG) */ - indsScriptTag, /* 'inds' (INDS) */ - javaScriptTag, /* 'java' (JAVANESE) */ - kaliScriptTag, /* 'kali' (KAYAH_LI) */ - latfScriptTag, /* 'latf' (LATF) */ - latgScriptTag, /* 'latg' (LATG) */ - lepcScriptTag, /* 'lepc' (LEPCHA) */ - linaScriptTag, /* 'lina' (LINA) */ - mandScriptTag, /* 'mand' (MANDAIC) */ - mayaScriptTag, /* 'maya' (MAYA) */ - meroScriptTag, /* 'mero' (MEROITIC_HIEROGLYPHS) */ - nkooScriptTag, /* 'nko ' (NKO) */ - orkhScriptTag, /* 'orkh' (OLD_TURKIC) */ - permScriptTag, /* 'perm' (PERM) */ - phagScriptTag, /* 'phag' (PHAGS_PA) */ - phnxScriptTag, /* 'phnx' (PHOENICIAN) */ - plrdScriptTag, /* 'plrd' (MIAO/POLLARD) */ - roroScriptTag, /* 'roro' (RORO) */ - saraScriptTag, /* 'sara' (SARA) */ - syreScriptTag, /* 'syre' (SYRE) */ - syrjScriptTag, /* 'syrj' (SYRJ) */ - syrnScriptTag, /* 'syrn' (SYRN) */ - tengScriptTag, /* 'teng' (TENG) */ - vaiiScriptTag, /* 'vai ' (VAI) */ - vispScriptTag, /* 'visp' (VISP) */ - xsuxScriptTag, /* 'xsux' (CUNEIFORM) */ - zxxxScriptTag, /* 'zxxx' (ZXXX) */ - zzzzScriptTag, /* 'zzzz' (UNKNOWN) */ - cariScriptTag, /* 'cari' (CARIAN) */ - jpanScriptTag, /* 'jpan' (JPAN) */ - lanaScriptTag, /* 'lana' (TAI_THAM) */ - lyciScriptTag, /* 'lyci' (LYCIAN) */ - lydiScriptTag, /* 'lydi' (LYDIAN) */ - olckScriptTag, /* 'olck' (OL_CHIKI) */ - rjngScriptTag, /* 'rjng' (REJANG) */ - saurScriptTag, /* 'saur' (SAURASHTRA) */ - sgnwScriptTag, /* 'sgnw' (SGNW) */ - sundScriptTag, /* 'sund' (SUNDANESE) */ - moonScriptTag, /* 'moon' (MOON) */ - mteiScriptTag, /* 'mtei' (MEETEI_MAYEK) */ - armiScriptTag, /* 'armi' (IMPERIAL_ARAMAIC) */ - avstScriptTag, /* 'avst' (AVESTAN) */ - cakmScriptTag, /* 'cakm' (CHAKMA) */ - koreScriptTag, /* 'kore' (KORE) */ - kthiScriptTag, /* 'kthi' (KAITHI) */ - maniScriptTag, /* 'mani' (MANI) */ - phliScriptTag, /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ - phlpScriptTag, /* 'phlp' (PHLP) */ - phlvScriptTag, /* 'phlv' (PHLV) */ - prtiScriptTag, /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ - samrScriptTag, /* 'samr' (SAMARITAN) */ - tavtScriptTag, /* 'tavt' (TAI_VIET) */ - zmthScriptTag, /* 'zmth' (ZMTH) */ - zsymScriptTag, /* 'zsym' (ZSYM) */ - bamuScriptTag, /* 'bamu' (BAMUM) */ - lisuScriptTag, /* 'lisu' (LISU) */ - nkgbScriptTag, /* 'nkgb' (NKGB) */ - sarbScriptTag, /* 'sarb' (OLD_SOUTH_ARABIAN) */ - bassScriptTag, /* 'bass' (BASS) */ - duplScriptTag, /* 'dupl' (DUPL) */ - elbaScriptTag, /* 'elba' (ELBA) */ - granScriptTag, /* 'gran' (GRAN) */ - kpelScriptTag, /* 'kpel' (KPEL) */ - lomaScriptTag, /* 'loma' (LOMA) */ - mendScriptTag, /* 'mend' (MEND) */ - mercScriptTag, /* 'merc' (MEROITIC_CURSIVE) */ - narbScriptTag, /* 'narb' (NARB) */ - nbatScriptTag, /* 'nbat' (NBAT) */ - palmScriptTag, /* 'palm' (PALM) */ - sindScriptTag, /* 'sind' (SIND) */ - waraScriptTag, /* 'wara' (WARA) */ - afakScriptTag, /* 'afak' (AFAK) */ - jurcScriptTag, /* 'jurc' (JURC) */ - mrooScriptTag, /* 'mroo' (MROO) */ - nshuScriptTag, /* 'nshu' (NSHU) */ - shrdScriptTag, /* 'shrd' (SHARADA) */ - soraScriptTag, /* 'sora' (SORA_SOMPENG) */ - takrScriptTag, /* 'takr' (TAKRI) */ - tangScriptTag, /* 'tang' (TANG) */ - woleScriptTag, /* 'wole' (WOLE) */ - khojScriptTag, /* 'khoj' (KHOJ) */ - tirhScriptTag /* 'tirh' (TIRH) */ -}; - -const LETag OpenTypeLayoutEngine::languageTags[] = { - nullLanguageTag, /* '' (null) */ - araLanguageTag, /* 'ARA' (Arabic) */ - asmLanguageTag, /* 'ASM' (Assamese) */ - benLanguageTag, /* 'BEN' (Bengali) */ - farLanguageTag, /* 'FAR' (Farsi) */ - gujLanguageTag, /* 'GUJ' (Gujarati) */ - hinLanguageTag, /* 'HIN' (Hindi) */ - iwrLanguageTag, /* 'IWR' (Hebrew) */ - jiiLanguageTag, /* 'JII' (Yiddish) */ - janLanguageTag, /* 'JAN' (Japanese) */ - kanLanguageTag, /* 'KAN' (Kannada) */ - kokLanguageTag, /* 'KOK' (Konkani) */ - korLanguageTag, /* 'KOR' (Korean) */ - kshLanguageTag, /* 'KSH' (Kashmiri) */ - malLanguageTag, /* 'MAL' (Malayalam (Traditional)) */ - marLanguageTag, /* 'MAR' (Marathi) */ - mlrLanguageTag, /* 'MLR' (Malayalam (Reformed)) */ - mniLanguageTag, /* 'MNI' (Manipuri) */ - oriLanguageTag, /* 'ORI' (Oriya) */ - sanLanguageTag, /* 'SAN' (Sanscrit) */ - sndLanguageTag, /* 'SND' (Sindhi) */ - snhLanguageTag, /* 'SNH' (Sinhalese) */ - syrLanguageTag, /* 'SYR' (Syriac) */ - tamLanguageTag, /* 'TAM' (Tamil) */ - telLanguageTag, /* 'TEL' (Telugu) */ - thaLanguageTag, /* 'THA' (Thai) */ - urdLanguageTag, /* 'URD' (Urdu) */ - zhpLanguageTag, /* 'ZHP' (Chinese (Phonetic)) */ - zhsLanguageTag, /* 'ZHS' (Chinese (Simplified)) */ - zhtLanguageTag, /* 'ZHT' (Chinese (Traditional)) */ - afkLanguageTag, /* 'AFK' (Afrikaans) */ - belLanguageTag, /* 'BEL' (Belarussian) */ - bgrLanguageTag, /* 'BGR' (Bulgarian) */ - catLanguageTag, /* 'CAT' (Catalan) */ - cheLanguageTag, /* 'CHE' (Chechen) */ - copLanguageTag, /* 'COP' (Coptic) */ - csyLanguageTag, /* 'CSY' (Czech) */ - danLanguageTag, /* 'DAN' (Danish) */ - deuLanguageTag, /* 'DEU' (German) */ - dznLanguageTag, /* 'DZN' (Dzongkha) */ - ellLanguageTag, /* 'ELL' (Greek) */ - engLanguageTag, /* 'ENG' (English) */ - espLanguageTag, /* 'ESP' (Spanish) */ - etiLanguageTag, /* 'ETI' (Estonian) */ - euqLanguageTag, /* 'EUQ' (Basque) */ - finLanguageTag, /* 'FIN' (Finnish) */ - fraLanguageTag, /* 'FRA' (French) */ - gaeLanguageTag, /* 'GAE' (Gaelic) */ - hauLanguageTag, /* 'HAU' (Hausa) */ - hrvLanguageTag, /* 'HRV' (Croation) */ - hunLanguageTag, /* 'HUN' (Hungarian) */ - hyeLanguageTag, /* 'HYE' (Armenian) */ - indLanguageTag, /* 'IND' (Indonesian) */ - itaLanguageTag, /* 'ITA' (Italian) */ - khmLanguageTag, /* 'KHM' (Khmer) */ - mngLanguageTag, /* 'MNG' (Mongolian) */ - mtsLanguageTag, /* 'MTS' (Maltese) */ - nepLanguageTag, /* 'NEP' (Nepali) */ - nldLanguageTag, /* 'NLD' (Dutch) */ - pasLanguageTag, /* 'PAS' (Pashto) */ - plkLanguageTag, /* 'PLK' (Polish) */ - ptgLanguageTag, /* 'PTG' (Portuguese) */ - romLanguageTag, /* 'ROM' (Romanian) */ - rusLanguageTag, /* 'RUS' (Russian) */ - skyLanguageTag, /* 'SKY' (Slovak) */ - slvLanguageTag, /* 'SLV' (Slovenian) */ - sqiLanguageTag, /* 'SQI' (Albanian) */ - srbLanguageTag, /* 'SRB' (Serbian) */ - sveLanguageTag, /* 'SVE' (Swedish) */ - tibLanguageTag, /* 'TIB' (Tibetan) */ - trkLanguageTag, /* 'TRK' (Turkish) */ - welLanguageTag /* 'WEL' (Welsh) */ -}; - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguageTags.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,294 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 10/26/2010 02:53:33 PM PDT - */ - -#ifndef __SCRIPTANDLANGUAGES_H -#define __SCRIPTANDLANGUAGES_H - -#include "LETypes.h" - -/** - * \file - * \internal - */ - -U_NAMESPACE_BEGIN - -const LETag zyyyScriptTag = 0x7A797979; /* 'zyyy' (COMMON) */ -const LETag zinhScriptTag = 0x7A696E68; /* 'zinh' (INHERITED) */ -const LETag arabScriptTag = 0x61726162; /* 'arab' (ARABIC) */ -const LETag armnScriptTag = 0x61726D6E; /* 'armn' (ARMENIAN) */ -const LETag bengScriptTag = 0x62656E67; /* 'beng' (BENGALI) */ -const LETag bng2ScriptTag = 0x626E6732; /* 'bng2' (BENGALI v.2) (manually added) */ -const LETag bopoScriptTag = 0x626F706F; /* 'bopo' (BOPOMOFO) */ -const LETag cherScriptTag = 0x63686572; /* 'cher' (CHEROKEE) */ -const LETag coptScriptTag = 0x636F7074; /* 'copt' (COPTIC) */ -const LETag cyrlScriptTag = 0x6379726C; /* 'cyrl' (CYRILLIC) */ -const LETag dsrtScriptTag = 0x64737274; /* 'dsrt' (DESERET) */ -const LETag devaScriptTag = 0x64657661; /* 'deva' (DEVANAGARI) */ -const LETag dev2ScriptTag = 0x64657632; /* 'dev2' (DEVANAGARI v.2) (manually added) */ -const LETag ethiScriptTag = 0x65746869; /* 'ethi' (ETHIOPIC) */ -const LETag georScriptTag = 0x67656F72; /* 'geor' (GEORGIAN) */ -const LETag gothScriptTag = 0x676F7468; /* 'goth' (GOTHIC) */ -const LETag grekScriptTag = 0x6772656B; /* 'grek' (GREEK) */ -const LETag gujrScriptTag = 0x67756A72; /* 'gujr' (GUJARATI) */ -const LETag gjr2ScriptTag = 0x676A7232; /* 'gjr2' (GUJARATI v.2) (manually added) */ -const LETag guruScriptTag = 0x67757275; /* 'guru' (GURMUKHI) */ -const LETag gur2ScriptTag = 0x67757232; /* 'gur2' (GURMUKHI v.2) (manually added) */ -const LETag haniScriptTag = 0x68616E69; /* 'hani' (HAN) */ -const LETag hangScriptTag = 0x68616E67; /* 'hang' (HANGUL) */ -const LETag hebrScriptTag = 0x68656272; /* 'hebr' (HEBREW) */ -const LETag hiraScriptTag = 0x68697261; /* 'hira' (HIRAGANA) */ -const LETag kndaScriptTag = 0x6B6E6461; /* 'knda' (KANNADA) */ -const LETag knd2ScriptTag = 0x6B6E6432; /* 'knd2' (KANNADA v.2) (manually added) */ -const LETag kanaScriptTag = 0x6B616E61; /* 'kana' (KATAKANA) */ -const LETag khmrScriptTag = 0x6B686D72; /* 'khmr' (KHMER) */ -const LETag laooScriptTag = 0x6C616F20; /* 'lao ' (LAO) */ -const LETag latnScriptTag = 0x6C61746E; /* 'latn' (LATIN) */ -const LETag mlymScriptTag = 0x6D6C796D; /* 'mlym' (MALAYALAM) */ -const LETag mlm2ScriptTag = 0x6D6C6D32; /* 'mlm2' (MALAYALAM v.2) (manually added) */ -const LETag mongScriptTag = 0x6D6F6E67; /* 'mong' (MONGOLIAN) */ -const LETag mymrScriptTag = 0x6D796D72; /* 'mymr' (MYANMAR) */ -const LETag ogamScriptTag = 0x6F67616D; /* 'ogam' (OGHAM) */ -const LETag italScriptTag = 0x6974616C; /* 'ital' (OLD_ITALIC) */ -const LETag oryaScriptTag = 0x6F727961; /* 'orya' (ORIYA) */ -const LETag ory2ScriptTag = 0x6F727932; /* 'ory2' (ORIYA v.2) (manually added) */ -const LETag runrScriptTag = 0x72756E72; /* 'runr' (RUNIC) */ -const LETag sinhScriptTag = 0x73696E68; /* 'sinh' (SINHALA) */ -const LETag syrcScriptTag = 0x73797263; /* 'syrc' (SYRIAC) */ -const LETag tamlScriptTag = 0x74616D6C; /* 'taml' (TAMIL) */ -const LETag tml2ScriptTag = 0x746D6C32; /* 'tml2' (TAMIL v.2) (manually added) */ -const LETag teluScriptTag = 0x74656C75; /* 'telu' (TELUGU) */ -const LETag tel2ScriptTag = 0x74656C32; /* 'tel2' (TELUGU v.2) (manually added) */ -const LETag thaaScriptTag = 0x74686161; /* 'thaa' (THAANA) */ -const LETag thaiScriptTag = 0x74686169; /* 'thai' (THAI) */ -const LETag tibtScriptTag = 0x74696274; /* 'tibt' (TIBETAN) */ -const LETag cansScriptTag = 0x63616E73; /* 'cans' (CANADIAN_ABORIGINAL) */ -const LETag yiiiScriptTag = 0x79692020; /* 'yi ' (YI) */ -const LETag tglgScriptTag = 0x74676C67; /* 'tglg' (TAGALOG) */ -const LETag hanoScriptTag = 0x68616E6F; /* 'hano' (HANUNOO) */ -const LETag buhdScriptTag = 0x62756864; /* 'buhd' (BUHID) */ -const LETag tagbScriptTag = 0x74616762; /* 'tagb' (TAGBANWA) */ -const LETag braiScriptTag = 0x62726169; /* 'brai' (BRAILLE) */ -const LETag cprtScriptTag = 0x63707274; /* 'cprt' (CYPRIOT) */ -const LETag limbScriptTag = 0x6C696D62; /* 'limb' (LIMBU) */ -const LETag linbScriptTag = 0x6C696E62; /* 'linb' (LINEAR_B) */ -const LETag osmaScriptTag = 0x6F736D61; /* 'osma' (OSMANYA) */ -const LETag shawScriptTag = 0x73686177; /* 'shaw' (SHAVIAN) */ -const LETag taleScriptTag = 0x74616C65; /* 'tale' (TAI_LE) */ -const LETag ugarScriptTag = 0x75676172; /* 'ugar' (UGARITIC) */ -const LETag hrktScriptTag = 0x68726B74; /* 'hrkt' (KATAKANA_OR_HIRAGANA) */ -const LETag bugiScriptTag = 0x62756769; /* 'bugi' (BUGINESE) */ -const LETag glagScriptTag = 0x676C6167; /* 'glag' (GLAGOLITIC) */ -const LETag kharScriptTag = 0x6B686172; /* 'khar' (KHAROSHTHI) */ -const LETag syloScriptTag = 0x73796C6F; /* 'sylo' (SYLOTI_NAGRI) */ -const LETag taluScriptTag = 0x74616C75; /* 'talu' (NEW_TAI_LUE) */ -const LETag tfngScriptTag = 0x74666E67; /* 'tfng' (TIFINAGH) */ -const LETag xpeoScriptTag = 0x7870656F; /* 'xpeo' (OLD_PERSIAN) */ -const LETag baliScriptTag = 0x62616C69; /* 'bali' (BALINESE) */ -const LETag batkScriptTag = 0x6261746B; /* 'batk' (BATAK) */ -const LETag blisScriptTag = 0x626C6973; /* 'blis' (BLIS) */ -const LETag brahScriptTag = 0x62726168; /* 'brah' (BRAHMI) */ -const LETag chamScriptTag = 0x6368616D; /* 'cham' (CHAM) */ -const LETag cirtScriptTag = 0x63697274; /* 'cirt' (CIRT) */ -const LETag cyrsScriptTag = 0x63797273; /* 'cyrs' (CYRS) */ -const LETag egydScriptTag = 0x65677964; /* 'egyd' (EGYD) */ -const LETag egyhScriptTag = 0x65677968; /* 'egyh' (EGYH) */ -const LETag egypScriptTag = 0x65677970; /* 'egyp' (EGYPTIAN_HIEROGLYPHS) */ -const LETag geokScriptTag = 0x67656F6B; /* 'geok' (GEOK) */ -const LETag hansScriptTag = 0x68616E73; /* 'hans' (HANS) */ -const LETag hantScriptTag = 0x68616E74; /* 'hant' (HANT) */ -const LETag hmngScriptTag = 0x686D6E67; /* 'hmng' (HMNG) */ -const LETag hungScriptTag = 0x68756E67; /* 'hung' (HUNG) */ -const LETag indsScriptTag = 0x696E6473; /* 'inds' (INDS) */ -const LETag javaScriptTag = 0x6A617661; /* 'java' (JAVANESE) */ -const LETag kaliScriptTag = 0x6B616C69; /* 'kali' (KAYAH_LI) */ -const LETag latfScriptTag = 0x6C617466; /* 'latf' (LATF) */ -const LETag latgScriptTag = 0x6C617467; /* 'latg' (LATG) */ -const LETag lepcScriptTag = 0x6C657063; /* 'lepc' (LEPCHA) */ -const LETag linaScriptTag = 0x6C696E61; /* 'lina' (LINA) */ -const LETag mandScriptTag = 0x6D616E64; /* 'mand' (MANDAIC) */ -const LETag mayaScriptTag = 0x6D617961; /* 'maya' (MAYA) */ -const LETag meroScriptTag = 0x6D65726F; /* 'mero' (MEROITIC_HIEROGLYPHS) */ -const LETag nkooScriptTag = 0x6E6B6F20; /* 'nko ' (NKO) */ -const LETag orkhScriptTag = 0x6F726B68; /* 'orkh' (OLD_TURKIC) */ -const LETag permScriptTag = 0x7065726D; /* 'perm' (PERM) */ -const LETag phagScriptTag = 0x70686167; /* 'phag' (PHAGS_PA) */ -const LETag phnxScriptTag = 0x70686E78; /* 'phnx' (PHOENICIAN) */ -const LETag plrdScriptTag = 0x706C7264; /* 'plrd' (MIAO) */ -const LETag roroScriptTag = 0x726F726F; /* 'roro' (RORO) */ -const LETag saraScriptTag = 0x73617261; /* 'sara' (SARA) */ -const LETag syreScriptTag = 0x73797265; /* 'syre' (SYRE) */ -const LETag syrjScriptTag = 0x7379726A; /* 'syrj' (SYRJ) */ -const LETag syrnScriptTag = 0x7379726E; /* 'syrn' (SYRN) */ -const LETag tengScriptTag = 0x74656E67; /* 'teng' (TENG) */ -const LETag vaiiScriptTag = 0x76616920; /* 'vai ' (VAI) */ -const LETag vispScriptTag = 0x76697370; /* 'visp' (VISP) */ -const LETag xsuxScriptTag = 0x78737578; /* 'xsux' (CUNEIFORM) */ -const LETag zxxxScriptTag = 0x7A787878; /* 'zxxx' (ZXXX) */ -const LETag zzzzScriptTag = 0x7A7A7A7A; /* 'zzzz' (UNKNOWN) */ -const LETag cariScriptTag = 0x63617269; /* 'cari' (CARIAN) */ -const LETag jpanScriptTag = 0x6A70616E; /* 'jpan' (JPAN) */ -const LETag lanaScriptTag = 0x6C616E61; /* 'lana' (TAI_THAM) */ -const LETag lyciScriptTag = 0x6C796369; /* 'lyci' (LYCIAN) */ -const LETag lydiScriptTag = 0x6C796469; /* 'lydi' (LYDIAN) */ -const LETag olckScriptTag = 0x6F6C636B; /* 'olck' (OL_CHIKI) */ -const LETag rjngScriptTag = 0x726A6E67; /* 'rjng' (REJANG) */ -const LETag saurScriptTag = 0x73617572; /* 'saur' (SAURASHTRA) */ -const LETag sgnwScriptTag = 0x73676E77; /* 'sgnw' (SGNW) */ -const LETag sundScriptTag = 0x73756E64; /* 'sund' (SUNDANESE) */ -const LETag moonScriptTag = 0x6D6F6F6E; /* 'moon' (MOON) */ -const LETag mteiScriptTag = 0x6D746569; /* 'mtei' (MEETEI_MAYEK) */ -const LETag armiScriptTag = 0x61726D69; /* 'armi' (IMPERIAL_ARAMAIC) */ -const LETag avstScriptTag = 0x61767374; /* 'avst' (AVESTAN) */ -const LETag cakmScriptTag = 0x63616B6D; /* 'cakm' (CHAKMA) */ -const LETag koreScriptTag = 0x6B6F7265; /* 'kore' (KORE) */ -const LETag kthiScriptTag = 0x6B746869; /* 'kthi' (KAITHI) */ -const LETag maniScriptTag = 0x6D616E69; /* 'mani' (MANI) */ -const LETag phliScriptTag = 0x70686C69; /* 'phli' (INSCRIPTIONAL_PAHLAVI) */ -const LETag phlpScriptTag = 0x70686C70; /* 'phlp' (PHLP) */ -const LETag phlvScriptTag = 0x70686C76; /* 'phlv' (PHLV) */ -const LETag prtiScriptTag = 0x70727469; /* 'prti' (INSCRIPTIONAL_PARTHIAN) */ -const LETag samrScriptTag = 0x73616D72; /* 'samr' (SAMARITAN) */ -const LETag tavtScriptTag = 0x74617674; /* 'tavt' (TAI_VIET) */ -const LETag zmthScriptTag = 0x7A6D7468; /* 'zmth' (ZMTH) */ -const LETag zsymScriptTag = 0x7A73796D; /* 'zsym' (ZSYM) */ -const LETag bamuScriptTag = 0x62616D75; /* 'bamu' (BAMUM) */ -const LETag lisuScriptTag = 0x6C697375; /* 'lisu' (LISU) */ -const LETag nkgbScriptTag = 0x6E6B6762; /* 'nkgb' (NKGB) */ -const LETag sarbScriptTag = 0x73617262; /* 'sarb' (OLD_SOUTH_ARABIAN) */ -const LETag bassScriptTag = 0x62617373; /* 'bass' (BASS) */ -const LETag duplScriptTag = 0x6475706C; /* 'dupl' (DUPL) */ -const LETag elbaScriptTag = 0x656C6261; /* 'elba' (ELBA) */ -const LETag granScriptTag = 0x6772616E; /* 'gran' (GRAN) */ -const LETag kpelScriptTag = 0x6B70656C; /* 'kpel' (KPEL) */ -const LETag lomaScriptTag = 0x6C6F6D61; /* 'loma' (LOMA) */ -const LETag mendScriptTag = 0x6D656E64; /* 'mend' (MEND) */ -const LETag mercScriptTag = 0x6D657263; /* 'merc' (MEROITIC_CURSIVE) */ -const LETag narbScriptTag = 0x6E617262; /* 'narb' (NARB) */ -const LETag nbatScriptTag = 0x6E626174; /* 'nbat' (NBAT) */ -const LETag palmScriptTag = 0x70616C6D; /* 'palm' (PALM) */ -const LETag sindScriptTag = 0x73696E64; /* 'sind' (SIND) */ -const LETag waraScriptTag = 0x77617261; /* 'wara' (WARA) */ -const LETag afakScriptTag = 0x6166616B; /* 'afak' (AFAK) */ -const LETag jurcScriptTag = 0x6A757263; /* 'jurc' (JURC) */ -const LETag mrooScriptTag = 0x6D726F6F; /* 'mroo' (MROO) */ -const LETag nshuScriptTag = 0x6E736875; /* 'nshu' (NSHU) */ -const LETag shrdScriptTag = 0x73687264; /* 'shrd' (SHARADA) */ -const LETag soraScriptTag = 0x736F7261; /* 'sora' (SORA_SOMPENG) */ -const LETag takrScriptTag = 0x74616B72; /* 'takr' (TAKRI) */ -const LETag tangScriptTag = 0x74616E67; /* 'tang' (TANG) */ -const LETag woleScriptTag = 0x776F6C65; /* 'wole' (WOLE) */ -const LETag khojScriptTag = 0x6B686F6A; /* 'khoj' (KHOJ) */ -const LETag tirhScriptTag = 0x74697268; /* 'tirh' (TIRH) */ - -const LETag nullScriptTag = 0x00000000; /* '' (NULL) */ - - -const LETag nullLanguageTag = 0x00000000; /* '' (null) */ -const LETag araLanguageTag = 0x41524120; /* 'ARA' (Arabic) */ -const LETag asmLanguageTag = 0x41534D20; /* 'ASM' (Assamese) */ -const LETag benLanguageTag = 0x42454E20; /* 'BEN' (Bengali) */ -const LETag farLanguageTag = 0x46415220; /* 'FAR' (Farsi) */ -const LETag gujLanguageTag = 0x47554A20; /* 'GUJ' (Gujarati) */ -const LETag hinLanguageTag = 0x48494E20; /* 'HIN' (Hindi) */ -const LETag iwrLanguageTag = 0x49575220; /* 'IWR' (Hebrew) */ -const LETag jiiLanguageTag = 0x4A494920; /* 'JII' (Yiddish) */ -const LETag janLanguageTag = 0x4A414E20; /* 'JAN' (Japanese) */ -const LETag kanLanguageTag = 0x4B414E20; /* 'KAN' (Kannada) */ -const LETag kokLanguageTag = 0x4B4F4B20; /* 'KOK' (Konkani) */ -const LETag korLanguageTag = 0x4B4F5220; /* 'KOR' (Korean) */ -const LETag kshLanguageTag = 0x4B534820; /* 'KSH' (Kashmiri) */ -const LETag malLanguageTag = 0x4D414C20; /* 'MAL' (Malayalam (Traditional)) */ -const LETag marLanguageTag = 0x4D415220; /* 'MAR' (Marathi) */ -const LETag mlrLanguageTag = 0x4D4C5220; /* 'MLR' (Malayalam (Reformed)) */ -const LETag mniLanguageTag = 0x4D4E4920; /* 'MNI' (Manipuri) */ -const LETag oriLanguageTag = 0x4F524920; /* 'ORI' (Oriya) */ -const LETag sanLanguageTag = 0x53414E20; /* 'SAN' (Sanscrit) */ -const LETag sndLanguageTag = 0x534E4420; /* 'SND' (Sindhi) */ -const LETag snhLanguageTag = 0x534E4820; /* 'SNH' (Sinhalese) */ -const LETag syrLanguageTag = 0x53595220; /* 'SYR' (Syriac) */ -const LETag tamLanguageTag = 0x54414D20; /* 'TAM' (Tamil) */ -const LETag telLanguageTag = 0x54454C20; /* 'TEL' (Telugu) */ -const LETag thaLanguageTag = 0x54484120; /* 'THA' (Thai) */ -const LETag urdLanguageTag = 0x55524420; /* 'URD' (Urdu) */ -const LETag zhpLanguageTag = 0x5A485020; /* 'ZHP' (Chinese (Phonetic)) */ -const LETag zhsLanguageTag = 0x5A485320; /* 'ZHS' (Chinese (Simplified)) */ -const LETag zhtLanguageTag = 0x5A485420; /* 'ZHT' (Chinese (Traditional)) */ -const LETag afkLanguageTag = 0x41464B20; /* 'AFK' (Afrikaans) */ -const LETag belLanguageTag = 0x42454C20; /* 'BEL' (Belarussian) */ -const LETag bgrLanguageTag = 0x42475220; /* 'BGR' (Bulgarian) */ -const LETag catLanguageTag = 0x43415420; /* 'CAT' (Catalan) */ -const LETag cheLanguageTag = 0x43484520; /* 'CHE' (Chechen) */ -const LETag copLanguageTag = 0x434F5020; /* 'COP' (Coptic) */ -const LETag csyLanguageTag = 0x43535920; /* 'CSY' (Czech) */ -const LETag danLanguageTag = 0x44414E20; /* 'DAN' (Danish) */ -const LETag deuLanguageTag = 0x44455520; /* 'DEU' (German) */ -const LETag dznLanguageTag = 0x445A4E20; /* 'DZN' (Dzongkha) */ -const LETag ellLanguageTag = 0x454C4C20; /* 'ELL' (Greek) */ -const LETag engLanguageTag = 0x454E4720; /* 'ENG' (English) */ -const LETag espLanguageTag = 0x45535020; /* 'ESP' (Spanish) */ -const LETag etiLanguageTag = 0x45544920; /* 'ETI' (Estonian) */ -const LETag euqLanguageTag = 0x45555120; /* 'EUQ' (Basque) */ -const LETag finLanguageTag = 0x46494E20; /* 'FIN' (Finnish) */ -const LETag fraLanguageTag = 0x46524120; /* 'FRA' (French) */ -const LETag gaeLanguageTag = 0x47414520; /* 'GAE' (Gaelic) */ -const LETag hauLanguageTag = 0x48415520; /* 'HAU' (Hausa) */ -const LETag hrvLanguageTag = 0x48525620; /* 'HRV' (Croation) */ -const LETag hunLanguageTag = 0x48554E20; /* 'HUN' (Hungarian) */ -const LETag hyeLanguageTag = 0x48594520; /* 'HYE' (Armenian) */ -const LETag indLanguageTag = 0x494E4420; /* 'IND' (Indonesian) */ -const LETag itaLanguageTag = 0x49544120; /* 'ITA' (Italian) */ -const LETag khmLanguageTag = 0x4B484D20; /* 'KHM' (Khmer) */ -const LETag mngLanguageTag = 0x4D4E4720; /* 'MNG' (Mongolian) */ -const LETag mtsLanguageTag = 0x4D545320; /* 'MTS' (Maltese) */ -const LETag nepLanguageTag = 0x4E455020; /* 'NEP' (Nepali) */ -const LETag nldLanguageTag = 0x4E4C4420; /* 'NLD' (Dutch) */ -const LETag pasLanguageTag = 0x50415320; /* 'PAS' (Pashto) */ -const LETag plkLanguageTag = 0x504C4B20; /* 'PLK' (Polish) */ -const LETag ptgLanguageTag = 0x50544720; /* 'PTG' (Portuguese) */ -const LETag romLanguageTag = 0x524F4D20; /* 'ROM' (Romanian) */ -const LETag rusLanguageTag = 0x52555320; /* 'RUS' (Russian) */ -const LETag skyLanguageTag = 0x534B5920; /* 'SKY' (Slovak) */ -const LETag slvLanguageTag = 0x534C5620; /* 'SLV' (Slovenian) */ -const LETag sqiLanguageTag = 0x53514920; /* 'SQI' (Albanian) */ -const LETag srbLanguageTag = 0x53524220; /* 'SRB' (Serbian) */ -const LETag sveLanguageTag = 0x53564520; /* 'SVE' (Swedish) */ -const LETag tibLanguageTag = 0x54494220; /* 'TIB' (Tibetan) */ -const LETag trkLanguageTag = 0x54524B20; /* 'TRK' (Turkish) */ -const LETag welLanguageTag = 0x57454C20; /* 'WEL' (Welsh) */ - - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentArrayProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "SegmentArrayProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor) - -SegmentArrayProcessor::SegmentArrayProcessor() -{ -} - -SegmentArrayProcessor::SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - segmentArrayLookupTable = LEReferenceTo<SegmentArrayLookupTable>(morphSubtableHeader, success, (const SegmentArrayLookupTable*)&header->table); -} - -SegmentArrayProcessor::~SegmentArrayProcessor() -{ -} - -void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - const LookupSegment *segments = segmentArrayLookupTable->segments; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - if (LE_FAILURE(success)) return; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success); - - if (lookupSegment != NULL) { - TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph); - le_int16 offset = SWAPW(lookupSegment->value); - - if (offset != 0) { - LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY); - if (LE_FAILURE(success)) { continue; } - TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success)); - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentArrayProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SEGMENTARRAYPROCESSOR_H -#define __SEGMENTARRAYPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SegmentArrayProcessor : public NonContextualGlyphSubstitutionProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SegmentArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SegmentArrayProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SegmentArrayProcessor(); - -protected: - LEReferenceTo<SegmentArrayLookupTable> segmentArrayLookupTable; - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentArrayProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "SegmentArrayProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor2) - -SegmentArrayProcessor2::SegmentArrayProcessor2() -{ -} - -SegmentArrayProcessor2::SegmentArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor2(morphSubtableHeader, success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - segmentArrayLookupTable = LEReferenceTo<SegmentArrayLookupTable>(morphSubtableHeader, success, &header->table); // don't parent to 'header' as it is on the stack -} - -SegmentArrayProcessor2::~SegmentArrayProcessor2() -{ -} - -void SegmentArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - const LookupSegment *segments = segmentArrayLookupTable->segments; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - if (LE_FAILURE(success)) return; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - // lookupSegment already range checked by lookupSegment() function. - const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success); - - if (lookupSegment != NULL&& LE_SUCCESS(success)) { - TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph); - TTGlyphID lastGlyph = SWAPW(lookupSegment->lastGlyph); - le_int16 offset = SWAPW(lookupSegment->value); - TTGlyphID thisGlyphId= LE_GET_GLYPH(thisGlyph); - LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, lastGlyph - firstGlyph + 1); - if (offset != 0 && thisGlyphId <= lastGlyph && thisGlyphId >= firstGlyph && LE_SUCCESS(success) ) { - TTGlyphID newGlyph = SWAPW(glyphArray[thisGlyphId]); - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentArrayProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __SEGMENTARRAYPROCESSOR_H -#define __SEGMENTARRAYPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SegmentArrayProcessor2 : public NonContextualGlyphSubstitutionProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SegmentArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SegmentArrayProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SegmentArrayProcessor2(); - -protected: - LEReferenceTo<SegmentArrayLookupTable> segmentArrayLookupTable; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentSingleProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "SegmentSingleProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor) - -SegmentSingleProcessor::SegmentSingleProcessor() -{ -} - -SegmentSingleProcessor::SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - segmentSingleLookupTable = LEReferenceTo<SegmentSingleLookupTable>(morphSubtableHeader, success, (const SegmentSingleLookupTable*)&header->table); -} - -SegmentSingleProcessor::~SegmentSingleProcessor() -{ -} - -void SegmentSingleProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - const LookupSegment *segments = segmentSingleLookupTable->segments; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - for (glyph = 0; glyph < glyphCount && LE_SUCCESS(success); glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success); - - if (lookupSegment != NULL && LE_SUCCESS(success)) { - TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value); - - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentSingleProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SEGMENTSINGLEPROCESSOR_H -#define __SEGMENTSINGLEPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SegmentSingleProcessor : public NonContextualGlyphSubstitutionProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SegmentSingleProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SegmentSingleProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SegmentSingleProcessor(); - -protected: - LEReferenceTo<SegmentSingleLookupTable> segmentSingleLookupTable; - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentSingleProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "SegmentSingleProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentSingleProcessor2) - -SegmentSingleProcessor2::SegmentSingleProcessor2() -{ -} - -SegmentSingleProcessor2::SegmentSingleProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor2(morphSubtableHeader, success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - - segmentSingleLookupTable = LEReferenceTo<SegmentSingleLookupTable>(morphSubtableHeader, success, &header->table); -} - -SegmentSingleProcessor2::~SegmentSingleProcessor2() -{ -} - -void SegmentSingleProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - const LookupSegment *segments = segmentSingleLookupTable->segments; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - if (LE_FAILURE(success)) return; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success); - - if (lookupSegment != NULL && LE_SUCCESS(success)) { - TTGlyphID newGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph) + SWAPW(lookupSegment->value); - - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SegmentSingleProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __SEGMENTSINGLEPROCESSOR_H -#define __SEGMENTSINGLEPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SegmentSingleProcessor2 : public NonContextualGlyphSubstitutionProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SegmentSingleProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SegmentSingleProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SegmentSingleProcessor2(); - -protected: - LEReferenceTo<SegmentSingleLookupTable> segmentSingleLookupTable; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ShapingTypeData.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010. All Rights Reserved. - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - * Generated on: 07/21/2005 10:31:02 AM PDT - */ - -#include "LETypes.h" -#include "ArabicShaping.h" - -U_NAMESPACE_BEGIN - -const le_uint8 ArabicShaping::shapingTypeTable[] = { - 0x00, 0x02, 0x00, 0xD7, 0x00, 0xAD, 0x00, 0xAD, 0x00, 0x05, 0x03, 0x00, 0x03, 0x6F, 0x00, 0x05, - 0x04, 0x83, 0x04, 0x89, 0x00, 0x05, 0x05, 0x91, 0x05, 0xBD, 0x00, 0x05, 0x05, 0xBF, 0x05, 0xBF, - 0x00, 0x05, 0x05, 0xC1, 0x05, 0xC2, 0x00, 0x05, 0x05, 0xC4, 0x05, 0xC5, 0x00, 0x05, 0x05, 0xC7, - 0x05, 0xC7, 0x00, 0x05, 0x06, 0x10, 0x06, 0x1A, 0x00, 0x05, 0x06, 0x22, 0x06, 0x25, 0x00, 0x04, - 0x06, 0x26, 0x06, 0x26, 0x00, 0x02, 0x06, 0x27, 0x06, 0x27, 0x00, 0x04, 0x06, 0x28, 0x06, 0x28, - 0x00, 0x02, 0x06, 0x29, 0x06, 0x29, 0x00, 0x04, 0x06, 0x2A, 0x06, 0x2E, 0x00, 0x02, 0x06, 0x2F, - 0x06, 0x32, 0x00, 0x04, 0x06, 0x33, 0x06, 0x3F, 0x00, 0x02, 0x06, 0x40, 0x06, 0x40, 0x00, 0x01, - 0x06, 0x41, 0x06, 0x47, 0x00, 0x02, 0x06, 0x48, 0x06, 0x48, 0x00, 0x04, 0x06, 0x49, 0x06, 0x4A, - 0x00, 0x02, 0x06, 0x4B, 0x06, 0x5E, 0x00, 0x05, 0x06, 0x6E, 0x06, 0x6F, 0x00, 0x02, 0x06, 0x70, - 0x06, 0x70, 0x00, 0x05, 0x06, 0x71, 0x06, 0x73, 0x00, 0x04, 0x06, 0x75, 0x06, 0x77, 0x00, 0x04, - 0x06, 0x78, 0x06, 0x87, 0x00, 0x02, 0x06, 0x88, 0x06, 0x99, 0x00, 0x04, 0x06, 0x9A, 0x06, 0xBF, - 0x00, 0x02, 0x06, 0xC0, 0x06, 0xC0, 0x00, 0x04, 0x06, 0xC1, 0x06, 0xC2, 0x00, 0x02, 0x06, 0xC3, - 0x06, 0xCB, 0x00, 0x04, 0x06, 0xCC, 0x06, 0xCC, 0x00, 0x02, 0x06, 0xCD, 0x06, 0xCD, 0x00, 0x04, - 0x06, 0xCE, 0x06, 0xCE, 0x00, 0x02, 0x06, 0xCF, 0x06, 0xCF, 0x00, 0x04, 0x06, 0xD0, 0x06, 0xD1, - 0x00, 0x02, 0x06, 0xD2, 0x06, 0xD3, 0x00, 0x04, 0x06, 0xD5, 0x06, 0xD5, 0x00, 0x04, 0x06, 0xD6, - 0x06, 0xDC, 0x00, 0x05, 0x06, 0xDE, 0x06, 0xE4, 0x00, 0x05, 0x06, 0xE7, 0x06, 0xE8, 0x00, 0x05, - 0x06, 0xEA, 0x06, 0xED, 0x00, 0x05, 0x06, 0xEE, 0x06, 0xEF, 0x00, 0x04, 0x06, 0xFA, 0x06, 0xFC, - 0x00, 0x02, 0x06, 0xFF, 0x06, 0xFF, 0x00, 0x02, 0x07, 0x0F, 0x07, 0x0F, 0x00, 0x05, 0x07, 0x10, - 0x07, 0x10, 0x00, 0x04, 0x07, 0x11, 0x07, 0x11, 0x00, 0x05, 0x07, 0x12, 0x07, 0x14, 0x00, 0x02, - 0x07, 0x15, 0x07, 0x19, 0x00, 0x04, 0x07, 0x1A, 0x07, 0x1D, 0x00, 0x02, 0x07, 0x1E, 0x07, 0x1E, - 0x00, 0x04, 0x07, 0x1F, 0x07, 0x27, 0x00, 0x02, 0x07, 0x28, 0x07, 0x28, 0x00, 0x04, 0x07, 0x29, - 0x07, 0x29, 0x00, 0x02, 0x07, 0x2A, 0x07, 0x2A, 0x00, 0x04, 0x07, 0x2B, 0x07, 0x2B, 0x00, 0x02, - 0x07, 0x2C, 0x07, 0x2C, 0x00, 0x04, 0x07, 0x2D, 0x07, 0x2E, 0x00, 0x02, 0x07, 0x2F, 0x07, 0x2F, - 0x00, 0x04, 0x07, 0x30, 0x07, 0x4A, 0x00, 0x05, 0x07, 0x4D, 0x07, 0x4D, 0x00, 0x04, 0x07, 0x4E, - 0x07, 0x58, 0x00, 0x02, 0x07, 0x59, 0x07, 0x5B, 0x00, 0x04, 0x07, 0x5C, 0x07, 0x6A, 0x00, 0x02, - 0x07, 0x6B, 0x07, 0x6C, 0x00, 0x04, 0x07, 0x6D, 0x07, 0x70, 0x00, 0x02, 0x07, 0x71, 0x07, 0x71, - 0x00, 0x04, 0x07, 0x72, 0x07, 0x72, 0x00, 0x02, 0x07, 0x73, 0x07, 0x74, 0x00, 0x04, 0x07, 0x75, - 0x07, 0x77, 0x00, 0x02, 0x07, 0x78, 0x07, 0x79, 0x00, 0x04, 0x07, 0x7A, 0x07, 0x7F, 0x00, 0x02, - 0x07, 0xA6, 0x07, 0xB0, 0x00, 0x05, 0x07, 0xCA, 0x07, 0xEA, 0x00, 0x02, 0x07, 0xEB, 0x07, 0xF3, - 0x00, 0x05, 0x07, 0xFA, 0x07, 0xFA, 0x00, 0x01, 0x09, 0x01, 0x09, 0x02, 0x00, 0x05, 0x09, 0x3C, - 0x09, 0x3C, 0x00, 0x05, 0x09, 0x41, 0x09, 0x48, 0x00, 0x05, 0x09, 0x4D, 0x09, 0x4D, 0x00, 0x05, - 0x09, 0x51, 0x09, 0x54, 0x00, 0x05, 0x09, 0x62, 0x09, 0x63, 0x00, 0x05, 0x09, 0x81, 0x09, 0x81, - 0x00, 0x05, 0x09, 0xBC, 0x09, 0xBC, 0x00, 0x05, 0x09, 0xC1, 0x09, 0xC4, 0x00, 0x05, 0x09, 0xCD, - 0x09, 0xCD, 0x00, 0x05, 0x09, 0xE2, 0x09, 0xE3, 0x00, 0x05, 0x0A, 0x01, 0x0A, 0x02, 0x00, 0x05, - 0x0A, 0x3C, 0x0A, 0x3C, 0x00, 0x05, 0x0A, 0x41, 0x0A, 0x42, 0x00, 0x05, 0x0A, 0x47, 0x0A, 0x48, - 0x00, 0x05, 0x0A, 0x4B, 0x0A, 0x4D, 0x00, 0x05, 0x0A, 0x51, 0x0A, 0x51, 0x00, 0x05, 0x0A, 0x70, - 0x0A, 0x71, 0x00, 0x05, 0x0A, 0x75, 0x0A, 0x75, 0x00, 0x05, 0x0A, 0x81, 0x0A, 0x82, 0x00, 0x05, - 0x0A, 0xBC, 0x0A, 0xBC, 0x00, 0x05, 0x0A, 0xC1, 0x0A, 0xC5, 0x00, 0x05, 0x0A, 0xC7, 0x0A, 0xC8, - 0x00, 0x05, 0x0A, 0xCD, 0x0A, 0xCD, 0x00, 0x05, 0x0A, 0xE2, 0x0A, 0xE3, 0x00, 0x05, 0x0B, 0x01, - 0x0B, 0x01, 0x00, 0x05, 0x0B, 0x3C, 0x0B, 0x3C, 0x00, 0x05, 0x0B, 0x3F, 0x0B, 0x3F, 0x00, 0x05, - 0x0B, 0x41, 0x0B, 0x44, 0x00, 0x05, 0x0B, 0x4D, 0x0B, 0x4D, 0x00, 0x05, 0x0B, 0x56, 0x0B, 0x56, - 0x00, 0x05, 0x0B, 0x62, 0x0B, 0x63, 0x00, 0x05, 0x0B, 0x82, 0x0B, 0x82, 0x00, 0x05, 0x0B, 0xC0, - 0x0B, 0xC0, 0x00, 0x05, 0x0B, 0xCD, 0x0B, 0xCD, 0x00, 0x05, 0x0C, 0x3E, 0x0C, 0x40, 0x00, 0x05, - 0x0C, 0x46, 0x0C, 0x48, 0x00, 0x05, 0x0C, 0x4A, 0x0C, 0x4D, 0x00, 0x05, 0x0C, 0x55, 0x0C, 0x56, - 0x00, 0x05, 0x0C, 0x62, 0x0C, 0x63, 0x00, 0x05, 0x0C, 0xBC, 0x0C, 0xBC, 0x00, 0x05, 0x0C, 0xBF, - 0x0C, 0xBF, 0x00, 0x05, 0x0C, 0xC6, 0x0C, 0xC6, 0x00, 0x05, 0x0C, 0xCC, 0x0C, 0xCD, 0x00, 0x05, - 0x0C, 0xE2, 0x0C, 0xE3, 0x00, 0x05, 0x0D, 0x41, 0x0D, 0x44, 0x00, 0x05, 0x0D, 0x4D, 0x0D, 0x4D, - 0x00, 0x05, 0x0D, 0x62, 0x0D, 0x63, 0x00, 0x05, 0x0D, 0xCA, 0x0D, 0xCA, 0x00, 0x05, 0x0D, 0xD2, - 0x0D, 0xD4, 0x00, 0x05, 0x0D, 0xD6, 0x0D, 0xD6, 0x00, 0x05, 0x0E, 0x31, 0x0E, 0x31, 0x00, 0x05, - 0x0E, 0x34, 0x0E, 0x3A, 0x00, 0x05, 0x0E, 0x47, 0x0E, 0x4E, 0x00, 0x05, 0x0E, 0xB1, 0x0E, 0xB1, - 0x00, 0x05, 0x0E, 0xB4, 0x0E, 0xB9, 0x00, 0x05, 0x0E, 0xBB, 0x0E, 0xBC, 0x00, 0x05, 0x0E, 0xC8, - 0x0E, 0xCD, 0x00, 0x05, 0x0F, 0x18, 0x0F, 0x19, 0x00, 0x05, 0x0F, 0x35, 0x0F, 0x35, 0x00, 0x05, - 0x0F, 0x37, 0x0F, 0x37, 0x00, 0x05, 0x0F, 0x39, 0x0F, 0x39, 0x00, 0x05, 0x0F, 0x71, 0x0F, 0x7E, - 0x00, 0x05, 0x0F, 0x80, 0x0F, 0x84, 0x00, 0x05, 0x0F, 0x86, 0x0F, 0x87, 0x00, 0x05, 0x0F, 0x90, - 0x0F, 0x97, 0x00, 0x05, 0x0F, 0x99, 0x0F, 0xBC, 0x00, 0x05, 0x0F, 0xC6, 0x0F, 0xC6, 0x00, 0x05, - 0x10, 0x2D, 0x10, 0x30, 0x00, 0x05, 0x10, 0x32, 0x10, 0x37, 0x00, 0x05, 0x10, 0x39, 0x10, 0x3A, - 0x00, 0x05, 0x10, 0x3D, 0x10, 0x3E, 0x00, 0x05, 0x10, 0x58, 0x10, 0x59, 0x00, 0x05, 0x10, 0x5E, - 0x10, 0x60, 0x00, 0x05, 0x10, 0x71, 0x10, 0x74, 0x00, 0x05, 0x10, 0x82, 0x10, 0x82, 0x00, 0x05, - 0x10, 0x85, 0x10, 0x86, 0x00, 0x05, 0x10, 0x8D, 0x10, 0x8D, 0x00, 0x05, 0x13, 0x5F, 0x13, 0x5F, - 0x00, 0x05, 0x17, 0x12, 0x17, 0x14, 0x00, 0x05, 0x17, 0x32, 0x17, 0x34, 0x00, 0x05, 0x17, 0x52, - 0x17, 0x53, 0x00, 0x05, 0x17, 0x72, 0x17, 0x73, 0x00, 0x05, 0x17, 0xB4, 0x17, 0xB5, 0x00, 0x05, - 0x17, 0xB7, 0x17, 0xBD, 0x00, 0x05, 0x17, 0xC6, 0x17, 0xC6, 0x00, 0x05, 0x17, 0xC9, 0x17, 0xD3, - 0x00, 0x05, 0x17, 0xDD, 0x17, 0xDD, 0x00, 0x05, 0x18, 0x0B, 0x18, 0x0D, 0x00, 0x05, 0x18, 0xA9, - 0x18, 0xA9, 0x00, 0x05, 0x19, 0x20, 0x19, 0x22, 0x00, 0x05, 0x19, 0x27, 0x19, 0x28, 0x00, 0x05, - 0x19, 0x32, 0x19, 0x32, 0x00, 0x05, 0x19, 0x39, 0x19, 0x3B, 0x00, 0x05, 0x1A, 0x17, 0x1A, 0x18, - 0x00, 0x05, 0x1B, 0x00, 0x1B, 0x03, 0x00, 0x05, 0x1B, 0x34, 0x1B, 0x34, 0x00, 0x05, 0x1B, 0x36, - 0x1B, 0x3A, 0x00, 0x05, 0x1B, 0x3C, 0x1B, 0x3C, 0x00, 0x05, 0x1B, 0x42, 0x1B, 0x42, 0x00, 0x05, - 0x1B, 0x6B, 0x1B, 0x73, 0x00, 0x05, 0x1B, 0x80, 0x1B, 0x81, 0x00, 0x05, 0x1B, 0xA2, 0x1B, 0xA5, - 0x00, 0x05, 0x1B, 0xA8, 0x1B, 0xA9, 0x00, 0x05, 0x1C, 0x2C, 0x1C, 0x33, 0x00, 0x05, 0x1C, 0x36, - 0x1C, 0x37, 0x00, 0x05, 0x1D, 0xC0, 0x1D, 0xE6, 0x00, 0x05, 0x1D, 0xFE, 0x1D, 0xFF, 0x00, 0x05, - 0x20, 0x0B, 0x20, 0x0B, 0x00, 0x05, 0x20, 0x0D, 0x20, 0x0D, 0x00, 0x01, 0x20, 0x0E, 0x20, 0x0F, - 0x00, 0x05, 0x20, 0x2A, 0x20, 0x2E, 0x00, 0x05, 0x20, 0x60, 0x20, 0x64, 0x00, 0x05, 0x20, 0x6A, - 0x20, 0x6F, 0x00, 0x05, 0x20, 0xD0, 0x20, 0xF0, 0x00, 0x05, 0x2D, 0xE0, 0x2D, 0xFF, 0x00, 0x05, - 0x30, 0x2A, 0x30, 0x2F, 0x00, 0x05, 0x30, 0x99, 0x30, 0x9A, 0x00, 0x05, 0xA6, 0x6F, 0xA6, 0x72, - 0x00, 0x05, 0xA6, 0x7C, 0xA6, 0x7D, 0x00, 0x05, 0xA8, 0x02, 0xA8, 0x02, 0x00, 0x05, 0xA8, 0x06, - 0xA8, 0x06, 0x00, 0x05, 0xA8, 0x0B, 0xA8, 0x0B, 0x00, 0x05, 0xA8, 0x25, 0xA8, 0x26, 0x00, 0x05, - 0xA8, 0xC4, 0xA8, 0xC4, 0x00, 0x05, 0xA9, 0x26, 0xA9, 0x2D, 0x00, 0x05, 0xA9, 0x47, 0xA9, 0x51, - 0x00, 0x05, 0xAA, 0x29, 0xAA, 0x2E, 0x00, 0x05, 0xAA, 0x31, 0xAA, 0x32, 0x00, 0x05, 0xAA, 0x35, - 0xAA, 0x36, 0x00, 0x05, 0xAA, 0x43, 0xAA, 0x43, 0x00, 0x05, 0xAA, 0x4C, 0xAA, 0x4C, 0x00, 0x05, - 0xFB, 0x1E, 0xFB, 0x1E, 0x00, 0x05, 0xFE, 0x00, 0xFE, 0x0F, 0x00, 0x05, 0xFE, 0x20, 0xFE, 0x26, - 0x00, 0x05, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x05, 0xFF, 0xF9, 0xFF, 0xFB, 0x00, 0x05 -}; - -const size_t ArabicShaping::shapingTypeTableLen = sizeof(shapingTypeTable)/sizeof(shapingTypeTable[0]); - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SimpleArrayProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "SimpleArrayProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor) - -SimpleArrayProcessor::SimpleArrayProcessor() -{ -} - -SimpleArrayProcessor::SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - simpleArrayLookupTable = LEReferenceTo<SimpleArrayLookupTable>(morphSubtableHeader, success, (const SimpleArrayLookupTable*)&header->table); -} - -SimpleArrayProcessor::~SimpleArrayProcessor() -{ -} - -void SimpleArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - LEReferenceToArrayOf<LookupValue> valueArray(simpleArrayLookupTable, success, (const LookupValue*)&simpleArrayLookupTable->valueArray, LE_UNBOUNDED_ARRAY); - - for (glyph = 0; LE_SUCCESS(success) && (glyph < glyphCount); glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) { - TTGlyphID newGlyph = SWAPW(valueArray.getObject(LE_GET_GLYPH(thisGlyph),success)); - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SimpleArrayProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SIMPLEARRAYPROCESSOR_H -#define __SIMPLEARRAYPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SimpleArrayProcessor : public NonContextualGlyphSubstitutionProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SimpleArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SimpleArrayProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SimpleArrayProcessor(); - -protected: - LEReferenceTo<SimpleArrayLookupTable> simpleArrayLookupTable; - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SimpleArrayProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "SimpleArrayProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleArrayProcessor2) - -SimpleArrayProcessor2::SimpleArrayProcessor2() -{ -} - -SimpleArrayProcessor2::SimpleArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor2(morphSubtableHeader, success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - - simpleArrayLookupTable = LEReferenceTo<SimpleArrayLookupTable>(morphSubtableHeader, success, &header->table); - valueArray = LEReferenceToArrayOf<LookupValue>(morphSubtableHeader, success, &simpleArrayLookupTable->valueArray[0], LE_UNBOUNDED_ARRAY); -} - -SimpleArrayProcessor2::~SimpleArrayProcessor2() -{ -} - -void SimpleArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - if (LE_FAILURE(success)) return; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) { - TTGlyphID newGlyph = SWAPW(valueArray(LE_GET_GLYPH(thisGlyph),success)); - - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SimpleArrayProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __SIMPLEARRAYPROCESSOR2_H -#define __SIMPLEARRAYPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SimpleArrayProcessor2 : public NonContextualGlyphSubstitutionProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SimpleArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SimpleArrayProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SimpleArrayProcessor2(); - -protected: - LEReferenceTo<SimpleArrayLookupTable> simpleArrayLookupTable; - LEReferenceToArrayOf<LookupValue> valueArray; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SinglePositioningSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "SinglePositioningSubtables.h" -#include "ValueRecords.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 SinglePositioningSubtable::process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - switch(SWAPW(subtableFormat)) - { - case 0: - return 0; - - case 1: - { - const LEReferenceTo<SinglePositioningFormat1Subtable> subtable(base, success, (const SinglePositioningFormat1Subtable *) this); - - return subtable->process(subtable, glyphIterator, fontInstance, success); - } - - case 2: - { - const LEReferenceTo<SinglePositioningFormat2Subtable> subtable(base, success, (const SinglePositioningFormat2Subtable *) this); - - return subtable->process(subtable, glyphIterator, fontInstance, success); - } - - default: - return 0; - } -} - -le_uint32 SinglePositioningFormat1Subtable::process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - valueRecord.adjustPosition(SWAPW(valueFormat), base, *glyphIterator, fontInstance, success); - - return 1; - } - - return 0; -} - -le_uint32 SinglePositioningFormat2Subtable::process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int16 coverageIndex = (le_int16) getGlyphCoverage(base, glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - valueRecordArray[0].adjustPosition(coverageIndex, SWAPW(valueFormat), base, *glyphIterator, fontInstance, success); - - return 1; - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SinglePositioningSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SINGLEPOSITIONINGSUBTABLES_H -#define __SINGLEPOSITIONINGSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphPositioningTables.h" -#include "ValueRecords.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct SinglePositioningSubtable : GlyphPositioningSubtable -{ - le_uint32 process(const LEReferenceTo<SinglePositioningSubtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; - -struct SinglePositioningFormat1Subtable : SinglePositioningSubtable -{ - ValueFormat valueFormat; - ValueRecord valueRecord; - - le_uint32 process(const LEReferenceTo<SinglePositioningFormat1Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; - -struct SinglePositioningFormat2Subtable : SinglePositioningSubtable -{ - ValueFormat valueFormat; - le_uint16 valueCount; - ValueRecord valueRecordArray[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<SinglePositioningFormat2Subtable> &base, GlyphIterator *glyphIterator, const LEFontInstance *fontInstance, LEErrorCode &success) const; -}; -LE_VAR_ARRAY(SinglePositioningFormat2Subtable, valueRecordArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleSubstitutionSubtables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "SingleSubstitutionSubtables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -le_uint32 SingleSubstitutionSubtable::process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const -{ - switch(SWAPW(subtableFormat)) - { - case 0: - return 0; - - case 1: - { - const LEReferenceTo<SingleSubstitutionFormat1Subtable> subtable(base, success, (const SingleSubstitutionFormat1Subtable *) this); - - return subtable->process(subtable, glyphIterator, success, filter); - } - - case 2: - { - const LEReferenceTo<SingleSubstitutionFormat2Subtable> subtable(base, success, (const SingleSubstitutionFormat2Subtable *) this); - - return subtable->process(subtable, glyphIterator, success, filter); - } - - default: - return 0; - } -} - -le_uint32 SingleSubstitutionFormat1Subtable::process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const -{ - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - if (coverageIndex >= 0) { - TTGlyphID substitute = ((TTGlyphID) LE_GET_GLYPH(glyph)) + SWAPW(deltaGlyphID); - - if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute), success)) { - glyphIterator->setCurrGlyphID(substitute); - } - - return 1; - } - - return 0; -} - -le_uint32 SingleSubstitutionFormat2Subtable::process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter) const -{ - LEGlyphID glyph = glyphIterator->getCurrGlyphID(); - le_int32 coverageIndex = getGlyphCoverage(base, glyph, success); - if (LE_FAILURE(success)) { - return 0; - } - - LEReferenceToArrayOf<TTGlyphID> substituteArrayRef(base, success, substituteArray, SWAPW(glyphCount)); - - if (coverageIndex >= 0 && LE_SUCCESS(success) && coverageIndex < substituteArrayRef.getCount()) { - TTGlyphID substitute = SWAPW(substituteArray[coverageIndex]); - - if (filter == NULL || filter->accept(LE_SET_GLYPH(glyph, substitute), success)) { - glyphIterator->setCurrGlyphID(substitute); - } - - return 1; - } - - return 0; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleSubstitutionSubtables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SINGLESUBSTITUTIONSUBTABLES_H -#define __SINGLESUBSTITUTIONSUBTABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -struct SingleSubstitutionSubtable : GlyphSubstitutionSubtable -{ - le_uint32 process(const LEReferenceTo<SingleSubstitutionSubtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; -}; - -struct SingleSubstitutionFormat1Subtable : SingleSubstitutionSubtable -{ - le_int16 deltaGlyphID; - - le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat1Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; -}; - -struct SingleSubstitutionFormat2Subtable : SingleSubstitutionSubtable -{ - le_uint16 glyphCount; - TTGlyphID substituteArray[ANY_NUMBER]; - - le_uint32 process(const LEReferenceTo<SingleSubstitutionFormat2Subtable> &base, GlyphIterator *glyphIterator, LEErrorCode &success, const LEGlyphFilter *filter = NULL) const; -}; -LE_VAR_ARRAY(SingleSubstitutionFormat2Subtable, substituteArray) - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleTableProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "SingleTableProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor) - -SingleTableProcessor::SingleTableProcessor() -{ -} - -SingleTableProcessor::SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - singleTableLookupTable = LEReferenceTo<SingleTableLookupTable>(morphSubtableHeader, success, (const SingleTableLookupTable*)&header->table); -} - -SingleTableProcessor::~SingleTableProcessor() -{ -} - -void SingleTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - const LookupSingle *entries = singleTableLookupTable->entries; - le_int32 glyph; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - if (LE_FAILURE(success)) return; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success); - - if (lookupSingle != NULL) { - glyphStorage[glyph] = SWAPW(lookupSingle->value); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleTableProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SINGLETABLEPROCESSOR_H -#define __SINGLETABLEPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SingleTableProcessor : public NonContextualGlyphSubstitutionProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SingleTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SingleTableProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SingleTableProcessor(); - -protected: - LEReferenceTo<SingleTableLookupTable> singleTableLookupTable; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleTableProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "SingleTableProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SingleTableProcessor2) - -SingleTableProcessor2::SingleTableProcessor2() -{ -} - -SingleTableProcessor2::SingleTableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor2(morphSubtableHeader, success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - - singleTableLookupTable = LEReferenceTo<SingleTableLookupTable>(morphSubtableHeader, success, &header->table); -} - -SingleTableProcessor2::~SingleTableProcessor2() -{ -} - -void SingleTableProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return; - const LookupSingle *entries = singleTableLookupTable->entries; - le_int32 glyph; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success); - - if (lookupSingle != NULL) { - glyphStorage[glyph] = SWAPW(lookupSingle->value); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SingleTableProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __SINGLETABLEPROCESSOR2_H -#define __SINGLETABLEPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SingleTableProcessor2 : public NonContextualGlyphSubstitutionProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - SingleTableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~SingleTableProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - SingleTableProcessor2(); - -protected: - LEReferenceTo<SingleTableLookupTable> singleTableLookupTable; - -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/StateTableProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor.h" -#include "StateTableProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -StateTableProcessor::StateTableProcessor() -{ -} - -StateTableProcessor::StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : SubtableProcessor(morphSubtableHeader, success), stateTableHeader(morphSubtableHeader, success), - stHeader(stateTableHeader, success, (const StateTableHeader*)&stateTableHeader->stHeader) -{ - if(LE_FAILURE(success)) return; - stateSize = SWAPW(stateTableHeader->stHeader.stateSize); - classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset); - stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset); - entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset); - - classTable = LEReferenceTo<ClassTable>(stateTableHeader, success, ((char *) &stateTableHeader->stHeader + classTableOffset)); - if(LE_FAILURE(success)) return; - firstGlyph = SWAPW(classTable->firstGlyph); - lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs); -} - -StateTableProcessor::~StateTableProcessor() -{ -} - -void StateTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) return; - LE_STATE_PATIENCE_INIT(); - - // Start at state 0 - // XXX: How do we know when to start at state 1? - ByteOffset currentState = stateArrayOffset; - - // XXX: reverse? - le_int32 currGlyph = 0; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - beginStateTable(); - - while (currGlyph <= glyphCount) { - if(LE_STATE_PATIENCE_DECR()) break; // patience exceeded. - if (LE_FAILURE(success)) break; - ClassCode classCode = classCodeOOB; - if (currGlyph == glyphCount) { - // XXX: How do we handle EOT vs. EOL? - classCode = classCodeEOT; - break; - } else { - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]); - - if (glyphCode == 0xFFFF) { - classCode = classCodeDEL; - } else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) { - classCode = classTable->classArray[glyphCode - firstGlyph]; - } - } - - LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY); - EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success); - if (LE_FAILURE(success)) { break; } - LE_STATE_PATIENCE_CURR(le_int32, currGlyph); - currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success); - LE_STATE_PATIENCE_INCR(currGlyph); - } - - endStateTable(); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/StateTableProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __STATETABLEPROCESSOR_H -#define __STATETABLEPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class StateTableProcessor : public SubtableProcessor -{ -public: - void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - virtual void beginStateTable() = 0; - - virtual ByteOffset processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success) = 0; - - virtual void endStateTable() = 0; - -protected: - StateTableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - virtual ~StateTableProcessor(); - - StateTableProcessor(); - - le_int16 stateSize; - ByteOffset classTableOffset; - ByteOffset stateArrayOffset; - ByteOffset entryTableOffset; - - LEReferenceTo<ClassTable> classTable; - TTGlyphID firstGlyph; - TTGlyphID lastGlyph; - - LEReferenceTo<MorphStateTableHeader> stateTableHeader; - LEReferenceTo<StateTableHeader> stHeader; // for convenience - -private: - StateTableProcessor(const StateTableProcessor &other); // forbid copying of this class - StateTableProcessor &operator=(const StateTableProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/StateTableProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,241 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "StateTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "StateTableProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" -#include "LookupTables.h" - -U_NAMESPACE_BEGIN - -StateTableProcessor2::StateTableProcessor2() -{ -} - -StateTableProcessor2::StateTableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : SubtableProcessor2(morphSubtableHeader, success), stateTableHeader(morphSubtableHeader, success), - stHeader(stateTableHeader, success, (const StateTableHeader2*)&stateTableHeader->stHeader), - nClasses(0), classTableOffset(0), stateArrayOffset(0), entryTableOffset(0), classTable(), format(0), - stateArray() -{ - if (LE_FAILURE(success)) { - return; - } - nClasses = SWAPL(stHeader->nClasses); - classTableOffset = SWAPL(stHeader->classTableOffset); - stateArrayOffset = SWAPL(stHeader->stateArrayOffset); - entryTableOffset = SWAPL(stHeader->entryTableOffset); - - classTable = LEReferenceTo<LookupTable>(stHeader, success, classTableOffset); - if (LE_FAILURE(success)) return; - format = SWAPW(classTable->format); - - stateArray = LEReferenceToArrayOf<EntryTableIndex2>(stHeader, success, stateArrayOffset, LE_UNBOUNDED_ARRAY); -} - -StateTableProcessor2::~StateTableProcessor2() -{ -} - -void StateTableProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) return; - // Start at state 0 - // XXX: How do we know when to start at state 1? - le_uint16 currentState = 0; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - - LE_STATE_PATIENCE_INIT(); - - le_int32 currGlyph = 0; - if ((coverage & scfReverse2) != 0) { // process glyphs in descending order - currGlyph = glyphCount - 1; - dir = -1; - } else { - dir = 1; - } - - beginStateTable(); - switch (format) { - case ltfSimpleArray: { -#ifdef TEST_FORMAT - LEReferenceTo<SimpleArrayLookupTable> lookupTable0(classTable, success); - if(LE_FAILURE(success)) break; - while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) { - if (LE_FAILURE(success)) break; - if (LE_STATE_PATIENCE_DECR()) { - LE_DEBUG_BAD_FONT("patience exceeded - state table not moving") - break; // patience exceeded. - } - LookupValue classCode = classCodeOOB; - if (currGlyph == glyphCount || currGlyph == -1) { - // XXX: How do we handle EOT vs. EOL? - classCode = classCodeEOT; - break; - } else { - LEGlyphID gid = glyphStorage[currGlyph]; - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid); - - if (glyphCode == 0xFFFF) { - classCode = classCodeDEL; - } else { - classCode = SWAPW(lookupTable0->valueArray[gid]); - } - } - EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success)); - LE_STATE_PATIENCE_CURR(le_int32, currGlyph); - currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); // return a zero-based index instead of a byte offset - LE_STATE_PATIENCE_INCR(currGlyph); - } -#endif - break; - } - case ltfSegmentSingle: { - LEReferenceTo<SegmentSingleLookupTable> lookupTable2(classTable, success); - if(LE_FAILURE(success)) break; - while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) { - if (LE_FAILURE(success)) break; - if (LE_STATE_PATIENCE_DECR()) { - LE_DEBUG_BAD_FONT("patience exceeded - state table not moving") - break; // patience exceeded. - } - LookupValue classCode = classCodeOOB; - if (currGlyph == glyphCount || currGlyph == -1) { - // XXX: How do we handle EOT vs. EOL? - classCode = classCodeEOT; - break; - } else { - LEGlyphID gid = glyphStorage[currGlyph]; - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid); - - if (glyphCode == 0xFFFF) { - classCode = classCodeDEL; - } else { - const LookupSegment *segment = - lookupTable2->lookupSegment(lookupTable2, lookupTable2->segments, gid, success); - if (segment != NULL && LE_SUCCESS(success)) { - classCode = SWAPW(segment->value); - } - } - } - EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses,success)); - LE_STATE_PATIENCE_CURR(le_int32, currGlyph); - currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success); - LE_STATE_PATIENCE_INCR(currGlyph); - } - break; - } - case ltfSegmentArray: { - //printf("Lookup Table Format4: specific interpretation needed!\n"); - break; - } - case ltfSingleTable: { - LEReferenceTo<SingleTableLookupTable> lookupTable6(classTable, success); - while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) { - if (LE_FAILURE(success)) break; - if (LE_STATE_PATIENCE_DECR()) { - LE_DEBUG_BAD_FONT("patience exceeded - state table not moving") - break; // patience exceeded. - } - LookupValue classCode = classCodeOOB; - if (currGlyph == glyphCount || currGlyph == -1) { - // XXX: How do we handle EOT vs. EOL? - classCode = classCodeEOT; - break; - } else if(currGlyph > glyphCount) { - // note if > glyphCount, we've run off the end (bad font) - currGlyph = glyphCount; - classCode = classCodeEOT; - } else { - LEGlyphID gid = glyphStorage[currGlyph]; - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid); - - if (glyphCode == 0xFFFF) { - classCode = classCodeDEL; - } else { - const LookupSingle *segment = lookupTable6->lookupSingle(lookupTable6, lookupTable6->entries, gid, success); - if (segment != NULL) { - classCode = SWAPW(segment->value); - } - } - } - EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success)); - LE_STATE_PATIENCE_CURR(le_int32, currGlyph); - currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success); - LE_STATE_PATIENCE_INCR(currGlyph); - } - break; - } - case ltfTrimmedArray: { - LEReferenceTo<TrimmedArrayLookupTable> lookupTable8(classTable, success); - if (LE_FAILURE(success)) break; - TTGlyphID firstGlyph = SWAPW(lookupTable8->firstGlyph); - TTGlyphID lastGlyph = firstGlyph + SWAPW(lookupTable8->glyphCount); - - while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) { - if(LE_STATE_PATIENCE_DECR()) { - LE_DEBUG_BAD_FONT("patience exceeded - state table not moving") - break; // patience exceeded. - } - - LookupValue classCode = classCodeOOB; - if (currGlyph == glyphCount || currGlyph == -1) { - // XXX: How do we handle EOT vs. EOL? - classCode = classCodeEOT; - break; - } else { - TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]); - if (glyphCode == 0xFFFF) { - classCode = classCodeDEL; - } else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) { - classCode = SWAPW(lookupTable8->valueArray[glyphCode - firstGlyph]); - } - } - EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success)); - LE_STATE_PATIENCE_CURR(le_int32, currGlyph); - currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success); - LE_STATE_PATIENCE_INCR(currGlyph); - } - break; - } - default: - break; - } - - endStateTable(); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/StateTableProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __STATETABLEPROCESSOR2_H -#define __STATETABLEPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "MorphStateTables.h" -#include "SubtableProcessor2.h" -#include "LookupTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class StateTableProcessor2 : public SubtableProcessor2 -{ -public: - void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - virtual void beginStateTable() = 0; - - virtual le_uint16 processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex2 index, LEErrorCode &success) = 0; - - virtual void endStateTable() = 0; - -protected: - StateTableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - virtual ~StateTableProcessor2(); - - StateTableProcessor2(); - - le_int32 dir; - le_uint16 format; - le_uint32 nClasses; - le_uint32 classTableOffset; - le_uint32 stateArrayOffset; - le_uint32 entryTableOffset; - - LEReferenceTo<LookupTable> classTable; - LEReferenceToArrayOf<EntryTableIndex2> stateArray; - LEReferenceTo<MorphStateTableHeader2> stateTableHeader; - LEReferenceTo<StateTableHeader2> stHeader; // for convenience - -private: - StateTableProcessor2(const StateTableProcessor2 &other); // forbid copying of this class - StateTableProcessor2 &operator=(const StateTableProcessor2 &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/StateTables.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved - * - */ - -#ifndef __STATETABLES_H -#define __STATETABLES_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LayoutTables.h" - -U_NAMESPACE_BEGIN - - - - -/* - * State table loop detection. - * Detects if too many ( LE_STATE_PATIENCE_COUNT ) state changes occur without moving the glyph index 'g'. - * - * Usage (pseudocode): - * - * { - * LE_STATE_PATIENCE_INIT(); - * - * int g=0; // the glyph index - expect it to be moving - * - * for(;;) { - * if(LE_STATE_PATIENCE_DECR()) { // decrements the patience counter - * // ran out of patience, get out. - * break; - * } - * - * LE_STATE_PATIENCE_CURR(int, g); // store the 'current' - * state = newState(state,g); - * g+= <something, could be zero>; - * LE_STATE_PATIENCE_INCR(g); // if g has moved, increment the patience counter. Otherwise leave it. - * } - * - */ - -#define LE_STATE_PATIENCE_COUNT 4096 /**< give up if a state table doesn't move the glyph after this many iterations */ -#define LE_STATE_PATIENCE_INIT() le_uint32 le_patience_count = LE_STATE_PATIENCE_COUNT -#define LE_STATE_PATIENCE_DECR() --le_patience_count==0 -#define LE_STATE_PATIENCE_CURR(type,x) type le_patience_curr=(x) -#define LE_STATE_PATIENCE_INCR(x) if((x)!=le_patience_curr) ++le_patience_count; - - -struct StateTableHeader -{ - le_int16 stateSize; - ByteOffset classTableOffset; - ByteOffset stateArrayOffset; - ByteOffset entryTableOffset; -}; - -struct StateTableHeader2 -{ - le_uint32 nClasses; - le_uint32 classTableOffset; - le_uint32 stateArrayOffset; - le_uint32 entryTableOffset; -}; - -enum ClassCodes -{ - classCodeEOT = 0, - classCodeOOB = 1, - classCodeDEL = 2, - classCodeEOL = 3, - classCodeFirstFree = 4, - classCodeMAX = 0xFF -}; - -typedef le_uint8 ClassCode; - -struct ClassTable -{ - TTGlyphID firstGlyph; - le_uint16 nGlyphs; - ClassCode classArray[ANY_NUMBER]; -}; -LE_VAR_ARRAY(ClassTable, classArray) - -enum StateNumber -{ - stateSOT = 0, - stateSOL = 1, - stateFirstFree = 2, - stateMAX = 0xFF -}; - -typedef le_uint8 EntryTableIndex; - -struct StateEntry -{ - ByteOffset newStateOffset; - le_uint16 flags; -}; - -typedef le_uint16 EntryTableIndex2; - -struct StateEntry2 // same struct different interpretation -{ - le_uint16 newStateIndex; - le_uint16 flags; -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SubstitutionLookups.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" -#include "SubstitutionLookups.h" -#include "CoverageTables.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -/* - NOTE: This could be optimized somewhat by keeping track - of the previous sequenceIndex in the loop and doing next() - or prev() of the delta between that and the current - sequenceIndex instead of always resetting to the front. -*/ -void SubstitutionLookup::applySubstitutionLookups( - LookupProcessor *lookupProcessor, - SubstitutionLookupRecord *substLookupRecordArray, - le_uint16 substCount, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - le_int32 position, - LEErrorCode& success) -{ - if (LE_FAILURE(success)) { - return; - } - - GlyphIterator tempIterator(*glyphIterator); - - for (le_uint16 subst = 0; subst < substCount && LE_SUCCESS(success); subst += 1) { - le_uint16 sequenceIndex = SWAPW(substLookupRecordArray[subst].sequenceIndex); - le_uint16 lookupListIndex = SWAPW(substLookupRecordArray[subst].lookupListIndex); - - tempIterator.setCurrStreamPosition(position); - tempIterator.next(sequenceIndex); - - lookupProcessor->applySingleLookup(lookupListIndex, &tempIterator, fontInstance, success); - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SubstitutionLookups.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __SUBSTITUTIONLOOKUPS_H -#define __SUBSTITUTIONLOOKUPS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphSubstitutionTables.h" -#include "GlyphIterator.h" -#include "LookupProcessor.h" - -U_NAMESPACE_BEGIN - -struct SubstitutionLookupRecord -{ - le_uint16 sequenceIndex; - le_uint16 lookupListIndex; -}; - -struct SubstitutionLookup -{ - static void applySubstitutionLookups( - LookupProcessor *lookupProcessor, - SubstitutionLookupRecord *substLookupRecordArray, - le_uint16 substCount, - GlyphIterator *glyphIterator, - const LEFontInstance *fontInstance, - le_int32 position, - LEErrorCode& success); -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SubtableProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -SubtableProcessor::SubtableProcessor() -{ -} - -SubtableProcessor::SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : length(0), coverage(0), subtableFeatures(0L), subtableHeader(morphSubtableHeader) -{ - if(LE_FAILURE(success)) return; - length = SWAPW(subtableHeader->length); - coverage = SWAPW(subtableHeader->coverage); - subtableFeatures = SWAPL(subtableHeader->subtableFeatures); -} - -SubtableProcessor::~SubtableProcessor() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SubtableProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __SUBTABLEPROCESSOR_H -#define __SUBTABLEPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SubtableProcessor : public UMemory { -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; - virtual ~SubtableProcessor(); - -protected: - SubtableProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - SubtableProcessor(); - - le_int16 length; - SubtableCoverage coverage; - FeatureFlags subtableFeatures; - - const LEReferenceTo<MorphSubtableHeader> subtableHeader; - -private: - - SubtableProcessor(const SubtableProcessor &other); // forbid copying of this class - SubtableProcessor &operator=(const SubtableProcessor &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/SubtableProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -SubtableProcessor2::SubtableProcessor2() -{ -} - -SubtableProcessor2::SubtableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : subtableHeader(morphSubtableHeader, success), length(0), coverage(0), subtableFeatures(0L) -{ - if(LE_FAILURE(success)) return; - - length = SWAPL(subtableHeader->length); - coverage = SWAPL(subtableHeader->coverage); - subtableFeatures = SWAPL(subtableHeader->subtableFeatures); -} - -SubtableProcessor2::~SubtableProcessor2() -{ -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/SubtableProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __SUBTABLEPROCESSOR2_H -#define __SUBTABLEPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class SubtableProcessor2 : public UMemory { -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success) = 0; - virtual ~SubtableProcessor2(); - -protected: - SubtableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - SubtableProcessor2(); - - le_uint32 length; - SubtableCoverage2 coverage; - FeatureFlags subtableFeatures; - - const LEReferenceTo<MorphSubtableHeader2> subtableHeader; - -private: - - SubtableProcessor2(const SubtableProcessor2 &other); // forbid copying of this class - SubtableProcessor2 &operator=(const SubtableProcessor2 &other); // forbid copying of this class -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/SunLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,200 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* Header for class sun_font_SunLayoutEngine */ - -#include <jni_util.h> -#include <stdlib.h> - -#include "FontInstanceAdapter.h" -#include "LayoutEngine.h" -#include "sun_font_SunLayoutEngine.h" -#include "sunfontids.h" - -void getFloat(JNIEnv* env, jobject pt, jfloat &x, jfloat &y) { - x = env->GetFloatField(pt, sunFontIDs.xFID); - y = env->GetFloatField(pt, sunFontIDs.yFID); -} - -void putFloat(JNIEnv* env, jobject pt, jfloat x, jfloat y) { - env->SetFloatField(pt, sunFontIDs.xFID, x); - env->SetFloatField(pt, sunFontIDs.yFID, y); -} - -static jclass gvdClass = 0; -static const char* gvdClassName = "sun/font/GlyphLayout$GVData"; -static jfieldID gvdCountFID = 0; -static jfieldID gvdFlagsFID = 0; -static jfieldID gvdGlyphsFID = 0; -static jfieldID gvdPositionsFID = 0; -static jfieldID gvdIndicesFID = 0; - -#define TYPO_RTL 0x80000000 -#define TYPO_MASK 0x7 - -JNIEXPORT void JNICALL -Java_sun_font_SunLayoutEngine_initGVIDs - (JNIEnv *env, jclass cls) { - CHECK_NULL(gvdClass = env->FindClass(gvdClassName)); - CHECK_NULL(gvdClass = (jclass)env->NewGlobalRef(gvdClass)); - CHECK_NULL(gvdCountFID = env->GetFieldID(gvdClass, "_count", "I")); - CHECK_NULL(gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I")); - CHECK_NULL(gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I")); - CHECK_NULL(gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F")); - gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I"); -} - -int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) { - int count = env->GetIntField(gvdata, gvdCountFID); - if (count < 0) { - JNU_ThrowInternalError(env, "count negative"); - return 0; - } - - jarray glyphArray = (jarray)env->GetObjectField(gvdata, gvdGlyphsFID); - if (IS_NULL(glyphArray)) { - JNU_ThrowInternalError(env, "glypharray null"); - return 0; - } - jint capacity = env->GetArrayLength(glyphArray); - if (count + glyphCount > capacity) { - JNU_ThrowArrayIndexOutOfBoundsException(env, ""); - return 0; - } - - jarray posArray = (jarray)env->GetObjectField(gvdata, gvdPositionsFID); - if (IS_NULL(glyphArray)) { - JNU_ThrowInternalError(env, "positions array null"); - return 0; - } - jarray inxArray = (jarray)env->GetObjectField(gvdata, gvdIndicesFID); - if (IS_NULL(inxArray)) { - JNU_ThrowInternalError(env, "indices array null"); - return 0; - } - - int countDelta = 0; - - // le_uint32 is the same size as jint... forever, we hope - le_uint32* glyphs = (le_uint32*)env->GetPrimitiveArrayCritical(glyphArray, NULL); - if (glyphs) { - jfloat* positions = (jfloat*)env->GetPrimitiveArrayCritical(posArray, NULL); - if (positions) { - jint* indices = (jint*)env->GetPrimitiveArrayCritical(inxArray, NULL); - if (indices) { - LEErrorCode status = (LEErrorCode)0; - engine->getGlyphs(glyphs + count, gmask, status); - engine->getGlyphPositions(positions + (count * 2), status); - engine->getCharIndices((le_int32*)(indices + count), baseIndex, status); - - countDelta = glyphCount; - - // !!! need engine->getFlags to signal positions, indices data - /* "0" arg used instead of JNI_COMMIT as we want the carray - * to be freed by any VM that actually passes us a copy. - */ - env->ReleasePrimitiveArrayCritical(inxArray, indices, 0); - } - env->ReleasePrimitiveArrayCritical(posArray, positions, 0); - } - env->ReleasePrimitiveArrayCritical(glyphArray, glyphs, 0); - } - - if (countDelta) { - count += countDelta; - env->SetIntField(gvdata, gvdCountFID, count); - } - - return 1; -} - -/* - * Class: sun_font_SunLayoutEngine - * Method: nativeLayout - * Signature: (Lsun/font/FontStrike;[CIIIIZLjava/awt/geom/Point2D$Float;Lsun/font/GlyphLayout$GVData;)V - */ -JNIEXPORT void JNICALL Java_sun_font_SunLayoutEngine_nativeLayout - (JNIEnv *env, jclass cls, jobject font2d, jobject strike, jfloatArray matrix, jint gmask, - jint baseIndex, jcharArray text, jint start, jint limit, jint min, jint max, - jint script, jint lang, jint typo_flags, jobject pt, jobject gvdata, - jlong upem, jlong layoutTables) -{ - // fprintf(stderr, "nl font: %x strike: %x script: %d\n", font2d, strike, script); fflush(stderr); - float mat[4]; - env->GetFloatArrayRegion(matrix, 0, 4, mat); - FontInstanceAdapter fia(env, font2d, strike, mat, 72, 72, (le_int32) upem, (TTLayoutTableCache *) layoutTables); - LEErrorCode success = LE_NO_ERROR; - LayoutEngine *engine = LayoutEngine::layoutEngineFactory(&fia, script, lang, typo_flags & TYPO_MASK, success); - if (engine == NULL) { - env->SetIntField(gvdata, gvdCountFID, -1); // flag failure - return; - } - - if (min < 0) min = 0; - if (max < min) max = min; /* defensive coding */ - // have to copy, yuck, since code does upcalls now. this will be soooo slow - jint len = max - min; - jchar buffer[256]; - jchar* chars = buffer; - if (len > 256) { - size_t size = len * sizeof(jchar); - if (size / sizeof(jchar) != (size_t)len) { - return; - } - chars = (jchar*)malloc(size); - if (chars == 0) { - return; - } - } - // fprintf(stderr, "nl chars: %x text: %x min %d len %d typo %x\n", chars, text, min, len, typo_flags); fflush(stderr); - - env->GetCharArrayRegion(text, min, len, chars); - - jfloat x, y; - getFloat(env, pt, x, y); - jboolean rtl = (typo_flags & TYPO_RTL) != 0; - int glyphCount = engine->layoutChars(chars, start - min, limit - start, len, rtl, x, y, success); - // fprintf(stderr, "sle nl len %d -> gc: %d\n", len, glyphCount); fflush(stderr); - - engine->getGlyphPosition(glyphCount, x, y, success); - - // fprintf(stderr, "layout glyphs: %d x: %g y: %g\n", glyphCount, x, y); fflush(stderr); - if (LE_FAILURE(success)) { - env->SetIntField(gvdata, gvdCountFID, -1); // flag failure - } else { - if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) { - if (!(env->ExceptionCheck())) { - // !!! hmmm, could use current value in positions array of GVData... - putFloat(env, pt, x, y); - } - } - } - - if (chars != buffer) { - free(chars); - } - - delete engine; - -}
--- a/src/java.desktop/share/native/libfontmanager/layout/ThaiLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LayoutEngine.h" -#include "ThaiLayoutEngine.h" -#include "ScriptAndLanguageTags.h" -#include "LEGlyphStorage.h" - -#include "KernTable.h" - -#include "ThaiShaping.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ThaiLayoutEngine) - -ThaiLayoutEngine::ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success) - : LayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) -{ - fErrorChar = 0x25CC; - - // Figure out which presentation forms the font uses - if (! fontInstance->canDisplay(0x0E01)) { - // No Thai in font; don't use presentation forms. - fGlyphSet = 3; - } else if (fontInstance->canDisplay(0x0E64)) { - // WorldType uses reserved space in Thai block - fGlyphSet = 0; - } else if (fontInstance->canDisplay(0xF701)) { - // Microsoft corporate zone - fGlyphSet = 1; - - if (!fontInstance->canDisplay(fErrorChar)) { - fErrorChar = 0xF71B; - } - } else if (fontInstance->canDisplay(0xF885)) { - // Apple corporate zone - fGlyphSet = 2; - } else { - // no presentation forms in the font - fGlyphSet = 3; - } -} - -ThaiLayoutEngine::~ThaiLayoutEngine() -{ - // nothing to do -} - -// Input: characters (0..max provided for context) -// Output: glyphs, char indices -// Returns: the glyph count -// NOTE: this assumes that ThaiShaping::compose will allocate the outChars array... -le_int32 ThaiLayoutEngine::computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool /*rightToLeft*/, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - LEUnicode *outChars; - le_int32 glyphCount; - - // This is enough room for the worst-case expansion - // (it says here...) - outChars = LE_NEW_ARRAY(LEUnicode, count * 2); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(count * 2, FALSE, success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphCount = ThaiShaping::compose(chars, offset, count, fGlyphSet, fErrorChar, outChars, glyphStorage); - mapCharsToGlyphs(outChars, 0, glyphCount, FALSE, FALSE, glyphStorage, success); - - LE_DELETE_ARRAY(outChars); - - glyphStorage.adoptGlyphCount(glyphCount); - return glyphCount; -} - -// This is the same as LayoutEngline::adjustGlyphPositions() except that it doesn't call adjustMarkGlyphs -void ThaiLayoutEngine::adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool /*reverse*/, - LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return; - } - - if (chars == NULL || offset < 0 || count < 0) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return; - } - - if (fTypoFlags & LE_Kerning_FEATURE_FLAG) { /* kerning enabled */ - LETableReference kernTable(fFontInstance, LE_KERN_TABLE_TAG, success); - KernTable kt(kernTable, success); - kt.process(glyphStorage, success); - } - - // default is no adjustments - return; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ThaiLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - */ - -#ifndef __THAILAYOUTENGINE_H -#define __THAILAYOUTENGINE_H - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "LayoutEngine.h" - -#include "ThaiShaping.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -/** - * This class implements layout for the Thai script, using the ThaiShapingClass. - * All existing Thai fonts use an encoding which assigns character codes to all - * the variant forms needed to display accents and tone marks correctly in context. - * This class can deal with fonts using the Microsoft, Macintosh, and WorldType encodings. - * - * @internal - */ -class ThaiLayoutEngine : public LayoutEngine -{ -public: - /** - * This constructs an instance of ThaiLayoutEngine for the given font, script and - * language. It examines the font, using LEFontInstance::canDisplay, to set fGlyphSet - * and fErrorChar. (see below) - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param languageCode - the language - * @param success - set to an error code if the operation fails - * - * @see LEFontInstance - * @see ScriptAndLanguageTags.h for script and language codes - * - * @internal - */ - ThaiLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~ThaiLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -protected: - /** - * A small integer indicating which Thai encoding - * the font uses. - * - * @see ThaiShaping - * - * @internal - */ - le_uint8 fGlyphSet; - - /** - * The character used as a base for vowels and - * tone marks that are out of sequence. Usually - * this will be Unicode 0x25CC, if the font can - * display it. - * - * @see ThaiShaping - * - * @internal - */ - LEUnicode fErrorChar; - - /** - * This method performs Thai layout. It calls ThaiShaping::compose to - * generate the correct contextual character codes, and then calls - * mapCharsToGlyphs to generate the glyph indices. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the text is in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and char index arrays will be set. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the number of glyphs in the glyph index array - * - * @see ThaiShaping - * - * @internal - */ - virtual le_int32 computeGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEGlyphStorage &glyphStorage, LEErrorCode &success); - - /** - * This method does positioning adjustments like accent positioning and - * kerning. The default implementation does nothing. Subclasses needing - * position adjustments must override this method. - * - * Note that this method has both characters and glyphs as input so that - * it can use the character codes to determine glyph types if that information - * isn't directly available. (e.g. Some Arabic OpenType fonts don't have a GDEF - * table) - * - * @param chars - the input character context - * @param offset - the offset of the first character to process - * @param count - the number of characters to process - * @param reverse - <code>TRUE</code> if the glyphs in the glyph array have been reordered - * @param glyphStorage - the object which holds the per-glyph storage. The glyph positions will be - * adjusted as needed. - * @param success - output parameter set to an error code if the operation fails - * - * @internal - */ - virtual void adjustGlyphPositions(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,332 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" -#include "LEGlyphStorage.h" -#include "ThaiShaping.h" - -U_NAMESPACE_BEGIN - -enum { - CH_SPACE = 0x0020, - CH_YAMAKKAN = 0x0E4E, - CH_MAI_HANAKAT = 0x0E31, - CH_SARA_AA = 0x0E32, - CH_SARA_AM = 0x0E33, - CH_SARA_UEE = 0x0E37, - CH_MAITAIKHU = 0x0E47, - CH_NIKHAHIT = 0x0E4D, - CH_SARA_U = 0x0E38, - CH_PHINTHU = 0x0E3A, - CH_YO_YING = 0x0E0D, - CH_THO_THAN = 0x0E10, - CH_DOTTED_CIRCLE = 0x25CC -}; - - le_uint8 ThaiShaping::getCharClass(LEUnicode ch) -{ - le_uint8 charClass = NON; - - if (ch >= 0x0E00 && ch <= 0x0E5B) { - charClass = classTable[ch - 0x0E00]; - } - - return charClass; -} - - -LEUnicode ThaiShaping::leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet) -{ - static const LEUnicode leftAboveVowels[][7] = { - {0x0E61, 0x0E32, 0x0E33, 0x0E64, 0x0E65, 0x0E66, 0x0E67}, - {0xF710, 0x0E32, 0x0E33, 0xF701, 0xF702, 0xF703, 0xF704}, - {0xF884, 0x0E32, 0x0E33, 0xF885, 0xF886, 0xF887, 0xF788}, - {0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37} - }; - - if (vowel >= CH_MAI_HANAKAT && vowel <= CH_SARA_UEE) { - return leftAboveVowels[glyphSet][vowel - CH_MAI_HANAKAT]; - } - - if (vowel == CH_YAMAKKAN && glyphSet == 0) { - return 0x0E7E; - } - - return vowel; -} - -LEUnicode ThaiShaping::lowerRightTone(LEUnicode tone, le_uint8 glyphSet) -{ - static const LEUnicode lowerRightTones[][7] = { - {0x0E68, 0x0E69, 0x0E6A, 0x0E6B, 0x0E6C, 0x0E6D, 0x0E6E}, - {0x0E47, 0xF70A, 0xF70B, 0xF70C, 0xF70D, 0xF70E, 0x0E4D}, - {0x0E47, 0xF88B, 0xF88E, 0xF891, 0xF894, 0xF897, 0x0E4D}, - {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} - }; - - if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { - return lowerRightTones[glyphSet][tone - CH_MAITAIKHU]; - } - - return tone; -} - -LEUnicode ThaiShaping::lowerLeftTone(LEUnicode tone, le_uint8 glyphSet) -{ - static const LEUnicode lowerLeftTones[][7] = { - {0x0E76, 0x0E77, 0x0E78, 0x0E79, 0x0E7A, 0x0E7B, 0x0E7C}, - {0xF712, 0xF705, 0xF706, 0xF707, 0xF708, 0xF709, 0xF711}, - {0xF889, 0xF88C, 0xF88F, 0xF892, 0xF895, 0xF898, 0xF899}, - {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} - }; - - if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { - return lowerLeftTones[glyphSet][tone - CH_MAITAIKHU]; - } - - return tone; -} - -LEUnicode ThaiShaping::upperLeftTone(LEUnicode tone, le_uint8 glyphSet) -{ - static const LEUnicode upperLeftTones[][7] = { - {0x0E6F, 0x0E70, 0x0E71, 0x0E72, 0x0E73, 0x0E74, 0x0E75}, - {0xF712, 0xF713, 0xF714, 0xF715, 0xF716, 0xF717, 0xF711}, - {0xF889, 0xF88A, 0xF88D, 0xF890, 0xF893, 0xF896, 0xF899}, - {0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D} - }; - - if (tone >= CH_MAITAIKHU && tone <= CH_NIKHAHIT) { - return upperLeftTones[glyphSet][tone - CH_MAITAIKHU]; - } - - return tone; -} - -LEUnicode ThaiShaping::lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet) -{ - static const LEUnicode lowerBelowVowels[][3] = { - {0x0E3C, 0x0E3D, 0x0E3E}, - {0xF718, 0xF719, 0xF71A}, - {0x0E38, 0x0E39, 0x0E3A}, - {0x0E38, 0x0E39, 0x0E3A} - - }; - - if (vowel >= CH_SARA_U && vowel <= CH_PHINTHU) { - return lowerBelowVowels[glyphSet][vowel - CH_SARA_U]; - } - - return vowel; -} - -LEUnicode ThaiShaping::noDescenderCOD(LEUnicode cod, le_uint8 glyphSet) -{ - static const LEUnicode noDescenderCODs[][4] = { - {0x0E60, 0x0E0E, 0x0E0F, 0x0E63}, - {0xF70F, 0x0E0E, 0x0E0F, 0xF700}, - {0x0E0D, 0x0E0E, 0x0E0F, 0x0E10}, - {0x0E0D, 0x0E0E, 0x0E0F, 0x0E10} - - }; - - if (cod >= CH_YO_YING && cod <= CH_THO_THAN) { - return noDescenderCODs[glyphSet][cod - CH_YO_YING]; - } - - return cod; -} - -le_uint8 ThaiShaping::doTransition (StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) -{ - LEErrorCode success = LE_NO_ERROR; - - switch (transition.action) { - case tA: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - - case tC: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - - case tD: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = leftAboveVowel(currChar, glyphSet); - break; - - case tE: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = lowerRightTone(currChar, glyphSet); - break; - - case tF: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = lowerLeftTone(currChar, glyphSet); - break; - - case tG: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = upperLeftTone(currChar, glyphSet); - break; - - case tH: - { - LEUnicode cod = outputBuffer[outputIndex - 1]; - LEUnicode coa = noDescenderCOD(cod, glyphSet); - - if (cod != coa) { - outputBuffer[outputIndex - 1] = coa; - - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - } - - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = lowerBelowVowel(currChar, glyphSet); - break; - } - - case tR: - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = errorChar; - - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - - case tS: - if (currChar == CH_SARA_AM) { - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = errorChar; - } - - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - - default: - // FIXME: if we get here, there's an error - // in the state table! - glyphStorage.setCharIndex(outputIndex, inputIndex, success); - outputBuffer[outputIndex++] = currChar; - break; - } - - return transition.nextState; -} - -le_uint8 ThaiShaping::getNextState(LEUnicode ch, le_uint8 prevState, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, - le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex) -{ - StateTransition transition; - - charClass = getCharClass(ch); - transition = getTransition(prevState, charClass); - - return doTransition(transition, ch, inputIndex, glyphSet, errorChar, output, glyphStorage, outputIndex); -} - -le_bool ThaiShaping::isLegalHere(LEUnicode ch, le_uint8 prevState) -{ - le_uint8 charClass = getCharClass(ch); - StateTransition transition = getTransition(prevState, charClass); - - switch (transition.action) { - case tA: - case tC: - case tD: - case tE: - case tF: - case tG: - case tH: - return TRUE; - - case tR: - case tS: - return FALSE; - - default: - // FIXME: if we get here, there's an error - // in the state table! - return FALSE; - } -} - -le_int32 ThaiShaping::compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage) -{ - le_uint8 state = 0; - le_int32 inputIndex; - le_int32 outputIndex = 0; - le_uint8 conState = 0xFF; - le_int32 conInput = -1; - le_int32 conOutput = -1; - - for (inputIndex = 0; inputIndex < charCount; inputIndex += 1) { - LEUnicode ch = input[inputIndex + offset]; - le_uint8 charClass; - - // Decompose SARA AM into NIKHAHIT + SARA AA - if (ch == CH_SARA_AM && isLegalHere(ch, state) && conState < stateCount) { - outputIndex = conOutput; - state = getNextState(CH_NIKHAHIT, conState, inputIndex, glyphSet, errorChar, charClass, - output, glyphStorage, outputIndex); - - for (int j = conInput + 1; j < inputIndex; j += 1) { - ch = input[j + offset]; - state = getNextState(ch, state, j, glyphSet, errorChar, charClass, - output, glyphStorage, outputIndex); - } - - ch = CH_SARA_AA; - } - - state = getNextState(ch, state, inputIndex, glyphSet, errorChar, charClass, - output, glyphStorage, outputIndex); - - if (charClass >= CON && charClass <= COD) { - conState = state; - conInput = inputIndex; - conOutput = outputIndex; - } - } - - return outputIndex; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __THAISHAPING_H -#define __THAISHAPING_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEGlyphFilter.h" -#include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class ThaiShaping /* not : public UObject because all methods are static */ { -public: - - enum { - // Character classes - NON = 0, - CON = 1, - COA = 2, - COD = 3, - LVO = 4, - FV1 = 5, - FV2 = 6, - FV3 = 7, - BV1 = 8, - BV2 = 9, - BDI = 10, - TON = 11, - AD1 = 12, - AD2 = 13, - AD3 = 14, - NIK = 15, - AV1 = 16, - AV2 = 17, - AV3 = 18, - classCount = 19, - - // State Transition actions - tA = 0, - tC = 1, - tD = 2, - tE = 3, - tF = 4, - tG = 5, - tH = 6, - tR = 7, - tS = 8, - stateCount = 52 - }; - - struct StateTransition - { - le_uint8 nextState; - le_uint8 action; - - le_uint8 getNextState() { return nextState; }; - le_uint8 getAction() { return action; }; - }; - - static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); - -private: - // forbid instantiation - ThaiShaping(); - - static const le_uint8 classTable[]; - static const StateTransition thaiStateTable[stateCount][classCount]; - - inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass); - - static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, - LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); - - static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, - le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); - - static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); - static le_uint8 getCharClass(LEUnicode ch); - - static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); - static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); - static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); - static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); - static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); - static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); - -}; - -inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) -{ - return thaiStateTable[state][currClass]; -} - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ThaiStateTables.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * - * (C) Copyright IBM Corp. 1999-2003 - All Rights Reserved - * - * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT UNLESS - * YOU REALLY KNOW WHAT YOU'RE DOING. - * - */ - -#include "LETypes.h" -#include "ThaiShaping.h" - -U_NAMESPACE_BEGIN - -const le_uint8 ThaiShaping::classTable[] = { - // 0 1 2 3 4 5 6 7 8 9 A B C D E F - // ------------------------------------------------------------------------------- - /*0E00*/ NON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COD, COD, COD, - /*0E10*/ COD, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COA, CON, COA, CON, COA, - /*0E20*/ CON, CON, CON, CON, FV3, CON, FV3, CON, CON, CON, CON, CON, CON, CON, CON, NON, - /*0E30*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, BV1, BV2, BDI, NON, NON, NON, NON, NON, - /*0E40*/ LVO, LVO, LVO, LVO, LVO, FV2, NON, AD2, TON, TON, TON, TON, AD1, NIK, AD3, NON, - /*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON -}; - -const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[ThaiShaping::stateCount][ThaiShaping::classCount] = { - //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - //| N C C C L F F F B B B T A A A N A A A | - //| O O O O V V V V V V D O D D D I V V V | - //| N N A D O 1 2 3 1 2 I N 1 2 3 K 1 2 3 | - //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - /*00*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*01*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 2, tC}, { 6, tC}, { 0, tC}, { 8, tE}, { 0, tE}, { 0, tE}, { 0, tC}, { 9, tE}, {11, tC}, {14, tC}, {16, tC}}, - /*02*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 3, tE}, { 0, tE}, { 0, tR}, { 0, tR}, { 4, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*03*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*04*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 5, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*05*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*06*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 7, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*07*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*08*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*09*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {10, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*10*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*11*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {12, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {13, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*12*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*13*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*14*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {15, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*15*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*16*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {17, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*17*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*18*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {19, tC}, {23, tC}, { 0, tC}, {25, tF}, { 0, tF}, { 0, tF}, { 0, tD}, {26, tF}, {28, tD}, {31, tD}, {33, tD}}, - /*19*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {20, tF}, { 0, tF}, { 0, tR}, { 0, tR}, {21, tF}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*20*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*21*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {22, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*22*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*23*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {24, tF}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*24*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*25*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*26*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {27, tG}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*27*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*28*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {29, tG}, { 0, tG}, { 0, tR}, { 0, tR}, {30, tG}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*29*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*30*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*31*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {32, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*32*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*33*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {34, tG}, { 0, tR}, { 0, tG}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*34*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*35*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tS}, { 0, tA}, {36, tH}, {40, tH}, { 0, tH}, {42, tE}, { 0, tE}, { 0, tE}, { 0, tC}, {43, tE}, {45, tC}, {48, tC}, {50, tC}}, - /*36*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {37, tE}, { 0, tE}, { 0, tR}, { 0, tR}, {38, tE}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*37*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*38*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {39, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*39*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*40*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {41, tE}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*41*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*42*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*43*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {44, tC}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*44*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*45*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {46, tC}, { 0, tC}, { 0, tR}, { 0, tR}, {47, tC}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*46*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*47*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*48*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {49, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*49*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*50*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tS}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, {51, tC}, { 0, tR}, { 0, tC}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}}, - /*51*/ {{ 0, tA}, { 1, tA}, {18, tA}, {35, tA}, { 0, tA}, { 0, tS}, { 0, tA}, { 0, tA}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}, { 0, tR}} -}; - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/TibetanLayoutEngine.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - * Developed at DIT - Government of Bhutan - * - * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> - * - * This file is a modification of the ICU file KhmerReordering.cpp - * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan - * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. - * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola - * - */ - - -#include "OpenTypeLayoutEngine.h" -#include "TibetanLayoutEngine.h" -#include "LEGlyphStorage.h" -#include "TibetanReordering.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TibetanOpenTypeLayoutEngine) - -TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success) -{ - fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; -} - -TibetanOpenTypeLayoutEngine::TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success) - : OpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, success) -{ - fFeatureMap = TibetanReordering::getFeatureMap(fFeatureMapCount); - fFeatureOrder = TRUE; -} - -TibetanOpenTypeLayoutEngine::~TibetanOpenTypeLayoutEngine() -{ - // nothing to do -} - -// Input: characters -// Output: characters, char indices, tags -// Returns: output character count -le_int32 TibetanOpenTypeLayoutEngine::characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if (LE_FAILURE(success)) { - return 0; - } - - if (chars == NULL || offset < 0 || count < 0 || max < 0 || offset >= max || offset + count > max) { - success = LE_ILLEGAL_ARGUMENT_ERROR; - return 0; - } - - le_int32 worstCase = count * 3; // worst case is 3 for Khmer TODO check if 2 is enough - - outChars = LE_NEW_ARRAY(LEUnicode, worstCase); - - if (outChars == NULL) { - success = LE_MEMORY_ALLOCATION_ERROR; - return 0; - } - - glyphStorage.allocateGlyphArray(worstCase, rightToLeft, success); - glyphStorage.allocateAuxData(success); - - if (LE_FAILURE(success)) { - LE_DELETE_ARRAY(outChars); - return 0; - } - - // NOTE: assumes this allocates featureTags... - // (probably better than doing the worst case stuff here...) - le_int32 outCharCount = TibetanReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage); - - glyphStorage.adoptGlyphCount(outCharCount); - return outCharCount; -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/TibetanLayoutEngine.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - * Developed at DIT - Government of Bhutan - * - * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> - * - * This file is a modification of the ICU file KhmerReordering.cpp - * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan - * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. - * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola - * - */ - -#ifndef __TIBETANLAYOUTENGINE_H -#define __TIBETANLAYOUTENGINE_H - -// #include "LETypes.h" -// #include "LEFontInstance.h" -// #include "LEGlyphFilter.h" -// #include "LayoutEngine.h" -// #include "OpenTypeLayoutEngine.h" - -// #include "GlyphSubstitutionTables.h" -// #include "GlyphDefinitionTables.h" -// #include "GlyphPositioningTables.h" - -U_NAMESPACE_BEGIN - -// class MPreFixups; -// class LEGlyphStorage; - -/** - * This class implements OpenType layout for Dzongkha and Tibetan OpenType fonts - * - * @internal - */ -class TibetanOpenTypeLayoutEngine : public OpenTypeLayoutEngine -{ -public: - /** - * This is the main constructor. It constructs an instance of TibetanOpenTypeLayoutEngine for - * a particular font, script and language. It takes the GSUB table as a parameter since - * LayoutEngine::layoutEngineFactory has to read the GSUB table to know that it has an - * Tibetan OpenType font. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param gsubTable - the GSUB table - * @param success - set to an error code if the operation fails - * - * @see LayoutEngine::layoutEngineFactory - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, const LEReferenceTo<GlyphSubstitutionTableHeader> &gsubTable, LEErrorCode &success); - - /** - * This constructor is used when the font requires a "canned" GSUB table which can't be known - * until after this constructor has been invoked. - * - * @param fontInstance - the font - * @param scriptCode - the script - * @param langaugeCode - the language - * @param success - set to an error code if the operation fails - * - * @see OpenTypeLayoutEngine - * @see ScriptAndLangaugeTags.h for script and language codes - * - * @internal - */ - TibetanOpenTypeLayoutEngine(const LEFontInstance *fontInstance, le_int32 scriptCode, le_int32 languageCode, - le_int32 typoFlags, LEErrorCode &success); - - /** - * The destructor, virtual for correct polymorphic invocation. - * - * @internal - */ - virtual ~TibetanOpenTypeLayoutEngine(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @internal ICU 3.6 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @internal ICU 3.6 - */ - static UClassID getStaticClassID(); - -protected: - - /** - * This method does Tibetan OpenType character processing. It assigns the OpenType feature - * tags to the characters, and may generate output characters which have been reordered. - * It may also split some vowels, resulting in more output characters than input characters. - * - * Input parameters: - * @param chars - the input character context - * @param offset - the index of the first character to process - * @param count - the number of characters to process - * @param max - the number of characters in the input context - * @param rightToLeft - <code>TRUE</code> if the characters are in a right to left directional run - * @param glyphStorage - the glyph storage object. The glyph and character index arrays will be set. - * the auxillary data array will be set to the feature tags. - * - * Output parameters: - * @param success - set to an error code if the operation fails - * - * @return the output character count - * - * @internal - */ - virtual le_int32 characterProcessing(const LEUnicode chars[], le_int32 offset, le_int32 count, le_int32 max, le_bool rightToLeft, - LEUnicode *&outChars, LEGlyphStorage &glyphStorage, LEErrorCode &success); - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/TibetanReordering.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,414 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - * Developed at DIT - Government of Bhutan - * - * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> - * - * This file is a modification of the ICU file KhmerReordering.cpp - * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan - * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. - * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola - * - */ - -//#include <stdio.h> -#include "LETypes.h" -#include "OpenTypeTables.h" -#include "TibetanReordering.h" -#include "LEGlyphStorage.h" - - -U_NAMESPACE_BEGIN - -// Characters that get referred to by name... -enum -{ - C_DOTTED_CIRCLE = 0x25CC, - C_PRE_NUMBER_MARK = 0x0F3F - }; - - -enum -{ - // simple classes, they are used in the statetable (in this file) to control the length of a syllable - // they are also used to know where a character should be placed (location in reference to the base character) - // and also to know if a character, when independtly displayed, should be displayed with a dotted-circle to - // indicate error in syllable construction - _xx = TibetanClassTable::CC_RESERVED, - _ba = TibetanClassTable::CC_BASE, - _sj = TibetanClassTable::CC_SUBJOINED | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _tp = TibetanClassTable::CC_TSA_PHRU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, - _ac = TibetanClassTable::CC_A_CHUNG | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _cs = TibetanClassTable::CC_COMP_SANSKRIT | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _ha = TibetanClassTable::CC_HALANTA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _bv = TibetanClassTable::CC_BELOW_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _av = TibetanClassTable::CC_ABOVE_VOWEL | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, - _an = TibetanClassTable::CC_ANUSVARA | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, - _cb = TibetanClassTable::CC_CANDRABINDU | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, - _vs = TibetanClassTable::CC_VISARGA | TibetanClassTable::CF_DOTTED_CIRCLE| TibetanClassTable::CF_POS_AFTER, - _as = TibetanClassTable::CC_ABOVE_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_ABOVE, - _bs = TibetanClassTable::CC_BELOW_S_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_BELOW, - _di = TibetanClassTable::CC_DIGIT | TibetanClassTable::CF_DIGIT, - _pd = TibetanClassTable::CC_PRE_DIGIT_MARK | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_PREDIGIT | TibetanClassTable::CF_POS_BEFORE , - _bd = TibetanClassTable::CC_POST_BELOW_DIGIT_M | TibetanClassTable::CF_DOTTED_CIRCLE | TibetanClassTable::CF_POS_AFTER -}; - - -// Character class tables -//_xx Non Combining characters -//_ba Base Consonants -//_sj Subjoined consonants -//_tp Tsa - phru -//_ac A-chung, Vowel Lengthening mark -//_cs Precomposed Sanskrit vowel + subjoined consonants -//_ha Halanta/Virama -//_bv Below vowel -//_av above vowel -//_an Anusvara -//_cb Candrabindu -//_vs Visaraga/Post mark -//_as Upper Stress marks -//_bs Lower Stress marks -//_di Digit -//_pd Number pre combining, Needs reordering -//_bd Other number combining marks - -static const TibetanClassTable::CharClass tibetanCharClasses[] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - _xx, _ba, _xx, _xx, _ba, _ba, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0F00 - 0F0F 0 - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _bd, _bd, _xx, _xx, _xx, _xx, _xx, _xx, // 0F10 - 0F1F 1 - _di, _di, _di, _di, _di, _di, _di, _di, _di, _di, _xx, _xx, _xx, _xx, _xx, _xx, // 0F20 - 0F2F 2 - _xx, _xx, _xx, _xx, _xx, _bs, _xx, _bs, _xx, _tp, _xx, _xx, _xx, _xx, _bd, _pd, // 0F30 - 0F3F 3 - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F40 - 0F4F 4 - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, // 0F50 - 0F5F 5 - _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, _xx, // 0F60 - 0F6F 6 - _xx, _ac, _av, _cs, _bv, _bv, _cs, _cs, _cs, _cs, _av, _av, _av, _av, _an, _vs, // 0F70 - 0F7F 7 - _av, _cs, _cb, _cb, _ha, _xx, _as, _as, _ba, _ba, _ba, _ba, _xx, _xx, _xx, _xx, // 0F80 - 0F8F 8 - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0F90 - 0F9F 9 - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, // 0FA0 - 0FAF a - _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _sj, _xx, _sj, _sj, // 0FB0 - 0FBF b - _xx, _xx, _xx, _xx, _xx, _xx, _bs, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FC0 - 0FCF c - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx,// 0FD0 - 0FDF d - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FE0 - 0FEF e - _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, // 0FF0 - 0FFF f -}; - - -// -// Tibetan Class Tables -// - -// -// The range of characters defined in the above table is defined here. For Tibetan 0F00 to 0FFF -// Even if the Tibetan range is bigger, most of the characters are not combinable, and therefore treated -// as _xx -static const TibetanClassTable tibetanClassTable = {0x0F00, 0x0FFF, tibetanCharClasses}; - - -// Below we define how a character in the input string is either in the tibetanCharClasses table -// (in which case we get its type back), or an unknown object in which case we get _xx (CC_RESERVED) back -TibetanClassTable::CharClass TibetanClassTable::getCharClass(LEUnicode ch) const -{ - if (ch < firstChar || ch > lastChar) { - return CC_RESERVED; - } - - return classTable[ch - firstChar]; -} - -const TibetanClassTable *TibetanClassTable::getTibetanClassTable() -{ - return &tibetanClassTable; -} - - - -class TibetanReorderingOutput : public UMemory { -private: - le_int32 fSyllableCount; - le_int32 fOutIndex; - LEUnicode *fOutChars; - - LEGlyphStorage &fGlyphStorage; - - -public: - TibetanReorderingOutput(LEUnicode *outChars, LEGlyphStorage &glyphStorage) - : fSyllableCount(0), fOutIndex(0), fOutChars(outChars), fGlyphStorage(glyphStorage) - { - // nothing else to do... - } - - ~TibetanReorderingOutput() - { - // nothing to do here... - } - - void reset() - { - fSyllableCount += 1; - } - - void writeChar(LEUnicode ch, le_uint32 charIndex, FeatureMask featureMask) - { - LEErrorCode success = LE_NO_ERROR; - - fOutChars[fOutIndex] = ch; - - fGlyphStorage.setCharIndex(fOutIndex, charIndex, success); - fGlyphStorage.setAuxData(fOutIndex, featureMask, success); - - fOutIndex += 1; - } - - le_int32 getOutputIndex() - { - return fOutIndex; - } -}; - - -//TODO remove unused flags -#define ccmpFeatureTag LE_CCMP_FEATURE_TAG -#define blwfFeatureTag LE_BLWF_FEATURE_TAG -#define pstfFeatureTag LE_PSTF_FEATURE_TAG -#define presFeatureTag LE_PRES_FEATURE_TAG -#define blwsFeatureTag LE_BLWS_FEATURE_TAG -#define abvsFeatureTag LE_ABVS_FEATURE_TAG -#define pstsFeatureTag LE_PSTS_FEATURE_TAG - -#define blwmFeatureTag LE_BLWM_FEATURE_TAG -#define abvmFeatureTag LE_ABVM_FEATURE_TAG -#define distFeatureTag LE_DIST_FEATURE_TAG - -#define prefFeatureTag LE_PREF_FEATURE_TAG -#define abvfFeatureTag LE_ABVF_FEATURE_TAG -#define cligFeatureTag LE_CLIG_FEATURE_TAG -#define mkmkFeatureTag LE_MKMK_FEATURE_TAG - -// Shaping features -#define prefFeatureMask 0x80000000UL -#define blwfFeatureMask 0x40000000UL -#define abvfFeatureMask 0x20000000UL -#define pstfFeatureMask 0x10000000UL -#define presFeatureMask 0x08000000UL -#define blwsFeatureMask 0x04000000UL -#define abvsFeatureMask 0x02000000UL -#define pstsFeatureMask 0x01000000UL -#define cligFeatureMask 0x00800000UL -#define ccmpFeatureMask 0x00040000UL - -// Positioning features -#define distFeatureMask 0x00400000UL -#define blwmFeatureMask 0x00200000UL -#define abvmFeatureMask 0x00100000UL -#define mkmkFeatureMask 0x00080000UL - -#define tagPref (ccmpFeatureMask | prefFeatureMask | presFeatureMask | cligFeatureMask | distFeatureMask) -#define tagAbvf (ccmpFeatureMask | abvfFeatureMask | abvsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | mkmkFeatureMask) -#define tagPstf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | prefFeatureMask | presFeatureMask | pstfFeatureMask | pstsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask) -#define tagBlwf (ccmpFeatureMask | blwfFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | blwmFeatureMask | mkmkFeatureMask) -#define tagDefault (ccmpFeatureMask | prefFeatureMask | blwfFeatureMask | presFeatureMask | blwsFeatureMask | cligFeatureMask | distFeatureMask | abvmFeatureMask | blwmFeatureMask | mkmkFeatureMask) - - - -// These are in the order in which the features need to be applied -// for correct processing -static const FeatureMap featureMap[] = -{ - // Shaping features - {ccmpFeatureTag, ccmpFeatureMask}, - {prefFeatureTag, prefFeatureMask}, - {blwfFeatureTag, blwfFeatureMask}, - {abvfFeatureTag, abvfFeatureMask}, - {pstfFeatureTag, pstfFeatureMask}, - {presFeatureTag, presFeatureMask}, - {blwsFeatureTag, blwsFeatureMask}, - {abvsFeatureTag, abvsFeatureMask}, - {pstsFeatureTag, pstsFeatureMask}, - {cligFeatureTag, cligFeatureMask}, - - // Positioning features - {distFeatureTag, distFeatureMask}, - {blwmFeatureTag, blwmFeatureMask}, - {abvmFeatureTag, abvmFeatureMask}, - {mkmkFeatureTag, mkmkFeatureMask}, -}; - -static const le_int32 featureMapCount = LE_ARRAY_SIZE(featureMap); - -// The stateTable is used to calculate the end (the length) of a well -// formed Tibetan Syllable. -// -// Each horizontal line is ordered exactly the same way as the values in TibetanClassTable -// CharClassValues in TibetanReordering.h This coincidence of values allows the -// follow up of the table. -// -// Each line corresponds to a state, which does not necessarily need to be a type -// of component... for example, state 2 is a base, with is always a first character -// in the syllable, but the state could be produced a consonant of any type when -// it is the first character that is analysed (in ground state). -// -static const le_int8 tibetanStateTable[][TibetanClassTable::CC_COUNT] = -{ - - - //Dzongkha state table - //xx ba sj tp ac cs ha bv av an cb vs as bs di pd bd - { 1, 2, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, 20, 21, 21,}, // 0 - ground state - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 1 - exit state (or sign to the right of the syllable) - {-1, -1, 4, 3, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 2 - Base consonant - {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 3 - Tsa phru after base - {-1, -1, 4, 6, 8, 7, 9, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 4 - Subjoined consonant after base - {-1, -1, 5, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 5 - Subjoined consonant after tsa phru - {-1, -1, -1, -1, 8, 7, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 6 - Tsa phru after subjoined consonant - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 7 - Pre Composed Sanskrit - {-1, -1, -1, -1, -1, -1, -1, 10, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 8 - A-chung - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, -1, 19, 19, -1, -1, -1,}, // 9 - Halanta - {-1, -1, -1, -1, -1, -1, -1, 11, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 10 - below vowel 1 - {-1, -1, -1, -1, -1, -1, -1, 12, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 11 - below vowel 2 - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 13, 17, 18, 19, 19, -1, -1, -1,}, // 12 - below vowel 3 - {-1, -1, -1, -1, -1, -1, -1, -1, 14, 17, 17, 18, 19, 19, -1, -1, -1,}, // 13 - Anusvara before vowel - {-1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 17, 18, 19, 19, -1, -1, -1,}, // 14 - above vowel 1 - {-1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 17, 18, 19, 19, -1, -1, -1,}, // 15 - above vowel 2 - {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 17, 18, 19, 19, -1, -1, -1,}, // 16 - above vowel 3 - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, 19, -1, -1, -1,}, // 17 - Anusvara or Candrabindu after vowel - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1,}, // 18 - Visarga - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 19 - strss mark - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21,}, // 20 - digit - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,}, // 21 - digit mark - - -}; - - -const FeatureMap *TibetanReordering::getFeatureMap(le_int32 &count) -{ - count = featureMapCount; - - return featureMap; -} - - -// Given an input string of characters and a location in which to start looking -// calculate, using the state table, which one is the last character of the syllable -// that starts in the starting position. -le_int32 TibetanReordering::findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount) -{ - le_int32 cursor = prev; - le_int8 state = 0; - - while (cursor < charCount) { - TibetanClassTable::CharClass charClass = (classTable->getCharClass(chars[cursor]) & TibetanClassTable::CF_CLASS_MASK); - - state = tibetanStateTable[state][charClass]; - - if (state < 0) { - break; - } - - cursor += 1; - } - - return cursor; -} - - -// This is the real reordering function as applied to the Tibetan language - -le_int32 TibetanReordering::reorder(const LEUnicode *chars, le_int32 charCount, le_int32, - LEUnicode *outChars, LEGlyphStorage &glyphStorage) -{ - const TibetanClassTable *classTable = TibetanClassTable::getTibetanClassTable(); - - TibetanReorderingOutput output(outChars, glyphStorage); - TibetanClassTable::CharClass charClass; - le_int32 i, prev = 0; - - // This loop only exits when we reach the end of a run, which may contain - // several syllables. - while (prev < charCount) { - le_int32 syllable = findSyllable(classTable, chars, prev, charCount); - - output.reset(); - - // shall we add a dotted circle? - // If in the position in which the base should be (first char in the string) there is - // a character that has the Dotted circle flag (a character that cannot be a base) - // then write a dotted circle - if (classTable->getCharClass(chars[prev]) & TibetanClassTable::CF_DOTTED_CIRCLE) { - output.writeChar(C_DOTTED_CIRCLE, prev, tagDefault); - } - - // copy the rest to output, inverting the pre-number mark if present after a digit. - for (i = prev; i < syllable; i += 1) { - charClass = classTable->getCharClass(chars[i]); - - if ((TibetanClassTable::CF_DIGIT & charClass) - && ( classTable->getCharClass(chars[i+1]) & TibetanClassTable::CF_PREDIGIT)) - { - output.writeChar(C_PRE_NUMBER_MARK, i, tagPref); - output.writeChar(chars[i], i+1 , tagPref); - i += 1; - } else { - switch (charClass & TibetanClassTable::CF_POS_MASK) { - - // If the present character is a number, and the next character is a pre-number combining mark - // then the two characters are reordered - - case TibetanClassTable::CF_POS_ABOVE : - output.writeChar(chars[i], i, tagAbvf); - break; - - case TibetanClassTable::CF_POS_AFTER : - output.writeChar(chars[i], i, tagPstf); - break; - - case TibetanClassTable::CF_POS_BELOW : - output.writeChar(chars[i], i, tagBlwf); - break; - - default: - // default - any other characters - output.writeChar(chars[i], i, tagDefault); - break; - } // switch - } // if - } // for - - prev = syllable; // move the pointer to the start of next syllable - } - - return output.getOutputIndex(); -} - - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/TibetanReordering.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2010 - All Rights Reserved - * - * Developed at DIT - Government of Bhutan - * - * Contact person: Pema Geyleg - <pema_geyleg@druknet.bt> - * - * This file is a modification of the ICU file KhmerReordering.h - * by Jens Herden and Javier Sola who have given all their possible rights to IBM and the Governement of Bhutan - * A first module for Dzongkha was developed by Karunakar under Panlocalisation funding. - * Assistance for this module has been received from Namgay Thinley, Christopher Fynn and Javier Sola - * - */ - -#ifndef __TIBETANREORDERING_H -#define __TIBETANREORDERING_H - -/** - * \file - * \internal - */ - -// #include "LETypes.h" -// #include "OpenTypeTables.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -// Vocabulary -// Base -> A consonant in its full (not subscript) form. It is the -// center of the syllable, it can be souranded by subjoined consonants, vowels, -// signs... but there is only one base in a stack, it has to be coded as -// the first character of the syllable.Included here are also groups of base + subjoined -// which are represented by one single code point in unicode (e.g. 0F43) Also other characters that might take -// subjoined consonants or other combining characters. -// Subjoined -> Subjoined consonants and groups of subjoined consonants which have a single code-point -// to repersent the group (even if each subjoined consonant is represented independently -// by anothe code-point -// Tsa Phru --> Tsa Phru character, Bhutanese people will always place it right after the base, but sometimes, due to -// "normalization" -// is placed after all the subjoined consonants, and it is also permitted there. -// A Chung Vowel lengthening mark --> . 0F71 It is placed after the base and any subjoined consonants but before any vowels -// Precomposed Sanskrit vowels --> The are combinations of subjoined consonants + vowels that have been assigned -// a given code-point (in spite of each single part of them having also a code-point -// They are avoided, and users are encouraged to use the combination of code-points that -// represents the same sound instead of using this combined characters. This is included here -// for compatibility with possible texts that use them (they are not in the Dzongkha keyboard). -// Halanta -> The Halanta or Virama character 0F84 indicates that a consonant should not use its inheernt vowel, -// in spite of not having other vowels present. It is usually placed immediatly after a base consonant, -// but in some special cases it can also be placed after a subjoined consonant, so this is also -// permitted in this algorithm. (Halanta is always displayed in Tibetan not used as a connecting char) -// -// Subjoined vowels -> Dependent vowels (matras) placed below the base and below all subjoined consonants. There -// might be as much as three subjoined vowels in a given stack (only one in general text, but up -// to three for abreviations, they have to be permitted). -// Superscript vowels -> There are three superscript vowels, and they can be repeated or combined (up to three -// times. They can combine with subjoined vowels, and are always coded after these. -// Anusvara --> Nasalisation sign. Traditioinally placed in absence of vowels, but also after vowels. In some -// special cases it can be placed before a vowel, so this is also permitted -// Candrabindu -> Forms of the Anusvara with different glyphs (and different in identity) which can be placed -// without vowel or after the vowel, but never before. Cannot combine with Anusvara. -// Stress marks -> Marks placed above or below a syllable, affecting the whole syllable. They are combining -// marks, so they have to be attached to a specific stack. The are using to emphasise a syllable. -// -// Digits -> Digits are not considered as non-combining characters because there are a few characters which -// combine with them, so they have to be considered independently. -// Digit combining marks -> dependent marks that combine with digits. -// -// TODO -// There are a number of characters in the CJK block that are used in Tibetan script, two of these are symbols -// are used as bases for combining glyphs, and have not been encoded in Tibetan. As these characters are outside -// of the tibetan block, they have not been treated in this program. - - -struct TibetanClassTable // This list must include all types of components that can be used inside a syllable -{ - enum CharClassValues // order is important here! This order must be the same that is found in each horizontal - // line in the statetable for Tibetan (file TibetanReordering.cpp). It assigns one number - // to each type of character that has to be considered when analysing the order in which - // characters can be placed - { - CC_RESERVED = 0, //Non Combining Characters - CC_BASE = 1, // Base Consonants, Base Consonants with Subjoined attached in code point, Sanskrit base marks - CC_SUBJOINED = 2, // Subjoined Consonats, combination of more than Subjoined Consonants in the code point - CC_TSA_PHRU = 3, // Tsa-Phru character 0F39 - CC_A_CHUNG = 4, // Vowel Lenthening a-chung mark 0F71 - CC_COMP_SANSKRIT = 5, // Precomposed Sanskrit vowels including Subjoined characters and vowels - CC_HALANTA = 6, // Halanta Character 0F84 - CC_BELOW_VOWEL = 7, // Subjoined vowels - CC_ABOVE_VOWEL = 8, // Superscript vowels - CC_ANUSVARA = 9, // Tibetan sign Rjes Su Nga Ro 0F7E - CC_CANDRABINDU = 10, // Tibetan sign Sna Ldan and Nyi Zla Naa Da 0F82, 0F83 - CC_VISARGA = 11, // Tibetan sign Rnam Bcad (0F7F) - CC_ABOVE_S_MARK = 12, // Stress Marks placed above the text - CC_BELOW_S_MARK = 13, // Stress Marks placed below the text - CC_DIGIT = 14, // Dzongkha Digits - CC_PRE_DIGIT_MARK = 15, // Mark placed before the digit - CC_POST_BELOW_DIGIT_M = 16, // Mark placed below or after the digit - CC_COUNT = 17 // This is the number of character classes - }; - - enum CharClassFlags - { - CF_CLASS_MASK = 0x0000FFFF, - - CF_DOTTED_CIRCLE = 0x04000000, // add a dotted circle if a character with this flag is the first in a syllable - CF_DIGIT = 0x01000000, // flag to speed up comparaisson - CF_PREDIGIT = 0x02000000, // flag to detect pre-digit marks for reordering - - // position flags - CF_POS_BEFORE = 0x00080000, - CF_POS_BELOW = 0x00040000, - CF_POS_ABOVE = 0x00020000, - CF_POS_AFTER = 0x00010000, - CF_POS_MASK = 0x000f0000 - }; - - typedef le_uint32 CharClass; - - typedef le_int32 ScriptFlags; - - LEUnicode firstChar; // for Tibetan this will become xOF00 - LEUnicode lastChar; // and this x0FFF - const CharClass *classTable; - - CharClass getCharClass(LEUnicode ch) const; - - static const TibetanClassTable *getTibetanClassTable(); -}; - - -class TibetanReordering /* not : public UObject because all methods are static */ { -public: - static le_int32 reorder(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, - LEUnicode *outChars, LEGlyphStorage &glyphStorage); - - static const FeatureMap *getFeatureMap(le_int32 &count); - -private: - // do not instantiate - TibetanReordering(); - - static le_int32 findSyllable(const TibetanClassTable *classTable, const LEUnicode *chars, le_int32 prev, le_int32 charCount); - -}; - - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/TrimmedArrayProcessor.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" -#include "TrimmedArrayProcessor.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor) - -TrimmedArrayProcessor::TrimmedArrayProcessor() -{ -} - -TrimmedArrayProcessor::TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader, success), firstGlyph(0), lastGlyph(0) -{ - LEReferenceTo<NonContextualGlyphSubstitutionHeader> header(morphSubtableHeader, success); - - if(LE_FAILURE(success)) return; - - trimmedArrayLookupTable = LEReferenceTo<TrimmedArrayLookupTable>(morphSubtableHeader, success, (const TrimmedArrayLookupTable*)&header->table); - - if(LE_FAILURE(success)) return; - - firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph); - lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount); -} - -TrimmedArrayProcessor::~TrimmedArrayProcessor() -{ -} - -void TrimmedArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph); - - if ((ttGlyph > firstGlyph) && (ttGlyph < lastGlyph)) { - TTGlyphID newGlyph = SWAPW(trimmedArrayLookupTable->valueArray[ttGlyph - firstGlyph]); - - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/TrimmedArrayProcessor.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved - * - */ - -#ifndef __TRIMMEDARRAYPROCESSOR_H -#define __TRIMMEDARRAYPROCESSOR_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class TrimmedArrayProcessor : public NonContextualGlyphSubstitutionProcessor -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - TrimmedArrayProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success); - - virtual ~TrimmedArrayProcessor(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - TrimmedArrayProcessor(); - -protected: - TTGlyphID firstGlyph; - TTGlyphID lastGlyph; - LEReferenceTo<TrimmedArrayLookupTable> trimmedArrayLookupTable; - -}; - -U_NAMESPACE_END -#endif -
--- a/src/java.desktop/share/native/libfontmanager/layout/TrimmedArrayProcessor2.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" -#include "TrimmedArrayProcessor2.h" -#include "LEGlyphStorage.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TrimmedArrayProcessor2) - -TrimmedArrayProcessor2::TrimmedArrayProcessor2() -{ -} - -TrimmedArrayProcessor2::TrimmedArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success) - : NonContextualGlyphSubstitutionProcessor2(morphSubtableHeader, success) -{ - const LEReferenceTo<NonContextualGlyphSubstitutionHeader2> header(morphSubtableHeader, success); - - trimmedArrayLookupTable = LEReferenceTo<TrimmedArrayLookupTable>(morphSubtableHeader, success, &header->table); - firstGlyph = SWAPW(trimmedArrayLookupTable->firstGlyph); - lastGlyph = firstGlyph + SWAPW(trimmedArrayLookupTable->glyphCount); - valueArray = LEReferenceToArrayOf<LookupValue>(morphSubtableHeader, success, &trimmedArrayLookupTable->valueArray[0], LE_UNBOUNDED_ARRAY); -} - -TrimmedArrayProcessor2::~TrimmedArrayProcessor2() -{ -} - -void TrimmedArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success) -{ - if(LE_FAILURE(success)) return; - le_int32 glyphCount = glyphStorage.getGlyphCount(); - le_int32 glyph; - - for (glyph = 0; glyph < glyphCount; glyph += 1) { - LEGlyphID thisGlyph = glyphStorage[glyph]; - TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(thisGlyph); - - if ((ttGlyph > firstGlyph) && (ttGlyph < lastGlyph)) { - TTGlyphID newGlyph = SWAPW(valueArray(ttGlyph - firstGlyph, success)); - - glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph); - } - } -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/TrimmedArrayProcessor2.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved - * - */ - -#ifndef __TRIMMEDARRAYPROCESSOR2_H -#define __TRIMMEDARRAYPROCESSOR2_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "MorphTables.h" -#include "SubtableProcessor2.h" -#include "NonContextualGlyphSubst.h" -#include "NonContextualGlyphSubstProc2.h" - -U_NAMESPACE_BEGIN - -class LEGlyphStorage; - -class TrimmedArrayProcessor2 : public NonContextualGlyphSubstitutionProcessor2 -{ -public: - virtual void process(LEGlyphStorage &glyphStorage, LEErrorCode &success); - - TrimmedArrayProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success); - - virtual ~TrimmedArrayProcessor2(); - - /** - * ICU "poor man's RTTI", returns a UClassID for the actual class. - * - * @stable ICU 2.8 - */ - virtual UClassID getDynamicClassID() const; - - /** - * ICU "poor man's RTTI", returns a UClassID for this class. - * - * @stable ICU 2.8 - */ - static UClassID getStaticClassID(); - -private: - TrimmedArrayProcessor2(); - -protected: - TTGlyphID firstGlyph; - TTGlyphID lastGlyph; - LEReferenceTo<TrimmedArrayLookupTable> trimmedArrayLookupTable; - LEReferenceToArrayOf<LookupValue> valueArray; -}; - -U_NAMESPACE_END -#endif
--- a/src/java.desktop/share/native/libfontmanager/layout/ValueRecords.cpp Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,329 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "ValueRecords.h" -#include "DeviceTables.h" -#include "GlyphIterator.h" -#include "LESwaps.h" - -U_NAMESPACE_BEGIN - -#define Nibble(value, nibble) ((value >> (nibble * 4)) & 0xF) -#define NibbleBits(value, nibble) (bitsInNibble[Nibble(value, nibble)]) - -le_int16 ValueRecord::getFieldValue(ValueFormat valueFormat, ValueRecordField field) const -{ - le_int16 valueIndex = getFieldIndex(valueFormat, field); - le_int16 value = values[valueIndex]; - - return SWAPW(value); -} - -le_int16 ValueRecord::getFieldValue(le_int16 index, ValueFormat valueFormat, ValueRecordField field) const -{ - le_int16 baseIndex = getFieldCount(valueFormat) * index; - le_int16 valueIndex = getFieldIndex(valueFormat, field); - le_int16 value = values[baseIndex + valueIndex]; - - return SWAPW(value); -} - -void ValueRecord::adjustPosition(ValueFormat valueFormat, const LETableReference& base, GlyphIterator &glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - float xPlacementAdjustment = 0; - float yPlacementAdjustment = 0; - float xAdvanceAdjustment = 0; - float yAdvanceAdjustment = 0; - - if ((valueFormat & vfbXPlacement) != 0) { - le_int16 value = getFieldValue(valueFormat, vrfXPlacement); - LEPoint pixels; - - fontInstance->transformFunits(value, 0, pixels); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yPlacementAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbYPlacement) != 0) { - le_int16 value = getFieldValue(valueFormat, vrfYPlacement); - LEPoint pixels; - - fontInstance->transformFunits(0, value, pixels); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yPlacementAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbXAdvance) != 0) { - le_int16 value = getFieldValue(valueFormat, vrfXAdvance); - LEPoint pixels; - - fontInstance->transformFunits(value, 0, pixels); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yAdvanceAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbYAdvance) != 0) { - le_int16 value = getFieldValue(valueFormat, vrfYAdvance); - LEPoint pixels; - - fontInstance->transformFunits(0, value, pixels); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yAdvanceAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - // FIXME: The device adjustments should really be transformed, but - // the only way I know how to do that is to convert them to le_int16 units, - // transform them, and then convert them back to pixels. Sigh... - if ((valueFormat & vfbAnyDevice) != 0) { - le_int16 xppem = (le_int16) fontInstance->getXPixelsPerEm(); - le_int16 yppem = (le_int16) fontInstance->getYPixelsPerEm(); - - if ((valueFormat & vfbXPlaDevice) != 0) { - Offset dtOffset = getFieldValue(valueFormat, vrfXPlaDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 xAdj = dt->getAdjustment(dt, xppem, success); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); - } - } - - if ((valueFormat & vfbYPlaDevice) != 0) { - Offset dtOffset = getFieldValue(valueFormat, vrfYPlaDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 yAdj = dt->getAdjustment(dt, yppem, success); - - yPlacementAdjustment += fontInstance->yPixelsToUnits(yAdj); - } - } - - if ((valueFormat & vfbXAdvDevice) != 0) { - Offset dtOffset = getFieldValue(valueFormat, vrfXAdvDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 xAdj = dt->getAdjustment(dt, xppem, success); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(xAdj); - } - } - - if ((valueFormat & vfbYAdvDevice) != 0) { - Offset dtOffset = getFieldValue(valueFormat, vrfYAdvDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 yAdj = dt->getAdjustment(dt, yppem, success); - - yAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); - } - } - } - - glyphIterator.adjustCurrGlyphPositionAdjustment( - xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment); -} - -void ValueRecord::adjustPosition(le_int16 index, ValueFormat valueFormat, const LETableReference& base, GlyphIterator &glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode &success) const -{ - float xPlacementAdjustment = 0; - float yPlacementAdjustment = 0; - float xAdvanceAdjustment = 0; - float yAdvanceAdjustment = 0; - - if ((valueFormat & vfbXPlacement) != 0) { - le_int16 value = getFieldValue(index, valueFormat, vrfXPlacement); - LEPoint pixels; - - fontInstance->transformFunits(value, 0, pixels); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yPlacementAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbYPlacement) != 0) { - le_int16 value = getFieldValue(index, valueFormat, vrfYPlacement); - LEPoint pixels; - - fontInstance->transformFunits(0, value, pixels); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yPlacementAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbXAdvance) != 0) { - le_int16 value = getFieldValue(index, valueFormat, vrfXAdvance); - LEPoint pixels; - - fontInstance->transformFunits(value, 0, pixels); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yAdvanceAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - if ((valueFormat & vfbYAdvance) != 0) { - le_int16 value = getFieldValue(index, valueFormat, vrfYAdvance); - LEPoint pixels; - - fontInstance->transformFunits(0, value, pixels); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(pixels.fX); - yAdvanceAdjustment += fontInstance->yPixelsToUnits(pixels.fY); - } - - // FIXME: The device adjustments should really be transformed, but - // the only way I know how to do that is to convert them to le_int16 units, - // transform them, and then convert them back to pixels. Sigh... - if ((valueFormat & vfbAnyDevice) != 0) { - le_int16 xppem = (le_int16) fontInstance->getXPixelsPerEm(); - le_int16 yppem = (le_int16) fontInstance->getYPixelsPerEm(); - - if ((valueFormat & vfbXPlaDevice) != 0) { - Offset dtOffset = getFieldValue(index, valueFormat, vrfXPlaDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 xAdj = dt->getAdjustment(dt, xppem, success); - - xPlacementAdjustment += fontInstance->xPixelsToUnits(xAdj); - } - } - - if ((valueFormat & vfbYPlaDevice) != 0) { - Offset dtOffset = getFieldValue(index, valueFormat, vrfYPlaDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 yAdj = dt->getAdjustment(dt, yppem, success); - - yPlacementAdjustment += fontInstance->yPixelsToUnits(yAdj); - } - } - - if ((valueFormat & vfbXAdvDevice) != 0) { - Offset dtOffset = getFieldValue(index, valueFormat, vrfXAdvDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 xAdj = dt->getAdjustment(dt, xppem, success); - - xAdvanceAdjustment += fontInstance->xPixelsToUnits(xAdj); - } - } - - if ((valueFormat & vfbYAdvDevice) != 0) { - Offset dtOffset = getFieldValue(index, valueFormat, vrfYAdvDevice); - - if (dtOffset != 0) { - LEReferenceTo<DeviceTable> dt(base, success, dtOffset); - le_int16 yAdj = dt->getAdjustment(dt, yppem, success); - - yAdvanceAdjustment += fontInstance->yPixelsToUnits(yAdj); - } - } - } - - glyphIterator.adjustCurrGlyphPositionAdjustment( - xPlacementAdjustment, yPlacementAdjustment, xAdvanceAdjustment, yAdvanceAdjustment); -} - -le_int16 ValueRecord::getSize(ValueFormat valueFormat) -{ - return getFieldCount(valueFormat) * sizeof(le_int16); -} - -le_int16 ValueRecord::getFieldCount(ValueFormat valueFormat) -{ - static const le_int16 bitsInNibble[] = - { - 0 + 0 + 0 + 0, - 0 + 0 + 0 + 1, - 0 + 0 + 1 + 0, - 0 + 0 + 1 + 1, - 0 + 1 + 0 + 0, - 0 + 1 + 0 + 1, - 0 + 1 + 1 + 0, - 0 + 1 + 1 + 1, - 1 + 0 + 0 + 0, - 1 + 0 + 0 + 1, - 1 + 0 + 1 + 0, - 1 + 0 + 1 + 1, - 1 + 1 + 0 + 0, - 1 + 1 + 0 + 1, - 1 + 1 + 1 + 0, - 1 + 1 + 1 + 1 - }; - - valueFormat &= ~vfbReserved; - - return NibbleBits(valueFormat, 0) + NibbleBits(valueFormat, 1) + - NibbleBits(valueFormat, 2) + NibbleBits(valueFormat, 3); -} - -le_int16 ValueRecord::getFieldIndex(ValueFormat valueFormat, ValueRecordField field) -{ - static const le_uint16 beforeMasks[] = - { - 0x0000, - 0x0001, - 0x0003, - 0x0007, - 0x000F, - 0x001F, - 0x003F, - 0x007F, - 0x00FF, - 0x01FF, - 0x03FF, - 0x07FF, - 0x0FFF, - 0x1FFF, - 0x3FFF, - 0x7FFF, - 0xFFFF - }; - - return getFieldCount(valueFormat & beforeMasks[field]); -} - -U_NAMESPACE_END
--- a/src/java.desktop/share/native/libfontmanager/layout/ValueRecords.h Thu Oct 12 10:40:45 2017 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -/* - * - * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved - * - */ - -#ifndef __VALUERECORDS_H -#define __VALUERECORDS_H - -/** - * \file - * \internal - */ - -#include "LETypes.h" -#include "LEFontInstance.h" -#include "OpenTypeTables.h" -#include "GlyphIterator.h" - -U_NAMESPACE_BEGIN - -typedef le_uint16 ValueFormat; -typedef le_int16 ValueRecordField; - -struct ValueRecord -{ - le_int16 values[ANY_NUMBER]; - - le_int16 getFieldValue(ValueFormat valueFormat, ValueRecordField field) const; - le_int16 getFieldValue(le_int16 index, ValueFormat valueFormat, ValueRecordField field) const; - void adjustPosition(ValueFormat valueFormat, const LETableReference &base, GlyphIterator &glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode &success) const; - void adjustPosition(le_int16 index, ValueFormat valueFormat, const LETableReference &base, GlyphIterator &glyphIterator, - const LEFontInstance *fontInstance, LEErrorCode &success) const; - - static le_int16 getSize(ValueFormat valueFormat); - -private: - static le_int16 getFieldCount(ValueFormat valueFormat); - static le_int16 getFieldIndex(ValueFormat valueFormat, ValueRecordField field); -}; -LE_VAR_ARRAY(ValueRecord, values) - -enum ValueRecordFields -{ - vrfXPlacement = 0, - vrfYPlacement = 1, - vrfXAdvance = 2, - vrfYAdvance = 3, - vrfXPlaDevice = 4, - vrfYPlaDevice = 5, - vrfXAdvDevice = 6, - vrfYAdvDevice = 7 -}; - -enum ValueFormatBits -{ - vfbXPlacement = 0x0001, - vfbYPlacement = 0x0002, - vfbXAdvance = 0x0004, - vfbYAdvance = 0x0008, - vfbXPlaDevice = 0x0010, - vfbYPlaDevice = 0x0020, - vfbXAdvDevice = 0x0040, - vfbYAdvDevice = 0x0080, - vfbReserved = 0xFF00, - vfbAnyDevice = vfbXPlaDevice + vfbYPlaDevice + vfbXAdvDevice + vfbYAdvDevice -}; - -U_NAMESPACE_END -#endif