Added prototypes for OleQueryLinkFromClip, OleQueryCreateFromClip,
[wine] / ole / olefont.c
1 /*
2  * OLE Font encapsulation implementation
3  *
4  * This file contains an implementation of the IFont
5  * interface and the OleCreateFontIndirect API call.
6  *
7  * Copyright 1999 Francis Beaudet
8  */
9 #include <assert.h>
10 #include <string.h>
11 #include "winerror.h"
12 #include "oleauto.h"
13 #include "ocidl.h"
14 #include "olectl.h"
15 #include "debug.h"
16
17 /***********************************************************************
18  * Declaration of the implemetation class for the IFont interface
19  */
20 typedef struct OLEFontImpl OLEFontImpl;
21
22 struct OLEFontImpl
23 {
24   /*
25    * This class supports many interfaces. IUnknown, IFont, 
26    * IDispatch and IDispFont. The first two are supported by
27    * the first vtablem the other two are supported by the second
28    * table.
29    */
30   ICOM_VTABLE(IFont)*     lpvtbl1;
31   ICOM_VTABLE(IDispatch)* lpvtbl2;
32
33   /*
34    * Reference count for that instance of the class.
35    */
36   ULONG ref;
37
38   /*
39    * This structure contains the description of the class.
40    */
41   FONTDESC description;
42 };
43
44 /*
45  * Here, I define utility macros to help with the casting of the 
46  * "this" parameter.
47  * There is a version to accomodate the first vtable and a version to
48  * accomodate the second one.
49  */
50 #define _ICOM_THIS(class,name) class* this = (class*)name;
51 #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((void*)name)-sizeof(void*)); 
52
53 /***********************************************************************
54  * Prototypes for the implementation functions for the IFont
55  * interface
56  */
57 static OLEFontImpl* OLEFontImpl_Construct(LPFONTDESC fontDesc);
58 static void         OLEFontImpl_Destroy(OLEFontImpl* fontDesc);
59 static HRESULT      WINAPI OLEFontImpl_QueryInterface(IFont* iface, REFIID riid, VOID** ppvoid);
60 static ULONG        WINAPI OLEFontImpl_AddRef(IFont* iface);
61 static ULONG        WINAPI OLEFontImpl_Release(IFont* iface);
62 static HRESULT      WINAPI OLEFontImpl_get_Name(IFont* iface, BSTR* pname);
63 static HRESULT      WINAPI OLEFontImpl_put_Name(IFont* iface, BSTR name);
64 static HRESULT      WINAPI OLEFontImpl_get_Size(IFont* iface, CY* psize);
65 static HRESULT      WINAPI OLEFontImpl_put_Size(IFont* iface, CY size);
66 static HRESULT      WINAPI OLEFontImpl_get_Bold(IFont* iface, BOOL* pbold);
67 static HRESULT      WINAPI OLEFontImpl_put_Bold(IFont* iface, BOOL bold);
68 static HRESULT      WINAPI OLEFontImpl_get_Italic(IFont* iface, BOOL* pitalic);
69 static HRESULT      WINAPI OLEFontImpl_put_Italic(IFont* iface, BOOL italic);
70 static HRESULT      WINAPI OLEFontImpl_get_Underline(IFont* iface, BOOL* punderline);
71 static HRESULT      WINAPI OLEFontImpl_put_Underline(IFont* iface, BOOL underline);
72 static HRESULT      WINAPI OLEFontImpl_get_Strikethrough(IFont* iface, BOOL* pstrikethrough);
73 static HRESULT      WINAPI OLEFontImpl_put_Strikethrough(IFont* iface, BOOL strikethrough);
74 static HRESULT      WINAPI OLEFontImpl_get_Weight(IFont* iface, short* pweight);
75 static HRESULT      WINAPI OLEFontImpl_put_Weight(IFont* iface, short weight);
76 static HRESULT      WINAPI OLEFontImpl_get_Charset(IFont* iface, short* pcharset);
77 static HRESULT      WINAPI OLEFontImpl_put_Charset(IFont* iface, short charset);
78 static HRESULT      WINAPI OLEFontImpl_get_hFont(IFont* iface, HFONT* phfont);
79 static HRESULT      WINAPI OLEFontImpl_put_hFont(IFont* iface, HFONT hfont);
80 static HRESULT      WINAPI OLEFontImpl_Clone(IFont* iface, IFont** ppfont);
81 static HRESULT      WINAPI OLEFontImpl_IsEqual(IFont* iface, IFont* pFontOther);
82 static HRESULT      WINAPI OLEFontImpl_SetRatio(IFont* iface, long cyLogical, long cyHimetric);
83 static HRESULT      WINAPI OLEFontImpl_QueryTextMetrics(IFont* iface, TEXTMETRICOLE* ptm);
84 static HRESULT      WINAPI OLEFontImpl_AddRefHfont(IFont* iface, HFONT hfont);
85 static HRESULT      WINAPI OLEFontImpl_ReleaseHfont(IFont* iface, HFONT hfont);
86 static HRESULT      WINAPI OLEFontImpl_SetHdc(IFont* iface, HDC hdc);
87
88 /***********************************************************************
89  * Prototypes for the implementation functions for the IDispatch
90  * interface
91  */
92 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 
93                                                     REFIID     riid, 
94                                                     VOID**     ppvoid);
95 static ULONG   WINAPI OLEFontImpl_IDispatch_AddRef(IDispatch* iface);
96 static ULONG   WINAPI OLEFontImpl_IDispatch_Release(IDispatch* iface);
97 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch*    iface, 
98                                                    unsigned int* pctinfo);
99 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch*  iface, 
100                                               UINT      iTInfo,
101                                               LCID        lcid, 
102                                               ITypeInfo** ppTInfo);
103 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(IDispatch*  iface,
104                                                 REFIID      riid, 
105                                                 LPOLESTR* rgszNames, 
106                                                 UINT      cNames, 
107                                                 LCID        lcid,
108                                                 DISPID*     rgDispId);
109 static HRESULT WINAPI OLEFontImpl_Invoke(IDispatch*  iface,
110                                          DISPID      dispIdMember, 
111                                          REFIID      riid, 
112                                          LCID        lcid, 
113                                          WORD        wFlags,
114                                          DISPPARAMS* pDispParams,
115                                          VARIANT*    pVarResult, 
116                                          EXCEPINFO*  pExepInfo,
117                                          UINT*     puArgErr); 
118
119 /*
120  * Virtual function tables for the OLEFontImpl class.
121  */
122 static ICOM_VTABLE(IFont) OLEFontImpl_VTable =
123 {
124   OLEFontImpl_QueryInterface,
125   OLEFontImpl_AddRef,
126   OLEFontImpl_Release,
127   OLEFontImpl_get_Name,
128   OLEFontImpl_put_Name,
129   OLEFontImpl_get_Size,
130   OLEFontImpl_put_Size,
131   OLEFontImpl_get_Bold,
132   OLEFontImpl_put_Bold,
133   OLEFontImpl_get_Italic,
134   OLEFontImpl_put_Italic,
135   OLEFontImpl_get_Underline,
136   OLEFontImpl_put_Underline,
137   OLEFontImpl_get_Strikethrough,
138   OLEFontImpl_put_Strikethrough,
139   OLEFontImpl_get_Weight,
140   OLEFontImpl_put_Weight,
141   OLEFontImpl_get_Charset,
142   OLEFontImpl_put_Charset,
143   OLEFontImpl_get_hFont,
144   OLEFontImpl_put_hFont,
145   OLEFontImpl_Clone, 
146   OLEFontImpl_IsEqual,
147   OLEFontImpl_SetRatio,
148   OLEFontImpl_QueryTextMetrics,
149   OLEFontImpl_AddRefHfont,
150   OLEFontImpl_ReleaseHfont,
151   OLEFontImpl_SetHdc
152 };
153
154 static ICOM_VTABLE(IDispatch) OLEFontImpl_IDispatch_VTable =
155 {
156   OLEFontImpl_IDispatch_QueryInterface,
157   OLEFontImpl_IDispatch_AddRef,
158   OLEFontImpl_IDispatch_Release,
159   OLEFontImpl_GetTypeInfoCount,
160   OLEFontImpl_GetTypeInfo,
161   OLEFontImpl_GetIDsOfNames,
162   OLEFontImpl_Invoke
163 };
164
165
166 /******************************************************************************
167  *              OleCreateFontIndirect   [OLEAUT32.420]
168  */
169 WINOLECTLAPI OleCreateFontIndirect(
170   LPFONTDESC lpFontDesc,
171   REFIID     riid,
172   VOID**     ppvObj)
173 {
174   OLEFontImpl* newFont = 0;
175   HRESULT      hr      = S_OK;
176
177   /*
178    * Sanity check
179    */
180   if (ppvObj==0)
181     return E_POINTER;
182
183   *ppvObj = 0;
184
185   /*
186    * Try to construct a new instance of the class.
187    */
188   newFont = OLEFontImpl_Construct(lpFontDesc);
189
190   if (newFont == 0)
191     return E_OUTOFMEMORY;
192
193   /*
194    * Make sure it supports the interface required by the caller.
195    */
196   hr = IFont_QueryInterface((IFont*)newFont, riid, ppvObj);
197
198   /*
199    * Release the reference obtained in the constructor. If
200    * the QueryInterface was unsuccessful, it will free the class.
201    */
202   IFont_Release((IFont*)newFont);
203
204   return hr;
205 }
206
207
208 /***********************************************************************
209  * Implementation of the OLEFontImpl class.
210  */
211
212 /************************************************************************
213  * OLEFontImpl_Construct
214  *
215  * This method will construct a new instance of the OLEFontImpl
216  * class.
217  *
218  * The caller of this method must release the object when it's
219  * done with it.
220  */
221 static OLEFontImpl* OLEFontImpl_Construct(LPFONTDESC fontDesc)
222 {
223   OLEFontImpl* newObject = 0;
224
225   /*
226    * Allocate space for the object.
227    */
228   newObject = HeapAlloc(GetProcessHeap(), 0, sizeof(OLEFontImpl));
229
230   if (newObject==0)
231     return newObject;
232   
233   /*
234    * Initialize the virtual function table.
235    */
236   newObject->lpvtbl1 = &OLEFontImpl_VTable;
237   newObject->lpvtbl2 = &OLEFontImpl_IDispatch_VTable;
238   
239   /*
240    * Start with one reference count. The caller of this function 
241    * must release the interface pointer when it is done.
242    */
243   newObject->ref = 1;
244
245   /*
246    * Copy the description of the font in the object.
247    */
248   assert(fontDesc->cbSizeofstruct >= sizeof(FONTDESC));
249
250   newObject->description.cbSizeofstruct = sizeof(FONTDESC);
251   newObject->description.lpstrName = HeapAlloc(GetProcessHeap(),
252                                                0, 
253                                                (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));
254   lstrcpyW(newObject->description.lpstrName, fontDesc->lpstrName);
255   newObject->description.cySize         = fontDesc->cySize;
256   newObject->description.sWeight        = fontDesc->sWeight;
257   newObject->description.sCharset       = fontDesc->sCharset;
258   newObject->description.fItalic        = fontDesc->fItalic;
259   newObject->description.fUnderline     = fontDesc->fUnderline;
260   newObject->description.fStrikeThrough = fontDesc->fStrikeThrough;
261
262   return newObject;
263 }
264
265 /************************************************************************
266  * OLEFontImpl_Construct
267  *
268  * This method is called by the Release method when the reference
269  * count goes doen to 0. it will free all resources used by
270  * this object.
271  */
272 static void OLEFontImpl_Destroy(OLEFontImpl* fontDesc)
273 {
274   if (fontDesc->description.lpstrName!=0)
275     HeapFree(GetProcessHeap(), 0, fontDesc->description.lpstrName);
276
277   HeapFree(GetProcessHeap(), 0, fontDesc);
278 }
279
280
281 /************************************************************************
282  * OLEFontImpl_QueryInterface (IUnknown)
283  *
284  * See Windows documentation for more details on IUnknown methods.
285  */
286 HRESULT WINAPI OLEFontImpl_QueryInterface(
287   IFont*  iface,
288   REFIID  riid,
289   void**  ppvObject)
290 {
291   _ICOM_THIS(OLEFontImpl, iface);
292
293   /*
294    * Perform a sanity check on the parameters.
295    */
296   if ( (this==0) || (ppvObject==0) )
297     return E_INVALIDARG;
298   
299   /*
300    * Initialize the return parameter.
301    */
302   *ppvObject = 0;
303   
304   /*
305    * Compare the riid with the interface IDs implemented by this object.
306    */
307   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
308   {
309     *ppvObject = (IFont*)this;
310   }
311   else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 
312   {
313     *ppvObject = (IFont*)this;
314   }
315   else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 
316   {
317     *ppvObject = (IDispatch*)&(this->lpvtbl2);
318   }
319   else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 
320   {
321     *ppvObject = (IDispatch*)&(this->lpvtbl2);
322   }
323   
324   /*
325    * Check that we obtained an interface.
326    */
327   if ((*ppvObject)==0)
328     return E_NOINTERFACE;
329   
330   /*
331    * Query Interface always increases the reference count by one when it is
332    * successful
333    */
334   OLEFontImpl_AddRef((IFont*)this);
335
336   return S_OK;;
337 }
338         
339 /************************************************************************
340  * OLEFontImpl_AddRef (IUnknown)
341  *
342  * See Windows documentation for more details on IUnknown methods.
343  */
344 ULONG WINAPI OLEFontImpl_AddRef( 
345   IFont* iface)
346 {
347   _ICOM_THIS(OLEFontImpl, iface);
348
349   this->ref++;
350
351   return this->ref;
352 }
353         
354 /************************************************************************
355  * OLEFontImpl_Release (IUnknown)
356  *
357  * See Windows documentation for more details on IUnknown methods.
358  */
359 ULONG WINAPI OLEFontImpl_Release( 
360       IFont* iface)
361 {
362   _ICOM_THIS(OLEFontImpl, iface);
363
364   /*
365    * Decrease the reference count on this object.
366    */
367   this->ref--;
368
369   /*
370    * If the reference count goes down to 0, perform suicide.
371    */
372   if (this->ref==0)
373   {
374     OLEFontImpl_Destroy(this);
375
376     return 0;
377   }
378   
379   return this->ref;
380 }
381         
382 /************************************************************************
383  * OLEFontImpl_get_Name (IFont)
384  *
385  * See Windows documentation for more details on IFont methods.
386  */
387 static HRESULT WINAPI OLEFontImpl_get_Name(
388   IFont*  iface, 
389   BSTR* pname)
390 {
391   _ICOM_THIS(OLEFontImpl, iface);
392
393   /*
394    * Sanity check.
395    */
396   if (pname==0)
397     return E_POINTER;
398
399   if (this->description.lpstrName!=0)
400     *pname = SysAllocString(this->description.lpstrName);
401   else
402     *pname = 0;
403
404   return S_OK;
405 }
406
407 /************************************************************************
408  * OLEFontImpl_put_Name (IFont)
409  *
410  * See Windows documentation for more details on IFont methods.
411  */
412 static HRESULT WINAPI OLEFontImpl_put_Name(
413   IFont* iface, 
414   BSTR name)
415 {
416   _ICOM_THIS(OLEFontImpl, iface);
417
418   if (this->description.lpstrName==0)
419   {
420     this->description.lpstrName = HeapAlloc(GetProcessHeap(),
421                                             0, 
422                                             (lstrlenW(name)+1) * sizeof(WCHAR));
423   }
424   else
425   {
426     this->description.lpstrName = HeapReAlloc(GetProcessHeap(),
427                                               0, 
428                                               this->description.lpstrName,
429                                               (lstrlenW(name)+1) * sizeof(WCHAR));
430   }
431
432   if (this->description.lpstrName==0)
433     return E_OUTOFMEMORY;
434
435   lstrcpyW(this->description.lpstrName, name);
436
437   return S_OK;
438 }
439
440 /************************************************************************
441  * OLEFontImpl_get_Size (IFont)
442  *
443  * See Windows documentation for more details on IFont methods.
444  */
445 static HRESULT WINAPI OLEFontImpl_get_Size(
446   IFont* iface, 
447   CY*    psize)
448 {
449   _ICOM_THIS(OLEFontImpl, iface);
450
451   /*
452    * Sanity check
453    */
454   if (psize==0)
455     return E_POINTER;
456
457   *psize = this->description.cySize;
458
459   return S_OK;
460 }
461
462 /************************************************************************
463  * OLEFontImpl_put_Size (IFont)
464  *
465  * See Windows documentation for more details on IFont methods.
466  */
467 static HRESULT WINAPI OLEFontImpl_put_Size(
468   IFont* iface, 
469   CY     size)
470 {
471   _ICOM_THIS(OLEFontImpl, iface);
472
473   this->description.cySize = size;
474
475   return S_OK;
476 }
477
478 /************************************************************************
479  * OLEFontImpl_get_Bold (IFont)
480  *
481  * See Windows documentation for more details on IFont methods.
482  */
483 static HRESULT WINAPI OLEFontImpl_get_Bold(
484   IFont*  iface, 
485   BOOL* pbold)
486 {
487   FIXME(ole,"():Stub\n");
488   return E_NOTIMPL;
489 }
490
491 /************************************************************************
492  * OLEFontImpl_put_Bold (IFont)
493  *
494  * See Windows documentation for more details on IFont methods.
495  */
496 static HRESULT WINAPI OLEFontImpl_put_Bold(
497   IFont* iface,
498   BOOL bold)
499 {
500   FIXME(ole,"():Stub\n");
501   return E_NOTIMPL;
502 }
503
504 /************************************************************************
505  * OLEFontImpl_get_Italic (IFont)
506  *
507  * See Windows documentation for more details on IFont methods.
508  */
509 static HRESULT WINAPI OLEFontImpl_get_Italic(
510   IFont*  iface, 
511   BOOL* pitalic)
512 {
513   _ICOM_THIS(OLEFontImpl, iface);
514
515   /*
516    * Sanity check
517    */
518   if (pitalic==0)
519     return E_POINTER;
520
521   *pitalic = this->description.fItalic;
522
523   return S_OK;
524 }
525
526 /************************************************************************
527  * OLEFontImpl_put_Italic (IFont)
528  *
529  * See Windows documentation for more details on IFont methods.
530  */
531 static HRESULT WINAPI OLEFontImpl_put_Italic(
532   IFont* iface, 
533   BOOL italic)
534 {
535   _ICOM_THIS(OLEFontImpl, iface);
536
537   this->description.fItalic = italic;
538
539   return S_OK;
540 }
541
542 /************************************************************************
543  * OLEFontImpl_get_Underline (IFont)
544  *
545  * See Windows documentation for more details on IFont methods.
546  */
547 static HRESULT WINAPI OLEFontImpl_get_Underline(
548   IFont*  iface, 
549   BOOL* punderline)
550 {
551   _ICOM_THIS(OLEFontImpl, iface);
552
553   /*
554    * Sanity check
555    */
556   if (punderline==0)
557     return E_POINTER;
558
559   *punderline = this->description.fUnderline;
560
561   return S_OK;
562 }
563
564 /************************************************************************
565  * OLEFontImpl_put_Underline (IFont)
566  *
567  * See Windows documentation for more details on IFont methods.
568  */
569 static HRESULT WINAPI OLEFontImpl_put_Underline(
570   IFont* iface,
571   BOOL underline)
572 {
573   _ICOM_THIS(OLEFontImpl, iface);
574
575   this->description.fUnderline = underline;
576
577   return S_OK;
578 }
579
580 /************************************************************************
581  * OLEFontImpl_get_Strikethrough (IFont)
582  *
583  * See Windows documentation for more details on IFont methods.
584  */
585 static HRESULT WINAPI OLEFontImpl_get_Strikethrough(
586   IFont*  iface, 
587   BOOL* pstrikethrough)
588 {
589   _ICOM_THIS(OLEFontImpl, iface);
590
591   /*
592    * Sanity check
593    */
594   if (pstrikethrough==0)
595     return E_POINTER;
596
597   *pstrikethrough = this->description.fStrikeThrough;
598
599   return S_OK;
600 }
601
602 /************************************************************************
603  * OLEFontImpl_put_Strikethrough (IFont)
604  *
605  * See Windows documentation for more details on IFont methods.
606  */
607 static HRESULT WINAPI OLEFontImpl_put_Strikethrough(
608  IFont* iface, 
609  BOOL strikethrough)
610 {
611   _ICOM_THIS(OLEFontImpl, iface);
612
613   this->description.fStrikeThrough = strikethrough;
614
615   return S_OK;
616 }
617
618 /************************************************************************
619  * OLEFontImpl_get_Weight (IFont)
620  *
621  * See Windows documentation for more details on IFont methods.
622  */
623 static HRESULT WINAPI OLEFontImpl_get_Weight(
624   IFont* iface, 
625   short* pweight)
626 {
627   _ICOM_THIS(OLEFontImpl, iface);
628
629   /*
630    * Sanity check
631    */
632   if (pweight==0)
633     return E_POINTER;
634
635   *pweight = this->description.sWeight;
636
637   return S_OK;
638 }
639
640 /************************************************************************
641  * OLEFontImpl_put_Weight (IFont)
642  *
643  * See Windows documentation for more details on IFont methods.
644  */
645 static HRESULT WINAPI OLEFontImpl_put_Weight(
646   IFont* iface, 
647   short  weight)
648 {
649   _ICOM_THIS(OLEFontImpl, iface);
650
651   this->description.sWeight = weight;
652
653   return S_OK;
654 }
655
656 /************************************************************************
657  * OLEFontImpl_get_Charset (IFont)
658  *
659  * See Windows documentation for more details on IFont methods.
660  */
661 static HRESULT WINAPI OLEFontImpl_get_Charset(
662   IFont* iface, 
663   short* pcharset)
664 {
665   _ICOM_THIS(OLEFontImpl, iface);
666
667   /*
668    * Sanity check
669    */
670   if (pcharset==0)
671     return E_POINTER;
672
673   *pcharset = this->description.sCharset;
674
675   return S_OK;
676 }
677
678 /************************************************************************
679  * OLEFontImpl_put_Charset (IFont)
680  *
681  * See Windows documentation for more details on IFont methods.
682  */
683 static HRESULT WINAPI OLEFontImpl_put_Charset(
684   IFont* iface, 
685   short charset)
686 {
687   _ICOM_THIS(OLEFontImpl, iface);
688
689   this->description.sCharset = charset;
690
691   return S_OK;
692 }
693
694 /************************************************************************
695  * OLEFontImpl_get_hFont (IFont)
696  *
697  * See Windows documentation for more details on IFont methods.
698  */
699 static HRESULT WINAPI OLEFontImpl_get_hFont(
700   IFont*   iface,
701   HFONT* phfont)
702 {
703   FIXME(ole,"():Stub\n");
704   return E_NOTIMPL;
705 }
706
707 /************************************************************************
708  * OLEFontImpl_put_hFont (IFont)
709  *
710  * See Windows documentation for more details on IFont methods.
711  */
712 static HRESULT WINAPI OLEFontImpl_put_hFont(
713   IFont*  iface,
714   HFONT hfont)
715 {
716   FIXME(ole,"():Stub\n");
717   return E_NOTIMPL;
718 }
719
720 /************************************************************************
721  * OLEFontImpl_Clone (IFont)
722  *
723  * See Windows documentation for more details on IFont methods.
724  */
725 static HRESULT WINAPI OLEFontImpl_Clone(
726   IFont*  iface,
727   IFont** ppfont)
728 {
729   FIXME(ole,"():Stub\n");
730   return E_NOTIMPL;
731 }
732
733 /************************************************************************
734  * OLEFontImpl_IsEqual (IFont)
735  *
736  * See Windows documentation for more details on IFont methods.
737  */
738 static HRESULT WINAPI OLEFontImpl_IsEqual(
739   IFont* iface, 
740   IFont* pFontOther)
741 {
742   FIXME(ole,"():Stub\n");
743   return E_NOTIMPL;
744 }
745
746 /************************************************************************
747  * OLEFontImpl_SetRatio (IFont)
748  *
749  * See Windows documentation for more details on IFont methods.
750  */
751 static HRESULT WINAPI OLEFontImpl_SetRatio(
752   IFont* iface,
753   long   cyLogical,
754   long   cyHimetric)
755 {
756   FIXME(ole,"():Stub\n");
757   return E_NOTIMPL;
758 }
759
760 /************************************************************************
761  * OLEFontImpl_QueryTextMetrics (IFont)
762  *
763  * See Windows documentation for more details on IFont methods.
764  */
765 static HRESULT      WINAPI OLEFontImpl_QueryTextMetrics(
766   IFont*         iface, 
767   TEXTMETRICOLE* ptm)
768 {
769   FIXME(ole,"():Stub\n");
770   return E_NOTIMPL;
771 }
772
773 /************************************************************************
774  * OLEFontImpl_AddRefHfont (IFont)
775  *
776  * See Windows documentation for more details on IFont methods.
777  */
778 static HRESULT WINAPI OLEFontImpl_AddRefHfont(
779   IFont*  iface, 
780   HFONT hfont)
781 {
782   FIXME(ole,"():Stub\n");
783   return E_NOTIMPL;
784 }
785
786 /************************************************************************
787  * OLEFontImpl_ReleaseHfont (IFont)
788  *
789  * See Windows documentation for more details on IFont methods.
790  */
791 static HRESULT WINAPI OLEFontImpl_ReleaseHfont(
792   IFont*  iface,
793   HFONT hfont)
794 {
795   FIXME(ole,"():Stub\n");
796   return E_NOTIMPL;
797 }
798
799 /************************************************************************
800  * OLEFontImpl_SetHdc (IFont)
801  *
802  * See Windows documentation for more details on IFont methods.
803  */
804 static HRESULT WINAPI OLEFontImpl_SetHdc(
805   IFont* iface,
806   HDC  hdc)
807 {
808   FIXME(ole,"():Stub\n");
809   return E_NOTIMPL;
810 }
811
812 /************************************************************************
813  * OLEFontImpl_IDispatch_QueryInterface (IUnknown)
814  *
815  * See Windows documentation for more details on IUnknown methods.
816  */
817 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(
818   IDispatch* iface,
819   REFIID     riid,
820   VOID**     ppvoid)
821 {
822   _ICOM_THIS_From_IDispatch(IFont, iface);
823
824   return IFont_QueryInterface(this, riid, ppvoid);
825 }
826
827 /************************************************************************
828  * OLEFontImpl_IDispatch_Release (IUnknown)
829  *
830  * See Windows documentation for more details on IUnknown methods.
831  */
832 static ULONG WINAPI OLEFontImpl_IDispatch_Release(
833   IDispatch* iface)
834 {
835   _ICOM_THIS_From_IDispatch(IFont, iface);
836
837   return IFont_Release(this);
838 }
839
840 /************************************************************************
841  * OLEFontImpl_IDispatch_AddRef (IUnknown)
842  *
843  * See Windows documentation for more details on IUnknown methods.
844  */
845 static ULONG WINAPI OLEFontImpl_IDispatch_AddRef(
846   IDispatch* iface)
847 {
848   _ICOM_THIS_From_IDispatch(IFont, iface);
849
850   return IFont_AddRef(this);
851 }
852
853 /************************************************************************
854  * OLEFontImpl_GetTypeInfoCount (IDispatch)
855  *
856  * See Windows documentation for more details on IDispatch methods.
857  */
858 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(
859   IDispatch*    iface, 
860   unsigned int* pctinfo)
861 {
862   FIXME(ole,"():Stub\n");
863
864   return E_NOTIMPL;
865 }
866
867 /************************************************************************
868  * OLEFontImpl_GetTypeInfo (IDispatch)
869  *
870  * See Windows documentation for more details on IDispatch methods.
871  */
872 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(
873   IDispatch*  iface, 
874   UINT      iTInfo,
875   LCID        lcid, 
876   ITypeInfo** ppTInfo)
877 {
878   FIXME(ole,"():Stub\n");
879
880   return E_NOTIMPL;
881 }
882
883 /************************************************************************
884  * OLEFontImpl_GetIDsOfNames (IDispatch)
885  *
886  * See Windows documentation for more details on IDispatch methods.
887  */
888 static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(
889   IDispatch*  iface,
890   REFIID      riid, 
891   LPOLESTR* rgszNames, 
892   UINT      cNames, 
893   LCID        lcid,
894   DISPID*     rgDispId)
895 {
896   FIXME(ole,"():Stub\n");
897
898   return E_NOTIMPL;
899 }
900
901 /************************************************************************
902  * OLEFontImpl_Invoke (IDispatch)
903  *
904  * See Windows documentation for more details on IDispatch methods.
905  */
906 static HRESULT WINAPI OLEFontImpl_Invoke(
907   IDispatch*  iface,
908   DISPID      dispIdMember, 
909   REFIID      riid, 
910   LCID        lcid, 
911   WORD        wFlags,
912   DISPPARAMS* pDispParams,
913   VARIANT*    pVarResult, 
914   EXCEPINFO*  pExepInfo,
915   UINT*     puArgErr)
916 {
917   FIXME(ole,"():Stub\n");
918
919   return E_NOTIMPL;
920 }
921
922