Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensurface_main.c
Go to the documentation of this file.
00001 /* $Id: surface_main.c 49872 2010-11-30 16:29:49Z fireball $ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS DirectX 00005 * FILE: ddraw/surface/surface_main.c 00006 * PURPOSE: IDirectDrawSurface7 Implementation 00007 * PROGRAMMER: Magnus Olsen, Maarten Bosma 00008 * 00009 */ 00010 00011 #include "rosdraw.h" 00012 00013 00014 /* FIXME adding hal and hel stub 00015 DestroySurface; 00016 SetClipList; 00017 AddAttachedSurface; 00018 GetFlipStatus; 00019 SetOverlayPosition; 00020 SetPalette; 00021 */ 00022 00023 LPDDRAWI_DDRAWSURFACE_INT 00024 internal_directdrawsurface_int_alloc(LPDDRAWI_DDRAWSURFACE_INT This) 00025 { 00026 LPDDRAWI_DDRAWSURFACE_INT newThis; 00027 DxHeapMemAlloc(newThis, sizeof(DDRAWI_DDRAWSURFACE_INT)); 00028 if (newThis) 00029 { 00030 newThis->lpLcl = This->lpLcl; 00031 newThis->lpLink = This; 00032 } 00033 return newThis; 00034 } 00035 00036 HRESULT WINAPI Main_DDrawSurface_Initialize (LPDDRAWI_DDRAWSURFACE_INT iface, LPDIRECTDRAW pDD, LPDDSURFACEDESC2 pDDSD2) 00037 { 00038 return DDERR_ALREADYINITIALIZED; 00039 } 00040 00041 ULONG WINAPI Main_DDrawSurface_AddRef(LPDDRAWI_DDRAWSURFACE_INT This) 00042 { 00043 00044 DX_WINDBG_trace(); 00045 00046 if (This!=NULL) 00047 { 00048 This->dwIntRefCnt++; 00049 This->lpLcl->dwLocalRefCnt++; 00050 00051 if (This->lpLcl->lpGbl != NULL) 00052 { 00053 This->lpLcl->lpGbl->dwRefCnt++; 00054 } 00055 } 00056 return This->dwIntRefCnt; 00057 00058 } 00059 00060 HRESULT WINAPI 00061 Main_DDrawSurface_QueryInterface(LPDDRAWI_DDRAWSURFACE_INT This, REFIID riid, LPVOID* ppObj) 00062 { 00063 HRESULT retVal = DD_OK; 00064 *ppObj = NULL; 00065 00066 DX_WINDBG_trace(); 00067 00068 _SEH2_TRY 00069 { 00070 if (IsEqualGUID(&IID_IDirectDrawSurface7, riid)) 00071 { 00072 if (This->lpVtbl != &DirectDrawSurface7_Vtable) 00073 { 00074 This = internal_directdrawsurface_int_alloc(This); 00075 if (!This) 00076 { 00077 retVal = DDERR_OUTOFVIDEOMEMORY; 00078 _SEH2_LEAVE; 00079 } 00080 } 00081 This->lpVtbl = &DirectDrawSurface7_Vtable; 00082 *ppObj = This; 00083 Main_DDrawSurface_AddRef(This); 00084 } 00085 else if (IsEqualGUID(&IID_IDirectDrawSurface4, riid)) 00086 { 00087 if (This->lpVtbl != &DirectDrawSurface4_Vtable) 00088 { 00089 This = internal_directdrawsurface_int_alloc(This); 00090 if (!This) 00091 { 00092 retVal = DDERR_OUTOFVIDEOMEMORY; 00093 _SEH2_LEAVE; 00094 } 00095 } 00096 This->lpVtbl = &DirectDrawSurface4_Vtable; 00097 *ppObj = This; 00098 Main_DDrawSurface_AddRef(This); 00099 } 00100 else if (IsEqualGUID(&IID_IDirectDrawSurface3, riid)) 00101 { 00102 if (This->lpVtbl != &DirectDrawSurface3_Vtable) 00103 { 00104 This = internal_directdrawsurface_int_alloc(This); 00105 if (!This) 00106 { 00107 retVal = DDERR_OUTOFVIDEOMEMORY; 00108 _SEH2_LEAVE; 00109 } 00110 } 00111 This->lpVtbl = &DirectDrawSurface3_Vtable; 00112 *ppObj = This; 00113 Main_DDrawSurface_AddRef(This); 00114 } 00115 else if (IsEqualGUID(&IID_IDirectDrawSurface2, riid)) 00116 { 00117 if (This->lpVtbl != &DirectDrawSurface2_Vtable) 00118 { 00119 This = internal_directdrawsurface_int_alloc(This); 00120 if (!This) 00121 { 00122 retVal = DDERR_OUTOFVIDEOMEMORY; 00123 _SEH2_LEAVE; 00124 } 00125 } 00126 This->lpVtbl = &DirectDrawSurface2_Vtable; 00127 *ppObj = This; 00128 Main_DDrawSurface_AddRef(This); 00129 } 00130 else if (IsEqualGUID(&IID_IDirectDrawSurface, riid)) 00131 { 00132 if (This->lpVtbl != &DirectDrawSurface_Vtable) 00133 { 00134 This = internal_directdrawsurface_int_alloc(This); 00135 if (!This) 00136 { 00137 retVal = DDERR_OUTOFVIDEOMEMORY; 00138 _SEH2_LEAVE; 00139 } 00140 } 00141 This->lpVtbl = &DirectDrawSurface_Vtable; 00142 *ppObj = This; 00143 Main_DDrawSurface_AddRef(This); 00144 } 00145 else if (IsEqualGUID(&IID_IDirectDrawColorControl, riid)) 00146 { 00147 if (This->lpVtbl != &DirectDrawColorControl_Vtable) 00148 { 00149 This = internal_directdrawsurface_int_alloc(This); 00150 if (!This) 00151 { 00152 retVal = DDERR_OUTOFVIDEOMEMORY; 00153 _SEH2_LEAVE; 00154 } 00155 } 00156 This->lpVtbl = &DirectDrawColorControl_Vtable; 00157 *ppObj = This; 00158 Main_DDrawSurface_AddRef(This); 00159 } 00160 else if (IsEqualGUID(&IID_IDirectDrawGammaControl, riid)) 00161 { 00162 if (This->lpVtbl != &DirectDrawGammaControl_Vtable) 00163 { 00164 This = internal_directdrawsurface_int_alloc(This); 00165 if (!This) 00166 { 00167 retVal = DDERR_OUTOFVIDEOMEMORY; 00168 _SEH2_LEAVE; 00169 } 00170 } 00171 This->lpVtbl = &DirectDrawGammaControl_Vtable; 00172 *ppObj = This; 00173 Main_DDrawSurface_AddRef(This); 00174 } 00175 else if (IsEqualGUID(&IID_IDirectDrawSurfaceKernel, riid)) 00176 { 00177 if (This->lpVtbl != &DirectDrawSurfaceKernel_Vtable) 00178 { 00179 This = internal_directdrawsurface_int_alloc(This); 00180 if (!This) 00181 { 00182 retVal = DDERR_OUTOFVIDEOMEMORY; 00183 _SEH2_LEAVE; 00184 } 00185 } 00186 This->lpVtbl = &DirectDrawSurfaceKernel_Vtable; 00187 *ppObj = This; 00188 Main_DDrawSurface_AddRef(This); 00189 } 00190 else if (IsEqualGUID(&IID_IDirect3D, riid)) 00191 { 00192 if (This->lpVtbl != &IDirect3D_Vtbl) 00193 { 00194 This = internal_directdrawsurface_int_alloc(This); 00195 if (!This) 00196 { 00197 retVal = DDERR_OUTOFVIDEOMEMORY; 00198 _SEH2_LEAVE; 00199 } 00200 } 00201 This->lpVtbl = &IDirect3D_Vtbl; 00202 *ppObj = This; 00203 Main_DDrawSurface_AddRef(This); 00204 } 00205 else if (IsEqualGUID(&IID_IDirect3D2, riid)) 00206 { 00207 if (This->lpVtbl != &IDirect3D2_Vtbl) 00208 { 00209 This = internal_directdrawsurface_int_alloc(This); 00210 if (!This) 00211 { 00212 retVal = DDERR_OUTOFVIDEOMEMORY; 00213 _SEH2_LEAVE; 00214 } 00215 } 00216 This->lpVtbl = &IDirect3D2_Vtbl; 00217 *ppObj = This; 00218 Main_DDrawSurface_AddRef(This); 00219 } 00220 else if (IsEqualGUID(&IID_IDirect3D3, riid)) 00221 { 00222 if (This->lpVtbl != &IDirect3D3_Vtbl) 00223 { 00224 This = internal_directdrawsurface_int_alloc(This); 00225 if (!This) 00226 { 00227 retVal = DDERR_OUTOFVIDEOMEMORY; 00228 _SEH2_LEAVE; 00229 } 00230 } 00231 This->lpVtbl = &IDirect3D3_Vtbl; 00232 *ppObj = This; 00233 Main_DDrawSurface_AddRef(This); 00234 } 00235 else if (IsEqualGUID(&IID_IDirect3D7, riid)) 00236 { 00237 if (This->lpVtbl != &IDirect3D7_Vtbl) 00238 { 00239 This = internal_directdrawsurface_int_alloc(This); 00240 if (!This) 00241 { 00242 retVal = DDERR_OUTOFVIDEOMEMORY; 00243 _SEH2_LEAVE; 00244 } 00245 } 00246 This->lpVtbl = &IDirect3D7_Vtbl; 00247 *ppObj = This; 00248 Main_DDrawSurface_AddRef(This); 00249 } 00250 else 00251 { 00252 DX_STUB_str("E_NOINTERFACE"); 00253 retVal = E_NOINTERFACE; 00254 } 00255 } 00256 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00257 { 00258 } 00259 _SEH2_END; 00260 return retVal; 00261 } 00262 00263 00264 00265 ULONG WINAPI Main_DDrawSurface_Release(LPDDRAWI_DDRAWSURFACE_INT This) 00266 { 00267 /* FIXME 00268 This is not right exiame how it should be done 00269 */ 00270 ULONG ret = --This->dwIntRefCnt; 00271 if(!ret) 00272 { 00273 DX_STUB_str("Release is a bit simplistic right now\n"); 00274 AcquireDDThreadLock(); 00275 DxHeapMemFree(This); 00276 ReleaseDDThreadLock(); 00277 } 00278 return ret; 00279 } 00280 00281 ULONG WINAPI Main_DDrawSurface_Release4(LPDDRAWI_DDRAWSURFACE_INT This) 00282 { 00283 ULONG ref = Main_DDrawSurface_Release(This) ; 00284 00285 if(ref == 0) Main_DirectDraw_Release(This->lpLcl->lpSurfMore->lpDD_int); 00286 00287 return ref; 00288 } 00289 00290 HRESULT WINAPI Main_DDrawSurface_Blt(LPDDRAWI_DDRAWSURFACE_INT ThisDest, LPRECT rdst, 00291 LPDDRAWI_DDRAWSURFACE_INT ThisSrc, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx) 00292 { 00293 DDHAL_BLTDATA mDdBlt; 00294 00295 DX_WINDBG_trace(); 00296 00297 if (ThisDest == NULL) 00298 { 00299 return DDERR_INVALIDPARAMS; 00300 } 00301 00302 /* Zero out members in DDHAL_BLTDATA */ 00303 ZeroMemory(&mDdBlt, sizeof(DDHAL_BLTDATA)); 00304 ZeroMemory(&mDdBlt.bltFX, sizeof(DDBLTFX)); 00305 00306 /* Check if we got HAL support for this api */ 00307 if (( ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags & 00308 DDHAL_SURFCB32_BLT) == DDHAL_SURFCB32_BLT) 00309 { 00310 mDdBlt.Blt = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HALDDSurface.Blt; 00311 } 00312 /* Check if we got HEL support for this api */ 00313 else if (( ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HELDDSurface.dwFlags & 00314 DDHAL_SURFCB32_BLT) == DDHAL_SURFCB32_BLT) 00315 { 00316 mDdBlt.Blt = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HELDDSurface.Blt; 00317 } 00318 00319 if (mDdBlt.Blt == NULL) 00320 { 00321 /* This API is unsupported */ 00322 return DDERR_UNSUPPORTED; 00323 } 00324 00325 /* Prepare for draw, if we do not reset the DdResetVisrgn some graphics card will not draw on the screen */ 00326 if (!DdResetVisrgn( ThisDest->lpLcl->lpSurfMore->slist[0], NULL)) 00327 { 00328 DX_STUB_str("DdResetVisrgn failed"); 00329 } 00330 00331 mDdBlt.lpDD = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl; 00332 mDdBlt.lpDDDestSurface = ThisDest->lpLcl->lpSurfMore->slist[0]; 00333 ThisDest->lpLcl->lpSurfMore->slist[0]->hDC = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->hDC; 00334 00335 /* Setup Src */ 00336 if (( ThisSrc != NULL ) ) 00337 { 00338 00339 mDdBlt.lpDDSrcSurface = ThisSrc->lpLcl->lpSurfMore->slist[0]; 00340 ThisSrc->lpLcl->lpSurfMore->slist[0]->hDC = ThisSrc->lpLcl->lpSurfMore->lpDD_lcl->hDC; 00341 00342 if (rsrc != NULL) 00343 { 00344 memmove(&mDdBlt.rSrc, rsrc, sizeof (RECTL)); 00345 } 00346 else 00347 { 00348 if(!GetWindowRect((HWND)ThisSrc->lpLcl->lpSurfMore->lpDD_lcl->hWnd, 00349 (RECT *)&mDdBlt.rSrc)) 00350 { 00351 DX_STUB_str("GetWindowRect failed"); 00352 } 00353 } 00354 00355 /* FIXME 00356 * compare so we do not write too far 00357 * ThisDest->lpLcl->lpGbl->wWidth; <- surface max width 00358 * ThisDest->lpLcl->lpGbl->wHeight <- surface max heght 00359 * ThisDest->lpLcl->lpGbl->lPitch <- surface bpp 00360 */ 00361 00362 } 00363 00364 /* Setup dest */ 00365 if (rdst != NULL) 00366 { 00367 memmove(&mDdBlt.rDest, rdst, sizeof (RECTL)); 00368 } 00369 else 00370 { 00371 if (!GetWindowRect((HWND)ThisDest->lpLcl->lpSurfMore->lpDD_lcl->hWnd, 00372 (RECT *)&mDdBlt.rDest)) 00373 { 00374 DX_STUB_str("GetWindowRect failed"); 00375 } 00376 } 00377 00378 /* FIXME 00379 * compare so we do not write too far 00380 * ThisDest->lpLcl->lpGbl->wWidth; <- surface max width 00381 * ThisDest->lpLcl->lpGbl->wHeight <- surface max heght 00382 * ThisDest->lpLcl->lpGbl->lPitch <- surface bpp 00383 */ 00384 00385 00386 /* setup bltFX */ 00387 if (lpbltfx != NULL) 00388 { 00389 memmove(&mDdBlt.bltFX, lpbltfx, sizeof (DDBLTFX)); 00390 } 00391 00392 /* setup value that are not config yet */ 00393 mDdBlt.dwFlags = dwFlags; 00394 mDdBlt.IsClipped = FALSE; 00395 mDdBlt.bltFX.dwSize = sizeof(DDBLTFX); 00396 00397 00398 /* FIXME 00399 BltData.dwRectCnt 00400 BltData.dwROPFlags 00401 BltData.IsClipped 00402 BltData.prDestRects 00403 BltData.rOrigDest 00404 BltData.rOrigSrc 00405 BltData.ddRVal 00406 */ 00407 00408 if (mDdBlt.Blt(&mDdBlt) != DDHAL_DRIVER_HANDLED) 00409 { 00410 DX_STUB_str("mDdBlt DDHAL_DRIVER_HANDLED"); 00411 return DDERR_NOBLTHW; 00412 } 00413 00414 return mDdBlt.ddRVal; 00415 } 00416 00417 00418 HRESULT WINAPI 00419 Main_DDrawSurface_Lock (LPDDRAWI_DDRAWSURFACE_INT ThisDest, LPRECT prect, 00420 LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE events) 00421 { 00422 DDHAL_LOCKDATA mdLock; 00423 00424 DX_WINDBG_trace(); 00425 00426 DX_WINDBG_trace_res( (DWORD)ThisDest->lpLcl->lpGbl->wWidth, (DWORD)ThisDest->lpLcl->lpGbl->wHeight, (DWORD)ThisDest->lpLcl->lpGbl->lPitch, (DWORD) 0); 00427 00428 /* Zero out members in DDHAL_LOCKDATA */ 00429 ZeroMemory(&mdLock, sizeof(DDHAL_LOCKDATA)); 00430 00431 /* Check if we got HAL support for this api */ 00432 if (( ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags & 00433 DDHAL_SURFCB32_LOCK) == DDHAL_SURFCB32_LOCK) 00434 { 00435 mdLock.Lock = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HALDDSurface.Lock; 00436 } 00437 /* Check if we got HEL support for this api */ 00438 else if (( ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HELDDSurface.dwFlags & 00439 DDHAL_SURFCB32_LOCK) == DDHAL_SURFCB32_LOCK) 00440 { 00441 mdLock.Lock = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HELDDSurface.Lock; 00442 } 00443 00444 if (mdLock.Lock == NULL) 00445 { 00446 /* This api are unsupported */ 00447 return DDERR_UNSUPPORTED; 00448 } 00449 00450 if (events != NULL) 00451 { 00452 return DDERR_INVALIDPARAMS; 00453 } 00454 00455 /* FIXME add a check see if lock suport or not */ 00456 00457 if (prect!=NULL) 00458 { 00459 mdLock.bHasRect = TRUE; 00460 memcpy(&mdLock.rArea,prect,sizeof(RECTL)); 00461 } 00462 else 00463 { 00464 mdLock.bHasRect = FALSE; 00465 } 00466 00467 //FIXME check if it primary or not and use primary or pixelformat data, at moment it is hardcode to primary 00468 00469 mdLock.ddRVal = DDERR_CANTLOCKSURFACE; 00470 mdLock.dwFlags = flags; 00471 mdLock.lpDDSurface = ThisDest->lpLcl->lpSurfMore->slist[0]; 00472 mdLock.lpDD = ThisDest->lpLcl->lpSurfMore->lpDD_lcl->lpGbl; 00473 mdLock.lpSurfData = NULL; 00474 00475 00476 if (!DdResetVisrgn(ThisDest->lpLcl->lpSurfMore->slist[0], NULL)) 00477 { 00478 DX_STUB_str("Here DdResetVisrgn lock"); 00479 // return DDERR_UNSUPPORTED; 00480 } 00481 00482 if (mdLock.Lock(&mdLock)!= DDHAL_DRIVER_HANDLED) 00483 { 00484 DX_STUB_str("Here DDHAL_DRIVER_HANDLED lock"); 00485 return DDERR_UNSUPPORTED; 00486 } 00487 00488 // FIXME ??? is this right ?? 00489 00490 if (pDDSD != NULL) 00491 { 00492 ZeroMemory(pDDSD,sizeof(DDSURFACEDESC2)); 00493 pDDSD->dwSize = sizeof(DDSURFACEDESC2); 00494 00495 //if (pDDSD->dwSize == sizeof(DDSURFACEDESC2)) 00496 //{ 00497 // ZeroMemory(pDDSD,sizeof(DDSURFACEDESC2)); 00498 // // FIXME the interanl mddsdPrimary shall be DDSURFACEDESC2 00499 // memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC)); 00500 // pDDSD->dwSize = sizeof(DDSURFACEDESC2); 00501 //} 00502 //if (pDDSD->dwSize == sizeof(DDSURFACEDESC)) 00503 //{ 00504 // RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC)); 00505 // memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC)); 00506 // pDDSD->dwSize = sizeof(DDSURFACEDESC); 00507 //} 00508 00509 00510 pDDSD->lpSurface = (LPVOID) mdLock.lpSurfData; 00511 00512 pDDSD->dwHeight = ThisDest->lpLcl->lpGbl->wHeight; 00513 pDDSD->dwWidth = ThisDest->lpLcl->lpGbl->wWidth; 00514 00515 pDDSD->ddpfPixelFormat.dwRGBBitCount = ThisDest->lpLcl->lpGbl->lpDD->lpModeInfo->dwBPP;// .lpModeInfo->dwBPP; //This->lpLcl->lpGbl->lPitch/ 8; 00516 pDDSD->lPitch = ThisDest->lpLcl->lpGbl->lPitch; 00517 pDDSD->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH; 00518 } 00519 00520 return mdLock.ddRVal; 00521 } 00522 00523 00524 HRESULT WINAPI Main_DDrawSurface_Unlock (LPDDRAWI_DDRAWSURFACE_INT This, LPRECT pRect) 00525 { 00526 DDHAL_UNLOCKDATA mdUnLock; 00527 00528 DX_WINDBG_trace(); 00529 00530 /* Zero out members in DDHAL_UNLOCKDATA */ 00531 ZeroMemory(&mdUnLock, sizeof(DDHAL_UNLOCKDATA)); 00532 00533 /* Check if we got HAL support for this api */ 00534 if (( This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags & 00535 DDHAL_SURFCB32_UNLOCK) == DDHAL_SURFCB32_UNLOCK) 00536 { 00537 mdUnLock.Unlock = This->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HALDDSurface.Unlock; 00538 } 00539 /* Check if we got HEL support for this api */ 00540 else if (( This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HELDDSurface.dwFlags & 00541 DDHAL_SURFCB32_UNLOCK) == DDHAL_SURFCB32_UNLOCK) 00542 { 00543 mdUnLock.Unlock = This->lpLcl->lpSurfMore->lpDD_lcl->lpGbl->lpDDCBtmp->HELDDSurface.Unlock; 00544 } 00545 00546 if (mdUnLock.Unlock == NULL) 00547 { 00548 /* This api are unsupported */ 00549 return DDERR_UNSUPPORTED; 00550 } 00551 00552 mdUnLock.ddRVal = DDERR_NOTPALETTIZED; 00553 mdUnLock.lpDD = This->lpLcl->lpSurfMore->lpDD_lcl->lpGbl; 00554 mdUnLock.lpDDSurface = This->lpLcl->lpSurfMore->slist[0]; 00555 00556 if (!DdResetVisrgn( mdUnLock.lpDDSurface, NULL)) 00557 { 00558 DX_STUB_str("DdResetVisrgn fail"); 00559 //return DDERR_UNSUPPORTED; /* this can fail */ 00560 } 00561 00562 if (mdUnLock.Unlock(&mdUnLock)!= DDHAL_DRIVER_HANDLED) 00563 { 00564 DX_STUB_str("unLock fail"); 00565 return DDERR_UNSUPPORTED; 00566 } 00567 00568 return mdUnLock.ddRVal; 00569 } 00570 00571 HRESULT WINAPI 00572 Main_DDrawSurface_AddAttachedSurface(LPDDRAWI_DDRAWSURFACE_INT iface, 00573 LPDDRAWI_DDRAWSURFACE_INT pAttach) 00574 { 00575 00576 // LPDDRAWI_DDRAWSURFACE_INT This = (LPDDRAWI_DDRAWSURFACE_INT)iface; 00577 // LPDDRAWI_DDRAWSURFACE_INT That = (LPDDRAWI_DDRAWSURFACE_INT)pAttach; 00578 00579 DX_WINDBG_trace(); 00580 00581 DX_STUB; 00582 } 00583 00584 HRESULT WINAPI 00585 Main_DDrawSurface_GetAttachedSurface(LPDDRAWI_DDRAWSURFACE_INT This, 00586 LPDDSCAPS2 pCaps, 00587 LPDDRAWI_DDRAWSURFACE_INT* ppSurface) 00588 { 00589 /* FIXME hacked */ 00590 00591 00592 DX_WINDBG_trace(); 00593 00594 *ppSurface = This->lpLcl->lpGbl->lpDD->dsList; 00595 00596 00597 return DD_OK; 00598 } 00599 00600 HRESULT WINAPI 00601 Main_DDrawSurface_GetBltStatus(LPDDRAWI_DDRAWSURFACE_INT This, DWORD dwFlags) 00602 { 00603 00604 DX_WINDBG_trace(); 00605 00606 if (!(This->lpLcl->lpGbl->lpDD->lpDDCBtmp->cbDDSurfaceCallbacks.dwFlags & DDHAL_SURFCB32_FLIP)) 00607 { 00608 return DDERR_GENERIC; 00609 } 00610 00611 DX_STUB; 00612 } 00613 00614 HRESULT WINAPI 00615 Main_DDrawSurface_GetCaps(LPDDRAWI_DDRAWSURFACE_INT This, LPDDSCAPS2 pCaps) 00616 { 00617 00618 DX_WINDBG_trace(); 00619 00620 if (This == NULL) 00621 { 00622 return DDERR_INVALIDOBJECT; 00623 } 00624 00625 if (pCaps == NULL) 00626 { 00627 return DDERR_INVALIDPARAMS; 00628 } 00629 00630 RtlZeroMemory(pCaps,sizeof(DDSCAPS2)); 00631 00632 pCaps->dwCaps = This->lpLcl->ddsCaps.dwCaps; 00633 00634 return DD_OK; 00635 } 00636 00637 HRESULT WINAPI 00638 Main_DDrawSurface_GetClipper(LPDDRAWI_DDRAWSURFACE_INT This, 00639 LPDIRECTDRAWCLIPPER* ppClipper) 00640 { 00641 00642 DX_WINDBG_trace(); 00643 00644 if (This == NULL) 00645 { 00646 return DDERR_INVALIDOBJECT; 00647 } 00648 00649 if (ppClipper == NULL) 00650 { 00651 return DDERR_INVALIDPARAMS; 00652 } 00653 00654 if (This->lpLcl->lp16DDClipper == NULL) 00655 { 00656 return DDERR_NOCLIPPERATTACHED; 00657 } 00658 00659 *ppClipper = (LPDIRECTDRAWCLIPPER)This->lpLcl->lp16DDClipper; 00660 00661 return DD_OK; 00662 } 00663 00664 HRESULT WINAPI 00665 Main_DDrawSurface_SetClipper (LPDDRAWI_DDRAWSURFACE_INT This, 00666 LPDIRECTDRAWCLIPPER pDDClipper) 00667 { 00668 00669 DX_WINDBG_trace(); 00670 00671 if (This == NULL) 00672 { 00673 return DDERR_INVALIDOBJECT; 00674 } 00675 00676 if(pDDClipper == NULL) 00677 { 00678 if(!This->lpLcl->lp16DDClipper) 00679 return DDERR_NOCLIPPERATTACHED; 00680 00681 DirectDrawClipper_Release((LPDIRECTDRAWCLIPPER)This->lpLcl->lp16DDClipper); 00682 This->lpLcl->lp16DDClipper = NULL; 00683 return DD_OK; 00684 } 00685 00686 // FIXME: Check Surface type and return DDERR_INVALIDSURFACETYPE 00687 00688 DirectDrawClipper_AddRef((LPDIRECTDRAWCLIPPER)pDDClipper); 00689 This->lpLcl->lp16DDClipper = (LPDDRAWI_DDRAWCLIPPER_INT)pDDClipper; 00690 00691 return DD_OK; 00692 } 00693 00694 HRESULT WINAPI 00695 Main_DDrawSurface_GetDC(LPDDRAWI_DDRAWSURFACE_INT This, HDC *phDC) 00696 { 00697 00698 DX_WINDBG_trace(); 00699 00700 if (This == NULL) 00701 { 00702 return DDERR_INVALIDOBJECT; 00703 } 00704 00705 if (phDC == NULL) 00706 { 00707 return DDERR_INVALIDPARAMS; 00708 } 00709 00710 00711 *phDC = (HDC)This->lpLcl->lpSurfMore->lpDD_lcl->hDC; 00712 00713 return DD_OK; 00714 } 00715 00716 HRESULT WINAPI 00717 Main_DDrawSurface_GetPixelFormat(LPDDRAWI_DDRAWSURFACE_INT This, 00718 LPDDPIXELFORMAT pDDPixelFormat) 00719 { 00720 HRESULT retVale = DDERR_INVALIDPARAMS; 00721 00722 DX_WINDBG_trace(); 00723 00724 if (pDDPixelFormat != NULL) 00725 { 00726 if (This->lpLcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) 00727 { 00728 memcpy(pDDPixelFormat,&This->lpLcl->lpGbl->ddpfSurface,sizeof(DDPIXELFORMAT)); 00729 } 00730 else 00731 { 00732 memcpy(pDDPixelFormat,&This->lpLcl->lpSurfMore-> 00733 lpDD_lcl->lpGbl->vmiData.ddpfDisplay,sizeof(DDPIXELFORMAT)); 00734 } 00735 retVale = DD_OK; 00736 } 00737 00738 return retVale; 00739 } 00740 00741 HRESULT WINAPI 00742 Main_DDrawSurface_GetSurfaceDesc(LPDDRAWI_DDRAWSURFACE_INT This, 00743 LPDDSURFACEDESC2 pDDSD) 00744 { 00745 DWORD dwSize; 00746 00747 DX_WINDBG_trace(); 00748 00749 dwSize = pDDSD->dwSize; 00750 00751 if ((dwSize != sizeof(DDSURFACEDESC)) && 00752 (dwSize != sizeof(DDSURFACEDESC2))) 00753 { 00754 return DDERR_GENERIC; 00755 } 00756 00757 ZeroMemory(pDDSD,dwSize); 00758 00759 if (dwSize == sizeof(DDSURFACEDESC)) 00760 { 00761 LPDDSURFACEDESC lpDS = (LPDDSURFACEDESC) pDDSD; 00762 memcpy(&lpDS->ddckCKDestBlt, &This->lpLcl->ddckCKDestBlt, sizeof(DDCOLORKEY)); 00763 memcpy(&lpDS->ddckCKDestOverlay, &This->lpLcl->ddckCKDestOverlay, sizeof(DDCOLORKEY)); 00764 memcpy(&lpDS->ddckCKSrcBlt, &This->lpLcl->ddckCKSrcBlt, sizeof(DDCOLORKEY)); 00765 memcpy(&lpDS->ddckCKSrcOverlay, &This->lpLcl->ddckCKSrcOverlay, sizeof(DDCOLORKEY)); 00766 memcpy(&lpDS->ddpfPixelFormat, &This->lpLcl->lpGbl->ddpfSurface, sizeof(DDPIXELFORMAT)); 00767 memcpy(&lpDS->ddsCaps, &This->lpLcl->ddsCaps, sizeof(DDSCAPS)); 00768 00769 lpDS->dwAlphaBitDepth = This->lpLcl->dwAlpha; 00770 lpDS->dwBackBufferCount = This->lpLcl->dwBackBufferCount; 00771 00772 /* FIXME setting the flags right */ 00773 // lpDS->dwFlags = This->lpLcl->dwFlags; 00774 00775 lpDS->dwHeight = This->lpLcl->lpGbl->wHeight; 00776 lpDS->dwWidth = This->lpLcl->lpGbl->wWidth; 00777 00778 /* This two are a union in lpDS and in This->lpLcl->lpGbl 00779 so I comment out lPitch 00780 lpDS->lPitch = This->lpLcl->lpGbl->lPitch; 00781 */ 00782 lpDS->dwLinearSize = This->lpLcl->lpGbl->dwLinearSize; 00783 00784 00785 /* This tree are a union */ 00786 //lpDS->dwMipMapCount 00787 //lpDS->dwRefreshRate 00788 //lpDS->dwZBufferBitDepth 00789 00790 /* Unknown */ 00791 // lpDS->dwReserved 00792 // lpDS->lpSurface 00793 } 00794 else 00795 { 00796 memcpy(&pDDSD->ddckCKDestBlt, &This->lpLcl->ddckCKDestBlt, sizeof(DDCOLORKEY)); 00797 00798 /* 00799 pDDSD->dwEmptyFaceColor is a union to ddckCKDestOverlay 00800 */ 00801 memcpy(&pDDSD->ddckCKDestOverlay, &This->lpLcl->ddckCKDestOverlay, sizeof(DDCOLORKEY)); 00802 memcpy(&pDDSD->ddckCKSrcBlt, &This->lpLcl->ddckCKSrcBlt, sizeof(DDCOLORKEY)); 00803 memcpy(&pDDSD->ddckCKSrcOverlay, &This->lpLcl->ddckCKSrcOverlay, sizeof(DDCOLORKEY)); 00804 00805 /* 00806 pDDSD->dwFVF is a union to ddpfPixelFormat 00807 */ 00808 memcpy(&pDDSD->ddpfPixelFormat, &This->lpLcl->lpGbl->ddpfSurface, sizeof(DDPIXELFORMAT)); 00809 memcpy(&pDDSD->ddsCaps, &This->lpLcl->ddsCaps, sizeof(DDSCAPS)); 00810 00811 00812 pDDSD->dwAlphaBitDepth = This->lpLcl->dwAlpha; 00813 pDDSD->dwBackBufferCount = This->lpLcl->dwBackBufferCount; 00814 00815 /* FIXME setting the flags right */ 00816 // lpDS->dwFlags = This->lpLcl->dwFlags; 00817 00818 pDDSD->dwHeight = This->lpLcl->lpGbl->wHeight; 00819 pDDSD->dwWidth = This->lpLcl->lpGbl->wWidth; 00820 00821 /* This two are a union in lpDS and in This->lpLcl->lpGbl 00822 so I comment out lPitch 00823 lpDS->lPitch = This->lpLcl->lpGbl->lPitch; 00824 */ 00825 pDDSD->dwLinearSize = This->lpLcl->lpGbl->dwLinearSize; 00826 00827 /* This tree are a union */ 00828 // pDDSD->dwMipMapCount 00829 // pDDSD->dwRefreshRate 00830 // pDDSD->dwSrcVBHandle 00831 00832 /* Unknown */ 00833 // lpDS->dwReserved 00834 // lpDS->lpSurface 00835 // pDDSD->dwTextureStage 00836 } 00837 00838 return DD_OK; 00839 } 00840 00841 HRESULT WINAPI 00842 Main_DDrawSurface_ReleaseDC(LPDDRAWI_DDRAWSURFACE_INT This, HDC hDC) 00843 { 00844 DX_WINDBG_trace(); 00845 00846 if (This == NULL) 00847 { 00848 return DDERR_INVALIDOBJECT; 00849 } 00850 00851 if (hDC == NULL) 00852 { 00853 return DDERR_INVALIDPARAMS; 00854 } 00855 00856 /* FIXME check if surface exits or not */ 00857 00858 00859 if ((HDC)This->lpLcl->hDC == NULL) 00860 { 00861 return DDERR_GENERIC; 00862 } 00863 00864 return DD_OK; 00865 } 00866 00867 HRESULT WINAPI 00868 Main_DDrawSurface_SetColorKey (LPDDRAWI_DDRAWSURFACE_INT This, 00869 DWORD dwFlags, LPDDCOLORKEY pCKey) 00870 { 00871 00872 DDHAL_SETCOLORKEYDATA ColorKeyData; 00873 00874 DX_WINDBG_trace(); 00875 00876 ColorKeyData.ddRVal = DDERR_COLORKEYNOTSET; 00877 00878 if (This->lpLcl->lpGbl->lpDD->lpDDCBtmp->cbDDSurfaceCallbacks.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) 00879 { 00880 00881 ColorKeyData.lpDD = This->lpLcl->lpGbl->lpDD; 00882 ColorKeyData.SetColorKey = This->lpLcl->lpGbl->lpDD->lpDDCBtmp->cbDDSurfaceCallbacks.SetColorKey; 00883 00884 //ColorKeyData.lpDDSurface = &This->lpLcl->hDDSurface; 00885 ColorKeyData.dwFlags = dwFlags; 00886 /* FIXME 00887 ColorKeyData.ckNew = ? 00888 add / move dwFlags to This->lpLcl->dwFlags ?? 00889 */ 00890 00891 if (ColorKeyData.SetColorKey(&ColorKeyData) == DDHAL_DRIVER_HANDLED ) 00892 { 00893 return ColorKeyData.ddRVal; 00894 } 00895 } 00896 return DDERR_COLORKEYNOTSET; 00897 } 00898 00899 00900 00901 HRESULT WINAPI 00902 Main_DDrawSurface_SetOverlayPosition (LPDDRAWI_DDRAWSURFACE_INT This, LONG X, LONG Y) 00903 { 00904 00905 DDHAL_SETOVERLAYPOSITIONDATA OverLayPositionData; 00906 00907 DX_WINDBG_trace(); 00908 00909 OverLayPositionData.ddRVal = DDERR_COLORKEYNOTSET; 00910 00911 if (This->lpLcl->lpGbl->lpDD->lpDDCBtmp->cbDDSurfaceCallbacks.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) 00912 { 00913 00914 OverLayPositionData.lpDD = This->lpLcl->lpGbl->lpDD; 00915 OverLayPositionData.SetOverlayPosition = This->lpLcl->lpGbl->lpDD->lpDDCBtmp->cbDDSurfaceCallbacks.SetOverlayPosition; 00916 00917 //OverLayPositionData.lpDDSrcSurface = This->lpLcl->lpSurfaceOverlaying->lpLcl->hDDSurface; 00918 //OverLayPositionData.lpDDDestSurface = This->lpLcl->hDDSurface; 00919 00920 OverLayPositionData.lXPos = X; 00921 OverLayPositionData.lYPos = Y; 00922 00923 00924 /* FIXME 00925 Should X and Y be save ?? 00926 */ 00927 00928 if (OverLayPositionData.SetOverlayPosition(&OverLayPositionData) == DDHAL_DRIVER_HANDLED ) 00929 { 00930 return OverLayPositionData.ddRVal; 00931 } 00932 } 00933 00934 return DDERR_GENERIC; 00935 } Generated on Sat May 26 2012 04:19:59 for ReactOS by
1.7.6.1
|