1/*************************************************************************** 2* 3* Copyright (C) 2013, International Business Machines 4* Corporation and others. All Rights Reserved. 5* 6************************************************************************/ 7 8#include "unicode/utimer.h" 9#include "unicode/ustdio.h" 10#include "layout/LETypes.h" 11#include "layout/LayoutEngine.h" 12#include "layout/LEScripts.h" 13#include "SimpleFontInstance.h" 14#include "PortableFontInstance.h" 15 16class Params { 17public: 18 LEFontInstance *font; 19 LEUnicode *chars; 20 le_int32 charLen; 21 ScriptCodes script; 22 le_int32 glyphCount; 23}; 24 25LEUnicode ArabChars[] = { 26 0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, // "English " 27 0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634, // MEM ALIF KAF NOON TEH WAW SHEEN 28 0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E, 0 // " text." 29 }; 30 31void iterate(void * p) { 32 Params* params = (Params*) p; 33 34 LEErrorCode status = LE_NO_ERROR; 35 LEFontInstance *font = params->font; 36 LayoutEngine *engine = LayoutEngine::layoutEngineFactory(font, params->script, -1, status); 37 LEGlyphID *glyphs = NULL; 38 le_int32 *indices = NULL; 39 float *positions = NULL; 40 le_int32 glyphCount = 0; 41 LEUnicode *chars = params->chars; 42 glyphCount = engine->layoutChars(chars, 0, params->charLen, params->charLen, TRUE, 0.0, 0.0, status); 43 glyphs = LE_NEW_ARRAY(LEGlyphID, glyphCount + 10); 44 indices = LE_NEW_ARRAY(le_int32, glyphCount + 10); 45 positions = LE_NEW_ARRAY(float, glyphCount + 10); 46 engine->getGlyphs(glyphs, status); 47 params->glyphCount = glyphCount; 48 49 50 delete glyphs; 51 delete indices; 52 delete positions; 53 delete engine; 54 //delete font; 55} 56 57int main(int argc, const char *argv[]) { 58 double len=10.0; 59 for(int i=1;i<argc;i++) { 60 puts("arg:"); 61 puts(argv[i]); 62 if(argv[i][0]=='p') { 63 printf("hit enter-pid=%d", getpid()); 64 getchar(); 65 } else if(argv[i][0]>='0' && argv[i][0]<='9') { 66 len = (1.0)*(argv[i][0]-'0'); 67 } 68 } 69 u_printf("leperf: Testing %s for %.fs...\n", U_ICU_VERSION, len); 70 LEErrorCode status = LE_NO_ERROR; 71 //uloc_setDefault("en_US", &status); 72 Params p; 73 74#if 0 75 p.script = arabScriptCode; 76 p.chars = ArabChars; 77 p.charLen = sizeof(ArabChars)/sizeof(ArabChars[0]); 78#else 79 p.script = latnScriptCode; 80 p.chars = new LEUnicode[257]; 81 for(int i=0;i<256;i++) { 82 p.chars[i] = i+1; 83 } 84 p.chars[256] = 0; 85 p.charLen = 256; 86#endif 87 88 int32_t loopCount; 89 double timeTaken; 90 double timeNs; 91#if 0 92 p.font = new SimpleFontInstance(12, status); 93 u_printf("leperf: Running SFI...\r"); 94 timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); 95 u_printf("leperf: SFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, 1000000000.0*(timeTaken/(double)loopCount), (int32_t)loopCount); 96 delete p.font; 97#endif 98 PortableFontInstance *font; 99 LEErrorCode fontStatus = LE_NO_ERROR; 100 const char *fontPath = "myfont.ttf"; 101 102 font = new PortableFontInstance(fontPath, 12, fontStatus); 103 104 p.font = font; 105 loopCount=0; 106 u_printf("leperf: testing %s\n", fontPath); 107 u_printf("leperf: Running ...\r"); 108 timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p); 109 timeNs = 1000000000.0*(timeTaken/(double)loopCount); 110 u_printf("leperf: PFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, timeNs, (int32_t)loopCount); 111 u_printf("leperf: DATA|\"%s\"|%.2f|\n", U_ICU_VERSION, timeNs); 112 u_printf("leperf: glyphs=%d\n", p.glyphCount); 113 return 0; 114} 115 116// hack - #include these for easier build. 117#include "SimpleFontInstance.cpp" 118#include "PortableFontInstance.cpp" 119#include "cmaps.cpp" 120#include "FontTableCache.cpp" 121