renderedge.h revision b8e299dddd091ae24e0c08c45d91b8f937bd14d2
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/*
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * $Id: renderedge.h,v 1.3 2005/07/03 07:02:08 daniels Exp $
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync *
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * Copyright © 2004 Keith Packard
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync *
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * Permission to use, copy, modify, distribute, and sell this software and its
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * documentation for any purpose is hereby granted without fee, provided that
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * the above copyright notice appear in all copies and that both that
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * copyright notice and this permission notice appear in supporting
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * documentation, and that the name of Keith Packard not be used in
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * advertising or publicity pertaining to distribution of the software without
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * specific, written prior permission. Keith Packard makes no
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * representations about the suitability of this software for any purpose. It
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * is provided "as is" without express or implied warranty.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync *
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * PERFORMANCE OF THIS SOFTWARE.
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync */
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#ifndef _RENDEREDGE_H_
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define _RENDEREDGE_H_
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#include "picturestr.h"
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define MAX_ALPHA(n) ((1 << (n)) - 1)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define N_Y_FRAC(n) ((n) == 1 ? 1 : (1 << ((n)/2)) - 1)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define N_X_FRAC(n) ((1 << ((n)/2)) + 1)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define STEP_Y_SMALL(n) (xFixed1 / N_Y_FRAC(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define STEP_Y_BIG(n) (xFixed1 - (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define Y_FRAC_FIRST(n) (STEP_Y_SMALL(n) / 2)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define Y_FRAC_LAST(n) (Y_FRAC_FIRST(n) + (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define STEP_X_SMALL(n) (xFixed1 / N_X_FRAC(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define STEP_X_BIG(n) (xFixed1 - (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define X_FRAC_FIRST(n) (STEP_X_SMALL(n) / 2)
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define X_FRAC_LAST(n) (X_FRAC_FIRST(n) + (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define RenderSamplesX(x,n) ((n) == 1 ? 0 : (xFixedFrac (x) + X_FRAC_FIRST(n)) / STEP_X_SMALL(n))
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/*
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * An edge structure. This represents a single polygon edge
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * and can be quickly stepped across small or large gaps in the
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * sample grid
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync */
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsynctypedef struct {
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed x;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed e;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed stepx;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed signdx;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed dy;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed dx;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed stepx_small;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed stepx_big;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed dx_small;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed dx_big;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync} RenderEdge;
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/*
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * Step across a small sample grid gap
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync */
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define RenderEdgeStepSmall(edge) { \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->x += edge->stepx_small; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->e += edge->dx_small; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (edge->e > 0) \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync { \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->e -= edge->dy; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->x += edge->signdx; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync}
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync/*
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync * Step across a large sample grid gap
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync */
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#define RenderEdgeStepBig(edge) { \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->x += edge->stepx_big; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->e += edge->dx_big; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync if (edge->e > 0) \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync { \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->e -= edge->dy; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync edge->x += edge->signdx; \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync } \
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync}
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncxFixed
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncRenderSampleCeilY (xFixed y, int bpp);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncxFixed
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncRenderSampleFloorY (xFixed y, int bpp);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncvoid
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncRenderEdgeStep (RenderEdge *e, int n);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncvoid
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncRenderEdgeInit (RenderEdge *e,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync int bpp,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed y_start,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed x_top,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed y_top,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed x_bot,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed y_bot);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncvoid
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsyncRenderLineFixedEdgeInit (RenderEdge *e,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync int bpp,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xFixed y,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync xLineFixed *line,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync int x_off,
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync int y_off);
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync
b8e299dddd091ae24e0c08c45d91b8f937bd14d2vboxsync#endif /* _RENDEREDGE_H_ */