Home | History | Annotate | Download | only in tools
      1 #include <ft2build.h>
      2 #include FT_FREETYPE_H
      3 #include FT_BBOX_H
      4 
      5 
      6 #include <time.h>    /* for clock() */
      7 
      8 /* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */
      9 /* to get the HZ macro which is the equivalent.                         */
     10 #if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)
     11 #include <sys/param.h>
     12 #define CLOCKS_PER_SEC HZ
     13 #endif
     14 
     15   static long
     16   get_time( void )
     17   {
     18     return clock() * 10000L / CLOCKS_PER_SEC;
     19   }
     20 
     21 
     22 
     23 
     24   /* test bbox computations */
     25 
     26 #define  XSCALE    65536
     27 #define  XX(x)     ((FT_Pos)(x*XSCALE))
     28 #define  XVEC(x,y)  { XX(x), XX(y) }
     29 #define  XVAL(x)   ((x)/(1.0*XSCALE))
     30 
     31   /* dummy outline #1 */
     32   static FT_Vector  dummy_vec_1[4] =
     33   {
     34 #if 1
     35     XVEC( 408.9111, 535.3164 ),
     36     XVEC( 455.8887, 634.396  ),
     37     XVEC( -37.8765, 786.2207 ),
     38     XVEC( 164.6074, 535.3164 )
     39 #else
     40     { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL },  /* 408.9111, 535.3164 */
     41     { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L },  /* 455.8887, 634.3960 */
     42     { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL },  /* -37.8765, 786.2207 */
     43     { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL }   /* 164.6074, 535.3164 */
     44 #endif
     45    };
     46 
     47   static char  dummy_tag_1[4] =
     48   {
     49     FT_CURVE_TAG_ON,
     50     FT_CURVE_TAG_CUBIC,
     51     FT_CURVE_TAG_CUBIC,
     52     FT_CURVE_TAG_ON
     53   };
     54 
     55   static short  dummy_contour_1[1] =
     56   {
     57     3
     58   };
     59 
     60   static FT_Outline  dummy_outline_1 =
     61   {
     62     1,
     63     4,
     64     dummy_vec_1,
     65     dummy_tag_1,
     66     dummy_contour_1,
     67     0
     68   };
     69 
     70 
     71   /* dummy outline #2 */
     72   static FT_Vector  dummy_vec_2[4] =
     73   {
     74     XVEC( 100.0, 100.0 ),
     75     XVEC( 100.0, 200.0 ),
     76     XVEC( 200.0, 200.0 ),
     77     XVEC( 200.0, 133.0 )
     78   };
     79 
     80   static FT_Outline  dummy_outline_2 =
     81   {
     82     1,
     83     4,
     84     dummy_vec_2,
     85     dummy_tag_1,
     86     dummy_contour_1,
     87     0
     88   };
     89 
     90 
     91   /* dummy outline #3 with bbox of [0 100 128 128] precisely */
     92   static FT_Vector  dummy_vec_3[4] =
     93   {
     94     XVEC( 100.0, 127.0 ),
     95     XVEC( 200.0, 127.0 ),
     96     XVEC(   0.0, 136.0 ),
     97     XVEC(   0.0, 100.0 )
     98   };
     99 
    100   static FT_Outline  dummy_outline_3 =
    101   {
    102     1,
    103     4,
    104     dummy_vec_3,
    105     dummy_tag_1,
    106     dummy_contour_1,
    107     0
    108   };
    109 
    110 
    111   static void
    112   dump_outline( FT_Outline*  outline )
    113   {
    114     FT_BBox  bbox;
    115 
    116     /* compute and display cbox */
    117     FT_Outline_Get_CBox( outline, &bbox );
    118     printf( "cbox = [%.2f %.2f %.2f %.2f]\n",
    119              XVAL( bbox.xMin ),
    120              XVAL( bbox.yMin ),
    121              XVAL( bbox.xMax ),
    122              XVAL( bbox.yMax ) );
    123 
    124     /* compute and display bbox */
    125     FT_Outline_Get_BBox( outline, &bbox );
    126     printf( "bbox = [%.2f %.2f %.2f %.2f]\n",
    127              XVAL( bbox.xMin ),
    128              XVAL( bbox.yMin ),
    129              XVAL( bbox.xMax ),
    130              XVAL( bbox.yMax ) );
    131   }
    132 
    133 
    134 
    135   static void
    136   profile_outline( FT_Outline*   outline,
    137                    long          repeat )
    138   {
    139     FT_BBox  bbox;
    140     long     count;
    141     long     time0;
    142 
    143     time0 = get_time();
    144     for ( count = repeat; count > 0; count-- )
    145       FT_Outline_Get_CBox( outline, &bbox );
    146 
    147     time0 = get_time() - time0;
    148     printf( "time = %6.3f cbox = [%8.4f %8.4f %8.4f %8.4f]\n",
    149              ((double)time0/10000.0),
    150              XVAL( bbox.xMin ),
    151              XVAL( bbox.yMin ),
    152              XVAL( bbox.xMax ),
    153              XVAL( bbox.yMax ) );
    154     printf( "cbox_hex = [%08X %08X %08X %08X]\n",
    155              bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );
    156 
    157 
    158     time0 = get_time();
    159     for ( count = repeat; count > 0; count-- )
    160       FT_Outline_Get_BBox( outline, &bbox );
    161 
    162     time0 = get_time() - time0;
    163     printf( "time = %6.3f bbox = [%8.4f %8.4f %8.4f %8.4f]\n",
    164              ((double)time0/10000.0),
    165              XVAL( bbox.xMin ),
    166              XVAL( bbox.yMin ),
    167              XVAL( bbox.xMax ),
    168              XVAL( bbox.yMax ) );
    169     printf( "bbox_hex = [%08X %08X %08X %08X]\n",
    170              bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax );
    171   }
    172 
    173 #define REPEAT  1000000L
    174 
    175   int  main( int  argc, char**  argv )
    176   {
    177     printf( "outline #1\n" );
    178     profile_outline( &dummy_outline_1, REPEAT );
    179 
    180     printf( "outline #2\n" );
    181     profile_outline( &dummy_outline_2, REPEAT );
    182 
    183     printf( "outline #3\n" );
    184     profile_outline( &dummy_outline_3, REPEAT );
    185 
    186     return 0;
    187   }
    188 
    189