
#ifndef _XAA_H
#define _XAA_H

#define XAA_VERSION_MAJOR   1
#define XAA_VERSION_MINOR   2
#define XAA_VERSION_RELEASE 1

/*

   ******** OPERATION SPECIFIC FLAGS *********

   **** solid/dashed line flags ****
 
---------               --------
23           LINE_PATTERN_LSBFIRST_MSBJUSTIFIED
22           LINE_PATTERN_LSBFIRST_LSBJUSTIFIED
21           LINE_PATTERN_MSBFIRST_MSBJUSTIFIED
20           LINE_PATTERN_MSBFIRST_LSBJUSTIFIED
19           LINE_PATTERN_POWER_OF_2_ONLY
18           LINE_LIMIT_COORDS
17                         .
16                         .
---------               -------

   **** screen to screen copy flags ****

---------               --------
23           ONLY_LEFT_TO_RIGHT_BITBLT
22           ONLY_TWO_BITBLT_DIRECTIONS
21                         .
20                         .
19                         .
18                         .
17                         .
16                         .
---------               -------

   ****  clipping flags ****

---------               --------
23                         .
22           HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND
21           HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY
20           HARDWARE_CLIP_MONO_8x8_FILL
19           HARDWARE_CLIP_COLOR_8x8_FILL    
18           HARDWARE_CLIP_SOLID_FILL
17           HARDWARE_CLIP_DASHED_LINE
16           HARDWARE_CLIP_SOLID_LINE
---------               -------


   ****  hardware pattern flags ****

---------               --------
23                         .
22                         .
21           HARDWARE_PATTERN_SCREEN_ORIGIN
20                         .
19                         .
18                         .
17           HARDWARE_PATTERN_PROGRAMMED_ORIGIN
16           HARDWARE_PATTERN_PROGRAMMED_BITS
---------               -------

   ****  write pixmap flags ****

---------               --------
23                         .
22                         .
21                         .
20                         .
19                         .
18                         .
17                         .
16           CONVERT_32BPP_TO_24BPP
---------               -------


   ******** GENERIC FLAGS *********

---------               -------
15           SYNC_AFTER_COLOR_EXPAND
14           CPU_TRANSFER_PAD_QWORD
13                         .
12           LEFT_EDGE_CLIPPING_NEGATIVE_X
11	     LEFT_EDGE_CLIPPING
10	     CPU_TRANSFER_BASE_FIXED
 9           BIT_ORDER_IN_BYTE_MSBFIRST           
 8           TRANSPARENCY_GXCOPY_ONLY
---------               -------
 7           NO_TRANSPARENCY
 6           TRANSPARENCY_ONLY
 5           ROP_NEEDS_SOURCE
 4           TRIPLE_BITS_24BPP
 3           RGB_EQUAL
 2           NO_PLANEMASK
 1           NO_GXCOPY
 0           GXCOPY_ONLY
---------               -------


*/

#include "gcstruct.h"
#include "pixmapstr.h"
#include "xf86str.h"
#include "regionstr.h"
#include "xf86fbman.h"

#include "picturestr.h"

/* Flags */
#define PIXMAP_CACHE			0x00000001
#define MICROSOFT_ZERO_LINE_BIAS	0x00000002
#define OFFSCREEN_PIXMAPS		0x00000004
#define LINEAR_FRAMEBUFFER		0x00000008


/* GC fg, bg, and planemask restrictions */
#define GXCOPY_ONLY			0x00000001
#define NO_GXCOPY			0x00000002
#define NO_PLANEMASK			0x00000004
#define RGB_EQUAL			0x00000008
#define TRIPLE_BITS_24BPP		0x00000010
#define ROP_NEEDS_SOURCE		0x00000020

/* transparency restrictions */
#define TRANSPARENCY_ONLY		0x00000040
#define NO_TRANSPARENCY			0x00000080
#define TRANSPARENCY_GXCOPY_ONLY     	0x00000100

/* bit order restrictions */
#define BIT_ORDER_IN_BYTE_MSBFIRST	0x00000200
#define BIT_ORDER_IN_BYTE_LSBFIRST	0x00000000

/* transfer base restriction */
#define CPU_TRANSFER_BASE_FIXED		0x00000400

/* skipleft restrictions */
#define LEFT_EDGE_CLIPPING		0x00000800
#define LEFT_EDGE_CLIPPING_NEGATIVE_X	0x00001000

/* data padding */
#define CPU_TRANSFER_PAD_DWORD		0x00000000
#define CPU_TRANSFER_PAD_QWORD		0x00004000
#define SCANLINE_PAD_DWORD		0x00000000

