Blame synfig-osx/launcher/dri-surface.c

Carlos Lopez a09598
/* $XFree86: xc/programs/Xserver/GL/dri/dri.c,v 1.34 2001/12/10 19:07:19 dawes Exp $ */
Carlos Lopez a09598
/**************************************************************************
Carlos Lopez a09598
Carlos Lopez a09598
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
Carlos Lopez a09598
Copyright 2000 VA Linux Systems, Inc.
Carlos Lopez a09598
Copyright (c) 2002 Apple Computer, Inc.
Carlos Lopez a09598
All Rights Reserved.
Carlos Lopez a09598
Carlos Lopez a09598
Permission is hereby granted, free of charge, to any person obtaining a
Carlos Lopez a09598
copy of this software and associated documentation files (the
Carlos Lopez a09598
"Software"), to deal in the Software without restriction, including
Carlos Lopez a09598
without limitation the rights to use, copy, modify, merge, publish,
Carlos Lopez a09598
distribute, sub license, and/or sell copies of the Software, and to
Carlos Lopez a09598
permit persons to whom the Software is furnished to do so, subject to
Carlos Lopez a09598
the following conditions:
Carlos Lopez a09598
Carlos Lopez a09598
The above copyright notice and this permission notice (including the
Carlos Lopez a09598
next paragraph) shall be included in all copies or substantial portions
Carlos Lopez a09598
of the Software.
Carlos Lopez a09598
Carlos Lopez a09598
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Carlos Lopez a09598
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Carlos Lopez a09598
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
Carlos Lopez a09598
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
Carlos Lopez a09598
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
Carlos Lopez a09598
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
Carlos Lopez a09598
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Carlos Lopez a09598
Carlos Lopez a09598
**************************************************************************/
Carlos Lopez a09598
Carlos Lopez a09598
/*
Carlos Lopez a09598
 * Authors:
Carlos Lopez a09598
 *   Jens Owen <jens@valinux.com></jens@valinux.com>
Carlos Lopez a09598
 *   Rickard E. (Rik) Faith <faith@valinux.com></faith@valinux.com>
Carlos Lopez a09598
 *
Carlos Lopez a09598
 */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef XFree86LOADER
Carlos Lopez a09598
#include "xf86.h"
Carlos Lopez a09598
#include "xf86_ansic.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#include <sys time.h=""></sys>
Carlos Lopez a09598
#include <unistd.h></unistd.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
#define NEED_REPLIES
Carlos Lopez a09598
#define NEED_EVENTS
Carlos Lopez a09598
#include "X.h"
Carlos Lopez a09598
#include "Xproto.h"
Carlos Lopez a09598
#include "misc.h"
Carlos Lopez a09598
#include "dixstruct.h"
Carlos Lopez a09598
#include "extnsionst.h"
Carlos Lopez a09598
#include "colormapst.h"
Carlos Lopez a09598
#include "cursorstr.h"
Carlos Lopez a09598
#include "scrnintstr.h"
Carlos Lopez a09598
#include "windowstr.h"
Carlos Lopez a09598
#include "servermd.h"
Carlos Lopez a09598
#define _APPLEDRI_SERVER_
Carlos Lopez a09598
#include "appledristr.h"
Carlos Lopez a09598
#include "swaprep.h"
Carlos Lopez a09598
#include "dri-surface.h"
Carlos Lopez a09598
#include "dristruct.h"
Carlos Lopez a09598
#include "mi.h"
Carlos Lopez a09598
#include "mipointer.h"
Carlos Lopez a09598
#include "rootless-common.h"
Carlos Lopez a09598
#include "x-hash.h"
Carlos Lopez a09598
#include "x-hook.h"
Carlos Lopez a09598
Carlos Lopez a09598
#include <availabilitymacros.h></availabilitymacros.h>
Carlos Lopez a09598
Carlos Lopez a09598
static int DRIScreenPrivIndex = -1;
Carlos Lopez a09598
static int DRIWindowPrivIndex = -1;
Carlos Lopez a09598
static int DRIPixmapPrivIndex = -1;
Carlos Lopez a09598
static unsigned long DRIGeneration = 0;
Carlos Lopez a09598
Carlos Lopez a09598
static RESTYPE DRIDrawablePrivResType;
Carlos Lopez a09598
Carlos Lopez a09598
static x_hash_table *surface_hash;	/* maps surface ids -> drawablePrivs */
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIScreenInit(ScreenPtr pScreen)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIScreenPrivPtr    pDRIPriv;
Carlos Lopez a09598
    int                 i;
