scuffed-code/icu4c/source/test/letest/gendata.cpp
Eric Mader 4172495b11 ICU-1253 This is the first version of a portable LayoutEngine
verification test

X-SVN-Rev: 6020
2001-10-03 21:48:10 +00:00

456 lines
16 KiB
C++

/*
*******************************************************************************
*
* 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 <stdio.h>
#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;
}