2 * Copyright 2021 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/debug.h"
24 #include "wine/heap.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
28 #define D3DERR_INVALIDCALL 0x8876086c
32 ID3DX10Sprite ID3DX10Sprite_iface
;
35 D3DXMATRIX projection
;
39 static inline struct d3dx10_sprite
*impl_from_ID3DX10Sprite(ID3DX10Sprite
*iface
)
41 return CONTAINING_RECORD(iface
, struct d3dx10_sprite
, ID3DX10Sprite_iface
);
44 static HRESULT WINAPI
d3dx10_sprite_QueryInterface(ID3DX10Sprite
*iface
, REFIID riid
, void **out
)
46 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
48 if (IsEqualGUID(riid
, &IID_ID3DX10Sprite
)
49 || IsEqualGUID(riid
, &IID_IUnknown
))
51 IUnknown_AddRef(iface
);
56 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
62 static ULONG WINAPI
d3dx10_sprite_AddRef(ID3DX10Sprite
*iface
)
64 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
65 ULONG refcount
= InterlockedIncrement(&sprite
->refcount
);
67 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
72 static ULONG WINAPI
d3dx10_sprite_Release(ID3DX10Sprite
*iface
)
74 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
75 ULONG refcount
= InterlockedDecrement(&sprite
->refcount
);
77 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
81 ID3D10Device_Release(sprite
->device
);
88 static HRESULT WINAPI
d3dx10_sprite_Begin(ID3DX10Sprite
*iface
, UINT flags
)
90 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
95 static HRESULT WINAPI
d3dx10_sprite_DrawSpritesBuffered(ID3DX10Sprite
*iface
,
96 D3DX10_SPRITE
*sprites
, UINT count
)
98 FIXME("iface %p, sprites %p, count %u stub!\n", iface
, sprites
, count
);
103 static HRESULT WINAPI
d3dx10_sprite_Flush(ID3DX10Sprite
*iface
)
105 FIXME("iface %p stub!\n", iface
);
110 static HRESULT WINAPI
d3dx10_sprite_DrawSpritesImmediate(ID3DX10Sprite
*iface
,
111 D3DX10_SPRITE
*sprites
, UINT count
, UINT size
, UINT flags
)
113 FIXME("iface %p, sprites %p, count %u, size %u, flags %#x stub!\n",
114 iface
, sprites
, count
, size
, flags
);
119 static HRESULT WINAPI
d3dx10_sprite_End(ID3DX10Sprite
*iface
)
121 FIXME("iface %p stub!\n", iface
);
126 static HRESULT WINAPI
d3dx10_sprite_GetViewTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
128 FIXME("iface %p, transform %p stub!\n", iface
, transform
);
133 static HRESULT WINAPI
d3dx10_sprite_SetViewTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
135 FIXME("iface %p, transform %p stub!\n", iface
, transform
);
140 static HRESULT WINAPI
d3dx10_sprite_GetProjectionTransform(ID3DX10Sprite
*iface
,
141 D3DXMATRIX
*transform
)
143 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
145 TRACE("iface %p, transform %p.\n", iface
, transform
);
150 *transform
= sprite
->projection
;
155 static HRESULT WINAPI
d3dx10_sprite_SetProjectionTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
157 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
159 TRACE("iface %p, transform %p.\n", iface
, transform
);
164 sprite
->projection
= *transform
;
169 static HRESULT WINAPI
d3dx10_sprite_GetDevice(ID3DX10Sprite
*iface
, ID3D10Device
**device
)
171 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
173 TRACE("iface %p, device %p.\n", iface
, device
);
178 *device
= sprite
->device
;
179 ID3D10Device_AddRef(*device
);
184 static const ID3DX10SpriteVtbl d3dx10_sprite_vtbl
=
186 d3dx10_sprite_QueryInterface
,
187 d3dx10_sprite_AddRef
,
188 d3dx10_sprite_Release
,
190 d3dx10_sprite_DrawSpritesBuffered
,
192 d3dx10_sprite_DrawSpritesImmediate
,
194 d3dx10_sprite_GetViewTransform
,
195 d3dx10_sprite_SetViewTransform
,
196 d3dx10_sprite_GetProjectionTransform
,
197 d3dx10_sprite_SetProjectionTransform
,
198 d3dx10_sprite_GetDevice
,
201 HRESULT WINAPI
D3DX10CreateSprite(ID3D10Device
*device
, UINT size
, ID3DX10Sprite
**sprite
)
203 struct d3dx10_sprite
*object
;
205 TRACE("device %p, size %u, sprite %p.\n", device
, size
, sprite
);
207 if (!device
|| !sprite
)
208 return D3DERR_INVALIDCALL
;
212 if (!(object
= heap_alloc_zero(sizeof(*object
))))
213 return E_OUTOFMEMORY
;
215 object
->ID3DX10Sprite_iface
.lpVtbl
= &d3dx10_sprite_vtbl
;
216 object
->refcount
= 1;
217 object
->device
= device
;
218 ID3D10Device_AddRef(device
);
219 object
->projection
._11
= 1.0f
;
220 object
->projection
._22
= 1.0f
;
221 object
->projection
._33
= 1.0f
;
222 object
->projection
._44
= 1.0f
;
224 *sprite
= &object
->ID3DX10Sprite_iface
;