111
|
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
|