4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Copyright © 2004 Eric Anholt
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Permission to use, copy, modify, distribute, and sell this software and its
4c221b0da1816acf2ca302b10092df059484468dvboxsync * documentation for any purpose is hereby granted without fee, provided that
4c221b0da1816acf2ca302b10092df059484468dvboxsync * the above copyright notice appear in all copies and that both that
4c221b0da1816acf2ca302b10092df059484468dvboxsync * copyright notice and this permission notice appear in supporting
4c221b0da1816acf2ca302b10092df059484468dvboxsync * documentation, and that the name of Eric Anholt not be used in
4c221b0da1816acf2ca302b10092df059484468dvboxsync * advertising or publicity pertaining to distribution of the software without
4c221b0da1816acf2ca302b10092df059484468dvboxsync * specific, written prior permission. Eric Anholt makes no
4c221b0da1816acf2ca302b10092df059484468dvboxsync * representations about the suitability of this software for any purpose. It
4c221b0da1816acf2ca302b10092df059484468dvboxsync * is provided "as is" without express or implied warranty.
4c221b0da1816acf2ca302b10092df059484468dvboxsync *
4c221b0da1816acf2ca302b10092df059484468dvboxsync * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
4c221b0da1816acf2ca302b10092df059484468dvboxsync * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
4c221b0da1816acf2ca302b10092df059484468dvboxsync * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
4c221b0da1816acf2ca302b10092df059484468dvboxsync * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
4c221b0da1816acf2ca302b10092df059484468dvboxsync * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
4c221b0da1816acf2ca302b10092df059484468dvboxsync * PERFORMANCE OF THIS SOFTWARE.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#ifdef HAVE_DIX_CONFIG_H
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include <dix-config.h>
4c221b0da1816acf2ca302b10092df059484468dvboxsync#endif
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include "gcstruct.h"
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include "picturestr.h"
4c221b0da1816acf2ca302b10092df059484468dvboxsync#include "privates.h"
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * One of these structures is allocated per GC that gets used with a window with
4c221b0da1816acf2ca302b10092df059484468dvboxsync * backing pixmap.
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsynctypedef struct {
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCPtr pBackingGC; /* Copy of the GC but with graphicsExposures
4c221b0da1816acf2ca302b10092df059484468dvboxsync * set FALSE and the clientClip set to
4c221b0da1816acf2ca302b10092df059484468dvboxsync * clip output to the valid regions of the
4c221b0da1816acf2ca302b10092df059484468dvboxsync * backing pixmap. */
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned long serialNumber; /* clientClip computed time */
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned long stateChanges; /* changes in parent gc since last copy */
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCOps *wrapOps; /* wrapped ops */
4c221b0da1816acf2ca302b10092df059484468dvboxsync GCFuncs *wrapFuncs; /* wrapped funcs */
4c221b0da1816acf2ca302b10092df059484468dvboxsync} cwGCRec, *cwGCPtr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT DevPrivateKeyRec cwGCKeyRec;
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwGCKey (&cwGCKeyRec)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define getCwGC(pGC) ((cwGCPtr)dixLookupPrivate(&(pGC)->devPrivates, cwGCKey))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define setCwGC(pGC,p) dixSetPrivate(&(pGC)->devPrivates, cwGCKey, p)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * One of these structures is allocated per Picture that gets used with a
4c221b0da1816acf2ca302b10092df059484468dvboxsync * window with a backing pixmap
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsynctypedef struct {
4c221b0da1816acf2ca302b10092df059484468dvboxsync PicturePtr pBackingPicture;
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned long serialNumber;
4c221b0da1816acf2ca302b10092df059484468dvboxsync unsigned long stateChanges;
4c221b0da1816acf2ca302b10092df059484468dvboxsync} cwPictureRec, *cwPicturePtr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT DevPrivateKeyRec cwPictureKeyRec;
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwPictureKey (&cwPictureKeyRec)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define getCwPicture(pPicture) (pPicture->pDrawable ? \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (cwPicturePtr)dixLookupPrivate(&(pPicture)->devPrivates, cwPictureKey) : 0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define setCwPicture(pPicture,p) dixSetPrivate(&(pPicture)->devPrivates, cwPictureKey, p)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT DevPrivateKeyRec cwWindowKeyRec;
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwWindowKey (&cwWindowKeyRec)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwWindowPrivate(pWin) dixLookupPrivate(&(pWin)->devPrivates, cwWindowKey)
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define getCwPixmap(pWindow) ((PixmapPtr) cwWindowPrivate(pWindow))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define setCwPixmap(pWindow,pPixmap) \
4c221b0da1816acf2ca302b10092df059484468dvboxsync dixSetPrivate(&(pWindow)->devPrivates, cwWindowKey, pPixmap)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwDrawableIsRedirWindow(pDraw) \
4c221b0da1816acf2ca302b10092df059484468dvboxsync ((pDraw)->type == DRAWABLE_WINDOW && \
4c221b0da1816acf2ca302b10092df059484468dvboxsync getCwPixmap((WindowPtr) (pDraw)) != NULL)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsynctypedef struct {
4c221b0da1816acf2ca302b10092df059484468dvboxsync /*
4c221b0da1816acf2ca302b10092df059484468dvboxsync * screen func wrappers
4c221b0da1816acf2ca302b10092df059484468dvboxsync */
4c221b0da1816acf2ca302b10092df059484468dvboxsync CloseScreenProcPtr CloseScreen;
4c221b0da1816acf2ca302b10092df059484468dvboxsync GetImageProcPtr GetImage;
4c221b0da1816acf2ca302b10092df059484468dvboxsync GetSpansProcPtr GetSpans;
4c221b0da1816acf2ca302b10092df059484468dvboxsync CreateGCProcPtr CreateGC;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync CopyWindowProcPtr CopyWindow;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync GetWindowPixmapProcPtr GetWindowPixmap;
4c221b0da1816acf2ca302b10092df059484468dvboxsync SetWindowPixmapProcPtr SetWindowPixmap;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync DestroyPictureProcPtr DestroyPicture;
4c221b0da1816acf2ca302b10092df059484468dvboxsync ChangePictureClipProcPtr ChangePictureClip;
4c221b0da1816acf2ca302b10092df059484468dvboxsync DestroyPictureClipProcPtr DestroyPictureClip;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync ChangePictureProcPtr ChangePicture;
4c221b0da1816acf2ca302b10092df059484468dvboxsync ValidatePictureProcPtr ValidatePicture;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync CompositeProcPtr Composite;
4c221b0da1816acf2ca302b10092df059484468dvboxsync CompositeRectsProcPtr CompositeRects;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync TrapezoidsProcPtr Trapezoids;
4c221b0da1816acf2ca302b10092df059484468dvboxsync TrianglesProcPtr Triangles;
4c221b0da1816acf2ca302b10092df059484468dvboxsync TriStripProcPtr TriStrip;
4c221b0da1816acf2ca302b10092df059484468dvboxsync TriFanProcPtr TriFan;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync RasterizeTrapezoidProcPtr RasterizeTrapezoid;
4c221b0da1816acf2ca302b10092df059484468dvboxsync} cwScreenRec, *cwScreenPtr;
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT DevPrivateKeyRec cwScreenKeyRec;
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define cwScreenKey (&cwScreenKeyRec)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define getCwScreen(pScreen) ((cwScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, cwScreenKey))
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define setCwScreen(pScreen,p) dixSetPrivate(&(pScreen)->devPrivates, cwScreenKey, p)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define CW_OFFSET_XYPOINTS(ppt, npt) do { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync DDXPointPtr _ppt = (DDXPointPtr)(ppt); \
4c221b0da1816acf2ca302b10092df059484468dvboxsync int _i; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (_i = 0; _i < npt; _i++) { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync _ppt[_i].x += dst_off_x; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync _ppt[_i].y += dst_off_y; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync } \
4c221b0da1816acf2ca302b10092df059484468dvboxsync} while (0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define CW_OFFSET_RECTS(prect, nrect) do { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync int _i; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (_i = 0; _i < nrect; _i++) { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (prect)[_i].x += dst_off_x; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (prect)[_i].y += dst_off_y; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync } \
4c221b0da1816acf2ca302b10092df059484468dvboxsync} while (0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define CW_OFFSET_ARCS(parc, narc) do { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync int _i; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync for (_i = 0; _i < narc; _i++) { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (parc)[_i].x += dst_off_x; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (parc)[_i].y += dst_off_y; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync } \
4c221b0da1816acf2ca302b10092df059484468dvboxsync} while (0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define CW_OFFSET_XY_DST(x, y) do { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (x) = (x) + dst_off_x; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (y) = (y) + dst_off_y; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync} while (0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync#define CW_OFFSET_XY_SRC(x, y) do { \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (x) = (x) + src_off_x; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync (y) = (y) + src_off_y; \
4c221b0da1816acf2ca302b10092df059484468dvboxsync} while (0)
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/* cw.c */
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT DrawablePtr
4c221b0da1816acf2ca302b10092df059484468dvboxsynccwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/* cw_render.c */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT void
4c221b0da1816acf2ca302b10092df059484468dvboxsynccwInitializeRender (ScreenPtr pScreen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT void
4c221b0da1816acf2ca302b10092df059484468dvboxsynccwFiniRender (ScreenPtr pScreen);
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsync/* cw.c */
4c221b0da1816acf2ca302b10092df059484468dvboxsync
4c221b0da1816acf2ca302b10092df059484468dvboxsyncextern _X_EXPORT void
4c221b0da1816acf2ca302b10092df059484468dvboxsyncmiInitializeCompositeWrapper(ScreenPtr pScreen);