#define SYNC_AFTER_COLOR_EXPAND		0x00008000
#define SYNC_AFTER_IMAGE_WRITE		SYNC_AFTER_COLOR_EXPAND

/* hardware pattern */
#define HARDWARE_PATTERN_PROGRAMMED_BITS	0x00010000
#define HARDWARE_PATTERN_PROGRAMMED_ORIGIN	0x00020000
#define HARDWARE_PATTERN_SCREEN_ORIGIN		0x00200000

/* copyarea flags */
#define ONLY_TWO_BITBLT_DIRECTIONS	0x00400000
#define ONLY_LEFT_TO_RIGHT_BITBLT	0x00800000

/* line flags */
#define LINE_PATTERN_LSBFIRST_MSBJUSTIFIED	0x00800000
#define LINE_PATTERN_LSBFIRST_LSBJUSTIFIED	0x00400000
#define LINE_PATTERN_MSBFIRST_MSBJUSTIFIED	0x00200000
#define LINE_PATTERN_MSBFIRST_LSBJUSTIFIED	0x00100000
#define LINE_PATTERN_POWER_OF_2_ONLY		0x00080000
#define LINE_LIMIT_COORDS			0x00040000

/* clipping flags */
#define HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND	0x00400000
#define HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY		0x00200000
#define HARDWARE_CLIP_MONO_8x8_FILL			0x00100000
#define HARDWARE_CLIP_COLOR_8x8_FILL			0x00080000
#define HARDWARE_CLIP_SOLID_FILL			0x00040000
#define HARDWARE_CLIP_DASHED_LINE			0x00020000
#define HARDWARE_CLIP_SOLID_LINE			0x00010000

#define HARDWARE_CLIP_LINE				0x00000000


/* image write flags */
#define CONVERT_32BPP_TO_24BPP			0x00010000

/* pixmap cache flags */
#define CACHE_MONO_8x8			0x00000001
#define CACHE_COLOR_8x8			0x00000002
#define DO_NOT_BLIT_STIPPLES		0x00000004
#define DO_NOT_TILE_MONO_DATA		0x00000008	
#define DO_NOT_TILE_COLOR_DATA		0x00000010


#define DEGREES_0	0
#define DEGREES_90	1
#define DEGREES_180	2
#define DEGREES_270	3

#define OMIT_LAST	1

/* render flags */

#define XAA_RENDER_POWER_OF_2_TILE_ONLY	0x00000008
#define XAA_RENDER_NO_SRC_ALPHA		0x00000004
#define XAA_RENDER_IMPRECISE_ONLY	0x00000002	
#define XAA_RENDER_NO_TILE		0x00000001		

#define XAA_RENDER_REPEAT		0x00000001

typedef void (* ValidateGCProcPtr)(
   GCPtr         pGC,
   unsigned long changes,
   DrawablePtr   pDraw
);

typedef struct {
    unsigned char *bits;
    int width;
    int height;
    int yoff;
    int srcwidth;
    int start;
    int end;
} NonTEGlyphInfo, *NonTEGlyphPtr;


typedef struct {
   int x;
   int y;
   int w;
   int h;
   int orig_w;
   int orig_h;
   unsigned long serialNumber;
   int pat0;
   int pat1;
   int fg;
   int bg;
   int trans_color;
   DDXPointPtr offsets;
   DevUnion devPrivate;
} XAACacheInfoRec, *XAACacheInfoPtr;


typedef struct _PixmapLink {
  PixmapPtr pPix;
  struct _PixmapLink *next;
  FBAreaPtr area;
} PixmapLink, *PixmapLinkPtr;

typedef struct _XAAInfoRec {
   ScrnInfoPtr pScrn;
   int Flags;

   void (*Sync)(
	ScrnInfoPtr pScrn
   );
   
   /* Restore Accel State is a driver callback that is used
    * when another screen on the same device has been active.
    * This allows multihead on a single device to work.
    * If The entityProp has IS_SHARED_ACCEL defined then this
    * function is required.
    */
   
   void (*RestoreAccelState)(
	ScrnInfoPtr pScrn
   );

   /***************** Low Level *****************/

/* Blits */
   void (*SetupForScreenToScreenCopy)(
	ScrnInfoPtr pScrn,
	int xdir, int ydir,
	int rop,
	unsigned int planemask,
	int trans_color
   );
   int ScreenToScreenCopyFlags;

   void (*SubsequentScreenToScreenCopy)(
	ScrnInfoPtr pScrn,
	int xsrc, int ysrc,
	int xdst, int ydst,
	int w, int h
   );

   
/* Solid fills */
   void (*SetupForSolidFill)(
	ScrnInfoPtr pScrn,
	int color,
	int rop,
	unsigned int planemask
   );    
   int SolidFillFlags;  

   void (*SubsequentSolidFillRect)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h
   );    

   void (*SubsequentSolidFillTrap)(
	ScrnInfoPtr pScrn,
	int y, int h, 
	int left, int dxL, int dyL, int eL,
	int right, int dxR, int dyR, int eR
   );


