/************************************************************************** * * © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html * *************************************************************************** *************************************************************************** * * Copyright (C) 2013, International Business Machines * Corporation and others. All Rights Reserved. * ************************************************************************/ #include "unicode/utimer.h" #include "unicode/ustdio.h" #include "layout/LETypes.h" #include "layout/LayoutEngine.h" #include "layout/LEScripts.h" #include "SimpleFontInstance.h" #include "PortableFontInstance.h" class Params { public: LEFontInstance *font; LEUnicode *chars; le_int32 charLen; ScriptCodes script; le_int32 glyphCount; }; LEUnicode ArabChars[] = { 0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, // "English " 0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634, // MEM ALIF KAF NOON TEH WAW SHEEN 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E, 0 // " text." }; void iterate(void * p) { Params* params = (Params*) p; LEErrorCode status = LE_NO_ERROR; LEFontInstance *font = params->font; LayoutEngine *engine = LayoutEngine::layoutEngineFactory(font, params->script, -1, status); LEGlyphID *glyphs = NULL; le_int32 *indices = NULL; float *positions = NULL; le_int32 glyphCount = 0; LEUnicode *chars = params->chars; glyphCount = engine->layoutChars(chars, 0, params->charLen, params->charLen, TRUE, 0.0, 0.0, status); glyphs = LE_NEW_ARRAY(LEGlyphID, glyphCount + 10); indices = LE_NEW_ARRAY(le_int32, glyphCount + 10); positions = LE_NEW_ARRAY(float, glyphCount + 10); engine->getGlyphs(glyphs, status); params->glyphCount = glyphCount; delete glyphs; delete indices; delete positions; delete engine; //delete font; } int main(int argc, const char *argv[]) { double len=10.0; for(int i=1;i='0' && argv[i][0]<='9') { len = (1.0)*(argv[i][0]-'0'); } } u_printf("leperf: Testing %s for %.fs...\n", U_ICU_VERSION, len); LEErrorCode status = LE_NO_ERROR; //uloc_setDefault("en_US", &status); Params p; #if 0 p.script = arabScriptCode; p.chars = ArabChars; p.charLen = sizeof(ArabChars)/sizeof(ArabChars[0]); #else p.script = latnScriptCode; p.chars = new LEUnicode[257]; for(int i=0;i<256;i++) { p.chars[i] = i+1; } p.chars[256] = 0; p.charLen = 256; #endif int32_t loopCount; double timeTaken; double timeNs; #if 0 p.font = new SimpleFontInstance(12, status); u_printf("leperf: Running SFI...\r"); timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); u_printf("leperf: SFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, 1000000000.0*(timeTaken/(double)loopCount), (int32_t)loopCount); delete p.font; #endif PortableFontInstance *font; LEErrorCode fontStatus = LE_NO_ERROR; const char *fontPath = "myfont.ttf"; font = new PortableFontInstance(fontPath, 12, fontStatus); p.font = font; loopCount=0; u_printf("leperf: testing %s\n", fontPath); u_printf("leperf: Running ...\r"); timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); timeNs = 1000000000.0*(timeTaken/(double)loopCount); u_printf("leperf: PFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, timeNs, (int32_t)loopCount); u_printf("leperf: DATA|\"%s\"|%.2f|\n", U_ICU_VERSION, timeNs); u_printf("leperf: glyphs=%d\n", p.glyphCount); return 0; } // hack - #include these for easier build. #include "SimpleFontInstance.cpp" #include "PortableFontInstance.cpp" #include "cmaps.cpp" #include "FontTableCache.cpp"