/*
 *
 * Copyright © 2000 SuSE, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of SuSE not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  SuSE makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Author:  Keith Packard, SuSE, Inc.
 */

#ifndef _XRENDER_H_
#define _XRENDER_H_

#include <X11/Xlib.h>
#include <X11/Xfuncproto.h>
#include <X11/Xosdefs.h>
#include <X11/Xutil.h>

#include <X11/extensions/render.h>

typedef struct {
    short   red;
    short   redMask;
    short   green;
    short   greenMask;
    short   blue;
    short   blueMask;
    short   alpha;
    short   alphaMask;
} XRenderDirectFormat;

typedef struct {
    PictFormat      id;
    int         type;
    int         depth;
    XRenderDirectFormat direct;
    Colormap        colormap;
} XRenderPictFormat;

#define PictFormatID        (1 << 0)
#define PictFormatType      (1 << 1)
#define PictFormatDepth     (1 << 2)
#define PictFormatRed       (1 << 3)
#define PictFormatRedMask   (1 << 4)
#define PictFormatGreen     (1 << 5)
#define PictFormatGreenMask (1 << 6)
#define PictFormatBlue      (1 << 7)
#define PictFormatBlueMask  (1 << 8)
#define PictFormatAlpha     (1 << 9)
#define PictFormatAlphaMask (1 << 10)
#define PictFormatColormap  (1 << 11)

typedef struct _XRenderPictureAttributes {
    int         repeat;
    Picture     alpha_map;
    int         alpha_x_origin;
    int         alpha_y_origin;
    int         clip_x_origin;
    int         clip_y_origin;
    Pixmap      clip_mask;
    Bool        graphics_exposures;
    int         subwindow_mode;
    int         poly_edge;
    int         poly_mode;
    Atom        dither;
    Bool        component_alpha;
} XRenderPictureAttributes;

typedef struct {
    unsigned short   red;
    unsigned short   green;
    unsigned short   blue;
    unsigned short   alpha;
} XRenderColor;

typedef struct _XGlyphInfo {
    unsigned short  width;
    unsigned short  height;
    short       x;
    short       y;
    short       xOff;
    short       yOff;
} XGlyphInfo;

typedef struct _XGlyphElt8 {
    GlyphSet            glyphset;
    _Xconst char        *chars;
    int             nchars;
    int             xOff;
    int             yOff;
} XGlyphElt8;

typedef struct _XGlyphElt16 {
    GlyphSet            glyphset;
    _Xconst unsigned short  *chars;
    int             nchars;
    int             xOff;
    int             yOff;
} XGlyphElt16;

typedef struct _XGlyphElt32 {
    GlyphSet            glyphset;
    _Xconst unsigned int    *chars;
    int             nchars;
    int             xOff;
    int             yOff;
} XGlyphElt32;

typedef double  XDouble;

typedef struct _XPointDouble {
    XDouble  x, y;
} XPointDouble;

#define XDoubleToFixed(f)    ((XFixed) ((f) * 65536))
#define XFixedToDouble(f)    (((XDouble) (f)) / 65536)

typedef int XFixed;

typedef struct _XPointFixed {
    XFixed  x, y;
} XPointFixed;

typedef struct _XLineFixed {
    XPointFixed p1, p2;
} XLineFixed;

typedef struct _XTriangle {
    XPointFixed p1, p2, p3;
} XTriangle;

typedef struct _XCircle {
    XFixed x;
    XFixed y;
    XFixed radius;
} XCircle;

typedef struct _XTrapezoid {
    XFixed  top, bottom;
    XLineFixed  left, right;
} XTrapezoid;

typedef struct _XTransform {
    XFixed  matrix[3][3];
} XTransform;

typedef struct _XFilters {
    int     nfilter;
    char    **filter;
    int     nalias;
    short   *alias;
} XFilters;

typedef struct _XIndexValue {
    unsigned long    pixel;
    unsigned short   red, green, blue, alpha;
} XIndexValue;

typedef struct _XAnimCursor {
    Cursor      cursor;
    unsigned long   delay;
} XAnimCursor;

typedef struct _XSpanFix {
    XFixed      left, right, y;
} XSpanFix;

typedef struct _XTrap {
    XSpanFix        top, bottom;
} XTrap;

typedef struct _XLinearGradient {
    XPointFixed p1;
    XPointFixed p2;
} XLinearGradient;

