--- /dev/null
+/***************************************************************************
+*
+* 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<argc;i++) {
+ puts("arg:");
+ puts(argv[i]);
+ if(argv[i][0]=='p') {
+ printf("hit enter-pid=%d", getpid());
+ getchar();
+ } else if(argv[i][0]>='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"