blob: fd2c8be695af48a4ca77858224c6600d9a413478 [file] [log] [blame]
#include "tree-vect.h"
extern double sqrt (double);
extern double fabs (double);
extern double ceil (double);
extern double floor (double);
extern void abort (void);
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
typedef struct {
int initialHeight, initialWidth;
int rotatedHeight, rotatedWidth;
int autoCropHeight, autoCropWidth;
} ufraw_data;
void __attribute__((noinline,noclone))
ufraw_test(ufraw_data *uf)
{
int iWidth = uf->initialWidth;
int iHeight = uf->initialHeight;
double aspectRatio = ((double)iWidth) / iHeight;
double midX = iWidth / 2.0 - 0.5;
double midY = iHeight / 2.0 - 0.5;
double maxX = 0, maxY = 0;
double minX = 999999, minY = 999999;
double lastX = 0, lastY = 0, area = 0;
double scale;
int i;
for (i = 0; i < iWidth + iHeight - 1; i++)
{
int x, y;
if (i < iWidth) { // Trace the left border of the image
x = i;
y = 0;
} else { // Trace the bottom border of the image
x = iWidth - 1;
y = i - iWidth + 1;
}
double srcX = x - midX;
double srcY = y - midY;
// A digital planimeter:
area += srcY * lastX - srcX * lastY;
lastX = srcX;
lastY = srcY;
maxX = MAX(maxX, fabs(srcX));
maxY = MAX(maxY, fabs(srcY));
if (fabs(srcX / srcY) > aspectRatio)
minX = MIN(minX, fabs(srcX));
else
minY = MIN(minY, fabs(srcY));
}
scale = sqrt((iWidth - 1) * (iHeight - 1) / area);
uf->rotatedWidth = MIN(ceil(2 * maxX + 1.0) * scale, 2 * iWidth);
uf->rotatedHeight = MIN(ceil(2 * maxY + 1.0) * scale, 2 * iHeight);
uf->autoCropWidth = MIN(floor(2 * minX) * scale, 2 * iWidth);
uf->autoCropHeight = MIN(floor(2 * minY) * scale, 2 * iHeight);
if (uf->autoCropWidth != 3)
abort ();
}
int main()
{
ufraw_data uf_data;
ufraw_data *uf = &uf_data;
check_vect ();
uf->initialWidth = 4;
uf->initialHeight = 5;
ufraw_test(uf);
return 0;
}