typedef struct _XRadialGradient {
    XCircle inner;
    XCircle outer;
} XRadialGradient;

typedef struct _XConicalGradient {
    XPointFixed center;
    XFixed angle; /* in degrees */
} XConicalGradient;

_XFUNCPROTOBEGIN

Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep);

Status XRenderQueryVersion (Display *dpy,
                int     *major_versionp,
                int     *minor_versionp);

Status XRenderQueryFormats (Display *dpy);

int XRenderQuerySubpixelOrder (Display *dpy, int screen);

Bool XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel);

XRenderPictFormat *
XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual);

XRenderPictFormat *
XRenderFindFormat (Display          *dpy,
           unsigned long        mask,
           _Xconst XRenderPictFormat    *templ,
           int              count);

#define PictStandardARGB32  0
#define PictStandardRGB24   1
#define PictStandardA8      2
#define PictStandardA4      3
#define PictStandardA1      4
#define PictStandardNUM     5

XRenderPictFormat *
XRenderFindStandardFormat (Display      *dpy,
               int          format);

XIndexValue *
XRenderQueryPictIndexValues(Display         *dpy,
                _Xconst XRenderPictFormat   *format,
                int             *num);

Picture
XRenderCreatePicture (Display               *dpy,
              Drawable              drawable,
              _Xconst XRenderPictFormat     *format,
              unsigned long         valuemask,
              _Xconst XRenderPictureAttributes  *attributes);

void
XRenderChangePicture (Display               *dpy,
              Picture               picture,
              unsigned long         valuemask,
              _Xconst XRenderPictureAttributes  *attributes);

void
XRenderSetPictureClipRectangles (Display        *dpy,
                 Picture        picture,
                 int            xOrigin,
                 int            yOrigin,
                 _Xconst XRectangle *rects,
                 int            n);

void
XRenderSetPictureClipRegion (Display        *dpy,
                 Picture        picture,
                 Region     r);

void
XRenderSetPictureTransform (Display     *dpy,
                Picture     picture,
                XTransform      *transform);

void
XRenderFreePicture (Display                   *dpy,
            Picture                   picture);

void
XRenderComposite (Display   *dpy,
          int       op,
          Picture   src,
          Picture   mask,
          Picture   dst,
          int       src_x,
          int       src_y,
          int       mask_x,
          int       mask_y,
          int       dst_x,
          int       dst_y,
          unsigned int  width,
          unsigned int  height);

GlyphSet
XRenderCreateGlyphSet (Display *dpy, _Xconst XRenderPictFormat *format);

GlyphSet
XRenderReferenceGlyphSet (Display *dpy, GlyphSet existing);

void
XRenderFreeGlyphSet (Display *dpy, GlyphSet glyphset);

void
XRenderAddGlyphs (Display       *dpy,
          GlyphSet      glyphset,
          _Xconst Glyph     *gids,
          _Xconst XGlyphInfo    *glyphs,
          int           nglyphs,
          _Xconst char      *images,
          int           nbyte_images);

void
XRenderFreeGlyphs (Display      *dpy,
           GlyphSet     glyphset,
           _Xconst Glyph    *gids,
           int          nglyphs);

void
XRenderCompositeString8 (Display            *dpy,
             int                op,
             Picture            src,
             Picture            dst,
             _Xconst XRenderPictFormat  *maskFormat,
             GlyphSet           glyphset,
             int                xSrc,
             int                ySrc,
             int                xDst,
             int                yDst,
             _Xconst char           *string,
             int                nchar);

void
XRenderCompositeString16 (Display           *dpy,
              int               op,
              Picture           src,
              Picture           dst,
              _Xconst XRenderPictFormat *maskFormat,
              GlyphSet          glyphset,
              int               xSrc,
              int               ySrc,
              int               xDst,
              int               yDst,
              _Xconst unsigned short    *string,
              int               nchar);

void
XRenderCompositeString32 (Display           *dpy,
              int               op,
              Picture           src,
              Picture           dst,
              _Xconst XRenderPictFormat *maskFormat,
              GlyphSet          glyphset,
              int               xSrc,
              int               ySrc,
              int               xDst,
              int               yDst,
              _Xconst unsigned int      *string,
              int               nchar);

