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