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
22 class Params {
23 public:
24 LEFontInstance *font;
25 LEUnicode *chars;
26 le_int32 charLen;
27 ScriptCodes script;
28 le_int32 glyphCount;
29 };
30
31 LEUnicode 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
iterate(void * p)37 void 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
main(int argc,const char * argv[])63 int 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