ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

surface_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.