Carlos Lopez a09598
Carlos Lopez a09598
    if (DRIGeneration != serverGeneration) {
Carlos Lopez a09598
	if ((DRIScreenPrivIndex = AllocateScreenPrivateIndex()) < 0)
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
	DRIGeneration = serverGeneration;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv = (DRIScreenPrivPtr) xcalloc(1, sizeof(DRIScreenPrivRec));
Carlos Lopez a09598
    if (!pDRIPriv) {
Carlos Lopez a09598
        pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
Carlos Lopez a09598
        return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    pScreen->devPrivates[DRIScreenPrivIndex].ptr = (pointer) pDRIPriv;
Carlos Lopez a09598
    pDRIPriv->directRenderingSupport = TRUE;
Carlos Lopez a09598
    pDRIPriv->nrWindows = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    /* Initialize drawable tables */
Carlos Lopez a09598
    for( i=0; i < DRI_MAX_DRAWABLES; i++) {
Carlos Lopez a09598
	pDRIPriv->DRIDrawables[i] = NULL;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIFinishScreenInit(ScreenPtr pScreen)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIScreenPrivPtr  pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    /* Wrap DRI support */
Carlos Lopez a09598
    pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
Carlos Lopez a09598
    pScreen->ValidateTree = DRIValidateTree;
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
Carlos Lopez a09598
    pScreen->PostValidateTree = DRIPostValidateTree;
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
Carlos Lopez a09598
    pScreen->WindowExposures = DRIWindowExposures;
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
Carlos Lopez a09598
    pScreen->CopyWindow = DRICopyWindow;
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
Carlos Lopez a09598
    pScreen->ClipNotify = DRIClipNotify;
Carlos Lopez a09598
Carlos Lopez a09598
    ErrorF("[DRI] screen %d installation complete\n", pScreen->myNum);
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRICloseScreen(ScreenPtr pScreen)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIPriv && pDRIPriv->directRenderingSupport) {
Carlos Lopez a09598
	xfree(pDRIPriv);
Carlos Lopez a09598
	pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIExtensionInit(void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    int		    	i;
Carlos Lopez a09598
    ScreenPtr		pScreen;
Carlos Lopez a09598
Carlos Lopez a09598
    if (DRIScreenPrivIndex < 0) {
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* Allocate a window private index with a zero sized private area for
Carlos Lopez a09598
     * each window, then should a window become a DRI window, we'll hang
Carlos Lopez a09598
     * a DRIWindowPrivateRec off of this private index.
Carlos Lopez a09598
     */
Carlos Lopez a09598
    if ((DRIWindowPrivIndex = AllocateWindowPrivateIndex()) < 0)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
    if ((DRIPixmapPrivIndex = AllocatePixmapPrivateIndex()) < 0)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    DRIDrawablePrivResType = CreateNewResourceType(DRIDrawablePrivDelete);
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < screenInfo.numScreens; i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	pScreen = screenInfo.screens[i];
Carlos Lopez a09598
	if (!AllocateWindowPrivate(pScreen, DRIWindowPrivIndex, 0))
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
	if (!AllocatePixmapPrivate(pScreen, DRIPixmapPrivIndex, 0))
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRIReset(void)
Carlos Lopez a09598
{
Carlos Lopez a09598
    /*
Carlos Lopez a09598
     * This stub routine is called when the X Server recycles, resources
Carlos Lopez a09598
     * allocated by DRIExtensionInit need to be managed here.
Carlos Lopez a09598
     *
Carlos Lopez a09598
     * Currently this routine is a stub because all the interesting resources
Carlos Lopez a09598
     * are managed via the screen init process.
Carlos Lopez a09598
     */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIQueryDirectRenderingCapable(ScreenPtr pScreen, Bool* isCapable)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIPriv)
Carlos Lopez a09598
	*isCapable = pDRIPriv->directRenderingSupport;
Carlos Lopez a09598
    else
Carlos Lopez a09598
	*isCapable = FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIAuthConnection(ScreenPtr pScreen, unsigned int magic)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if 0
Carlos Lopez a09598
    /* FIXME: something? */
Carlos Lopez a09598
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (drmAuthMagic(pDRIPriv->drmFD, magic)) return FALSE;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
static void
Carlos Lopez a09598
DRIUpdateSurface (DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw)
Carlos Lopez a09598
{
Carlos Lopez a09598
    WindowPtr pTopWin;
Carlos Lopez a09598
    xp_window_changes wc;
Carlos Lopez a09598
    unsigned int flags = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv->sid == 0)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
Carlos Lopez a09598
    wc.depth = (pDraw->bitsPerPixel == 32 ? XP_DEPTH_ARGB8888
Carlos Lopez a09598
		: pDraw->bitsPerPixel == 16 ? XP_DEPTH_RGB555 : XP_DEPTH_NIL);
Carlos Lopez a09598
    if (wc.depth != XP_DEPTH_NIL)
Carlos Lopez a09598
	flags |= XP_DEPTH;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW) {
Carlos Lopez a09598
	WindowPtr pWin = (WindowPtr) pDraw;
Carlos Lopez a09598
Carlos Lopez a09598
	DRIStopDrawing (&pWin->drawable, FALSE);
Carlos Lopez a09598
Carlos Lopez a09598
	pTopWin = TopLevelParent (pWin);
Carlos Lopez a09598
Carlos Lopez a09598
	wc.x = pWin->drawable.x - (pTopWin->drawable.x - pTopWin->borderWidth);
Carlos Lopez a09598
	wc.y = pWin->drawable.y - (pTopWin->drawable.y - pTopWin->borderWidth);
Carlos Lopez a09598
	wc.width = pWin->drawable.width;
Carlos Lopez a09598
	wc.height = pWin->drawable.height;
Carlos Lopez a09598
	wc.bit_gravity = XP_GRAVITY_NONE;
Carlos Lopez a09598
Carlos Lopez a09598
	wc.shape_nrects = REGION_NUM_RECTS (&pWin->clipList);
Carlos Lopez a09598
	wc.shape_rects = REGION_RECTS (&pWin->clipList);
Carlos Lopez a09598
	wc.shape_tx = - (pTopWin->drawable.x - pTopWin->borderWidth);
Carlos Lopez a09598
	wc.shape_ty = - (pTopWin->drawable.y - pTopWin->borderWidth);
Carlos Lopez a09598
Carlos Lopez a09598
	flags |= XP_BOUNDS | XP_SHAPE;
Carlos Lopez a09598
Carlos Lopez a09598
	pDRIDrawablePriv->x = pWin->drawable.x - pTopWin->borderWidth;
Carlos Lopez a09598
	pDRIDrawablePriv->y = pWin->drawable.y - pTopWin->borderWidth;
Carlos Lopez a09598
Carlos Lopez a09598
    } else if (pDraw->type == DRAWABLE_PIXMAP) {
Carlos Lopez a09598
	wc.x = 0;
Carlos Lopez a09598
	wc.y = 0;
Carlos Lopez a09598
	wc.width = pDraw->width;
Carlos Lopez a09598
	wc.height = pDraw->height;
Carlos Lopez a09598
	wc.bit_gravity = XP_GRAVITY_NONE;
Carlos Lopez a09598
	flags |= XP_BOUNDS;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    xp_configure_surface (pDRIDrawablePriv->sid, flags, &wc);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRICreateSurface (ScreenPtr pScreen, Drawable id,
Carlos Lopez a09598
		  DrawablePtr pDrawable, xp_client_id client_id,
Carlos Lopez a09598
		  xp_surface_id *surface_id, unsigned int ret_key[2],
Carlos Lopez a09598
		  void (*notify) (void *arg, void *data), void *notify_data)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIScreenPrivPtr	pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
    DRIDrawablePrivPtr	pDRIDrawablePriv;
Carlos Lopez a09598
    WindowPtr		pWin;
Carlos Lopez a09598
    PixmapPtr		pPix;
Carlos Lopez a09598
    xp_window_id	wid = 0;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDrawable->type == DRAWABLE_WINDOW) {
Carlos Lopez a09598
	pWin = (WindowPtr)pDrawable;
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
Carlos Lopez a09598
	if (pDRIDrawablePriv == NULL) {
Carlos Lopez a09598
	    WindowPtr pTopWin;
Carlos Lopez a09598
            xp_error err;
Carlos Lopez a09598
	    xp_window_changes wc;
Carlos Lopez a09598
Carlos Lopez a09598
	    pTopWin = TopLevelParent (pWin);
Carlos Lopez a09598
Carlos Lopez a09598
	    /* allocate a DRI Window Private record */
Carlos Lopez a09598
	    if (!(pDRIDrawablePriv = xcalloc(1, sizeof(DRIDrawablePrivRec)))) {
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    pDRIDrawablePriv->pDraw = pDrawable;
Carlos Lopez a09598
	    pDRIDrawablePriv->pScreen = pScreen;
Carlos Lopez a09598
	    pDRIDrawablePriv->refCount = 0;
Carlos Lopez a09598
	    pDRIDrawablePriv->drawableIndex = -1;
Carlos Lopez a09598
	    pDRIDrawablePriv->notifiers = NULL;
Carlos Lopez a09598
Carlos Lopez a09598
	    /* find the physical window */
Carlos Lopez a09598
	    wid = RootlessGetPhysicalWindow (pTopWin, TRUE);
Carlos Lopez a09598
	    if (wid == 0) {
Carlos Lopez a09598
		xfree (pDRIDrawablePriv);
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* allocate the physical surface */
Carlos Lopez a09598
	    err = xp_create_surface (wid, &pDRIDrawablePriv->sid);
Carlos Lopez a09598
	    if (err != Success) {
Carlos Lopez a09598
		xfree (pDRIDrawablePriv);
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* Make it visible */
Carlos Lopez a09598
	    wc.stack_mode = XP_MAPPED_ABOVE;
Carlos Lopez a09598
	    wc.sibling = 0;
Carlos Lopez a09598
	    err = xp_configure_surface (pDRIDrawablePriv->sid,
Carlos Lopez a09598
					XP_STACKING, &wc);
Carlos Lopez a09598
	    if (err != Success)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		xp_destroy_surface (pDRIDrawablePriv->sid);
Carlos Lopez a09598
		xfree (pDRIDrawablePriv);
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* save private off of preallocated index */
Carlos Lopez a09598
	    pWin->devPrivates[DRIWindowPrivIndex].ptr = (pointer)pDRIDrawablePriv;
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
Carlos Lopez a09598
    else if (pDrawable->type == DRAWABLE_PIXMAP) {
Carlos Lopez a09598
	pPix = (PixmapPtr)pDrawable;
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
Carlos Lopez a09598
	if (pDRIDrawablePriv == NULL) {
Carlos Lopez a09598
	    xp_error err;
Carlos Lopez a09598
Carlos Lopez a09598
	    /* allocate a DRI Window Private record */
Carlos Lopez a09598
	    if (!(pDRIDrawablePriv = xcalloc(1, sizeof(DRIDrawablePrivRec)))) {
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    pDRIDrawablePriv->pDraw = pDrawable;
Carlos Lopez a09598
	    pDRIDrawablePriv->pScreen = pScreen;
Carlos Lopez a09598
	    pDRIDrawablePriv->refCount = 0;
Carlos Lopez a09598
	    pDRIDrawablePriv->drawableIndex = -1;
Carlos Lopez a09598
	    pDRIDrawablePriv->notifiers = NULL;
Carlos Lopez a09598
Carlos Lopez a09598
	    /* Passing a null window id to Xplugin in 10.3+ asks for
Carlos Lopez a09598
	       an accelerated offscreen surface. */
Carlos Lopez a09598
Carlos Lopez a09598
	    err = xp_create_surface (0, &pDRIDrawablePriv->sid);
Carlos Lopez a09598
	    if (err != Success) {
Carlos Lopez a09598
		xfree (pDRIDrawablePriv);
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* save private off of preallocated index */
Carlos Lopez a09598
	    pPix->devPrivates[DRIPixmapPrivIndex].ptr = (pointer)pDRIDrawablePriv;
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
#endif
Carlos Lopez a09598
    else { /* for GLX 1.3, a PBuffer */
Carlos Lopez a09598
	/* NOT_DONE */
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* Finish initialization of new surfaces */
Carlos Lopez a09598
    if (pDRIDrawablePriv->refCount == 0) {
Carlos Lopez a09598
	unsigned int key[2] = {0};
Carlos Lopez a09598
	xp_error err;
Carlos Lopez a09598
Carlos Lopez a09598
	/* try to give the client access to the surface
Carlos Lopez a09598
	   FIXME: how to export pixmaps? */
Carlos Lopez a09598
	if (client_id != 0 && wid != 0)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    err = xp_export_surface (wid, pDRIDrawablePriv->sid,
Carlos Lopez a09598
				     client_id, key);
Carlos Lopez a09598
	    if (err != Success) {
Carlos Lopez a09598
		xp_destroy_surface (pDRIDrawablePriv->sid);
Carlos Lopez a09598
		xfree (pDRIDrawablePriv);
Carlos Lopez a09598
		return FALSE;
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	pDRIDrawablePriv->key[0] = key[0];
Carlos Lopez a09598
	pDRIDrawablePriv->key[1] = key[1];
Carlos Lopez a09598
Carlos Lopez a09598
	++pDRIPriv->nrWindows;
Carlos Lopez a09598
Carlos Lopez a09598
	/* and stash it by surface id */
Carlos Lopez a09598
	if (surface_hash == NULL)
Carlos Lopez a09598
	    surface_hash = x_hash_table_new (NULL, NULL, NULL, NULL);
Carlos Lopez a09598
	x_hash_table_insert (surface_hash,
Carlos Lopez a09598
			     (void *) pDRIDrawablePriv->sid, pDRIDrawablePriv);
Carlos Lopez a09598
Carlos Lopez a09598
	/* track this in case this window is destroyed */
Carlos Lopez a09598
	AddResource(id, DRIDrawablePrivResType, (pointer)pDrawable);
Carlos Lopez a09598
Carlos Lopez a09598
	/* Initialize shape */
Carlos Lopez a09598
	DRIUpdateSurface (pDRIDrawablePriv, pDrawable);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIDrawablePriv->refCount++;
Carlos Lopez a09598
Carlos Lopez a09598
    *surface_id = pDRIDrawablePriv->sid;
Carlos Lopez a09598
Carlos Lopez a09598
    if (ret_key != NULL) {
Carlos Lopez a09598
	ret_key[0] = pDRIDrawablePriv->key[0];
Carlos Lopez a09598
	ret_key[1] = pDRIDrawablePriv->key[1];
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (notify != NULL) {
Carlos Lopez a09598
	pDRIDrawablePriv->notifiers = x_hook_add (pDRIDrawablePriv->notifiers,
Carlos Lopez a09598
						  notify, notify_data);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIDestroySurface(ScreenPtr pScreen, Drawable id, DrawablePtr pDrawable,
Carlos Lopez a09598
		  void (*notify) (void *, void *), void *notify_data)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIDrawablePrivPtr	pDRIDrawablePriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDrawable->type == DRAWABLE_WINDOW) {
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW((WindowPtr)pDrawable);
Carlos Lopez a09598
    } else if (pDrawable->type == DRAWABLE_PIXMAP) {
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP((PixmapPtr)pDrawable);
Carlos Lopez a09598
    } else {
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv != NULL) {
Carlos Lopez a09598
	if (notify != NULL) {
Carlos Lopez a09598
	    pDRIDrawablePriv->notifiers = x_hook_remove (pDRIDrawablePriv->notifiers,
Carlos Lopez a09598
							 notify, notify_data);
Carlos Lopez a09598
	}
Carlos Lopez a09598
	if (--pDRIDrawablePriv->refCount <= 0) {
Carlos Lopez a09598
	    /* This calls back to DRIDrawablePrivDelete
Carlos Lopez a09598
	       which frees the private area */
Carlos Lopez a09598
	    FreeResourceByType(id, DRIDrawablePrivResType, FALSE);
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIDrawablePrivDelete(pointer pResource, XID id)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DrawablePtr		pDrawable = (DrawablePtr)pResource;
Carlos Lopez a09598
    DRIScreenPrivPtr	pDRIPriv = DRI_SCREEN_PRIV(pDrawable->pScreen);
Carlos Lopez a09598
    DRIDrawablePrivPtr	pDRIDrawablePriv = NULL;
Carlos Lopez a09598
    WindowPtr		pWin = NULL;
Carlos Lopez a09598
    PixmapPtr		pPix = NULL;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDrawable->type == DRAWABLE_WINDOW) {
Carlos Lopez a09598
	pWin = (WindowPtr)pDrawable;
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
Carlos Lopez a09598
	DRIStopDrawing (pDrawable, FALSE);
Carlos Lopez a09598
	pDRIPriv->drawing = x_list_remove (pDRIPriv->drawing,
Carlos Lopez a09598
					   pDRIDrawablePriv);
Carlos Lopez a09598
    } else if (pDrawable->type == DRAWABLE_PIXMAP) {
Carlos Lopez a09598
	pPix = (PixmapPtr)pDrawable;
Carlos Lopez a09598
	pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_PIXMAP(pPix);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv == NULL)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv->drawableIndex != -1) {
Carlos Lopez a09598
	/* release drawable table entry */
Carlos Lopez a09598
	pDRIPriv->DRIDrawables[pDRIDrawablePriv->drawableIndex] = NULL;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv->sid != 0) {
Carlos Lopez a09598
	xp_destroy_surface (pDRIDrawablePriv->sid);
Carlos Lopez a09598
	x_hash_table_remove (surface_hash, (void *) pDRIDrawablePriv->sid);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv->notifiers != NULL)
Carlos Lopez a09598
	x_hook_free (pDRIDrawablePriv->notifiers);
Carlos Lopez a09598
Carlos Lopez a09598
    xfree(pDRIDrawablePriv);
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDrawable->type == DRAWABLE_WINDOW) {
Carlos Lopez a09598
	pWin->devPrivates[DRIWindowPrivIndex].ptr = NULL;
Carlos Lopez a09598
    } else if (pDrawable->type == DRAWABLE_PIXMAP) {
Carlos Lopez a09598
	pPix->devPrivates[DRIPixmapPrivIndex].ptr = NULL;
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    --pDRIPriv->nrWindows;
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRIWindowExposures(WindowPtr pWin, RegionPtr prgn, RegionPtr bsreg)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ScreenPtr pScreen = pWin->drawable.pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
    DRIDrawablePrivPtr pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin);
Carlos Lopez a09598
Carlos Lopez a09598
    if(pDRIDrawablePriv) {
Carlos Lopez a09598
	/* FIXME: something? */
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
Carlos Lopez a09598
Carlos Lopez a09598
    (*pScreen->WindowExposures)(pWin, prgn, bsreg);
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv->wrap.WindowExposures = pScreen->WindowExposures;
Carlos Lopez a09598
    pScreen->WindowExposures = DRIWindowExposures;
Carlos Lopez a09598
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRICopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ScreenPtr pScreen = pWin->drawable.pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
    DRIDrawablePrivPtr pDRIDrawablePriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if(pDRIPriv->nrWindows > 0) {
Carlos Lopez a09598
       pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW (pWin);
Carlos Lopez a09598
       if (pDRIDrawablePriv != NULL) {
Carlos Lopez a09598
	   DRIUpdateSurface (pDRIDrawablePriv, &pWin->drawable);
Carlos Lopez a09598
       }
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    /* unwrap */
Carlos Lopez a09598
    pScreen->CopyWindow = pDRIPriv->wrap.CopyWindow;
Carlos Lopez a09598
Carlos Lopez a09598
    /* call lower layers */
Carlos Lopez a09598
    (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc);
Carlos Lopez a09598
Carlos Lopez a09598
    /* rewrap */
Carlos Lopez a09598
    pDRIPriv->wrap.CopyWindow = pScreen->CopyWindow;
Carlos Lopez a09598
    pScreen->CopyWindow = DRICopyWindow;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
int
Carlos Lopez a09598
DRIValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ScreenPtr pScreen = pParent->drawable.pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
    int returnValue;
Carlos Lopez a09598
Carlos Lopez a09598
    /* unwrap */
Carlos Lopez a09598
    pScreen->ValidateTree = pDRIPriv->wrap.ValidateTree;
Carlos Lopez a09598
Carlos Lopez a09598
    /* call lower layers */
Carlos Lopez a09598
    returnValue = (*pScreen->ValidateTree)(pParent, pChild, kind);
Carlos Lopez a09598
Carlos Lopez a09598
    /* rewrap */
Carlos Lopez a09598
    pDRIPriv->wrap.ValidateTree = pScreen->ValidateTree;
Carlos Lopez a09598
    pScreen->ValidateTree = DRIValidateTree;
Carlos Lopez a09598
Carlos Lopez a09598
    return returnValue;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRIPostValidateTree(WindowPtr pParent, WindowPtr pChild, VTKind kind)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ScreenPtr pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pParent) {
Carlos Lopez a09598
	pScreen = pParent->drawable.pScreen;
Carlos Lopez a09598
    } else {
Carlos Lopez a09598
	pScreen = pChild->drawable.pScreen;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIPriv->wrap.PostValidateTree) {
Carlos Lopez a09598
	/* unwrap */
Carlos Lopez a09598
	pScreen->PostValidateTree = pDRIPriv->wrap.PostValidateTree;
Carlos Lopez a09598
Carlos Lopez a09598
	/* call lower layers */
Carlos Lopez a09598
	(*pScreen->PostValidateTree)(pParent, pChild, kind);
Carlos Lopez a09598
Carlos Lopez a09598
	/* rewrap */
Carlos Lopez a09598
	pDRIPriv->wrap.PostValidateTree = pScreen->PostValidateTree;
Carlos Lopez a09598
	pScreen->PostValidateTree = DRIPostValidateTree;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRIClipNotify(WindowPtr pWin, int dx, int dy)
Carlos Lopez a09598
{
Carlos Lopez a09598
    ScreenPtr pScreen = pWin->drawable.pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
    DRIDrawablePrivPtr	pDRIDrawablePriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if ((pDRIDrawablePriv = DRI_DRAWABLE_PRIV_FROM_WINDOW(pWin))) {
Carlos Lopez a09598
	DRIUpdateSurface (pDRIDrawablePriv, &pWin->drawable);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if(pDRIPriv->wrap.ClipNotify) {
Carlos Lopez a09598
        pScreen->ClipNotify = pDRIPriv->wrap.ClipNotify;
Carlos Lopez a09598
Carlos Lopez a09598
        (*pScreen->ClipNotify)(pWin, dx, dy);
Carlos Lopez a09598
Carlos Lopez a09598
        pDRIPriv->wrap.ClipNotify = pScreen->ClipNotify;
Carlos Lopez a09598
        pScreen->ClipNotify = DRIClipNotify;
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/* This lets get at the unwrapped functions so that they can correctly
Carlos Lopez a09598
 * call the lowerlevel functions, and choose whether they will be
Carlos Lopez a09598
 * called at every level of recursion (eg in validatetree).
Carlos Lopez a09598
 */
Carlos Lopez a09598
DRIWrappedFuncsRec *
Carlos Lopez a09598
DRIGetWrappedFuncs(ScreenPtr pScreen)
Carlos Lopez a09598
{
Carlos Lopez a09598
    return &(DRI_SCREEN_PRIV(pScreen)->wrap);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRIQueryVersion(int *majorVersion,
Carlos Lopez a09598
                int *minorVersion,
Carlos Lopez a09598
                int *patchVersion)
Carlos Lopez a09598
{
Carlos Lopez a09598
    *majorVersion = APPLE_DRI_MAJOR_VERSION;
Carlos Lopez a09598
    *minorVersion = APPLE_DRI_MINOR_VERSION;
Carlos Lopez a09598
    *patchVersion = APPLE_DRI_PATCH_VERSION;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRISurfaceNotify (xp_surface_id id, int kind)
Carlos Lopez a09598
{
Carlos Lopez a09598
    DRIDrawablePrivPtr pDRIDrawablePriv = NULL;
Carlos Lopez a09598
    DRISurfaceNotifyArg arg;
Carlos Lopez a09598
Carlos Lopez a09598
    arg.id = id;
Carlos Lopez a09598
    arg.kind = kind;
Carlos Lopez a09598
Carlos Lopez a09598
    if (surface_hash != NULL)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	pDRIDrawablePriv = x_hash_table_lookup (surface_hash,
Carlos Lopez a09598
						(void *) id, NULL);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIDrawablePriv == NULL)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    if (kind == AppleDRISurfaceNotifyDestroyed)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	pDRIDrawablePriv->sid = 0;
Carlos Lopez a09598
	x_hash_table_remove (surface_hash, (void *) id);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    x_hook_run (pDRIDrawablePriv->notifiers, &arg);
Carlos Lopez a09598
Carlos Lopez a09598
    if (kind == AppleDRISurfaceNotifyDestroyed)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	/* Kill off the handle. */
Carlos Lopez a09598
Carlos Lopez a09598
	FreeResourceByType (pDRIDrawablePriv->pDraw->id,
Carlos Lopez a09598
			    DRIDrawablePrivResType, FALSE);
Carlos Lopez a09598
    }
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598

Carlos Lopez a09598
/* Experimental support for X drawing directly into VRAM surfaces. */
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIStartDrawing (DrawablePtr pDraw)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
Carlos Lopez a09598
    return FALSE;
Carlos Lopez a09598
#else
Carlos Lopez a09598
    DRIDrawablePrivPtr priv = NULL;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
	priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
Carlos Lopez a09598
#if 0
Carlos Lopez a09598
    /* FIXME: support pixmaps */
Carlos Lopez a09598
    else if (pDraw->type == DRAWABLE_PIXMAP)
Carlos Lopez a09598
	priv = DRI_DRAWABLE_PRIV_FROM_PIXMAP ((PixmapPtr)pDraw);
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
    if (priv == NULL)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    pDRIPriv = DRI_SCREEN_PRIV(priv->pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (!priv->is_drawing)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	xp_error err;
Carlos Lopez a09598
	xp_box r;
Carlos Lopez a09598
Carlos Lopez a09598
	err = xp_lock_window (priv->sid, NULL, NULL,
Carlos Lopez a09598
			      &priv->data, &priv->rowbytes, &r);
Carlos Lopez a09598
	if (err != Success)
Carlos Lopez a09598
	    return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
	if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    WindowPtr pWin = (WindowPtr) pDraw;
Carlos Lopez a09598
	    int bw = wBorderWidth (pWin);
Carlos Lopez a09598
Carlos Lopez a09598
	    priv->pixmap =
Carlos Lopez a09598
            GetScratchPixmapHeader(pWin->drawable.pScreen, r.x2 - r.x1,
Carlos Lopez a09598
				   r.y2 - r.y1, pWin->drawable.depth,
Carlos Lopez a09598
                                   pWin->drawable.bitsPerPixel,
Carlos Lopez a09598
                                   priv->rowbytes, priv->data);
Carlos Lopez a09598
	    TranslatePixmapBase (priv->pixmap,
Carlos Lopez a09598
				 - (pWin->drawable.x - bw),
Carlos Lopez a09598
				 - (pWin->drawable.y - bw));
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
        priv->is_drawing = TRUE;
Carlos Lopez a09598
	pDRIPriv->drawing = x_list_prepend (pDRIPriv->drawing, priv);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	WindowPtr pWin = (WindowPtr) pDraw;
Carlos Lopez a09598
Carlos Lopez a09598
	priv->oldPixmap = pWin->drawable.pScreen->GetWindowPixmap (pWin);
Carlos Lopez a09598
	pWin->drawable.pScreen->SetWindowPixmap (pWin, priv->pixmap);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
#endif
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIStopDrawing (DrawablePtr pDraw, Bool flush)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
Carlos Lopez a09598
    return FALSE;
Carlos Lopez a09598
#else
Carlos Lopez a09598
    DRIDrawablePrivPtr priv = NULL;
Carlos Lopez a09598
    ScreenPtr pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
	priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
Carlos Lopez a09598
    else if (pDraw->type == DRAWABLE_PIXMAP)
Carlos Lopez a09598
	priv = DRI_DRAWABLE_PRIV_FROM_PIXMAP ((PixmapPtr)pDraw);
Carlos Lopez a09598
Carlos Lopez a09598
    if (priv == NULL)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    pScreen = priv->pScreen;
Carlos Lopez a09598
    pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (priv->is_drawing)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	xp_unlock_window (priv->sid, flush);
Carlos Lopez a09598
Carlos Lopez a09598
	if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    FreeScratchPixmapHeader (priv->pixmap);
Carlos Lopez a09598
	    pScreen->SetWindowPixmap ((WindowPtr)pDraw, priv->oldPixmap);
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
        priv->pixmap = NULL;
Carlos Lopez a09598
Carlos Lopez a09598
	/* If we didn't flush don't forget that we still need to.. */
Carlos Lopez a09598
	if (flush)
Carlos Lopez a09598
	    pDRIPriv->drawing = x_list_remove (pDRIPriv->drawing, priv);
Carlos Lopez a09598
Carlos Lopez a09598
        priv->is_drawing = FALSE;
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else if (flush)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	xp_flush_window (priv->sid);
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
#endif /* 10.3 */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
/*  true iff two Boxes overlap */
Carlos Lopez a09598
#define EXTENTCHECK(r1,r2) \
Carlos Lopez a09598
      (!( ((r1)->x2 <= (r2)->x1)  || \
Carlos Lopez a09598
          ((r1)->x1 >= (r2)->x2)  || \
Carlos Lopez a09598
          ((r1)->y2 <= (r2)->y1)  || \
Carlos Lopez a09598
          ((r1)->y1 >= (r2)->y2) ) )
Carlos Lopez a09598
Carlos Lopez a09598
Bool
Carlos Lopez a09598
DRIDamageRegion (DrawablePtr pDraw, RegionPtr pRegion)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1030
Carlos Lopez a09598
    return FALSE;
Carlos Lopez a09598
#else
Carlos Lopez a09598
    DRIDrawablePrivPtr priv = NULL;
Carlos Lopez a09598
    RegionRec clipped;
Carlos Lopez a09598
    BoxPtr b1, b2;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
	priv = DRI_DRAWABLE_PRIV_FROM_WINDOW ((WindowPtr)pDraw);
Carlos Lopez a09598
Carlos Lopez a09598
    if (priv == NULL)
Carlos Lopez a09598
	return FALSE;
Carlos Lopez a09598
Carlos Lopez a09598
    /* adapted from RootlessDamageRegion () */
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	WindowPtr pWin = (WindowPtr) pDraw;
Carlos Lopez a09598
Carlos Lopez a09598
	b1 = REGION_EXTENTS (pWin->drawable.pScreen, &pWin->borderClip);
Carlos Lopez a09598
	b2 = REGION_EXTENTS (pWin->drawable.pScreen, pRegion);
Carlos Lopez a09598
Carlos Lopez a09598
	if (EXTENTCHECK (b1, b2))
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    /* Regions may overlap. */
Carlos Lopez a09598
Carlos Lopez a09598
	    if (REGION_NUM_RECTS (pRegion) == 1)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		int in;
Carlos Lopez a09598
Carlos Lopez a09598
		/* Damaged region only has a single rect, so we can
Carlos Lopez a09598
		   just compare that against the region */
Carlos Lopez a09598
Carlos Lopez a09598
		in = RECT_IN_REGION (pWin->drawable.pScreen, &pWin->borderClip,
Carlos Lopez a09598
				     REGION_RECTS (pRegion));
Carlos Lopez a09598
		if (in == rgnIN)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    /* clip totally contains pRegion */
Carlos Lopez a09598
Carlos Lopez a09598
		    xp_mark_window (priv->sid, REGION_NUM_RECTS (pRegion),
Carlos Lopez a09598
				    REGION_RECTS (pRegion),
Carlos Lopez a09598
				    -priv->x, -priv->y);
Carlos Lopez a09598
Carlos Lopez a09598
		    RootlessQueueRedisplay (pWin->drawable.pScreen);
Carlos Lopez a09598
		    goto out;
Carlos Lopez a09598
		}
Carlos Lopez a09598
		else if (in == rgnOUT)
Carlos Lopez a09598
		{
Carlos Lopez a09598
		    /* clip doesn't contain pRegion */
Carlos Lopez a09598
Carlos Lopez a09598
		    goto out;
Carlos Lopez a09598
		}
Carlos Lopez a09598
	    }
Carlos Lopez a09598
Carlos Lopez a09598
	    /* clip overlaps pRegion, need to intersect */
Carlos Lopez a09598
Carlos Lopez a09598
	    REGION_INIT (pWin->drawable.pScreen, &clipped, NullBox, 0);
Carlos Lopez a09598
	    REGION_INTERSECT (pWin->drawable.pScreen, &clipped,
Carlos Lopez a09598
			      &pWin->borderClip, pRegion);
Carlos Lopez a09598
Carlos Lopez a09598
	    xp_mark_window (priv->sid, REGION_NUM_RECTS (&clipped),
Carlos Lopez a09598
			    REGION_RECTS (&clipped), -priv->x, -priv->y);
Carlos Lopez a09598
Carlos Lopez a09598
	    REGION_UNINIT (pWin->drawable.pScreen, &clipped);
Carlos Lopez a09598
Carlos Lopez a09598
	    RootlessQueueRedisplay (pWin->drawable.pScreen);
Carlos Lopez a09598
	}
Carlos Lopez a09598
    }
Carlos Lopez a09598
Carlos Lopez a09598
out:
Carlos Lopez a09598
    return TRUE;
Carlos Lopez a09598
#endif /* 10.3 */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRISynchronizeDrawable (DrawablePtr pDraw, Bool flush)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
Carlos Lopez a09598
    ScreenPtr pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv;
Carlos Lopez a09598
    DRIDrawablePrivPtr priv;
Carlos Lopez a09598
    x_list *node, *copy;
Carlos Lopez a09598
Carlos Lopez a09598
    pScreen = pDraw->pScreen;
Carlos Lopez a09598
    pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDRIPriv == NULL || pDRIPriv->drawing == NULL)
Carlos Lopez a09598
	return;
Carlos Lopez a09598
Carlos Lopez a09598
    if (pDraw->type == DRAWABLE_WINDOW)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	WindowPtr pWin = TopLevelParent ((WindowPtr) pDraw);
Carlos Lopez a09598
Carlos Lopez a09598
	/* need to find _any_ window under pWin that is drawing. Scan the
Carlos Lopez a09598
	   list looking for candidates. */
Carlos Lopez a09598
Carlos Lopez a09598
	copy = x_list_copy (pDRIPriv->drawing);
Carlos Lopez a09598
Carlos Lopez a09598
	for (node = copy; node != NULL; node = node->next)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    priv = node->data;
Carlos Lopez a09598
Carlos Lopez a09598
	    if (priv->pDraw->type == DRAWABLE_WINDOW
Carlos Lopez a09598
		&& TopLevelParent ((WindowPtr) priv->pDraw) == pWin)
Carlos Lopez a09598
	    {
Carlos Lopez a09598
		DRIStopDrawing (priv->pDraw, flush);
Carlos Lopez a09598
	    }
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	x_list_free (copy);
Carlos Lopez a09598
    }
Carlos Lopez a09598
    else
Carlos Lopez a09598
    {
Carlos Lopez a09598
	DRIStopDrawing (pDraw, flush);
Carlos Lopez a09598
    }
Carlos Lopez a09598
#endif /* 10.3 */
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
DRISynchronize (Bool flush)
Carlos Lopez a09598
{
Carlos Lopez a09598
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
Carlos Lopez a09598
    int i;
Carlos Lopez a09598
    ScreenPtr pScreen;
Carlos Lopez a09598
    DRIScreenPrivPtr pDRIPriv;
Carlos Lopez a09598
    DRIDrawablePrivPtr priv;
Carlos Lopez a09598
    x_list *node, *copy;
Carlos Lopez a09598
Carlos Lopez a09598
    for (i = 0; i < screenInfo.numScreens; i++)
Carlos Lopez a09598
    {
Carlos Lopez a09598
	pScreen = screenInfo.screens[i];
Carlos Lopez a09598
	pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Carlos Lopez a09598
Carlos Lopez a09598
	if (pDRIPriv == NULL || pDRIPriv->drawing == NULL)
Carlos Lopez a09598
	    continue;
Carlos Lopez a09598
Carlos Lopez a09598
	copy = x_list_copy (pDRIPriv->drawing);
Carlos Lopez a09598
Carlos Lopez a09598
	for (node = copy; node != NULL; node = node->next)
Carlos Lopez a09598
	{
Carlos Lopez a09598
	    priv = node->data;
Carlos Lopez a09598
Carlos Lopez a09598
	    DRIStopDrawing (priv->pDraw, flush);
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	x_list_free (copy);
Carlos Lopez a09598
    }
Carlos Lopez a09598
#endif /* 10.3 */
Carlos Lopez a09598
}