killed a rounding error in line clipping

SVN revision: 3308
This commit is contained in:
Tom Gilbert 2000-09-03 22:43:59 +00:00
parent 6a4d800e92
commit cdf8e6ed76
1 changed files with 35 additions and 20 deletions

View File

@ -1,4 +1,5 @@
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <math.h>
#include "common.h" #include "common.h"
#include "colormod.h" #include "colormod.h"
#include "image.h" #include "image.h"
@ -14,6 +15,8 @@
#define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define round(a) floor(a+0.5)
void void
__imlib_FlipImageHoriz(ImlibImage * im) __imlib_FlipImageHoriz(ImlibImage * im)
{ {
@ -1552,9 +1555,15 @@ imlib_clip_line(int x0, int y0, int x1, int y1, int xmin, int xmax, int ymin,
{ {
ImlibOutCode outcode0, outcode1, outcode_out; ImlibOutCode outcode0, outcode1, outcode_out;
unsigned char accept = FALSE, done = FALSE; unsigned char accept = FALSE, done = FALSE;
double dx0, dy0, dx1, dy1;
outcode0 = __imlib_comp_outcode(x0, y0, xmin, xmax, ymin, ymax); dx0 = x0;
outcode1 = __imlib_comp_outcode(x1, y1, xmin, xmax, ymin, ymax); dx1 = x1;
dy0 = y0;
dy1 = y1;
outcode0 = __imlib_comp_outcode(dx0, dy0, xmin, xmax, ymin, ymax);
outcode1 = __imlib_comp_outcode(dx1, dy1, xmin, xmax, ymin, ymax);
do do
{ {
@ -1572,50 +1581,57 @@ imlib_clip_line(int x0, int y0, int x1, int y1, int xmin, int xmax, int ymin,
outcode_out = outcode0 ? outcode0 : outcode1; outcode_out = outcode0 ? outcode0 : outcode1;
if (outcode_out & TOP) if (outcode_out & TOP)
{ {
x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0); x = dx0 + (dx1 - dx0) * ((double) ymax - dy0) / (dy1 - dy0);
y = ymax; y = ymax;
} }
else if (outcode_out & BOTTOM) else if (outcode_out & BOTTOM)
{ {
x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0); x = dx0 + (dx1 - dx0) * ((double) ymin - dy0) / (dy1 - dy0);
y = ymin; y = ymin;
} }
else if (outcode_out & RIGHT) else if (outcode_out & RIGHT)
{ {
y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0); y = dy0 + (dy1 - dy0) * ((double) xmax - dx0) / (dx1 - dx0);
x = xmax; x = xmax;
} }
else else
{ {
y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0); y = dy0 + (dy1 - dy0) * ((double) xmin - dx0) / (dx1 - dx0);
x = xmin; x = xmin;
} }
if (outcode_out == outcode0) if (outcode_out == outcode0)
{ {
x0 = x; dx0 = x;
y0 = y; dy0 = y;
outcode0 = __imlib_comp_outcode(x0, y0, xmin, xmax, ymin, ymax); outcode0 = __imlib_comp_outcode(dx0, dy0, xmin, xmax, ymin, ymax);
} }
else else
{ {
x1 = x; dx1 = x;
y1 = y; dy1 = y;
outcode1 = __imlib_comp_outcode(x1, y1, xmin, xmax, ymin, ymax); outcode1 = __imlib_comp_outcode(dx1, dy1, xmin, xmax, ymin, ymax);
} }
} }
} }
while (done == FALSE); while (done == FALSE);
*clip_x0 = x0; /* round up before converting down to ints */
*clip_y0 = y0; dx0 = round(dx0);
*clip_x1 = x1; dx1 = round(dx1);
*clip_y1 = y1; dy0 = round(dy0);
dy1 = round(dy1);
*clip_x0 = dx0;
*clip_y0 = dy0;
*clip_x1 = dx1;
*clip_y1 = dy1;
return accept; return accept;
} }
ImlibOutCode __imlib_comp_outcode(double x, double y, double xmin, ImlibOutCode
double xmax, double ymin, double ymax) __imlib_comp_outcode(double x, double y, double xmin, double xmax,
double ymin, double ymax)
{ {
ImlibOutCode code = 0; ImlibOutCode code = 0;
@ -1630,8 +1646,7 @@ ImlibOutCode __imlib_comp_outcode(double x, double y, double xmin,
return code; return code;
} }
ImlibPoly ImlibPoly __imlib_polygon_new()
__imlib_polygon_new()
{ {
ImlibPoly poly; ImlibPoly poly;