16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 1999-2013, International Business Machines 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved. 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ******************************************************************************* 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * file name: gendata.cpp 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * created on: 11/03/2000 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * created by: Eric R. Mader 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <time.h> 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uscript.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ubidi.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LETypes.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LEScripts.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LayoutEngine.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "PortableFontInstance.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "SimpleFontInstance.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "xmlparser.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "letsutil.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "letest.h" 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_USE 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic LEErrorCode overallStatus = LE_NO_ERROR; 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct TestInput 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *fontName; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEUnicode *text; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 textLength; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 scriptCode; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_bool rightToLeft; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Returns the path to icu/source/test/testdata/ */ 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *getSourceTestData() { 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *srcDataDir = NULL; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_TOPSRCDIR 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *f = fopen(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING"rbbitst.txt", "r"); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (f != NULL) { 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We're in icu/source/test/letest/ */ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(f); 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* We're in icu/source/test/letest/(Debug|Release) */ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcDataDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return srcDataDir; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *getPath(char buffer[2048], const char *filename) { 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *testDataDirectory = getSourceTestData(); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(buffer, testDataDirectory); 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(buffer, filename); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return buffer; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * FIXME: should use the output file name and the current date. 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *header = 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n" 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "<!--\n" 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Copyright (c) 1999-%4.4d International Business Machines\n" 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Corporation and others. All rights reserved.\n" 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n" 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT\n" 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " UNLESS YOU REALLY KNOW WHAT YOU'RE DOING.\n" 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n" 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " file name: letest.xml\n" 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " generated on: %s\n" 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " generated by: gendata.cpp\n" 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "-->\n" 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\n" 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "<layout-tests>\n"; 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid dumpLongs(FILE *file, const char *tag, le_int32 *longs, le_int32 count) { 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char lineBuffer[8 * 12 + 2]; 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 bufp = 0; 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " <%s>\n", tag); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < count; i += 1) { 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i % 8 == 0 && bufp != 0) { 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " %s\n", lineBuffer); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bufp = 0; 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bufp += sprintf(&lineBuffer[bufp], "0x%8.8X, ", longs[i]); 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (bufp != 0) { 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineBuffer[bufp - 2] = '\0'; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " %s\n", lineBuffer); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " </%s>\n\n", tag); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid dumpFloats(FILE *file, const char *tag, float *floats, le_int32 count) { 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char lineBuffer[8 * 16 + 2]; 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 bufp = 0; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " <%s>\n", tag); 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < count; i += 1) { 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (i % 8 == 0 && bufp != 0) { 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " %s\n", lineBuffer); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bufp = 0; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bufp += sprintf(&lineBuffer[bufp], "%f, ", floats[i]); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (bufp != 0) { 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org lineBuffer[bufp - 2] = '\0'; 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " %s\n", lineBuffer); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(file, " </%s>\n", tag); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main(int argc, char *argv[]) 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *gendataFile = "gendata.xml"; 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *outputFile = fopen(argv[1], "w"); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(argc>2) { 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org gendataFile = argv[2]; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org time_t now = time(NULL); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org struct tm *local = localtime(&now); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *tmFormat = "%m/%d/%Y %I:%M:%S %p %Z"; 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char tmString[64]; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_uint32 count = 0; 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strftime(tmString, 64, tmFormat, local); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, header, local->tm_year + 1900, tmString); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UXMLParser *parser = UXMLParser::createParser(status); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UXMLElement *root = parser->parseFile(gendataFile, status); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (root == NULL) { 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error: Could not open %s\n", gendataFile); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete parser; 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(U_FAILURE(status)) { 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error reading %s: %s\n", gendataFile, u_errorName(status)); 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -2; 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Reading %s\n", gendataFile); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test_case = UNICODE_STRING_SIMPLE("test-case"); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test_text = UNICODE_STRING_SIMPLE("test-text"); 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test_font = UNICODE_STRING_SIMPLE("test-font"); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test-case attributes 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString id_attr = UNICODE_STRING_SIMPLE("id"); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString script_attr = UNICODE_STRING_SIMPLE("script"); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString lang_attr = UNICODE_STRING_SIMPLE("lang"); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test-font attributes 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString name_attr = UNICODE_STRING_SIMPLE("name"); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UXMLElement *testCase; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t tc = 0; 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while((testCase = root->nextChildElement(tc)) != NULL) { 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (testCase->getTagName().compare(test_case) == 0) { 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *id = getCString(testCase->getAttribute(id_attr)); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *script = getCString(testCase->getAttribute(script_attr)); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *lang = getCString(testCase->getAttribute(lang_attr)); 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++count; 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("\n ID %s\n", id); 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEFontInstance *font = NULL; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UXMLElement *element; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t ec = 0; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t charCount = 0; 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t typoFlags = LayoutEngine::kTypoFlagKern | LayoutEngine::kTypoFlagLiga; // kerning + ligatures... 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UScriptCode scriptCode; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 languageCode = -1; 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString text; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t glyphCount = 0; 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEErrorCode leStatus = LE_NO_ERROR; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LayoutEngine *engine = NULL; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEGlyphID *glyphs = NULL; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 *indices = NULL; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org float *positions = NULL; 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uscript_getCode(script, &scriptCode, 1, &status); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (LE_FAILURE(status)) { 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error: invalid script name: %s.\n", script); 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto free_c_strings; 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (lang != NULL) { 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org languageCode = getLanguageCode(lang); 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (languageCode < 0) { 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error: invalid language name: %s.\n", lang); 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto free_c_strings; 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-case id=\"%s\" script=\"%s\" lang=\"%s\">\n", id, script, lang); 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-case id=\"%s\" script=\"%s\">\n", id, script); 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while((element = testCase->nextChildElement(ec)) != NULL) { 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString tag = element->getTagName(); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TODO: make sure that each element is only used once. 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tag.compare(test_font) == 0) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *fontName = getCString(element->getAttribute(name_attr)); 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *version = NULL; 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buf[2048]; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org PortableFontInstance *pfi = new PortableFontInstance(getPath(buf,fontName), 12, leStatus); 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (LE_FAILURE(leStatus)) { 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error: could not open font: %s (path: %s)\n", fontName, buf); 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(fontName); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto free_c_strings; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf(" Generating: %s, %s, %s, %s\n", id, script, lang, fontName); 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org version = pfi->getNameString(NAME_VERSION_STRING, PLATFORM_MACINTOSH, MACINTOSH_ROMAN, MACINTOSH_ENGLISH); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // The standard recommends that the Macintosh Roman/English name string be present, but 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // if it's not, try the Microsoft Unicode/English string. 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (version == NULL) { 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const LEUnicode16 *uversion = pfi->getUnicodeNameString(NAME_VERSION_STRING, PLATFORM_MICROSOFT, MICROSOFT_UNICODE_BMP, MICROSOFT_ENGLISH); 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uversion != NULL) { 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char uversion_utf8[300]; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status2 = U_ZERO_ERROR; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_strToUTF8(uversion_utf8, 300, NULL, uversion, -1, &status2); 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status2)) { 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uversion_utf8[0]=0; 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-font name=\"%s\" version=\"%s\" checksum=\"0x%8.8X\" rchecksum=\"0x%8.8X\"/>\n\n", 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fontName, uversion_utf8, pfi->getFontChecksum(), pfi->getRawChecksum()); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pfi->deleteNameString(uversion); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-font name=\"%s\" version=\"unknown-0x%8.8X\" checksum=\"0x%8.8X\" rchecksum=\"0x%8.8X\"/>\n\n", 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fontName, pfi->getFontChecksum(), pfi->getFontChecksum(), pfi->getRawChecksum()); 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-font name=\"%s\" version=\"%s\" checksum=\"0x%8.8X\" rchecksum=\"0x%8.8X\"/>\n\n", 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fontName, version, pfi->getFontChecksum(), pfi->getRawChecksum()); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pfi->deleteNameString(version); 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(outputFile); 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(fontName); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org font = pfi; 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (tag.compare(test_text) == 0) { 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *utf8 = NULL; 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org text = element->getText(TRUE); 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org charCount = text.length(); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org utf8 = getUTF8String(&text); 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " <test-text>%s</test-text>\n\n", utf8); 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(outputFile); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(utf8); 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // an unknown tag... 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *cTag = getCString(&tag); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Test %s: unknown element with tag \"%s\"\n", id, cTag); 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(cTag); 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (font == NULL) { 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LEErrorCode fontStatus = LE_NO_ERROR; 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org font = new SimpleFontInstance(12, fontStatus); 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typoFlags |= 0x80000000L; // use CharSubstitutionFilter... 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org engine = LayoutEngine::layoutEngineFactory(font, scriptCode, languageCode, typoFlags, leStatus); 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (LE_FAILURE(leStatus)) { 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Error for test %s: could not create a LayoutEngine.\n", id); 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org goto delete_font; 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org glyphCount = engine->layoutChars(text.getBuffer(), 0, charCount, charCount, getRTL(text), 0, 0, leStatus); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org glyphs = NEW_ARRAY(LEGlyphID, glyphCount); 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org indices = NEW_ARRAY(le_int32, glyphCount); 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org positions = NEW_ARRAY(float, glyphCount * 2 + 2); 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org engine->getGlyphs(glyphs, leStatus); 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org engine->getCharIndices(indices, leStatus); 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org engine->getGlyphPositions(positions, leStatus); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(LE_FAILURE(leStatus)) { 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stderr,"ERROR: LO returned error: %s\n", u_errorName((UErrorCode)leStatus)); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org overallStatus = leStatus; 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, "<!-- ERROR: %d -->\n", leStatus); 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(outputFile); 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org leStatus = LE_NO_ERROR; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dumpLongs(outputFile, "result-glyphs", (le_int32 *) glyphs, glyphCount); 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dumpLongs(outputFile, "result-indices", indices, glyphCount); 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dumpFloats(outputFile, "result-positions", positions, glyphCount * 2 + 2); 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(outputFile); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DELETE_ARRAY(positions); 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DELETE_ARRAY(indices); 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DELETE_ARRAY(glyphs); 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete engine; 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdelete_font: 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, " </test-case>\n\n"); 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fflush(outputFile); 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete font; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgfree_c_strings: 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(lang); 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(script); 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeCString(id); 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete root; 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete parser; 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, "</layout-tests>\n"); 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(count==0) { 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stderr, "No cases processed!\n"); 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 1; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(LE_FAILURE(overallStatus)) { 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(outputFile, "<!-- !!! FAILED. %d -->\n", overallStatus); 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(stderr, "!!! FAILED. %d\n", overallStatus); 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(outputFile); 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // return 1; 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org printf("Generated.\n"); 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(outputFile); 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 382