
/**************************************************************************

Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sub license, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice (including the
next paragraph) shall be included in all copies or substantial portions
of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

**************************************************************************/

/*
 * Authors:
 *   Kevin E. Martin <kevin@precisioninsight.com>
 *
 * When we're building the XMesa driver for use in the X server (as the
 * indirect render) we include this file when building the xm_*.c files.
 * We need to define some types and macros differently when building
 * in the Xserver vs. stand-alone Mesa.
 */

#ifndef _XMESA_XF86_H_
#define _XMESA_XF86_H_

#include "GL/glxtokens.h"
#include "scrnintstr.h"
#include "pixmapstr.h"
#include "gcstruct.h"
#include "servermd.h"


typedef struct _XMesaImageRec {
    int width, height;
    char *data;
    int bytes_per_line; /* Padded to 32 bits */
    int bits_per_pixel;
} XMesaImage;

typedef ScreenRec   XMesaDisplay;
typedef PixmapPtr   XMesaPixmap;
typedef ColormapPtr XMesaColormap;
typedef DrawablePtr XMesaDrawable;
typedef WindowPtr   XMesaWindow;
typedef GCPtr       XMesaGC;
typedef VisualPtr   XMesaVisualInfo;
typedef DDXPointRec XMesaPoint;
typedef xColorItem  XMesaColor;

#define XMesaSetGeneric(__d,__gc,__val,__mask) \
do { \
    CARD32 __v[1]; \
    (void) __d; \
    __v[0] = __val; \
    dixChangeGC(NullClient, __gc, __mask, __v, NULL); \
} while (0)

#define XMesaSetGenericPtr(__d,__gc,__pval,__mask) \
do { \
    ChangeGCVal __v[1]; \
    (void) __d; \
    __v[0].ptr = __pval; \
    dixChangeGC(NullClient, __gc, __mask, NULL, __v); \
} while (0)

#define XMesaSetForeground(d,gc,v) XMesaSetGeneric(d,gc,v,GCForeground)
#define XMesaSetBackground(d,gc,v) XMesaSetGeneric(d,gc,v,GCBackground)
#define XMesaSetPlaneMask(d,gc,v)  XMesaSetGeneric(d,gc,v,GCPlaneMask)
#define XMesaSetFunction(d,gc,v)   XMesaSetGeneric(d,gc,v,GCFunction)
#define XMesaSetFillStyle(d,gc,v)  XMesaSetGeneric(d,gc,v,GCFillStyle)

#define XMesaSetTile(d,gc,v)       XMesaSetGenericPtr(d,gc,v,GCTile)

#define XMesaDrawPoint(__d,__b,__gc,__x,__y) \
do { \
    XMesaPoint __p[1]; \
    (void) __d; \
    __p[0].x = __x; \
    __p[0].y = __y; \
    ValidateGC(__b, __gc); \
    (*gc->ops->PolyPoint)(__b, __gc, CoordModeOrigin, 1, __p); \
} while (0)

#define XMesaDrawPoints(__d,__b,__gc,__p,__n,__m) \
do { \
    (void) __d; \
    ValidateGC(__b, __gc); \
    (*gc->ops->PolyPoint)(__b, __gc, __m, __n, __p); \
} while (0)

#define XMesaDrawLine(__d, __b, __gc, __x0, __y0, __x1, __y1) \
do { \
    XMesaPoint __p[2]; \
    (void) __d; \
    __p[0].x = __x0; \
    __p[0].y = __y0; \
    __p[1].x = __x1; \
    __p[1].y = __y1; \
    ValidateGC(__b, __gc); \
    (*gc->ops->PolyLines)(__b, __gc, CoordModeOrigin, 2, __p); \
} while (0)

#define XMesaFillRectangle(__d,__b,__gc,__x,__y,__w,__h) \
do { \
    xRectangle __r[1]; \
    (void) __d; \
    ValidateGC((DrawablePtr)__b, __gc); \
    __r[0].x = __x; \
    __r[0].y = __y; \
    __r[0].width = __w; \
    __r[0].height = __h; \
    (*__gc->ops->PolyFillRect)((DrawablePtr)__b, __gc, 1, __r); \
} while (0)

static _X_INLINE XMesaImage *XMesaGetImage(XMesaDisplay *dpy, PixmapPtr p, int x,
					int y, unsigned int width,
					unsigned int height,
					unsigned long plane_mask, int format)
{
    XMesaImage *img = Xcalloc(sizeof(*img));

    img->width = p->drawable.width;
    img->height = p->drawable.height;
    img->bits_per_pixel = p->drawable.bitsPerPixel;
    img->bytes_per_line = PixmapBytePad(width, p->drawable.depth);
    img->data = malloc(height * img->bytes_per_line);

    /* Assumes: Images are always in ZPixmap format */
    (*p->drawable.pScreen->GetImage)(&p->drawable, x, y, width, height,
				     plane_mask, ZPixmap, img->data);

    return img;
}

#define XMesaPutImage(__d,__b,__gc,__i,__sx,__sy,__x,__y,__w,__h) \
do { \
    /* Assumes: Images are always in ZPixmap format */ \
    (void) __d; \
    ASSERT(!__sx && !__sy); /* The SubImage case */     \
    ValidateGC(__b, __gc); \
    (*__gc->ops->PutImage)(__b, __gc, ((XMesaDrawable)(__b))->depth, \
			   __x, __y, __w, __h, 0, ZPixmap, \
			   ((XMesaImage *)(__i))->data); \
} while (0)

#define XMesaCopyArea(__d,__sb,__db,__gc,__sx,__sy,__w,__h,__x,__y) \
do { \
    (void) __d; \
    ValidateGC(__db, __gc); \
    (*__gc->ops->CopyArea)((DrawablePtr)__sb, __db, __gc, \
			   __sx, __sy, __w, __h, __x, __y); \
} while (0)


/* CreatePixmap returns a PixmapPtr; so, it cannot be inside braces */
#ifdef CREATE_PIXMAP_USAGE_SCRATCH
#define XMesaCreatePixmap(__d,__b,__w,__h,__depth) \
  (*__d->CreatePixmap)(__d, __w, __h, __depth, 0)
#else
#define XMesaCreatePixmap(__d,__b,__w,__h,__depth) \
    (*__d->CreatePixmap)(__d, __w, __h, __depth)
#endif

#define XMesaFreePixmap(__d,__b) \
    (*__d->DestroyPixmap)(__b)

#define XMesaFreeGC(__d,__gc) \
do { \
    (void) __d; \
    FreeScratchGC(__gc); \
} while (0)

#define GET_COLORMAP_SIZE(__v)  __v->ColormapEntries
#define GET_REDMASK(__v)        __v->mesa_visual.redMask
#define GET_GREENMASK(__v)      __v->mesa_visual.greenMask
#define GET_BLUEMASK(__v)       __v->mesa_visual.blueMask
#define GET_VISUAL_DEPTH(__v)   __v->nplanes
#define GET_BLACK_PIXEL(__v)    __v->display->blackPixel
#define CHECK_BYTE_ORDER(__v)   GL_TRUE
#define CHECK_FOR_HPCR(__v)     GL_FALSE

#endif
