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 get_time(void)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 dump_outline(FT_Outline * outline)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 profile_outline(FT_Outline * outline,long repeat)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 main(int argc,char ** argv)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