3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS DirectX
5 * FILE: ddraw/surface/callbacks_surf_hel.c
6 * PURPOSE: HEL Callbacks For Surface APIs
7 * PROGRAMMER: Magnus Olsen
13 DWORD CALLBACK
HelDdSurfAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA lpDestroySurface
)
18 DWORD CALLBACK
HelDdSurfBlt(LPDDHAL_BLTDATA lpBltData
)
22 if (lpBltData
->dwFlags
& DDBLT_COLORFILL
)
24 HBRUSH hbr
= CreateSolidBrush(lpBltData
->bltFX
.dwFillColor
);
25 FillRect( (HDC
)lpBltData
->lpDDDestSurface
->lpSurfMore
->lpDD_lcl
->hDC
,
26 (CONST RECT
*)&lpBltData
->rDest
,
29 lpBltData
->ddRVal
= DD_OK
;
31 else if (lpBltData
->dwFlags
& DDBLT_ROP
)
33 BitBlt( (HDC
)lpBltData
->lpDDDestSurface
->lpSurfMore
->lpDD_lcl
->hDC
,
35 lpBltData
->rDest
.left
,
36 lpBltData
->rDest
.right
,
37 lpBltData
->rDest
.bottom
,
38 (HDC
)lpBltData
->lpDDSrcSurface
->lpSurfMore
->lpDD_lcl
->hDC
,
40 lpBltData
->rSrc
.right
,
41 lpBltData
->bltFX
.dwROP
);
42 lpBltData
->ddRVal
= DD_OK
;
44 return DDHAL_DRIVER_HANDLED
;
47 DWORD CALLBACK
HelDdSurfDestroySurface(LPDDHAL_DESTROYSURFACEDATA lpDestroySurfaceData
)
52 DWORD CALLBACK
HelDdSurfFlip(LPDDHAL_FLIPDATA lpFlipData
)
57 DWORD CALLBACK
HelDdSurfGetBltStatus(LPDDHAL_GETBLTSTATUSDATA lpGetBltStatusData
)
62 DWORD CALLBACK
HelDdSurfGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA lpGetFlipStatusData
)
67 DWORD CALLBACK
HelDdSurfLock(LPDDHAL_LOCKDATA lpLockData
)
71 HBITMAP hImage
= NULL
;
74 LPDWORD pixels
= NULL
;
77 HBITMAP hDCBmp
= NULL
;
82 /* ToDo tell ddraw internal this surface is locked */
83 /* ToDo add support for dwFlags */
86 /* Get our hdc for the active window */
87 hDC
= GetDC((HWND
)lpLockData
->lpDDSurface
->lpSurfMore
->lpDD_lcl
->hFocusWnd
);
91 /* Create a memory bitmap to store a copy of current hdc surface */
93 if (!lpLockData
->bHasRect
)
95 hImage
= CreateCompatibleBitmap (hDC
, lpLockData
->lpDDSurface
->lpGbl
->wWidth
, lpLockData
->lpDDSurface
->lpGbl
->wHeight
);
99 hImage
= CreateCompatibleBitmap (hDC
, lpLockData
->rArea
.right
, lpLockData
->rArea
.bottom
);
102 /* Create a memory hdc so we can draw on our current memory bitmap */
103 hMemDC
= CreateCompatibleDC(hDC
);
107 /* Select our memory bitmap to our memory hdc */
108 hDCBmp
= (HBITMAP
) SelectObject (hMemDC
, hImage
);
110 /* Get our memory bitmap information */
111 GetObject(hImage
, sizeof(BITMAP
), &bm
);
113 if (!lpLockData
->bHasRect
)
115 BitBlt (hMemDC
, 0, 0, bm
.bmWidth
, bm
.bmHeight
, hDC
, 0, 0, SRCCOPY
);
119 BitBlt (hMemDC
, lpLockData
->rArea
.top
, lpLockData
->rArea
.left
, lpLockData
->rArea
.right
, lpLockData
->rArea
.bottom
, hDC
, 0, 0, SRCCOPY
);
122 SelectObject (hMemDC
, hDCBmp
);
124 /* Allocate memory buffer for the bitmap pixel data */
125 cbBuffer
= bm
.bmWidthBytes
* bm
.bmHeight
;
126 pixels
= (PDWORD
) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, cbBuffer
);
130 /* Get the bitmap bits */
131 GetBitmapBits(hImage
,cbBuffer
,pixels
);
133 /* Fixme HACK - check which member stores the HEL bitmap buffer */
134 lpLockData
->lpDDSurface
->lpSurfMore
->lpDDRAWReserved2
= pixels
;
136 /* Setup return value */
137 lpLockData
->ddRVal
= DD_OK
;
138 lpLockData
->lpSurfData
= pixels
;
144 /* Free the pixels buffer if we fail */
145 if ( (pixels
!= NULL
) &&
146 (lpLockData
->ddRVal
!= DD_OK
) )
148 HeapFree(GetProcessHeap(), 0, pixels
);
151 /* Cleanup after us */
154 DeleteObject (hImage
);
162 return DDHAL_DRIVER_HANDLED
;
165 DWORD CALLBACK
HelDdSurfreserved4(DWORD
*lpPtr
)
167 /* This api is not doucmented by MS, keep it stubbed */
171 DWORD CALLBACK
HelDdSurfSetClipList(LPDDHAL_SETCLIPLISTDATA lpSetClipListData
)
176 DWORD CALLBACK
HelDdSurfSetColorKey(LPDDHAL_SETCOLORKEYDATA lpSetColorKeyData
)
181 DWORD CALLBACK
HelDdSurfSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA lpSetOverlayPositionData
)
186 DWORD CALLBACK
HelDdSurfSetPalette(LPDDHAL_SETPALETTEDATA lpSetPaletteData
)
191 DWORD CALLBACK
HelDdSurfUnlock(LPDDHAL_UNLOCKDATA lpUnLockData
)
194 HBITMAP hImage
= NULL
;
197 HBITMAP hDCBmp
= NULL
;
202 /* Get our hdc for the active window */
203 hDC
= GetDC((HWND
)lpUnLockData
->lpDDSurface
->lpSurfMore
->lpDD_lcl
->hFocusWnd
);
207 /* Create a memory bitmap to store a copy of current hdc surface */
209 /* fixme the rcarea are not store in the struct yet so the data will look corupted */
210 hImage
= CreateCompatibleBitmap (hDC
, lpUnLockData
->lpDDSurface
->lpGbl
->wWidth
, lpUnLockData
->lpDDSurface
->lpGbl
->wHeight
);
212 /* Create a memory hdc so we can draw on our current memory bitmap */
213 hMemDC
= CreateCompatibleDC(hDC
);
217 /* Select our memory bitmap to our memory hdc */
218 hDCBmp
= (HBITMAP
) SelectObject (hMemDC
, hImage
);
220 /* Get our memory bitmap information */
221 GetObject(hImage
, sizeof(BITMAP
), &bm
);
223 SetBitmapBits(hImage
,bm
.bmWidthBytes
* bm
.bmHeight
, lpUnLockData
->lpDDSurface
->lpSurfMore
->lpDDRAWReserved2
);
225 BitBlt (hDC
, 0, 0, bm
.bmWidth
, bm
.bmHeight
, hMemDC
, 0, 0, SRCCOPY
);
227 SelectObject (hMemDC
, hDCBmp
);
229 /* Setup return value */
230 lpUnLockData
->ddRVal
= DD_OK
;
234 /* Cleanup after us */
237 DeleteObject (hImage
);
245 if (lpUnLockData
->lpDDSurface
->lpSurfMore
->lpDDRAWReserved2
!= NULL
)
247 HeapFree(GetProcessHeap(), 0, lpUnLockData
->lpDDSurface
->lpSurfMore
->lpDDRAWReserved2
);
250 return DDHAL_DRIVER_HANDLED
;
253 DWORD CALLBACK
HelDdSurfUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA lpUpDateOveryLayData
)