# HG changeset patch # User lorenm # Date 1202565195 0 # Node ID 575e0a847f0c523f2852366e1f25decc7ab9b05f # Parent 0ea2b97aa9f69dc59beec9e6729c0d329ee9dfd8 30% faster ff_vorbis_floor1_render_list, 3% faster overall diff -r 0ea2b97aa9f6 -r 575e0a847f0c vorbis.c --- a/vorbis.c Sat Feb 09 05:29:47 2008 +0000 +++ b/vorbis.c Sat Feb 09 13:53:15 2008 +0000 @@ -141,29 +141,23 @@ } } -static void render_line(int x0, int y0, int x1, int y1, float * buf, int n) { +static void render_line(int x0, int y0, int x1, int y1, float * buf) { int dy = y1 - y0; int adx = x1 - x0; - int ady = FFABS(dy); int base = dy / adx; + int ady = FFABS(dy) - FFABS(base) * adx; int x = x0; int y = y0; int err = 0; - int sy; - if (dy < 0) sy = base - 1; - else sy = base + 1; - ady = ady - FFABS(base) * adx; - if (x >= n) return; + int sy = dy<0 ? -1 : 1; buf[x] = ff_vorbis_floor1_inverse_db_table[y]; - for (x = x0 + 1; x < x1; x++) { - if (x >= n) return; + while (++x < x1) { err += ady; if (err >= adx) { err -= adx; y += sy; - } else { - y += base; } + y += base; buf[x] = ff_vorbis_floor1_inverse_db_table[y]; } } @@ -175,11 +169,14 @@ for (i = 1; i < values; i++) { int pos = list[i].sort; if (flag[pos]) { - render_line(lx, ly, list[pos].x, y_list[pos] * multiplier, out, samples); - lx = list[pos].x; - ly = y_list[pos] * multiplier; + int x1 = list[pos].x; + int y1 = y_list[pos] * multiplier; + if (lx < samples) + render_line(lx, ly, FFMIN(x1,samples), y1, out); + lx = x1; + ly = y1; } if (lx >= samples) break; } - if (lx < samples) render_line(lx, ly, samples, ly, out, samples); + if (lx < samples) render_line(lx, ly, samples, ly, out); }