Added some missing definitions.
[wine/multimedia.git] / dlls / ddraw / dsurface / dga2.c
blobb253fa02cb06fa90df0879da84ad05c98542b694
1 /* DirectDrawSurface XF86DGA implementation
3 * DGA2's specific DirectDrawSurface routines
4 */
5 #include "config.h"
6 #include "winerror.h"
8 #include <unistd.h>
9 #include <assert.h>
10 #include <fcntl.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <stdio.h>
15 #include "debugtools.h"
16 #include "dga2_private.h"
17 #include "bitmap.h"
19 DEFAULT_DEBUG_CHANNEL(ddraw);
21 #define DDPRIVATE(x) dga2_dd_private *ddpriv = ((dga2_dd_private*)(x)->d->private)
22 #define DPPRIVATE(x) dga2_dp_private *dppriv = ((dga2_dp_private*)(x)->private)
23 #define DSPRIVATE(x) dga2_ds_private *dspriv = ((dga2_ds_private*)(x)->private)
25 static BYTE DGA2_TouchSurface(LPDIRECTDRAWSURFACE4 iface)
27 ICOM_THIS(IDirectDrawSurface4Impl,iface);
28 /* if the DIB section is in GdiMod state, we must
29 * touch the surface to get any updates from the DIB */
30 return *(BYTE*)(This->s.surface_desc.u1.lpSurface);
33 HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_Flip(
34 LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
35 ) {
36 ICOM_THIS(IDirectDrawSurface4Impl,iface);
37 IDirectDrawSurface4Impl* iflipto=(IDirectDrawSurface4Impl*)flipto;
38 DWORD xheight;
39 DSPRIVATE(This);
40 dga_ds_private *fspriv;
41 LPBYTE surf;
43 TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
45 DGA2_TouchSurface(iface);
46 iflipto = _common_find_flipto(This,iflipto);
48 /* and flip! */
49 fspriv = (dga_ds_private*)iflipto->private;
50 TSXDGASetViewport(display,DefaultScreen(display),0,fspriv->fb_height, XDGAFlipRetrace);
51 TSXDGASync(display,DefaultScreen(display));
52 TSXFlush(display);
53 if (iflipto->s.palette) {
54 DPPRIVATE(iflipto->s.palette);
55 if (dppriv->cm)
56 TSXDGAInstallColormap(display,DefaultScreen(display),dppriv->cm);
59 /* We need to switch the lowlevel surfaces, for DGA this is: */
60 /* The height within the framebuffer */
61 xheight = dspriv->fb_height;
62 dspriv->fb_height = fspriv->fb_height;
63 fspriv->fb_height = xheight;
65 /* And the assciated surface pointer */
66 surf = This->s.surface_desc.u1.lpSurface;
67 This->s.surface_desc.u1.lpSurface = iflipto->s.surface_desc.u1.lpSurface;
68 iflipto->s.surface_desc.u1.lpSurface = surf;
70 return DD_OK;
73 HRESULT WINAPI DGA2_IDirectDrawSurface4Impl_SetPalette(
74 LPDIRECTDRAWSURFACE4 iface,LPDIRECTDRAWPALETTE pal
75 ) {
76 ICOM_THIS(IDirectDrawSurface4Impl,iface);
77 DDPRIVATE(This->s.ddraw);
78 IDirectDrawPaletteImpl* ipal=(IDirectDrawPaletteImpl*)pal;
80 TRACE("(%p)->(%p)\n",This,ipal);
82 /* According to spec, we are only supposed to
83 * AddRef if this is not the same palette.
85 if( This->s.palette != ipal ) {
86 dga_dp_private *fppriv;
87 if( ipal != NULL )
88 IDirectDrawPalette_AddRef( (IDirectDrawPalette*)ipal );
89 if( This->s.palette != NULL )
90 IDirectDrawPalette_Release( (IDirectDrawPalette*)This->s.palette );
91 This->s.palette = ipal;
92 fppriv = (dga_dp_private*)This->s.palette->private;
94 if (!fppriv->cm &&
95 (This->s.ddraw->d->screen_pixelformat.u.dwRGBBitCount<=8) ) {
96 int i;
98 /* Delayed palette creation */
99 fppriv->cm = TSXDGACreateColormap(display,DefaultScreen(display), ddpriv->dev, AllocAll);
101 for (i=0;i<256;i++) {
102 XColor xc;
104 xc.red = ipal->palents[i].peRed<<8;
105 xc.blue = ipal->palents[i].peBlue<<8;
106 xc.green = ipal->palents[i].peGreen<<8;
107 xc.flags = DoRed|DoBlue|DoGreen;
108 xc.pixel = i;
109 TSXStoreColor(display,fppriv->cm,&xc);
113 TSXDGAInstallColormap(display,DefaultScreen(display),fppriv->cm);
115 if (This->s.hdc != 0) {
116 /* hack: set the DIBsection color map */
117 BITMAPOBJ *bmp = (BITMAPOBJ *) GDI_GetObjPtr(This->s.DIBsection, BITMAP_MAGIC);
118 X11DRV_DIBSECTION *dib = (X11DRV_DIBSECTION *)bmp->dib;
119 dib->colorMap = This->s.palette ? This->s.palette->screen_palents : NULL;
120 GDI_ReleaseObj(This->s.DIBsection);
122 TSXFlush(display);
124 return DD_OK;
128 ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt =
130 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
131 IDirectDrawSurface4Impl_QueryInterface,
132 IDirectDrawSurface4Impl_AddRef,
133 DGA_IDirectDrawSurface4Impl_Release,
134 IDirectDrawSurface4Impl_AddAttachedSurface,
135 IDirectDrawSurface4Impl_AddOverlayDirtyRect,
136 IDirectDrawSurface4Impl_Blt,
137 IDirectDrawSurface4Impl_BltBatch,
138 IDirectDrawSurface4Impl_BltFast,
139 IDirectDrawSurface4Impl_DeleteAttachedSurface,
140 IDirectDrawSurface4Impl_EnumAttachedSurfaces,
141 IDirectDrawSurface4Impl_EnumOverlayZOrders,
142 DGA2_IDirectDrawSurface4Impl_Flip,
143 IDirectDrawSurface4Impl_GetAttachedSurface,
144 IDirectDrawSurface4Impl_GetBltStatus,
145 IDirectDrawSurface4Impl_GetCaps,
146 IDirectDrawSurface4Impl_GetClipper,
147 IDirectDrawSurface4Impl_GetColorKey,
148 DGA_IDirectDrawSurface4Impl_GetDC,
149 IDirectDrawSurface4Impl_GetFlipStatus,
150 IDirectDrawSurface4Impl_GetOverlayPosition,
151 IDirectDrawSurface4Impl_GetPalette,
152 IDirectDrawSurface4Impl_GetPixelFormat,
153 IDirectDrawSurface4Impl_GetSurfaceDesc,
154 IDirectDrawSurface4Impl_Initialize,
155 IDirectDrawSurface4Impl_IsLost,
156 IDirectDrawSurface4Impl_Lock,
157 IDirectDrawSurface4Impl_ReleaseDC,
158 IDirectDrawSurface4Impl_Restore,
159 IDirectDrawSurface4Impl_SetClipper,
160 IDirectDrawSurface4Impl_SetColorKey,
161 IDirectDrawSurface4Impl_SetOverlayPosition,
162 DGA2_IDirectDrawSurface4Impl_SetPalette,
163 DGA_IDirectDrawSurface4Impl_Unlock,
164 IDirectDrawSurface4Impl_UpdateOverlay,
165 IDirectDrawSurface4Impl_UpdateOverlayDisplay,
166 IDirectDrawSurface4Impl_UpdateOverlayZOrder,
167 IDirectDrawSurface4Impl_GetDDInterface,
168 IDirectDrawSurface4Impl_PageLock,
169 IDirectDrawSurface4Impl_PageUnlock,
170 IDirectDrawSurface4Impl_SetSurfaceDesc,
171 IDirectDrawSurface4Impl_SetPrivateData,
172 IDirectDrawSurface4Impl_GetPrivateData,
173 IDirectDrawSurface4Impl_FreePrivateData,
174 IDirectDrawSurface4Impl_GetUniquenessValue,
175 IDirectDrawSurface4Impl_ChangeUniquenessValue