1706f2543Smrg/*
2706f2543Smrg *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
3706f2543Smrg *
4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining
5706f2543Smrg * a copy of this software and associated documentation files (the
6706f2543Smrg *"Software"), to deal in the Software without restriction, including
7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish,
8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to
9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to
10706f2543Smrg *the following conditions:
11706f2543Smrg *
12706f2543Smrg *The above copyright notice and this permission notice shall be
13706f2543Smrg *included in all copies or substantial portions of the Software.
14706f2543Smrg *
15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22706f2543Smrg *
23706f2543Smrg *Except as contained in this notice, the name of the XFree86 Project
24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use
25706f2543Smrg *or other dealings in this Software without prior written authorization
26706f2543Smrg *from the XFree86 Project.
27706f2543Smrg *
28706f2543Smrg * Authors:	Dakshinamurthy Karra
29706f2543Smrg *		Suhaib M Siddiqi
30706f2543Smrg *		Peter Busch
31706f2543Smrg *		Harold L Hunt II
32706f2543Smrg */
33706f2543Smrg
34706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H
35706f2543Smrg#include <xwin-config.h>
36706f2543Smrg#endif
37706f2543Smrg#include "win.h"
38706f2543Smrg
39706f2543Smrg
40706f2543Smrg/*
41706f2543Smrg * FIXME: Headers are broken, DEFINE_GUID doesn't work correctly,
42706f2543Smrg * so we have to redefine it here.
43706f2543Smrg */
44706f2543Smrg#ifdef DEFINE_GUID
45706f2543Smrg#undef DEFINE_GUID
46706f2543Smrg#define DEFINE_GUID(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
47706f2543Smrg#endif /* DEFINE_GUID */
48706f2543Smrg
49706f2543Smrg
50706f2543Smrg/*
51706f2543Smrg * FIXME: Headers are broken, IID_IDirectDraw2 has to be defined
52706f2543Smrg * here manually.  Should be handled by ddraw.h
53706f2543Smrg */
54706f2543Smrg#ifndef IID_IDirectDraw2
55706f2543SmrgDEFINE_GUID( IID_IDirectDraw2,0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 );
56706f2543Smrg#endif /* IID_IDirectDraw2 */
57706f2543Smrg
58706f2543Smrg
59706f2543Smrg/*
60706f2543Smrg * Local prototypes
61706f2543Smrg */
62706f2543Smrg
63706f2543Smrgstatic Bool
64706f2543SmrgwinAllocateFBShadowDD (ScreenPtr pScreen);
65706f2543Smrg
66706f2543Smrgstatic void
67706f2543SmrgwinShadowUpdateDD (ScreenPtr pScreen,
68706f2543Smrg		   shadowBufPtr pBuf);
69706f2543Smrg
70706f2543Smrgstatic Bool
71706f2543SmrgwinCloseScreenShadowDD (int nIndex, ScreenPtr pScreen);
72706f2543Smrg
73706f2543Smrgstatic Bool
74706f2543SmrgwinInitVisualsShadowDD (ScreenPtr pScreen);
75706f2543Smrg
76706f2543Smrgstatic Bool
77706f2543SmrgwinAdjustVideoModeShadowDD (ScreenPtr pScreen);
78706f2543Smrg
79706f2543Smrgstatic Bool
80706f2543SmrgwinBltExposedRegionsShadowDD (ScreenPtr pScreen);
81706f2543Smrg
82706f2543Smrgstatic Bool
83706f2543SmrgwinActivateAppShadowDD (ScreenPtr pScreen);
84706f2543Smrg
85706f2543Smrgstatic Bool
86706f2543SmrgwinRedrawScreenShadowDD (ScreenPtr pScreen);
87706f2543Smrg
88706f2543Smrgstatic Bool
89706f2543SmrgwinRealizeInstalledPaletteShadowDD (ScreenPtr pScreen);
90706f2543Smrg
91706f2543Smrgstatic Bool
92706f2543SmrgwinInstallColormapShadowDD (ColormapPtr pColormap);
93706f2543Smrg
94706f2543Smrgstatic Bool
95706f2543SmrgwinStoreColorsShadowDD (ColormapPtr pmap,
96706f2543Smrg			int ndef,
97706f2543Smrg			xColorItem *pdefs);
98706f2543Smrg
99706f2543Smrgstatic Bool
100706f2543SmrgwinCreateColormapShadowDD (ColormapPtr pColormap);
101706f2543Smrg
102706f2543Smrgstatic Bool
103706f2543SmrgwinDestroyColormapShadowDD (ColormapPtr pColormap);
104706f2543Smrg
105706f2543Smrgstatic Bool
106706f2543SmrgwinCreatePrimarySurfaceShadowDD (ScreenPtr pScreen);
107706f2543Smrg
108706f2543Smrgstatic Bool
109706f2543SmrgwinReleasePrimarySurfaceShadowDD (ScreenPtr pScreen);
110706f2543Smrg
111706f2543Smrg
112706f2543Smrg/*
113706f2543Smrg * Create the primary surface and attach the clipper.
114706f2543Smrg * Used for both the initial surface creation and during
115706f2543Smrg * WM_DISPLAYCHANGE messages.
116706f2543Smrg */
117706f2543Smrg
118706f2543Smrgstatic Bool
119706f2543SmrgwinCreatePrimarySurfaceShadowDD (ScreenPtr pScreen)
120706f2543Smrg{
121706f2543Smrg  winScreenPriv(pScreen);
122706f2543Smrg  HRESULT		ddrval = DD_OK;
123706f2543Smrg  DDSURFACEDESC		ddsd;
124706f2543Smrg
125706f2543Smrg  /* Describe the primary surface */
126706f2543Smrg  ZeroMemory (&ddsd, sizeof (ddsd));
127706f2543Smrg  ddsd.dwSize = sizeof (ddsd);
128706f2543Smrg  ddsd.dwFlags = DDSD_CAPS;
129706f2543Smrg  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
130706f2543Smrg
131706f2543Smrg  /* Create the primary surface */
132706f2543Smrg  ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
133706f2543Smrg				       &ddsd,
134706f2543Smrg				       &pScreenPriv->pddsPrimary,
135706f2543Smrg				       NULL);
136706f2543Smrg  if (FAILED (ddrval))
137706f2543Smrg    {
138706f2543Smrg      ErrorF ("winCreatePrimarySurfaceShadowDD - Could not create primary "
139706f2543Smrg	      "surface: %08x\n", (unsigned int) ddrval);
140706f2543Smrg      return FALSE;
141706f2543Smrg    }
142706f2543Smrg
143706f2543Smrg#if CYGDEBUG
144706f2543Smrg  winDebug ("winCreatePrimarySurfaceShadowDD - Created primary surface\n");
145706f2543Smrg#endif
146706f2543Smrg
147706f2543Smrg  /*
148706f2543Smrg   * Attach a clipper to the primary surface that will clip our blits to our
149706f2543Smrg   * display window.
150706f2543Smrg   */
151706f2543Smrg  ddrval = IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
152706f2543Smrg					   pScreenPriv->pddcPrimary);
153706f2543Smrg  if (FAILED (ddrval))
154706f2543Smrg    {
155706f2543Smrg      ErrorF ("winCreatePrimarySurfaceShadowDD - Primary attach clipper "
156706f2543Smrg	      "failed: %08x\n",
157706f2543Smrg	      (unsigned int) ddrval);
158706f2543Smrg      return FALSE;
159706f2543Smrg    }
160706f2543Smrg
161706f2543Smrg#if CYGDEBUG
162706f2543Smrg  winDebug ("winCreatePrimarySurfaceShadowDD - Attached clipper to "
163706f2543Smrg	  "primary surface\n");
164706f2543Smrg#endif
165706f2543Smrg
166706f2543Smrg  /* Everything was correct */
167706f2543Smrg  return TRUE;
168706f2543Smrg}
169706f2543Smrg
170706f2543Smrg
171706f2543Smrg/*
172706f2543Smrg * Detach the clipper and release the primary surface.
173706f2543Smrg * Called from WM_DISPLAYCHANGE.
174706f2543Smrg */
175706f2543Smrg
176706f2543Smrgstatic Bool
177706f2543SmrgwinReleasePrimarySurfaceShadowDD (ScreenPtr pScreen)
178706f2543Smrg{
179706f2543Smrg  winScreenPriv(pScreen);
180706f2543Smrg
181706f2543Smrg  ErrorF ("winReleasePrimarySurfaceShadowDD - Hello\n");
182706f2543Smrg
183706f2543Smrg  /* Release the primary surface and clipper, if they exist */
184706f2543Smrg  if (pScreenPriv->pddsPrimary)
185706f2543Smrg    {
186706f2543Smrg      /*
187706f2543Smrg       * Detach the clipper from the primary surface.
188706f2543Smrg       * NOTE: We do this explicity for clarity.  The Clipper is not released.
189706f2543Smrg       */
190706f2543Smrg      IDirectDrawSurface2_SetClipper (pScreenPriv->pddsPrimary,
191706f2543Smrg				      NULL);
192706f2543Smrg
193706f2543Smrg      ErrorF ("winReleasePrimarySurfaceShadowDD - Detached clipper\n");
194706f2543Smrg
195706f2543Smrg      /* Release the primary surface */
196706f2543Smrg      IDirectDrawSurface2_Release (pScreenPriv->pddsPrimary);
197706f2543Smrg      pScreenPriv->pddsPrimary = NULL;
198706f2543Smrg    }
199706f2543Smrg
200706f2543Smrg  ErrorF ("winReleasePrimarySurfaceShadowDD - Released primary surface\n");
201706f2543Smrg
202706f2543Smrg  return TRUE;
203706f2543Smrg}
204706f2543Smrg
205706f2543Smrg
206706f2543Smrg/*
207706f2543Smrg * Create a DirectDraw surface for the shadow framebuffer; also create
208706f2543Smrg * a primary surface object so we can blit to the display.
209706f2543Smrg *
210706f2543Smrg * Install a DirectDraw clipper on our primary surface object
211706f2543Smrg * that clips our blits to the unobscured client area of our display window.
212706f2543Smrg */
213706f2543Smrg
214706f2543Smrgstatic Bool
215706f2543SmrgwinAllocateFBShadowDD (ScreenPtr pScreen)
216706f2543Smrg{
217706f2543Smrg  winScreenPriv(pScreen);
218706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
219706f2543Smrg  HRESULT		ddrval = DD_OK;
220706f2543Smrg  DDSURFACEDESC		ddsd;
221706f2543Smrg  DDSURFACEDESC		*pddsdShadow = NULL;
222706f2543Smrg
223706f2543Smrg#if CYGDEBUG
224706f2543Smrg  winDebug ("winAllocateFBShadowDD\n");
225706f2543Smrg#endif
226706f2543Smrg
227706f2543Smrg  /* Create a clipper */
228706f2543Smrg  ddrval = (*g_fpDirectDrawCreateClipper) (0,
229706f2543Smrg					   &pScreenPriv->pddcPrimary,
230706f2543Smrg					   NULL);
231706f2543Smrg  if (FAILED (ddrval))
232706f2543Smrg    {
233706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Could not create clipper: %08x\n",
234706f2543Smrg	      (unsigned int) ddrval);
235706f2543Smrg      return FALSE;
236706f2543Smrg    }
237706f2543Smrg
238706f2543Smrg#if CYGDEBUG
239706f2543Smrg  winDebug ("winAllocateFBShadowDD - Created a clipper\n");
240706f2543Smrg#endif
241706f2543Smrg
242706f2543Smrg  /* Attach the clipper to our display window */
243706f2543Smrg  ddrval = IDirectDrawClipper_SetHWnd (pScreenPriv->pddcPrimary,
244706f2543Smrg				       0,
245706f2543Smrg				       pScreenPriv->hwndScreen);
246706f2543Smrg  if (FAILED (ddrval))
247706f2543Smrg    {
248706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Clipper not attached to "
249706f2543Smrg	      "window: %08x\n",
250706f2543Smrg	      (unsigned int) ddrval);
251706f2543Smrg      return FALSE;
252706f2543Smrg    }
253706f2543Smrg
254706f2543Smrg#if CYGDEBUG
255706f2543Smrg  winDebug ("winAllocateFBShadowDD - Attached clipper to window\n");
256706f2543Smrg#endif
257706f2543Smrg
258706f2543Smrg  /* Create a DirectDraw object, store the address at lpdd */
259706f2543Smrg  ddrval = (*g_fpDirectDrawCreate) (NULL, &pScreenPriv->pdd, NULL);
260706f2543Smrg  if (FAILED (ddrval))
261706f2543Smrg    {
262706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Could not start DirectDraw: %08x\n",
263706f2543Smrg	      (unsigned int) ddrval);
264706f2543Smrg      return FALSE;
265706f2543Smrg    }
266706f2543Smrg
267706f2543Smrg#if CYGDEBUG
268706f2543Smrg  winDebug ("winAllocateFBShadowDD () - Created and initialized DD\n");
269706f2543Smrg#endif
270706f2543Smrg
271706f2543Smrg  /* Get a DirectDraw2 interface pointer */
272706f2543Smrg  ddrval = IDirectDraw_QueryInterface (pScreenPriv->pdd,
273706f2543Smrg				       &IID_IDirectDraw2,
274706f2543Smrg				       (LPVOID*) &pScreenPriv->pdd2);
275706f2543Smrg  if (FAILED (ddrval))
276706f2543Smrg    {
277706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Failed DD2 query: %08x\n",
278706f2543Smrg	      (unsigned int) ddrval);
279706f2543Smrg      return FALSE;
280706f2543Smrg    }
281706f2543Smrg
282706f2543Smrg  /* Are we full screen? */
283706f2543Smrg  if (pScreenInfo->fFullScreen)
284706f2543Smrg    {
285706f2543Smrg      DDSURFACEDESC	ddsdCurrent;
286706f2543Smrg      DWORD		dwRefreshRateCurrent = 0;
287706f2543Smrg      HDC		hdc = NULL;
288706f2543Smrg
289706f2543Smrg      /* Set the cooperative level to full screen */
290706f2543Smrg      ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
291706f2543Smrg						 pScreenPriv->hwndScreen,
292706f2543Smrg						 DDSCL_EXCLUSIVE
293706f2543Smrg						 | DDSCL_FULLSCREEN);
294706f2543Smrg      if (FAILED (ddrval))
295706f2543Smrg	{
296706f2543Smrg	  ErrorF ("winAllocateFBShadowDD - Could not set "
297706f2543Smrg		  "cooperative level: %08x\n",
298706f2543Smrg		  (unsigned int) ddrval);
299706f2543Smrg	  return FALSE;
300706f2543Smrg	}
301706f2543Smrg
302706f2543Smrg      /*
303706f2543Smrg       * We only need to get the current refresh rate for comparison
304706f2543Smrg       * if a refresh rate has been passed on the command line.
305706f2543Smrg       */
306706f2543Smrg      if (pScreenInfo->dwRefreshRate != 0)
307706f2543Smrg	{
308706f2543Smrg	  ZeroMemory (&ddsdCurrent, sizeof (ddsdCurrent));
309706f2543Smrg	  ddsdCurrent.dwSize = sizeof (ddsdCurrent);
310706f2543Smrg
311706f2543Smrg	  /* Get information about current display settings */
312706f2543Smrg	  ddrval = IDirectDraw2_GetDisplayMode (pScreenPriv->pdd2,
313706f2543Smrg						&ddsdCurrent);
314706f2543Smrg	  if (FAILED (ddrval))
315706f2543Smrg	    {
316706f2543Smrg	      ErrorF ("winAllocateFBShadowDD - Could not get current "
317706f2543Smrg		      "refresh rate: %08x.  Continuing.\n",
318706f2543Smrg		      (unsigned int) ddrval);
319706f2543Smrg	      dwRefreshRateCurrent = 0;
320706f2543Smrg	    }
321706f2543Smrg	  else
322706f2543Smrg	    {
323706f2543Smrg	      /* Grab the current refresh rate */
324706f2543Smrg	      dwRefreshRateCurrent = ddsdCurrent.u2.dwRefreshRate;
325706f2543Smrg	    }
326706f2543Smrg	}
327706f2543Smrg
328706f2543Smrg      /* Clean up the refresh rate */
329706f2543Smrg      if (dwRefreshRateCurrent == pScreenInfo->dwRefreshRate)
330706f2543Smrg	{
331706f2543Smrg	  /*
332706f2543Smrg	   * Refresh rate is non-specified or equal to current.
333706f2543Smrg	   */
334706f2543Smrg	  pScreenInfo->dwRefreshRate = 0;
335706f2543Smrg	}
336706f2543Smrg
337706f2543Smrg      /* Grab a device context for the screen */
338706f2543Smrg      hdc = GetDC (NULL);
339706f2543Smrg      if (hdc == NULL)
340706f2543Smrg	{
341706f2543Smrg	  ErrorF ("winAllocateFBShadowDD - GetDC () failed\n");
342706f2543Smrg	  return FALSE;
343706f2543Smrg	}
344706f2543Smrg
345706f2543Smrg      /* Only change the video mode when different than current mode */
346706f2543Smrg      if (!pScreenInfo->fMultipleMonitors
347706f2543Smrg	  && (pScreenInfo->dwWidth != GetSystemMetrics (SM_CXSCREEN)
348706f2543Smrg	      || pScreenInfo->dwHeight != GetSystemMetrics (SM_CYSCREEN)
349706f2543Smrg	      || pScreenInfo->dwBPP != GetDeviceCaps (hdc, BITSPIXEL)
350706f2543Smrg	      || pScreenInfo->dwRefreshRate != 0))
351706f2543Smrg	{
352706f2543Smrg	  ErrorF ("winAllocateFBShadowDD - Changing video mode\n");
353706f2543Smrg
354706f2543Smrg	  /* Change the video mode to the mode requested, and use the driver default refresh rate on failure */
355706f2543Smrg	  ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
356706f2543Smrg						pScreenInfo->dwWidth,
357706f2543Smrg						pScreenInfo->dwHeight,
358706f2543Smrg						pScreenInfo->dwBPP,
359706f2543Smrg						pScreenInfo->dwRefreshRate,
360706f2543Smrg						0);
361706f2543Smrg	  if (FAILED (ddrval))
362706f2543Smrg	    {
363706f2543Smrg	      ErrorF ("winAllocateFBShadowDD - Could not set "\
364706f2543Smrg		      "full screen display mode: %08x\n",
365706f2543Smrg		      (unsigned int) ddrval);
366706f2543Smrg	      ErrorF ("winAllocateFBShadowDD - Using default driver refresh rate\n");
367706f2543Smrg	      ddrval = IDirectDraw2_SetDisplayMode (pScreenPriv->pdd2,
368706f2543Smrg						    pScreenInfo->dwWidth,
369706f2543Smrg						    pScreenInfo->dwHeight,
370706f2543Smrg						    pScreenInfo->dwBPP,
371706f2543Smrg						    0,
372706f2543Smrg						    0);
373706f2543Smrg	      if (FAILED(ddrval))
374706f2543Smrg		{
375706f2543Smrg			ErrorF ("winAllocateFBShadowDD - Could not set default refresh rate "
376706f2543Smrg				"full screen display mode: %08x\n",
377706f2543Smrg				(unsigned int) ddrval);
378706f2543Smrg			return FALSE;
379706f2543Smrg		}
380706f2543Smrg	    }
381706f2543Smrg	}
382706f2543Smrg      else
383706f2543Smrg	{
384706f2543Smrg	  ErrorF ("winAllocateFBShadowDD - Not changing video mode\n");
385706f2543Smrg	}
386706f2543Smrg
387706f2543Smrg      /* Release our DC */
388706f2543Smrg      ReleaseDC (NULL, hdc);
389706f2543Smrg      hdc = NULL;
390706f2543Smrg    }
391706f2543Smrg  else
392706f2543Smrg    {
393706f2543Smrg      /* Set the cooperative level for windowed mode */
394706f2543Smrg      ddrval = IDirectDraw2_SetCooperativeLevel (pScreenPriv->pdd2,
395706f2543Smrg						 pScreenPriv->hwndScreen,
396706f2543Smrg						 DDSCL_NORMAL);
397706f2543Smrg      if (FAILED (ddrval))
398706f2543Smrg	{
399706f2543Smrg	  ErrorF ("winAllocateFBShadowDD - Could not set "\
400706f2543Smrg		  "cooperative level: %08x\n",
401706f2543Smrg		  (unsigned int) ddrval);
402706f2543Smrg	  return FALSE;
403706f2543Smrg	}
404706f2543Smrg    }
405706f2543Smrg
406706f2543Smrg  /* Create the primary surface */
407706f2543Smrg  if (!winCreatePrimarySurfaceShadowDD (pScreen))
408706f2543Smrg    {
409706f2543Smrg      ErrorF ("winAllocateFBShadowDD - winCreatePrimarySurfaceShadowDD "
410706f2543Smrg	      "failed\n");
411706f2543Smrg      return FALSE;
412706f2543Smrg    }
413706f2543Smrg
414706f2543Smrg  /* Describe the shadow surface to be created */
415706f2543Smrg  /* NOTE: Do not use a DDSCAPS_VIDEOMEMORY surface,
416706f2543Smrg   * as drawing, locking, and unlocking take forever
417706f2543Smrg   * with video memory surfaces.  In addition,
418706f2543Smrg   * video memory is a somewhat scarce resource,
419706f2543Smrg   * so you shouldn't be allocating video memory when
420706f2543Smrg   * you have the option of using system memory instead.
421706f2543Smrg   */
422706f2543Smrg  ZeroMemory (&ddsd, sizeof (ddsd));
423706f2543Smrg  ddsd.dwSize = sizeof (ddsd);
424706f2543Smrg  ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
425706f2543Smrg  ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
426706f2543Smrg  ddsd.dwHeight = pScreenInfo->dwHeight;
427706f2543Smrg  ddsd.dwWidth = pScreenInfo->dwWidth;
428706f2543Smrg
429706f2543Smrg  /* Create the shadow surface */
430706f2543Smrg  ddrval = IDirectDraw2_CreateSurface (pScreenPriv->pdd2,
431706f2543Smrg				       &ddsd,
432706f2543Smrg				       &pScreenPriv->pddsShadow,
433706f2543Smrg				       NULL);
434706f2543Smrg  if (FAILED (ddrval))
435706f2543Smrg    {
436706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Could not create shadow "\
437706f2543Smrg	      "surface: %08x\n", (unsigned int) ddrval);
438706f2543Smrg      return FALSE;
439706f2543Smrg    }
440706f2543Smrg
441706f2543Smrg#if CYGDEBUG
442706f2543Smrg  winDebug ("winAllocateFBShadowDD - Created shadow\n");
443706f2543Smrg#endif
444706f2543Smrg
445706f2543Smrg  /* Allocate a DD surface description for our screen privates */
446706f2543Smrg  pddsdShadow = pScreenPriv->pddsdShadow = malloc (sizeof (DDSURFACEDESC));
447706f2543Smrg  if (pddsdShadow == NULL)
448706f2543Smrg    {
449706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Could not allocate surface "\
450706f2543Smrg	      "description memory\n");
451706f2543Smrg      return FALSE;
452706f2543Smrg    }
453706f2543Smrg  ZeroMemory (pddsdShadow, sizeof (*pddsdShadow));
454706f2543Smrg  pddsdShadow->dwSize = sizeof (*pddsdShadow);
455706f2543Smrg
456706f2543Smrg#if CYGDEBUG
457706f2543Smrg  winDebug ("winAllocateFBShadowDD - Locking shadow\n");
458706f2543Smrg#endif
459706f2543Smrg
460706f2543Smrg  /* Lock the shadow surface */
461706f2543Smrg  ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
462706f2543Smrg				     NULL,
463706f2543Smrg				     pddsdShadow,
464706f2543Smrg				     DDLOCK_WAIT,
465706f2543Smrg				     NULL);
466706f2543Smrg  if (FAILED (ddrval) || pddsdShadow->lpSurface == NULL)
467706f2543Smrg    {
468706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Could not lock shadow "\
469706f2543Smrg	      "surface: %08x\n", (unsigned int) ddrval);
470706f2543Smrg      return FALSE;
471706f2543Smrg    }
472706f2543Smrg
473706f2543Smrg#if CYGDEBUG
474706f2543Smrg  winDebug ("winAllocateFBShadowDD - Locked shadow\n");
475706f2543Smrg#endif
476706f2543Smrg
477706f2543Smrg  /* We don't know how to deal with anything other than RGB */
478706f2543Smrg  if (!(pddsdShadow->ddpfPixelFormat.dwFlags & DDPF_RGB))
479706f2543Smrg    {
480706f2543Smrg      ErrorF ("winAllocateFBShadowDD - Color format other than RGB\n");
481706f2543Smrg      return FALSE;
482706f2543Smrg    }
483706f2543Smrg
484706f2543Smrg  /* Grab the pitch from the surface desc */
485706f2543Smrg  pScreenInfo->dwStride = (pddsdShadow->u1.lPitch * 8)
486706f2543Smrg    / pScreenInfo->dwBPP;
487706f2543Smrg
488706f2543Smrg  /* Save the pointer to our surface memory */
489706f2543Smrg  pScreenInfo->pfb = pddsdShadow->lpSurface;
490706f2543Smrg
491706f2543Smrg  /* Grab the color depth and masks from the surface description */
492706f2543Smrg  pScreenPriv->dwRedMask = pddsdShadow->ddpfPixelFormat.u2.dwRBitMask;
493706f2543Smrg  pScreenPriv->dwGreenMask = pddsdShadow->ddpfPixelFormat.u3.dwGBitMask;
494706f2543Smrg  pScreenPriv->dwBlueMask = pddsdShadow->ddpfPixelFormat.u4.dwBBitMask;
495706f2543Smrg
496706f2543Smrg#if CYGDEBUG
497706f2543Smrg  winDebug ("winAllocateFBShadowDD - Returning\n");
498706f2543Smrg#endif
499706f2543Smrg
500706f2543Smrg  return TRUE;
501706f2543Smrg}
502706f2543Smrg
503706f2543Smrgstatic void
504706f2543SmrgwinFreeFBShadowDD (ScreenPtr pScreen)
505706f2543Smrg{
506706f2543Smrg  winScreenPriv(pScreen);
507706f2543Smrg  winScreenInfo *pScreenInfo = pScreenPriv->pScreenInfo;
508706f2543Smrg
509706f2543Smrg  /* Free the shadow surface, if there is one */
510706f2543Smrg  if (pScreenPriv->pddsShadow)
511706f2543Smrg    {
512706f2543Smrg      IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
513706f2543Smrg      IDirectDrawSurface2_Release (pScreenPriv->pddsShadow);
514706f2543Smrg      pScreenPriv->pddsShadow = NULL;
515706f2543Smrg    }
516706f2543Smrg
517706f2543Smrg  /* Detach the clipper from the primary surface and release the primary surface, if there is one */
518706f2543Smrg  winReleasePrimarySurfaceShadowDD(pScreen);
519706f2543Smrg
520706f2543Smrg  /* Release the clipper object */
521706f2543Smrg  if (pScreenPriv->pddcPrimary)
522706f2543Smrg    {
523706f2543Smrg      IDirectDrawClipper_Release (pScreenPriv->pddcPrimary);
524706f2543Smrg      pScreenPriv->pddcPrimary = NULL;
525706f2543Smrg    }
526706f2543Smrg
527706f2543Smrg  /* Free the DirectDraw2 object, if there is one */
528706f2543Smrg  if (pScreenPriv->pdd2)
529706f2543Smrg    {
530706f2543Smrg      IDirectDraw2_RestoreDisplayMode (pScreenPriv->pdd2);
531706f2543Smrg      IDirectDraw2_Release (pScreenPriv->pdd2);
532706f2543Smrg      pScreenPriv->pdd2 = NULL;
533706f2543Smrg    }
534706f2543Smrg
535706f2543Smrg  /* Free the DirectDraw object, if there is one */
536706f2543Smrg  if (pScreenPriv->pdd)
537706f2543Smrg    {
538706f2543Smrg      IDirectDraw_Release (pScreenPriv->pdd);
539706f2543Smrg      pScreenPriv->pdd = NULL;
540706f2543Smrg    }
541706f2543Smrg
542706f2543Smrg  /* Invalidate the ScreenInfo's fb pointer */
543706f2543Smrg  pScreenInfo->pfb = NULL;
544706f2543Smrg}
545706f2543Smrg
546706f2543Smrg/*
547706f2543Smrg * Transfer the damaged regions of the shadow framebuffer to the display.
548706f2543Smrg */
549706f2543Smrg
550706f2543Smrgstatic void
551706f2543SmrgwinShadowUpdateDD (ScreenPtr pScreen,
552706f2543Smrg		   shadowBufPtr pBuf)
553706f2543Smrg{
554706f2543Smrg  winScreenPriv(pScreen);
555706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
556706f2543Smrg  RegionPtr		damage = shadowDamage(pBuf);
557706f2543Smrg  HRESULT		ddrval = DD_OK;
558706f2543Smrg  RECT			rcDest, rcSrc;
559706f2543Smrg  POINT			ptOrigin;
560706f2543Smrg  DWORD			dwBox = RegionNumRects (damage);
561706f2543Smrg  BoxPtr		pBox = RegionRects (damage);
562706f2543Smrg  HRGN			hrgnTemp = NULL, hrgnCombined = NULL;
563706f2543Smrg
564706f2543Smrg  /*
565706f2543Smrg   * Return immediately if the app is not active
566706f2543Smrg   * and we are fullscreen, or if we have a bad display depth
567706f2543Smrg   */
568706f2543Smrg  if ((!pScreenPriv->fActive && pScreenInfo->fFullScreen)
569706f2543Smrg      || pScreenPriv->fBadDepth) return;
570706f2543Smrg
571706f2543Smrg  /* Return immediately if we didn't get needed surfaces */
572706f2543Smrg  if (!pScreenPriv->pddsPrimary || !pScreenPriv->pddsShadow)
573706f2543Smrg    return;
574706f2543Smrg
575706f2543Smrg  /* Get the origin of the window in the screen coords */
576706f2543Smrg  ptOrigin.x = pScreenInfo->dwXOffset;
577706f2543Smrg  ptOrigin.y = pScreenInfo->dwYOffset;
578706f2543Smrg  MapWindowPoints (pScreenPriv->hwndScreen,
579706f2543Smrg		   HWND_DESKTOP,
580706f2543Smrg		   (LPPOINT)&ptOrigin, 1);
581706f2543Smrg
582706f2543Smrg  /* Unlock the shadow surface, so we can blit */
583706f2543Smrg  ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
584706f2543Smrg  if (FAILED (ddrval))
585706f2543Smrg    {
586706f2543Smrg      ErrorF ("winShadowUpdateDD - Unlock failed\n");
587706f2543Smrg      return;
588706f2543Smrg    }
589706f2543Smrg
590706f2543Smrg  /*
591706f2543Smrg   * Handle small regions with multiple blits,
592706f2543Smrg   * handle large regions by creating a clipping region and
593706f2543Smrg   * doing a single blit constrained to that clipping region.
594706f2543Smrg   */
595706f2543Smrg  if (pScreenInfo->dwClipUpdatesNBoxes == 0
596706f2543Smrg      || dwBox < pScreenInfo->dwClipUpdatesNBoxes)
597706f2543Smrg    {
598706f2543Smrg      /* Loop through all boxes in the damaged region */
599706f2543Smrg      while (dwBox--)
600706f2543Smrg	{
601706f2543Smrg	  /* Assign damage box to source rectangle */
602706f2543Smrg	  rcSrc.left = pBox->x1;
603706f2543Smrg	  rcSrc.top = pBox->y1;
604706f2543Smrg	  rcSrc.right = pBox->x2;
605706f2543Smrg	  rcSrc.bottom = pBox->y2;
606706f2543Smrg
607706f2543Smrg	  /* Calculate destination rectange */
608706f2543Smrg	  rcDest.left = ptOrigin.x + rcSrc.left;
609706f2543Smrg	  rcDest.top = ptOrigin.y + rcSrc.top;
610706f2543Smrg	  rcDest.right = ptOrigin.x + rcSrc.right;
611706f2543Smrg	  rcDest.bottom = ptOrigin.y + rcSrc.bottom;
612706f2543Smrg
613706f2543Smrg	  /* Blit the damaged areas */
614706f2543Smrg	  ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
615706f2543Smrg					    &rcDest,
616706f2543Smrg					    pScreenPriv->pddsShadow,
617706f2543Smrg					    &rcSrc,
618706f2543Smrg					    DDBLT_WAIT,
619706f2543Smrg					    NULL);
620706f2543Smrg
621706f2543Smrg	  /* Get a pointer to the next box */
622706f2543Smrg	  ++pBox;
623706f2543Smrg	}
624706f2543Smrg    }
625706f2543Smrg  else
626706f2543Smrg    {
627706f2543Smrg      BoxPtr		pBoxExtents = RegionExtents(damage);
628706f2543Smrg
629706f2543Smrg      /* Compute a GDI region from the damaged region */
630706f2543Smrg      hrgnCombined = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
631706f2543Smrg      dwBox--;
632706f2543Smrg      pBox++;
633706f2543Smrg      while (dwBox--)
634706f2543Smrg	{
635706f2543Smrg	  hrgnTemp = CreateRectRgn (pBox->x1, pBox->y1, pBox->x2, pBox->y2);
636706f2543Smrg	  CombineRgn (hrgnCombined, hrgnCombined, hrgnTemp, RGN_OR);
637706f2543Smrg	  DeleteObject (hrgnTemp);
638706f2543Smrg	  pBox++;
639706f2543Smrg	}
640706f2543Smrg
641706f2543Smrg      /* Install the GDI region as a clipping region */
642706f2543Smrg      SelectClipRgn (pScreenPriv->hdcScreen, hrgnCombined);
643706f2543Smrg      DeleteObject (hrgnCombined);
644706f2543Smrg      hrgnCombined = NULL;
645706f2543Smrg
646706f2543Smrg      /* Calculating a bounding box for the source is easy */
647706f2543Smrg      rcSrc.left = pBoxExtents->x1;
648706f2543Smrg      rcSrc.top = pBoxExtents->y1;
649706f2543Smrg      rcSrc.right = pBoxExtents->x2;
650706f2543Smrg      rcSrc.bottom = pBoxExtents->y2;
651706f2543Smrg
652706f2543Smrg      /* Calculating a bounding box for the destination is trickier */
653706f2543Smrg      rcDest.left = ptOrigin.x + rcSrc.left;
654706f2543Smrg      rcDest.top = ptOrigin.y + rcSrc.top;
655706f2543Smrg      rcDest.right = ptOrigin.x + rcSrc.right;
656706f2543Smrg      rcDest.bottom = ptOrigin.y + rcSrc.bottom;
657706f2543Smrg
658706f2543Smrg      /* Our Blt should be clipped to the invalidated region */
659706f2543Smrg      ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
660706f2543Smrg					&rcDest,
661706f2543Smrg					pScreenPriv->pddsShadow,
662706f2543Smrg					&rcSrc,
663706f2543Smrg					DDBLT_WAIT,
664706f2543Smrg					NULL);
665706f2543Smrg
666706f2543Smrg      /* Reset the clip region */
667706f2543Smrg      SelectClipRgn (pScreenPriv->hdcScreen, NULL);
668706f2543Smrg    }
669706f2543Smrg
670706f2543Smrg  /* Relock the shadow surface */
671706f2543Smrg  ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
672706f2543Smrg				     NULL,
673706f2543Smrg				     pScreenPriv->pddsdShadow,
674706f2543Smrg				     DDLOCK_WAIT,
675706f2543Smrg				     NULL);
676706f2543Smrg  if (FAILED (ddrval))
677706f2543Smrg    {
678706f2543Smrg      ErrorF ("winShadowUpdateDD - Lock failed\n");
679706f2543Smrg      return;
680706f2543Smrg    }
681706f2543Smrg
682706f2543Smrg  /* Has our memory pointer changed? */
683706f2543Smrg  if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
684706f2543Smrg    {
685706f2543Smrg      ErrorF ("winShadowUpdateDD - Memory location of the shadow "
686706f2543Smrg	      "surface has changed, trying to update the root window "
687706f2543Smrg	      "pixmap header to point to the new address.  If you get "
688706f2543Smrg	      "this message and "PROJECT_NAME" freezes or crashes "
689706f2543Smrg	      "after this message then send a problem report and your "
690706f2543Smrg	      "%s file to " BUILDERADDR "\n", g_pszLogFile);
691706f2543Smrg
692706f2543Smrg      /* Location of shadow framebuffer has changed */
693706f2543Smrg      winUpdateFBPointer(pScreen, pScreenPriv->pddsdShadow->lpSurface);
694706f2543Smrg    }
695706f2543Smrg}
696706f2543Smrg
697706f2543Smrgstatic Bool
698706f2543SmrgwinInitScreenShadowDD (ScreenPtr pScreen)
699706f2543Smrg{
700706f2543Smrg  winScreenPriv(pScreen);
701706f2543Smrg
702706f2543Smrg  /* Get a device context for the screen  */
703706f2543Smrg  pScreenPriv->hdcScreen = GetDC (pScreenPriv->hwndScreen);
704706f2543Smrg
705706f2543Smrg  return winAllocateFBShadowDD(pScreen);
706706f2543Smrg}
707706f2543Smrg
708706f2543Smrg/*
709706f2543Smrg * Call the wrapped CloseScreen function.
710706f2543Smrg *
711706f2543Smrg * Free our resources and private structures.
712706f2543Smrg */
713706f2543Smrg
714706f2543Smrgstatic Bool
715706f2543SmrgwinCloseScreenShadowDD (int nIndex, ScreenPtr pScreen)
716706f2543Smrg{
717706f2543Smrg  winScreenPriv(pScreen);
718706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
719706f2543Smrg  Bool			fReturn;
720706f2543Smrg
721706f2543Smrg#if CYGDEBUG
722706f2543Smrg  winDebug ("winCloseScreenShadowDD - Freeing screen resources\n");
723706f2543Smrg#endif
724706f2543Smrg
725706f2543Smrg  /* Flag that the screen is closed */
726706f2543Smrg  pScreenPriv->fClosed = TRUE;
727706f2543Smrg  pScreenPriv->fActive = FALSE;
728706f2543Smrg
729706f2543Smrg  /* Call the wrapped CloseScreen procedure */
730706f2543Smrg  WIN_UNWRAP(CloseScreen);
731706f2543Smrg  fReturn = (*pScreen->CloseScreen) (nIndex, pScreen);
732706f2543Smrg
733706f2543Smrg  winFreeFBShadowDD(pScreen);
734706f2543Smrg
735706f2543Smrg  /* Free the screen DC */
736706f2543Smrg  ReleaseDC (pScreenPriv->hwndScreen, pScreenPriv->hdcScreen);
737706f2543Smrg
738706f2543Smrg  /* Delete the window property */
739706f2543Smrg  RemoveProp (pScreenPriv->hwndScreen, WIN_SCR_PROP);
740706f2543Smrg
741706f2543Smrg  /* Delete tray icon, if we have one */
742706f2543Smrg  if (!pScreenInfo->fNoTrayIcon)
743706f2543Smrg    winDeleteNotifyIcon (pScreenPriv);
744706f2543Smrg
745706f2543Smrg  /* Free the exit confirmation dialog box, if it exists */
746706f2543Smrg  if (g_hDlgExit != NULL)
747706f2543Smrg    {
748706f2543Smrg      DestroyWindow (g_hDlgExit);
749706f2543Smrg      g_hDlgExit = NULL;
750706f2543Smrg    }
751706f2543Smrg
752706f2543Smrg  /* Kill our window */
753706f2543Smrg  if (pScreenPriv->hwndScreen)
754706f2543Smrg    {
755706f2543Smrg      DestroyWindow (pScreenPriv->hwndScreen);
756706f2543Smrg      pScreenPriv->hwndScreen = NULL;
757706f2543Smrg    }
758706f2543Smrg
759706f2543Smrg#if defined(XWIN_CLIPBOARD) || defined(XWIN_MULTIWINDOW)
760706f2543Smrg  /* Destroy the thread startup mutex */
761706f2543Smrg  pthread_mutex_destroy (&pScreenPriv->pmServerStarted);
762706f2543Smrg#endif
763706f2543Smrg
764706f2543Smrg  /* Kill our screeninfo's pointer to the screen */
765706f2543Smrg  pScreenInfo->pScreen = NULL;
766706f2543Smrg
767706f2543Smrg  /* Free the screen privates for this screen */
768706f2543Smrg  free ((pointer) pScreenPriv);
769706f2543Smrg
770706f2543Smrg  return fReturn;
771706f2543Smrg}
772706f2543Smrg
773706f2543Smrg
774706f2543Smrg/*
775706f2543Smrg * Tell mi what sort of visuals we need.
776706f2543Smrg *
777706f2543Smrg * Generally we only need one visual, as our screen can only
778706f2543Smrg * handle one format at a time, I believe.  You may want
779706f2543Smrg * to verify that last sentence.
780706f2543Smrg */
781706f2543Smrg
782706f2543Smrgstatic Bool
783706f2543SmrgwinInitVisualsShadowDD (ScreenPtr pScreen)
784706f2543Smrg{
785706f2543Smrg  winScreenPriv(pScreen);
786706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
787706f2543Smrg  DWORD			dwRedBits, dwGreenBits, dwBlueBits;
788706f2543Smrg
789706f2543Smrg  /* Count the number of ones in each color mask */
790706f2543Smrg  dwRedBits = winCountBits (pScreenPriv->dwRedMask);
791706f2543Smrg  dwGreenBits = winCountBits (pScreenPriv->dwGreenMask);
792706f2543Smrg  dwBlueBits = winCountBits (pScreenPriv->dwBlueMask);
793706f2543Smrg
794706f2543Smrg  /* Store the maximum number of ones in a color mask as the bitsPerRGB */
795706f2543Smrg  if (dwRedBits == 0 || dwGreenBits == 0 || dwBlueBits == 0)
796706f2543Smrg    pScreenPriv->dwBitsPerRGB = 8;
797706f2543Smrg  else if (dwRedBits > dwGreenBits && dwRedBits > dwBlueBits)
798706f2543Smrg    pScreenPriv->dwBitsPerRGB = dwRedBits;
799706f2543Smrg  else if (dwGreenBits > dwRedBits && dwGreenBits > dwBlueBits)
800706f2543Smrg    pScreenPriv->dwBitsPerRGB = dwGreenBits;
801706f2543Smrg  else
802706f2543Smrg    pScreenPriv->dwBitsPerRGB = dwBlueBits;
803706f2543Smrg
804706f2543Smrg  ErrorF ("winInitVisualsShadowDD - Masks %08x %08x %08x BPRGB %d d %d "
805706f2543Smrg	  "bpp %d\n",
806706f2543Smrg	  (unsigned int) pScreenPriv->dwRedMask,
807706f2543Smrg	  (unsigned int) pScreenPriv->dwGreenMask,
808706f2543Smrg	  (unsigned int) pScreenPriv->dwBlueMask,
809706f2543Smrg	  (int) pScreenPriv->dwBitsPerRGB,
810706f2543Smrg	  (int) pScreenInfo->dwDepth,
811706f2543Smrg	  (int) pScreenInfo->dwBPP);
812706f2543Smrg
813706f2543Smrg  /* Create a single visual according to the Windows screen depth */
814706f2543Smrg  switch (pScreenInfo->dwDepth)
815706f2543Smrg    {
816706f2543Smrg    case 24:
817706f2543Smrg    case 16:
818706f2543Smrg    case 15:
819706f2543Smrg      /* Create the real visual */
820706f2543Smrg      if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
821706f2543Smrg				     TrueColorMask,
822706f2543Smrg				     pScreenPriv->dwBitsPerRGB,
823706f2543Smrg				     TrueColor,
824706f2543Smrg				     pScreenPriv->dwRedMask,
825706f2543Smrg				     pScreenPriv->dwGreenMask,
826706f2543Smrg				     pScreenPriv->dwBlueMask))
827706f2543Smrg	{
828706f2543Smrg	  ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
829706f2543Smrg		  "failed for TrueColor\n");
830706f2543Smrg	  return FALSE;
831706f2543Smrg	}
832706f2543Smrg
833706f2543Smrg#ifdef XWIN_EMULATEPSEUDO
834706f2543Smrg      if (!pScreenInfo->fEmulatePseudo)
835706f2543Smrg	break;
836706f2543Smrg
837706f2543Smrg      /* Setup a pseudocolor visual */
838706f2543Smrg      if (!miSetVisualTypesAndMasks (8,
839706f2543Smrg				     PseudoColorMask,
840706f2543Smrg				     8,
841706f2543Smrg				     -1,
842706f2543Smrg				     0,
843706f2543Smrg				     0,
844706f2543Smrg				     0))
845706f2543Smrg	{
846706f2543Smrg	  ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
847706f2543Smrg		  "failed for PseudoColor\n");
848706f2543Smrg	  return FALSE;
849706f2543Smrg	}
850706f2543Smrg#endif
851706f2543Smrg      break;
852706f2543Smrg
853706f2543Smrg    case 8:
854706f2543Smrg      if (!miSetVisualTypesAndMasks (pScreenInfo->dwDepth,
855706f2543Smrg				     pScreenInfo->fFullScreen
856706f2543Smrg				     ? PseudoColorMask : StaticColorMask,
857706f2543Smrg				     pScreenPriv->dwBitsPerRGB,
858706f2543Smrg				     pScreenInfo->fFullScreen
859706f2543Smrg				     ? PseudoColor : StaticColor,
860706f2543Smrg				     pScreenPriv->dwRedMask,
861706f2543Smrg				     pScreenPriv->dwGreenMask,
862706f2543Smrg				     pScreenPriv->dwBlueMask))
863706f2543Smrg	{
864706f2543Smrg	  ErrorF ("winInitVisualsShadowDD - miSetVisualTypesAndMasks "
865706f2543Smrg		  "failed\n");
866706f2543Smrg	  return FALSE;
867706f2543Smrg	}
868706f2543Smrg      break;
869706f2543Smrg
870706f2543Smrg    default:
871706f2543Smrg      ErrorF ("winInitVisualsShadowDD - Unknown screen depth\n");
872706f2543Smrg      return FALSE;
873706f2543Smrg    }
874706f2543Smrg
875706f2543Smrg#if CYGDEBUG
876706f2543Smrg  winDebug ("winInitVisualsShadowDD - Returning\n");
877706f2543Smrg#endif
878706f2543Smrg
879706f2543Smrg  return TRUE;
880706f2543Smrg}
881706f2543Smrg
882706f2543Smrg
883706f2543Smrg/*
884706f2543Smrg * Adjust the user proposed video mode
885706f2543Smrg */
886706f2543Smrg
887706f2543Smrgstatic Bool
888706f2543SmrgwinAdjustVideoModeShadowDD (ScreenPtr pScreen)
889706f2543Smrg{
890706f2543Smrg  winScreenPriv(pScreen);
891706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
892706f2543Smrg  HDC			hdc = NULL;
893706f2543Smrg  DWORD			dwBPP;
894706f2543Smrg
895706f2543Smrg  /* We're in serious trouble if we can't get a DC */
896706f2543Smrg  hdc = GetDC (NULL);
897706f2543Smrg  if (hdc == NULL)
898706f2543Smrg    {
899706f2543Smrg      ErrorF ("winAdjustVideoModeShadowDD - GetDC () failed\n");
900706f2543Smrg      return FALSE;
901706f2543Smrg    }
902706f2543Smrg
903706f2543Smrg  /* Query GDI for current display depth */
904706f2543Smrg  dwBPP = GetDeviceCaps (hdc, BITSPIXEL);
905706f2543Smrg
906706f2543Smrg  /* DirectDraw can only change the depth in fullscreen mode */
907706f2543Smrg  if (!(pScreenInfo->fFullScreen &&
908706f2543Smrg        (pScreenInfo->dwBPP != WIN_DEFAULT_BPP)))
909706f2543Smrg    {
910706f2543Smrg      /* Otherwise, We'll use GDI's depth */
911706f2543Smrg      pScreenInfo->dwBPP = dwBPP;
912706f2543Smrg    }
913706f2543Smrg
914706f2543Smrg  /* Release our DC */
915706f2543Smrg  ReleaseDC (NULL, hdc);
916706f2543Smrg  return TRUE;
917706f2543Smrg}
918706f2543Smrg
919706f2543Smrg
920706f2543Smrg/*
921706f2543Smrg * Blt exposed regions to the screen
922706f2543Smrg */
923706f2543Smrg
924706f2543Smrgstatic Bool
925706f2543SmrgwinBltExposedRegionsShadowDD (ScreenPtr pScreen)
926706f2543Smrg{
927706f2543Smrg  winScreenPriv(pScreen);
928706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
929706f2543Smrg  RECT			rcSrc, rcDest;
930706f2543Smrg  POINT			ptOrigin;
931706f2543Smrg  HDC			hdcUpdate = NULL;
932706f2543Smrg  PAINTSTRUCT		ps;
933706f2543Smrg  HRESULT		ddrval = DD_OK;
934706f2543Smrg  Bool			fReturn = TRUE;
935706f2543Smrg  Bool			fLocked = TRUE;
936706f2543Smrg  int			i;
937706f2543Smrg
938706f2543Smrg  /* BeginPaint gives us an hdc that clips to the invalidated region */
939706f2543Smrg  hdcUpdate = BeginPaint (pScreenPriv->hwndScreen, &ps);
940706f2543Smrg  if (hdcUpdate == NULL)
941706f2543Smrg    {
942706f2543Smrg      ErrorF ("winBltExposedRegionsShadowDD - BeginPaint () returned "
943706f2543Smrg	      "a NULL device context handle.  Aborting blit attempt.\n");
944706f2543Smrg      return FALSE;
945706f2543Smrg    }
946706f2543Smrg
947706f2543Smrg  /* Unlock the shadow surface, so we can blit */
948706f2543Smrg  ddrval = IDirectDrawSurface2_Unlock (pScreenPriv->pddsShadow, NULL);
949706f2543Smrg  if (FAILED (ddrval))
950706f2543Smrg    {
951706f2543Smrg      fReturn = FALSE;
952706f2543Smrg      goto winBltExposedRegionsShadowDD_Exit;
953706f2543Smrg    }
954706f2543Smrg  else
955706f2543Smrg    {
956706f2543Smrg      /* Flag that we have unlocked the shadow surface */
957706f2543Smrg      fLocked = FALSE;
958706f2543Smrg    }
959706f2543Smrg
960706f2543Smrg  /* Get the origin of the window in the screen coords */
961706f2543Smrg  ptOrigin.x = pScreenInfo->dwXOffset;
962706f2543Smrg  ptOrigin.y = pScreenInfo->dwYOffset;
963706f2543Smrg
964706f2543Smrg  MapWindowPoints (pScreenPriv->hwndScreen,
965706f2543Smrg		   HWND_DESKTOP,
966706f2543Smrg		   (LPPOINT)&ptOrigin, 1);
967706f2543Smrg  rcDest.left = ptOrigin.x;
968706f2543Smrg  rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
969706f2543Smrg  rcDest.top = ptOrigin.y;
970706f2543Smrg  rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
971706f2543Smrg
972706f2543Smrg  /* Source can be enter shadow surface, as Blt should clip */
973706f2543Smrg  rcSrc.left = 0;
974706f2543Smrg  rcSrc.top = 0;
975706f2543Smrg  rcSrc.right = pScreenInfo->dwWidth;
976706f2543Smrg  rcSrc.bottom = pScreenInfo->dwHeight;
977706f2543Smrg
978706f2543Smrg  /* Try to regain the primary surface and blit again if we've lost it */
979706f2543Smrg  for (i = 0; i <= WIN_REGAIN_SURFACE_RETRIES; ++i)
980706f2543Smrg    {
981706f2543Smrg      /* Our Blt should be clipped to the invalidated region */
982706f2543Smrg      ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
983706f2543Smrg					&rcDest,
984706f2543Smrg					pScreenPriv->pddsShadow,
985706f2543Smrg					&rcSrc,
986706f2543Smrg					DDBLT_WAIT,
987706f2543Smrg					NULL);
988706f2543Smrg      if (ddrval == DDERR_SURFACELOST)
989706f2543Smrg	{
990706f2543Smrg	  /* Surface was lost */
991706f2543Smrg	  ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
992706f2543Smrg		  "reported that the primary surface was lost, "
993706f2543Smrg		  "trying to restore, retry: %d\n", i + 1);
994706f2543Smrg
995706f2543Smrg	  /* Try to restore the surface, once */
996706f2543Smrg	  ddrval = IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
997706f2543Smrg	  ErrorF ("winBltExposedRegionsShadowDD - "
998706f2543Smrg		  "IDirectDrawSurface2_Restore returned: ");
999706f2543Smrg	  if (ddrval == DD_OK)
1000706f2543Smrg	    ErrorF ("DD_OK\n");
1001706f2543Smrg	  else if (ddrval == DDERR_WRONGMODE)
1002706f2543Smrg	    ErrorF ("DDERR_WRONGMODE\n");
1003706f2543Smrg	  else if (ddrval == DDERR_INCOMPATIBLEPRIMARY)
1004706f2543Smrg	    ErrorF ("DDERR_INCOMPATIBLEPRIMARY\n");
1005706f2543Smrg	  else if (ddrval == DDERR_UNSUPPORTED)
1006706f2543Smrg	    ErrorF ("DDERR_UNSUPPORTED\n");
1007706f2543Smrg	  else if (ddrval == DDERR_INVALIDPARAMS)
1008706f2543Smrg	    ErrorF ("DDERR_INVALIDPARAMS\n");
1009706f2543Smrg	  else if (ddrval == DDERR_INVALIDOBJECT)
1010706f2543Smrg	    ErrorF ("DDERR_INVALIDOBJECT\n");
1011706f2543Smrg	  else
1012706f2543Smrg	    ErrorF ("unknown error: %08x\n", (unsigned int) ddrval);
1013706f2543Smrg
1014706f2543Smrg	  /* Loop around to try the blit one more time */
1015706f2543Smrg	  continue;
1016706f2543Smrg	}
1017706f2543Smrg      else if (FAILED (ddrval))
1018706f2543Smrg	{
1019706f2543Smrg	  fReturn = FALSE;
1020706f2543Smrg	  ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Blt "
1021706f2543Smrg		  "failed, but surface not lost: %08x %d\n",
1022706f2543Smrg		  (unsigned int) ddrval, (int) ddrval);
1023706f2543Smrg	  goto winBltExposedRegionsShadowDD_Exit;
1024706f2543Smrg	}
1025706f2543Smrg      else
1026706f2543Smrg	{
1027706f2543Smrg	  /* Success, stop looping */
1028706f2543Smrg	  break;
1029706f2543Smrg	}
1030706f2543Smrg    }
1031706f2543Smrg
1032706f2543Smrg  /* Relock the shadow surface */
1033706f2543Smrg  ddrval = IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
1034706f2543Smrg				     NULL,
1035706f2543Smrg				     pScreenPriv->pddsdShadow,
1036706f2543Smrg				     DDLOCK_WAIT,
1037706f2543Smrg				     NULL);
1038706f2543Smrg  if (FAILED (ddrval))
1039706f2543Smrg    {
1040706f2543Smrg      fReturn = FALSE;
1041706f2543Smrg      ErrorF ("winBltExposedRegionsShadowDD - IDirectDrawSurface2_Lock "
1042706f2543Smrg	      "failed\n");
1043706f2543Smrg      goto winBltExposedRegionsShadowDD_Exit;
1044706f2543Smrg    }
1045706f2543Smrg  else
1046706f2543Smrg    {
1047706f2543Smrg      /* Indicate that we have relocked the shadow surface */
1048706f2543Smrg      fLocked = TRUE;
1049706f2543Smrg    }
1050706f2543Smrg
1051706f2543Smrg  /* Has our memory pointer changed? */
1052706f2543Smrg  if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
1053706f2543Smrg    winUpdateFBPointer (pScreen,
1054706f2543Smrg			pScreenPriv->pddsdShadow->lpSurface);
1055706f2543Smrg
1056706f2543Smrg winBltExposedRegionsShadowDD_Exit:
1057706f2543Smrg  /* EndPaint frees the DC */
1058706f2543Smrg  if (hdcUpdate != NULL)
1059706f2543Smrg    EndPaint (pScreenPriv->hwndScreen, &ps);
1060706f2543Smrg
1061706f2543Smrg  /*
1062706f2543Smrg   * Relock the surface if it is not locked.  We don't care if locking fails,
1063706f2543Smrg   * as it will cause the server to shutdown within a few more operations.
1064706f2543Smrg   */
1065706f2543Smrg  if (!fLocked)
1066706f2543Smrg    {
1067706f2543Smrg      IDirectDrawSurface2_Lock (pScreenPriv->pddsShadow,
1068706f2543Smrg				NULL,
1069706f2543Smrg				pScreenPriv->pddsdShadow,
1070706f2543Smrg				DDLOCK_WAIT,
1071706f2543Smrg				NULL);
1072706f2543Smrg
1073706f2543Smrg      /* Has our memory pointer changed? */
1074706f2543Smrg      if (pScreenInfo->pfb != pScreenPriv->pddsdShadow->lpSurface)
1075706f2543Smrg	winUpdateFBPointer (pScreen,
1076706f2543Smrg			    pScreenPriv->pddsdShadow->lpSurface);
1077706f2543Smrg
1078706f2543Smrg      fLocked = TRUE;
1079706f2543Smrg    }
1080706f2543Smrg  return fReturn;
1081706f2543Smrg}
1082706f2543Smrg
1083706f2543Smrg
1084706f2543Smrg/*
1085706f2543Smrg * Do any engine-specific appliation-activation processing
1086706f2543Smrg */
1087706f2543Smrg
1088706f2543Smrgstatic Bool
1089706f2543SmrgwinActivateAppShadowDD (ScreenPtr pScreen)
1090706f2543Smrg{
1091706f2543Smrg  winScreenPriv(pScreen);
1092706f2543Smrg
1093706f2543Smrg  /*
1094706f2543Smrg   * Do we have a surface?
1095706f2543Smrg   * Are we active?
1096706f2543Smrg   * Are we fullscreen?
1097706f2543Smrg   */
1098706f2543Smrg  if (pScreenPriv != NULL
1099706f2543Smrg      && pScreenPriv->pddsPrimary != NULL
1100706f2543Smrg      && pScreenPriv->fActive)
1101706f2543Smrg    {
1102706f2543Smrg      /* Primary surface was lost, restore it */
1103706f2543Smrg      IDirectDrawSurface2_Restore (pScreenPriv->pddsPrimary);
1104706f2543Smrg    }
1105706f2543Smrg
1106706f2543Smrg  return TRUE;
1107706f2543Smrg}
1108706f2543Smrg
1109706f2543Smrg
1110706f2543Smrg/*
1111706f2543Smrg * Reblit the shadow framebuffer to the screen.
1112706f2543Smrg */
1113706f2543Smrg
1114706f2543Smrgstatic Bool
1115706f2543SmrgwinRedrawScreenShadowDD (ScreenPtr pScreen)
1116706f2543Smrg{
1117706f2543Smrg  winScreenPriv(pScreen);
1118706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
1119706f2543Smrg  HRESULT		ddrval = DD_OK;
1120706f2543Smrg  RECT			rcSrc, rcDest;
1121706f2543Smrg  POINT			ptOrigin;
1122706f2543Smrg
1123706f2543Smrg  /* Get the origin of the window in the screen coords */
1124706f2543Smrg  ptOrigin.x = pScreenInfo->dwXOffset;
1125706f2543Smrg  ptOrigin.y = pScreenInfo->dwYOffset;
1126706f2543Smrg  MapWindowPoints (pScreenPriv->hwndScreen,
1127706f2543Smrg		   HWND_DESKTOP,
1128706f2543Smrg		   (LPPOINT)&ptOrigin, 1);
1129706f2543Smrg  rcDest.left = ptOrigin.x;
1130706f2543Smrg  rcDest.right = ptOrigin.x + pScreenInfo->dwWidth;
1131706f2543Smrg  rcDest.top = ptOrigin.y;
1132706f2543Smrg  rcDest.bottom = ptOrigin.y + pScreenInfo->dwHeight;
1133706f2543Smrg
1134706f2543Smrg  /* Source can be entire shadow surface, as Blt should clip for us */
1135706f2543Smrg  rcSrc.left = 0;
1136706f2543Smrg  rcSrc.top = 0;
1137706f2543Smrg  rcSrc.right = pScreenInfo->dwWidth;
1138706f2543Smrg  rcSrc.bottom = pScreenInfo->dwHeight;
1139706f2543Smrg
1140706f2543Smrg  /* Redraw the whole window, to take account for the new colors */
1141706f2543Smrg  ddrval = IDirectDrawSurface2_Blt (pScreenPriv->pddsPrimary,
1142706f2543Smrg				    &rcDest,
1143706f2543Smrg				    pScreenPriv->pddsShadow,
1144706f2543Smrg				    &rcSrc,
1145706f2543Smrg				    DDBLT_WAIT,
1146706f2543Smrg				    NULL);
1147706f2543Smrg  if (FAILED (ddrval))
1148706f2543Smrg    {
1149706f2543Smrg      ErrorF ("winRedrawScreenShadowDD - IDirectDrawSurface_Blt () "
1150706f2543Smrg	      "failed: %08x\n",
1151706f2543Smrg	      (unsigned int) ddrval);
1152706f2543Smrg    }
1153706f2543Smrg
1154706f2543Smrg  return TRUE;
1155706f2543Smrg}
1156706f2543Smrg
1157706f2543Smrg
1158706f2543Smrg/*
1159706f2543Smrg * Realize the currently installed colormap
1160706f2543Smrg */
1161706f2543Smrg
1162706f2543Smrgstatic Bool
1163706f2543SmrgwinRealizeInstalledPaletteShadowDD (ScreenPtr pScreen)
1164706f2543Smrg{
1165706f2543Smrg  return TRUE;
1166706f2543Smrg}
1167706f2543Smrg
1168706f2543Smrg
1169706f2543Smrg/*
1170706f2543Smrg * Install the specified colormap
1171706f2543Smrg */
1172706f2543Smrg
1173706f2543Smrgstatic Bool
1174706f2543SmrgwinInstallColormapShadowDD (ColormapPtr pColormap)
1175706f2543Smrg{
1176706f2543Smrg  ScreenPtr		pScreen = pColormap->pScreen;
1177706f2543Smrg  winScreenPriv(pScreen);
1178706f2543Smrg  winCmapPriv(pColormap);
1179706f2543Smrg  HRESULT		ddrval = DD_OK;
1180706f2543Smrg
1181706f2543Smrg  /* Install the DirectDraw palette on the primary surface */
1182706f2543Smrg  ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
1183706f2543Smrg					   pCmapPriv->lpDDPalette);
1184706f2543Smrg  if (FAILED (ddrval))
1185706f2543Smrg    {
1186706f2543Smrg      ErrorF ("winInstallColormapShadowDD - Failed installing the "
1187706f2543Smrg	      "DirectDraw palette.\n");
1188706f2543Smrg      return FALSE;
1189706f2543Smrg    }
1190706f2543Smrg
1191706f2543Smrg  /* Save a pointer to the newly installed colormap */
1192706f2543Smrg  pScreenPriv->pcmapInstalled = pColormap;
1193706f2543Smrg
1194706f2543Smrg  return TRUE;
1195706f2543Smrg}
1196706f2543Smrg
1197706f2543Smrg
1198706f2543Smrg/*
1199706f2543Smrg * Store the specified colors in the specified colormap
1200706f2543Smrg */
1201706f2543Smrg
1202706f2543Smrgstatic Bool
1203706f2543SmrgwinStoreColorsShadowDD (ColormapPtr pColormap,
1204706f2543Smrg			int ndef,
1205706f2543Smrg			xColorItem *pdefs)
1206706f2543Smrg{
1207706f2543Smrg  ScreenPtr		pScreen = pColormap->pScreen;
1208706f2543Smrg  winScreenPriv(pScreen);
1209706f2543Smrg  winCmapPriv(pColormap);
1210706f2543Smrg  ColormapPtr		curpmap = pScreenPriv->pcmapInstalled;
1211706f2543Smrg  HRESULT		ddrval = DD_OK;
1212706f2543Smrg
1213706f2543Smrg  /* Put the X colormap entries into the Windows logical palette */
1214706f2543Smrg  ddrval = IDirectDrawPalette_SetEntries (pCmapPriv->lpDDPalette,
1215706f2543Smrg					  0,
1216706f2543Smrg					  pdefs[0].pixel,
1217706f2543Smrg					  ndef,
1218706f2543Smrg					  pCmapPriv->peColors
1219706f2543Smrg					  + pdefs[0].pixel);
1220706f2543Smrg  if (FAILED (ddrval))
1221706f2543Smrg    {
1222706f2543Smrg      ErrorF ("winStoreColorsShadowDD - SetEntries () failed\n");
1223706f2543Smrg      return FALSE;
1224706f2543Smrg    }
1225706f2543Smrg
1226706f2543Smrg  /* Don't install the DirectDraw palette if the colormap is not installed */
1227706f2543Smrg  if (pColormap != curpmap)
1228706f2543Smrg    {
1229706f2543Smrg      return TRUE;
1230706f2543Smrg    }
1231706f2543Smrg
1232706f2543Smrg  if (!winInstallColormapShadowDD (pColormap))
1233706f2543Smrg    {
1234706f2543Smrg      ErrorF ("winStoreColorsShadowDD - Failed installing colormap\n");
1235706f2543Smrg      return FALSE;
1236706f2543Smrg    }
1237706f2543Smrg
1238706f2543Smrg  return TRUE;
1239706f2543Smrg}
1240706f2543Smrg
1241706f2543Smrg
1242706f2543Smrg/*
1243706f2543Smrg * Colormap initialization procedure
1244706f2543Smrg */
1245706f2543Smrg
1246706f2543Smrgstatic Bool
1247706f2543SmrgwinCreateColormapShadowDD (ColormapPtr pColormap)
1248706f2543Smrg{
1249706f2543Smrg  HRESULT		ddrval = DD_OK;
1250706f2543Smrg  ScreenPtr		pScreen = pColormap->pScreen;
1251706f2543Smrg  winScreenPriv(pScreen);
1252706f2543Smrg  winCmapPriv(pColormap);
1253706f2543Smrg
1254706f2543Smrg  /* Create a DirectDraw palette */
1255706f2543Smrg  ddrval = IDirectDraw2_CreatePalette (pScreenPriv->pdd,
1256706f2543Smrg				       DDPCAPS_8BIT | DDPCAPS_ALLOW256,
1257706f2543Smrg				       pCmapPriv->peColors,
1258706f2543Smrg				       &pCmapPriv->lpDDPalette,
1259706f2543Smrg				       NULL);
1260706f2543Smrg  if (FAILED (ddrval))
1261706f2543Smrg    {
1262706f2543Smrg      ErrorF ("winCreateColormapShadowDD - CreatePalette failed\n");
1263706f2543Smrg      return FALSE;
1264706f2543Smrg    }
1265706f2543Smrg
1266706f2543Smrg  return TRUE;
1267706f2543Smrg}
1268706f2543Smrg
1269706f2543Smrg
1270706f2543Smrg/*
1271706f2543Smrg * Colormap destruction procedure
1272706f2543Smrg */
1273706f2543Smrg
1274706f2543Smrgstatic Bool
1275706f2543SmrgwinDestroyColormapShadowDD (ColormapPtr pColormap)
1276706f2543Smrg{
1277706f2543Smrg  winScreenPriv(pColormap->pScreen);
1278706f2543Smrg  winCmapPriv(pColormap);
1279706f2543Smrg  HRESULT		ddrval = DD_OK;
1280706f2543Smrg
1281706f2543Smrg  /*
1282706f2543Smrg   * Is colormap to be destroyed the default?
1283706f2543Smrg   *
1284706f2543Smrg   * Non-default colormaps should have had winUninstallColormap
1285706f2543Smrg   * called on them before we get here.  The default colormap
1286706f2543Smrg   * will not have had winUninstallColormap called on it.  Thus,
1287706f2543Smrg   * we need to handle the default colormap in a special way.
1288706f2543Smrg   */
1289706f2543Smrg  if (pColormap->flags & IsDefault)
1290706f2543Smrg    {
1291706f2543Smrg#if CYGDEBUG
1292706f2543Smrg      winDebug ("winDestroyColormapShadowDD - Destroying default "
1293706f2543Smrg	      "colormap\n");
1294706f2543Smrg#endif
1295706f2543Smrg
1296706f2543Smrg      /*
1297706f2543Smrg       * FIXME: Walk the list of all screens, popping the default
1298706f2543Smrg       * palette out of each screen device context.
1299706f2543Smrg       */
1300706f2543Smrg
1301706f2543Smrg      /* Pop the palette out of the primary surface */
1302706f2543Smrg      ddrval = IDirectDrawSurface2_SetPalette (pScreenPriv->pddsPrimary,
1303706f2543Smrg					       NULL);
1304706f2543Smrg      if (FAILED (ddrval))
1305706f2543Smrg	{
1306706f2543Smrg	  ErrorF ("winDestroyColormapShadowDD - Failed freeing the "
1307706f2543Smrg		  "default colormap DirectDraw palette.\n");
1308706f2543Smrg	  return FALSE;
1309706f2543Smrg	}
1310706f2543Smrg
1311706f2543Smrg      /* Clear our private installed colormap pointer */
1312706f2543Smrg      pScreenPriv->pcmapInstalled = NULL;
1313706f2543Smrg    }
1314706f2543Smrg
1315706f2543Smrg  /* Release the palette */
1316706f2543Smrg  IDirectDrawPalette_Release (pCmapPriv->lpDDPalette);
1317706f2543Smrg
1318706f2543Smrg  /* Invalidate the colormap privates */
1319706f2543Smrg  pCmapPriv->lpDDPalette = NULL;
1320706f2543Smrg
1321706f2543Smrg  return TRUE;
1322706f2543Smrg}
1323706f2543Smrg
1324706f2543Smrg
1325706f2543Smrg/*
1326706f2543Smrg * Set engine specific functions
1327706f2543Smrg */
1328706f2543Smrg
1329706f2543SmrgBool
1330706f2543SmrgwinSetEngineFunctionsShadowDD (ScreenPtr pScreen)
1331706f2543Smrg{
1332706f2543Smrg  winScreenPriv(pScreen);
1333706f2543Smrg  winScreenInfo		*pScreenInfo = pScreenPriv->pScreenInfo;
1334706f2543Smrg
1335706f2543Smrg  /* Set our pointers */
1336706f2543Smrg  pScreenPriv->pwinAllocateFB = winAllocateFBShadowDD;
1337706f2543Smrg  pScreenPriv->pwinFreeFB = winFreeFBShadowDD;
1338706f2543Smrg  pScreenPriv->pwinShadowUpdate = winShadowUpdateDD;
1339706f2543Smrg  pScreenPriv->pwinInitScreen = winInitScreenShadowDD;
1340706f2543Smrg  pScreenPriv->pwinCloseScreen = winCloseScreenShadowDD;
1341706f2543Smrg  pScreenPriv->pwinInitVisuals = winInitVisualsShadowDD;
1342706f2543Smrg  pScreenPriv->pwinAdjustVideoMode = winAdjustVideoModeShadowDD;
1343706f2543Smrg  if (pScreenInfo->fFullScreen)
1344706f2543Smrg    pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowFullScreen;
1345706f2543Smrg  else
1346706f2543Smrg    pScreenPriv->pwinCreateBoundingWindow = winCreateBoundingWindowWindowed;
1347706f2543Smrg  pScreenPriv->pwinFinishScreenInit = winFinishScreenInitFB;
1348706f2543Smrg  pScreenPriv->pwinBltExposedRegions = winBltExposedRegionsShadowDD;
1349706f2543Smrg  pScreenPriv->pwinActivateApp = winActivateAppShadowDD;
1350706f2543Smrg  pScreenPriv->pwinRedrawScreen = winRedrawScreenShadowDD;
1351706f2543Smrg  pScreenPriv->pwinRealizeInstalledPalette
1352706f2543Smrg    = winRealizeInstalledPaletteShadowDD;
1353706f2543Smrg  pScreenPriv->pwinInstallColormap = winInstallColormapShadowDD;
1354706f2543Smrg  pScreenPriv->pwinStoreColors = winStoreColorsShadowDD;
1355706f2543Smrg  pScreenPriv->pwinCreateColormap = winCreateColormapShadowDD;
1356706f2543Smrg  pScreenPriv->pwinDestroyColormap = winDestroyColormapShadowDD;
1357706f2543Smrg  pScreenPriv->pwinHotKeyAltTab = (winHotKeyAltTabProcPtr) (void (*)(void))NoopDDA;
1358706f2543Smrg  pScreenPriv->pwinCreatePrimarySurface = winCreatePrimarySurfaceShadowDD;
1359706f2543Smrg  pScreenPriv->pwinReleasePrimarySurface = winReleasePrimarySurfaceShadowDD;
1360706f2543Smrg#ifdef XWIN_MULTIWINDOW
1361706f2543Smrg  pScreenPriv->pwinFinishCreateWindowsWindow =
1362706f2543Smrg    (winFinishCreateWindowsWindowProcPtr) (void (*)(void))NoopDDA;
1363706f2543Smrg#endif
1364706f2543Smrg
1365706f2543Smrg  return TRUE;
1366706f2543Smrg}
1367