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