1 #include "tree-vect.h"
2
3 extern double sqrt (double);
4 extern double fabs (double);
5 extern double ceil (double);
6 extern double floor (double);
7
8 extern void abort (void);
9
10 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
11 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
12
13 typedef struct {
14 int initialHeight, initialWidth;
15 int rotatedHeight, rotatedWidth;
16 int autoCropHeight, autoCropWidth;
17 } ufraw_data;
18
19 void __attribute__((noinline,noclone))
20 ufraw_test(ufraw_data *uf)
21 {
22 int iWidth = uf->initialWidth;
23 int iHeight = uf->initialHeight;
24 double aspectRatio = ((double)iWidth) / iHeight;
25 double midX = iWidth / 2.0 - 0.5;
26 double midY = iHeight / 2.0 - 0.5;
27 double maxX = 0, maxY = 0;
28 double minX = 999999, minY = 999999;
29 double lastX = 0, lastY = 0, area = 0;
30 double scale;
31 int i;
32 for (i = 0; i < iWidth + iHeight - 1; i++)
33 {
34 int x, y;
35 if (i < iWidth) { // Trace the left border of the image
36 x = i;
37 y = 0;
38 } else { // Trace the bottom border of the image
39 x = iWidth - 1;
40 y = i - iWidth + 1;
41 }
42 double srcX = x - midX;
43 double srcY = y - midY;
44 // A digital planimeter:
45 area += srcY * lastX - srcX * lastY;
46 lastX = srcX;
47 lastY = srcY;
48 maxX = MAX(maxX, fabs(srcX));
49 maxY = MAX(maxY, fabs(srcY));
50 if (fabs(srcX / srcY) > aspectRatio)
51 minX = MIN(minX, fabs(srcX));
52 else
53 minY = MIN(minY, fabs(srcY));
54 }
55 scale = sqrt((iWidth - 1) * (iHeight - 1) / area);
56 uf->rotatedWidth = MIN(ceil(2 * maxX + 1.0) * scale, 2 * iWidth);
57 uf->rotatedHeight = MIN(ceil(2 * maxY + 1.0) * scale, 2 * iHeight);
58 uf->autoCropWidth = MIN(floor(2 * minX) * scale, 2 * iWidth);
59 uf->autoCropHeight = MIN(floor(2 * minY) * scale, 2 * iHeight);
60 if (uf->autoCropWidth != 3)
61 abort ();
62 }
63
64 int main()
65 {
66 ufraw_data uf_data;
67 ufraw_data *uf = &uf_data;
68 check_vect ();
69 uf->initialWidth = 4;
70 uf->initialHeight = 5;
71 ufraw_test(uf);
72 return 0;
73 }
74