/* Solid lines */

   void (*SetupForSolidLine)(
	ScrnInfoPtr pScrn,
	int color,
	int rop,
	unsigned int planemask
   );    
   int SolidLineFlags;  

   void (*SubsequentSolidTwoPointLine)(
	ScrnInfoPtr pScrn,
	int xa, int ya, int xb, int yb, int flags
   );   

   void (*SubsequentSolidBresenhamLine)(
	ScrnInfoPtr pScrn,
	int x, int y, int absmaj, int absmin, int err, int len, int octant
   );   
   int SolidBresenhamLineErrorTermBits;

   void (*SubsequentSolidHorVertLine)(
	ScrnInfoPtr pScrn,
	int x, int y, int len, int dir
   );   

/* Dashed lines */

   void (*SetupForDashedLine)(
	ScrnInfoPtr pScrn,
	int fg, int bg,
	int rop,
	unsigned int planemask,
	int length,
	unsigned char *pattern
   );    
   int DashedLineFlags; 
   int DashPatternMaxLength; 

   void (*SubsequentDashedTwoPointLine)(
	ScrnInfoPtr pScrn,
	int xa, int ya, int xb, int yb, int flags, int phase
   );   

   void (*SubsequentDashedBresenhamLine)(
	ScrnInfoPtr pScrn,
	int x, int y, int absmaj, int absmin, int err, int len, int flags,
	int phase
   );   
   int DashedBresenhamLineErrorTermBits;

/* Clipper */

   void (*SetClippingRectangle) (
	ScrnInfoPtr pScrn,
	int left, int top, int right, int bottom
   );
   int ClippingFlags;

   void (*DisableClipping)(ScrnInfoPtr pScrn);

/* 8x8 mono pattern fills */
   void (*SetupForMono8x8PatternFill)(
	ScrnInfoPtr pScrn,
	int patx, int paty,
	int fg, int bg,
	int rop,
	unsigned int planemask
   );
   int Mono8x8PatternFillFlags; 

   void (*SubsequentMono8x8PatternFillRect)(
	ScrnInfoPtr pScrn,
	int patx, int paty,
	int x, int y, int w, int h
   );

   void (*SubsequentMono8x8PatternFillTrap)(
	ScrnInfoPtr pScrn,
        int patx, int paty,
	int y, int h, 
	int left, int dxL, int dyL, int eL,
	int right, int dxR, int dyR, int eR
   );

/* 8x8 color pattern fills */

   void (*SetupForColor8x8PatternFill)(
	ScrnInfoPtr pScrn,
	int patx, int paty,
	int rop,
	unsigned int planemask,
	int transparency_color
   );
   int Color8x8PatternFillFlags; 

   void (*SubsequentColor8x8PatternFillRect)(
	ScrnInfoPtr pScrn,
	int patx, int paty,
	int x, int y, int w, int h
   );

   void (*SubsequentColor8x8PatternFillTrap)(
	ScrnInfoPtr pScrn,
        int patx, int paty,
	int y, int h, 
	int left, int dxL, int dyL, int eL,
	int right, int dxR, int dyR, int eR
   );


/* Color expansion */

   void (*SetupForCPUToScreenColorExpandFill)(
	ScrnInfoPtr pScrn,
	int fg, int bg,
	int rop,
	unsigned int planemask
   );     
   int CPUToScreenColorExpandFillFlags;  

   void (*SubsequentCPUToScreenColorExpandFill)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	int skipleft
   );

   unsigned char *ColorExpandBase;
   int ColorExpandRange;


/* Scanline color expansion  */

   void (*SetupForScanlineCPUToScreenColorExpandFill)(
	ScrnInfoPtr pScrn,
	int fg, int bg,
	int rop,
	unsigned int planemask
   );  
   int ScanlineCPUToScreenColorExpandFillFlags;

   void (*SubsequentScanlineCPUToScreenColorExpandFill)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	int skipleft
   );

   void (*SubsequentColorExpandScanline)(
	ScrnInfoPtr pScrn,
	int bufno
   );

   int NumScanlineColorExpandBuffers;
   unsigned char **ScanlineColorExpandBuffers;

/* Screen to screen color expansion */

   void (*SetupForScreenToScreenColorExpandFill) (
	ScrnInfoPtr pScrn,
	int fg, int bg,
	int rop,
	unsigned int planemask
   );
   int ScreenToScreenColorExpandFillFlags;

   void (*SubsequentScreenToScreenColorExpandFill)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	int srcx, int srcy, int skipleft
   );
   

