aboutsummaryrefslogtreecommitdiffstats
path: root/libart_lgpl/art_render_svp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libart_lgpl/art_render_svp.c')
-rw-r--r--libart_lgpl/art_render_svp.c421
1 files changed, 0 insertions, 421 deletions
diff --git a/libart_lgpl/art_render_svp.c b/libart_lgpl/art_render_svp.c
deleted file mode 100644
index af75b7718e..0000000000
--- a/libart_lgpl/art_render_svp.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * art_render_gradient.c: SVP mask source for modular rendering.
- *
- * Libart_LGPL - library of basic graphic primitives
- * Copyright (C) 2000 Raph Levien
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Raph Levien <raph@acm.org>
- */
-
-#include "art_render_svp.h"
-#include "art_svp_render_aa.h"
-
-typedef struct _ArtMaskSourceSVP ArtMaskSourceSVP;
-
-struct _ArtMaskSourceSVP {
- ArtMaskSource super;
- ArtRender *render;
- const ArtSVP *svp;
- art_u8 *dest_ptr;
-};
-
-static void
-art_render_svp_done (ArtRenderCallback *self, ArtRender *render)
-{
- art_free (self);
-}
-
-static int
-art_render_svp_can_drive (ArtMaskSource *self, ArtRender *render)
-{
- return 10;
-}
-
-/* The basic art_render_svp_callback function is repeated four times,
- for all combinations of non-unit opacity and generating spans. In
- general, I'd consider this bad style, but in this case I plead
- a measurable performance improvement. */
-
-static void
-art_render_svp_callback (void *callback_data, int y,
- int start, ArtSVPRenderAAStep *steps, int n_steps)
-{
- ArtMaskSourceSVP *z = (ArtMaskSourceSVP *)callback_data;
- ArtRender *render = z->render;
- int n_run = 0;
- int i;
- int running_sum = start;
- int x0 = render->x0;
- int x1 = render->x1;
- int run_x0, run_x1;
- ArtRenderMaskRun *run = render->run;
-
- if (n_steps > 0)
- {
- run_x1 = steps[0].x;
- if (run_x1 > x0 && running_sum > 0x80ff)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- n_run++;
- }
-
- for (i = 0; i < n_steps - 1; i++)
- {
- running_sum += steps[i].delta;
- run_x0 = run_x1;
- run_x1 = steps[i + 1].x;
- if (run_x1 > run_x0)
- {
- run[n_run].x = run_x0;
- run[n_run].alpha = running_sum;
- n_run++;
- }
- }
- if (x1 > run_x1)
- {
- running_sum += steps[n_steps - 1].delta;
- run[n_run].x = run_x1;
- run[n_run].alpha = running_sum;
- n_run++;
- }
- if (running_sum > 0x80ff)
- {
- run[n_run].x = x1;
- run[n_run].alpha = 0x8000;
- n_run++;
- }
- }
- else if ((running_sum >> 16) > 0)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- run[1].x = x1;
- run[1].alpha = running_sum;
- n_run = 2;
- }
-
- render->n_run = n_run;
-
- art_render_invoke_callbacks (render, z->dest_ptr, y);
-
- z->dest_ptr += render->rowstride;
-}
-
-static void
-art_render_svp_callback_span (void *callback_data, int y,
- int start, ArtSVPRenderAAStep *steps, int n_steps)
-{
- ArtMaskSourceSVP *z = (ArtMaskSourceSVP *)callback_data;
- ArtRender *render = z->render;
- int n_run = 0;
- int n_span = 0;
- int i;
- int running_sum = start;
- int x0 = render->x0;
- int x1 = render->x1;
- int run_x0, run_x1;
- ArtRenderMaskRun *run = render->run;
- int *span_x = render->span_x;
-
- if (n_steps > 0)
- {
- run_x1 = steps[0].x;
- if (run_x1 > x0 && running_sum > 0x80ff)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- n_run++;
- span_x[0] = x0;
- n_span++;
- }
-
- for (i = 0; i < n_steps - 1; i++)
- {
- running_sum += steps[i].delta;
- run_x0 = run_x1;
- run_x1 = steps[i + 1].x;
- if (run_x1 > run_x0)
- {
- run[n_run].x = run_x0;
- run[n_run].alpha = running_sum;
- n_run++;
- if ((n_span & 1) != (running_sum > 0x80ff))
- span_x[n_span++] = run_x0;
- }
- }
- if (x1 > run_x1)
- {
- running_sum += steps[n_steps - 1].delta;
- run[n_run].x = run_x1;
- run[n_run].alpha = running_sum;
- n_run++;
- if ((n_span & 1) != (running_sum > 0x80ff))
- span_x[n_span++] = run_x1;
- }
- if (running_sum > 0x80ff)
- {
- run[n_run].x = x1;
- run[n_run].alpha = 0x8000;
- n_run++;
- span_x[n_span++] = x1;
- }
- }
- else if ((running_sum >> 16) > 0)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- run[1].x = x1;
- run[1].alpha = running_sum;
- n_run = 2;
- span_x[0] = x0;
- span_x[1] = x1;
- n_span = 2;
- }
-
- render->n_run = n_run;
- render->n_span = n_span;
-
- art_render_invoke_callbacks (render, z->dest_ptr, y);
-
- z->dest_ptr += render->rowstride;
-}
-
-static void
-art_render_svp_callback_opacity (void *callback_data, int y,
- int start, ArtSVPRenderAAStep *steps, int n_steps)
-{
- ArtMaskSourceSVP *z = (ArtMaskSourceSVP *)callback_data;
- ArtRender *render = z->render;
- int n_run = 0;
- int i;
- art_u32 running_sum;
- int x0 = render->x0;
- int x1 = render->x1;
- int run_x0, run_x1;
- ArtRenderMaskRun *run = render->run;
- art_u32 opacity = render->opacity;
- art_u32 alpha;
-
- running_sum = start - 0x7f80;
-
- if (n_steps > 0)
- {
- run_x1 = steps[0].x;
- alpha = ((running_sum >> 8) * opacity + 0x80080) >> 8;
- if (run_x1 > x0 && alpha > 0x80ff)
- {
- run[0].x = x0;
- run[0].alpha = alpha;
- n_run++;
- }
-
- for (i = 0; i < n_steps - 1; i++)
- {
- running_sum += steps[i].delta;
- run_x0 = run_x1;
- run_x1 = steps[i + 1].x;
- if (run_x1 > run_x0)
- {
- run[n_run].x = run_x0;
- alpha = ((running_sum >> 8) * opacity + 0x80080) >> 8;
- run[n_run].alpha = alpha;
- n_run++;
- }
- }
- if (x1 > run_x1)
- {
- running_sum += steps[n_steps - 1].delta;
- run[n_run].x = run_x1;
- alpha = ((running_sum >> 8) * opacity + 0x80080) >> 8;
- run[n_run].alpha = alpha;
- n_run++;
- }
- if (alpha > 0x80ff)
- {
- run[n_run].x = x1;
- run[n_run].alpha = 0x8000;
- n_run++;
- }
- }
- else if ((running_sum >> 16) > 0)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- run[1].x = x1;
- run[1].alpha = running_sum;
- n_run = 2;
- }
-
- render->n_run = n_run;
-
- art_render_invoke_callbacks (render, z->dest_ptr, y);
-
- z->dest_ptr += render->rowstride;
-}
-
-static void
-art_render_svp_callback_opacity_span (void *callback_data, int y,
- int start, ArtSVPRenderAAStep *steps, int n_steps)
-{
- ArtMaskSourceSVP *z = (ArtMaskSourceSVP *)callback_data;
- ArtRender *render = z->render;
- int n_run = 0;
- int n_span = 0;
- int i;
- art_u32 running_sum;
- int x0 = render->x0;
- int x1 = render->x1;
- int run_x0, run_x1;
- ArtRenderMaskRun *run = render->run;
- int *span_x = render->span_x;
- art_u32 opacity = render->opacity;
- art_u32 alpha;
-
- running_sum = start - 0x7f80;
-
- if (n_steps > 0)
- {
- run_x1 = steps[0].x;
- alpha = ((running_sum >> 8) * opacity + 0x800080) >> 8;
- if (run_x1 > x0 && alpha > 0x80ff)
- {
- run[0].x = x0;
- run[0].alpha = alpha;
- n_run++;
- span_x[0] = x0;
- n_span++;
- }
-
- for (i = 0; i < n_steps - 1; i++)
- {
- running_sum += steps[i].delta;
- run_x0 = run_x1;
- run_x1 = steps[i + 1].x;
- if (run_x1 > run_x0)
- {
- run[n_run].x = run_x0;
- alpha = ((running_sum >> 8) * opacity + 0x800080) >> 8;
- run[n_run].alpha = alpha;
- n_run++;
- if ((n_span & 1) != (alpha > 0x80ff))
- span_x[n_span++] = run_x0;
- }
- }
- if (x1 > run_x1)
- {
- running_sum += steps[n_steps - 1].delta;
- run[n_run].x = run_x1;
- alpha = ((running_sum >> 8) * opacity + 0x800080) >> 8;
- run[n_run].alpha = alpha;
- n_run++;
- if ((n_span & 1) != (alpha > 0x80ff))
- span_x[n_span++] = run_x1;
- }
- if (alpha > 0x80ff)
- {
- run[n_run].x = x1;
- run[n_run].alpha = 0x8000;
- n_run++;
- span_x[n_span++] = x1;
- }
- }
- else if ((running_sum >> 16) > 0)
- {
- run[0].x = x0;
- run[0].alpha = running_sum;
- run[1].x = x1;
- run[1].alpha = running_sum;
- n_run = 2;
- span_x[0] = x0;
- span_x[1] = x1;
- n_span = 2;
- }
-
- render->n_run = n_run;
- render->n_span = n_span;
-
- art_render_invoke_callbacks (render, z->dest_ptr, y);
-
- z->dest_ptr += render->rowstride;
-}
-
-static void
-art_render_svp_invoke_driver (ArtMaskSource *self, ArtRender *render)
-{
- ArtMaskSourceSVP *z = (ArtMaskSourceSVP *)self;
- void (*callback) (void *callback_data,
- int y,
- int start,
- ArtSVPRenderAAStep *steps, int n_steps);
-
- z->dest_ptr = render->pixels;
- if (render->opacity == 0x10000)
- {
- if (render->need_span)
- callback = art_render_svp_callback_span;
- else
- callback = art_render_svp_callback;
- }
- else
- {
- if (render->need_span)
- callback = art_render_svp_callback_opacity_span;
- else
- callback = art_render_svp_callback_opacity;
- }
-
- art_svp_render_aa (z->svp,
- render->x0, render->y0,
- render->x1, render->y1, callback,
- self);
- art_render_svp_done (&self->super, render);
-}
-
-G_GNUC_NORETURN static void
-art_render_svp_prepare (ArtMaskSource *self, ArtRender *render,
- art_boolean first)
-{
- /* todo */
- art_die ("art_render_svp non-driver mode not yet implemented.\n");
-}
-
-/**
- * art_render_svp: Use an SVP as a render mask source.
- * @render: Render object.
- * @svp: SVP.
- *
- * Adds @svp to the render object as a mask. Note: @svp must remain
- * allocated until art_render_invoke() is called on @render.
- **/
-void
-art_render_svp (ArtRender *render, const ArtSVP *svp)
-{
- ArtMaskSourceSVP *mask_source;
- mask_source = art_new (ArtMaskSourceSVP, 1);
-
- mask_source->super.super.render = NULL;
- mask_source->super.super.done = art_render_svp_done;
- mask_source->super.can_drive = art_render_svp_can_drive;
- mask_source->super.invoke_driver = art_render_svp_invoke_driver;
- mask_source->super.prepare = art_render_svp_prepare;
- mask_source->render = render;
- mask_source->svp = svp;
-
- art_render_add_mask_source (render, &mask_source->super);
-}