xref: /inferno-os/libfreetype/test_bbox.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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