f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/*
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncCopyright 1994, 1998 The Open Group
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncPermission to use, copy, modify, distribute, and sell this software and its
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncdocumentation for any purpose is hereby granted without fee, provided that
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncthe above copyright notice appear in all copies and that both that
f78b12e570284aa8291f4ca1add24937fd107403vboxsynccopyright notice and this permission notice appear in supporting
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncdocumentation.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncThe above copyright notice and this permission notice shall be included in
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncall copies or substantial portions of the Software.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncExcept as contained in this notice, the name of The Open Group shall not be
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncused in advertising or otherwise to promote the sale, use or other dealings
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncin this Software without prior written authorization from The Open Group.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync*/
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#ifndef MILINE_H
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#include "screenint.h"
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#include "privates.h"
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/*
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Public definitions used for configuring basic pixelization aspects
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * of the sample implementation line-drawing routines provided in
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * {mfb,mi,cfb*} at run-time.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define XDECREASING 4
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define YDECREASING 2
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define YMAJOR 1
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT1 (1 << (YDECREASING))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT2 (1 << (YDECREASING|YMAJOR))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT3 (1 << (XDECREASING|YDECREASING|YMAJOR))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT4 (1 << (XDECREASING|YDECREASING))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT5 (1 << (XDECREASING))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT6 (1 << (XDECREASING|YMAJOR))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT7 (1 << (YMAJOR))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OCTANT8 (1 << (0))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define XMAJOROCTANTS (OCTANT1 | OCTANT4 | OCTANT5 | OCTANT8)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define DEFAULTZEROLINEBIAS (OCTANT2 | OCTANT3 | OCTANT4 | OCTANT5)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/*
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Devices can configure the rendering of routines in mi, mfb, and cfb*
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * by specifying a thin line bias to be applied to a particular screen
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * using the following function. The bias parameter is an OR'ing of
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * the appropriate OCTANT constants defined above to indicate which
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * octants to bias a line to prefer an axial step when the Bresenham
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * error term is exactly zero. The octants are mapped as follows:
f78b12e570284aa8291f4ca1add24937fd107403vboxsync *
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * \ | /
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * \ 3 | 2 /
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * \ | /
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * 4 \ | / 1
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * \|/
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * -----------
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * /|\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * 5 / | \ 8
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * / | \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * / 6 | 7 \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * / | \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync *
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * For more information, see "Ambiguities in Incremental Line Rastering,"
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Jack E. Bresenham, IEEE CG&A, May 1987.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncextern _X_EXPORT void miSetZeroLineBias(
f78b12e570284aa8291f4ca1add24937fd107403vboxsync ScreenPtr /* pScreen */,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync unsigned int /* bias */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync);
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync/*
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Private definitions needed for drawing thin (zero width) lines
f78b12e570284aa8291f4ca1add24937fd107403vboxsync * Used by the mi, mfb, and all cfb* components.
f78b12e570284aa8291f4ca1add24937fd107403vboxsync */
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define X_AXIS 0
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define Y_AXIS 1
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OUT_LEFT 0x08
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OUT_RIGHT 0x04
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OUT_ABOVE 0x02
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OUT_BELOW 0x01
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define OUTCODES(_result, _x, _y, _pbox) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if ( (_x) < (_pbox)->x1) (_result) |= OUT_LEFT; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync else if ( (_x) >= (_pbox)->x2) (_result) |= OUT_RIGHT; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if ( (_y) < (_pbox)->y1) (_result) |= OUT_ABOVE; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync else if ( (_y) >= (_pbox)->y2) (_result) |= OUT_BELOW;
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define MIOUTCODES(outcode, x, y, xmin, ymin, xmax, ymax) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync{\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (x < xmin) outcode |= OUT_LEFT;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (x > xmax) outcode |= OUT_RIGHT;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (y < ymin) outcode |= OUT_ABOVE;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (y > ymax) outcode |= OUT_BELOW;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync}
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define SWAPINT(i, j) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync{ int _t = i; i = j; j = _t; }
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define SWAPPT(i, j) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync{ DDXPointRec _t; _t = i; i = j; j = _t; }
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define SWAPINT_PAIR(x1, y1, x2, y2)\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync{ int t = x1; x1 = x2; x2 = t;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync t = y1; y1 = y2; y2 = t;\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync}
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define miGetZeroLineBias(_pScreen) ((unsigned long) (unsigned long*)\
f78b12e570284aa8291f4ca1add24937fd107403vboxsync dixLookupPrivate(&(_pScreen)->devPrivates, miZeroLineScreenKey))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define CalcLineDeltas(_x1,_y1,_x2,_y2,_adx,_ady,_sx,_sy,_SX,_SY,_octant) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_octant) = 0; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_sx) = (_SX); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (((_adx) = (_x2) - (_x1)) < 0) { \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_adx) = -(_adx); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_sx = -(_sx)); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_octant) |= XDECREASING; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync } \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_sy) = (_SY); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync if (((_ady) = (_y2) - (_y1)) < 0) { \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_ady) = -(_ady); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_sy = -(_sy)); \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_octant) |= YDECREASING; \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync }
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define SetYMajorOctant(_octant) ((_octant) |= YMAJOR)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define FIXUP_ERROR(_e, _octant, _bias) \
f78b12e570284aa8291f4ca1add24937fd107403vboxsync (_e) -= (((_bias) >> (_octant)) & 1)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define IsXMajorOctant(_octant) (!((_octant) & YMAJOR))
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define IsYMajorOctant(_octant) ((_octant) & YMAJOR)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define IsXDecreasingOctant(_octant) ((_octant) & XDECREASING)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define IsYDecreasingOctant(_octant) ((_octant) & YDECREASING)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncextern _X_EXPORT DevPrivateKeyRec miZeroLineScreenKeyRec;
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#define miZeroLineScreenKey (&miZeroLineScreenKeyRec)
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsyncextern _X_EXPORT int miZeroClipLine(
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*xmin*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*ymin*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*xmax*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*ymax*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*new_x1*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*new_y1*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*new_x2*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*new_y2*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync unsigned int /*adx*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync unsigned int /*ady*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*pt1_clipped*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int * /*pt2_clipped*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*octant*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync unsigned int /*bias*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*oc1*/,
f78b12e570284aa8291f4ca1add24937fd107403vboxsync int /*oc2*/
f78b12e570284aa8291f4ca1add24937fd107403vboxsync);
f78b12e570284aa8291f4ca1add24937fd107403vboxsync
f78b12e570284aa8291f4ca1add24937fd107403vboxsync#endif /* MILINE_H */