blob: df4afe18c569f3d955737c2169264b4c1a014081 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * GDI font objects
3 *
4 * Copyright 1993 Alexandre Julliard
Alexandre Julliard23946ad1997-06-16 17:43:53 +00005 * 1997 Alex Korobka
Alexandre Julliard7e56f681996-01-31 19:02:28 +00006 */
Alexandre Julliard401710d1993-09-04 10:09:32 +00007
Alexandre Julliard401710d1993-09-04 10:09:32 +00008#include <stdlib.h>
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00009#include <string.h>
Huw D M Davies814654e2001-09-12 20:21:06 +000010#include <assert.h>
Alexandre Julliard24a62ab2000-11-28 22:40:56 +000011#include "winerror.h"
12#include "winnls.h"
Alexandre Julliard7cbe6571995-01-09 18:21:16 +000013#include "font.h"
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000014#include "heap.h"
Alexandre Julliard7e56f681996-01-31 19:02:28 +000015#include "options.h"
Alexandre Julliard06c275a1999-05-02 14:32:27 +000016#include "debugtools.h"
Alexandre Julliard2239abb2000-11-05 02:05:07 +000017#include "gdi.h"
Alexandre Julliard401710d1993-09-04 10:09:32 +000018
Alexandre Julliard2239abb2000-11-05 02:05:07 +000019DEFAULT_DEBUG_CHANNEL(font);
20DECLARE_DEBUG_CHANNEL(gdi);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000021
Alexandre Julliard23946ad1997-06-16 17:43:53 +000022#define ENUM_UNICODE 0x00000001
Alexandre Julliard401710d1993-09-04 10:09:32 +000023
Alexandre Julliard23946ad1997-06-16 17:43:53 +000024typedef struct
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000025{
Alexandre Julliard23946ad1997-06-16 17:43:53 +000026 LPLOGFONT16 lpLogFontParam;
27 FONTENUMPROCEX16 lpEnumFunc;
28 LPARAM lpData;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000029
Alexandre Julliard23946ad1997-06-16 17:43:53 +000030 LPNEWTEXTMETRICEX16 lpTextMetric;
31 LPENUMLOGFONTEX16 lpLogFont;
32 SEGPTR segTextMetric;
33 SEGPTR segLogFont;
34} fontEnum16;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000035
Alexandre Julliard23946ad1997-06-16 17:43:53 +000036typedef struct
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000037{
Alexandre Julliarda3960291999-02-26 11:11:13 +000038 LPLOGFONTW lpLogFontParam;
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +000039 FONTENUMPROCEXW lpEnumFunc;
Huw D M Davies2aa85ee2001-02-14 22:56:38 +000040 LPARAM lpData;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000041
Alexandre Julliard23946ad1997-06-16 17:43:53 +000042 DWORD dwFlags;
43} fontEnum32;
44
Douglas Ridgwayab9e8bc1999-01-01 18:41:22 +000045/*
46 * For TranslateCharsetInfo
47 */
48#define FS(x) {{0,0,0,0},{0x1<<(x),0}}
49#define MAXTCIINDEX 32
50static CHARSETINFO FONT_tci[MAXTCIINDEX] = {
51 /* ANSI */
52 { ANSI_CHARSET, 1252, FS(0)},
53 { EASTEUROPE_CHARSET, 1250, FS(1)},
54 { RUSSIAN_CHARSET, 1251, FS(2)},
55 { GREEK_CHARSET, 1253, FS(3)},
56 { TURKISH_CHARSET, 1254, FS(4)},
57 { HEBREW_CHARSET, 1255, FS(5)},
58 { ARABIC_CHARSET, 1256, FS(6)},
59 { BALTIC_CHARSET, 1257, FS(7)},
60 /* reserved by ANSI */
61 { DEFAULT_CHARSET, 0, FS(0)},
62 { DEFAULT_CHARSET, 0, FS(0)},
63 { DEFAULT_CHARSET, 0, FS(0)},
64 { DEFAULT_CHARSET, 0, FS(0)},
65 { DEFAULT_CHARSET, 0, FS(0)},
66 { DEFAULT_CHARSET, 0, FS(0)},
67 { DEFAULT_CHARSET, 0, FS(0)},
68 { DEFAULT_CHARSET, 0, FS(0)},
69 /* ANSI and OEM */
70 { THAI_CHARSET, 874, FS(16)},
71 { SHIFTJIS_CHARSET, 932, FS(17)},
72 { GB2312_CHARSET, 936, FS(18)},
73 { HANGEUL_CHARSET, 949, FS(19)},
74 { CHINESEBIG5_CHARSET, 950, FS(20)},
75 { JOHAB_CHARSET, 1361, FS(21)},
76 /* reserved for alternate ANSI and OEM */
77 { DEFAULT_CHARSET, 0, FS(0)},
78 { DEFAULT_CHARSET, 0, FS(0)},
79 { DEFAULT_CHARSET, 0, FS(0)},
80 { DEFAULT_CHARSET, 0, FS(0)},
81 { DEFAULT_CHARSET, 0, FS(0)},
82 { DEFAULT_CHARSET, 0, FS(0)},
83 { DEFAULT_CHARSET, 0, FS(0)},
84 { DEFAULT_CHARSET, 0, FS(0)},
85 /* reserved for system */
86 { DEFAULT_CHARSET, 0, FS(0)},
87 { DEFAULT_CHARSET, 0, FS(0)},
88};
89
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000090/***********************************************************************
Alexandre Julliard23946ad1997-06-16 17:43:53 +000091 * LOGFONT conversion functions.
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +000092 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +000093void FONT_LogFontATo16( const LOGFONTA* font32, LPLOGFONT16 font16 )
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000094{
Ulrich Weigandd1682aa1999-11-21 02:21:17 +000095 font16->lfHeight = font32->lfHeight;
96 font16->lfWidth = font32->lfWidth;
97 font16->lfEscapement = font32->lfEscapement;
98 font16->lfOrientation = font32->lfOrientation;
99 font16->lfWeight = font32->lfWeight;
100 font16->lfItalic = font32->lfItalic;
101 font16->lfUnderline = font32->lfUnderline;
102 font16->lfStrikeOut = font32->lfStrikeOut;
103 font16->lfCharSet = font32->lfCharSet;
104 font16->lfOutPrecision = font32->lfOutPrecision;
105 font16->lfClipPrecision = font32->lfClipPrecision;
106 font16->lfQuality = font32->lfQuality;
107 font16->lfPitchAndFamily = font32->lfPitchAndFamily;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000108 lstrcpynA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
Alexandre Julliardded30381995-07-06 17:18:27 +0000109}
Alexandre Julliarde2991ea1995-07-29 13:09:43 +0000110
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000111void FONT_LogFontWTo16( const LOGFONTW* font32, LPLOGFONT16 font16 )
Alexandre Julliard21979011997-03-05 08:22:35 +0000112{
Ulrich Weigandd1682aa1999-11-21 02:21:17 +0000113 font16->lfHeight = font32->lfHeight;
114 font16->lfWidth = font32->lfWidth;
115 font16->lfEscapement = font32->lfEscapement;
116 font16->lfOrientation = font32->lfOrientation;
117 font16->lfWeight = font32->lfWeight;
118 font16->lfItalic = font32->lfItalic;
119 font16->lfUnderline = font32->lfUnderline;
120 font16->lfStrikeOut = font32->lfStrikeOut;
121 font16->lfCharSet = font32->lfCharSet;
122 font16->lfOutPrecision = font32->lfOutPrecision;
123 font16->lfClipPrecision = font32->lfClipPrecision;
124 font16->lfQuality = font32->lfQuality;
125 font16->lfPitchAndFamily = font32->lfPitchAndFamily;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000126 WideCharToMultiByte( CP_ACP, 0, font32->lfFaceName, -1,
127 font16->lfFaceName, LF_FACESIZE, NULL, NULL );
128 font16->lfFaceName[LF_FACESIZE-1] = 0;
Alexandre Julliard21979011997-03-05 08:22:35 +0000129}
130
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000131void FONT_LogFont16ToA( const LOGFONT16 *font16, LPLOGFONTA font32 )
Alexandre Julliard21979011997-03-05 08:22:35 +0000132{
Ulrich Weigandd1682aa1999-11-21 02:21:17 +0000133 font32->lfHeight = font16->lfHeight;
134 font32->lfWidth = font16->lfWidth;
135 font32->lfEscapement = font16->lfEscapement;
136 font32->lfOrientation = font16->lfOrientation;
137 font32->lfWeight = font16->lfWeight;
138 font32->lfItalic = font16->lfItalic;
139 font32->lfUnderline = font16->lfUnderline;
140 font32->lfStrikeOut = font16->lfStrikeOut;
141 font32->lfCharSet = font16->lfCharSet;
142 font32->lfOutPrecision = font16->lfOutPrecision;
143 font32->lfClipPrecision = font16->lfClipPrecision;
144 font32->lfQuality = font16->lfQuality;
145 font32->lfPitchAndFamily = font16->lfPitchAndFamily;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000146 lstrcpynA( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
Alexandre Julliard21979011997-03-05 08:22:35 +0000147}
148
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000149void FONT_LogFont16ToW( const LOGFONT16 *font16, LPLOGFONTW font32 )
Alexandre Julliard21979011997-03-05 08:22:35 +0000150{
Ulrich Weigandd1682aa1999-11-21 02:21:17 +0000151 font32->lfHeight = font16->lfHeight;
152 font32->lfWidth = font16->lfWidth;
153 font32->lfEscapement = font16->lfEscapement;
154 font32->lfOrientation = font16->lfOrientation;
155 font32->lfWeight = font16->lfWeight;
156 font32->lfItalic = font16->lfItalic;
157 font32->lfUnderline = font16->lfUnderline;
158 font32->lfStrikeOut = font16->lfStrikeOut;
159 font32->lfCharSet = font16->lfCharSet;
160 font32->lfOutPrecision = font16->lfOutPrecision;
161 font32->lfClipPrecision = font16->lfClipPrecision;
162 font32->lfQuality = font16->lfQuality;
163 font32->lfPitchAndFamily = font16->lfPitchAndFamily;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000164 MultiByteToWideChar( CP_ACP, 0, font16->lfFaceName, -1, font32->lfFaceName, LF_FACESIZE );
165 font32->lfFaceName[LF_FACESIZE-1] = 0;
Alexandre Julliard21979011997-03-05 08:22:35 +0000166}
167
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000168void FONT_LogFontAToW( const LOGFONTA *fontA, LPLOGFONTW fontW )
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000169{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000170 memcpy(fontW, fontA, sizeof(LOGFONTA) - LF_FACESIZE);
171 MultiByteToWideChar(CP_ACP, 0, fontA->lfFaceName, -1, fontW->lfFaceName,
172 LF_FACESIZE);
173}
174
175void FONT_LogFontWToA( const LOGFONTW *fontW, LPLOGFONTA fontA )
176{
177 memcpy(fontA, fontW, sizeof(LOGFONTA) - LF_FACESIZE);
178 WideCharToMultiByte(CP_ACP, 0, fontW->lfFaceName, -1, fontA->lfFaceName,
179 LF_FACESIZE, NULL, NULL);
180}
181
182void FONT_EnumLogFontEx16ToA( const ENUMLOGFONTEX16 *font16, LPENUMLOGFONTEXA font32 )
183{
184 FONT_LogFont16ToA( (LPLOGFONT16)font16, (LPLOGFONTA)font32);
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000185 lstrcpynA( font32->elfFullName, font16->elfFullName, LF_FULLFACESIZE );
186 lstrcpynA( font32->elfStyle, font16->elfStyle, LF_FACESIZE );
187 lstrcpynA( font32->elfScript, font16->elfScript, LF_FACESIZE );
188}
189
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000190void FONT_EnumLogFontEx16ToW( const ENUMLOGFONTEX16 *font16, LPENUMLOGFONTEXW font32 )
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000191{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000192 FONT_LogFont16ToW( (LPLOGFONT16)font16, (LPLOGFONTW)font32);
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000193
194 MultiByteToWideChar( CP_ACP, 0, font16->elfFullName, -1, font32->elfFullName, LF_FULLFACESIZE );
195 font32->elfFullName[LF_FULLFACESIZE-1] = 0;
196 MultiByteToWideChar( CP_ACP, 0, font16->elfStyle, -1, font32->elfStyle, LF_FACESIZE );
197 font32->elfStyle[LF_FACESIZE-1] = 0;
198 MultiByteToWideChar( CP_ACP, 0, font16->elfScript, -1, font32->elfScript, LF_FACESIZE );
199 font32->elfScript[LF_FACESIZE-1] = 0;
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000200}
201
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000202void FONT_EnumLogFontExWTo16( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEX16 font16 )
203{
204 FONT_LogFontWTo16( (LPLOGFONTW)fontW, (LPLOGFONT16)font16);
205
206 WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
207 font16->elfFullName, LF_FULLFACESIZE, NULL, NULL );
208 font16->elfFullName[LF_FULLFACESIZE-1] = '\0';
209 WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
210 font16->elfStyle, LF_FACESIZE, NULL, NULL );
211 font16->elfStyle[LF_FACESIZE-1] = '\0';
212 WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
213 font16->elfScript, LF_FACESIZE, NULL, NULL );
214 font16->elfScript[LF_FACESIZE-1] = '\0';
215}
216
217void FONT_EnumLogFontExWToA( const ENUMLOGFONTEXW *fontW, LPENUMLOGFONTEXA fontA )
218{
219 FONT_LogFontWToA( (LPLOGFONTW)fontW, (LPLOGFONTA)fontA);
220
221 WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
222 fontA->elfFullName, LF_FULLFACESIZE, NULL, NULL );
223 fontA->elfFullName[LF_FULLFACESIZE-1] = '\0';
224 WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
225 fontA->elfStyle, LF_FACESIZE, NULL, NULL );
226 fontA->elfStyle[LF_FACESIZE-1] = '\0';
227 WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
228 fontA->elfScript, LF_FACESIZE, NULL, NULL );
229 fontA->elfScript[LF_FACESIZE-1] = '\0';
230}
231
Alexandre Julliard21979011997-03-05 08:22:35 +0000232/***********************************************************************
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000233 * TEXTMETRIC conversion functions.
Alexandre Julliard21979011997-03-05 08:22:35 +0000234 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000235void FONT_TextMetricATo16(const TEXTMETRICA *ptm32, LPTEXTMETRIC16 ptm16 )
Alexandre Julliarde2991ea1995-07-29 13:09:43 +0000236{
Alexandre Julliard491502b1997-11-01 19:08:16 +0000237 ptm16->tmHeight = ptm32->tmHeight;
238 ptm16->tmAscent = ptm32->tmAscent;
239 ptm16->tmDescent = ptm32->tmDescent;
240 ptm16->tmInternalLeading = ptm32->tmInternalLeading;
241 ptm16->tmExternalLeading = ptm32->tmExternalLeading;
242 ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
243 ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
244 ptm16->tmWeight = ptm32->tmWeight;
245 ptm16->tmOverhang = ptm32->tmOverhang;
246 ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
247 ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000248 ptm16->tmFirstChar = ptm32->tmFirstChar;
249 ptm16->tmLastChar = ptm32->tmLastChar;
250 ptm16->tmDefaultChar = ptm32->tmDefaultChar;
251 ptm16->tmBreakChar = ptm32->tmBreakChar;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000252 ptm16->tmItalic = ptm32->tmItalic;
253 ptm16->tmUnderlined = ptm32->tmUnderlined;
254 ptm16->tmStruckOut = ptm32->tmStruckOut;
255 ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
256 ptm16->tmCharSet = ptm32->tmCharSet;
Alexandre Julliardded30381995-07-06 17:18:27 +0000257}
Alexandre Julliard401710d1993-09-04 10:09:32 +0000258
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000259void FONT_TextMetricWTo16(const TEXTMETRICW *ptm32, LPTEXTMETRIC16 ptm16 )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000260{
Alexandre Julliard491502b1997-11-01 19:08:16 +0000261 ptm16->tmHeight = ptm32->tmHeight;
262 ptm16->tmAscent = ptm32->tmAscent;
263 ptm16->tmDescent = ptm32->tmDescent;
264 ptm16->tmInternalLeading = ptm32->tmInternalLeading;
265 ptm16->tmExternalLeading = ptm32->tmExternalLeading;
266 ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
267 ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
268 ptm16->tmWeight = ptm32->tmWeight;
269 ptm16->tmOverhang = ptm32->tmOverhang;
270 ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
271 ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
272 ptm16->tmFirstChar = ptm32->tmFirstChar;
273 ptm16->tmLastChar = ptm32->tmLastChar;
274 ptm16->tmDefaultChar = ptm32->tmDefaultChar;
275 ptm16->tmBreakChar = ptm32->tmBreakChar;
276 ptm16->tmItalic = ptm32->tmItalic;
277 ptm16->tmUnderlined = ptm32->tmUnderlined;
278 ptm16->tmStruckOut = ptm32->tmStruckOut;
279 ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
280 ptm16->tmCharSet = ptm32->tmCharSet;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000281}
282
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000283void FONT_TextMetric16ToA(const TEXTMETRIC16 *ptm16, LPTEXTMETRICA ptm32 )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000284{
Alexandre Julliard491502b1997-11-01 19:08:16 +0000285 ptm32->tmHeight = ptm16->tmHeight;
286 ptm32->tmAscent = ptm16->tmAscent;
287 ptm32->tmDescent = ptm16->tmDescent;
288 ptm32->tmInternalLeading = ptm16->tmInternalLeading;
289 ptm32->tmExternalLeading = ptm16->tmExternalLeading;
290 ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
291 ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
292 ptm32->tmWeight = ptm16->tmWeight;
293 ptm32->tmOverhang = ptm16->tmOverhang;
294 ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
295 ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000296 ptm32->tmFirstChar = ptm16->tmFirstChar;
297 ptm32->tmLastChar = ptm16->tmLastChar;
298 ptm32->tmDefaultChar = ptm16->tmDefaultChar;
299 ptm32->tmBreakChar = ptm16->tmBreakChar;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000300 ptm32->tmItalic = ptm16->tmItalic;
301 ptm32->tmUnderlined = ptm16->tmUnderlined;
302 ptm32->tmStruckOut = ptm16->tmStruckOut;
303 ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
304 ptm32->tmCharSet = ptm16->tmCharSet;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000305}
306
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000307void FONT_TextMetric16ToW(const TEXTMETRIC16 *ptm16, LPTEXTMETRICW ptm32 )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000308{
Alexandre Julliard491502b1997-11-01 19:08:16 +0000309 ptm32->tmHeight = ptm16->tmHeight;
310 ptm32->tmAscent = ptm16->tmAscent;
311 ptm32->tmDescent = ptm16->tmDescent;
312 ptm32->tmInternalLeading = ptm16->tmInternalLeading;
313 ptm32->tmExternalLeading = ptm16->tmExternalLeading;
314 ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
315 ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
316 ptm32->tmWeight = ptm16->tmWeight;
317 ptm32->tmOverhang = ptm16->tmOverhang;
318 ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
319 ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
320 ptm32->tmFirstChar = ptm16->tmFirstChar;
321 ptm32->tmLastChar = ptm16->tmLastChar;
322 ptm32->tmDefaultChar = ptm16->tmDefaultChar;
323 ptm32->tmBreakChar = ptm16->tmBreakChar;
324 ptm32->tmItalic = ptm16->tmItalic;
325 ptm32->tmUnderlined = ptm16->tmUnderlined;
326 ptm32->tmStruckOut = ptm16->tmStruckOut;
327 ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
328 ptm32->tmCharSet = ptm16->tmCharSet;
329}
330
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000331void FONT_TextMetricAToW(const TEXTMETRICA *ptm32A, LPTEXTMETRICW ptm32W )
Alexandre Julliard491502b1997-11-01 19:08:16 +0000332{
333 ptm32W->tmHeight = ptm32A->tmHeight;
334 ptm32W->tmAscent = ptm32A->tmAscent;
335 ptm32W->tmDescent = ptm32A->tmDescent;
336 ptm32W->tmInternalLeading = ptm32A->tmInternalLeading;
337 ptm32W->tmExternalLeading = ptm32A->tmExternalLeading;
338 ptm32W->tmAveCharWidth = ptm32A->tmAveCharWidth;
339 ptm32W->tmMaxCharWidth = ptm32A->tmMaxCharWidth;
340 ptm32W->tmWeight = ptm32A->tmWeight;
341 ptm32W->tmOverhang = ptm32A->tmOverhang;
342 ptm32W->tmDigitizedAspectX = ptm32A->tmDigitizedAspectX;
343 ptm32W->tmDigitizedAspectY = ptm32A->tmDigitizedAspectY;
344 ptm32W->tmFirstChar = ptm32A->tmFirstChar;
345 ptm32W->tmLastChar = ptm32A->tmLastChar;
346 ptm32W->tmDefaultChar = ptm32A->tmDefaultChar;
347 ptm32W->tmBreakChar = ptm32A->tmBreakChar;
348 ptm32W->tmItalic = ptm32A->tmItalic;
349 ptm32W->tmUnderlined = ptm32A->tmUnderlined;
350 ptm32W->tmStruckOut = ptm32A->tmStruckOut;
351 ptm32W->tmPitchAndFamily = ptm32A->tmPitchAndFamily;
352 ptm32W->tmCharSet = ptm32A->tmCharSet;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000353}
Alexandre Julliarde2991ea1995-07-29 13:09:43 +0000354
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000355void FONT_TextMetricWToA(const TEXTMETRICW *ptmW, LPTEXTMETRICA ptmA )
356{
357 ptmA->tmHeight = ptmW->tmHeight;
358 ptmA->tmAscent = ptmW->tmAscent;
359 ptmA->tmDescent = ptmW->tmDescent;
360 ptmA->tmInternalLeading = ptmW->tmInternalLeading;
361 ptmA->tmExternalLeading = ptmW->tmExternalLeading;
362 ptmA->tmAveCharWidth = ptmW->tmAveCharWidth;
363 ptmA->tmMaxCharWidth = ptmW->tmMaxCharWidth;
364 ptmA->tmWeight = ptmW->tmWeight;
365 ptmA->tmOverhang = ptmW->tmOverhang;
366 ptmA->tmDigitizedAspectX = ptmW->tmDigitizedAspectX;
367 ptmA->tmDigitizedAspectY = ptmW->tmDigitizedAspectY;
368 ptmA->tmFirstChar = ptmW->tmFirstChar;
369 ptmA->tmLastChar = ptmW->tmLastChar;
370 ptmA->tmDefaultChar = ptmW->tmDefaultChar;
371 ptmA->tmBreakChar = ptmW->tmBreakChar;
372 ptmA->tmItalic = ptmW->tmItalic;
373 ptmA->tmUnderlined = ptmW->tmUnderlined;
374 ptmA->tmStruckOut = ptmW->tmStruckOut;
375 ptmA->tmPitchAndFamily = ptmW->tmPitchAndFamily;
376 ptmA->tmCharSet = ptmW->tmCharSet;
377}
378
379
380void FONT_NewTextMetricExWTo16(const NEWTEXTMETRICEXW *ptmW, LPNEWTEXTMETRICEX16 ptm16 )
381{
382 FONT_TextMetricWTo16((LPTEXTMETRICW)ptmW, (LPTEXTMETRIC16)ptm16);
Huw D M Davies26ee2ca2001-04-04 00:09:53 +0000383 ptm16->ntmTm.ntmFlags = ptmW->ntmTm.ntmFlags;
384 ptm16->ntmTm.ntmSizeEM = ptmW->ntmTm.ntmSizeEM;
385 ptm16->ntmTm.ntmCellHeight = ptmW->ntmTm.ntmCellHeight;
386 ptm16->ntmTm.ntmAvgWidth = ptmW->ntmTm.ntmAvgWidth;
387 memcpy(&ptm16->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000388}
389
390void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, LPNEWTEXTMETRICEXA ptmA )
391{
392 FONT_TextMetricWToA((LPTEXTMETRICW)ptmW, (LPTEXTMETRICA)ptmA);
Huw D M Davies26ee2ca2001-04-04 00:09:53 +0000393 ptmA->ntmTm.ntmFlags = ptmW->ntmTm.ntmFlags;
394 ptmA->ntmTm.ntmSizeEM = ptmW->ntmTm.ntmSizeEM;
395 ptmA->ntmTm.ntmCellHeight = ptmW->ntmTm.ntmCellHeight;
396 ptmA->ntmTm.ntmAvgWidth = ptmW->ntmTm.ntmAvgWidth;
397 memcpy(&ptmA->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000398}
399
400void FONT_NewTextMetricEx16ToW(const NEWTEXTMETRICEX16 *ptm16, LPNEWTEXTMETRICEXW ptmW )
401{
402 FONT_TextMetric16ToW((LPTEXTMETRIC16)ptm16, (LPTEXTMETRICW)ptmW);
Huw D M Davies26ee2ca2001-04-04 00:09:53 +0000403 ptmW->ntmTm.ntmFlags = ptm16->ntmTm.ntmFlags;
404 ptmW->ntmTm.ntmSizeEM = ptm16->ntmTm.ntmSizeEM;
405 ptmW->ntmTm.ntmCellHeight = ptm16->ntmTm.ntmCellHeight;
406 ptmW->ntmTm.ntmAvgWidth = ptm16->ntmTm.ntmAvgWidth;
407 memcpy(&ptmW->ntmFontSig, &ptm16->ntmFontSig, sizeof(FONTSIGNATURE));
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000408}
409
410
Alexandre Julliard401710d1993-09-04 10:09:32 +0000411/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000412 * CreateFontIndirect (GDI.57)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000413 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000414HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *plf16 )
415{
416 LOGFONTW lfW;
417
418 if(plf16) {
419 FONT_LogFont16ToW( plf16, &lfW );
420 return CreateFontIndirectW( &lfW );
421 } else {
422 return CreateFontIndirectW( NULL );
423 }
424}
425
426
427/***********************************************************************
428 * CreateFontIndirectA (GDI32.@)
429 */
430HFONT WINAPI CreateFontIndirectA( const LOGFONTA *plfA )
431{
432 LOGFONTW lfW;
433
434 if (plfA) {
435 FONT_LogFontAToW( plfA, &lfW );
436 return CreateFontIndirectW( &lfW );
437 } else
438 return CreateFontIndirectW( NULL );
439
440}
441
442/***********************************************************************
443 * CreateFontIndirectW (GDI32.@)
444 */
445HFONT WINAPI CreateFontIndirectW( const LOGFONTW *plf )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000446{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000447 HFONT hFont = 0;
Alexandre Julliard0c126c71996-02-18 18:44:41 +0000448
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000449 if (plf)
Alexandre Julliardca22b331996-07-12 19:02:39 +0000450 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000451 FONTOBJ* fontPtr;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000452 if ((fontPtr = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC, &hFont )))
453 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000454 memcpy( &fontPtr->logfont, plf, sizeof(LOGFONTW) );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000455
Francois Gougetee285b72001-05-11 20:03:40 +0000456 TRACE("(%ld %ld %ld %ld) %s %s %s => %04x\n",
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000457 plf->lfHeight, plf->lfWidth,
458 plf->lfEscapement, plf->lfOrientation,
459 debugstr_w(plf->lfFaceName),
460 plf->lfWeight > 400 ? "Bold" : "",
461 plf->lfItalic ? "Italic" : "", hFont);
Alexandre Julliard46ea8b31998-05-03 19:01:20 +0000462
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000463 if (plf->lfEscapement != plf->lfOrientation) {
Alexandre Julliard46ea8b31998-05-03 19:01:20 +0000464 /* this should really depend on whether GM_ADVANCED is set */
465 fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +0000466 WARN("orientation angle %f set to "
467 "escapement angle %f for new font %04x\n",
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000468 plf->lfOrientation/10., plf->lfEscapement/10., hFont);
Alexandre Julliard46ea8b31998-05-03 19:01:20 +0000469 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000470 GDI_ReleaseObj( hFont );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000471 }
472 }
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +0000473 else WARN("(NULL) => NULL\n");
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000474
475 return hFont;
476}
Alexandre Julliard401710d1993-09-04 10:09:32 +0000477
478/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000479 * CreateFont (GDI.56)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000480 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000481HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
482 INT16 weight, BYTE italic, BYTE underline,
483 BYTE strikeout, BYTE charset, BYTE outpres,
484 BYTE clippres, BYTE quality, BYTE pitch,
485 LPCSTR name )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000486{
Patrik Stridvalla9a671d1999-04-25 19:01:52 +0000487 LOGFONT16 logfont;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000488
Patrik Stridvalla9a671d1999-04-25 19:01:52 +0000489 logfont.lfHeight = height;
490 logfont.lfWidth = width;
491 logfont.lfEscapement = esc;
492 logfont.lfOrientation = orient;
493 logfont.lfWeight = weight;
494 logfont.lfItalic = italic;
495 logfont.lfUnderline = underline;
496 logfont.lfStrikeOut = strikeout;
497 logfont.lfCharSet = charset;
498 logfont.lfOutPrecision = outpres;
499 logfont.lfClipPrecision = clippres;
500 logfont.lfQuality = quality;
501 logfont.lfPitchAndFamily = pitch;
502
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000503 if (name)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000504 lstrcpynA(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000505 else
506 logfont.lfFaceName[0] = '\0';
Patrik Stridvalla9a671d1999-04-25 19:01:52 +0000507
Alexandre Julliardca22b331996-07-12 19:02:39 +0000508 return CreateFontIndirect16( &logfont );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000509}
510
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000511/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000512 * CreateFontA (GDI32.@)
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000513 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000514HFONT WINAPI CreateFontA( INT height, INT width, INT esc,
515 INT orient, INT weight, DWORD italic,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000516 DWORD underline, DWORD strikeout, DWORD charset,
517 DWORD outpres, DWORD clippres, DWORD quality,
518 DWORD pitch, LPCSTR name )
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000519{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000520 LOGFONTA logfont;
521
522 logfont.lfHeight = height;
523 logfont.lfWidth = width;
524 logfont.lfEscapement = esc;
525 logfont.lfOrientation = orient;
526 logfont.lfWeight = weight;
527 logfont.lfItalic = italic;
528 logfont.lfUnderline = underline;
529 logfont.lfStrikeOut = strikeout;
530 logfont.lfCharSet = charset;
531 logfont.lfOutPrecision = outpres;
532 logfont.lfClipPrecision = clippres;
533 logfont.lfQuality = quality;
534 logfont.lfPitchAndFamily = pitch;
535
536 if (name)
537 lstrcpynA(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
538 else
539 logfont.lfFaceName[0] = '\0';
540
541 return CreateFontIndirectA( &logfont );
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000542}
543
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000544/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000545 * CreateFontW (GDI32.@)
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000546 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000547HFONT WINAPI CreateFontW( INT height, INT width, INT esc,
548 INT orient, INT weight, DWORD italic,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000549 DWORD underline, DWORD strikeout, DWORD charset,
550 DWORD outpres, DWORD clippres, DWORD quality,
551 DWORD pitch, LPCWSTR name )
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000552{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000553 LOGFONTW logfont;
554
555 logfont.lfHeight = height;
556 logfont.lfWidth = width;
557 logfont.lfEscapement = esc;
558 logfont.lfOrientation = orient;
559 logfont.lfWeight = weight;
560 logfont.lfItalic = italic;
561 logfont.lfUnderline = underline;
562 logfont.lfStrikeOut = strikeout;
563 logfont.lfCharSet = charset;
564 logfont.lfOutPrecision = outpres;
565 logfont.lfClipPrecision = clippres;
566 logfont.lfQuality = quality;
567 logfont.lfPitchAndFamily = pitch;
568
569 if (name)
570 lstrcpynW(logfont.lfFaceName, name,
571 sizeof(logfont.lfFaceName) / sizeof(WCHAR));
572 else
573 logfont.lfFaceName[0] = '\0';
574
575 return CreateFontIndirectW( &logfont );
Alexandre Julliard18f92e71996-07-17 20:02:21 +0000576}
577
578
Alexandre Julliard401710d1993-09-04 10:09:32 +0000579/***********************************************************************
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000580 * FONT_GetObject16
Alexandre Julliard401710d1993-09-04 10:09:32 +0000581 */
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000582INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000583{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000584 LOGFONT16 lf16;
585
586 FONT_LogFontWTo16( &font->logfont, &lf16 );
587
Alexandre Julliardd90840e1996-06-11 16:02:08 +0000588 if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000589 memcpy( buffer, &lf16, count );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000590 return count;
591}
592
Alexandre Julliard401710d1993-09-04 10:09:32 +0000593/***********************************************************************
Huw D M Daviesaec373c1999-07-23 19:25:11 +0000594 * FONT_GetObjectA
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000595 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000596INT FONT_GetObjectA( FONTOBJ *font, INT count, LPSTR buffer )
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000597{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000598 LOGFONTA lfA;
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000599
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000600 FONT_LogFontWToA( &font->logfont, &lfA );
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000601
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000602 if (count > sizeof(lfA)) count = sizeof(lfA);
603 memcpy( buffer, &lfA, count );
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000604 return count;
605}
Juergen Schmiedcba84881998-10-23 13:27:36 +0000606/***********************************************************************
Huw D M Daviesaec373c1999-07-23 19:25:11 +0000607 * FONT_GetObjectW
Juergen Schmiedcba84881998-10-23 13:27:36 +0000608 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000609INT FONT_GetObjectW( FONTOBJ *font, INT count, LPSTR buffer )
Juergen Schmiedcba84881998-10-23 13:27:36 +0000610{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000611 if (count > sizeof(LOGFONTW)) count = sizeof(LOGFONTW);
612 memcpy( buffer, &font->logfont, count );
Juergen Schmiedcba84881998-10-23 13:27:36 +0000613 return count;
614}
Alexandre Julliard0e270f41996-08-24 18:26:35 +0000615
616
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000617/***********************************************************************
618 * FONT_EnumInstance16
619 *
620 * Called by the device driver layer to pass font info
621 * down to the application.
622 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000623static INT FONT_EnumInstance16( LPENUMLOGFONTEXW plf, LPNEWTEXTMETRICEXW ptm,
624 DWORD fType, LPARAM lp )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000625{
626#define pfe ((fontEnum16*)lp)
627 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
628 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
629 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000630 FONT_EnumLogFontExWTo16(plf, pfe->lpLogFont);
631 FONT_NewTextMetricExWTo16(ptm, pfe->lpTextMetric);
632 return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric,
633 (UINT16)fType, (LPARAM)(pfe->lpData) );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000634 }
635#undef pfe
636 return 1;
637}
638
639/***********************************************************************
Huw D M Daviesaec373c1999-07-23 19:25:11 +0000640 * FONT_EnumInstance
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000641 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000642static INT FONT_EnumInstance( LPENUMLOGFONTEXW plf, LPNEWTEXTMETRICEXW ptm,
643 DWORD fType, LPARAM lp )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000644{
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000645 /* lfCharSet is at the same offset in both LOGFONTA and LOGFONTW */
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000646
647#define pfe ((fontEnum32*)lp)
648 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
649 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
650 {
651 /* convert font metrics */
652
653 if( pfe->dwFlags & ENUM_UNICODE )
654 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000655 return pfe->lpEnumFunc( plf, ptm, fType, pfe->lpData );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000656 }
657 else
658 {
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000659 ENUMLOGFONTEXA logfont;
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000660 NEWTEXTMETRICEXA tmA;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000661
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000662 FONT_EnumLogFontExWToA( plf, &logfont);
663 FONT_NewTextMetricExWToA( ptm, &tmA );
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000664
665 return pfe->lpEnumFunc( (LPENUMLOGFONTEXW)&logfont,
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000666 (LPNEWTEXTMETRICEXW)&tmA, fType,
667 pfe->lpData );
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000668 }
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000669 }
670#undef pfe
671 return 1;
672}
673
674/***********************************************************************
675 * EnumFontFamiliesEx16 (GDI.613)
676 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000677INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
678 FONTENUMPROCEX16 efproc, LPARAM lParam,
679 DWORD dwFlags)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000680{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000681 BOOL (*enum_func)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000682 INT16 retVal = 0;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000683 DC* dc = DC_GetDCPtr( hDC );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000684
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000685 if (!dc) return 0;
686 enum_func = dc->funcs->pEnumDeviceFonts;
687 GDI_ReleaseObj( hDC );
688
689 if (enum_func)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000690 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000691 LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000692 if( lptm16 )
693 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000694 LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000695 if( lplf16 )
696 {
Patrik Stridvalla9a671d1999-04-25 19:01:52 +0000697 fontEnum16 fe16;
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000698 LOGFONTW lfW;
699 FONT_LogFont16ToW(plf, &lfW);
Patrik Stridvalla9a671d1999-04-25 19:01:52 +0000700
701 fe16.lpLogFontParam = plf;
702 fe16.lpEnumFunc = efproc;
703 fe16.lpData = lParam;
704
705 fe16.lpTextMetric = lptm16;
706 fe16.lpLogFont = lplf16;
707 fe16.segTextMetric = SEGPTR_GET(lptm16);
708 fe16.segLogFont = SEGPTR_GET(lplf16);
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000709
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000710 retVal = enum_func( hDC, &lfW, FONT_EnumInstance16,
711 (LPARAM)&fe16 );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000712 SEGPTR_FREE(lplf16);
713 }
714 SEGPTR_FREE(lptm16);
715 }
716 }
717 return retVal;
718}
719
720/***********************************************************************
Huw D M Daviesaec373c1999-07-23 19:25:11 +0000721 * FONT_EnumFontFamiliesEx
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000722 */
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000723static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf,
724 FONTENUMPROCEXW efproc,
725 LPARAM lParam, DWORD dwUnicode)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000726{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000727 BOOL (*enum_func)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
Huw D M Davies814654e2001-09-12 20:21:06 +0000728 INT ret = 1;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000729 DC *dc = DC_GetDCPtr( hDC );
Huw D M Davies814654e2001-09-12 20:21:06 +0000730 fontEnum32 fe32;
731 BOOL enum_gdi_fonts;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000732
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000733 if (!dc) return 0;
Huw D M Davies814654e2001-09-12 20:21:06 +0000734
735 fe32.lpLogFontParam = plf;
736 fe32.lpEnumFunc = efproc;
737 fe32.lpData = lParam;
738 fe32.dwFlags = dwUnicode;
739
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000740 enum_func = dc->funcs->pEnumDeviceFonts;
741 GDI_ReleaseObj( hDC );
Huw D M Davies814654e2001-09-12 20:21:06 +0000742 enum_gdi_fonts = GetDeviceCaps(hDC, TEXTCAPS) & TC_VA_ABLE;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000743
Huw D M Davies814654e2001-09-12 20:21:06 +0000744 if (!enum_func && !enum_gdi_fonts) return 0;
745
746 if (enum_gdi_fonts)
747 ret = WineEngEnumFonts( plf, FONT_EnumInstance, (LPARAM)&fe32 );
748 if (ret && enum_func)
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000749 ret = enum_func( hDC, plf, FONT_EnumInstance, (LPARAM)&fe32 );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000750 return ret;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000751}
752
753/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000754 * EnumFontFamiliesExW (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000755 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000756INT WINAPI EnumFontFamiliesExW( HDC hDC, LPLOGFONTW plf,
757 FONTENUMPROCEXW efproc,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000758 LPARAM lParam, DWORD dwFlags )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000759{
Ulrich Czekallae6ab9d31999-10-24 17:26:45 +0000760 return FONT_EnumFontFamiliesEx( hDC, plf, efproc, lParam, ENUM_UNICODE );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000761}
762
763/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000764 * EnumFontFamiliesExA (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000765 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000766INT WINAPI EnumFontFamiliesExA( HDC hDC, LPLOGFONTA plf,
767 FONTENUMPROCEXA efproc,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000768 LPARAM lParam, DWORD dwFlags)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000769{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000770 LOGFONTW lfW;
771 FONT_LogFontAToW( plf, &lfW );
772
773 return FONT_EnumFontFamiliesEx( hDC, &lfW,
774 (FONTENUMPROCEXW)efproc, lParam, 0);
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000775}
776
777/***********************************************************************
778 * EnumFontFamilies16 (GDI.330)
779 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000780INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
781 FONTENUMPROC16 efproc, LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000782{
783 LOGFONT16 lf;
784
785 lf.lfCharSet = DEFAULT_CHARSET;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000786 if( lpFamily ) lstrcpynA( lf.lfFaceName, lpFamily, LF_FACESIZE );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000787 else lf.lfFaceName[0] = '\0';
788
789 return EnumFontFamiliesEx16( hDC, &lf, (FONTENUMPROCEX16)efproc, lpData, 0 );
790}
791
792/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000793 * EnumFontFamiliesA (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000794 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000795INT WINAPI EnumFontFamiliesA( HDC hDC, LPCSTR lpFamily,
796 FONTENUMPROCA efproc, LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000797{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000798 LOGFONTA lf;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000799
800 lf.lfCharSet = DEFAULT_CHARSET;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000801 if( lpFamily ) lstrcpynA( lf.lfFaceName, lpFamily, LF_FACESIZE );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000802 else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
803
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000804 return EnumFontFamiliesExA( hDC, &lf, (FONTENUMPROCEXA)efproc, lpData, 0 );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000805}
806
807/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000808 * EnumFontFamiliesW (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000809 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000810INT WINAPI EnumFontFamiliesW( HDC hDC, LPCWSTR lpFamily,
811 FONTENUMPROCW efproc, LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000812{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000813 LOGFONTW lf;
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000814
815 lf.lfCharSet = DEFAULT_CHARSET;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000816 if( lpFamily ) lstrcpynW( lf.lfFaceName, lpFamily, LF_FACESIZE );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000817 else lf.lfFaceName[0] = 0;
818
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000819 return EnumFontFamiliesExW( hDC, &lf, (FONTENUMPROCEXW)efproc, lpData, 0 );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000820}
821
822/***********************************************************************
823 * EnumFonts16 (GDI.70)
824 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000825INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
826 LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000827{
828 return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
829}
830
831/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000832 * EnumFontsA (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000833 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000834INT WINAPI EnumFontsA( HDC hDC, LPCSTR lpName, FONTENUMPROCA efproc,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000835 LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000836{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000837 return EnumFontFamiliesA( hDC, lpName, efproc, lpData );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000838}
839
840/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000841 * EnumFontsW (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000842 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000843INT WINAPI EnumFontsW( HDC hDC, LPCWSTR lpName, FONTENUMPROCW efproc,
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000844 LPARAM lpData )
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000845{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000846 return EnumFontFamiliesW( hDC, lpName, efproc, lpData );
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000847}
Alexandre Julliard401710d1993-09-04 10:09:32 +0000848
849
850/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000851 * GetTextCharacterExtra (GDI.89)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000852 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000853INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000854{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000855 return (INT16)GetTextCharacterExtra( hdc );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000856}
857
858
859/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000860 * GetTextCharacterExtra (GDI32.@)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000861 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000862INT WINAPI GetTextCharacterExtra( HDC hdc )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000863{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000864 INT ret;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000865 DC *dc = DC_GetDCPtr( hdc );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000866 if (!dc) return 0;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000867 ret = abs( (dc->charExtra * dc->wndExtX + dc->vportExtX / 2)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000868 / dc->vportExtX );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000869 GDI_ReleaseObj( hdc );
870 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000871}
872
873
874/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000875 * SetTextCharacterExtra (GDI.8)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000876 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000877INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000878{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000879 return (INT16)SetTextCharacterExtra( hdc, extra );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000880}
881
882
883/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000884 * SetTextCharacterExtra (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000885 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000886INT WINAPI SetTextCharacterExtra( HDC hdc, INT extra )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000887{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000888 INT prev;
Huw D M Davies7603dea1999-04-25 09:24:23 +0000889 DC * dc = DC_GetDCPtr( hdc );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000890 if (!dc) return 0;
Huw D M Davies7603dea1999-04-25 09:24:23 +0000891 if (dc->funcs->pSetTextCharacterExtra)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000892 prev = dc->funcs->pSetTextCharacterExtra( dc, extra );
893 else
894 {
895 extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000896 prev = (dc->charExtra * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX;
897 dc->charExtra = abs(extra);
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000898 }
899 GDI_ReleaseObj( hdc );
900 return prev;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000901}
902
903
904/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000905 * SetTextJustification (GDI.10)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000906 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000907INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000908{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000909 return SetTextJustification( hdc, extra, breaks );
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000910}
911
912
913/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000914 * SetTextJustification (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000915 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000916BOOL WINAPI SetTextJustification( HDC hdc, INT extra, INT breaks )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000917{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000918 BOOL ret = TRUE;
Huw D M Davies7603dea1999-04-25 09:24:23 +0000919 DC * dc = DC_GetDCPtr( hdc );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000920 if (!dc) return FALSE;
Huw D M Davies7603dea1999-04-25 09:24:23 +0000921 if (dc->funcs->pSetTextJustification)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000922 ret = dc->funcs->pSetTextJustification( dc, extra, breaks );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000923 else
924 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000925 extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
926 if (!extra) breaks = 0;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000927 dc->breakTotalExtra = extra;
928 dc->breakCount = breaks;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000929 if (breaks)
930 {
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000931 dc->breakExtra = extra / breaks;
932 dc->breakRem = extra - (dc->breakCount * dc->breakExtra);
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000933 }
934 else
935 {
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000936 dc->breakExtra = 0;
937 dc->breakRem = 0;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000938 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000939 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000940 GDI_ReleaseObj( hdc );
941 return ret;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000942}
943
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +0000944
Alexandre Julliardb1bac321996-12-15 19:45:59 +0000945/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000946 * GetTextFace (GDI.92)
Alexandre Julliardb1bac321996-12-15 19:45:59 +0000947 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000948INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
Alexandre Julliardb1bac321996-12-15 19:45:59 +0000949{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000950 return GetTextFaceA(hdc,count,name);
Alexandre Julliardb1bac321996-12-15 19:45:59 +0000951}
Alexandre Julliard401710d1993-09-04 10:09:32 +0000952
953/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000954 * GetTextFaceA (GDI32.@)
Alexandre Julliardaca05781994-10-17 18:12:41 +0000955 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000956INT WINAPI GetTextFaceA( HDC hdc, INT count, LPSTR name )
Alexandre Julliardaca05781994-10-17 18:12:41 +0000957{
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000958 INT res = GetTextFaceW(hdc, 0, NULL);
959 LPWSTR nameW = HeapAlloc( GetProcessHeap(), 0, res * 2 );
960 GetTextFaceW( hdc, res, nameW );
961
962 if (name)
963 res = WideCharToMultiByte( CP_ACP, 0, nameW, -1, name, count,
964 NULL, NULL);
965 else
966 res = WideCharToMultiByte( CP_ACP, 0, nameW, -1, NULL, 0, NULL, NULL);
967 HeapFree( GetProcessHeap(), 0, nameW );
968 return res;
969}
970
971/***********************************************************************
972 * GetTextFaceW (GDI32.@)
973 */
974INT WINAPI GetTextFaceW( HDC hdc, INT count, LPWSTR name )
975{
Alexandre Julliardaca05781994-10-17 18:12:41 +0000976 FONTOBJ *font;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000977 INT ret = 0;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000978
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000979 DC * dc = DC_GetDCPtr( hdc );
Alexandre Julliardaca05781994-10-17 18:12:41 +0000980 if (!dc) return 0;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000981
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000982 if ((font = (FONTOBJ *) GDI_GetObjPtr( dc->hFont, FONT_MAGIC )))
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000983 {
984 if (name)
985 {
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000986 lstrcpynW( name, font->logfont.lfFaceName, count );
987 ret = strlenW(name);
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000988 }
Huw D M Davies2aa85ee2001-02-14 22:56:38 +0000989 else ret = strlenW(font->logfont.lfFaceName) + 1;
Alexandre Julliard2239abb2000-11-05 02:05:07 +0000990 GDI_ReleaseObj( dc->hFont );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +0000991 }
992 GDI_ReleaseObj( hdc );
993 return ret;
Alexandre Julliardaca05781994-10-17 18:12:41 +0000994}
995
996
997/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +0000998 * GetTextExtent (GDI.91)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000999 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001000DWORD WINAPI GetTextExtent16( HDC16 hdc, LPCSTR str, INT16 count )
Alexandre Julliard401710d1993-09-04 10:09:32 +00001001{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001002 SIZE16 size;
1003 if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
Alexandre Julliard234bc241994-12-10 13:02:28 +00001004 return MAKELONG( size.cx, size.cy );
Alexandre Julliard401710d1993-09-04 10:09:32 +00001005}
1006
1007
1008/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001009 * GetTextExtentPoint (GDI.471)
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001010 *
1011 * FIXME: Should this have a bug for compatibility?
1012 * Original Windows versions of GetTextExtentPoint{A,W} have documented
Alexandre Julliard638f1691999-01-17 16:32:32 +00001013 * bugs (-> MSDN KB q147647.txt).
Alexandre Julliard401710d1993-09-04 10:09:32 +00001014 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001015BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
1016 LPSIZE16 size )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001017{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001018 SIZE size32;
Huw D M Daviesc5539241999-12-26 00:47:03 +00001019 BOOL ret;
Alexandre Julliard982a2232000-12-13 20:20:09 +00001020 TRACE("%04x, %p (%s), %d, %p\n", hdc, str, debugstr_an(str, count), count, size);
Huw D M Daviesc5539241999-12-26 00:47:03 +00001021 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
Alexandre Julliard982a2232000-12-13 20:20:09 +00001022 size->cx = size32.cx;
1023 size->cy = size32.cy;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001024 return (BOOL16)ret;
1025}
1026
1027
1028/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001029 * GetTextExtentPoint32A (GDI32.@)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001030 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001031BOOL WINAPI GetTextExtentPoint32A( HDC hdc, LPCSTR str, INT count,
1032 LPSIZE size )
Alexandre Julliard401710d1993-09-04 10:09:32 +00001033{
Hidenori Takeshima7901c0b2000-08-20 20:08:35 +00001034 BOOL ret = FALSE;
Huw D M Davies29382422001-09-19 20:32:07 +00001035 INT wlen;
1036 LPWSTR p = FONT_mbtowc(hdc, str, count, &wlen, NULL);
Alexandre Julliard401710d1993-09-04 10:09:32 +00001037
Huw D M Davies814654e2001-09-12 20:21:06 +00001038 if (p) {
Huw D M Davies814654e2001-09-12 20:21:06 +00001039 ret = GetTextExtentPoint32W( hdc, p, wlen, size );
1040 HeapFree( GetProcessHeap(), 0, p );
Hidenori Takeshima7901c0b2000-08-20 20:08:35 +00001041 }
Huw D M Davies814654e2001-09-12 20:21:06 +00001042
Gerald Pfeifer1b490b42000-09-24 03:05:11 +00001043 TRACE("(%08x %s %d %p): returning %ld x %ld\n",
Hidenori Takeshima7901c0b2000-08-20 20:08:35 +00001044 hdc, debugstr_an (str, count), count, size, size->cx, size->cy );
Huw D M Daviesc5539241999-12-26 00:47:03 +00001045 return ret;
Alexandre Julliard401710d1993-09-04 10:09:32 +00001046}
1047
1048
1049/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001050 * GetTextExtentPoint32W [GDI32.@] Computes width/height for a string
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001051 *
1052 * Computes width and height of the specified string.
1053 *
1054 * RETURNS
1055 * Success: TRUE
1056 * Failure: FALSE
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001057 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001058BOOL WINAPI GetTextExtentPoint32W(
1059 HDC hdc, /* [in] Handle of device context */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001060 LPCWSTR str, /* [in] Address of text string */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001061 INT count, /* [in] Number of characters in string */
1062 LPSIZE size) /* [out] Address of structure for string size */
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001063{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001064 BOOL ret = FALSE;
Huw D M Daviesc5539241999-12-26 00:47:03 +00001065 DC * dc = DC_GetDCPtr( hdc );
Huw D M Davies814654e2001-09-12 20:21:06 +00001066 if (!dc) return FALSE;
1067
1068 if(dc->gdiFont)
1069 ret = WineEngGetTextExtentPoint(dc->gdiFont, str, count, size);
1070 else if(dc->funcs->pGetTextExtentPoint)
1071 ret = dc->funcs->pGetTextExtentPoint( dc, str, count, size );
1072
1073 GDI_ReleaseObj( hdc );
1074
Gerald Pfeifer1b490b42000-09-24 03:05:11 +00001075 TRACE("(%08x %s %d %p): returning %ld x %ld\n",
Huw D M Daviesc5539241999-12-26 00:47:03 +00001076 hdc, debugstr_wn (str, count), count, size, size->cx, size->cy );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001077 return ret;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001078}
1079
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001080
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001081/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001082 * GetTextExtentPointA (GDI32.@)
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001083 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001084BOOL WINAPI GetTextExtentPointA( HDC hdc, LPCSTR str, INT count,
1085 LPSIZE size )
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001086{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001087 TRACE("not bug compatible.\n");
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001088 return GetTextExtentPoint32A( hdc, str, count, size );
1089}
1090
1091/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001092 * GetTextExtentPointW (GDI32.@)
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001093 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001094BOOL WINAPI GetTextExtentPointW( HDC hdc, LPCWSTR str, INT count,
1095 LPSIZE size )
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001096{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001097 TRACE("not bug compatible.\n");
Alexandre Julliard7e6ae4b1996-12-08 19:25:27 +00001098 return GetTextExtentPoint32W( hdc, str, count, size );
1099}
1100
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00001101
1102/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001103 * GetTextExtentExPointA (GDI32.@)
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001104 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001105BOOL WINAPI GetTextExtentExPointA( HDC hdc, LPCSTR str, INT count,
Huw D M Daviesc5539241999-12-26 00:47:03 +00001106 INT maxExt, LPINT lpnFit,
1107 LPINT alpDx, LPSIZE size )
1108{
Huw D M Daviesc5539241999-12-26 00:47:03 +00001109 BOOL ret;
Huw D M Davies29382422001-09-19 20:32:07 +00001110 INT wlen;
1111 LPWSTR p = FONT_mbtowc( hdc, str, count, &wlen, NULL);
1112 ret = GetTextExtentExPointW( hdc, p, wlen, maxExt, lpnFit, alpDx, size);
Huw D M Daviesc5539241999-12-26 00:47:03 +00001113 HeapFree( GetProcessHeap(), 0, p );
1114 return ret;
1115}
1116
1117
1118/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001119 * GetTextExtentExPointW (GDI32.@)
Bill Medland06a49f62001-08-24 19:12:56 +00001120 *
1121 * Return the size of the string as it would be if it was output properly by
1122 * e.g. TextOut.
1123 *
1124 * This should include
1125 * - Intercharacter spacing
1126 * - justification spacing (not yet done)
1127 * - kerning? see below
1128 *
1129 * Kerning. Since kerning would be carried out by the rendering code it should
1130 * be done by the driver. However they don't support it yet. Also I am not
1131 * yet persuaded that (certainly under Win95) any kerning is actually done.
1132 *
1133 * str: According to MSDN this should be null-terminated. That is not true; a
1134 * null will not terminate it early.
1135 * size: Certainly under Win95 this appears buggy or weird if *lpnFit is less
1136 * than count. I have seen it be either the size of the full string or
1137 * 1 less than the size of the full string. I have not seen it bear any
1138 * resemblance to the portion that would fit.
1139 * lpnFit: What exactly is fitting? Stupidly, in my opinion, it includes the
1140 * trailing intercharacter spacing and any trailing justification.
1141 *
1142 * FIXME
1143 * Currently we do this by measuring each character etc. We should do it by
1144 * passing the request to the driver, perhaps by extending the
1145 * pGetTextExtentPoint function to take the alpDx argument. That would avoid
1146 * thinking about kerning issues and rounding issues in the justification.
Huw D M Daviesc5539241999-12-26 00:47:03 +00001147 */
1148
1149BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count,
1150 INT maxExt, LPINT lpnFit,
1151 LPINT alpDx, LPSIZE size )
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001152{
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001153 int index, nFit, extent;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001154 SIZE tSize;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001155 BOOL ret = FALSE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001156
Francois Gouget551586e2001-09-24 01:12:08 +00001157 TRACE("(%08x, %s, %d)\n",hdc,debugstr_wn(str,count),maxExt);
1158
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001159 size->cx = size->cy = nFit = extent = 0;
1160 for(index = 0; index < count; index++)
1161 {
Huw D M Davies814654e2001-09-12 20:21:06 +00001162 if(!GetTextExtentPoint32W( hdc, str, 1, &tSize )) goto done;
Bill Medland06a49f62001-08-24 19:12:56 +00001163 /* GetTextExtentPoint includes intercharacter spacing. */
1164 /* FIXME - justification needs doing yet. Remember that the base
1165 * data will not be in logical coordinates.
1166 */
Travis Michielsen2bbca902001-09-07 15:28:32 +00001167 extent += tSize.cx;
1168 if( !lpnFit || extent <= maxExt )
Bill Medland06a49f62001-08-24 19:12:56 +00001169 /* It is allowed to be equal. */
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001170 {
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001171 nFit++;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001172 if( alpDx ) alpDx[index] = extent;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001173 }
Travis Michielsen2bbca902001-09-07 15:28:32 +00001174 if( tSize.cy > size->cy ) size->cy = tSize.cy;
1175 str++;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001176 }
1177 size->cx = extent;
Dmitry Timoshkov96cda942001-04-16 19:33:51 +00001178 if(lpnFit) *lpnFit = nFit;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001179 ret = TRUE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001180
Francois Gouget551586e2001-09-24 01:12:08 +00001181 TRACE("returning %d %ld x %ld\n",nFit,size->cx,size->cy);
Gerald Pfeifer1b490b42000-09-24 03:05:11 +00001182
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001183done:
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001184 return ret;
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001185}
1186
Alexandre Julliardb1bac321996-12-15 19:45:59 +00001187/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001188 * GetTextMetrics (GDI.93)
Alexandre Julliard401710d1993-09-04 10:09:32 +00001189 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001190BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
Alexandre Julliard401710d1993-09-04 10:09:32 +00001191{
Huw D M Davies39f54282001-03-16 16:43:14 +00001192 TEXTMETRICW tm32;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001193
Huw D M Davies39f54282001-03-16 16:43:14 +00001194 if (!GetTextMetricsW( (HDC)hdc, &tm32 )) return FALSE;
1195 FONT_TextMetricWTo16( &tm32, metrics );
Alexandre Julliard3051b641996-07-05 17:14:13 +00001196 return TRUE;
1197}
1198
1199
1200/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001201 * GetTextMetricsA (GDI32.@)
Alexandre Julliard01d63461997-01-20 19:43:45 +00001202 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001203BOOL WINAPI GetTextMetricsA( HDC hdc, TEXTMETRICA *metrics )
Huw D M Davies39f54282001-03-16 16:43:14 +00001204{
1205 TEXTMETRICW tm32;
1206
1207 if (!GetTextMetricsW( hdc, &tm32 )) return FALSE;
1208 FONT_TextMetricWToA( &tm32, metrics );
1209 return TRUE;
1210}
1211
1212/***********************************************************************
1213 * GetTextMetricsW (GDI32.@)
1214 */
1215BOOL WINAPI GetTextMetricsW( HDC hdc, TEXTMETRICW *metrics )
1216{
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001217 BOOL ret = FALSE;
1218 DC * dc = DC_GetDCPtr( hdc );
1219 if (!dc) return FALSE;
Alexandre Julliard01d63461997-01-20 19:43:45 +00001220
Huw D M Davies814654e2001-09-12 20:21:06 +00001221 if (dc->gdiFont)
1222 ret = WineEngGetTextMetrics(dc->gdiFont, metrics);
1223 else if (dc->funcs->pGetTextMetrics)
1224 ret = dc->funcs->pGetTextMetrics( dc, metrics );
1225
1226 if (ret)
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001227 {
Alexandre Julliard77b99181997-09-14 17:17:23 +00001228 /* device layer returns values in device units
1229 * therefore we have to convert them to logical */
1230
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001231#define WDPTOLP(x) ((x<0)? \
1232 (-abs((x)*dc->wndExtX/dc->vportExtX)): \
1233 (abs((x)*dc->wndExtX/dc->vportExtX)))
1234#define HDPTOLP(y) ((y<0)? \
1235 (-abs((y)*dc->wndExtY/dc->vportExtY)): \
1236 (abs((y)*dc->wndExtY/dc->vportExtY)))
1237
1238 metrics->tmHeight = HDPTOLP(metrics->tmHeight);
1239 metrics->tmAscent = HDPTOLP(metrics->tmAscent);
1240 metrics->tmDescent = HDPTOLP(metrics->tmDescent);
1241 metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
1242 metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
1243 metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
1244 metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
1245 metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001246 ret = TRUE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001247
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001248 TRACE("text metrics:\n"
Huw D M Davies39f54282001-03-16 16:43:14 +00001249 " Weight = %03li\t FirstChar = %i\t AveCharWidth = %li\n"
1250 " Italic = % 3i\t LastChar = %i\t\t MaxCharWidth = %li\n"
1251 " UnderLined = %01i\t DefaultChar = %i\t Overhang = %li\n"
1252 " StruckOut = %01i\t BreakChar = %i\t CharSet = %i\n"
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001253 " PitchAndFamily = %02x\n"
1254 " --------------------\n"
1255 " InternalLeading = %li\n"
1256 " Ascent = %li\n"
1257 " Descent = %li\n"
1258 " Height = %li\n",
1259 metrics->tmWeight, metrics->tmFirstChar, metrics->tmAveCharWidth,
1260 metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
1261 metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
1262 metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
1263 metrics->tmPitchAndFamily,
1264 metrics->tmInternalLeading,
1265 metrics->tmAscent,
1266 metrics->tmDescent,
1267 metrics->tmHeight );
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001268 }
1269 GDI_ReleaseObj( hdc );
1270 return ret;
Alexandre Julliard01d63461997-01-20 19:43:45 +00001271}
1272
1273
1274/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001275 * GetOutlineTextMetrics [GDI.308] Gets metrics for TrueType fonts.
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001276 *
1277 * NOTES
1278 * lpOTM should be LPOUTLINETEXTMETRIC
1279 *
1280 * RETURNS
1281 * Success: Non-zero or size of required buffer
1282 * Failure: 0
1283 */
Alexandre Julliard85ed45e1998-08-22 19:03:56 +00001284UINT16 WINAPI GetOutlineTextMetrics16(
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001285 HDC16 hdc, /* [in] Handle of device context */
Alexandre Julliard85ed45e1998-08-22 19:03:56 +00001286 UINT16 cbData, /* [in] Size of metric data array */
Moshe Vainer4a150e71998-10-14 18:15:43 +00001287 LPOUTLINETEXTMETRIC16 lpOTM) /* [out] Address of metric data array */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001288{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001289 FIXME("(%04x,%04x,%p): stub\n", hdc,cbData,lpOTM);
Alexandre Julliardc7c217b1998-04-13 12:21:30 +00001290 return 0;
1291}
1292
1293
1294/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001295 * GetOutlineTextMetricsA (GDI32.@)
1296 * Gets metrics for TrueType fonts.
Moshe Vainer4a150e71998-10-14 18:15:43 +00001297 *
1298 *
1299 * RETURNS
1300 * Success: Non-zero or size of required buffer
1301 * Failure: 0
1302 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001303UINT WINAPI GetOutlineTextMetricsA(
1304 HDC hdc, /* [in] Handle of device context */
1305 UINT cbData, /* [in] Size of metric data array */
1306 LPOUTLINETEXTMETRICA lpOTM) /* [out] Address of metric data array */
Moshe Vainer4a150e71998-10-14 18:15:43 +00001307{
Huw D M Davies814654e2001-09-12 20:21:06 +00001308 char buf[512], *ptr;
1309 UINT ret, needed;
1310 OUTLINETEXTMETRICW *lpOTMW = (OUTLINETEXTMETRICW *)buf;
1311 INT left, len;
1312
1313 if((ret = GetOutlineTextMetricsW(hdc, sizeof(buf), lpOTMW)) == 0) {
1314 if((ret = GetOutlineTextMetricsW(hdc, 0, NULL)) == 0)
1315 return 0;
1316 lpOTMW = HeapAlloc(GetProcessHeap(), 0, ret);
1317 GetOutlineTextMetricsW(hdc, ret, lpOTMW);
1318 }
1319
1320 needed = sizeof(OUTLINETEXTMETRICA);
1321 if(lpOTMW->otmpFamilyName)
1322 needed += WideCharToMultiByte(CP_ACP, 0,
1323 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFamilyName), -1,
1324 NULL, 0, NULL, NULL);
1325 if(lpOTMW->otmpFaceName)
1326 needed += WideCharToMultiByte(CP_ACP, 0,
1327 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFaceName), -1,
1328 NULL, 0, NULL, NULL);
1329 if(lpOTMW->otmpStyleName)
1330 needed += WideCharToMultiByte(CP_ACP, 0,
1331 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpStyleName), -1,
1332 NULL, 0, NULL, NULL);
1333 if(lpOTMW->otmpFullName)
1334 needed += WideCharToMultiByte(CP_ACP, 0,
1335 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFullName), -1,
1336 NULL, 0, NULL, NULL);
1337
1338 if(!lpOTM) {
1339 ret = needed;
1340 goto end;
1341 }
1342
1343 if(needed > cbData) {
1344 ret = 0;
1345 goto end;
1346 }
Moshe Vainer4a150e71998-10-14 18:15:43 +00001347
1348
Huw D M Davies814654e2001-09-12 20:21:06 +00001349 lpOTM->otmSize = needed;
1350 FONT_TextMetricWToA( &lpOTMW->otmTextMetrics, &lpOTM->otmTextMetrics );
Huw D M Davies916a1a62001-03-13 23:31:40 +00001351 lpOTM->otmFiller = 0;
Huw D M Davies814654e2001-09-12 20:21:06 +00001352 lpOTM->otmPanoseNumber = lpOTMW->otmPanoseNumber;
1353 lpOTM->otmfsSelection = lpOTMW->otmfsSelection;
1354 lpOTM->otmfsType = lpOTMW->otmfsType;
1355 lpOTM->otmsCharSlopeRise = lpOTMW->otmsCharSlopeRise;
1356 lpOTM->otmsCharSlopeRun = lpOTMW->otmsCharSlopeRun;
1357 lpOTM->otmItalicAngle = lpOTMW->otmItalicAngle;
1358 lpOTM->otmEMSquare = lpOTMW->otmEMSquare;
1359 lpOTM->otmAscent = lpOTMW->otmAscent;
1360 lpOTM->otmDescent = lpOTMW->otmDescent;
1361 lpOTM->otmLineGap = lpOTMW->otmLineGap;
1362 lpOTM->otmsCapEmHeight = lpOTMW->otmsCapEmHeight;
1363 lpOTM->otmsXHeight = lpOTMW->otmsXHeight;
1364 lpOTM->otmrcFontBox = lpOTMW->otmrcFontBox;
1365 lpOTM->otmMacAscent = lpOTMW->otmMacAscent;
1366 lpOTM->otmMacDescent = lpOTMW->otmMacDescent;
1367 lpOTM->otmMacLineGap = lpOTMW->otmMacLineGap;
1368 lpOTM->otmusMinimumPPEM = lpOTMW->otmusMinimumPPEM;
1369 lpOTM->otmptSubscriptSize = lpOTMW->otmptSubscriptSize;
1370 lpOTM->otmptSubscriptOffset = lpOTMW->otmptSubscriptOffset;
1371 lpOTM->otmptSuperscriptSize = lpOTMW->otmptSuperscriptSize;
1372 lpOTM->otmptSuperscriptOffset = lpOTMW->otmptSuperscriptOffset;
1373 lpOTM->otmsStrikeoutSize = lpOTMW->otmsStrikeoutSize;
1374 lpOTM->otmsStrikeoutPosition = lpOTMW->otmsStrikeoutPosition;
1375 lpOTM->otmsUnderscoreSize = lpOTMW->otmsUnderscoreSize;
1376 lpOTM->otmsUnderscorePosition = lpOTMW->otmsUnderscorePosition;
Moshe Vainer4a150e71998-10-14 18:15:43 +00001377
Moshe Vainer4a150e71998-10-14 18:15:43 +00001378
Huw D M Davies814654e2001-09-12 20:21:06 +00001379 ptr = (char*)(lpOTM + 1);
1380 left = needed - sizeof(*lpOTM);
Moshe Vainer4a150e71998-10-14 18:15:43 +00001381
Huw D M Davies814654e2001-09-12 20:21:06 +00001382 if(lpOTMW->otmpFamilyName) {
1383 lpOTM->otmpFamilyName = (LPSTR)(ptr - (char*)lpOTM);
1384 len = WideCharToMultiByte(CP_ACP, 0,
1385 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFamilyName), -1,
1386 ptr, left, NULL, NULL);
1387 left -= len;
1388 ptr += len;
1389 } else
1390 lpOTM->otmpFamilyName = 0;
1391
1392 if(lpOTMW->otmpFaceName) {
1393 lpOTM->otmpFaceName = (LPSTR)(ptr - (char*)lpOTM);
1394 len = WideCharToMultiByte(CP_ACP, 0,
1395 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFaceName), -1,
1396 ptr, left, NULL, NULL);
1397 left -= len;
1398 ptr += len;
1399 } else
1400 lpOTM->otmpFaceName = 0;
1401
1402 if(lpOTMW->otmpStyleName) {
1403 lpOTM->otmpStyleName = (LPSTR)(ptr - (char*)lpOTM);
1404 len = WideCharToMultiByte(CP_ACP, 0,
1405 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpStyleName), -1,
1406 ptr, left, NULL, NULL);
1407 left -= len;
1408 ptr += len;
1409 } else
1410 lpOTM->otmpStyleName = 0;
1411
1412 if(lpOTMW->otmpFullName) {
1413 lpOTM->otmpFullName = (LPSTR)(ptr - (char*)lpOTM);
1414 len = WideCharToMultiByte(CP_ACP, 0,
1415 (WCHAR*)((char*)lpOTMW + (ptrdiff_t)lpOTMW->otmpFullName), -1,
1416 ptr, left, NULL, NULL);
1417 left -= len;
1418 } else
1419 lpOTM->otmpFullName = 0;
Moshe Vainer4a150e71998-10-14 18:15:43 +00001420
Huw D M Davies814654e2001-09-12 20:21:06 +00001421 assert(left == 0);
1422
1423 ret = needed;
1424
1425end:
1426 if(lpOTMW != (OUTLINETEXTMETRICW *)buf)
1427 HeapFree(GetProcessHeap(), 0, lpOTMW);
1428
1429 return ret;
Moshe Vainer4a150e71998-10-14 18:15:43 +00001430}
1431
Huw D M Davies814654e2001-09-12 20:21:06 +00001432
Alexandre Julliard0c0e3be1998-12-10 15:49:22 +00001433/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001434 * GetOutlineTextMetricsW [GDI32.@]
Alexandre Julliard0c0e3be1998-12-10 15:49:22 +00001435 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001436UINT WINAPI GetOutlineTextMetricsW(
1437 HDC hdc, /* [in] Handle of device context */
1438 UINT cbData, /* [in] Size of metric data array */
1439 LPOUTLINETEXTMETRICW lpOTM) /* [out] Address of metric data array */
Alexandre Julliard0c0e3be1998-12-10 15:49:22 +00001440{
Huw D M Davies814654e2001-09-12 20:21:06 +00001441 DC *dc = DC_GetDCPtr( hdc );
1442 UINT ret;
1443
1444 TRACE("(%d,%d,%p)\n", hdc, cbData, lpOTM);
1445 if(!dc) return 0;
1446
1447 if(dc->gdiFont)
1448 ret = WineEngGetOutlineTextMetrics(dc->gdiFont, cbData, lpOTM);
1449
1450 else { /* This stuff was in GetOutlineTextMetricsA, I've moved it here
1451 but really this should just be a return 0. */
1452
1453 ret = sizeof(*lpOTM);
1454 if (lpOTM) {
1455 if(cbData < ret)
1456 ret = 0;
1457 else {
1458 memset(lpOTM, 0, ret);
1459 lpOTM->otmSize = sizeof(*lpOTM);
1460 GetTextMetricsW(hdc, &lpOTM->otmTextMetrics);
1461 /*
1462 Further fill of the structure not implemented,
1463 Needs real values for the structure members
1464 */
1465 }
1466 }
1467 }
1468 GDI_ReleaseObj(hdc);
1469 return ret;
Alexandre Julliard0c0e3be1998-12-10 15:49:22 +00001470}
Moshe Vainer4a150e71998-10-14 18:15:43 +00001471
Huw D M Davies814654e2001-09-12 20:21:06 +00001472
Moshe Vainer4a150e71998-10-14 18:15:43 +00001473/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001474 * GetCharWidth (GDI.350)
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001475 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001476BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1477 LPINT16 buffer )
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001478{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001479 BOOL retVal = FALSE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001480
1481 if( firstChar != lastChar )
1482 {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001483 LPINT buf32 = (LPINT)HeapAlloc(GetProcessHeap(), 0,
1484 sizeof(INT)*(1 + (lastChar - firstChar)));
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001485 if( buf32 )
1486 {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001487 LPINT obuf32 = buf32;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001488 int i;
1489
1490 retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
1491 if (retVal)
1492 {
1493 for (i = firstChar; i <= lastChar; i++)
1494 *buffer++ = *buf32++;
1495 }
Alexandre Julliard3db94ef1997-09-28 17:43:24 +00001496 HeapFree(GetProcessHeap(), 0, obuf32);
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001497 }
1498 }
Alexandre Julliard33072e11997-06-29 18:08:02 +00001499 else /* happens quite often to warrant a special treatment */
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001500 {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001501 INT chWidth;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001502 retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
Alexandre Julliard33072e11997-06-29 18:08:02 +00001503 *buffer = chWidth;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001504 }
1505 return retVal;
1506}
1507
1508
1509/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001510 * GetCharWidthA (GDI32.@)
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001511 * GetCharWidth32A (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001512 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001513BOOL WINAPI GetCharWidth32A( HDC hdc, UINT firstChar, UINT lastChar,
1514 LPINT buffer )
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001515{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001516 UINT i, extra;
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001517 BOOL ret = FALSE;
1518 DC * dc = DC_GetDCPtr( hdc );
1519 if (!dc) return FALSE;
1520
Huw D M Davies814654e2001-09-12 20:21:06 +00001521 if (dc->gdiFont)
1522 ret = WineEngGetCharWidth( dc->gdiFont, firstChar, lastChar, buffer );
1523 else if (dc->funcs->pGetCharWidth)
1524 ret = dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer);
1525
1526 if (ret)
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001527 {
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001528 /* convert device units to logical */
1529
1530 extra = dc->vportExtX >> 1;
1531 for( i = firstChar; i <= lastChar; i++, buffer++ )
1532 *buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
1533 ret = TRUE;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001534 }
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001535 GDI_ReleaseObj( hdc );
1536 return ret;
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001537}
1538
1539
1540/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001541 * GetCharWidthW (GDI32.@)
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001542 * GetCharWidth32W (GDI32.@)
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001543 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001544BOOL WINAPI GetCharWidth32W( HDC hdc, UINT firstChar, UINT lastChar,
1545 LPINT buffer )
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001546{
1547 return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
1548}
1549
1550
Patrik Stridvall54fe8382000-04-06 20:21:16 +00001551/* FIXME: all following APIs ******************************************/
1552
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001553
Patrik Stridvall54fe8382000-04-06 20:21:16 +00001554/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001555 * SetMapperFlags (GDI.349)
Alexandre Julliard58199531994-04-21 01:20:00 +00001556 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001557DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001558{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001559 return SetMapperFlags( hDC, dwFlag );
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001560}
1561
1562
1563/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001564 * SetMapperFlags (GDI32.@)
Alexandre Julliardf0cbfa01997-02-15 14:29:56 +00001565 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001566DWORD WINAPI SetMapperFlags( HDC hDC, DWORD dwFlag )
Alexandre Julliard58199531994-04-21 01:20:00 +00001567{
Huw D M Davies7603dea1999-04-25 09:24:23 +00001568 DC *dc = DC_GetDCPtr( hDC );
1569 DWORD ret = 0;
1570 if(!dc) return 0;
1571 if(dc->funcs->pSetMapperFlags)
1572 ret = dc->funcs->pSetMapperFlags( dc, dwFlag );
1573 else
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001574 FIXME("(0x%04x, 0x%08lx): stub - harmless\n", hDC, dwFlag);
Alexandre Julliard2a2321b2000-08-19 21:38:55 +00001575 GDI_ReleaseObj( hDC );
Huw D M Davies7603dea1999-04-25 09:24:23 +00001576 return ret;
Alexandre Julliard58199531994-04-21 01:20:00 +00001577}
1578
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001579/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001580 * GetAspectRatioFilterEx (GDI.486)
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001581 */
Alexandre Julliard85ed45e1998-08-22 19:03:56 +00001582BOOL16 WINAPI GetAspectRatioFilterEx16( HDC16 hdc, LPSIZE16 pAspectRatio )
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001583{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001584 FIXME("(%04x, %p): -- Empty Stub !\n", hdc, pAspectRatio);
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001585 return FALSE;
1586}
1587
Paul Quinn1beaae51998-12-15 15:38:36 +00001588/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001589 * GetAspectRatioFilterEx (GDI32.@)
Paul Quinn1beaae51998-12-15 15:38:36 +00001590 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001591BOOL WINAPI GetAspectRatioFilterEx( HDC hdc, LPSIZE pAspectRatio )
Paul Quinn1beaae51998-12-15 15:38:36 +00001592{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001593 FIXME("(%04x, %p): -- Empty Stub !\n", hdc, pAspectRatio);
Paul Quinn1beaae51998-12-15 15:38:36 +00001594 return FALSE;
1595}
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001596
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00001597/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001598 * GetCharABCWidths (GDI.307)
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00001599 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001600BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1601 LPABC16 abc )
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00001602{
Marcus Meissner67f0be12001-04-23 18:11:58 +00001603 LPABC abc32 = HeapAlloc(GetProcessHeap(),0,sizeof(ABC)*(lastChar-firstChar+1));
1604 int i;
1605
1606 if (!GetCharABCWidthsA( hdc, firstChar, lastChar, abc32 )) {
1607 HeapFree(GetProcessHeap(),0,abc32);
1608 return FALSE;
1609 }
1610
1611 for (i=firstChar;i<=lastChar;i++) {
1612 abc[i-firstChar].abcA = abc32[i-firstChar].abcA;
1613 abc[i-firstChar].abcB = abc32[i-firstChar].abcB;
1614 abc[i-firstChar].abcC = abc32[i-firstChar].abcC;
1615 }
1616 HeapFree(GetProcessHeap(),0,abc32);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001617 return TRUE;
1618}
Alexandre Julliard1e9ac791996-06-06 18:38:27 +00001619
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001620
1621/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001622 * GetCharABCWidthsA (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001623 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001624BOOL WINAPI GetCharABCWidthsA(HDC hdc, UINT firstChar, UINT lastChar,
1625 LPABC abc )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001626{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001627 return GetCharABCWidthsW( hdc, firstChar, lastChar, abc );
Alexandre Julliard7d654eb1996-02-25 11:36:22 +00001628}
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001629
Alexandre Julliard5f721f81994-01-04 20:14:34 +00001630
Alexandre Julliard46ea8b31998-05-03 19:01:20 +00001631/******************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001632 * GetCharABCWidthsW [GDI32.@] Retrieves widths of characters in range
Alexandre Julliard46ea8b31998-05-03 19:01:20 +00001633 *
1634 * PARAMS
1635 * hdc [I] Handle of device context
1636 * firstChar [I] First character in range to query
1637 * lastChar [I] Last character in range to query
1638 * abc [O] Address of character-width structure
1639 *
1640 * NOTES
1641 * Only works with TrueType fonts
1642 *
1643 * RETURNS
1644 * Success: TRUE
1645 * Failure: FALSE
Alexandre Julliard0e607781993-11-03 19:23:37 +00001646 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001647BOOL WINAPI GetCharABCWidthsW( HDC hdc, UINT firstChar, UINT lastChar,
1648 LPABC abc )
Alexandre Julliard0e607781993-11-03 19:23:37 +00001649{
Marcus Meissner67f0be12001-04-23 18:11:58 +00001650 int i;
1651 LPINT widths = HeapAlloc(GetProcessHeap(),0,(lastChar-firstChar+1)*sizeof(INT));
1652
1653 FIXME("(%04x,%04x,%04x,%p), returns slightly bogus values.\n", hdc, firstChar, lastChar, abc);
1654
1655 GetCharWidth32A(hdc,firstChar,lastChar,widths);
1656
1657 for (i=firstChar;i<=lastChar;i++) {
1658 abc[i-firstChar].abcA = 0; /* left distance */
1659 abc[i-firstChar].abcB = widths[i-firstChar];/* width */
1660 abc[i-firstChar].abcC = 0; /* right distance */
1661 }
1662 HeapFree(GetProcessHeap(),0,widths);
1663 return TRUE;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001664}
1665
1666
1667/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001668 * GetGlyphOutline (GDI.309)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001669 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001670DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
1671 LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
1672 LPVOID lpBuffer, const MAT2 *lpmat2 )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001673{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001674 FIXME("(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
Alexandre Julliard54c27111998-03-29 19:44:57 +00001675 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001676 return (DWORD)-1; /* failure */
Alexandre Julliard0e607781993-11-03 19:23:37 +00001677}
Alexandre Julliard58199531994-04-21 01:20:00 +00001678
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001679
1680/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001681 * GetGlyphOutlineA (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001682 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001683DWORD WINAPI GetGlyphOutlineA( HDC hdc, UINT uChar, UINT fuFormat,
1684 LPGLYPHMETRICS lpgm, DWORD cbBuffer,
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001685 LPVOID lpBuffer, const MAT2 *lpmat2 )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001686{
Huw D M Davies814654e2001-09-12 20:21:06 +00001687 return GetGlyphOutlineW(hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer,
1688 lpmat2);
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001689}
1690
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001691/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001692 * GetGlyphOutlineW (GDI32.@)
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001693 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001694DWORD WINAPI GetGlyphOutlineW( HDC hdc, UINT uChar, UINT fuFormat,
1695 LPGLYPHMETRICS lpgm, DWORD cbBuffer,
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001696 LPVOID lpBuffer, const MAT2 *lpmat2 )
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001697{
Huw D M Davies814654e2001-09-12 20:21:06 +00001698 DC *dc = DC_GetDCPtr(hdc);
1699 DWORD ret;
1700
1701 TRACE("(%04x, '%c', %04x, %p, %ld, %p, %p)\n",
Alexandre Julliard54c27111998-03-29 19:44:57 +00001702 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
Huw D M Davies814654e2001-09-12 20:21:06 +00001703
1704 if(!dc) return GDI_ERROR;
1705
1706 if(dc->gdiFont)
1707 ret = WineEngGetGlyphOutline(dc->gdiFont, uChar, fuFormat, lpgm,
1708 cbBuffer, lpBuffer, lpmat2);
1709 else
1710 ret = GDI_ERROR;
1711
1712 GDI_ReleaseObj(hdc);
1713 return ret;
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001714}
1715
Alexandre Julliard7ebe1a41996-12-22 18:27:48 +00001716/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001717 * CreateScalableFontResource (GDI.310)
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001718 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001719BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
1720 LPCSTR lpszResourceFile,
1721 LPCSTR fontFile, LPCSTR path )
Alexandre Julliard21979011997-03-05 08:22:35 +00001722{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001723 return CreateScalableFontResourceA( fHidden, lpszResourceFile,
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001724 fontFile, path );
Alexandre Julliard21979011997-03-05 08:22:35 +00001725}
1726
Alexandre Julliard21979011997-03-05 08:22:35 +00001727/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001728 * CreateScalableFontResourceA (GDI32.@)
Alexandre Julliard21979011997-03-05 08:22:35 +00001729 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001730BOOL WINAPI CreateScalableFontResourceA( DWORD fHidden,
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001731 LPCSTR lpszResourceFile,
1732 LPCSTR lpszFontFile,
1733 LPCSTR lpszCurrentPath )
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001734{
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001735 /* fHidden=1 - only visible for the calling app, read-only, not
1736 * enumbered with EnumFonts/EnumFontFamilies
1737 * lpszCurrentPath can be NULL
1738 */
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001739 FIXME("(%ld,%s,%s,%s): stub\n",
Francois Gougetb60c4ce2001-10-14 16:15:05 +00001740 fHidden, debugstr_a(lpszResourceFile), debugstr_a(lpszFontFile),
1741 debugstr_a(lpszCurrentPath) );
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001742 return FALSE; /* create failed */
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001743}
1744
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001745/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001746 * CreateScalableFontResourceW (GDI32.@)
Alexandre Julliard3ed37e01994-11-07 18:20:42 +00001747 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001748BOOL WINAPI CreateScalableFontResourceW( DWORD fHidden,
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001749 LPCWSTR lpszResourceFile,
1750 LPCWSTR lpszFontFile,
1751 LPCWSTR lpszCurrentPath )
Alexandre Julliard21979011997-03-05 08:22:35 +00001752{
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001753 FIXME("(%ld,%p,%p,%p): stub\n",
Alexandre Julliard54c27111998-03-29 19:44:57 +00001754 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001755 return FALSE; /* create failed */
Alexandre Julliard75d86e11996-11-17 18:59:11 +00001756}
1757
1758
1759/*************************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001760 * GetRasterizerCaps (GDI.313)
Alexandre Julliardfa68b751995-04-03 16:55:37 +00001761 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001762BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
Alexandre Julliard21979011997-03-05 08:22:35 +00001763{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001764 return GetRasterizerCaps( lprs, cbNumBytes );
Alexandre Julliard21979011997-03-05 08:22:35 +00001765}
Alexandre Julliard58199531994-04-21 01:20:00 +00001766
Alexandre Julliard21979011997-03-05 08:22:35 +00001767
1768/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001769 * GetRasterizerCaps (GDI32.@)
Alexandre Julliard21979011997-03-05 08:22:35 +00001770 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001771BOOL WINAPI GetRasterizerCaps( LPRASTERIZER_STATUS lprs, UINT cbNumBytes)
Alexandre Julliardfa68b751995-04-03 16:55:37 +00001772{
Alexandre Julliard03468f71998-02-15 19:40:49 +00001773 lprs->nSize = sizeof(RASTERIZER_STATUS);
1774 lprs->wFlags = TT_AVAILABLE|TT_ENABLED;
1775 lprs->nLanguageID = 0;
Alexandre Julliard21979011997-03-05 08:22:35 +00001776 return TRUE;
Alexandre Julliardfa68b751995-04-03 16:55:37 +00001777}
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00001778
Alexandre Julliard21979011997-03-05 08:22:35 +00001779
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00001780/*************************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001781 * GetKerningPairs (GDI.332)
Bill Medland06a49f62001-08-24 19:12:56 +00001782 *
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00001783 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001784INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
1785 LPKERNINGPAIR16 lpKerningPairs )
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00001786{
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001787 /* At this time kerning is ignored (set to 0) */
Alexandre Julliard339eefc1996-06-23 14:56:20 +00001788 int i;
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001789 FIXME("(%x,%d,%p): almost empty stub!\n", hDC, cPairs, lpKerningPairs);
Bill Medland06a49f62001-08-24 19:12:56 +00001790 if (lpKerningPairs)
1791 for (i = 0; i < cPairs; i++)
1792 lpKerningPairs[i].iKernAmount = 0;
1793 /* FIXME: Should this function call SetLastError (0)? This is yet another
1794 * Microsoft function that can return 0 on success or failure
1795 */
Alexandre Julliard339eefc1996-06-23 14:56:20 +00001796 return 0;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00001797}
Alexandre Julliard349a9531997-02-02 19:01:52 +00001798
Alexandre Julliard21979011997-03-05 08:22:35 +00001799
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001800
Alexandre Julliard21979011997-03-05 08:22:35 +00001801/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001802 * GetKerningPairsA (GDI32.@)
Alexandre Julliard21979011997-03-05 08:22:35 +00001803 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001804DWORD WINAPI GetKerningPairsA( HDC hDC, DWORD cPairs,
1805 LPKERNINGPAIR lpKerningPairs )
Alexandre Julliard21979011997-03-05 08:22:35 +00001806{
Alexandre Julliard21979011997-03-05 08:22:35 +00001807 int i;
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001808 FIXME("(%x,%ld,%p): almost empty stub!\n", hDC, cPairs, lpKerningPairs);
Alexandre Julliard54c27111998-03-29 19:44:57 +00001809 for (i = 0; i < cPairs; i++)
1810 lpKerningPairs[i].iKernAmount = 0;
Alexandre Julliard21979011997-03-05 08:22:35 +00001811 return 0;
1812}
1813
1814
1815/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001816 * GetKerningPairsW (GDI32.@)
Alexandre Julliard21979011997-03-05 08:22:35 +00001817 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001818DWORD WINAPI GetKerningPairsW( HDC hDC, DWORD cPairs,
1819 LPKERNINGPAIR lpKerningPairs )
Alexandre Julliard21979011997-03-05 08:22:35 +00001820{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001821 return GetKerningPairsA( hDC, cPairs, lpKerningPairs );
Alexandre Julliard21979011997-03-05 08:22:35 +00001822}
Alexandre Julliard23946ad1997-06-16 17:43:53 +00001823
Alexandre Julliard642d3131998-07-12 19:29:36 +00001824/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001825 * TranslateCharsetInfo [GDI32.@]
Patrik Stridvall044855c2001-07-11 18:56:41 +00001826 * TranslateCharsetInfo [USER32.@]
Douglas Ridgway4f7d9ed1998-12-18 17:38:39 +00001827 *
1828 * Fills a CHARSETINFO structure for a character set, code page, or
1829 * font. This allows making the correspondance between different labelings
1830 * (character set, Windows, ANSI, and OEM codepages, and Unicode ranges)
1831 * of the same encoding.
1832 *
1833 * Only one codepage will be set in lpCs->fs. If TCI_SRCFONTSIG is used,
1834 * only one codepage should be set in *lpSrc.
1835 *
1836 * RETURNS
1837 * TRUE on success, FALSE on failure.
1838 *
Alexandre Julliard642d3131998-07-12 19:29:36 +00001839 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001840BOOL WINAPI TranslateCharsetInfo(
Patrik Stridvall2b3aa612000-12-01 23:58:28 +00001841 LPDWORD lpSrc, /* [in]
Douglas Ridgway4f7d9ed1998-12-18 17:38:39 +00001842 if flags == TCI_SRCFONTSIG: pointer to fsCsb of a FONTSIGNATURE
1843 if flags == TCI_SRCCHARSET: a character set value
1844 if flags == TCI_SRCCODEPAGE: a code page value
1845 */
Patrik Stridvall2b3aa612000-12-01 23:58:28 +00001846 LPCHARSETINFO lpCs, /* [out] structure to receive charset information */
1847 DWORD flags /* [in] determines interpretation of lpSrc */
Douglas Ridgway4f7d9ed1998-12-18 17:38:39 +00001848) {
Douglas Ridgwayab9e8bc1999-01-01 18:41:22 +00001849 int index = 0;
1850 switch (flags) {
1851 case TCI_SRCFONTSIG:
1852 while (!(*lpSrc>>index & 0x0001) && index<MAXTCIINDEX) index++;
1853 break;
1854 case TCI_SRCCODEPAGE:
Alexandre Julliarda3960291999-02-26 11:11:13 +00001855 while ((UINT) (lpSrc) != FONT_tci[index].ciACP && index < MAXTCIINDEX) index++;
Douglas Ridgwayab9e8bc1999-01-01 18:41:22 +00001856 break;
1857 case TCI_SRCCHARSET:
Alexandre Julliarda3960291999-02-26 11:11:13 +00001858 while ((UINT) (lpSrc) != FONT_tci[index].ciCharset && index < MAXTCIINDEX) index++;
Douglas Ridgwayab9e8bc1999-01-01 18:41:22 +00001859 break;
1860 default:
1861 return FALSE;
1862 }
1863 if (index >= MAXTCIINDEX || FONT_tci[index].ciCharset == DEFAULT_CHARSET) return FALSE;
1864 memcpy(lpCs, &FONT_tci[index], sizeof(CHARSETINFO));
Alexandre Julliard670cdc41997-08-24 16:00:30 +00001865 return TRUE;
1866}
1867
Alexandre Julliarde658d821997-11-30 17:45:40 +00001868/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001869 * GetFontLanguageInfo (GDI32.@)
Alexandre Julliarde658d821997-11-30 17:45:40 +00001870 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001871DWORD WINAPI GetFontLanguageInfo(HDC hdc) {
Alexandre Julliarde658d821997-11-30 17:45:40 +00001872 /* return value 0 is correct for most cases anyway */
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001873 FIXME("(%x):stub!\n", hdc);
Alexandre Julliarde658d821997-11-30 17:45:40 +00001874 return 0;
1875}
1876
1877/*************************************************************************
1878 * GetFontLanguageInfo (GDI.616)
1879 */
1880DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
1881 /* return value 0 is correct for most cases anyway */
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001882 FIXME("(%x):stub!\n",hdc);
Alexandre Julliarde658d821997-11-30 17:45:40 +00001883 return 0;
1884}
Alexandre Julliard642d3131998-07-12 19:29:36 +00001885
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001886/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001887 * GetFontData [GDI32.@] Retrieve data for TrueType font
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001888 *
1889 * RETURNS
1890 *
1891 * success: Number of bytes returned
1892 * failure: GDI_ERROR
1893 *
1894 * NOTES
1895 *
1896 * Calls SetLastError()
1897 *
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001898 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001899DWORD WINAPI GetFontData(HDC hdc, DWORD table, DWORD offset,
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001900 LPVOID buffer, DWORD length)
1901{
Huw D M Davies4e2024e2001-10-23 20:06:32 +00001902 DC *dc = DC_GetDCPtr(hdc);
1903 DWORD ret = GDI_ERROR;
1904
1905 if(!dc) return GDI_ERROR;
1906
1907 if(dc->gdiFont)
1908 ret = WineEngGetFontData(dc->gdiFont, table, offset, buffer, length);
1909
1910 GDI_ReleaseObj(hdc);
1911 return ret;
Alexandre Julliard767e6f61998-08-09 12:47:43 +00001912}
Alexandre Julliard642d3131998-07-12 19:29:36 +00001913
1914/*************************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00001915 * GetFontData [GDI.311]
Huw D M Daviescdf191a1999-11-21 02:01:41 +00001916 *
1917 */
1918DWORD WINAPI GetFontData16(HDC16 hdc, DWORD dwTable, DWORD dwOffset,
1919 LPVOID lpvBuffer, DWORD cbData)
1920{
1921 return GetFontData(hdc, dwTable, dwOffset, lpvBuffer, cbData);
1922}
1923
1924/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001925 * GetCharacterPlacementA [GDI32.@]
Juergen Schmied2259e441999-08-15 14:22:48 +00001926 *
1927 * NOTES:
1928 * the web browser control of ie4 calls this with dwFlags=0
Alexandre Julliard642d3131998-07-12 19:29:36 +00001929 */
1930DWORD WINAPI
Alexandre Julliarda3960291999-02-26 11:11:13 +00001931GetCharacterPlacementA(HDC hdc, LPCSTR lpString, INT uCount,
1932 INT nMaxExtent, GCP_RESULTSA *lpResults,
Alexandre Julliard642d3131998-07-12 19:29:36 +00001933 DWORD dwFlags)
1934{
Juergen Schmied2259e441999-08-15 14:22:48 +00001935 DWORD ret=0;
1936 SIZE size;
1937
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001938 TRACE("%s 0x%08x 0x%08x 0x%08lx:stub!\n",
1939 debugstr_a(lpString), uCount, nMaxExtent, dwFlags);
Juergen Schmied2259e441999-08-15 14:22:48 +00001940
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001941 TRACE("lpOrder=%p lpDx=%p lpCaretPos=%p lpClass=%p "
1942 "lpOutString=%p lpGlyphs=%p\n",
1943 lpResults->lpOrder, lpResults->lpDx, lpResults->lpCaretPos,
1944 lpResults->lpClass, lpResults->lpOutString, lpResults->lpGlyphs);
Juergen Schmied2259e441999-08-15 14:22:48 +00001945
Dimitrie O. Paundd03cc11999-12-08 03:56:23 +00001946 if(dwFlags) FIXME("flags 0x%08lx ignored\n", dwFlags);
1947 if(lpResults->lpOrder) FIXME("reordering not implemented\n");
1948 if(lpResults->lpCaretPos) FIXME("caret positions not implemented\n");
1949 if(lpResults->lpClass) FIXME("classes not implemented\n");
1950 if(lpResults->lpGlyphs) FIXME("glyphs not implemented\n");
Juergen Schmied2259e441999-08-15 14:22:48 +00001951
1952 /* copy will do if the GCP_REORDER flag is not set */
1953 if(lpResults->lpOutString)
1954 {
1955 lstrcpynA(lpResults->lpOutString, lpString, uCount);
1956 }
1957
1958 if (lpResults->lpDx)
1959 {
1960 int i, c;
1961 for (i=0; i<uCount;i++)
1962 {
1963 if (GetCharWidth32A(hdc, lpString[i], lpString[i], &c))
1964 lpResults->lpDx[i]= c;
1965 }
1966 }
1967
1968 if (GetTextExtentPoint32A(hdc, lpString, uCount, &size))
1969 ret = MAKELONG(size.cx, size.cy);
1970
1971 return ret;
Alexandre Julliard642d3131998-07-12 19:29:36 +00001972}
1973
1974/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00001975 * GetCharacterPlacementW [GDI32.@]
Alexandre Julliard642d3131998-07-12 19:29:36 +00001976 */
1977DWORD WINAPI
Alexandre Julliarda3960291999-02-26 11:11:13 +00001978GetCharacterPlacementW(HDC hdc, LPCWSTR lpString, INT uCount,
1979 INT nMaxExtent, GCP_RESULTSW *lpResults,
Alexandre Julliard642d3131998-07-12 19:29:36 +00001980 DWORD dwFlags)
1981{
Guy L. Albertellibc939e52001-10-21 15:02:34 +00001982 DWORD ret=0;
1983 SIZE size;
1984
1985 TRACE("%s 0x%08x 0x%08x 0x%08lx:partial stub!\n",
1986 debugstr_w(lpString), uCount, nMaxExtent, dwFlags);
1987
1988 TRACE("lpOrder=%p lpDx=%p lpCaretPos=%p lpClass=%p "
1989 "lpOutString=%p lpGlyphs=%p\n",
1990 lpResults->lpOrder, lpResults->lpDx, lpResults->lpCaretPos,
1991 lpResults->lpClass, lpResults->lpOutString, lpResults->lpGlyphs);
1992
1993 if(dwFlags) FIXME("flags 0x%08lx ignored\n", dwFlags);
1994 if(lpResults->lpOrder) FIXME("reordering not implemented\n");
1995 if(lpResults->lpCaretPos) FIXME("caret positions not implemented\n");
1996 if(lpResults->lpClass) FIXME("classes not implemented\n");
1997 if(lpResults->lpGlyphs) FIXME("glyphs not implemented\n");
1998
1999 /* copy will do if the GCP_REORDER flag is not set */
2000 if(lpResults->lpOutString)
2001 {
2002 lstrcpynW(lpResults->lpOutString, lpString, uCount);
2003 }
2004
2005 if (lpResults->lpDx)
2006 {
2007 int i, c;
2008 for (i=0; i<uCount;i++)
2009 {
2010 if (GetCharWidth32W(hdc, lpString[i], lpString[i], &c))
2011 lpResults->lpDx[i]= c;
2012 }
2013 }
2014
2015 if (GetTextExtentPoint32W(hdc, lpString, uCount, &size))
2016 ret = MAKELONG(size.cx, size.cy);
2017
2018 return ret;
Alexandre Julliard642d3131998-07-12 19:29:36 +00002019}
Paul Quinn1beaae51998-12-15 15:38:36 +00002020
2021/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002022 * GetCharABCWidthsFloatA [GDI32.@]
Paul Quinn1beaae51998-12-15 15:38:36 +00002023 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00002024BOOL WINAPI GetCharABCWidthsFloatA(HDC hdc, UINT iFirstChar, UINT iLastChar,
Paul Quinn1beaae51998-12-15 15:38:36 +00002025 LPABCFLOAT lpABCF)
2026{
Alexandre Julliard06c275a1999-05-02 14:32:27 +00002027 FIXME_(gdi)("GetCharABCWidthsFloatA, stub\n");
Paul Quinn1beaae51998-12-15 15:38:36 +00002028 return 0;
2029}
2030
2031/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002032 * GetCharABCWidthsFloatW [GDI32.@]
Paul Quinn1beaae51998-12-15 15:38:36 +00002033 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00002034BOOL WINAPI GetCharABCWidthsFloatW(HDC hdc, UINT iFirstChar,
2035 UINT iLastChar, LPABCFLOAT lpABCF)
Paul Quinn1beaae51998-12-15 15:38:36 +00002036{
Alexandre Julliard06c275a1999-05-02 14:32:27 +00002037 FIXME_(gdi)("GetCharABCWidthsFloatW, stub\n");
Paul Quinn1beaae51998-12-15 15:38:36 +00002038 return 0;
2039}
2040
2041/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002042 * GetCharWidthFloatA [GDI32.@]
Paul Quinn1beaae51998-12-15 15:38:36 +00002043 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00002044BOOL WINAPI GetCharWidthFloatA(HDC hdc, UINT iFirstChar,
2045 UINT iLastChar, PFLOAT pxBuffer)
Paul Quinn1beaae51998-12-15 15:38:36 +00002046{
Alexandre Julliard06c275a1999-05-02 14:32:27 +00002047 FIXME_(gdi)("GetCharWidthFloatA, stub\n");
Paul Quinn1beaae51998-12-15 15:38:36 +00002048 return 0;
2049}
2050
2051/*************************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002052 * GetCharWidthFloatW [GDI32.@]
Paul Quinn1beaae51998-12-15 15:38:36 +00002053 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00002054BOOL WINAPI GetCharWidthFloatW(HDC hdc, UINT iFirstChar,
2055 UINT iLastChar, PFLOAT pxBuffer)
Paul Quinn1beaae51998-12-15 15:38:36 +00002056{
Alexandre Julliard06c275a1999-05-02 14:32:27 +00002057 FIXME_(gdi)("GetCharWidthFloatW, stub\n");
Paul Quinn1beaae51998-12-15 15:38:36 +00002058 return 0;
2059}
2060
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002061
2062/***********************************************************************
2063 * *
2064 * Font Resource API *
2065 * *
2066 ***********************************************************************/
2067/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00002068 * AddFontResource (GDI.119)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002069 *
2070 * Can be either .FON, or .FNT, or .TTF, or .FOT font file.
2071 *
2072 * FIXME: Load header and find the best-matching font in the fontList;
2073 * fixup dfPoints if all metrics are identical, otherwise create
2074 * new fontAlias. When soft font support is ready this will
2075 * simply create a new fontResource ('filename' will go into
2076 * the pfr->resource field) with FR_SOFTFONT/FR_SOFTRESOURCE
2077 * flag set.
2078 */
2079INT16 WINAPI AddFontResource16( LPCSTR filename )
2080{
2081 return AddFontResourceA( filename );
2082}
2083
2084
2085/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002086 * AddFontResourceA (GDI32.@)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002087 */
2088INT WINAPI AddFontResourceA( LPCSTR str )
2089{
Andreas Mohrc9ec8842001-01-24 19:37:13 +00002090 FIXME("(%s): stub! Read the Wine User Guide on how to install "
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002091 "this font manually.\n", debugres_a(str));
2092 return 1;
2093}
2094
2095
2096/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002097 * AddFontResourceW (GDI32.@)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002098 */
2099INT WINAPI AddFontResourceW( LPCWSTR str )
2100{
Andreas Mohrc9ec8842001-01-24 19:37:13 +00002101 FIXME("(%s): stub! Read the Wine User Guide on how to install "
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002102 "this font manually.\n", debugres_w(str));
2103 return 1;
2104}
2105
2106/***********************************************************************
Patrik Stridvall17fd4e32001-06-28 18:04:41 +00002107 * RemoveFontResource (GDI.136)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002108 */
Alexandre Julliard982a2232000-12-13 20:20:09 +00002109BOOL16 WINAPI RemoveFontResource16( LPCSTR str )
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002110{
Andreas Mohrc9ec8842001-01-24 19:37:13 +00002111 FIXME("(%s): stub\n", debugres_a(str));
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002112 return TRUE;
2113}
2114
2115
2116/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002117 * RemoveFontResourceA (GDI32.@)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002118 */
2119BOOL WINAPI RemoveFontResourceA( LPCSTR str )
2120{
2121/* This is how it should look like */
2122/*
2123 fontResource** ppfr;
2124 BOOL32 retVal = FALSE;
2125
2126 EnterCriticalSection( &crtsc_fonts_X11 );
2127 for( ppfr = &fontList; *ppfr; ppfr = &(*ppfr)->next )
2128 if( !strcasecmp( (*ppfr)->lfFaceName, str ) )
2129 {
2130 if(((*ppfr)->fr_flags & (FR_SOFTFONT | FR_SOFTRESOURCE)) &&
2131 (*ppfr)->hOwnerProcess == GetCurrentProcess() )
2132 {
2133 if( (*ppfr)->fo_count )
2134 (*ppfr)->fr_flags |= FR_REMOVED;
2135 else
2136 XFONT_RemoveFontResource( ppfr );
2137 }
2138 retVal = TRUE;
2139 }
2140 LeaveCriticalSection( &crtsc_fonts_X11 );
2141 return retVal;
2142 */
2143 FIXME("(%s): stub\n", debugres_a(str));
2144 return TRUE;
2145}
2146
2147
2148/***********************************************************************
Huw D M Davies2aa85ee2001-02-14 22:56:38 +00002149 * RemoveFontResourceW (GDI32.@)
Alexandre Julliardaafd54d2000-03-19 21:20:54 +00002150 */
2151BOOL WINAPI RemoveFontResourceW( LPCWSTR str )
2152{
2153 FIXME("(%s): stub\n", debugres_w(str) );
2154 return TRUE;
2155}