/*  Image transfers */

   void (*SetupForImageWrite)(
	ScrnInfoPtr pScrn,
	int rop,
	unsigned int planemask,
	int transparency_color,
	int bpp, int depth
   );
   int ImageWriteFlags;

   void (*SubsequentImageWriteRect)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	int skipleft
   );
   unsigned char *ImageWriteBase;
   int ImageWriteRange;
	
/*  Scanline Image transfers */

   void (*SetupForScanlineImageWrite)(
	ScrnInfoPtr pScrn,
	int rop,
	unsigned int planemask,
	int transparency_color,
	int bpp, int depth
   );
   int ScanlineImageWriteFlags;

   void (*SubsequentScanlineImageWriteRect)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	int skipleft
   );

   void (*SubsequentImageWriteScanline) (
	ScrnInfoPtr pScrn,
	int bufno
   );
   
   int NumScanlineImageWriteBuffers;
   unsigned char **ScanlineImageWriteBuffers;

  /* Image Reads - OBSOLETE AND NOT USED */

   void (*SetupForImageRead) (
	ScrnInfoPtr pScrn,
	int bpp, int depth
   );
   int ImageReadFlags;

   unsigned char *ImageReadBase;
   int ImageReadRange;

   void (*SubsequentImageReadRect)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h
   );  


   /***************** Mid Level *****************/
   void (*ScreenToScreenBitBlt)(
	ScrnInfoPtr pScrn,
	int nbox,
	DDXPointPtr pptSrc,
        BoxPtr pbox,
	int xdir, int ydir,
	int alu,
	unsigned int planmask
   );
   int ScreenToScreenBitBltFlags;

   void (*WriteBitmap) (
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	unsigned char *src,
    	int srcwidth,
    	int skipleft,
	int fg, int bg,
	int rop,
	unsigned int planemask
   );
   int WriteBitmapFlags;

   void (*FillSolidRects)(
	ScrnInfoPtr pScrn,
	int fg, int rop,
        unsigned int planemask,
	int nBox,
	BoxPtr pBox 
   );
   int FillSolidRectsFlags;

   void (*FillMono8x8PatternRects)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
        unsigned int planemask,
	int nBox,
	BoxPtr pBox, 
	int pat0, int pat1,
	int xorg, int yorg
   );
   int FillMono8x8PatternRectsFlags;

   void (*FillColor8x8PatternRects)(
	ScrnInfoPtr pScrn,
	int rop,
        unsigned int planemask,
	int nBox,
	BoxPtr pBox,
	int xorg, int yorg,
	XAACacheInfoPtr pCache
   );
   int FillColor8x8PatternRectsFlags;

   void (*FillCacheBltRects)(
	ScrnInfoPtr pScrn,
	int rop,
        unsigned int planemask,
	int nBox,
	BoxPtr pBox,
	int xorg, int yorg,
	XAACacheInfoPtr pCache
   );
   int FillCacheBltRectsFlags;

   void (*FillColorExpandRects)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
        unsigned int planemask,
	int nBox,
	BoxPtr pBox,
	int xorg, int yorg,
	PixmapPtr pPix
   );
   int FillColorExpandRectsFlags;

   void (*FillCacheExpandRects)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
	unsigned int planemask,
	int nBox,
	BoxPtr pBox,
	int xorg, int yorg,
	PixmapPtr pPix
   );
   int FillCacheExpandRectsFlags;

   void (*FillImageWriteRects)(
	ScrnInfoPtr pScrn,
	int rop,
	unsigned int planemask,
	int nBox,
	BoxPtr pBox,
	int xorg, int yorg,
	PixmapPtr pPix
   );
   int FillImageWriteRectsFlags;
   

   void (*FillSolidSpans)(
	ScrnInfoPtr pScrn,
	int fg, int rop,
        unsigned int planemask,
	int n,
	DDXPointPtr points,
	int *widths,
	int fSorted 
   );
   int FillSolidSpansFlags;

   void (*FillMono8x8PatternSpans)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
        unsigned int planemask,
	int n,
	DDXPointPtr points,
	int *widths,
	int fSorted, 
	int pat0, int pat1,
	int xorg, int yorg
   );
   int FillMono8x8PatternSpansFlags;

   void (*FillColor8x8PatternSpans)(
	ScrnInfoPtr pScrn,
	int rop,
        unsigned int planemask,
	int n,
	DDXPointPtr points,
	int *widths,
	int fSorted,
	XAACacheInfoPtr pCache,
	int xorg, int yorg
   );
   int FillColor8x8PatternSpansFlags;

   void (*FillCacheBltSpans)(
	ScrnInfoPtr pScrn,
	int rop,
        unsigned int planemask,
	int n,
	DDXPointPtr points,
	int *widths,
	int fSorted,
	XAACacheInfoPtr pCache,
	int xorg, int yorg
   );
   int FillCacheBltSpansFlags;

   void (*FillColorExpandSpans)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
        unsigned int planemask,
	int n,
	DDXPointPtr points,
	int *widths,
	int fSorted,
	int xorg, int yorg,
	PixmapPtr pPix
   );
   int FillColorExpandSpansFlags;

   void (*FillCacheExpandSpans)(
	ScrnInfoPtr pScrn,
	int fg, int bg, int rop,
	unsigned int planemask,
	int n,
	DDXPointPtr ppt,
	int *pwidth,
	int fSorted,
	int xorg, int yorg,
	PixmapPtr pPix
   );
   int FillCacheExpandSpansFlags;

   void (*TEGlyphRenderer)(
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h, int skipleft, int startline, 
	unsigned int **glyphs, int glyphWidth,
	int fg, int bg, int rop, unsigned planemask
   );
   int TEGlyphRendererFlags;

   void (*NonTEGlyphRenderer)(
	ScrnInfoPtr pScrn,
	int x, int y, int n,
	NonTEGlyphPtr glyphs,
	BoxPtr pbox,
	int fg, int rop,
	unsigned int planemask
   );
   int NonTEGlyphRendererFlags;

   void (*WritePixmap) (
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	unsigned char *src,
    	int srcwidth,
	int rop,
	unsigned int planemask,
	int transparency_color,
	int bpp, int depth
   );
   int WritePixmapFlags;

   void (*ReadPixmap) (
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	unsigned char *dst,	
	int dstwidth,
	int bpp, int depth
   );
   int ReadPixmapFlags;

   /***************** GC Level *****************/
   RegionPtr (*CopyArea)(
	DrawablePtr pSrcDrawable,
	DrawablePtr pDstDrawable,
	GC *pGC,
	int srcx, int srcy,
	int width, int height,
	int dstx, int dsty
   );
   int CopyAreaFlags;

   RegionPtr (*CopyPlane)(
	DrawablePtr pSrc,
	DrawablePtr pDst,
	GCPtr pGC,
	int srcx, int srcy,
	int width, int height,
	int dstx, int dsty,
	unsigned long bitPlane
   );
   int CopyPlaneFlags;

   void (*PushPixelsSolid) (
	GCPtr	pGC,
	PixmapPtr pBitMap,
	DrawablePtr pDrawable,
	int dx, int dy, 
	int xOrg, int yOrg
   );
   int PushPixelsFlags; 

   /** PolyFillRect **/

   void (*PolyFillRectSolid)(
	DrawablePtr pDraw,
	GCPtr pGC,
	int nrectFill, 	
	xRectangle *prectInit
   );  
   int PolyFillRectSolidFlags;

   void (*PolyFillRectStippled)(
	DrawablePtr pDraw,
	GCPtr pGC,
	int nrectFill, 	
	xRectangle *prectInit
   );  
   int PolyFillRectStippledFlags;

   void (*PolyFillRectOpaqueStippled)(
	DrawablePtr pDraw,
	GCPtr pGC,
	int nrectFill, 	
	xRectangle *prectInit
   );  
   int PolyFillRectOpaqueStippledFlags;

   void (*PolyFillRectTiled)(
	DrawablePtr pDraw,
	GCPtr pGC,
	int nrectFill, 	
	xRectangle *prectInit
   );  
   int PolyFillRectTiledFlags;

   /** FillSpans **/   

   void (*FillSpansSolid)(
	DrawablePtr	pDraw,
	GCPtr		pGC,
	int		nInit,
	DDXPointPtr 	ppt,
	int		*pwidth,
	int		fSorted 
   );
   int FillSpansSolidFlags;

   void (*FillSpansStippled)(
	DrawablePtr	pDraw,
	GCPtr		pGC,
	int		nInit,
	DDXPointPtr 	ppt,
	int		*pwidth,
	int		fSorted 
   );
   int FillSpansStippledFlags;

   void (*FillSpansOpaqueStippled)(
	DrawablePtr	pDraw,
	GCPtr		pGC,
	int		nInit,
	DDXPointPtr 	ppt,
	int		*pwidth,
	int		fSorted 
   );
   int FillSpansOpaqueStippledFlags;

   void (*FillSpansTiled)(
	DrawablePtr	pDraw,
	GCPtr		pGC,
	int		nInit,
	DDXPointPtr 	ppt,
	int		*pwidth,
	int		fSorted 
   );
   int FillSpansTiledFlags;

   int (*PolyText8TE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	char *chars
   );
   int PolyText8TEFlags;

   int (*PolyText16TE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	unsigned short *chars
   );
   int PolyText16TEFlags;

   void (*ImageText8TE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	char *chars
   );
   int ImageText8TEFlags;

   void (*ImageText16TE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	unsigned short *chars
   );
   int ImageText16TEFlags;

   void (*ImageGlyphBltTE) (
	DrawablePtr pDrawable,
	GCPtr pGC,
	int xInit, int yInit,
	unsigned int nglyph,
	CharInfoPtr *ppci,
	pointer pglyphBase 
   );
   int ImageGlyphBltTEFlags;

   void (*PolyGlyphBltTE) (
	DrawablePtr pDrawable,
	GCPtr pGC,
	int xInit, int yInit,
	unsigned int nglyph,
	CharInfoPtr *ppci,
	pointer pglyphBase 
   );
   int PolyGlyphBltTEFlags;

   int (*PolyText8NonTE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	char *chars
   );
   int PolyText8NonTEFlags;

   int (*PolyText16NonTE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	unsigned short *chars
   );
   int PolyText16NonTEFlags;

   void (*ImageText8NonTE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	char *chars
   );
   int ImageText8NonTEFlags;

   void (*ImageText16NonTE) (
	DrawablePtr pDraw,
	GCPtr pGC,
	int x, int y,
	int count,
	unsigned short *chars
   );
   int ImageText16NonTEFlags;

   void (*ImageGlyphBltNonTE) (
	DrawablePtr pDrawable,
	GCPtr pGC,
	int xInit, int yInit,
	unsigned int nglyph,
	CharInfoPtr *ppci,
	pointer pglyphBase 
   );
   int ImageGlyphBltNonTEFlags;

   void (*PolyGlyphBltNonTE) (
	DrawablePtr pDrawable,
	GCPtr pGC,
	int xInit, int yInit,
	unsigned int nglyph,
	CharInfoPtr *ppci,
	pointer pglyphBase 
   );
   int PolyGlyphBltNonTEFlags;

   void (*PolyRectangleThinSolid)(
	DrawablePtr  pDrawable,
	GCPtr        pGC,    
	int	     nRectsInit,
	xRectangle  *pRectsInit 
   );
   int PolyRectangleThinSolidFlags;

   void (*PolylinesWideSolid)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		mode,
	int 		npt,
	DDXPointPtr pPts
   );
   int PolylinesWideSolidFlags;

   void (*PolylinesThinSolid)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		mode,
	int 		npt,
	DDXPointPtr pPts
   );
   int PolylinesThinSolidFlags;

   void (*PolySegmentThinSolid)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		nseg,
	xSegment	*pSeg
   );
   int PolySegmentThinSolidFlags;

   void (*PolylinesThinDashed)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		mode,
	int 		npt,
	DDXPointPtr pPts
   );
   int PolylinesThinDashedFlags;

   void (*PolySegmentThinDashed)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		nseg,
	xSegment	*pSeg
   );
   int PolySegmentThinDashedFlags;

   void (*FillPolygonSolid)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		shape,
	int		mode,
	int		count,
	DDXPointPtr	ptsIn 
   );
   int FillPolygonSolidFlags;

   void (*FillPolygonStippled)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		shape,
	int		mode,
	int		count,
	DDXPointPtr	ptsIn 
   );
   int FillPolygonStippledFlags;

   void (*FillPolygonOpaqueStippled)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		shape,
	int		mode,
	int		count,
	DDXPointPtr	ptsIn 
   );
   int FillPolygonOpaqueStippledFlags;

   void (*FillPolygonTiled)(
	DrawablePtr	pDrawable,
	GCPtr		pGC,
	int		shape,
	int		mode,
	int		count,
	DDXPointPtr	ptsIn 
   );
   int FillPolygonTiledFlags;

   void (*PolyFillArcSolid)(
	DrawablePtr	pDraw,
	GCPtr		pGC,
	int		narcs,
	xArc		*parcs
   );
   int PolyFillArcSolidFlags;

   void (*PutImage)(
	DrawablePtr pDraw,
	GCPtr       pGC,
	int         depth, 
	int	    x, 
	int         y, 
	int	    w, 
	int	    h,
	int         leftPad,
	int         format,
	char        *pImage
   );
   int PutImageFlags;
   
   /* Validation masks */

   unsigned long FillSpansMask;
   ValidateGCProcPtr ValidateFillSpans;
   unsigned long SetSpansMask;
   ValidateGCProcPtr ValidateSetSpans;
   unsigned long PutImageMask;
   ValidateGCProcPtr ValidatePutImage;
   unsigned long CopyAreaMask;
   ValidateGCProcPtr ValidateCopyArea;
   unsigned long CopyPlaneMask;
   ValidateGCProcPtr ValidateCopyPlane;
   unsigned long PolyPointMask;
   ValidateGCProcPtr ValidatePolyPoint;
   unsigned long PolylinesMask;
   ValidateGCProcPtr ValidatePolylines;
   unsigned long PolySegmentMask;
   ValidateGCProcPtr ValidatePolySegment;
   unsigned long PolyRectangleMask;
   ValidateGCProcPtr ValidatePolyRectangle;
   unsigned long PolyArcMask;
   ValidateGCProcPtr ValidatePolyArc;
   unsigned long FillPolygonMask;
   ValidateGCProcPtr ValidateFillPolygon;
   unsigned long PolyFillRectMask;
   ValidateGCProcPtr ValidatePolyFillRect;
   unsigned long PolyFillArcMask;
   ValidateGCProcPtr ValidatePolyFillArc;
   unsigned long PolyText8Mask;
   ValidateGCProcPtr ValidatePolyText8;
   unsigned long PolyText16Mask;
   ValidateGCProcPtr ValidatePolyText16;
   unsigned long ImageText8Mask;
   ValidateGCProcPtr ValidateImageText8;
   unsigned long ImageText16Mask;
   ValidateGCProcPtr ValidateImageText16;
   unsigned long PolyGlyphBltMask;
   ValidateGCProcPtr ValidatePolyGlyphBlt;
   unsigned long ImageGlyphBltMask;
   ValidateGCProcPtr ValidateImageGlyphBlt;
   unsigned long PushPixelsMask;
   ValidateGCProcPtr ValidatePushPixels;

   void (*ComputeDash)(GCPtr pGC);

   /* Pixmap Cache */

   int  PixmapCacheFlags;
   Bool UsingPixmapCache;
   Bool CanDoMono8x8;
   Bool CanDoColor8x8;

   void (*InitPixmapCache)(
	ScreenPtr pScreen, 
	RegionPtr areas,
	pointer data
   );
   void (*ClosePixmapCache)(
	ScreenPtr pScreen
   );

   int (*StippledFillChooser)(GCPtr pGC);
   int (*OpaqueStippledFillChooser)(GCPtr pGC);
   int (*TiledFillChooser)(GCPtr pGC);

   int  CachePixelGranularity;
   int  MaxCacheableTileWidth;
   int  MaxCacheableTileHeight;
   int  MaxCacheableStippleWidth;
   int  MaxCacheableStippleHeight;

   XAACacheInfoPtr (*CacheTile)(
	ScrnInfoPtr Scrn, PixmapPtr pPix
   );
   XAACacheInfoPtr (*CacheStipple)(
	ScrnInfoPtr Scrn, PixmapPtr pPix, 
	int fg, int bg
   );
   XAACacheInfoPtr (*CacheMonoStipple)(
	ScrnInfoPtr Scrn, PixmapPtr pPix
   );
   XAACacheInfoPtr (*CacheMono8x8Pattern)(
	ScrnInfoPtr Scrn, int pat0, int pat1
   );
   XAACacheInfoPtr (*CacheColor8x8Pattern)(
	ScrnInfoPtr Scrn, PixmapPtr pPix, 
	int fg, int bg
   );


   int MonoPatternPitch;
   int CacheWidthMono8x8Pattern;
   int CacheHeightMono8x8Pattern;

   int ColorPatternPitch;
   int CacheWidthColor8x8Pattern;
   int CacheHeightColor8x8Pattern;

   int CacheColorExpandDensity;

   void (*WriteBitmapToCache) (
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	unsigned char *src,
    	int srcwidth,
	int fg, int bg
   );
   void (*WritePixmapToCache) (
	ScrnInfoPtr pScrn,
	int x, int y, int w, int h,
	unsigned char *src,
    	int srcwidth,
	int bpp, int depth
   );
   void (*WriteMono8x8PatternToCache)(
	ScrnInfoPtr pScrn, 
	XAACacheInfoPtr pCache
   );
   void (*WriteColor8x8PatternToCache)(
	ScrnInfoPtr pScrn, 
	PixmapPtr pPix, 
	XAACacheInfoPtr pCache
   );
   
   char* PixmapCachePrivate;

   /* Miscellaneous */

   GC ScratchGC;
   int PreAllocSize;
   unsigned char *PreAllocMem;

   CharInfoPtr CharInfo[255];
   NonTEGlyphInfo GlyphInfo[255];

   unsigned int FullPlanemask; /* deprecated */

   PixmapLinkPtr OffscreenPixmaps;
   int maxOffPixWidth;
   int maxOffPixHeight;   

   XAACacheInfoRec ScratchCacheInfoRec;

   BoxPtr ClipBox;

   Bool NeedToSync;

   char *dgaSaves;

   /* These can be supplied to override the defaults */

   GetImageProcPtr GetImage;
   GetSpansProcPtr GetSpans;
   CopyWindowProcPtr CopyWindow;

   unsigned int offscreenDepths;
   Bool offscreenDepthsInitialized;

   CARD32 FullPlanemasks[32];

   Bool (*Composite) (
   	CARD8      op,
        PicturePtr pSrc,
        PicturePtr pMask,
        PicturePtr pDst,
        INT16      xSrc,
        INT16      ySrc,
        INT16      xMask,
        INT16      yMask,
        INT16      xDst,
        INT16      yDst,
        CARD16     width,
        CARD16     height
   );

   Bool (*Glyphs) (
        CARD8         op,
        PicturePtr    pSrc,
        PicturePtr    pDst,
        PictFormatPtr maskFormat,
        INT16         xSrc,
        INT16         ySrc,
        int           nlist,
        GlyphListPtr  list,
        GlyphPtr      *glyphs
   );

   /* The old SetupForCPUToScreenAlphaTexture function is no longer used because
    * it doesn't pass in enough information to write a conforming
    * implementation.  See SetupForCPUToScreenAlphaTexture2.
    */
   Bool (*SetupForCPUToScreenAlphaTexture) (
	ScrnInfoPtr	pScrn,
	int		op,
	CARD16		red,
	CARD16		green,
	CARD16		blue,
	CARD16		alpha,
	int		alphaType,
	CARD8		*alphaPtr,
	int		alphaPitch,
	int		width,
	int		height,
	int		flags
   );
   void (*SubsequentCPUToScreenAlphaTexture) (
	ScrnInfoPtr	pScrn,
	int		dstx,
	int		dsty,
	int		srcx,
	int		srcy,
	int		width,
	int		height
   );
   int CPUToScreenAlphaTextureFlags;
   CARD32 * CPUToScreenAlphaTextureFormats;

   /* The old SetupForCPUToScreenTexture function is no longer used because
    * it doesn't pass in enough information to write a conforming
    * implementation.  See SetupForCPUToScreenTexture2.
    */
   Bool (*SetupForCPUToScreenTexture) (
	ScrnInfoPtr	pScrn,
	int		op,
	int		texType,
	CARD8		*texPtr,
	int		texPitch,
	int		width,
	int		height,
	int		flags
   );
   void (*SubsequentCPUToScreenTexture) (
	ScrnInfoPtr	pScrn,
	int		dstx,
	int		dsty,
	int		srcx,
	int		srcy,
	int		width,
	int		height
   );
   int CPUToScreenTextureFlags;
   CARD32 * CPUToScreenTextureFormats;


   /* these were added for 4.3.0 */
   BoxRec SolidLineLimits;
   BoxRec DashedLineLimits;

   /* These were added for X.Org 6.8.0 */
   Bool (*SetupForCPUToScreenAlphaTexture2) (
	ScrnInfoPtr	pScrn,
	int		op,
	CARD16		red,
	CARD16		green,
	CARD16		blue,
	CARD16		alpha,
	CARD32		maskFormat,
	CARD32		dstFormat,
	CARD8		*alphaPtr,
	int		alphaPitch,
	int		width,
	int		height,
	int		flags
   );
   CARD32 *CPUToScreenAlphaTextureDstFormats;

   Bool (*SetupForCPUToScreenTexture2) (
	ScrnInfoPtr	pScrn,
	int		op,
	CARD32		srcFormat,
	CARD32		dstFormat,
	CARD8		*texPtr,
	int		texPitch,
	int		width,
	int		height,
	int		flags
   );
   CARD32 *CPUToScreenTextureDstFormats;
} XAAInfoRec, *XAAInfoRecPtr;

#define SET_SYNC_FLAG(infoRec)	(infoRec)->NeedToSync = TRUE


extern _X_EXPORT Bool
XAAInit(
    ScreenPtr pScreen,
    XAAInfoRecPtr infoRec
);

extern _X_EXPORT XAAInfoRecPtr XAACreateInfoRec(void);

extern _X_EXPORT void
XAADestroyInfoRec(
    XAAInfoRecPtr infoRec
);

typedef void (*DepthChangeFuncPtr) (ScrnInfoPtr pScrn, int depth);

extern _X_EXPORT Bool
XAAInitDualFramebufferOverlay(
   ScreenPtr pScreen, 
   DepthChangeFuncPtr callback
);

#endif /* _XAA_H */
