X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fart_rgba_svp.c;h=1cb96a6086e840f924c0eb888b594254676563e7;hb=657d850f957a2dd703e3aab2d7cde4b0f9711c15;hp=25083d780e2119c7663a20c54fc688f6086412bf;hpb=fefb27848de265750174cab10cfb9aba23d10320;p=rrdtool.git diff --git a/src/art_rgba_svp.c b/src/art_rgba_svp.c index 25083d7..1cb96a6 100644 --- a/src/art_rgba_svp.c +++ b/src/art_rgba_svp.c @@ -36,190 +36,182 @@ #include "art_rgba_svp.h" #include "unused.h" -static void art_rgba_fill_run (art_u8 * linebuf, art_u8 r, art_u8 g, art_u8 b, int n); -static void art_rgba_run_alpha (art_u8 * linebuf, art_u8 r, art_u8 g, art_u8 b, int alpha, int n); +static void art_rgba_fill_run( + art_u8 * linebuf, + art_u8 r, + art_u8 g, + art_u8 b, + int n); +static void art_rgba_run_alpha( + art_u8 * linebuf, + art_u8 r, + art_u8 g, + art_u8 b, + int alpha, + int n); typedef struct _ArtRgbaSVPAlphaData ArtRgbaSVPAlphaData; struct _ArtRgbaSVPAlphaData { - int alphatab[256]; - art_u8 r, g, b, alpha; - art_u8 *buf; - int rowstride; - int libart_x0, libart_x1; + int alphatab[256]; + art_u8 r, g, b, alpha; + art_u8 *buf; + int rowstride; + int libart_x0, libart_x1; }; -static void -art_rgba_svp_alpha_callback (void *callback_data, int UNUSED(y), - int start, ArtSVPRenderAAStep *steps, int n_steps) +static void art_rgba_svp_alpha_callback( + void *callback_data, + int UNUSED(y), + int start, + ArtSVPRenderAAStep * steps, + int n_steps) { - ArtRgbaSVPAlphaData *data = callback_data; - art_u8 *linebuf; - int run_x0, run_x1; - art_u32 running_sum = start; - int libart_x0, libart_x1; - int k; - art_u8 r, g, b; - int *alphatab; - int alpha; - - linebuf = data->buf; - libart_x0 = data->libart_x0; - libart_x1 = data->libart_x1; - - r = data->r; - g = data->g; - b = data->b; - alphatab = data->alphatab; - - if (n_steps > 0) - { - run_x1 = steps[0].x; - if (run_x1 > libart_x0) - { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha (linebuf, - r, g, b, alphatab[alpha], - run_x1 - libart_x0); - } - - /* render the steps into tmpbuf */ - for (k = 0; k < n_steps - 1; k++) - { - running_sum += steps[k].delta; - run_x0 = run_x1; - run_x1 = steps[k + 1].x; - if (run_x1 > run_x0) - { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha (linebuf + (run_x0 - libart_x0) * 4, - r, g, b, alphatab[alpha], - run_x1 - run_x0); - } - } - running_sum += steps[k].delta; - if (libart_x1 > run_x1) - { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha (linebuf + (run_x1 - libart_x0) * 4, - r, g, b, alphatab[alpha], - libart_x1 - run_x1); - } - } - else - { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha (linebuf, - r, g, b, alphatab[alpha], - libart_x1 - libart_x0); + ArtRgbaSVPAlphaData *data = callback_data; + art_u8 *linebuf; + int run_x0, run_x1; + art_u32 running_sum = start; + int libart_x0, libart_x1; + int k; + art_u8 r, g, b; + int *alphatab; + int alpha; + + linebuf = data->buf; + libart_x0 = data->libart_x0; + libart_x1 = data->libart_x1; + + r = data->r; + g = data->g; + b = data->b; + alphatab = data->alphatab; + + if (n_steps > 0) { + run_x1 = steps[0].x; + if (run_x1 > libart_x0) { + alpha = (running_sum >> 16) & 0xff; + if (alpha) + art_rgba_run_alpha(linebuf, + r, g, b, alphatab[alpha], + run_x1 - libart_x0); + } + + /* render the steps into tmpbuf */ + for (k = 0; k < n_steps - 1; k++) { + running_sum += steps[k].delta; + run_x0 = run_x1; + run_x1 = steps[k + 1].x; + if (run_x1 > run_x0) { + alpha = (running_sum >> 16) & 0xff; + if (alpha) + art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4, + r, g, b, alphatab[alpha], + run_x1 - run_x0); + } + } + running_sum += steps[k].delta; + if (libart_x1 > run_x1) { + alpha = (running_sum >> 16) & 0xff; + if (alpha) + art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4, + r, g, b, alphatab[alpha], + libart_x1 - run_x1); + } + } else { + alpha = (running_sum >> 16) & 0xff; + if (alpha) + art_rgba_run_alpha(linebuf, + r, g, b, alphatab[alpha], + libart_x1 - libart_x0); } - data->buf += data->rowstride; + data->buf += data->rowstride; } -static void -art_rgba_svp_alpha_opaque_callback (void *callback_data, int UNUSED(y), - int start, - ArtSVPRenderAAStep *steps, int n_steps) +static void art_rgba_svp_alpha_opaque_callback( + void *callback_data, + int UNUSED(y), + int start, + ArtSVPRenderAAStep * steps, + int n_steps) { - ArtRgbaSVPAlphaData *data = callback_data; - art_u8 *linebuf; - int run_x0, run_x1; - art_u32 running_sum = start; - int libart_x0, libart_x1; - int k; - art_u8 r, g, b; - int *alphatab; - int alpha; - - linebuf = data->buf; - libart_x0 = data->libart_x0; - libart_x1 = data->libart_x1; - - r = data->r; - g = data->g; - b = data->b; - alphatab = data->alphatab; - - if (n_steps > 0) - { - run_x1 = steps[0].x; - if (run_x1 > libart_x0) - { - alpha = running_sum >> 16; - if (alpha) - { - if (alpha >= 255) - art_rgba_fill_run (linebuf, - r, g, b, - run_x1 - libart_x0); - else - art_rgba_run_alpha (linebuf, - r, g, b, alphatab[alpha], - run_x1 - libart_x0); - } - } - - /* render the steps into tmpbuf */ - for (k = 0; k < n_steps - 1; k++) - { - running_sum += steps[k].delta; - run_x0 = run_x1; - run_x1 = steps[k + 1].x; - if (run_x1 > run_x0) - { - alpha = running_sum >> 16; - if (alpha) - { - if (alpha >= 255) - art_rgba_fill_run (linebuf + (run_x0 - libart_x0) * 4, - r, g, b, - run_x1 - run_x0); - else - art_rgba_run_alpha (linebuf + (run_x0 - libart_x0) * 4, - r, g, b, alphatab[alpha], - run_x1 - run_x0); - } - } - } - running_sum += steps[k].delta; - if (libart_x1 > run_x1) - { - alpha = running_sum >> 16; - if (alpha) - { - if (alpha >= 255) - art_rgba_fill_run (linebuf + (run_x1 - libart_x0) * 4, - r, g, b, - libart_x1 - run_x1); - else - art_rgba_run_alpha (linebuf + (run_x1 - libart_x0) * 4, - r, g, b, alphatab[alpha], - libart_x1 - run_x1); - } - } - } - else - { - alpha = running_sum >> 16; - if (alpha) - { - if (alpha >= 255) - art_rgba_fill_run (linebuf, - r, g, b, - libart_x1 - libart_x0); - else - art_rgba_run_alpha (linebuf, - r, g, b, alphatab[alpha], - libart_x1 - libart_x0); - } + ArtRgbaSVPAlphaData *data = callback_data; + art_u8 *linebuf; + int run_x0, run_x1; + art_u32 running_sum = start; + int libart_x0, libart_x1; + int k; + art_u8 r, g, b; + int *alphatab; + int alpha; + + linebuf = data->buf; + libart_x0 = data->libart_x0; + libart_x1 = data->libart_x1; + + r = data->r; + g = data->g; + b = data->b; + alphatab = data->alphatab; + + if (n_steps > 0) { + run_x1 = steps[0].x; + if (run_x1 > libart_x0) { + alpha = running_sum >> 16; + if (alpha) { + if (alpha >= 255) + art_rgba_fill_run(linebuf, r, g, b, run_x1 - libart_x0); + else + art_rgba_run_alpha(linebuf, + r, g, b, alphatab[alpha], + run_x1 - libart_x0); + } + } + + /* render the steps into tmpbuf */ + for (k = 0; k < n_steps - 1; k++) { + running_sum += steps[k].delta; + run_x0 = run_x1; + run_x1 = steps[k + 1].x; + if (run_x1 > run_x0) { + alpha = running_sum >> 16; + if (alpha) { + if (alpha >= 255) + art_rgba_fill_run(linebuf + (run_x0 - libart_x0) * 4, + r, g, b, run_x1 - run_x0); + else + art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4, + r, g, b, alphatab[alpha], + run_x1 - run_x0); + } + } + } + running_sum += steps[k].delta; + if (libart_x1 > run_x1) { + alpha = running_sum >> 16; + if (alpha) { + if (alpha >= 255) + art_rgba_fill_run(linebuf + (run_x1 - libart_x0) * 4, + r, g, b, libart_x1 - run_x1); + else + art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4, + r, g, b, alphatab[alpha], + libart_x1 - run_x1); + } + } + } else { + alpha = running_sum >> 16; + if (alpha) { + if (alpha >= 255) + art_rgba_fill_run(linebuf, r, g, b, libart_x1 - libart_x0); + else + art_rgba_run_alpha(linebuf, + r, g, b, alphatab[alpha], + libart_x1 - libart_x0); + } } - data->buf += data->rowstride; + data->buf += data->rowstride; } /** @@ -249,85 +241,96 @@ art_rgba_svp_alpha_opaque_callback (void *callback_data, int UNUSED(y), * according to the rule in @alphagamma, or default to linear if * @alphagamma is NULL. **/ -void -gnome_print_art_rgba_svp_alpha (const ArtSVP *svp, - int libart_x0, int libart_y0, int libart_x1, int libart_y1, - art_u32 rgba, - art_u8 *buf, int rowstride, - ArtAlphaGamma UNUSED(*alphagamma)) +void gnome_print_art_rgba_svp_alpha( + const ArtSVP * svp, + int libart_x0, + int libart_y0, + int libart_x1, + int libart_y1, + art_u32 rgba, + art_u8 * buf, + int rowstride, + ArtAlphaGamma UNUSED(*alphagamma)) { - ArtRgbaSVPAlphaData data; - int r, g, b, alpha; - int i; - int a, da; - - r = rgba >> 24; - g = (rgba >> 16) & 0xff; - b = (rgba >> 8) & 0xff; - alpha = rgba & 0xff; - - data.r = r; - data.g = g; - data.b = b; - data.alpha = alpha; - - a = 0x8000; - da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */ - - for (i = 0; i < 256; i++) - { - data.alphatab[i] = a >> 16; - a += da; + ArtRgbaSVPAlphaData data; + int r, g, b, alpha; + int i; + int a, da; + + r = rgba >> 24; + g = (rgba >> 16) & 0xff; + b = (rgba >> 8) & 0xff; + alpha = rgba & 0xff; + + data.r = r; + data.g = g; + data.b = b; + data.alpha = alpha; + + a = 0x8000; + da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */ + + for (i = 0; i < 256; i++) { + data.alphatab[i] = a >> 16; + a += da; } - data.buf = buf; - data.rowstride = rowstride; - data.libart_x0 = libart_x0; - data.libart_x1 = libart_x1; - if (alpha == 255) - art_svp_render_aa (svp, libart_x0, libart_y0, libart_x1, libart_y1, art_rgba_svp_alpha_opaque_callback, - &data); - else - art_svp_render_aa (svp, libart_x0, libart_y0, libart_x1, libart_y1, art_rgba_svp_alpha_callback, &data); + data.buf = buf; + data.rowstride = rowstride; + data.libart_x0 = libart_x0; + data.libart_x1 = libart_x1; + if (alpha == 255) + art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1, + art_rgba_svp_alpha_opaque_callback, &data); + else + art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1, + art_rgba_svp_alpha_callback, &data); } -static void -art_rgba_fill_run (art_u8 * buf, art_u8 r, art_u8 g, art_u8 b, int n) +static void art_rgba_fill_run( + art_u8 * buf, + art_u8 r, + art_u8 g, + art_u8 b, + int n) { - int i; - - for (i = 0; i < n; i++) { - * buf++ = r; - * buf++ = g; - * buf++ = b; - * buf++ = 255; - } + int i; + + for (i = 0; i < n; i++) { + *buf++ = r; + *buf++ = g; + *buf++ = b; + *buf++ = 255; + } } /* fixme: this */ -static void -art_rgba_run_alpha (art_u8 * buf, art_u8 r, art_u8 g, art_u8 b, int alpha, int n) +static void art_rgba_run_alpha( + art_u8 * buf, + art_u8 r, + art_u8 g, + art_u8 b, + int alpha, + int n) { - int i; - int br, bg, bb, ba; - int cr, cg, cb; - - for (i = 0; i < n; i++) { - br = * (buf + 0); - bg = * (buf + 1); - bb = * (buf + 2); - ba = * (buf + 3); - - cr = (br * ba + 0x80) >> 8; - cg = (bg * ba + 0x80) >> 8; - cb = (bb * ba + 0x80) >> 8; - - * buf++ = cr + (((r - cr) * alpha + 0x80) >> 8); - * buf++ = cg + (((g - cg) * alpha + 0x80) >> 8); - * buf++ = cb + (((b - cb) * alpha + 0x80) >> 8); - * buf++ = ba + (((255 - ba) * alpha + 0x80) >> 8); - } + int i; + int br, bg, bb, ba; + int cr, cg, cb; + + for (i = 0; i < n; i++) { + br = *(buf + 0); + bg = *(buf + 1); + bb = *(buf + 2); + ba = *(buf + 3); + + cr = (br * ba + 0x80) >> 8; + cg = (bg * ba + 0x80) >> 8; + cb = (bb * ba + 0x80) >> 8; + + *buf++ = cr + (((r - cr) * alpha + 0x80) >> 8); + *buf++ = cg + (((g - cg) * alpha + 0x80) >> 8); + *buf++ = cb + (((b - cb) * alpha + 0x80) >> 8); + *buf++ = ba + (((255 - ba) * alpha + 0x80) >> 8); + } } - -