wined3d: Track separate dirty ranges in buffers.
[wine] / dlls / mshtml / htmlscreen.c
1 /*
2  * Copyright 2009 Jacek Caban for CodeWeavers
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 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29
30 #include "mshtml_private.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 typedef struct {
35     DispatchEx dispex;
36     const IHTMLScreenVtbl *lpIHTMLScreenVtbl;
37
38     LONG ref;
39 } HTMLScreen;
40
41 #define HTMLSCREEN(x)  ((IHTMLScreen*)  &(x)->lpIHTMLScreenVtbl)
42
43 #define HTMLSCREEN_THIS(iface) DEFINE_THIS(HTMLScreen, IHTMLScreen, iface)
44
45 static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv)
46 {
47     HTMLScreen *This = HTMLSCREEN_THIS(iface);
48
49     *ppv = NULL;
50
51     if(IsEqualGUID(&IID_IUnknown, riid)) {
52         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
53         *ppv = HTMLSCREEN(This);
54     }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) {
55         TRACE("(%p)->(IID_IHTMLScreen %p)\n", This, ppv);
56         *ppv = HTMLSCREEN(This);
57     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
58         return *ppv ? S_OK : E_NOINTERFACE;
59     }
60
61     if(*ppv) {
62         IUnknown_AddRef((IUnknown*)*ppv);
63         return S_OK;
64     }
65
66     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
67     return E_NOINTERFACE;
68 }
69
70 static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface)
71 {
72     HTMLScreen *This = HTMLSCREEN_THIS(iface);
73     LONG ref = InterlockedIncrement(&This->ref);
74
75     TRACE("(%p) ref=%d\n", This, ref);
76
77     return ref;
78 }
79
80 static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface)
81 {
82     HTMLScreen *This = HTMLSCREEN_THIS(iface);
83     LONG ref = InterlockedDecrement(&This->ref);
84
85     TRACE("(%p) ref=%d\n", This, ref);
86
87     if(!ref) {
88         release_dispex(&This->dispex);
89         heap_free(This);
90     }
91
92     return ref;
93 }
94
95 static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo)
96 {
97     HTMLScreen *This = HTMLSCREEN_THIS(iface);
98     FIXME("(%p)\n", This);
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo,
103         LCID lcid, ITypeInfo **ppTInfo)
104 {
105     HTMLScreen *This = HTMLSCREEN_THIS(iface);
106     FIXME("(%p)\n", This);
107     return E_NOTIMPL;
108 }
109
110 static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid,
111         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
112 {
113     HTMLScreen *This = HTMLSCREEN_THIS(iface);
114     FIXME("(%p)\n", This);
115     return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
119         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
120         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
121 {
122     HTMLScreen *This = HTMLSCREEN_THIS(iface);
123     FIXME("(%p)\n", This);
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
128 {
129     HTMLScreen *This = HTMLSCREEN_THIS(iface);
130
131     TRACE("(%p)->(%p)\n", This, p);
132
133     *p = GetDeviceCaps(get_display_dc(), BITSPIXEL);
134     return S_OK;
135 }
136
137 static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v)
138 {
139     HTMLScreen *This = HTMLSCREEN_THIS(iface);
140     FIXME("(%p)->(%d)\n", This, v);
141     return E_NOTIMPL;
142 }
143
144 static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
145 {
146     HTMLScreen *This = HTMLSCREEN_THIS(iface);
147     FIXME("(%p)->(%p)\n", This, p);
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
152 {
153     HTMLScreen *This = HTMLSCREEN_THIS(iface);
154
155     TRACE("(%p)->(%p)\n", This, p);
156
157     *p = GetDeviceCaps(get_display_dc(), HORZRES);
158     return S_OK;
159 }
160
161 static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
162 {
163     HTMLScreen *This = HTMLSCREEN_THIS(iface);
164
165     TRACE("(%p)->(%p)\n", This, p);
166
167     *p = GetDeviceCaps(get_display_dc(), VERTRES);
168     return S_OK;
169 }
170
171 static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v)
172 {
173     HTMLScreen *This = HTMLSCREEN_THIS(iface);
174     FIXME("(%p)->(%d)\n", This, v);
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p)
179 {
180     HTMLScreen *This = HTMLSCREEN_THIS(iface);
181     FIXME("(%p)->(%p)\n", This, p);
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p)
186 {
187     HTMLScreen *This = HTMLSCREEN_THIS(iface);
188     FIXME("(%p)->(%p)\n", This, p);
189     return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p)
193 {
194     HTMLScreen *This = HTMLSCREEN_THIS(iface);
195     FIXME("(%p)->(%p)\n", This, p);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p)
200 {
201     HTMLScreen *This = HTMLSCREEN_THIS(iface);
202     FIXME("(%p)->(%p)\n", This, p);
203     return E_NOTIMPL;
204 }
205
206 #undef HTMLSCREEN_THIS
207
208 static const IHTMLScreenVtbl HTMLSreenVtbl = {
209     HTMLScreen_QueryInterface,
210     HTMLScreen_AddRef,
211     HTMLScreen_Release,
212     HTMLScreen_GetTypeInfoCount,
213     HTMLScreen_GetTypeInfo,
214     HTMLScreen_GetIDsOfNames,
215     HTMLScreen_Invoke,
216     HTMLScreen_get_colorDepth,
217     HTMLScreen_put_bufferDepth,
218     HTMLScreen_get_bufferDepth,
219     HTMLScreen_get_width,
220     HTMLScreen_get_height,
221     HTMLScreen_put_updateInterval,
222     HTMLScreen_get_updateInterval,
223     HTMLScreen_get_availHeight,
224     HTMLScreen_get_availWidth,
225     HTMLScreen_get_fontSmoothingEnabled
226 };
227
228 static const tid_t HTMLScreen_iface_tids[] = {
229     IHTMLScreen_tid,
230     0
231 };
232 static dispex_static_data_t HTMLScreen_dispex = {
233     NULL,
234     DispHTMLScreen_tid,
235     NULL,
236     HTMLScreen_iface_tids
237 };
238
239 HRESULT HTMLScreen_Create(IHTMLScreen **ret)
240 {
241     HTMLScreen *screen;
242
243     screen = heap_alloc_zero(sizeof(HTMLScreen));
244     if(!screen)
245         return E_OUTOFMEMORY;
246
247     screen->lpIHTMLScreenVtbl = &HTMLSreenVtbl;
248     screen->ref = 1;
249
250     init_dispex(&screen->dispex, (IUnknown*)HTMLSCREEN(screen), &HTMLScreen_dispex);
251
252     *ret = HTMLSCREEN(screen);
253     return S_OK;
254 }