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