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"
25 WINE_DEFAULT_DEBUG_CHANNEL(d3dx
);
27 #define D3DERR_INVALIDCALL 0x8876086c
31 ID3DX10Sprite ID3DX10Sprite_iface
;
34 D3DXMATRIX projection
;
38 static inline struct d3dx10_sprite
*impl_from_ID3DX10Sprite(ID3DX10Sprite
*iface
)
40 return CONTAINING_RECORD(iface
, struct d3dx10_sprite
, ID3DX10Sprite_iface
);
43 static HRESULT WINAPI
d3dx10_sprite_QueryInterface(ID3DX10Sprite
*iface
, REFIID riid
, void **out
)
45 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
47 if (IsEqualGUID(riid
, &IID_ID3DX10Sprite
)
48 || IsEqualGUID(riid
, &IID_IUnknown
))
50 IUnknown_AddRef(iface
);
55 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
61 static ULONG WINAPI
d3dx10_sprite_AddRef(ID3DX10Sprite
*iface
)
63 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
64 ULONG refcount
= InterlockedIncrement(&sprite
->refcount
);
66 TRACE("%p increasing refcount to %lu.\n", iface
, refcount
);
71 static ULONG WINAPI
d3dx10_sprite_Release(ID3DX10Sprite
*iface
)
73 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
74 ULONG refcount
= InterlockedDecrement(&sprite
->refcount
);
76 TRACE("%p decreasing refcount to %lu.\n", iface
, refcount
);
80 ID3D10Device_Release(sprite
->device
);
87 static HRESULT WINAPI
d3dx10_sprite_Begin(ID3DX10Sprite
*iface
, UINT flags
)
89 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
94 static HRESULT WINAPI
d3dx10_sprite_DrawSpritesBuffered(ID3DX10Sprite
*iface
,
95 D3DX10_SPRITE
*sprites
, UINT count
)
97 FIXME("iface %p, sprites %p, count %u stub!\n", iface
, sprites
, count
);
102 static HRESULT WINAPI
d3dx10_sprite_Flush(ID3DX10Sprite
*iface
)
104 FIXME("iface %p stub!\n", iface
);
109 static HRESULT WINAPI
d3dx10_sprite_DrawSpritesImmediate(ID3DX10Sprite
*iface
,
110 D3DX10_SPRITE
*sprites
, UINT count
, UINT size
, UINT flags
)
112 FIXME("iface %p, sprites %p, count %u, size %u, flags %#x stub!\n",
113 iface
, sprites
, count
, size
, flags
);
118 static HRESULT WINAPI
d3dx10_sprite_End(ID3DX10Sprite
*iface
)
120 FIXME("iface %p stub!\n", iface
);
125 static HRESULT WINAPI
d3dx10_sprite_GetViewTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
127 FIXME("iface %p, transform %p stub!\n", iface
, transform
);
132 static HRESULT WINAPI
d3dx10_sprite_SetViewTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
134 FIXME("iface %p, transform %p stub!\n", iface
, transform
);
139 static HRESULT WINAPI
d3dx10_sprite_GetProjectionTransform(ID3DX10Sprite
*iface
,
140 D3DXMATRIX
*transform
)
142 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
144 TRACE("iface %p, transform %p.\n", iface
, transform
);
149 *transform
= sprite
->projection
;
154 static HRESULT WINAPI
d3dx10_sprite_SetProjectionTransform(ID3DX10Sprite
*iface
, D3DXMATRIX
*transform
)
156 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
158 TRACE("iface %p, transform %p.\n", iface
, transform
);
163 sprite
->projection
= *transform
;
168 static HRESULT WINAPI
d3dx10_sprite_GetDevice(ID3DX10Sprite
*iface
, ID3D10Device
**device
)
170 struct d3dx10_sprite
*sprite
= impl_from_ID3DX10Sprite(iface
);
172 TRACE("iface %p, device %p.\n", iface
, device
);
177 *device
= sprite
->device
;
178 ID3D10Device_AddRef(*device
);
183 static const ID3DX10SpriteVtbl d3dx10_sprite_vtbl
=
185 d3dx10_sprite_QueryInterface
,
186 d3dx10_sprite_AddRef
,
187 d3dx10_sprite_Release
,
189 d3dx10_sprite_DrawSpritesBuffered
,
191 d3dx10_sprite_DrawSpritesImmediate
,
193 d3dx10_sprite_GetViewTransform
,
194 d3dx10_sprite_SetViewTransform
,
195 d3dx10_sprite_GetProjectionTransform
,
196 d3dx10_sprite_SetProjectionTransform
,
197 d3dx10_sprite_GetDevice
,
200 HRESULT WINAPI
D3DX10CreateSprite(ID3D10Device
*device
, UINT size
, ID3DX10Sprite
**sprite
)
202 struct d3dx10_sprite
*object
;
204 TRACE("device %p, size %u, sprite %p.\n", device
, size
, sprite
);
206 if (!device
|| !sprite
)
207 return D3DERR_INVALIDCALL
;
211 if (!(object
= calloc(1, sizeof(*object
))))
212 return E_OUTOFMEMORY
;
214 object
->ID3DX10Sprite_iface
.lpVtbl
= &d3dx10_sprite_vtbl
;
215 object
->refcount
= 1;
216 object
->device
= device
;
217 ID3D10Device_AddRef(device
);
218 object
->projection
._11
= 1.0f
;
219 object
->projection
._22
= 1.0f
;
220 object
->projection
._33
= 1.0f
;
221 object
->projection
._44
= 1.0f
;
223 *sprite
= &object
->ID3DX10Sprite_iface
;