miline.h revision b9a21c3c91c47e090316e28d759194e46628ed49
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/*
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringCopyright 1994, 1998 The Open Group
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringPermission to use, copy, modify, distribute, and sell this software and its
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringdocumentation for any purpose is hereby granted without fee, provided that
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringthe above copyright notice appear in all copies and that both that
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringcopyright notice and this permission notice appear in supporting
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringdocumentation.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringThe above copyright notice and this permission notice shall be included in
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringall copies or substantial portions of the Software.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart PoetteringExcept as contained in this notice, the name of The Open Group shall not be
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringused in advertising or otherwise to promote the sale, use or other dealings
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poetteringin this Software without prior written authorization from The Open Group.
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering*/
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#ifndef MILINE_H
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#include "screenint.h"
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#include "privates.h"
d15d0333be6a1ca7fdd99a1881d967b6be8f387aZbigniew Jędrzejewski-Szmek
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering/*
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * Public definitions used for configuring basic pixelization aspects
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * of the sample implementation line-drawing routines provided in
e48fdd84432bbf9c2ecc339183258c7c33116032Lennart Poettering * {mfb,mi,cfb*} at run-time.
059cb3858acd038ff2cef10a3a99119bf71a8fc6Lennart Poettering */
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define XDECREASING 4
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define YDECREASING 2
e48fdd84432bbf9c2ecc339183258c7c33116032Lennart Poettering#define YMAJOR 1
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering#define OCTANT1 (1 << (YDECREASING))
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering#define OCTANT2 (1 << (YDECREASING|YMAJOR))
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering#define OCTANT3 (1 << (XDECREASING|YDECREASING|YMAJOR))
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger#define OCTANT4 (1 << (XDECREASING|YDECREASING))
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger#define OCTANT5 (1 << (XDECREASING))
9f103625b145a397e67c3714766775b615c8b587Tobias Hunger#define OCTANT6 (1 << (XDECREASING|YMAJOR))
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define OCTANT7 (1 << (YMAJOR))
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek#define OCTANT8 (1 << (0))
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek#define XMAJOROCTANTS (OCTANT1 | OCTANT4 | OCTANT5 | OCTANT8)
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek#define DEFAULTZEROLINEBIAS (OCTANT2 | OCTANT3 | OCTANT4 | OCTANT5)
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek/*
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer * Devices can configure the rendering of routines in mi, mfb, and cfb*
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * by specifying a thin line bias to be applied to a particular screen
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek * using the following function. The bias parameter is an OR'ing of
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * the appropriate OCTANT constants defined above to indicate which
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * octants to bias a line to prefer an axial step when the Bresenham
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * error term is exactly zero. The octants are mapped as follows:
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering *
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering * \ | /
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering * \ 3 | 2 /
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering * \ | /
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering * 4 \ | / 1
00b4ffdecbb39d849af65c0ab741be482325a4a9Lennart Poettering * \|/
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering * -----------
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering * /|\
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering * 5 / | \ 8
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering * / | \
689aede8c622ba68d9060e4edee27364445b2007Lennart Poettering * / 6 | 7 \
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek * / | \
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek *
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek * For more information, see "Ambiguities in Incremental Line Rastering,"
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek * Jack E. Bresenham, IEEE CG&A, May 1987.
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek */
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmekextern _X_EXPORT void miSetZeroLineBias(
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek ScreenPtr /* pScreen */,
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek unsigned int /* bias */
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek);
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek
4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56cZbigniew Jędrzejewski-Szmek/*
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering * Private definitions needed for drawing thin (zero width) lines
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek * Used by the mi, mfb, and all cfb* components.
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek */
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
b7def684941808600c344f0be7a2b9fcdda97e0fLennart Poettering#define X_AXIS 0
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek#define Y_AXIS 1
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define OUT_LEFT 0x08
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define OUT_RIGHT 0x04
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define OUT_ABOVE 0x02
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen#define OUT_BELOW 0x01
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen
67ab5f761f9b854d8ce85f9ee47b298e497f8bd9Tom Gundersen#define OUTCODES(_result, _x, _y, _pbox) \
56f64d95763a799ba4475daf44d8e9f72a1bd474Michal Schmidt if ( (_x) < (_pbox)->x1) (_result) |= OUT_LEFT; \
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek else if ( (_x) >= (_pbox)->x2) (_result) |= OUT_RIGHT; \
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering if ( (_y) < (_pbox)->y1) (_result) |= OUT_ABOVE; \
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering else if ( (_y) >= (_pbox)->y2) (_result) |= OUT_BELOW;
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
64347fc2b983f33e7efb0fd2bb44e133fb9f30f4Tom Gundersen#define MIOUTCODES(outcode, x, y, xmin, ymin, xmax, ymax) \
64347fc2b983f33e7efb0fd2bb44e133fb9f30f4Tom Gundersen{\
c3834f9b881f2b1a68dc7d797c134f0b66b47b57Lennart Poettering if (x < xmin) outcode |= OUT_LEFT;\
c3834f9b881f2b1a68dc7d797c134f0b66b47b57Lennart Poettering if (x > xmax) outcode |= OUT_RIGHT;\
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering if (y < ymin) outcode |= OUT_ABOVE;\
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering if (y > ymax) outcode |= OUT_BELOW;\
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering}
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
47cb901e38cd7092576fc8e76cc4a14f39bf719dLennart Poettering#define SWAPINT(i, j) \
47cb901e38cd7092576fc8e76cc4a14f39bf719dLennart Poettering{ int _t = i; i = j; j = _t; }
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56cZbigniew Jędrzejewski-Szmek#define SWAPPT(i, j) \
4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56cZbigniew Jędrzejewski-Szmek{ DDXPointRec _t; _t = i; i = j; j = _t; }
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek#define SWAPINT_PAIR(x1, y1, x2, y2)\
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering{ int t = x1; x1 = x2; x2 = t;\
47cb901e38cd7092576fc8e76cc4a14f39bf719dLennart Poettering t = y1; y1 = y2; y2 = t;\
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt}
23bbb0de4e3f85d9704a5c12a5afa2dfa0159e41Michal Schmidt
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define miGetZeroLineBias(_pScreen) ((unsigned long) (unsigned long*)\
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek dixLookupPrivate(&(_pScreen)->devPrivates, miZeroLineScreenKey))
e0952d9d021234e79f3a70f33a9e5d201872a417Zbigniew Jędrzejewski-Szmek
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek#define CalcLineDeltas(_x1,_y1,_x2,_y2,_adx,_ady,_sx,_sy,_SX,_SY,_octant) \
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek (_octant) = 0; \
b3208b662948b51ff34e7b7752e28ec7a48708aeZbigniew Jędrzejewski-Szmek (_sx) = (_SX); \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen if (((_adx) = (_x2) - (_x1)) < 0) { \
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek (_adx) = -(_adx); \
5607d856b8606ba75446a07ab5e9048753e1d7a6Zbigniew Jędrzejewski-Szmek (_sx = -(_sx)); \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen (_octant) |= XDECREASING; \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen } \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen (_sy) = (_SY); \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen if (((_ady) = (_y2) - (_y1)) < 0) { \
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt (_ady) = -(_ady); \
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt (_sy = -(_sy)); \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen (_octant) |= YDECREASING; \
4e82fe5213bedcb70e25c0270e516d5f2706d8c8Tom Gundersen }
d0aa9ce51915f6f7448adfeb4be0f46cc1356124Zbigniew Jędrzejewski-Szmek
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define SetYMajorOctant(_octant) ((_octant) |= YMAJOR)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define FIXUP_ERROR(_e, _octant, _bias) \
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering (_e) -= (((_bias) >> (_octant)) & 1)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering
b9f111b93f9f442f00266f338b14f25ca8685352Zbigniew Jędrzejewski-Szmek#define IsXMajorOctant(_octant) (!((_octant) & YMAJOR))
b9f111b93f9f442f00266f338b14f25ca8685352Zbigniew Jędrzejewski-Szmek#define IsYMajorOctant(_octant) ((_octant) & YMAJOR)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define IsXDecreasingOctant(_octant) ((_octant) & XDECREASING)
6b1dc2bd3cdb3bd932b0692be636ddd2879edb92Lennart Poettering#define IsYDecreasingOctant(_octant) ((_octant) & YDECREASING)
3d22d1ab57bf44c92e4d9ca95d9728105dd3fb0dTom Gundersen
3d22d1ab57bf44c92e4d9ca95d9728105dd3fb0dTom Gundersenextern _X_EXPORT DevPrivateKey miZeroLineScreenKey;
3d22d1ab57bf44c92e4d9ca95d9728105dd3fb0dTom Gundersen
b9f111b93f9f442f00266f338b14f25ca8685352Zbigniew Jędrzejewski-Szmekextern _X_EXPORT int miZeroClipLine(
b9f111b93f9f442f00266f338b14f25ca8685352Zbigniew Jędrzejewski-Szmek int /*xmin*/,
3d22d1ab57bf44c92e4d9ca95d9728105dd3fb0dTom Gundersen int /*ymin*/,
3d22d1ab57bf44c92e4d9ca95d9728105dd3fb0dTom Gundersen int /*xmax*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int /*ymax*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int * /*new_x1*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int * /*new_y1*/,
6db615c17ee7a434f9e0c40d67a1f833d8f3cc9dLennart Poettering int * /*new_x2*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int * /*new_y2*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering unsigned int /*adx*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering unsigned int /*ady*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int * /*pt1_clipped*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int * /*pt2_clipped*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering int /*octant*/,
e8d2f6cde0af86eece9118718ad0a8a19e1cffecLennart Poettering unsigned int /*bias*/,
e48fdd84432bbf9c2ecc339183258c7c33116032Lennart Poettering int /*oc1*/,
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer int /*oc2*/
1dc2ced4646a78b3dee9e3ea44130f938d6425bcZbigniew Jędrzejewski-Szmek);
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek
2968644080fd103062f070e83edd620e0a58c44dZbigniew Jędrzejewski-Szmek#endif /* MILINE_H */
7fd1b19bc9e9f5574f2877936b8ac267c7706947Harald Hoyer