/* ******************************************************************************* * * Copyright (C) 1999-2000, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * file name: gendata.cpp * * created on: 11/03/2000 * created by: Eric R. Mader */ #include #include "unicode/utypes.h" #include "unicode/unicode.h" #include "unicode/locid.h" #include "unicode/loengine.h" #include "PortableFontInstance.h" #define ARRAY_LENGTH(array) (sizeof array / sizeof array[0]) struct TestInput { char *fontName; UChar *text; int32_t textLength; Unicode::EUnicodeScript scriptCode; UBool rightToLeft; }; /* * FIXME: should use the output file name and the current date. */ char *header = "/*\n" " *******************************************************************************\n" " *\n" " * Copyright (C) 1999-2000, International Business Machines\n" " * Corporation and others. All Rights Reserved.\n" " *\n" " * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT\n" " * UNLESS YOU REALLY KNOW WHAT YOU'RE DOING.\n" " *\n" " *******************************************************************************\n" " *\n" " * file name: testdata.cpp\n" " * created on: 12/14/2000\n" " * created by: gendata.cpp\n" " */\n" "\n" "#include \"unicode/utypes.h\"\n" "#include \"unicode/unicode.h\"\n" "#include \"letest.h\"\n" "\n"; char *scriptNames[] = { "NOT-A-SCRIPT!", "kBasicLatin", "kLatin1Supplement", "kLatinExtendedA", "kLatinExtendedB", "kIPAExtension", "kSpacingModifier", "kCombiningDiacritical", "kGreek", "kCyrillic", "kArmenian", "kHebrew", "kArabic", "kSyriac", "kThaana", "kDevanagari", "kBengali", "kGurmukhi", "kGujarati", "kOriya", "kTamil", "kTelugu", "kKannada", "kMalayalam", "kSinhala", "kThai", "kLao", "kTibetan", "kMyanmar", "kGeorgian", "kHangulJamo", "kEthiopic", "kCherokee", "kUnifiedCanadianAboriginalSyllabics", "kogham", "kRunic", "kKhmer", "kMongolian", "kLatinExtendedAdditional", "kGreekExtended", "kGeneralPunctuation", "kSuperSubScript", "kCurrencySymbolScript", "kSymbolCombiningMark", "kLetterlikeSymbol", "kNumberForm", "kArrow", "kMathOperator", "kMiscTechnical", "kControlPicture", "kOpticalCharacter", "kEnclosedAlphanumeric", "kBoxDrawing", "kBlockElement", "kGeometricShape", "kMiscSymbol", "kDingbat", "kBraillePatterns", "kCJKRadicalsSupplement", "kKangxiRadicals", "kIdeographicDescriptionCharacters", "kCJKSymbolPunctuation", "kHiragana", "kKatakana", "kBopomofo", "kHangulCompatibilityJamo", "kKanbun", "kBopomofoExtended", "kEnclosedCJKLetterMonth", "kCJKCompatibility", "kCJKUnifiedIdeographExtensionA", "kCJKUnifiedIdeograph", "kYiSyllables", "kYiRadicals", "kHangulSyllable", "kHighSurrogate", "kHighPrivateUseSurrogate", "kLowSurrogate", "kPrivateUse", "kCJKCompatibilityIdeograph", "kAlphabeticPresentation", "kArabicPresentationA", "kCombiningHalfMark", "kCJKCompatibilityForm", "kSmallFormVariant", "kArabicPresentationB", "kNoScript", "kHalfwidthFullwidthForm" }; UChar devaText[] = { 0x0936, 0x094d, 0x0930, 0x0940, 0x092e, 0x0926, 0x094d, 0x0020, 0x092d, 0x0917, 0x0935, 0x0926, 0x094d, 0x0917, 0x0940, 0x0924, 0x093e, 0x0020, 0x0905, 0x0927, 0x094d, 0x092f, 0x093e, 0x092f, 0x0020, 0x0905, 0x0930, 0x094d, 0x091c, 0x0941, 0x0928, 0x0020, 0x0935, 0x093f, 0x0937, 0x093e, 0x0926, 0x0020, 0x092f, 0x094b, 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, 0x093e, 0x0937, 0x094d, 0x091f, 0x094d, 0x0930, 0x0020, 0x0909, 0x0935, 0x093E, 0x091A, 0x0943, 0x0020, 0x0927, 0x0930, 0x094d, 0x092e, 0x0915, 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0938, 0x092e, 0x0935, 0x0947, 0x0924, 0x093e, 0x0020, 0x092f, 0x0941, 0x092f, 0x0941, 0x0924, 0x094d, 0x0938, 0x0935, 0x0903, 0x0020, 0x092e, 0x093e, 0x092e, 0x0915, 0x093e, 0x0903, 0x0020, 0x092a, 0x093e, 0x0923, 0x094d, 0x0921, 0x0935, 0x093e, 0x0936, 0x094d, 0x091a, 0x0948, 0x0935, 0x0020, 0x0915, 0x093f, 0x092e, 0x0915, 0x0941, 0x0930, 0x094d, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, 0x091c, 0x0935 }; int32_t devaTextLength = ARRAY_LENGTH(devaText); UChar arabText[] = { 0x0623, 0x0633, 0x0627, 0x0633, 0x064B, 0x0627, 0x060C, 0x0020, 0x062A, 0x062A, 0x0639, 0x0627, 0x0645, 0x0644, 0x0020, 0x0627, 0x0644, 0x062D, 0x0648, 0x0627, 0x0633, 0x064A, 0x0628, 0x0020, 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x060C, 0x0020, 0x0648, 0x062A, 0x0642, 0x0648, 0x0645, 0x0020, 0x0628, 0x062A, 0x062E, 0x0632, 0x064A, 0x0646, 0x0020, 0x0627, 0x0644, 0x0623, 0x062D, 0x0631, 0x0641, 0x0020, 0x0648, 0x0627, 0x0644, 0x0645, 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0623, 0x062E, 0x0631, 0x0649, 0x0020, 0x0628, 0x0639, 0x062F, 0x0020, 0x0623, 0x0646, 0x0020, 0x062A, 0x064F, 0x0639, 0x0637, 0x064A, 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 0x0020, 0x0645, 0x0639, 0x064A, 0x0646, 0x0627, 0x0020, 0x0644, 0x0643, 0x0644, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0645, 0x0646, 0x0647, 0x0627, 0x002E, 0x0020, 0x0648, 0x0642, 0x0628, 0x0644, 0x0020, 0x0627, 0x062E, 0x062A, 0x0631, 0x0627, 0x0639, 0x0020, 0x0022, 0x064A, 0x0648, 0x0646, 0x0650, 0x0643, 0x0648, 0x062F, 0x0022, 0x060C, 0x0020, 0x0643, 0x0627, 0x0646, 0x0020, 0x0647, 0x0646, 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 0x0645, 0x0629, 0x0020, 0x0644, 0x0644, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, 0x0648, 0x062A, 0x062E, 0x0635, 0x064A, 0x0635, 0x0020, 0x0647, 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 0x0645, 0x062D, 0x0627, 0x0631, 0x0641, 0x060C, 0x0020, 0x0648, 0x0644, 0x0645, 0x0020, 0x064A, 0x0648, 0x062C, 0x062F, 0x0020, 0x0646, 0x0638, 0x0627, 0x0645, 0x0020, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x064A, 0x062D, 0x062A, 0x0648, 0x064A, 0x0020, 0x0639, 0x0644, 0x0649, 0x0020, 0x062C, 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0645, 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0636, 0x0631, 0x0648, 0x0631, 0x064A, 0x0629 /* The next few sentences... 0x002E, 0x0020, 0x0648, 0x0639, 0x0644, 0x0649, 0x0020, 0x0633, 0x0628, 0x064A, 0x0644, 0x0020, 0x0627, 0x0644, 0x0645, 0x062B, 0x0627, 0x0644, 0x060C, 0x0020, 0x0641, 0x0625, 0x0646, 0x0020, 0x0627, 0x0644, 0x0627, 0x062A, 0x062D, 0x0627, 0x062F, 0x0020, 0x0627, 0x0644, 0x0623, 0x0648, 0x0631, 0x0648, 0x0628, 0x064A, 0x0020, 0x0644, 0x0648, 0x062D, 0x062F, 0x0647, 0x060C, 0x0020, 0x0627, 0x062D, 0x062A, 0x0648, 0x0649, 0x0020, 0x0627, 0x0644, 0x0639, 0x062F, 0x064A, 0x062F, 0x0020, 0x0645, 0x0646, 0x0020, 0x0627, 0x0644, 0x0634, 0x0641, 0x0631, 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x0645, 0x062E, 0x062A, 0x0644, 0x0641, 0x0629, 0x0020, 0x0644, 0x064A, 0x063A, 0x0637, 0x064A, 0x0020, 0x062C, 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0644, 0x063A, 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x0645, 0x0633, 0x062A, 0x062E, 0x062F, 0x0645, 0x0629, 0x0020, 0x0641, 0x064A, 0x0020, 0x0627, 0x0644, 0x0627, 0x062A, 0x062D, 0x0627, 0x062F, 0x002E, 0x0020, 0x0648, 0x062D, 0x062A, 0x0649, 0x0020, 0x0644, 0x0648, 0x0020, 0x0627, 0x0639, 0x062A, 0x0628, 0x0631, 0x0646, 0x0627, 0x0020, 0x0644, 0x063A, 0x0629, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0629, 0x060C, 0x0020, 0x0643, 0x0627, 0x0644, 0x0644, 0x063A, 0x0629, 0x0020, 0x0627, 0x0644, 0x0625, 0x0646, 0x062C, 0x0644, 0x064A, 0x0632, 0x064A, 0x0629, 0x060C, 0x0020, 0x0641, 0x0625, 0x0646, 0x0020, 0x062C, 0x062F, 0x0648, 0x0644, 0x0020, 0x0634, 0x0641, 0x0631, 0x0629, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0644, 0x0645, 0x0020, 0x064A, 0x0643, 0x0641, 0x0020, 0x0644, 0x0627, 0x0633, 0x062A, 0x064A, 0x0639, 0x0627, 0x0628, 0x0020, 0x062C, 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x062D, 0x0631, 0x0641, 0x0020, 0x0648, 0x0639, 0x0644, 0x0627, 0x0645, 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x062A, 0x0631, 0x0642, 0x064A, 0x0645, 0x0020, 0x0648, 0x0627, 0x0644, 0x0631, 0x0645, 0x0648, 0x0632, 0x0020, 0x0627, 0x0644, 0x0641, 0x0646, 0x064A, 0x0629, 0x0020, 0x0648, 0x0627, 0x0644, 0x0639, 0x0644, 0x0645, 0x064A, 0x0629, 0x0020, 0x0627, 0x0644, 0x0634, 0x0627, 0x0626, 0x0639, 0x0629, 0x0020, 0x0627, 0x0644, 0x0627, 0x0633, 0x062A, 0x0639, 0x0645, 0x0627, 0x0644, 0x002E */ }; int32_t arabTextLength = ARRAY_LENGTH(arabText); UChar thaiSample[] = { 0x0E1A, 0x0E17, 0x0E17, 0x0E35, 0x0E48, 0x0E51, 0x0E1E, 0x0E32, 0x0E22, 0x0E38, 0x0E44, 0x0E0B, 0x0E42, 0x0E04, 0x0E25, 0x0E19, 0x0E42, 0x0E14, 0x0E42, 0x0E23, 0x0E18, 0x0E35, 0x0E2D, 0x0E32, 0x0E28, 0x0E31, 0x0E22, 0x0E2D, 0x0E22, 0x0E39, 0x0E48, 0x0E17, 0x0E48, 0x0E32, 0x0E21, 0x0E01, 0x0E25, 0x0E32, 0x0E07, 0x0E17, 0x0E38, 0x0E48, 0x0E07, 0x0E43, 0x0E2B, 0x0E0D, 0x0E48, 0x0E43, 0x0E19, 0x0E41, 0x0E04, 0x0E19, 0x0E0B, 0x0E31, 0x0E2A, 0x0E01, 0x0E31, 0x0E1A, 0x0E25, 0x0E38, 0x0E07, 0x0E40, 0x0E2E, 0x0E19, 0x0E23, 0x0E35, 0x0E0A, 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, 0x0E41, 0x0E25, 0x0E30, 0x0E1B, 0x0E49, 0x0E32, 0x0E40, 0x0E2D, 0x0E47, 0x0E21, 0x0E20, 0x0E23, 0x0E23, 0x0E22, 0x0E32, 0x0E0A, 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, 0x0E1A, 0x0E49, 0x0E32, 0x0E19, 0x0E02, 0x0E2D, 0x0E07, 0x0E1E, 0x0E27, 0x0E01, 0x0E40, 0x0E02, 0x0E32, 0x0E2B, 0x0E25, 0x0E31, 0x0E07, 0x0E40, 0x0E25, 0x0E47, 0x0E01, 0x0E40, 0x0E1E, 0x0E23, 0x0E32, 0x0E30, 0x0E44, 0x0E21, 0x0E49, 0x0E2A, 0x0E23, 0x0E49, 0x0E32, 0x0E07, 0x0E1A, 0x0E49, 0x0E32, 0x0E19, 0x0E15, 0x0E49, 0x0E2D, 0x0E07, 0x0E02, 0x0E19, 0x0E21, 0x0E32, 0x0E14, 0x0E49, 0x0E27, 0x0E22, 0x0E40, 0x0E01, 0x0E27, 0x0E35, 0x0E22, 0x0E19, 0x0E40, 0x0E1B, 0x0E47, 0x0E19, 0x0E23, 0x0E30, 0x0E22, 0x0E30, 0x0E17, 0x0E32, 0x0E07, 0x0E2B, 0x0E25, 0x0E32, 0x0E22, 0x0E44, 0x0E21, 0x0E25, 0x0E4C /* A few more lines... 0x0E1A, 0x0E49, 0x0E32, 0x0E19, 0x0E21, 0x0E35, 0x0E2A, 0x0E35, 0x0E48, 0x0E1D, 0x0E32, 0x0E21, 0x0E35, 0x0E1E, 0x0E37, 0x0E49, 0x0E19, 0x0E01, 0x0E31, 0x0E1A, 0x0E2B, 0x0E25, 0x0E31, 0x0E07, 0x0E04, 0x0E32, 0x0E23, 0x0E27, 0x0E21, 0x0E17, 0x0E33, 0x0E40, 0x0E1B, 0x0E47, 0x0E19, 0x0E2B, 0x0E49, 0x0E2D, 0x0E07, 0x0E40, 0x0E14, 0x0E35, 0x0E22, 0x0E27, 0x0E43, 0x0E19, 0x0E2B, 0x0E49, 0x0E2D, 0x0E07, 0x0E21, 0x0E35, 0x0E17, 0x0E31, 0x0E49, 0x0E07, 0x0E40, 0x0E15, 0x0E32, 0x0E2B, 0x0E38, 0x0E07, 0x0E15, 0x0E49, 0x0E21, 0x0E17, 0x0E35, 0x0E48, 0x0E2A, 0x0E19, 0x0E34, 0x0E21, 0x0E14, 0x0E39, 0x0E02, 0x0E36, 0x0E49, 0x0E19, 0x0E40, 0x0E25, 0x0E2D, 0x0E30, 0x0E21, 0x0E35, 0x0E15, 0x0E39, 0x0E49, 0x0E43, 0x0E2A, 0x0E48, 0x0E16, 0x0E49, 0x0E27, 0x0E22, 0x0E0A, 0x0E32, 0x0E21, 0x0E42, 0x0E15, 0x0E4A, 0x0E30, 0x0E40, 0x0E01, 0x0E49, 0x0E32, 0x0E2D, 0x0E35, 0x0E49, 0x0E2A, 0x0E32, 0x0E21, 0x0E2B, 0x0E23 */ }; int32_t thaiSampleLength = ARRAY_LENGTH(thaiSample); TestInput testInputs[] = { {"Devamt.ttf", devaText, devaTextLength, Unicode::kDevanagari, false}, {"Times.TTF", arabText, arabTextLength, Unicode::kArabic, true}, {"LucidaSansRegular.ttf", arabText, arabTextLength, Unicode::kArabic, true}, {"Thonburi.ttf", thaiSample, thaiSampleLength, Unicode::kThai, false} }; #define TEST_COUNT ARRAY_LENGTH(testInputs) int32_t testCount = TEST_COUNT; void dumpShorts(FILE *file, char *label, int32_t id, uint16_t *shorts, int32_t count) { char lineBuffer[8 * 8 + 2]; int32_t bufp = 0; fprintf(file, label, id); for (int i = 0; i < count; i += 1) { if (i % 8 == 0 && bufp != 0) { fprintf(file, " %s\n", lineBuffer); bufp = 0; } bufp += sprintf(&lineBuffer[bufp], "0x%4.4X, ", shorts[i]); } if (bufp != 0) { lineBuffer[bufp - 2] = '\0'; fprintf(file, " %s\n", lineBuffer); } fprintf(file, "};\n\n"); } void dumpLongs(FILE *file, char *label, int32_t id, int32_t *longs, int32_t count) { char lineBuffer[8 * 12 + 2]; int32_t bufp = 0; fprintf(file, label, id); for (int i = 0; i < count; i += 1) { if (i % 8 == 0 && bufp != 0) { fprintf(file, " %s\n", lineBuffer); bufp = 0; } bufp += sprintf(&lineBuffer[bufp], "0x%8.8X, ", longs[i]); } if (bufp != 0) { lineBuffer[bufp - 2] = '\0'; fprintf(file, " %s\n", lineBuffer); } fprintf(file, "};\n\n"); } void dumpFloats(FILE *file, char *label, int32_t id, float *floats, int32_t count) { char lineBuffer[8 * 16 + 2]; int32_t bufp = 0; fprintf(file, label, id); for (int i = 0; i < count; i += 1) { if (i % 8 == 0 && bufp != 0) { fprintf(file, " %s\n", lineBuffer); bufp = 0; } bufp += sprintf(&lineBuffer[bufp], "%fF, ", floats[i]); } if (bufp != 0) { lineBuffer[bufp - 2] = '\0'; fprintf(file, " %s\n", lineBuffer); } fprintf(file, "};\n\n"); } int main(int argc, char *argv[]) { Locale dummyLocale; int32_t test; FILE *outputFile = fopen(argv[1], "w"); fprintf(outputFile, header); for (test = 0; test < testCount; test += 1) { PFIErrorCode fontStatus = PFI_NO_ERROR; PortableFontInstance fontInstance(testInputs[test].fontName, 12, fontStatus); if (LE_FAILURE(fontStatus)) { printf("ERROR: test case %d, could not get a font instance for %s\n", test, testInputs[test].fontName); continue; } UErrorCode success = U_ZERO_ERROR; ICULayoutEngine *engine = ICULayoutEngine::createInstance(&fontInstance, testInputs[test].scriptCode, dummyLocale, success); uint32_t glyphCount; uint16_t *glyphs; int32_t *indices; float *positions; if (LE_FAILURE(success)) { // would be nice to print the script name here, but // don't know if it's worth the trouble to maintian // the table; better to wait for that fuctionality // to appear in ICU... printf("ERROR: test case %d, could not create a LayoutEngine.\n", test); continue; } glyphCount = engine->layoutChars(testInputs[test].text, 0, testInputs[test].textLength, testInputs[test].textLength, testInputs[test].rightToLeft, 0, 0, success); glyphs = new uint16_t[glyphCount]; indices = new int32_t[glyphCount]; positions = new float[glyphCount * 2 + 2]; engine->getGlyphs(glyphs, success); engine->getCharIndices(indices, success); engine->getGlyphPositions(positions, success); //fprintf(outputFile, "font: %s\n", testInputs[test].fontName); dumpShorts(outputFile, "UChar inputText%d[] =\n{\n", test, testInputs[test].text, testInputs[test].textLength); dumpShorts(outputFile, "uint16_t resultGlyphs%d[] =\n{\n", test, glyphs, glyphCount); fprintf(outputFile, "int32_t resultGlyphCount%d = %d;\n\n", test, glyphCount); dumpLongs(outputFile, "int32_t resultIndices%d[] =\n{\n", test, indices, glyphCount); dumpFloats(outputFile, "float resultPositions%d[] =\n{\n", test, positions, glyphCount * 2 + 2); fprintf(outputFile, "\n"); delete[] positions; delete[] indices; delete[] glyphs; delete engine; } fprintf(outputFile, "TestInput testInputs[] = \n{\n"); for (test = 0; test < testCount; test += 1) { fprintf(outputFile, " {\"%s\", inputText%d, %d, Unicode::%s, %s},\n", testInputs[test].fontName, test, testInputs[test].textLength, scriptNames[testInputs[test].scriptCode], testInputs[test].rightToLeft? "true" : "false"); } fprintf(outputFile, "};\n\nint32_t testCount = ARRAY_LENGTH(testInputs);\n\n"); fprintf(outputFile, "TestResult testResults[] = \n{\n"); for (test = 0; test < testCount; test += 1) { fprintf(outputFile, " {resultGlyphCount%d, resultGlyphs%d, resultIndices%d, resultPositions%d},\n", test, test, test, test); } fprintf(outputFile, "};\n\n"); fclose(outputFile); return 0; }