16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/***************************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org************************************************************************/
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utimer.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustdio.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LETypes.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LayoutEngine.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LEScripts.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "SimpleFontInstance.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "PortableFontInstance.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Params {
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  LEFontInstance *font;
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  LEUnicode *chars;
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  le_int32 charLen;
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ScriptCodes script;
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  le_int32 glyphCount;
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLEUnicode     ArabChars[] = {
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0045, 0x006E, 0x0067, 0x006C, 0x0069, 0x0073, 0x0068, 0x0020, // "English "
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0645, 0x0627, 0x0646, 0x062A, 0x0648, 0x0634,                 // MEM ALIF KAF NOON TEH WAW SHEEN
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0x0020, 0x0074, 0x0065, 0x0078, 0x0074, 0x02E, 0                   // " text."
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid iterate(void * p) {
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Params* params = (Params*) p;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LEErrorCode status = LE_NO_ERROR;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LEFontInstance *font = params->font;
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LayoutEngine *engine = LayoutEngine::layoutEngineFactory(font, params->script, -1, status);
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LEGlyphID *glyphs    = NULL;
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32  *indices   = NULL;
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    float     *positions = NULL;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_int32   glyphCount = 0;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LEUnicode *chars = params->chars;
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    glyphCount = engine->layoutChars(chars, 0, params->charLen, params->charLen, TRUE, 0.0, 0.0, status);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    glyphs    = LE_NEW_ARRAY(LEGlyphID, glyphCount + 10);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    indices   = LE_NEW_ARRAY(le_int32, glyphCount + 10);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    positions = LE_NEW_ARRAY(float, glyphCount + 10);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    engine->getGlyphs(glyphs, status);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    params->glyphCount = glyphCount;
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete glyphs;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete indices;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete positions;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete engine;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //delete font;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main(int argc, const char *argv[]) {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double len=10.0;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int i=1;i<argc;i++) {
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    puts("arg:");
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    puts(argv[i]);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(argv[i][0]=='p') {
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      printf("hit enter-pid=%d", getpid());
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      getchar();
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(argv[i][0]>='0' && argv[i][0]<='9') {
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      len = (1.0)*(argv[i][0]-'0');
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: Testing %s for %.fs...\n", U_ICU_VERSION, len);
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  LEErrorCode status = LE_NO_ERROR;
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //uloc_setDefault("en_US", &status);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  Params p;
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.script = arabScriptCode;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.chars = ArabChars;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.charLen = sizeof(ArabChars)/sizeof(ArabChars[0]);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.script = latnScriptCode;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.chars = new LEUnicode[257];
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(int i=0;i<256;i++) {
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p.chars[i] = i+1;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.chars[256] = 0;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.charLen = 256;
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t loopCount;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double timeTaken;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  double timeNs;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  p.font = new SimpleFontInstance(12, status);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: Running SFI...\r");
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p);
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: SFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, 1000000000.0*(timeTaken/(double)loopCount), (int32_t)loopCount);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  delete p.font;
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    PortableFontInstance *font;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LEErrorCode fontStatus = LE_NO_ERROR;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *fontPath = "myfont.ttf";
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    font = new PortableFontInstance(fontPath, 12, fontStatus);
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    p.font = font;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    loopCount=0;
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_printf("leperf: testing %s\n", fontPath);
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_printf("leperf: Running ...\r");
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  timeTaken = utimer_loopUntilDone(len, &loopCount, iterate, &p);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  timeNs = 1000000000.0*(timeTaken/(double)loopCount);
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: PFI .. took %.fs %.2fns/ea\nleperf: .. iter= %d\n", timeTaken, timeNs, (int32_t)loopCount);
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: DATA|\"%s\"|%.2f|\n", U_ICU_VERSION, timeNs);
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  u_printf("leperf: glyphs=%d\n", p.glyphCount);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// hack - #include these for easier build.
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "SimpleFontInstance.cpp"
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "PortableFontInstance.cpp"
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmaps.cpp"
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "FontTableCache.cpp"
121