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