ReactOS  0.4.15-dev-3324-gda4e15f
sprite.c
Go to the documentation of this file.
1 #ifdef __REACTOS__
2 #include "precomp.h"
3 #else
4 /*
5  * Copyright (C) 2008 Tony Wasserka
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 
23 
24 #include "d3dx9_private.h"
25 #endif /* __REACTOS__ */
26 
28 
29 /* the combination of all possible D3DXSPRITE flags */
30 #define D3DXSPRITE_FLAGLIMIT 511
31 
33 {
37 };
38 
39 struct sprite
40 {
41  IDirect3DTexture9 *texture;
48 };
49 
51 {
52  ID3DXSprite ID3DXSprite_iface;
54 
55  IDirect3DDevice9 *device;
56  IDirect3DVertexDeclaration9 *vdecl;
57  IDirect3DStateBlock9 *stateblock;
62 
63  /* Store the relevant caps to prevent multiple GetDeviceCaps calls */
67 
68  struct sprite *sprites;
69  int sprite_count; /* number of sprites to be drawn */
70  int allocated_sprites; /* number of (pre-)allocated sprites */
71 };
72 
73 static inline struct d3dx9_sprite *impl_from_ID3DXSprite(ID3DXSprite *iface)
74 {
75  return CONTAINING_RECORD(iface, struct d3dx9_sprite, ID3DXSprite_iface);
76 }
77 
78 static HRESULT WINAPI d3dx9_sprite_QueryInterface(ID3DXSprite *iface, REFIID riid, void **out)
79 {
80  TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
81 
82  if (IsEqualGUID(riid, &IID_ID3DXSprite)
84  {
85  IUnknown_AddRef(iface);
86  *out = iface;
87  return S_OK;
88  }
89 
90  WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
91 
92  *out = NULL;
93  return E_NOINTERFACE;
94 }
95 
96 static ULONG WINAPI d3dx9_sprite_AddRef(ID3DXSprite *iface)
97 {
98  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
99  ULONG refcount = InterlockedIncrement(&sprite->ref);
100 
101  TRACE("%p increasing refcount to %u.\n", sprite, refcount);
102 
103  return refcount;
104 }
105 
106 static ULONG WINAPI d3dx9_sprite_Release(ID3DXSprite *iface)
107 {
108  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
109  ULONG refcount = InterlockedDecrement(&sprite->ref);
110 
111  TRACE("%p decreasing refcount to %u.\n", sprite, refcount);
112 
113  if (!refcount)
114  {
115  if (sprite->sprites)
116  {
117  int i;
118 
120  {
121  for (i = 0; i < sprite->sprite_count; ++i)
122  {
123  if (sprite->sprites[i].texture)
125  }
126  }
127 
128  HeapFree(GetProcessHeap(), 0, sprite->sprites);
129  }
130 
131  if (sprite->stateblock)
133  if (sprite->vdecl)
135  if (sprite->device)
138  }
139 
140  return refcount;
141 }
142 
143 static HRESULT WINAPI d3dx9_sprite_GetDevice(struct ID3DXSprite *iface, struct IDirect3DDevice9 **device)
144 {
145  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
146 
147  TRACE("iface %p, device %p.\n", iface, device);
148 
149  if (!device)
150  return D3DERR_INVALIDCALL;
151  *device = sprite->device;
153 
154  return D3D_OK;
155 }
156 
158 {
159  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
160 
161  TRACE("iface %p, transform %p.\n", iface, transform);
162 
163  if (!transform)
164  return D3DERR_INVALIDCALL;
166 
167  return D3D_OK;
168 }
169 
170 static HRESULT WINAPI d3dx9_sprite_SetTransform(ID3DXSprite *iface, const D3DXMATRIX *transform)
171 {
172  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
173 
174  TRACE("iface %p, transform %p.\n", iface, transform);
175 
176  if (!transform)
177  return D3DERR_INVALIDCALL;
179 
180  return D3D_OK;
181 }
182 
183 static HRESULT WINAPI d3dx9_sprite_SetWorldViewRH(ID3DXSprite *iface,
184  const D3DXMATRIX *world, const D3DXMATRIX *view)
185 {
186  FIXME("iface %p, world %p, view %p stub!\n", iface, world, view);
187 
188  return E_NOTIMPL;
189 }
190 
191 static HRESULT WINAPI d3dx9_sprite_SetWorldViewLH(ID3DXSprite *iface,
192  const D3DXMATRIX *world, const D3DXMATRIX *view)
193 {
194  FIXME("iface %p, world %p, view %p stub!\n", iface, world, view);
195 
196  return E_NOTIMPL;
197 }
198 
199 /* Helper function */
200 static void set_states(struct d3dx9_sprite *object)
201 {
202  D3DXMATRIX mat;
203  D3DVIEWPORT9 vp;
204 
205  /* Miscellaneous stuff */
208  IDirect3DDevice9_SetNPatchMode(object->device, 0.0f);
209 
210  /* Render states */
237 
238  /* Texture stage states */
249 
250  /* Sampler states */
253 
254  if(object->texfilter_caps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
257 
260 
261  if(object->texfilter_caps & D3DPTFILTERCAPS_MINFANISOTROPIC)
264 
265  if(object->texfilter_caps & D3DPTFILTERCAPS_MIPFLINEAR)
268 
271 
272  /* Matrices */
273  D3DXMatrixIdentity(&mat);
276  IDirect3DDevice9_GetViewport(object->device, &vp);
277  D3DXMatrixOrthoOffCenterLH(&mat, vp.X+0.5f, (float)vp.Width+vp.X+0.5f, (float)vp.Height+vp.Y+0.5f, vp.Y+0.5f, vp.MinZ, vp.MaxZ);
279 }
280 
281 static HRESULT WINAPI d3dx9_sprite_Begin(ID3DXSprite *iface, DWORD flags)
282 {
283  struct d3dx9_sprite *This = impl_from_ID3DXSprite(iface);
284  HRESULT hr;
285 
286  TRACE("iface %p, flags %#x.\n", iface, flags);
287 
288  if(flags>D3DXSPRITE_FLAGLIMIT || This->ready) return D3DERR_INVALIDCALL;
289 
290 /* TODO: Implement flags:
291 D3DXSPRITE_BILLBOARD: makes the sprite always face the camera
292 D3DXSPRITE_DONOTMODIFY_RENDERSTATE: name says it all
293 D3DXSPRITE_OBJECTSPACE: do not change device transforms
294 D3DXSPRITE_SORT_DEPTH_BACKTOFRONT: sort by position
295 D3DXSPRITE_SORT_DEPTH_FRONTTOBACK: sort by position
296 D3DXSPRITE_SORT_TEXTURE: sort by texture (so that it doesn't change too often)
297 */
298 /* Seems like alpha blending is always enabled, regardless of D3DXSPRITE_ALPHABLEND flag */
302  FIXME("Flags unsupported: %#x\n", flags);
303  /* These flags should only matter to performance */
305  TRACE("Flags unsupported: %#x\n", flags);
306 
307  if(This->vdecl==NULL) {
308  static const D3DVERTEXELEMENT9 elements[] =
309  {
313  D3DDECL_END()
314  };
315  IDirect3DDevice9_CreateVertexDeclaration(This->device, elements, &This->vdecl);
316  }
317 
319  if(This->stateblock==NULL) {
320  /* Tell our state block what it must store */
322  if(hr!=D3D_OK) return hr;
323 
324  set_states(This);
325 
327  IDirect3DDevice9_SetStreamSource(This->device, 0, NULL, 0, sizeof(struct sprite_vertex));
330 
331  IDirect3DDevice9_EndStateBlock(This->device, &This->stateblock);
332  }
333  IDirect3DStateBlock9_Capture(This->stateblock); /* Save current state */
334  }
335 
336  /* Apply device state */
337  set_states(This);
338 
339  This->flags=flags;
340  This->ready=TRUE;
341 
342  return D3D_OK;
343 }
344 
345 static HRESULT WINAPI d3dx9_sprite_Draw(ID3DXSprite *iface, IDirect3DTexture9 *texture,
346  const RECT *rect, const D3DXVECTOR3 *center, const D3DXVECTOR3 *position, D3DCOLOR color)
347 {
348  struct d3dx9_sprite *This = impl_from_ID3DXSprite(iface);
349  struct sprite *new_sprites;
350  D3DSURFACE_DESC texdesc;
351 
352  TRACE("iface %p, texture %p, rect %s, center %p, position %p, color 0x%08x.\n",
353  iface, texture, wine_dbgstr_rect(rect), center, position, color);
354 
355  if(texture==NULL) return D3DERR_INVALIDCALL;
356  if(!This->ready) return D3DERR_INVALIDCALL;
357 
358  if (!This->allocated_sprites)
359  {
360  This->sprites = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 32 * sizeof(*This->sprites));
361  This->allocated_sprites = 32;
362  }
363  else if (This->allocated_sprites <= This->sprite_count)
364  {
366  This->sprites, This->allocated_sprites * 2 * sizeof(*This->sprites));
367  if (!new_sprites)
368  return E_OUTOFMEMORY;
369  This->sprites = new_sprites;
370  This->allocated_sprites *= 2;
371  }
372  This->sprites[This->sprite_count].texture=texture;
373  if(!(This->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
375 
376  /* Reuse the texture desc if possible */
377  if(This->sprite_count) {
378  if(This->sprites[This->sprite_count-1].texture!=texture) {
380  } else {
381  texdesc.Width=This->sprites[This->sprite_count-1].texw;
382  texdesc.Height=This->sprites[This->sprite_count-1].texh;
383  }
384  } else IDirect3DTexture9_GetLevelDesc(texture, 0, &texdesc);
385 
386  This->sprites[This->sprite_count].texw=texdesc.Width;
387  This->sprites[This->sprite_count].texh=texdesc.Height;
388 
389  if (rect)
390  This->sprites[This->sprite_count].rect = *rect;
391  else
392  SetRect(&This->sprites[This->sprite_count].rect, 0, 0, texdesc.Width, texdesc.Height);
393 
394  if(center==NULL) {
395  This->sprites[This->sprite_count].center.x=0.0f;
396  This->sprites[This->sprite_count].center.y=0.0f;
397  This->sprites[This->sprite_count].center.z=0.0f;
398  } else This->sprites[This->sprite_count].center=*center;
399 
400  if(position==NULL) {
401  This->sprites[This->sprite_count].pos.x=0.0f;
402  This->sprites[This->sprite_count].pos.y=0.0f;
403  This->sprites[This->sprite_count].pos.z=0.0f;
404  } else This->sprites[This->sprite_count].pos=*position;
405 
406  This->sprites[This->sprite_count].color=color;
407  This->sprites[This->sprite_count].transform=This->transform;
408  This->sprite_count++;
409 
410  return D3D_OK;
411 }
412 
413 static HRESULT WINAPI d3dx9_sprite_Flush(ID3DXSprite *iface)
414 {
415  struct d3dx9_sprite *This = impl_from_ID3DXSprite(iface);
416  struct sprite_vertex *vertices;
417  int i, count=0, start;
418 
419  TRACE("iface %p.\n", iface);
420 
421  if(!This->ready) return D3DERR_INVALIDCALL;
422  if(!This->sprite_count) return D3D_OK;
423 
424 /* TODO: use of a vertex buffer here */
425  vertices = HeapAlloc(GetProcessHeap(), 0, sizeof(*vertices) * 6 * This->sprite_count);
426 
427  for(start=0;start<This->sprite_count;start+=count,count=0) {
428  i=start;
429  while(i<This->sprite_count &&
430  (count==0 || This->sprites[i].texture==This->sprites[i-1].texture)) {
431  float spritewidth=(float)This->sprites[i].rect.right-(float)This->sprites[i].rect.left;
432  float spriteheight=(float)This->sprites[i].rect.bottom-(float)This->sprites[i].rect.top;
433 
434  vertices[6*i ].pos.x = This->sprites[i].pos.x - This->sprites[i].center.x;
435  vertices[6*i ].pos.y = This->sprites[i].pos.y - This->sprites[i].center.y;
436  vertices[6*i ].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
437  vertices[6*i+1].pos.x = spritewidth + This->sprites[i].pos.x - This->sprites[i].center.x;
438  vertices[6*i+1].pos.y = This->sprites[i].pos.y - This->sprites[i].center.y;
439  vertices[6*i+1].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
440  vertices[6*i+2].pos.x = spritewidth + This->sprites[i].pos.x - This->sprites[i].center.x;
441  vertices[6*i+2].pos.y = spriteheight + This->sprites[i].pos.y - This->sprites[i].center.y;
442  vertices[6*i+2].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
443  vertices[6*i+3].pos.x = This->sprites[i].pos.x - This->sprites[i].center.x;
444  vertices[6*i+3].pos.y = spriteheight + This->sprites[i].pos.y - This->sprites[i].center.y;
445  vertices[6*i+3].pos.z = This->sprites[i].pos.z - This->sprites[i].center.z;
446  vertices[6*i ].col = This->sprites[i].color;
447  vertices[6*i+1].col = This->sprites[i].color;
448  vertices[6*i+2].col = This->sprites[i].color;
449  vertices[6*i+3].col = This->sprites[i].color;
450  vertices[6*i ].tex.x = (float)This->sprites[i].rect.left / (float)This->sprites[i].texw;
451  vertices[6*i ].tex.y = (float)This->sprites[i].rect.top / (float)This->sprites[i].texh;
452  vertices[6*i+1].tex.x = (float)This->sprites[i].rect.right / (float)This->sprites[i].texw;
453  vertices[6*i+1].tex.y = (float)This->sprites[i].rect.top / (float)This->sprites[i].texh;
454  vertices[6*i+2].tex.x = (float)This->sprites[i].rect.right / (float)This->sprites[i].texw;
455  vertices[6*i+2].tex.y = (float)This->sprites[i].rect.bottom / (float)This->sprites[i].texh;
456  vertices[6*i+3].tex.x = (float)This->sprites[i].rect.left / (float)This->sprites[i].texw;
457  vertices[6*i+3].tex.y = (float)This->sprites[i].rect.bottom / (float)This->sprites[i].texh;
458 
459  vertices[6*i+4]=vertices[6*i];
460  vertices[6*i+5]=vertices[6*i+2];
461 
462  D3DXVec3TransformCoordArray(&vertices[6 * i].pos, sizeof(*vertices),
463  &vertices[6 * i].pos, sizeof(*vertices), &This->sprites[i].transform, 6);
464  count++;
465  i++;
466  }
467 
468  IDirect3DDevice9_SetTexture(This->device, 0, (struct IDirect3DBaseTexture9 *)This->sprites[start].texture);
470 
472  2 * count, vertices + 6 * start, sizeof(*vertices));
473  }
474  HeapFree(GetProcessHeap(), 0, vertices);
475 
476  if(!(This->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
477  for(i=0;i<This->sprite_count;i++)
478  IDirect3DTexture9_Release(This->sprites[i].texture);
479 
480  This->sprite_count=0;
481 
482  /* Flush may be called more than once, so we don't reset This->ready here */
483 
484  return D3D_OK;
485 }
486 
487 static HRESULT WINAPI d3dx9_sprite_End(ID3DXSprite *iface)
488 {
489  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
490 
491  TRACE("iface %p.\n", iface);
492 
493  if (!sprite->ready)
494  return D3DERR_INVALIDCALL;
495 
496  ID3DXSprite_Flush(iface);
497 
498  if (sprite->stateblock && !(sprite->flags & D3DXSPRITE_DONOTSAVESTATE))
499  IDirect3DStateBlock9_Apply(sprite->stateblock); /* Restore old state */
500 
501  sprite->ready = FALSE;
502 
503  return D3D_OK;
504 }
505 
506 static HRESULT WINAPI d3dx9_sprite_OnLostDevice(ID3DXSprite *iface)
507 {
508  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
509 
510  TRACE("iface %p.\n", iface);
511 
512  if (sprite->stateblock)
514  if (sprite->vdecl)
516  sprite->vdecl = NULL;
517  sprite->stateblock = NULL;
518 
519  /* Reset some variables */
521 
522  return D3D_OK;
523 }
524 
525 static HRESULT WINAPI d3dx9_sprite_OnResetDevice(ID3DXSprite *iface)
526 {
527  struct d3dx9_sprite *sprite = impl_from_ID3DXSprite(iface);
528  int i;
529 
530  TRACE("iface %p.\n", iface);
531 
533  {
534  for (i = 0; i < sprite->sprite_count; ++i)
535  {
536  if (sprite->sprites[i].texture)
538  }
539  }
540 
541  sprite->sprite_count = 0;
542  sprite->flags = 0;
543  sprite->ready = FALSE;
544 
545  /* keep matrices */
546  /* device objects get restored on Begin */
547 
548  return D3D_OK;
549 }
550 
551 static const ID3DXSpriteVtbl d3dx9_sprite_vtbl =
552 {
567 };
568 
569 HRESULT WINAPI D3DXCreateSprite(struct IDirect3DDevice9 *device, struct ID3DXSprite **sprite)
570 {
571  struct d3dx9_sprite *object;
572  D3DCAPS9 caps;
573 
574  TRACE("device %p, sprite %p.\n", device, sprite);
575 
576  if(device==NULL || sprite==NULL) return D3DERR_INVALIDCALL;
577 
578  if (!(object=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
579  {
580  *sprite = NULL;
581  return E_OUTOFMEMORY;
582  }
583  object->ID3DXSprite_iface.lpVtbl = &d3dx9_sprite_vtbl;
584  object->ref=1;
585  object->device=device;
586  IUnknown_AddRef(device);
587 
588  object->vdecl=NULL;
589  object->stateblock=NULL;
590 
591  D3DXMatrixIdentity(&object->transform);
592  D3DXMatrixIdentity(&object->view);
593 
595  object->texfilter_caps=caps.TextureFilterCaps;
596  object->maxanisotropy=caps.MaxAnisotropy;
597  object->alphacmp_caps=caps.AlphaCmpCaps;
598 
599  ID3DXSprite_OnResetDevice(&object->ID3DXSprite_iface);
600 
601  object->sprites=NULL;
602  object->allocated_sprites=0;
603  *sprite=&object->ID3DXSprite_iface;
604 
605  return D3D_OK;
606 }
#define IDirect3DDevice9_SetTextureStageState(p, a, b, c)
Definition: d3d9.h:1574
#define D3DXSPRITE_SORT_DEPTH_BACKTOFRONT
Definition: d3dx9core.h:40
DWORD flags
Definition: sprite.c:60
#define D3DXSPRITE_SORT_DEPTH_FRONTTOBACK
Definition: d3dx9core.h:39
ID3DXSprite ID3DXSprite_iface
Definition: sprite.c:52
#define REFIID
Definition: guiddef.h:118
#define E_NOINTERFACE
Definition: winerror.h:2364
coclass MSXML2::XSLTemplate40 object
HRESULT hr
Definition: shlfolder.c:183
struct sprite * sprites
Definition: sprite.c:68
FLOAT y
Definition: d3dx9math.h:64
#define D3DPTFILTERCAPS_MAGFANISOTROPIC
Definition: d3d8caps.h:135
D3DCOLOR color
Definition: sprite.c:46
D3DXVECTOR3 center
Definition: sprite.c:44
#define TRUE
Definition: types.h:120
REFIID riid
Definition: precomp.h:44
static HRESULT WINAPI d3dx9_sprite_Flush(ID3DXSprite *iface)
Definition: sprite.c:413
static HRESULT WINAPI d3dx9_sprite_SetWorldViewLH(ID3DXSprite *iface, const D3DXMATRIX *world, const D3DXMATRIX *view)
Definition: sprite.c:191
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define D3DCOLORWRITEENABLE_ALPHA
Definition: d3d8types.h:151
WINE_DEFAULT_DEBUG_CHANNEL(d3dx)
#define WARN(fmt,...)
Definition: debug.h:112
#define IDirect3DTexture9_Release(p)
Definition: d3d9.h:1014
#define D3DERR_INVALIDCALL
int allocated_sprites
Definition: sprite.c:70
#define IDirect3DStateBlock9_Apply(p)
Definition: d3d9.h:1304
static const MAT2 mat
Definition: font.c:66
#define IDirect3DDevice9_CreateVertexDeclaration(p, a, b)
Definition: d3d9.h:1593
D3DXVECTOR3 pos
Definition: sprite.c:45
#define D3DXSPRITE_DO_NOT_ADDREF_TEXTURE
Definition: d3dx9core.h:41
DWORD TextureFilterCaps
Definition: d3d9caps.h:280
#define IDirect3DTexture9_AddRef(p)
Definition: d3d9.h:1013
& rect
Definition: startmenu.cpp:1413
FxDevice * device
D3DXMATRIX transform
Definition: sprite.c:47
static struct d3dx9_sprite * impl_from_ID3DXSprite(ID3DXSprite *iface)
Definition: sprite.c:73
#define IDirect3DTexture9_GetLevelDesc(p, a, b)
Definition: d3d9.h:1032
#define D3DCOLORWRITEENABLE_RED
Definition: d3d8types.h:148
#define D3DPTFILTERCAPS_MIPFLINEAR
Definition: d3d8caps.h:132
DWORD maxanisotropy
Definition: sprite.c:65
#define D3DXSPRITE_DONOTSAVESTATE
Definition: d3dx9core.h:33
#define D3DXSPRITE_BILLBOARD
Definition: d3dx9core.h:36
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
GLuint color
Definition: glext.h:6243
Definition: devices.h:37
#define FIXME(fmt,...)
Definition: debug.h:111
#define IDirect3DDevice9_SetStreamSource(p, a, b, c, d)
Definition: d3d9.h:1607
#define D3DXSPRITE_SORT_TEXTURE
Definition: d3dx9core.h:38
#define IDirect3DDevice9_Release(p)
Definition: d3d9.h:1508
#define D3DTA_TEXTURE
Definition: d3d8types.h:141
D3DXMATRIX transform
Definition: sprite.c:58
#define debugstr_guid
Definition: kernel32.h:35
RECT rect
Definition: sprite.c:43
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
IDirect3DVertexDeclaration9 * vdecl
Definition: sprite.c:56
IDirect3DTexture9 * texture
Definition: sprite.c:41
#define IDirect3DDevice9_BeginStateBlock(p)
Definition: d3d9.h:1567
LONG ref
Definition: sprite.c:53
#define IDirect3DDevice9_SetPixelShader(p, a)
Definition: d3d9.h:1614
#define IDirect3DDevice9_GetViewport(p, a)
Definition: d3d9.h:1555
#define TRACE(s)
Definition: solgame.cpp:4
static HRESULT WINAPI d3dx9_sprite_End(ID3DXSprite *iface)
Definition: sprite.c:487
static HRESULT WINAPI d3dx9_sprite_QueryInterface(ID3DXSprite *iface, REFIID riid, void **out)
Definition: sprite.c:78
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define ID3DXSprite_Flush(p)
Definition: d3dx9core.h:451
IDirect3DDevice9 * device
Definition: sprite.c:55
GLenum GLuint texture
Definition: glext.h:6295
LONG HRESULT
Definition: typedefs.h:79
const GUID IID_IUnknown
FLOAT x
Definition: d3dx9math.h:64
#define WINAPI
Definition: msvc.h:6
#define IDirect3DStateBlock9_Capture(p)
Definition: d3d9.h:1303
const char * wine_dbgstr_rect(const RECT *rect)
static FILE * out
Definition: regtests2xml.c:44
unsigned long DWORD
Definition: ntddk_ex.h:95
static HRESULT WINAPI d3dx9_sprite_OnLostDevice(ID3DXSprite *iface)
Definition: sprite.c:506
#define IDirect3DDevice9_AddRef(p)
Definition: d3d9.h:1507
static ULONG WINAPI d3dx9_sprite_Release(ID3DXSprite *iface)
Definition: sprite.c:106
GLbitfield flags
Definition: glext.h:7161
D3DXMATRIX *WINAPI D3DXMatrixOrthoOffCenterLH(D3DXMATRIX *pout, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf)
Definition: math.c:443
#define D3DCOLORWRITEENABLE_GREEN
Definition: d3d8types.h:149
DWORD AlphaCmpCaps
Definition: d3d9caps.h:277
#define IDirect3DDevice9_SetTransform(p, a, b)
Definition: d3d9.h:1551
#define InterlockedDecrement
Definition: armddk.h:52
int sprite_count
Definition: sprite.c:69
#define IDirect3DStateBlock9_Release(p)
Definition: d3d9.h:1300
#define D3DPTFILTERCAPS_MINFANISOTROPIC
Definition: d3d8caps.h:130
D3DXVECTOR3 pos
Definition: sprite.c:34
static HRESULT WINAPI d3dx9_sprite_SetTransform(ID3DXSprite *iface, const D3DXMATRIX *transform)
Definition: sprite.c:170
#define D3DDECL_END()
Definition: d3d9types.h:311
#define IDirect3DDevice9_SetVertexShader(p, a)
Definition: d3d9.h:1599
#define D3DCOLORWRITEENABLE_BLUE
Definition: d3d8types.h:150
Definition: sprite.c:39
DWORD texfilter_caps
Definition: sprite.c:64
#define IDirect3DDevice9_SetRenderState(p, a, b)
Definition: d3d9.h:1564
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define S_OK
Definition: intsafe.h:52
#define D3D_OK
Definition: d3d.h:106
#define IDirect3DDevice9_SetTexture(p, a, b)
Definition: d3d9.h:1572
#define InterlockedIncrement
Definition: armddk.h:53
static HRESULT WINAPI d3dx9_sprite_Begin(ID3DXSprite *iface, DWORD flags)
Definition: sprite.c:281
static HRESULT WINAPI d3dx9_sprite_GetTransform(ID3DXSprite *iface, D3DXMATRIX *transform)
Definition: sprite.c:157
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
UINT texh
Definition: sprite.c:42
static float(__cdecl *square_half_float)(float x
GLuint start
Definition: gl.h:1545
#define IDirect3DDevice9_GetDeviceCaps(p, a)
Definition: d3d9.h:1514
static HRESULT WINAPI d3dx9_sprite_GetDevice(struct ID3DXSprite *iface, struct IDirect3DDevice9 **device)
Definition: sprite.c:143
#define HeapReAlloc
Definition: compat.h:593
UINT texw
Definition: sprite.c:42
#define E_NOTIMPL
Definition: ddrawi.h:99
#define IDirect3DDevice9_SetIndices(p, a)
Definition: d3d9.h:1611
D3DXVECTOR3 *WINAPI D3DXVec3TransformCoordArray(D3DXVECTOR3 *out, UINT outstride, const D3DXVECTOR3 *in, UINT instride, const D3DXMATRIX *matrix, UINT elements)
Definition: math.c:1913
#define D3DTS_WORLD
Definition: d3d8types.h:85
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
DWORD col
Definition: sprite.c:35
#define D3DTA_DIFFUSE
Definition: d3d8types.h:139
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define D3DXSPRITE_DONOTMODIFY_RENDERSTATE
Definition: d3dx9core.h:34
static ULONG WINAPI d3dx9_sprite_AddRef(ID3DXSprite *iface)
Definition: sprite.c:96
static void set_states(struct d3dx9_sprite *object)
Definition: sprite.c:200
static HRESULT WINAPI d3dx9_sprite_Draw(ID3DXSprite *iface, IDirect3DTexture9 *texture, const RECT *rect, const D3DXVECTOR3 *center, const D3DXVECTOR3 *position, D3DCOLOR color)
Definition: sprite.c:345
#define D3DXSPRITE_FLAGLIMIT
Definition: sprite.c:30
HRESULT WINAPI D3DXCreateSprite(struct IDirect3DDevice9 *device, struct ID3DXSprite **sprite)
Definition: sprite.c:569
D3DXVECTOR2 tex
Definition: sprite.c:36
unsigned int ULONG
Definition: retypes.h:1
#define IDirect3DDevice9_SetNPatchMode(p, a)
Definition: d3d9.h:1586
GLuint GLenum GLenum transform
Definition: glext.h:9407
IDirect3DStateBlock9 * stateblock
Definition: sprite.c:57
static const ID3DXSpriteVtbl d3dx9_sprite_vtbl
Definition: sprite.c:551
DWORD MaxAnisotropy
Definition: d3d9caps.h:291
BOOL ready
Definition: sprite.c:61
D3DXMATRIX view
Definition: sprite.c:59
static HRESULT WINAPI d3dx9_sprite_SetWorldViewRH(ID3DXSprite *iface, const D3DXMATRIX *world, const D3DXMATRIX *view)
Definition: sprite.c:183
#define IDirect3DDevice9_SetVertexDeclaration(p, a)
Definition: d3d9.h:1594
#define IDirect3DDevice9_DrawPrimitiveUP(p, a, b, c, d)
Definition: d3d9.h:1590
#define IDirect3DDevice9_SetSamplerState(p, a, b, c)
Definition: d3d9.h:1576
DWORD alphacmp_caps
Definition: sprite.c:66
#define ID3DXSprite_OnResetDevice(p)
Definition: d3dx9core.h:454
#define IDirect3DDevice9_EndStateBlock(p, a)
Definition: d3d9.h:1568
#define HeapFree(x, y, z)
Definition: compat.h:594
#define IDirect3DVertexDeclaration9_Release(p)
Definition: d3d9.h:1185
#define D3DXSPRITE_OBJECTSPACE
Definition: d3dx9core.h:35
static HRESULT WINAPI d3dx9_sprite_OnResetDevice(ID3DXSprite *iface)
Definition: sprite.c:525