d3dx9_36: Implement D3DXCreateLine and add stubbed interface for ID3DXLine + tests.
[wine] / dlls / d3dx9_36 / line.c
1 /*
2  * Copyright 2010 Christian Costa
3  *
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.
8  *
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.
13  *
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
17  *
18  */
19
20 #include "wine/debug.h"
21 #include "d3dx9_36_private.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
24
25 static const struct ID3DXLineVtbl ID3DXLine_Vtbl;
26
27 typedef struct ID3DXLineImpl {
28     const ID3DXLineVtbl *lpVtbl;
29     LONG ref;
30 } ID3DXLineImpl;
31
32 /*** IUnknown methods ***/
33 static HRESULT WINAPI ID3DXLineImpl_QueryInterface(ID3DXLine* iface, REFIID riid, LPVOID* object)
34 {
35     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
36
37     TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), object);
38
39     if (IsEqualGUID(riid, &IID_IUnknown) ||
40         IsEqualGUID(riid, &IID_ID3DXLine))
41     {
42         ID3DXLine_AddRef(iface);
43         *object = This;
44         return S_OK;
45     }
46
47     ERR("Interface %s not found\n", debugstr_guid(riid));
48
49     return E_NOINTERFACE;
50 }
51
52 static ULONG WINAPI ID3DXLineImpl_AddRef(ID3DXLine* iface)
53 {
54     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
55
56     TRACE("(%p)->(): AddRef from %u\n", This, This->ref);
57
58     return InterlockedIncrement(&This->ref);
59 }
60
61 static ULONG WINAPI ID3DXLineImpl_Release(ID3DXLine* iface)
62 {
63     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
64     ULONG ref = InterlockedDecrement(&This->ref);
65
66     TRACE("(%p)->(): Release from %u\n", This, ref + 1);
67
68     if (!ref)
69         HeapFree(GetProcessHeap(), 0, This);
70
71     return ref;
72 }
73
74 /*** ID3DXLine methods ***/
75 static HRESULT WINAPI ID3DXLineImpl_GetDevice(ID3DXLine* iface, LPDIRECT3DDEVICE9* device)
76 {
77     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
78
79     FIXME("(%p)->(%p): stub\n", This, device);
80
81     return E_NOTIMPL;
82 }
83
84 static HRESULT WINAPI ID3DXLineImpl_Begin(ID3DXLine* iface)
85 {
86     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
87
88     FIXME("(%p)->(): stub\n", This);
89
90     return E_NOTIMPL;
91 }
92
93 static HRESULT WINAPI ID3DXLineImpl_Draw(ID3DXLine* iface, CONST D3DXVECTOR2* vertexlist, DWORD vertexlistcount, D3DCOLOR color)
94 {
95     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
96
97     FIXME("(%p)->(%p, %u, %#x): stub\n", This, vertexlist, vertexlistcount, color);
98
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI ID3DXLineImpl_DrawTransform(ID3DXLine* iface, CONST D3DXVECTOR3* vertexlist, DWORD vertexlistcount,
103                                                   CONST D3DXMATRIX* transform, D3DCOLOR color)
104 {
105     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
106
107     FIXME("(%p)->(%p, %u, %p, %#x): stub\n", This, vertexlist, vertexlistcount, transform, color);
108
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI ID3DXLineImpl_SetPattern(ID3DXLine* iface, DWORD pattern)
113 {
114     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
115
116     FIXME("(%p)->(%#x): stub\n", This, pattern);
117
118     return E_NOTIMPL;
119 }
120
121 static DWORD WINAPI ID3DXLineImpl_GetPattern(ID3DXLine* iface)
122 {
123     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
124
125     FIXME("(%p)->(): stub\n", This);
126
127     return 0xFFFFFFFF;
128 }
129
130 static HRESULT WINAPI ID3DXLineImpl_SetPatternScale(ID3DXLine* iface, FLOAT scale)
131 {
132     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
133
134     FIXME("(%p)->(%f): stub\n", This, scale);
135
136     return E_NOTIMPL;
137 }
138
139 static FLOAT WINAPI ID3DXLineImpl_GetPatternScale(ID3DXLine* iface)
140 {
141     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
142
143     FIXME("(%p)->(): stub\n", This);
144
145     return 1.0f;
146 }
147
148 static HRESULT WINAPI ID3DXLineImpl_SetWidth(ID3DXLine* iface, FLOAT width)
149 {
150     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
151
152     FIXME("(%p)->(%f): stub\n", This, width);
153
154     return E_NOTIMPL;
155 }
156
157 static FLOAT WINAPI ID3DXLineImpl_GetWidth(ID3DXLine* iface)
158 {
159     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
160
161     FIXME("(%p)->(): stub\n", This);
162
163     return 1.0f;
164 }
165
166 static HRESULT WINAPI ID3DXLineImpl_SetAntialias(ID3DXLine* iface, BOOL antialias)
167 {
168     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
169
170     FIXME("(%p)->(%u): stub\n", This, antialias);
171
172     return E_NOTIMPL;
173 }
174
175 static BOOL WINAPI ID3DXLineImpl_GetAntialias(ID3DXLine* iface)
176 {
177     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
178
179     FIXME("(%p)->(): stub\n", This);
180
181     return FALSE;
182 }
183
184 static HRESULT WINAPI ID3DXLineImpl_SetGLLines(ID3DXLine* iface, BOOL gl_lines)
185 {
186     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
187
188     FIXME("(%p)->(%u): stub\n", This, gl_lines);
189
190     return E_NOTIMPL;
191 }
192
193 static BOOL WINAPI ID3DXLineImpl_GetGLLines(ID3DXLine* iface)
194 {
195     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
196
197     FIXME("(%p)->(): stub\n", This);
198
199     return FALSE;
200 }
201
202 static HRESULT WINAPI ID3DXLineImpl_End(ID3DXLine* iface)
203 {
204     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
205
206     FIXME("(%p)->(): stub\n", This);
207
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI ID3DXLineImpl_OnLostDevice(ID3DXLine* iface)
212 {
213     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
214
215     FIXME("(%p)->(): stub\n", This);
216
217     return E_NOTIMPL;
218 }
219 static HRESULT WINAPI ID3DXLineImpl_OnResetDevice(ID3DXLine* iface)
220 {
221     ID3DXLineImpl *This = (ID3DXLineImpl *)iface;
222
223     FIXME("(%p)->(): stub\n", This);
224
225     return E_NOTIMPL;
226 }
227
228 static const struct ID3DXLineVtbl ID3DXLine_Vtbl =
229 {
230     /*** IUnknown methods ***/
231     ID3DXLineImpl_QueryInterface,
232     ID3DXLineImpl_AddRef,
233     ID3DXLineImpl_Release,
234     /*** ID3DXLine methods ***/
235     ID3DXLineImpl_GetDevice,
236     ID3DXLineImpl_Begin,
237     ID3DXLineImpl_Draw,
238     ID3DXLineImpl_DrawTransform,
239     ID3DXLineImpl_SetPattern,
240     ID3DXLineImpl_GetPattern,
241     ID3DXLineImpl_SetPatternScale,
242     ID3DXLineImpl_GetPatternScale,
243     ID3DXLineImpl_SetWidth,
244     ID3DXLineImpl_GetWidth,
245     ID3DXLineImpl_SetAntialias,
246     ID3DXLineImpl_GetAntialias,
247     ID3DXLineImpl_SetGLLines,
248     ID3DXLineImpl_GetGLLines,
249     ID3DXLineImpl_End,
250     ID3DXLineImpl_OnLostDevice,
251     ID3DXLineImpl_OnResetDevice
252 };
253
254 HRESULT WINAPI D3DXCreateLine(LPDIRECT3DDEVICE9 device, LPD3DXLINE* line)
255 {
256     ID3DXLineImpl* object;
257
258     TRACE("(%p, %p)\n", device, line);
259
260     if (!device || !line)
261         return D3DERR_INVALIDCALL;
262
263     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXLineImpl));
264     if (!object)
265     {
266         ERR("Out of memory\n");
267         return E_OUTOFMEMORY;
268     }
269
270     object->lpVtbl = &ID3DXLine_Vtbl;
271     object->ref = 1;
272
273     *line = (LPD3DXLINE)object;
274
275     return D3D_OK;
276 }