IDirectDrawSurface::Blt::SRCCOPY is the default ROP operation, do not
[wine] / dlls / ddraw / dsurface / dga2.c
1 /*              DirectDrawSurface XF86DGA implementation
2  *
3  * DGA2's specific DirectDrawSurface routines
4  */
5 #include "config.h"
6 #include "winerror.h"
7
8 #include <unistd.h>
9 #include <assert.h>
10 #include <fcntl.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14
15 #include "debugtools.h"
16 #include "dga2_private.h"
17 #include "bitmap.h"
18
19 DEFAULT_DEBUG_CHANNEL(ddraw);
20
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)
24
25 static BYTE DGA2_TouchSurface(LPDIRECTDRAWSURFACE4 iface)
26 {   
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);
31 }
32
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;
42
43     TRACE("(%p)->Flip(%p,%08lx)\n",This,iflipto,dwFlags);
44
45     DGA2_TouchSurface(iface);
46     iflipto = _common_find_flipto(This,iflipto);
47
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);
57     }
58
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;
64
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;
69
70     return DD_OK;
71 }
72
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;
79
80     TRACE("(%p)->(%p)\n",This,ipal);
81
82     /* According to spec, we are only supposed to 
83      * AddRef if this is not the same palette.
84      */
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;
93
94         if (!fppriv->cm &&
95             (This->s.ddraw->d->screen_pixelformat.u.dwRGBBitCount<=8) ) {
96           int i;
97           
98           /* Delayed palette creation */
99           fppriv->cm = TSXDGACreateColormap(display,DefaultScreen(display), ddpriv->dev, AllocAll);
100             
101           for (i=0;i<256;i++) {
102             XColor xc;
103             
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);
110           }
111         }
112
113         TSXDGAInstallColormap(display,DefaultScreen(display),fppriv->cm);
114
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);
121         }
122         TSXFlush(display);
123     }
124     return DD_OK;
125 }
126
127
128 ICOM_VTABLE(IDirectDrawSurface4) dga2_dds4vt = 
129 {
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
176 };