1
0
mirror of git://projects.qi-hardware.com/ben-scans.git synced 2024-11-21 21:45:55 +02:00

Some simple optimizations increase drawing speed in overlap by 33%.

- solidify/overlap.c (overlap): added speed testing loop
- solidify/overlap.c (zmix): instead of floor/ceil, we just use
  floor/floor+1. With the ramp() change below, an 18% speed increase results
- solidify/overlap.c (ramp): after the above change, w0 and w1 can never be
  zero, so we don't have to test for this case
- solidify/array.h (get_bounded), solidify/array.c: inline get_bounded(),
  yielding a 13% speed increase
This commit is contained in:
Werner Almesberger 2010-09-24 17:56:55 -03:00
parent 2764155d15
commit d4a5575599
3 changed files with 27 additions and 14 deletions

View File

@ -83,13 +83,3 @@ void set(struct array *a, int x, int y, int z)
a->data[x-a->min_x+(a->max_x-a->min_x+1)*(y-a->min_y)] = z;
}
}
int get_bounded(const struct array *a, int x, int y)
{
if (x < a->min_x || x > a->max_x)
return UNDEF;
if (y < a->min_y || y > a->max_y)
return UNDEF;
return get(a, x, y);
}

View File

@ -31,7 +31,6 @@ struct array *new_array(void);
void free_array(struct array *a);
void set(struct array *a, int x, int y, int z);
int get_bounded(const struct array *a, int x, int y);
static inline int get(const struct array *a, int x, int y)
@ -39,4 +38,15 @@ static inline int get(const struct array *a, int x, int y)
return a->data[(x)-a->min_x+(a->max_x-a->min_x+1)*((y)-a->min_y)];
}
static inline int get_bounded(const struct array *a, int x, int y)
{
if (x < a->min_x || x > a->max_x)
return UNDEF;
if (y < a->min_y || y > a->max_y)
return UNDEF;
return get(a, x, y);
}
#endif /* ARRAY_H */

View File

@ -51,7 +51,7 @@ static double r_center(const struct solid *s)
static double ramp(int z0, double w0, int z1, double w1)
{
if (z0 != UNDEF && z1 != UNDEF)
return w0 == 0 && w1 == 0 ? z0 : z0*w0+z1*w1;
return z0*w0+z1*w1;
if (z0 == UNDEF && z0 == UNDEF)
return UNDEF_F;
if (z0 == UNDEF && w0 < w1)
@ -68,9 +68,9 @@ static double zmix(struct face *f, double x, double y)
double zx0, zx1;
xa = floor(x);
xb = ceil(x);
xb = xa+1;
ya = floor(y);
yb = ceil(y);
yb = ya+1;
zx0 = ramp(
get_bounded(f->a, xa, ya), yb-y,
@ -456,4 +456,17 @@ void overlap(GtkWidget *canvas, struct solid *s)
g_signal_connect(G_OBJECT(darea), "motion-notify-event",
G_CALLBACK(motion_notify_event), s);
if (0) {
int i;
long t0 = time(NULL);
gtk_widget_show_all(canvas);
for (i = 0; i != 1000; i++) {
rotate(&s->a->m, 100);
draw_image(darea, s, 0);
while (gtk_events_pending())
gtk_main_iteration();
}
fprintf(stderr, "%lu\n", time(NULL)-t0);
}
}