diff options
author | Carsten Haitzler <raster@rasterman.com> | 2001-01-26 03:29:55 +0000 |
---|---|---|
committer | Carsten Haitzler <raster@rasterman.com> | 2001-01-26 03:29:55 +0000 |
commit | 45ba00f3fdafa6b4538d083fa7361d7565145a04 (patch) | |
tree | f1d26135c6967986167a7df1e0a36e511b36613c | |
parent | 9cc5944b2b74fced03fb7a829735de364fe4e933 (diff) | |
download | imlib2-45ba00f3fdafa6b4538d083fa7361d7565145a04.tar.gz |
ewwwww - fix infinte loop bug... :)
SVN revision: 4152
-rw-r--r-- | src/rgbadraw.c | 43 | ||||
-rw-r--r-- | test/main.c | 59 |
2 files changed, 85 insertions, 17 deletions
diff --git a/src/rgbadraw.c b/src/rgbadraw.c index e4e2fef..1f078a4 100644 --- a/src/rgbadraw.c +++ b/src/rgbadraw.c @@ -2140,8 +2140,8 @@ span(ImlibImage * im, int y, int x1, int x2, DATA8 r, DATA8 g, typedef struct _span Span; struct _span { - int x, xstart, ystart, vert; - int pol; + int x, xstart, ystart, vert, xend, yend; + int pol, point; double gradient; Span *next; }; @@ -2231,7 +2231,7 @@ __imlib_draw_polygon_filled(ImlibImage * im, ImlibPoly poly, int clip_xmin, else dir = -1; } else dir = -1; - for (j = 0; j < poly->pointcount; j += dir) + for (j = 0; (j != poly->pointcount) && (j != -poly->pointcount); j += dir) { int pt1, pt2, x1, y1, x2, y2, vert, step; double grad; @@ -2285,26 +2285,30 @@ __imlib_draw_polygon_filled(ImlibImage * im, ImlibPoly poly, int clip_xmin, { /* for every scanline this line spans add a span point */ s = malloc(sizeof(Span)); - if (pol == 1) - s->x = x + 1; - else - s->x = x; - s->pol = pol; - s->xstart = x1; - s->ystart = y1; - s->vert = vert; + if (pol == 1) s->x = x + 1; + else s->x = x; + s->pol = pol; + s->xstart = x1; + s->ystart = y1; + s->xend = x2; + s->yend = y2; + s->vert = vert; s->gradient = grad; - s->next = NULL; + s->next = NULL; + if ((i == y1) || (i == y2)) s->point = 1; + else s->point = 0; + /* actually add the scan point to the scan list array */ - if (!spans[i - clip_ymin]) spans[i - clip_ymin] = s; + if (!(spans[i - clip_ymin])) spans[i - clip_ymin] = s; else { Span *ps, *ss; - for (ps = NULL, ss = spans[i - clip_ymin]; + ps = NULL; + for (ss = spans[i - clip_ymin]; ss; - ps = ss, ss = ss->next) + ss = ss->next) { if (s->x <= ss->x) { @@ -2313,13 +2317,17 @@ __imlib_draw_polygon_filled(ImlibImage * im, ImlibPoly poly, int clip_xmin, s->next = ss; goto nospans; } + ps = ss; } + /* last span on line and still not < ss->x */ + if (ps) ps->next = s; nospans: } } - if (i == y2) break; + if (i == y2) goto nolines; i += step; } + nolines: } for (i = 0; i < h; i++) { @@ -2331,7 +2339,8 @@ __imlib_draw_polygon_filled(ImlibImage * im, ImlibPoly poly, int clip_xmin, { if ((s->next) && (s->next->x == s->x) && - (s->next->pol == s->pol)) + (s->next->pol == s->pol) + ) { Span *ss; diff --git a/test/main.c b/test/main.c index 2f0d80f..4943c2d 100644 --- a/test/main.c +++ b/test/main.c @@ -73,6 +73,7 @@ int main (int argc, char **argv) int interactive = 1; int blendtest = 0; int filter = 0; + int pol = 0; int rotate = 0; int rottest = 0; int scaleup = 0; @@ -118,6 +119,7 @@ int main (int argc, char **argv) printf ("-maxcolors <n>\t\tLimit color allocation count to n colors.\n"); // require parameter nb colors printf ("-text\t\tDisplays the text following this option. Need a loaded font.\n"); printf ("-font\t\tLoads a font. The parameter must follow the police_name/size format. Example: loading the grunge font at size 18 is : grunge/18.\n\t\tThe XFD font also can be specified. Ex. 'notepad/32,-*--24-*'.\n"); + printf ("-poly\t\tPerforms a poly test\n"); printf ("The following options requires a file to work properly.\n"); printf ("-textdir\t\tText Direction. 0: L to R, 1: R to L\n"); printf (" 2: U to D, 3: D to U, 4: angle\n"); @@ -155,6 +157,8 @@ int main (int argc, char **argv) origone = 1; else if (!strcmp(argv[i], "-blend")) blend = 1; + else if (!strcmp(argv[i], "-poly")) + pol = 1; else if (!strcmp(argv[i], "-blendtest")) { blendtest = 1; @@ -344,6 +348,61 @@ int main (int argc, char **argv) imlib_polygon_add_point(poly3, 350,300); +#define A90 (3.141592654 / 2) + if (pol) + { + Imlib_Image im_bg, im; + int w, h; + int i; + double a, points[8][2]; + + if (file) + im_bg = imlib_load_image(file); + else + im_bg = imlib_load_image("test_images/bg.png"); + imlib_context_set_image(im_bg); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + XResizeWindow(disp, win, w, h); + XSync(disp, False); + im = imlib_create_image(w, h); + srand(time(NULL)); + for (i = 0; i < 8; i++) + { + points[i][0] = (rand()%w) - (w / 2); + points[i][1] = (rand()%h) - (h / 2); + } + a = 0.0; + for (;;) + { + imlib_context_set_image(im); + imlib_blend_image_onto_image(im_bg, 0, 0, 0, w, h, 0, 0, w, h); + + poly = imlib_polygon_new(); + for (i = 0; i < 8; i++) + { + double xx, yy; + xx = (w / 2) + + (cos(a) * points[i][0]) + + (cos(a + A90) * points[i][1]); + yy = (h / 2) + + (sin(a) * points[i][0]) + + (sin(a + A90) * points[i][1]); + imlib_polygon_add_point(poly, xx, yy); + } + printf("draw angle %3.3f\n", a); + imlib_context_set_color(255, 255, 255, 100); + imlib_image_fill_polygon(poly); + imlib_context_set_color(0, 0, 0, 20); + imlib_image_draw_polygon(poly, 1); + imlib_polygon_free(poly); + + + imlib_render_image_on_drawable(0, 0); + a += 0.05; + } + } + if (loop) { printf("loop\n"); |