~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/dlls/ddraw/texture.c

Version: ~ [ wine-1.1.1 ] ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~ [ wine-1.0-rc5 ] ~ [ wine-1.0-rc4 ] ~ [ wine-1.0-rc3 ] ~ [ wine-1.0-rc2 ] ~ [ wine-1.0-rc1 ] ~ [ wine-0.9.61 ] ~ [ wine-0.9.60 ] ~ [ wine-0.9.59 ] ~ [ wine-0.9.58 ] ~ [ wine-0.9.57 ] ~ [ wine-0.9.56 ] ~ [ wine-0.9.55 ] ~ [ wine-0.9.54 ] ~ [ wine-0.9.53 ] ~ [ wine-0.9.52 ] ~ [ wine-0.9.51 ] ~ [ wine-0.9.50 ] ~ [ wine-0.9.49 ] ~ [ wine-0.9.48 ] ~ [ wine-0.9.47 ] ~ [ wine-0.9.46 ] ~ [ wine-0.9.45 ] ~ [ wine-0.9.44 ] ~ [ wine-0.9.43 ] ~ [ wine-0.9.42 ] ~ [ wine-0.9.41 ] ~ [ wine-0.9.40 ] ~ [ wine-0.9.39 ] ~ [ wine-0.9.38 ] ~ [ wine-0.9.37 ] ~ [ wine-0.9.36 ] ~ [ wine-0.9.35 ] ~ [ wine-0.9.34 ] ~ [ wine-0.9.33 ] ~ [ wine-0.9.32 ] ~ [ wine-0.9.31 ] ~ [ wine-0.9.30 ] ~ [ wine-0.9.29 ] ~ [ wine-0.9.28 ] ~ [ wine-0.9.27 ] ~ [ wine-0.9.26 ] ~ [ wine-0.9.25 ] ~ [ wine-0.9.24 ] ~ [ wine-0.9.23 ] ~ [ wine-0.9.22 ] ~ [ wine-0.9.21 ] ~ [ wine-0.9.20 ] ~ [ wine-0.9.19 ] ~ [ wine-0.9.18 ] ~ [ wine-0.9.17 ] ~ [ wine-0.9.16 ] ~ [ wine-0.9.15 ] ~ [ wine-0.9.14 ] ~ [ wine-0.9.13 ] ~ [ wine-0.9.12 ] ~ [ wine-0.9.11 ] ~ [ wine-0.9.10 ] ~ [ wine-0.9.9 ] ~ [ wine-0.9.8 ] ~ [ wine-0.9.7 ] ~ [ wine-0.9.6 ] ~ [ wine-0.9.5 ] ~ [ wine-0.9.4 ] ~ [ wine-0.9.3 ] ~ [ wine-0.9.2 ] ~ [ wine-0.9.1 ] ~ [ wine-0.9 ] ~ [ wine20050930 ] ~ [ wine20050830 ] ~ [ wine20050725 ] ~ [ wine20050628 ] ~ [ wine20050524 ] ~ [ wine20050419 ] ~ [ wine20050310 ] ~ [ wine20050211 ] ~ [ wine20050111 ] ~ [ wine20041201 ] ~ [ wine20041019 ] ~ [ wine20040914 ] ~ [ wine20040813 ] ~ [ wine20040716 ] ~ [ wine20040615 ] ~ [ wine20040505 ] ~ [ wine20040408 ] ~ [ wine20040309 ] ~ [ wine20040213 ] ~ [ wine20040121 ] ~ [ wine20031212 ] ~ [ wine20031118 ] ~ [ wine20031016 ] ~ [ wine20030911 ] ~ [ wine20030813 ] ~ [ wine20030709 ] ~ [ wine20030618 ] ~ [ wine20030508 ] ~ [ wine20030408 ] ~ [ wine20030318 ] ~ [ wine20030219 ] ~ [ wine20030115 ] ~ [ wine20021219 ] ~ [ wine20021125 ] ~ [ wine20021031 ] ~ [ wine20021007 ] ~ [ wine20020904 ] ~ [ wine20020804 ] ~ [ wine20020710 ] ~ [ wine20020605 ] ~ [ wine20020509 ] ~ [ wine20020411 ] ~ [ wine20020310 ] ~ [ wine20020228 ] ~ [ wine20011226 ] ~ [ wine20011108 ] ~ [ wine20011004 ] ~ [ wine20010824 ] ~ [ wine20010731 ] ~ [ wine20010629 ] ~ [ wine20010510 ] ~ [ wine20010418 ] ~ [ wine20010326 ] ~ [ wine20010305 ] ~ [ wine20010216 ] ~ [ wine20010112 ] ~ [ wine20001222 ] ~ [ wine20001202 ] ~ [ wine20001026 ] ~ [ wine20001002 ] ~ [ wine20000909 ] ~ [ wine20000821 ] ~ [ wine20000801 ] ~ [ wine20000716 ] ~ [ wine20000326 ] ~ [ wine20000227 ] ~ [ wine20000130 ] ~ [ wine20000109 ] ~

  1 /* Direct3D Texture
  2  * Copyright (c) 1998 Lionel ULMER
  3  * Copyright (c) 2006 Stefan DÖSINGER
  4  *
  5  * This file contains the implementation of interface Direct3DTexture2.
  6  *
  7  * This library is free software; you can redistribute it and/or
  8  * modify it under the terms of the GNU Lesser General Public
  9  * License as published by the Free Software Foundation; either
 10  * version 2.1 of the License, or (at your option) any later version.
 11  *
 12  * This library is distributed in the hope that it will be useful,
 13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 15  * Lesser General Public License for more details.
 16  *
 17  * You should have received a copy of the GNU Lesser General Public
 18  * License along with this library; if not, write to the Free Software
 19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 20  */
 21 
 22 #include "config.h"
 23 #include "wine/port.h"
 24 
 25 #include <assert.h>
 26 #include <stdarg.h>
 27 #include <string.h>
 28 #include <stdlib.h>
 29 
 30 #define COBJMACROS
 31 #define NONAMELESSUNION
 32 
 33 #include "windef.h"
 34 #include "winbase.h"
 35 #include "winerror.h"
 36 #include "wingdi.h"
 37 #include "wine/exception.h"
 38 
 39 #include "ddraw.h"
 40 #include "d3d.h"
 41 
 42 #include "ddraw_private.h"
 43 #include "wine/debug.h"
 44 
 45 WINE_DEFAULT_DEBUG_CHANNEL(d3d7);
 46 WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk);
 47 
 48 /*****************************************************************************
 49  * IUnknown interfaces. They are thunks to IDirectDrawSurface7
 50  *****************************************************************************/
 51 static HRESULT WINAPI
 52 Thunk_IDirect3DTextureImpl_2_QueryInterface(IDirect3DTexture2 *iface,
 53                                             REFIID riid,
 54                                             void **obj)
 55 {
 56     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
 57     TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj);
 58     return IDirectDrawSurface7_QueryInterface(ICOM_INTERFACE(This, IDirectDrawSurface7),
 59                                               riid,
 60                                               obj);
 61 }
 62 
 63 static HRESULT WINAPI
 64 Thunk_IDirect3DTextureImpl_1_QueryInterface(IDirect3DTexture *iface,
 65                                             REFIID riid,
 66                                             void **obj)
 67 {
 68     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
 69     TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj);
 70 
 71     return IDirectDrawSurface7_QueryInterface(ICOM_INTERFACE(This, IDirectDrawSurface7),
 72                                               riid,
 73                                               obj);
 74 }
 75 
 76 static ULONG WINAPI
 77 Thunk_IDirect3DTextureImpl_2_AddRef(IDirect3DTexture2 *iface)
 78 {
 79     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
 80     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 81 
 82     return IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This, IDirectDrawSurface7));
 83 }
 84 
 85 static ULONG WINAPI
 86 Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface)
 87 {
 88     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
 89     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 90 
 91     return IDirectDrawSurface7_AddRef(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
 92 }
 93 
 94 static ULONG WINAPI
 95 Thunk_IDirect3DTextureImpl_2_Release(IDirect3DTexture2 *iface)
 96 {
 97     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
 98     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 99 
100     return IDirectDrawSurface7_Release(ICOM_INTERFACE(This, IDirectDrawSurface7));
101 }
102 
103 
104 static ULONG WINAPI
105 Thunk_IDirect3DTextureImpl_1_Release(IDirect3DTexture *iface)
106 {
107     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
108     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
109 
110     return IDirectDrawSurface7_Release(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
111 }
112 
113 /*****************************************************************************
114  * IDirect3DTexture interface
115  *****************************************************************************/
116 
117 /*****************************************************************************
118  * IDirect3DTexture1::Initialize
119  *
120  * The sdk says it's not implemented
121  *
122  * Params:
123  *  ?
124  *
125  * Returns
126  *  DDERR_UNSUPPORTED
127  *
128  *****************************************************************************/
129 static HRESULT WINAPI
130 IDirect3DTextureImpl_1_Initialize(IDirect3DTexture *iface,
131                                   IDirect3DDevice *Direct3DDevice,
132                                   IDirectDrawSurface *DDSurface)
133 {
134     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
135     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice, Direct3DDevice);
136     IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, DDSurface);
137     TRACE("(%p)->(%p,%p) Not implemented\n", This, d3d, surf);
138     return DDERR_UNSUPPORTED; /* Unchecked */
139 }
140 
141 /*****************************************************************************
142  * IDirect3DTexture2::PaletteChanged
143  *
144  * Informs the texture about a palette change
145  *
146  * Params:
147  *  Start: Start index of the change
148  *  Count: The number of changed entries
149  *
150  * Returns
151  *  D3D_OK, because it's a stub
152  *
153  *****************************************************************************/
154 static HRESULT WINAPI
155 IDirect3DTextureImpl_PaletteChanged(IDirect3DTexture2 *iface,
156                                          DWORD Start,
157                                          DWORD Count)
158 {
159     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
160     FIXME("(%p)->(%08x,%08x): stub!\n", This, Start, Count);
161     return D3D_OK;
162 }
163 
164 static HRESULT WINAPI
165 Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface,
166                                             DWORD Start,
167                                             DWORD Count)
168 {
169     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
170     TRACE("(%p)->(%08x,%08x) thunking to IDirect3DTexture2 interface.\n", This, Start, Count);
171 
172     return IDirect3DTexture2_PaletteChanged(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, iface),
173                                             Start,
174                                             Count);
175 }
176 
177 
178 /*****************************************************************************
179  * IDirect3DTexture::Unload
180  *
181  * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented
182  *
183  *
184  * Returns:
185  *  DDERR_UNSUPPORTED
186  *
187  *****************************************************************************/
188 static HRESULT WINAPI
189 IDirect3DTextureImpl_1_Unload(IDirect3DTexture *iface)
190 {
191     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
192     TRACE("(%p)->(): not implemented!\n", This);
193     return DDERR_UNSUPPORTED;
194 }
195 
196 /*****************************************************************************
197  * IDirect3DTexture2::GetHandle
198  *
199  * Returns handle for the texture. At the moment, the interface
200  * to the IWineD3DTexture is used.
201  *
202  * Params:
203  *  Direct3DDevice2: Device this handle is assigned to
204  *  Handle: Address to store the handle at.
205  *
206  * Returns:
207  *  D3D_OK
208  *
209  *****************************************************************************/
210 static HRESULT WINAPI
211 IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface,
212                                     IDirect3DDevice2 *Direct3DDevice2,
213                                     D3DTEXTUREHANDLE *lpHandle)
214 {
215     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
216     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice2, Direct3DDevice2);
217 
218     TRACE("(%p)->(%p,%p)\n", This, d3d, lpHandle);
219 
220     EnterCriticalSection(&ddraw_cs);
221     if(!This->Handle)
222     {
223         This->Handle = IDirect3DDeviceImpl_CreateHandle(d3d);
224         if(This->Handle)
225         {
226             d3d->Handles[This->Handle - 1].ptr = This;
227             d3d->Handles[This->Handle - 1].type = DDrawHandle_Texture;
228         }
229     }
230     *lpHandle = This->Handle;
231 
232     TRACE(" returning handle %08x.\n", *lpHandle);
233 
234     LeaveCriticalSection(&ddraw_cs);
235     return D3D_OK;
236 }
237 
238 static HRESULT WINAPI
239 Thunk_IDirect3DTextureImpl_1_GetHandle(IDirect3DTexture *iface,
240                                        LPDIRECT3DDEVICE lpDirect3DDevice,
241                                        LPD3DTEXTUREHANDLE lpHandle)
242 {
243     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
244     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice, lpDirect3DDevice);
245     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DTexture2 interface.\n", This, d3d, lpHandle);
246 
247     return IDirect3DTexture2_GetHandle(ICOM_INTERFACE(This, IDirect3DTexture2),
248                                        ICOM_INTERFACE(d3d, IDirect3DDevice2),
249                                        lpHandle);
250 }
251 
252 
253 /*****************************************************************************
254  * get_sub_mimaplevel
255  *
256  * Helper function that returns the next mipmap level
257  *
258  * tex_ptr: Surface of which to return the next level
259  *
260  *****************************************************************************/
261 static IDirectDrawSurfaceImpl *
262 get_sub_mimaplevel(IDirectDrawSurfaceImpl *tex_ptr)
263 {
264     /* Now go down the mipmap chain to the next surface */
265     static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, 0 };
266     LPDIRECTDRAWSURFACE7 next_level;
267     IDirectDrawSurfaceImpl *surf_ptr;
268     HRESULT hr;
269 
270     hr = IDirectDrawSurface7_GetAttachedSurface(ICOM_INTERFACE(tex_ptr, IDirectDrawSurface7),
271                                                 &mipmap_caps, &next_level);
272     if (FAILED(hr)) return NULL;
273 
274     surf_ptr = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, next_level);
275     IDirectDrawSurface7_Release(next_level);
276 
277     return surf_ptr;
278 }
279 
280 /*****************************************************************************
281  * IDirect3DTexture2::Load
282  *
283  * Loads a texture created with the DDSCAPS_ALLOCONLOAD
284  *
285  * This function isn't relayed to WineD3D because the whole interface is
286  * implemented in DDraw only. For speed improvements a implementation which
287  * takes OpenGL more into account could be placed into WineD3D.
288  *
289  * Params:
290  *  D3DTexture2: Address of the texture to load
291  *
292  * Returns:
293  *  D3D_OK on success
294  *  D3DERR_TEXTURE_LOAD_FAILED.
295  *
296  *****************************************************************************/
297 static HRESULT WINAPI
298 IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
299                           IDirect3DTexture2 *D3DTexture2)
300 {
301     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
302     IDirectDrawSurfaceImpl *src_ptr = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, D3DTexture2);
303     HRESULT ret_value = D3D_OK;
304     if(src_ptr == This)
305     {
306         TRACE("copying surface %p to surface %p, why?\n", src_ptr, This);
307         return ret_value;
308     }
309 
310     TRACE("(%p)->(%p)\n", This, src_ptr);
311     EnterCriticalSection(&ddraw_cs);
312 
313     if (((src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) != (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) ||
314         (src_ptr->surface_desc.u2.dwMipMapCount != This->surface_desc.u2.dwMipMapCount))
315     {
316         ERR("Trying to load surfaces with different mip-map counts !\n");
317     }
318 
319     while(1)
320     {
321         IWineD3DPalette *wine_pal, *wine_pal_src;
322         IDirectDrawPalette *pal = NULL, *pal_src = NULL;
323         DDSURFACEDESC *src_d, *dst_d;
324 
325         TRACE(" copying surface %p to surface %p (mipmap level %d)\n", src_ptr, This, src_ptr->mipmap_level);
326 
327         if ( This->surface_desc.ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD )
328             /* If the surface is not allocated and its location is not yet specified,
329               force it to video memory */ 
330             if ( !(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_SYSTEMMEMORY|DDSCAPS_VIDEOMEMORY)) )
331                 This->surface_desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
332 
333         /* Suppress the ALLOCONLOAD flag */
334         This->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD;
335 
336         /* Get the palettes */
337         ret_value = IWineD3DSurface_GetPalette(This->WineD3DSurface, &wine_pal);
338         if( ret_value != D3D_OK)
339         {
340             ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n");
341             LeaveCriticalSection(&ddraw_cs);
342             return D3DERR_TEXTURE_LOAD_FAILED;
343         }
344         if(wine_pal)
345         {
346             ret_value = IWineD3DPalette_GetParent(wine_pal, (IUnknown **) &pal);
347             if(ret_value != D3D_OK)
348             {
349                 ERR("IWineD3DPalette::GetParent failed! This is unexpected\n");
350                 LeaveCriticalSection(&ddraw_cs);
351                 return D3DERR_TEXTURE_LOAD_FAILED;
352             }
353         }
354 
355         ret_value = IWineD3DSurface_GetPalette(src_ptr->WineD3DSurface, &wine_pal_src);
356         if( ret_value != D3D_OK)
357         {
358             ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n");
359             LeaveCriticalSection(&ddraw_cs);
360             return D3DERR_TEXTURE_LOAD_FAILED;
361         }
362         if(wine_pal_src)
363         {
364             ret_value = IWineD3DPalette_GetParent(wine_pal_src, (IUnknown **) &pal_src);
365             if(ret_value != D3D_OK)
366             {
367                 ERR("IWineD3DPalette::GetParent failed! This is unexpected\n");
368                 if (pal) IDirectDrawPalette_Release(pal);
369                 LeaveCriticalSection(&ddraw_cs);
370                 return D3DERR_TEXTURE_LOAD_FAILED;
371             }
372         }
373 
374         if (pal_src != NULL)
375         {
376             PALETTEENTRY palent[256];
377 
378             if (pal == NULL)
379             {
380                 IDirectDrawPalette_Release(pal_src);
381                 LeaveCriticalSection(&ddraw_cs);
382                 return DDERR_NOPALETTEATTACHED;
383             }
384             IDirectDrawPalette_GetEntries(pal_src, 0, 0, 256, palent);
385             IDirectDrawPalette_SetEntries(pal, 0, 0, 256, palent);
386         }
387 
388         if (pal) IDirectDrawPalette_Release(pal);
389         if (pal_src) IDirectDrawPalette_Release(pal_src);
390 
391         /* Copy one surface on the other */
392         dst_d = (DDSURFACEDESC *)&(This->surface_desc);
393         src_d = (DDSURFACEDESC *)&(src_ptr->surface_desc);
394 
395         if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight))
396         {
397             /* Should also check for same pixel format, u1.lPitch, ... */
398             ERR("Error in surface sizes\n");
399             LeaveCriticalSection(&ddraw_cs);
400             return D3DERR_TEXTURE_LOAD_FAILED;
401         }
402         else
403         {
404             WINED3DLOCKED_RECT pSrcRect, pDstRect;
405 
406             /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) This->D3Ddevice; */
407             /* I should put a macro for the calculus of bpp */
408 
409             /* Copy also the ColorKeying stuff */
410             if (src_d->dwFlags & DDSD_CKSRCBLT)
411             {
412                 dst_d->dwFlags |= DDSD_CKSRCBLT;
413                 dst_d->ddckCKSrcBlt.dwColorSpaceLowValue = src_d->ddckCKSrcBlt.dwColorSpaceLowValue;
414                 dst_d->ddckCKSrcBlt.dwColorSpaceHighValue = src_d->ddckCKSrcBlt.dwColorSpaceHighValue;
415             }
416 
417             /* Copy the main memory texture into the surface that corresponds to the OpenGL
418               texture object. */
419 
420             ret_value = IWineD3DSurface_LockRect(src_ptr->WineD3DSurface, &pSrcRect, NULL, 0);
421             if(ret_value != D3D_OK)
422             {
423                 ERR(" (%p) Locking the source surface failed\n", This);
424                 LeaveCriticalSection(&ddraw_cs);
425                 return D3DERR_TEXTURE_LOAD_FAILED;
426             }
427 
428             ret_value = IWineD3DSurface_LockRect(This->WineD3DSurface, &pDstRect, NULL, 0);
429             if(ret_value != D3D_OK)
430             {
431                 ERR(" (%p) Locking the destination surface failed\n", This);
432                 IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface);
433                 LeaveCriticalSection(&ddraw_cs);
434                 return D3DERR_TEXTURE_LOAD_FAILED;
435             }
436 
437             if (This->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC)
438                 memcpy(pDstRect.pBits, pSrcRect.pBits, src_ptr->surface_desc.u1.dwLinearSize);
439             else
440                 memcpy(pDstRect.pBits, pSrcRect.pBits, pSrcRect.Pitch * src_d->dwHeight);
441 
442             IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface);
443             IWineD3DSurface_UnlockRect(This->WineD3DSurface);
444         }
445 
446         if (src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
447         {
448             src_ptr = get_sub_mimaplevel(src_ptr);
449         }
450         else
451         {
452             src_ptr = NULL;
453         }
454         if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
455         {
456             This = get_sub_mimaplevel(This);
457         }
458         else
459         {
460             This = NULL;
461         }
462 
463         if ((src_ptr == NULL) || (This == NULL))
464         {
465             if (src_ptr != This)
466             {
467                 ERR(" Loading surface with different mipmap structure !!!\n");
468             }
469             break;
470         }
471     }
472 
473     LeaveCriticalSection(&ddraw_cs);
474     return ret_value;
475 }
476 
477 static HRESULT WINAPI
478 Thunk_IDirect3DTextureImpl_1_Load(IDirect3DTexture *iface,
479                                   IDirect3DTexture *D3DTexture)
480 {
481     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
482     IDirectDrawSurfaceImpl *Texture = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture, D3DTexture);
483     TRACE("(%p)->(%p) thunking to IDirect3DTexture2 interface.\n", This, Texture);
484 
485     return IDirect3DTexture2_Load(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, iface),
486                                   COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, D3DTexture));
487 }
488 
489 /*****************************************************************************
490  * The VTables
491  *****************************************************************************/
492 const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl =
493 {
494     Thunk_IDirect3DTextureImpl_2_QueryInterface,
495     Thunk_IDirect3DTextureImpl_2_AddRef,
496     Thunk_IDirect3DTextureImpl_2_Release,
497     IDirect3DTextureImpl_GetHandle,
498     IDirect3DTextureImpl_PaletteChanged,
499     IDirect3DTextureImpl_Load,
500 };
501 
502 
503 const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl =
504 {
505     Thunk_IDirect3DTextureImpl_1_QueryInterface,
506     Thunk_IDirect3DTextureImpl_1_AddRef,
507     Thunk_IDirect3DTextureImpl_1_Release,
508     IDirect3DTextureImpl_1_Initialize,
509     Thunk_IDirect3DTextureImpl_1_GetHandle,
510     Thunk_IDirect3DTextureImpl_1_PaletteChanged,
511     Thunk_IDirect3DTextureImpl_1_Load,
512     IDirect3DTextureImpl_1_Unload,
513 };
514 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.