Home | History | Annotate | Download | only in leperf
      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 
     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 
     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