void
XRenderCompositeText8 (Display              *dpy,
               int              op,
               Picture              src,
               Picture              dst,
               _Xconst XRenderPictFormat    *maskFormat,
               int              xSrc,
               int              ySrc,
               int              xDst,
               int              yDst,
               _Xconst XGlyphElt8       *elts,
               int              nelt);

void
XRenderCompositeText16 (Display             *dpy,
            int             op,
            Picture             src,
            Picture             dst,
            _Xconst XRenderPictFormat   *maskFormat,
            int             xSrc,
            int             ySrc,
            int             xDst,
            int             yDst,
            _Xconst XGlyphElt16     *elts,
            int             nelt);

void
XRenderCompositeText32 (Display             *dpy,
            int             op,
            Picture             src,
            Picture             dst,
            _Xconst XRenderPictFormat   *maskFormat,
            int             xSrc,
            int             ySrc,
            int             xDst,
            int             yDst,
            _Xconst XGlyphElt32     *elts,
            int             nelt);

void
XRenderFillRectangle (Display           *dpy,
              int           op,
              Picture           dst,
              _Xconst XRenderColor  *color,
              int           x,
              int           y,
              unsigned int      width,
              unsigned int      height);

void
XRenderFillRectangles (Display          *dpy,
               int          op,
               Picture          dst,
               _Xconst XRenderColor *color,
               _Xconst XRectangle   *rectangles,
               int          n_rects);

void
XRenderCompositeTrapezoids (Display     *dpy,
                int         op,
                Picture     src,
                Picture     dst,
                _Xconst XRenderPictFormat   *maskFormat,
                int         xSrc,
                int         ySrc,
                _Xconst XTrapezoid  *traps,
                int         ntrap);

void
XRenderCompositeTriangles (Display      *dpy,
               int          op,
               Picture      src,
               Picture      dst,
                _Xconst XRenderPictFormat   *maskFormat,
               int          xSrc,
               int          ySrc,
               _Xconst XTriangle    *triangles,
               int          ntriangle);

void
XRenderCompositeTriStrip (Display       *dpy,
              int           op,
              Picture       src,
              Picture       dst,
                _Xconst XRenderPictFormat   *maskFormat,
              int           xSrc,
              int           ySrc,
              _Xconst XPointFixed   *points,
              int           npoint);

void
XRenderCompositeTriFan (Display         *dpy,
            int         op,
            Picture         src,
            Picture         dst,
            _Xconst XRenderPictFormat   *maskFormat,
            int         xSrc,
            int         ySrc,
            _Xconst XPointFixed *points,
            int         npoint);

void
XRenderCompositeDoublePoly (Display         *dpy,
                int             op,
                Picture         src,
                Picture         dst,
                _Xconst XRenderPictFormat   *maskFormat,
                int             xSrc,
                int             ySrc,
                int             xDst,
                int             yDst,
                _Xconst XPointDouble    *fpoints,
                int             npoints,
                int             winding);
Status
XRenderParseColor(Display   *dpy,
          char      *spec,
          XRenderColor  *def);

Cursor
XRenderCreateCursor (Display        *dpy,
             Picture        source,
             unsigned int   x,
             unsigned int   y);

XFilters *
XRenderQueryFilters (Display *dpy, Drawable drawable);

void
XRenderSetPictureFilter (Display    *dpy,
             Picture    picture,
             const char *filter,
             XFixed     *params,
             int        nparams);

Cursor
XRenderCreateAnimCursor (Display    *dpy,
             int        ncursor,
             XAnimCursor    *cursors);


void
XRenderAddTraps (Display        *dpy,
         Picture        picture,
         int            xOff,
         int            yOff,
         _Xconst XTrap      *traps,
         int            ntrap);

Picture XRenderCreateSolidFill (Display *dpy,
                                const XRenderColor *color);

Picture XRenderCreateLinearGradient (Display *dpy,
                                     const XLinearGradient *gradient,
                                     const XFixed *stops,
                                     const XRenderColor *colors,
                                     int nstops);

Picture XRenderCreateRadialGradient (Display *dpy,
                                     const XRadialGradient *gradient,
                                     const XFixed *stops,
                                     const XRenderColor *colors,
                                     int nstops);

Picture XRenderCreateConicalGradient (Display *dpy,
                                      const XConicalGradient *gradient,
                                      const XFixed *stops,
                                      const XRenderColor *colors,
                                      int nstops);

_XFUNCPROTOEND

#endif /* _XRENDER_H_ */
