ReactOS  0.4.14-dev-614-gbfd8a84
font.c File Reference
#include <math.h>
#include "objbase.h"
#include "gdiplus.h"
#include "wine/test.h"
Include dependency graph for font.c:

Go to the source code of this file.

Classes

struct  font_metrics
 

Macros

#define expect(expected, got)   ok(got == expected, "Expected %d, got %d\n", expected, got)
 
#define expect_(expected, got, precision)   ok(abs((expected) - (got)) <= (precision), "Expected %d, got %d\n", (expected), (got))
 
#define expectf_(expected, got, precision)   ok(fabs((expected) - (got)) <= (precision), "Expected %f, got %f\n", (expected), (got))
 
#define expectf(expected, got)   expectf_((expected), (got), 0.001)
 
#define DELETE_FONTFILE(filename)   _delete_testfontfile(filename, __LINE__)
 

Functions

static void set_rect_empty (RectF *rc)
 
static void create_testfontfile (const WCHAR *filename, int resource, WCHAR pathW[MAX_PATH])
 
static void _delete_testfontfile (const WCHAR *filename, int line)
 
static void test_long_name (void)
 
static void test_createfont (void)
 
static void test_logfont (void)
 
static void test_fontfamily (void)
 
static void test_fontfamily_properties (void)
 
static void check_family (const char *context, GpFontFamily *family, WCHAR *name)
 
static void test_getgenerics (void)
 
static void test_installedfonts (void)
 
static void test_heightgivendpi (void)
 
static int CALLBACK font_enum_proc (const LOGFONTW *lfe, const TEXTMETRICW *ntme, DWORD type, LPARAM lparam)
 
static void gdi_get_font_metrics (LOGFONTW *lf, struct font_metrics *fm)
 
static void gdip_get_font_metrics (GpFont *font, struct font_metrics *fm)
 
static void cmp_font_metrics (struct font_metrics *fm1, struct font_metrics *fm2, int line)
 
static void test_font_metrics (void)
 
static void test_font_substitution (void)
 
static void test_font_transform (void)
 
static void test_GdipGetFontCollectionFamilyList (void)
 
static void test_GdipGetFontCollectionFamilyCount (void)
 
 START_TEST (font)
 

Variables

static const WCHAR nonexistent [] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'}
 
static const WCHAR MSSansSerif [] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'}
 
static const WCHAR TimesNewRoman [] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'}
 
static const WCHAR Tahoma [] = {'T','a','h','o','m','a',0}
 

Macro Definition Documentation

◆ DELETE_FONTFILE

#define DELETE_FONTFILE (   filename)    _delete_testfontfile(filename, __LINE__)

Definition at line 67 of file font.c.

◆ expect

#define expect (   expected,
  got 
)    ok(got == expected, "Expected %d, got %d\n", expected, got)

Definition at line 28 of file font.c.

◆ expect_

#define expect_ (   expected,
  got,
  precision 
)    ok(abs((expected) - (got)) <= (precision), "Expected %d, got %d\n", (expected), (got))

Definition at line 29 of file font.c.

◆ expectf

#define expectf (   expected,
  got 
)    expectf_((expected), (got), 0.001)

Definition at line 31 of file font.c.

◆ expectf_

#define expectf_ (   expected,
  got,
  precision 
)    ok(fabs((expected) - (got)) <= (precision), "Expected %f, got %f\n", (expected), (got))

Definition at line 30 of file font.c.

Function Documentation

◆ _delete_testfontfile()

static void _delete_testfontfile ( const WCHAR filename,
int  line 
)
static

Definition at line 68 of file font.c.

69 {
71  ok_(__FILE__,line)(ret, "failed to delete file %s, error %d\n", wine_dbgstr_w(filename), GetLastError());
72 }
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
const char * filename
Definition: ioapi.h:135
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
Definition: parser.c:48
int ret
#define ok_(x1, x2)
Definition: atltest.h:61

◆ check_family()

static void check_family ( const char context,
GpFontFamily family,
WCHAR name 
)
static

Definition at line 405 of file font.c.

406 {
407  GpStatus stat;
408  GpFont* font;
409 
410  *name = 0;
412  ok(stat == Ok, "could not get the %s family name: %.8x\n", context, stat);
413 
415  ok(stat == Ok, "could not create a font for the %s family: %.8x\n", context, stat);
416  if (stat == Ok)
417  {
419  ok(stat == Ok, "could not delete the %s family font: %.8x\n", context, stat);
420  }
421 
422  stat = GdipDeleteFontFamily(family);
423  ok(stat == Ok, "could not delete the %s family: %.8x\n", context, stat);
424 }
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
Definition: http.c:7098
Definition: mk_font.cpp:20
#define LANG_NEUTRAL
Definition: nls.h:22
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
Definition: stat.h:55
GpStatus WINGDIPAPI GdipGetFamilyName(GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language)
Definition: font.c:837
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
#define ok(value,...)
Definition: atltest.h:57
Definition: name.c:38

Referenced by test_getgenerics().

◆ cmp_font_metrics()

static void cmp_font_metrics ( struct font_metrics fm1,
struct font_metrics fm2,
int  line 
)
static

Definition at line 652 of file font.c.

653 {
654  ok_(__FILE__, line)(fm1->lfHeight == fm2->lfHeight, "lfHeight %d != %d\n", fm1->lfHeight, fm2->lfHeight);
655  ok_(__FILE__, line)(fm1->em_height == fm2->em_height, "em_height %u != %u\n", fm1->em_height, fm2->em_height);
656  ok_(__FILE__, line)(fm1->line_spacing == fm2->line_spacing, "line_spacing %u != %u\n", fm1->line_spacing, fm2->line_spacing);
657  ok_(__FILE__, line)(abs(fm1->ascent - fm2->ascent) <= 1, "ascent %u != %u\n", fm1->ascent, fm2->ascent);
658  ok_(__FILE__, line)(abs(fm1->descent - fm2->descent) <= 1, "descent %u != %u\n", fm1->descent, fm2->descent);
659  ok(fm1->font_height > 0.0, "fm1->font_height should be positive, got %f\n", fm1->font_height);
660  ok(fm2->font_height > 0.0, "fm2->font_height should be positive, got %f\n", fm2->font_height);
661  ok_(__FILE__, line)(fm1->font_height == fm2->font_height, "font_height %f != %f\n", fm1->font_height, fm2->font_height);
662  ok(fm1->font_size > 0.0, "fm1->font_size should be positive, got %f\n", fm1->font_size);
663  ok(fm2->font_size > 0.0, "fm2->font_size should be positive, got %f\n", fm2->font_size);
664  ok_(__FILE__, line)(fm1->font_size == fm2->font_size, "font_size %f != %f\n", fm1->font_size, fm2->font_size);
665 }
#define abs(i)
Definition: fconv.c:206
INT lfHeight
Definition: font.c:579
Definition: parser.c:48
REAL font_height
Definition: font.c:578
UINT16 line_spacing
Definition: font.c:650
REAL font_size
Definition: font.c:578
UINT16 ascent
Definition: font.c:650
#define ok(value,...)
Definition: atltest.h:57
UINT16 descent
Definition: font.c:650
UINT16 em_height
Definition: font.c:650
#define ok_(x1, x2)
Definition: atltest.h:61

Referenced by test_font_metrics().

◆ create_testfontfile()

static void create_testfontfile ( const WCHAR filename,
int  resource,
WCHAR  pathW[MAX_PATH] 
)
static

Definition at line 46 of file font.c.

47 {
48  DWORD written;
49  HANDLE file;
50  HRSRC res;
51  void *ptr;
52 
53  GetTempPathW(MAX_PATH, pathW);
54  lstrcatW(pathW, filename);
55 
57  ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", wine_dbgstr_w(pathW), GetLastError());
58 
60  ok(res != 0, "couldn't find resource\n");
63  ok(written == SizeofResource(GetModuleHandleA(NULL), res), "couldn't write resource\n");
65 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define CloseHandle
Definition: compat.h:406
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
const char * filename
Definition: ioapi.h:135
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
#define GENERIC_WRITE
Definition: nt_native.h:90
static PVOID ptr
Definition: dispmode.c:27
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
smooth NULL
Definition: ftsmooth.c:416
const char * LPCSTR
Definition: xmlstorage.h:183
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
unsigned long DWORD
Definition: ntddk_ex.h:95
#define RT_RCDATA
Definition: pedump.c:372
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:821
#define GENERIC_READ
Definition: compat.h:124
#define CREATE_ALWAYS
Definition: disk.h:72
#define ok(value,...)
Definition: atltest.h:57
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
#define CreateFileW
Definition: compat.h:408
GLuint res
Definition: glext.h:9613
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
Definition: fci.c:126

Referenced by test_long_name().

◆ font_enum_proc()

static int CALLBACK font_enum_proc ( const LOGFONTW lfe,
const TEXTMETRICW ntme,
DWORD  type,
LPARAM  lparam 
)
static

Definition at line 564 of file font.c.

566 {
568 
569  if (type != TRUETYPE_FONTTYPE) return 1;
570 
571  *ntm = *(NEWTEXTMETRICW *)ntme;
572  return 0;
573 }
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
#define TRUETYPE_FONTTYPE
Definition: wingdi.h:1108

Referenced by gdi_get_font_metrics().

◆ gdi_get_font_metrics()

static void gdi_get_font_metrics ( LOGFONTW lf,
struct font_metrics fm 
)
static

Definition at line 582 of file font.c.

583 {
584  HDC hdc;
585  HFONT hfont;
586  NEWTEXTMETRICW ntm;
587  OUTLINETEXTMETRICW otm;
588  int ret;
589 
590  hdc = CreateCompatibleDC(0);
591 
592  /* it's the only way to get extended NEWTEXTMETRIC fields */
593  ret = EnumFontFamiliesExW(hdc, lf, font_enum_proc, (LPARAM)&ntm, 0);
594  ok(!ret, "EnumFontFamiliesExW failed to find %s\n", wine_dbgstr_w(lf->lfFaceName));
595 
598 
599  otm.otmSize = sizeof(otm);
600  ret = GetOutlineTextMetricsW(hdc, otm.otmSize, &otm);
601  ok(ret, "GetOutlineTextMetrics failed\n");
602 
603  DeleteDC(hdc);
605 
606  fm->lfHeight = -otm.otmTextMetrics.tmAscent;
607  fm->line_spacing = ntm.ntmCellHeight;
609  fm->font_height = (REAL)fm->line_spacing * fm->font_size / (REAL)ntm.ntmSizeEM;
610  fm->em_height = ntm.ntmSizeEM;
611  fm->ascent = ntm.ntmSizeEM;
612  fm->descent = ntm.ntmCellHeight - ntm.ntmSizeEM;
613 }
HFONT WINAPI CreateFontIndirectW(CONST LOGFONTW *lplf)
Definition: font.c:1803
int WINAPI EnumFontFamiliesExW(HDC hdc, LPLOGFONTW lpLogfont, FONTENUMPROCW lpEnumFontFamExProc, LPARAM lParam, DWORD dwFlags)
Definition: font.c:400
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
static HDC
Definition: imagelist.c:92
UINT APIENTRY GetOutlineTextMetricsW(HDC hdc, UINT cbData, LPOUTLINETEXTMETRICW lpOTM)
Definition: font.c:1401
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
LONG tmAscent
Definition: wingdi.h:2383
static int CALLBACK font_enum_proc(const LOGFONTW *lfe, const TEXTMETRICW *ntme, DWORD type, LPARAM lparam)
Definition: font.c:564
INT lfHeight
Definition: font.c:579
LONG_PTR LPARAM
Definition: windef.h:208
static HFONT hfont
REAL font_height
Definition: font.c:578
int ret
HDC hdc
Definition: main.c:9
UINT16 line_spacing
Definition: font.c:650
REAL font_size
Definition: font.c:578
BOOL WINAPI DeleteDC(_In_ HDC)
UINT ntmCellHeight
Definition: wingdi.h:2665
UINT16 ascent
Definition: font.c:650
#define ok(value,...)
Definition: atltest.h:57
UINT16 descent
Definition: font.c:650
TEXTMETRICW otmTextMetrics
Definition: wingdi.h:2513
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
float REAL
Definition: types.h:41
UINT16 em_height
Definition: font.c:650

Referenced by test_font_metrics().

◆ gdip_get_font_metrics()

static void gdip_get_font_metrics ( GpFont font,
struct font_metrics fm 
)
static

Definition at line 615 of file font.c.

616 {
617  INT style;
618  GpFontFamily *family;
619  GpStatus stat;
620 
622  expect(Ok, stat);
623 
626 
629 
631  expect(Ok, stat);
633  expect(Ok, stat);
634 
635  fm->lfHeight = (INT)(fm->font_size * -1.0);
636 
637  stat = GdipGetFamily(font, &family);
638  expect(Ok, stat);
639 
640  stat = GdipGetEmHeight(family, style, &fm->em_height);
641  expect(Ok, stat);
642  stat = GdipGetLineSpacing(family, style, &fm->line_spacing);
643  expect(Ok, stat);
644  stat = GdipGetCellAscent(family, style, &fm->ascent);
645  expect(Ok, stat);
646  stat = GdipGetCellDescent(family, style, &fm->descent);
647  expect(Ok, stat);
648 
649  GdipDeleteFontFamily(family);
650 }
Definition: mk_font.cpp:20
int32_t INT
Definition: typedefs.h:56
GpStatus WINGDIPAPI GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 *CellAscent)
Definition: font.c:880
INT lfHeight
Definition: font.c:579
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipGetFontSize(GpFont *font, REAL *size)
Definition: font.c:350
GpStatus WINGDIPAPI GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 *LineSpacing)
Definition: font.c:945
GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height)
Definition: font.c:552
GpStatus WINGDIPAPI GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 *CellDescent)
Definition: font.c:891
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
GpStatus WINGDIPAPI GdipGetFontStyle(GpFont *font, INT *style)
Definition: font.c:393
REAL font_height
Definition: font.c:578
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
UINT16 line_spacing
Definition: font.c:650
Status
Definition: gdiplustypes.h:24
REAL font_size
Definition: font.c:578
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
UINT16 ascent
Definition: font.c:650
static INT(WINAPI *pAddFontResourceExA)(LPCSTR
UINT16 descent
Definition: font.c:650
GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family)
Definition: font.c:319
Arabic default style
Definition: afstyles.h:93
GpStatus WINGDIPAPI GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 *EmHeight)
Definition: font.c:918
UINT16 em_height
Definition: font.c:650

Referenced by test_font_metrics().

◆ set_rect_empty()

static void set_rect_empty ( RectF rc)
static

Definition at line 38 of file font.c.

39 {
40  rc->X = 0.0;
41  rc->Y = 0.0;
42  rc->Width = 0.0;
43  rc->Height = 0.0;
44 }
REAL Height
Definition: gdiplustypes.h:264
REAL X
Definition: gdiplustypes.h:261
REAL Width
Definition: gdiplustypes.h:263
REAL Y
Definition: gdiplustypes.h:262

Referenced by test_font_transform().

◆ START_TEST()

START_TEST ( font  )

Definition at line 1263 of file font.c.

1264 {
1265  struct GdiplusStartupInput gdiplusStartupInput;
1267  HMODULE hmsvcrt;
1268  int (CDECL * _controlfp_s)(unsigned int *cur, unsigned int newval, unsigned int mask);
1269 
1270  /* Enable all FP exceptions except _EM_INEXACT, which gdi32 can trigger */
1271  hmsvcrt = LoadLibraryA("msvcrt");
1272  _controlfp_s = (void*)GetProcAddress(hmsvcrt, "_controlfp_s");
1273  if (_controlfp_s) _controlfp_s(0, 0, 0x0008001e);
1274 
1275  gdiplusStartupInput.GdiplusVersion = 1;
1276  gdiplusStartupInput.DebugEventCallback = NULL;
1277  gdiplusStartupInput.SuppressBackgroundThread = 0;
1278  gdiplusStartupInput.SuppressExternalCodecs = 0;
1279 
1280  GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
1281 
1282  test_long_name();
1286  test_createfont();
1287  test_logfont();
1288  test_fontfamily();
1290  test_getgenerics();
1295 
1297 }
static void test_GdipGetFontCollectionFamilyList(void)
Definition: font.c:1188
static void test_installedfonts(void)
Definition: font.c:463
static void test_GdipGetFontCollectionFamilyCount(void)
Definition: font.c:1242
static void test_fontfamily_properties(void)
Definition: font.c:354
uint32_t ULONG_PTR
Definition: typedefs.h:63
GLenum GLint GLuint mask
Definition: glext.h:6028
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
static void test_fontfamily(void)
Definition: font.c:307
smooth NULL
Definition: ftsmooth.c:416
int CDECL _controlfp_s(unsigned int *cur, unsigned int newval, unsigned int mask)
Definition: cntrlfp.c:120
static void test_getgenerics(void)
Definition: font.c:426
static void test_font_substitution(void)
Definition: font.c:807
static void test_long_name(void)
Definition: font.c:74
void WINAPI GdiplusShutdown(ULONG_PTR)
Status WINAPI GdiplusStartup(ULONG_PTR *token, const struct GdiplusStartupInput *input, struct GdiplusStartupOutput *output)
Definition: gdiplus.c:81
static void test_font_transform(void)
Definition: font.c:912
static ULONG_PTR gdiplusToken
Definition: CImage.cpp:79
static void test_heightgivendpi(void)
Definition: font.c:476
#define CDECL
Definition: compat.h:21
static void test_font_metrics(void)
Definition: font.c:667
static void test_logfont(void)
Definition: font.c:171
#define GetProcAddress(x, y)
Definition: compat.h:418
static void test_createfont(void)
Definition: font.c:118
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31

◆ test_createfont()

static void test_createfont ( void  )
static

Definition at line 118 of file font.c.

119 {
120  GpFontFamily* fontfamily = NULL, *fontfamily2;
121  GpFont* font = NULL;
122  GpStatus stat;
123  Unit unit;
124  UINT i;
125  REAL size;
126  WCHAR familyname[LF_FACESIZE];
127 
132  stat = GdipCreateFontFamilyFromName(Tahoma, NULL, &fontfamily);
133  expect (Ok, stat);
134  stat = GdipCreateFont(fontfamily, 12, FontStyleRegular, UnitPoint, &font);
135  expect (Ok, stat);
137  expect (Ok, stat);
138  expect (UnitPoint, unit);
139 
140  stat = GdipGetFamily(font, &fontfamily2);
141  expect(Ok, stat);
142  stat = GdipGetFamilyName(fontfamily2, familyname, 0);
143  expect(Ok, stat);
144  ok (lstrcmpiW(Tahoma, familyname) == 0, "Expected Tahoma, got %s\n",
145  wine_dbgstr_w(familyname));
146  stat = GdipDeleteFontFamily(fontfamily2);
147  expect(Ok, stat);
148 
149  /* Test to see if returned size is based on unit (it's not) */
151  ok (size == 12, "Expected 12, got %f\n", size);
153 
154  /* Make sure everything is converted correctly for all Units */
155  for (i = UnitWorld; i <=UnitMillimeter; i++)
156  {
157  if (i == UnitDisplay) continue; /* Crashes WindowsXP, wtf? */
158  stat = GdipCreateFont(fontfamily, 24, FontStyleRegular, i, &font);
159  expect(Ok, stat);
161  ok (size == 24, "Expected 24, got %f (with unit: %d)\n", size, i);
163  ok (stat == Ok, "Failed to get font unit, %d.\n", stat);
164  expect (i, unit);
166  }
167 
168  GdipDeleteFontFamily(fontfamily);
169 }
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
#define LF_FACESIZE
Definition: dimm.idl:39
Unit
Definition: gdiplusenums.h:25
Definition: mk_font.cpp:20
static const WCHAR nonexistent[]
Definition: font.c:33
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit)
Definition: font.c:417
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
png_const_structrp png_const_inforp int * unit
Definition: png.h:2161
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipGetFontSize(GpFont *font, REAL *size)
Definition: font.c:350
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
GLsizeiptr size
Definition: glext.h:5919
__wchar_t WCHAR
Definition: xmlstorage.h:180
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
GpStatus WINGDIPAPI GdipGetFamilyName(GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language)
Definition: font.c:837
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
static const WORD INT INT LPINT LPINT LPSIZE size
Definition: font.c:53
#define ok(value,...)
Definition: atltest.h:57
unsigned int UINT
Definition: ndis.h:50
GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family)
Definition: font.c:319
static const WCHAR Tahoma[]
Definition: font.c:36
float REAL
Definition: types.h:41

Referenced by START_TEST().

◆ test_font_metrics()

static void test_font_metrics ( void  )
static

Definition at line 667 of file font.c.

668 {
669  LOGFONTW lf;
670  GpFont *font;
671  GpFontFamily *family;
672  GpGraphics *graphics;
673  GpStatus stat;
674  Unit unit;
675  struct font_metrics fm_gdi, fm_gdip;
676  HDC hdc;
677 
678  hdc = CreateCompatibleDC(0);
679  stat = GdipCreateFromHDC(hdc, &graphics);
680  expect(Ok, stat);
681 
682  memset(&lf, 0, sizeof(lf));
683 
684  /* Tahoma,-13 */
686  lf.lfHeight = -13;
688  expect(Ok, stat);
689 
691  expect(Ok, stat);
693 
694  gdip_get_font_metrics(font, &fm_gdip);
695  trace("gdiplus:\n");
696  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
698  fm_gdip.em_height, fm_gdip.line_spacing, fm_gdip.ascent, fm_gdip.descent,
699  fm_gdip.font_height, fm_gdip.font_size);
700 
701  gdi_get_font_metrics(&lf, &fm_gdi);
702  trace("gdi:\n");
703  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
705  fm_gdi.em_height, fm_gdi.line_spacing, fm_gdi.ascent, fm_gdi.descent,
706  fm_gdi.font_height, fm_gdi.font_size);
707 
708  cmp_font_metrics(&fm_gdip, &fm_gdi, __LINE__);
709 
710  stat = GdipGetLogFontW(font, graphics, &lf);
711  expect(Ok, stat);
712  ok(lf.lfHeight < 0, "lf.lfHeight should be negative, got %d\n", lf.lfHeight);
713  gdi_get_font_metrics(&lf, &fm_gdi);
714  trace("gdi:\n");
715  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
717  fm_gdi.em_height, fm_gdi.line_spacing, fm_gdi.ascent, fm_gdi.descent,
718  fm_gdi.font_height, fm_gdi.font_size);
719  ok((REAL)lf.lfHeight * -1.0 == fm_gdi.font_size, "expected %f, got %f\n", (REAL)lf.lfHeight * -1.0, fm_gdi.font_size);
720 
721  cmp_font_metrics(&fm_gdip, &fm_gdi, __LINE__);
722 
724 
725  /* Tahoma,13 */
727  lf.lfHeight = 13;
729  expect(Ok, stat);
730 
732  expect(Ok, stat);
734 
735  gdip_get_font_metrics(font, &fm_gdip);
736  trace("gdiplus:\n");
737  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
739  fm_gdip.em_height, fm_gdip.line_spacing, fm_gdip.ascent, fm_gdip.descent,
740  fm_gdip.font_height, fm_gdip.font_size);
741 
742  gdi_get_font_metrics(&lf, &fm_gdi);
743  trace("gdi:\n");
744  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
746  fm_gdi.em_height, fm_gdi.line_spacing, fm_gdi.ascent, fm_gdi.descent,
747  fm_gdi.font_height, fm_gdi.font_size);
748 
749  cmp_font_metrics(&fm_gdip, &fm_gdi, __LINE__);
750 
751  stat = GdipGetLogFontW(font, graphics, &lf);
752  expect(Ok, stat);
753  ok(lf.lfHeight < 0, "lf.lfHeight should be negative, got %d\n", lf.lfHeight);
754  gdi_get_font_metrics(&lf, &fm_gdi);
755  trace("gdi:\n");
756  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
758  fm_gdi.em_height, fm_gdi.line_spacing, fm_gdi.ascent, fm_gdi.descent,
759  fm_gdi.font_height, fm_gdi.font_size);
760  ok((REAL)lf.lfHeight * -1.0 == fm_gdi.font_size, "expected %f, got %f\n", (REAL)lf.lfHeight * -1.0, fm_gdi.font_size);
761 
762  cmp_font_metrics(&fm_gdip, &fm_gdi, __LINE__);
763 
765 
767  expect(Ok, stat);
768 
769  /* Tahoma,13 */
770  stat = GdipCreateFont(family, 13.0, FontStyleRegular, UnitPixel, &font);
771  expect(Ok, stat);
772 
773  gdip_get_font_metrics(font, &fm_gdip);
774  trace("gdiplus:\n");
775  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
777  fm_gdip.em_height, fm_gdip.line_spacing, fm_gdip.ascent, fm_gdip.descent,
778  fm_gdip.font_height, fm_gdip.font_size);
779 
780  stat = GdipGetLogFontW(font, graphics, &lf);
781  expect(Ok, stat);
782  ok(lf.lfHeight < 0, "lf.lfHeight should be negative, got %d\n", lf.lfHeight);
783  gdi_get_font_metrics(&lf, &fm_gdi);
784  trace("gdi:\n");
785  trace("%s,%d: EmHeight %u, LineSpacing %u, CellAscent %u, CellDescent %u, FontHeight %f, FontSize %f\n",
787  fm_gdi.em_height, fm_gdi.line_spacing, fm_gdi.ascent, fm_gdi.descent,
788  fm_gdi.font_height, fm_gdi.font_size);
789  ok((REAL)lf.lfHeight * -1.0 == fm_gdi.font_size, "expected %f, got %f\n", (REAL)lf.lfHeight * -1.0, fm_gdi.font_size);
790 
791  cmp_font_metrics(&fm_gdip, &fm_gdi, __LINE__);
792 
793  stat = GdipGetLogFontW(font, NULL, &lf);
795 
797 
798  stat = GdipCreateFont(family, -13.0, FontStyleRegular, UnitPixel, &font);
800 
801  GdipDeleteFontFamily(family);
802 
803  GdipDeleteGraphics(graphics);
804  DeleteDC(hdc);
805 }
GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, LOGFONTW *lf)
Definition: font.c:455
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC hdc, GDIPCONST LOGFONTW *logfont, GpFont **font)
Definition: font.c:203
Unit
Definition: gdiplusenums.h:25
Definition: mk_font.cpp:20
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit)
Definition: font.c:417
LONG lfHeight
Definition: dimm.idl:59
static HDC
Definition: imagelist.c:92
static void gdip_get_font_metrics(GpFont *font, struct font_metrics *fm)
Definition: font.c:615
static void cmp_font_metrics(struct font_metrics *fm1, struct font_metrics *fm2, int line)
Definition: font.c:652
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
png_const_structrp png_const_inforp int * unit
Definition: png.h:2161
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
#define trace
Definition: atltest.h:70
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define expect(expected, got)
Definition: font.c:28
HDC hdc
Definition: main.c:9
Definition: stat.h:55
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
#define lstrcpyW
Definition: compat.h:414
BOOL WINAPI DeleteDC(_In_ HDC)
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
static void gdi_get_font_metrics(LOGFONTW *lf, struct font_metrics *fm)
Definition: font.c:582
static const WCHAR Tahoma[]
Definition: font.c:36
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
float REAL
Definition: types.h:41
#define memset(x, y, z)
Definition: compat.h:39

Referenced by START_TEST().

◆ test_font_substitution()

static void test_font_substitution ( void  )
static

Definition at line 807 of file font.c.

808 {
809  WCHAR ms_shell_dlg[LF_FACESIZE];
810  char fallback_font[LF_FACESIZE];
811  HDC hdc;
812  HFONT hfont;
813  LOGFONTA lf;
815  GpGraphics *graphics;
816  GpFont *font;
817  GpFontFamily *family;
818  int ret;
819 
820  hdc = CreateCompatibleDC(0);
821  status = GdipCreateFromHDC(hdc, &graphics);
822  expect(Ok, status);
823 
825  ok(hfont != 0, "GetStockObject(DEFAULT_GUI_FONT) failed\n");
826 
827  memset(&lf, 0xfe, sizeof(lf));
828  ret = GetObjectA(hfont, sizeof(lf), &lf);
829  ok(ret == sizeof(lf), "GetObject failed\n");
830  ok(!lstrcmpA(lf.lfFaceName, "MS Shell Dlg"), "wrong face name %s\n", lf.lfFaceName);
831  MultiByteToWideChar(CP_ACP, 0, lf.lfFaceName, -1, ms_shell_dlg, LF_FACESIZE);
832 
834  expect(Ok, status);
835  memset(&lf, 0xfe, sizeof(lf));
836  status = GdipGetLogFontA(font, graphics, &lf);
837  expect(Ok, status);
838  ok(!lstrcmpA(lf.lfFaceName, "Microsoft Sans Serif") ||
839  !lstrcmpA(lf.lfFaceName, "Tahoma"), "wrong face name %s\n", lf.lfFaceName);
841 
842  status = GdipCreateFontFamilyFromName(ms_shell_dlg, NULL, &family);
843  expect(Ok, status);
845  expect(Ok, status);
846  memset(&lf, 0xfe, sizeof(lf));
847  status = GdipGetLogFontA(font, graphics, &lf);
848  expect(Ok, status);
849  ok(!lstrcmpA(lf.lfFaceName, "Microsoft Sans Serif") ||
850  !lstrcmpA(lf.lfFaceName, "Tahoma"), "wrong face name %s\n", lf.lfFaceName);
852  GdipDeleteFontFamily(family);
853 
855  ok(status == FontFamilyNotFound, "expected FontFamilyNotFound, got %d\n", status);
856 
857  /* nonexistent fonts fallback to Arial, or something else if it's missing */
858  strcpy(lf.lfFaceName,"Arial");
860  expect(Ok, status);
861  status = GdipGetLogFontA(font, graphics, &lf);
862  expect(Ok, status);
863  strcpy(fallback_font,lf.lfFaceName);
864  trace("fallback font %s\n", fallback_font);
866 
867  lstrcpyA(lf.lfFaceName, "ThisFontShouldNotExist");
869  expect(Ok, status);
870  memset(&lf, 0xfe, sizeof(lf));
871  status = GdipGetLogFontA(font, graphics, &lf);
872  expect(Ok, status);
873  ok(!lstrcmpA(lf.lfFaceName, fallback_font), "wrong face name %s / %s\n", lf.lfFaceName, fallback_font);
875 
876  /* empty FaceName */
877  lf.lfFaceName[0] = 0;
879  expect(Ok, status);
880  memset(&lf, 0xfe, sizeof(lf));
881  status = GdipGetLogFontA(font, graphics, &lf);
882  expect(Ok, status);
883  ok(!lstrcmpA(lf.lfFaceName, fallback_font), "wrong face name %s / %s\n", lf.lfFaceName, fallback_font);
885 
886  /* zeroing out lfWeight and lfCharSet leads to font creation failure */
887  lf.lfWeight = 0;
888  lf.lfCharSet = 0;
889  lstrcpyA(lf.lfFaceName, "ThisFontShouldNotExist");
890  font = NULL;
892 todo_wine
893  ok(status == NotTrueTypeFont || broken(status == FileNotFound), /* before XP */
894  "expected NotTrueTypeFont, got %d\n", status);
895  /* FIXME: remove when wine is fixed */
896  if (font) GdipDeleteFont(font);
897 
898  /* empty FaceName */
899  lf.lfFaceName[0] = 0;
900  font = NULL;
902 todo_wine
903  ok(status == NotTrueTypeFont || broken(status == FileNotFound), /* before XP */
904  "expected NotTrueTypeFont, got %d\n", status);
905  /* FIXME: remove when wine is fixed */
906  if (font) GdipDeleteFont(font);
907 
908  GdipDeleteGraphics(graphics);
909  DeleteDC(hdc);
910 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
int WINAPI GetObjectA(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
#define LF_FACESIZE
Definition: dimm.idl:39
Definition: mk_font.cpp:20
static const WCHAR nonexistent[]
Definition: font.c:33
#define CP_ACP
Definition: compat.h:99
static HDC
Definition: imagelist.c:92
GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, LOGFONTA *lfa)
Definition: font.c:432
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
BYTE lfCharSet
Definition: dimm.idl:50
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
LONG lfWeight
Definition: dimm.idl:46
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
static HFONT hfont
GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, GDIPCONST LOGFONTA *lfa, GpFont **font)
Definition: font.c:249
#define trace
Definition: atltest.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define DEFAULT_GUI_FONT
Definition: wingdi.h:908
int ret
#define expect(expected, got)
Definition: font.c:28
#define todo_wine
Definition: test.h:163
HDC hdc
Definition: main.c:9
#define broken(x)
Definition: _sntprintf.h:21
Status
Definition: gdiplustypes.h:24
BOOL WINAPI DeleteDC(_In_ HDC)
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
#define MultiByteToWideChar
Definition: compat.h:100
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
#define memset(x, y, z)
Definition: compat.h:39
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by START_TEST().

◆ test_font_transform()

static void test_font_transform ( void  )
static

Definition at line 912 of file font.c.

913 {
914  static const WCHAR string[] = { 'A',0 };
916  HDC hdc;
917  LOGFONTA lf;
918  GpFont *font;
919  GpGraphics *graphics;
920  GpMatrix *matrix;
921  GpStringFormat *format, *typographic;
922  PointF pos[1] = { { 0,0 } };
923  REAL height, margin_y;
924  RectF bounds, rect;
925 
926  hdc = CreateCompatibleDC(0);
927  status = GdipCreateFromHDC(hdc, &graphics);
928  expect(Ok, status);
929 
930  status = GdipSetPageUnit(graphics, UnitPixel);
931  expect(Ok, status);
932 
934  expect(Ok, status);
936  expect(Ok, status);
937 
938  memset(&lf, 0, sizeof(lf));
939  lstrcpyA(lf.lfFaceName, "Tahoma");
940  lf.lfHeight = -100;
941  lf.lfWidth = 100;
943  expect(Ok, status);
944 
945  margin_y = 100.0 / 8.0;
946 
947  /* identity matrix */
949  expect(Ok, status);
950  status = GdipSetWorldTransform(graphics, matrix);
951  expect(Ok, status);
952  status = GdipGetLogFontA(font, graphics, &lf);
953  expect(Ok, status);
954  expect(-100, lf.lfHeight);
955  expect(0, lf.lfWidth);
956  expect(0, lf.lfEscapement);
957  expect(0, lf.lfOrientation);
958  status = GdipGetFontHeight(font, graphics, &height);
959  expect(Ok, status);
960  expectf(120.703125, height);
962  set_rect_empty(&bounds);
963  status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL);
964  expect(Ok, status);
965  expectf(0.0, bounds.X);
966  expectf(0.0, bounds.Y);
967 todo_wine
968  expectf(height + margin_y, bounds.Height);
970  set_rect_empty(&bounds);
971  status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL);
972  expect(Ok, status);
973  expectf(0.0, bounds.X);
974  expectf(0.0, bounds.Y);
975  expectf_(height, bounds.Height, 1.0);
976  set_rect_empty(&bounds);
977  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
979  expect(Ok, status);
980  expectf(0.0, bounds.X);
981  expectf_(-100.0, bounds.Y, 0.05);
982  expectf_(height, bounds.Height, 0.5);
983  set_rect_empty(&bounds);
984  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
986  expect(Ok, status);
987  expectf(0.0, bounds.X);
988  expectf_(-100.0, bounds.Y, 0.05);
989  expectf_(height, bounds.Height, 0.5);
990 
991  /* scale matrix */
993  expect(Ok, status);
994  status = GdipSetWorldTransform(graphics, matrix);
995  expect(Ok, status);
996  status = GdipGetLogFontA(font, graphics, &lf);
997  expect(Ok, status);
998  expect(-300, lf.lfHeight);
999  expect(0, lf.lfWidth);
1000  expect(0, lf.lfEscapement);
1001  expect(0, lf.lfOrientation);
1002  status = GdipGetFontHeight(font, graphics, &height);
1003  expect(Ok, status);
1004  expectf(120.703125, height);
1005  set_rect_empty(&rect);
1006  set_rect_empty(&bounds);
1007  status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL);
1008  expect(Ok, status);
1009  expectf(0.0, bounds.X);
1010  expectf(0.0, bounds.Y);
1011 todo_wine
1012  expectf(height + margin_y, bounds.Height);
1013  set_rect_empty(&rect);
1014  set_rect_empty(&bounds);
1015  status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL);
1016  expect(Ok, status);
1017  expectf(0.0, bounds.X);
1018  expectf(0.0, bounds.Y);
1019  expectf_(height, bounds.Height, 0.05);
1020  set_rect_empty(&bounds);
1021  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1023  expect(Ok, status);
1024  expectf(0.0, bounds.X);
1025  expectf_(-100.0, bounds.Y, 0.05);
1026  expectf_(height, bounds.Height, 0.2);
1027  set_rect_empty(&bounds);
1028  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1030  expect(Ok, status);
1031  expectf(0.0, bounds.X);
1032 todo_wine
1033  expectf_(-300.0, bounds.Y, 0.15);
1034 todo_wine
1035  expectf(height * 3.0, bounds.Height);
1036 
1037  /* scale + ratate matrix */
1039  expect(Ok, status);
1040  status = GdipSetWorldTransform(graphics, matrix);
1041  expect(Ok, status);
1042  status = GdipGetLogFontA(font, graphics, &lf);
1043  expect(Ok, status);
1044  expect(-300, lf.lfHeight);
1045  expect(0, lf.lfWidth);
1046  expect_(3151, lf.lfEscapement, 1);
1047  expect_(3151, lf.lfOrientation, 1);
1048  status = GdipGetFontHeight(font, graphics, &height);
1049  expect(Ok, status);
1050  expectf(120.703125, height);
1051  set_rect_empty(&rect);
1052  set_rect_empty(&bounds);
1053  status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL);
1054  expect(Ok, status);
1055  expectf(0.0, bounds.X);
1056  expectf(0.0, bounds.Y);
1057 todo_wine
1058  expectf(height + margin_y, bounds.Height);
1059  set_rect_empty(&rect);
1060  set_rect_empty(&bounds);
1061  status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL);
1062  expect(Ok, status);
1063  expectf(0.0, bounds.X);
1064  expectf(0.0, bounds.Y);
1065  expectf_(height, bounds.Height, 0.05);
1066  set_rect_empty(&bounds);
1067  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1069  expect(Ok, status);
1070  expectf(0.0, bounds.X);
1071  expectf_(-100.0, bounds.Y, 0.05);
1072  expectf_(height, bounds.Height, 0.2);
1073  set_rect_empty(&bounds);
1074  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1076  expect(Ok, status);
1077 todo_wine
1078  expectf_(-43.814377, bounds.X, 0.05);
1079 todo_wine
1080  expectf_(-212.235611, bounds.Y, 0.05);
1081 todo_wine
1082  expectf_(340.847534, bounds.Height, 0.05);
1083 
1084  /* scale + ratate + shear matrix */
1086  expect(Ok, status);
1087  status = GdipSetWorldTransform(graphics, matrix);
1088  expect(Ok, status);
1089  status = GdipGetLogFontA(font, graphics, &lf);
1090  expect(Ok, status);
1091 todo_wine
1092  expect(1032, lf.lfHeight);
1093  expect(0, lf.lfWidth);
1094  expect_(3099, lf.lfEscapement, 1);
1095  expect_(3099, lf.lfOrientation, 1);
1096  status = GdipGetFontHeight(font, graphics, &height);
1097  expect(Ok, status);
1098  expectf(120.703125, height);
1099  set_rect_empty(&rect);
1100  set_rect_empty(&bounds);
1101  status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL);
1102  expect(Ok, status);
1103  expectf(0.0, bounds.X);
1104  expectf(0.0, bounds.Y);
1105 todo_wine
1106  expectf(height + margin_y, bounds.Height);
1107  set_rect_empty(&rect);
1108  set_rect_empty(&bounds);
1109  status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL);
1110  expect(Ok, status);
1111  expectf(0.0, bounds.X);
1112  expectf(0.0, bounds.Y);
1113  expectf_(height, bounds.Height, 0.2);
1114  set_rect_empty(&bounds);
1115  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1117  expect(Ok, status);
1118  expectf(0.0, bounds.X);
1119  expectf_(-100.0, bounds.Y, 0.2);
1120  expectf_(height, bounds.Height, 0.2);
1121  set_rect_empty(&bounds);
1122  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1124  expect(Ok, status);
1125 todo_wine
1126  expectf_(-636.706848, bounds.X, 0.05);
1127 todo_wine
1128  expectf_(-175.257523, bounds.Y, 0.05);
1129 todo_wine
1130  expectf_(1532.984985, bounds.Height, 0.05);
1131 
1132  /* scale + ratate + shear + translate matrix */
1134  expect(Ok, status);
1135  status = GdipSetWorldTransform(graphics, matrix);
1136  expect(Ok, status);
1137  status = GdipGetLogFontA(font, graphics, &lf);
1138  expect(Ok, status);
1139 todo_wine
1140  expect(1032, lf.lfHeight);
1141  expect(0, lf.lfWidth);
1142  expect_(3099, lf.lfEscapement, 1);
1143  expect_(3099, lf.lfOrientation, 1);
1144  status = GdipGetFontHeight(font, graphics, &height);
1145  expect(Ok, status);
1146  expectf(120.703125, height);
1147  set_rect_empty(&rect);
1148  set_rect_empty(&bounds);
1149  status = GdipMeasureString(graphics, string, -1, font, &rect, format, &bounds, NULL, NULL);
1150  expect(Ok, status);
1151  expectf(0.0, bounds.X);
1152  expectf(0.0, bounds.Y);
1153 todo_wine
1154  expectf(height + margin_y, bounds.Height);
1155  set_rect_empty(&rect);
1156  set_rect_empty(&bounds);
1157  status = GdipMeasureString(graphics, string, -1, font, &rect, typographic, &bounds, NULL, NULL);
1158  expect(Ok, status);
1159  expectf(0.0, bounds.X);
1160  expectf(0.0, bounds.Y);
1161  expectf_(height, bounds.Height, 0.1);
1162  set_rect_empty(&bounds);
1163  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1165  expect(Ok, status);
1166  expectf(0.0, bounds.X);
1167  expectf_(-100.0, bounds.Y, 0.2);
1168  expectf_(height, bounds.Height, 0.2);
1169  set_rect_empty(&bounds);
1170  status = GdipMeasureDriverString(graphics, (const UINT16 *)string, -1, font, pos,
1172  expect(Ok, status);
1173 todo_wine
1174  expectf_(-626.706848, bounds.X, 0.05);
1175 todo_wine
1176  expectf_(-155.257523, bounds.Y, 0.05);
1177 todo_wine
1178  expectf_(1532.984985, bounds.Height, 0.05);
1179 
1182  GdipDeleteGraphics(graphics);
1183  GdipDeleteStringFormat(typographic);
1185  DeleteDC(hdc);
1186 }
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
GpStatus WINGDIPAPI GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix)
Definition: graphics.c:6358
GpStatus WINGDIPAPI GdipStringFormatGetGenericTypographic(GpStringFormat **format)
Definition: stringformat.c:408
Definition: mk_font.cpp:20
GLuint GLenum matrix
Definition: glext.h:9407
#define LANG_NEUTRAL
Definition: nls.h:22
GpStatus WINGDIPAPI GdipCreateMatrix(GpMatrix **matrix)
Definition: matrix.c:140
static HDC
Definition: imagelist.c:92
GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, LOGFONTA *lfa)
Definition: font.c:432
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
& rect
Definition: startmenu.cpp:1413
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define expect_(expected, got, precision)
Definition: font.c:29
GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit)
Definition: graphics.c:6202
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
LONG lfHeight
Definition: dimm.idl:42
GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, INT *codepointsfitted, INT *linesfilled)
Definition: graphics.c:5546
smooth NULL
Definition: ftsmooth.c:416
#define expectf_(expected, got, precision)
Definition: font.c:30
static LPTEXTMETRICW LONG * height
Definition: font.c:42
REAL Height
Definition: gdiplustypes.h:264
GpStatus WINGDIPAPI GdipDeleteStringFormat(GpStringFormat *format)
Definition: stringformat.c:105
GpStatus WINGDIPAPI GdipMeasureDriverString(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix, RectF *boundingBox)
Definition: graphics.c:7059
GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, GDIPCONST LOGFONTA *lfa, GpFont **font)
Definition: font.c:249
__wchar_t WCHAR
Definition: xmlstorage.h:180
REAL X
Definition: gdiplustypes.h:261
GpStatus WINGDIPAPI GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order)
Definition: matrix.c:258
GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height)
Definition: font.c:552
LONG lfWidth
Definition: dimm.idl:43
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LONG lfOrientation
Definition: dimm.idl:45
GpStatus WINGDIPAPI GdipDeleteMatrix(GpMatrix *matrix)
Definition: matrix.c:160
#define expect(expected, got)
Definition: font.c:28
#define expectf(expected, got)
Definition: font.c:31
#define todo_wine
Definition: test.h:163
HDC hdc
Definition: main.c:9
GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY, GpMatrixOrder order)
Definition: matrix.c:289
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
Status
Definition: gdiplustypes.h:24
GpStatus WINGDIPAPI GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY, GpMatrixOrder order)
Definition: matrix.c:335
GpStatus WINGDIPAPI GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY, GpMatrixOrder order)
Definition: matrix.c:418
BOOL WINAPI DeleteDC(_In_ HDC)
unsigned short UINT16
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
float REAL
Definition: types.h:41
REAL Y
Definition: gdiplustypes.h:262
#define memset(x, y, z)
Definition: compat.h:39
static SERVICE_STATUS status
Definition: service.c:31
static void set_rect_empty(RectF *rc)
Definition: font.c:38
GpStatus WINGDIPAPI GdipCreateStringFormat(INT attr, LANGID lang, GpStringFormat **format)
Definition: stringformat.c:76
LONG lfEscapement
Definition: dimm.idl:44
Definition: ps.c:97

Referenced by START_TEST().

◆ test_fontfamily()

static void test_fontfamily ( void  )
static

Definition at line 307 of file font.c.

308 {
309  GpFontFamily *family, *clonedFontFamily;
310  WCHAR itsName[LF_FACESIZE];
311  GpStatus stat;
312 
313  /* FontFamily cannot be NULL */
316 
317  /* FontFamily must be able to actually find the family.
318  * If it can't, any subsequent calls should fail.
319  */
322 
323  /* Bitmap fonts are not found */
326  if(stat == Ok) GdipDeleteFontFamily(family);
327 
329  expect (Ok, stat);
330 
331  stat = GdipGetFamilyName (family, itsName, LANG_NEUTRAL);
332  expect (Ok, stat);
333  expect (0, lstrcmpiW(itsName, Tahoma));
334 
335  if (0)
336  {
337  /* Crashes on Windows XP SP2, Vista, and so Wine as well */
339  expect (Ok, stat);
340  }
341 
342  /* Make sure we don't read old data */
343  ZeroMemory (itsName, sizeof(itsName));
344  stat = GdipCloneFontFamily(family, &clonedFontFamily);
345  expect (Ok, stat);
346  GdipDeleteFontFamily(family);
347  stat = GdipGetFamilyName(clonedFontFamily, itsName, LANG_NEUTRAL);
348  expect(Ok, stat);
349  expect(0, lstrcmpiW(itsName, Tahoma));
350 
351  GdipDeleteFontFamily(clonedFontFamily);
352 }
#define LF_FACESIZE
Definition: dimm.idl:39
static const WCHAR nonexistent[]
Definition: font.c:33
#define LANG_NEUTRAL
Definition: nls.h:22
#define ZeroMemory
Definition: winbase.h:1642
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
__wchar_t WCHAR
Definition: xmlstorage.h:180
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
GpStatus WINGDIPAPI GdipGetFamilyName(GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language)
Definition: font.c:837
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily)
Definition: font.c:803
static const WCHAR MSSansSerif[]
Definition: font.c:34
static const WCHAR Tahoma[]
Definition: font.c:36

Referenced by START_TEST().

◆ test_fontfamily_properties()

static void test_fontfamily_properties ( void  )
static

Definition at line 354 of file font.c.

355 {
357  GpStatus stat;
358  UINT16 result = 0;
359 
361  expect(Ok, stat);
362 
364  expect(Ok, stat);
365  ok (result == 2472, "Expected 2472, got %d\n", result);
366  result = 0;
368  expect(Ok, stat);
369  ok(result == 2048, "Expected 2048, got %d\n", result);
370  result = 0;
372  expect(Ok, stat);
373  ok(result == 2049, "Expected 2049, got %d\n", result);
374  result = 0;
376  expect(Ok, stat);
377  ok(result == 423, "Expected 423, got %d\n", result);
379 
381  if(stat == FontFamilyNotFound)
382  skip("Times New Roman not installed\n");
383  else
384  {
385  result = 0;
387  expect(Ok, stat);
388  ok(result == 2355, "Expected 2355, got %d\n", result);
389  result = 0;
391  expect(Ok, stat);
392  ok(result == 2048, "Expected 2048, got %d\n", result);
393  result = 0;
395  expect(Ok, stat);
396  ok(result == 1825, "Expected 1825, got %d\n", result);
397  result = 0;
399  expect(Ok, stat);
400  ok(result == 443, "Expected 443 got %d\n", result);
402  }
403 }
static const WCHAR TimesNewRoman[]
Definition: font.c:35
GpStatus WINGDIPAPI GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 *CellAscent)
Definition: font.c:880
smooth NULL
Definition: ftsmooth.c:416
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
GpStatus WINGDIPAPI GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 *LineSpacing)
Definition: font.c:945
GpStatus WINGDIPAPI GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 *CellDescent)
Definition: font.c:891
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
#define ok(value,...)
Definition: atltest.h:57
unsigned short UINT16
#define skip(...)
Definition: atltest.h:64
static const WCHAR Tahoma[]
Definition: font.c:36
GLuint64EXT * result
Definition: glext.h:11304
GpStatus WINGDIPAPI GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 *EmHeight)
Definition: font.c:918

Referenced by START_TEST().

◆ test_GdipGetFontCollectionFamilyCount()

static void test_GdipGetFontCollectionFamilyCount ( void  )
static

Definition at line 1242 of file font.c.

1243 {
1245  GpStatus status;
1246  INT count;
1247 
1249  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1250 
1251  count = 123;
1253  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1254  ok(count == 123, "Unexpected family count %d.\n", count);
1255 
1257  ok(status == Ok, "Failed to get system collection, status %d.\n", status);
1258 
1260  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1261 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
int32_t INT
Definition: typedefs.h:56
smooth NULL
Definition: ftsmooth.c:416
static UINT UINT count
Definition: font.c:44
GpStatus WINGDIPAPI GdipGetFontCollectionFamilyCount(GpFontCollection *fontCollection, INT *numFound)
Definition: font.c:1559
Status
Definition: gdiplustypes.h:24
static ICollection collection
Definition: typelib.c:184
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipNewInstalledFontCollection(GpFontCollection **fontCollection)
Definition: font.c:1679
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by START_TEST().

◆ test_GdipGetFontCollectionFamilyList()

static void test_GdipGetFontCollectionFamilyList ( void  )
static

Definition at line 1188 of file font.c.

1189 {
1190  GpFontFamily *family, *family2;
1192  INT found, count;
1193  GpStatus status;
1194 
1196  ok(status == Ok, "Failed to get system collection, status %d.\n", status);
1197 
1198  count = 0;
1200  ok(status == Ok, "Failed to get family count, status %d.\n", status);
1201  ok(count > 0, "Unexpected empty collection.\n");
1202 
1204  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1205 
1206  found = 123;
1208  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1209  ok(found == 123, "Unexpected list count %d.\n", found);
1210 
1212  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1213 
1214  found = 123;
1216  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1217  ok(found == 123, "Unexpected list count %d.\n", found);
1218 
1219  found = 123;
1221  ok(status == InvalidParameter, "Unexpected status %d.\n", status);
1222  ok(found == 123, "Unexpected list count %d.\n", found);
1223 
1224  family = NULL;
1225  found = 0;
1226  status = GdipGetFontCollectionFamilyList(collection, 1, &family, &found);
1227  ok(status == Ok, "Failed to get family list, status %d.\n", status);
1228  ok(found == 1, "Unexpected list count %d.\n", found);
1229  ok(family != NULL, "Expected family instance.\n");
1230 
1231  family = NULL;
1232  found = 0;
1233  status = GdipGetFontCollectionFamilyList(collection, 1, &family2, &found);
1234  ok(status == Ok, "Failed to get family list, status %d.\n", status);
1235  ok(found == 1, "Unexpected list count %d.\n", found);
1236  ok(family2 != family, "Unexpected family instance.\n");
1237 
1238  GdipDeleteFontFamily(family);
1239  GdipDeleteFontFamily(family2);
1240 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
int32_t INT
Definition: typedefs.h:56
smooth NULL
Definition: ftsmooth.c:416
static UINT UINT count
Definition: font.c:44
GpStatus WINGDIPAPI GdipGetFontCollectionFamilyList(GpFontCollection *fontCollection, INT numSought, GpFontFamily *gpfamilies[], INT *numFound)
Definition: font.c:1574
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
GpStatus WINGDIPAPI GdipGetFontCollectionFamilyCount(GpFontCollection *fontCollection, INT *numFound)
Definition: font.c:1559
Status
Definition: gdiplustypes.h:24
static ICollection collection
Definition: typelib.c:184
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipNewInstalledFontCollection(GpFontCollection **fontCollection)
Definition: font.c:1679
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by START_TEST().

◆ test_getgenerics()

static void test_getgenerics ( void  )
static

Definition at line 426 of file font.c.

427 {
428  GpStatus stat;
429  GpFontFamily *family;
430  WCHAR sansname[LF_FACESIZE], serifname[LF_FACESIZE], mononame[LF_FACESIZE];
431  int missingfonts = 0;
432 
434  expect (Ok, stat);
435  if (stat == FontFamilyNotFound)
436  missingfonts = 1;
437  else
438  check_family("Sans Serif", family, sansname);
439 
441  expect (Ok, stat);
442  if (stat == FontFamilyNotFound)
443  missingfonts = 1;
444  else
445  check_family("Serif", family, serifname);
446 
448  expect (Ok, stat);
449  if (stat == FontFamilyNotFound)
450  missingfonts = 1;
451  else
452  check_family("Monospace", family, mononame);
453 
454  if (missingfonts && strcmp(winetest_platform, "wine") == 0)
455  trace("You may need to install either the Microsoft Web Fonts or the Liberation Fonts\n");
456 
457  /* Check that the family names are all different */
458  ok(lstrcmpiW(sansname, serifname) != 0, "Sans Serif and Serif families should be different: %s\n", wine_dbgstr_w(sansname));
459  ok(lstrcmpiW(sansname, mononame) != 0, "Sans Serif and Monospace families should be different: %s\n", wine_dbgstr_w(sansname));
460  ok(lstrcmpiW(serifname, mononame) != 0, "Serif and Monospace families should be different: %s\n", wine_dbgstr_w(serifname));
461 }
GpStatus WINGDIPAPI GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily)
Definition: font.c:1010
#define LF_FACESIZE
Definition: dimm.idl:39
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
static void check_family(const char *context, GpFontFamily *family, WCHAR *name)
Definition: font.c:405
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily)
Definition: font.c:1074
const char * winetest_platform
#define trace
Definition: atltest.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily)
Definition: font.c:1041
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
#define ok(value,...)
Definition: atltest.h:57
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469

Referenced by START_TEST().

◆ test_heightgivendpi()

static void test_heightgivendpi ( void  )
static

Definition at line 476 of file font.c.

477 {
478  GpStatus stat;
479  GpFont* font = NULL;
480  GpFontFamily* fontfamily = NULL;
481  REAL height;
482  Unit unit;
483 
484  stat = GdipCreateFontFamilyFromName(Tahoma, NULL, &fontfamily);
485  expect(Ok, stat);
486 
487  stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPixel, &font);
488  expect(Ok, stat);
489 
492 
495 
497  expect(Ok, stat);
498  expectf(36.210938, height);
500 
501  height = 12345;
502  stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitWorld, &font);
503  expect(Ok, stat);
504 
506  expect(Ok, stat);
508 
510  expect(Ok, stat);
511  expectf(36.210938, height);
513 
514  height = 12345;
515  stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPoint, &font);
516  expect(Ok, stat);
518  expect(Ok, stat);
519  expectf(48.281250, height);
521 
522  height = 12345;
523  stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitInch, &font);
524  expect(Ok, stat);
525 
527  expect(Ok, stat);
528  expect(UnitInch, unit);
529 
531  expect(Ok, stat);
532  expectf(3476.250000, height);
534 
535  height = 12345;
536  stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitDocument, &font);
537  expect(Ok, stat);
538 
540  expect(Ok, stat);
542 
544  expect(Ok, stat);
545  expectf(11.587500, height);
547 
548  height = 12345;
550  expect(Ok, stat);
551 
553  expect(Ok, stat);
555 
557  expect(Ok, stat);
558  expectf(136.860245, height);
560 
561  GdipDeleteFontFamily(fontfamily);
562 }
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
Unit
Definition: gdiplusenums.h:25
Definition: mk_font.cpp:20
GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit)
Definition: font.c:417
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
png_const_structrp png_const_inforp int * unit
Definition: png.h:2161
smooth NULL
Definition: ftsmooth.c:416
static LPTEXTMETRICW LONG * height
Definition: font.c:42
GpStatus WINGDIPAPI GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily)
Definition: font.c:746
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
#define expect(expected, got)
Definition: font.c:28
#define expectf(expected, got)
Definition: font.c:31
Definition: stat.h:55
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height)
Definition: font.c:599
static const WCHAR Tahoma[]
Definition: font.c:36
float REAL
Definition: types.h:41

Referenced by START_TEST().

◆ test_installedfonts()

static void test_installedfonts ( void  )
static

Definition at line 463 of file font.c.

464 {
465  GpStatus stat;
467 
470 
472  expect (Ok, stat);
473  ok (collection != NULL, "got NULL font collection\n");
474 }
smooth NULL
Definition: ftsmooth.c:416
#define expect(expected, got)
Definition: font.c:28
Definition: stat.h:55
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
static ICollection collection
Definition: typelib.c:184
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipNewInstalledFontCollection(GpFontCollection **fontCollection)
Definition: font.c:1679

Referenced by START_TEST().

◆ test_logfont()

static void test_logfont ( void  )
static

Definition at line 171 of file font.c.

172 {
173  LOGFONTA lfa, lfa2;
174  GpFont *font;
175  GpFontFamily *family;
176  GpStatus stat;
177  GpGraphics *graphics;
178  HDC hdc = GetDC(0);
179  INT style;
180  REAL rval;
182  Unit unit;
183 
184  stat = GdipCreateFromHDC(hdc, &graphics);
185  expect(Ok, stat);
186 
187  memset(&lfa, 0, sizeof(LOGFONTA));
188  memset(&lfa2, 0xff, sizeof(LOGFONTA));
189  lstrcpyA(lfa.lfFaceName, "Tahoma");
190 
192  expect(Ok, stat);
193  stat = GdipGetLogFontA(font, graphics, &lfa2);
194  expect(Ok, stat);
195 
196  ok(lfa2.lfHeight < 0, "Expected negative height\n");
197  expect(0, lfa2.lfWidth);
198  expect(0, lfa2.lfEscapement);
199  expect(0, lfa2.lfOrientation);
200  ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n");
201  expect(0, lfa2.lfItalic);
202  expect(0, lfa2.lfUnderline);
203  expect(0, lfa2.lfStrikeOut);
204  ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET,
205  "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet);
206  expect(0, lfa2.lfOutPrecision);
207  expect(0, lfa2.lfClipPrecision);
208  expect(0, lfa2.lfQuality);
209  expect(0, lfa2.lfPitchAndFamily);
210 
212 
213  memset(&lfa, 0, sizeof(LOGFONTA));
214  lfa.lfHeight = 25;
215  lfa.lfWidth = 25;
216  lfa.lfEscapement = lfa.lfOrientation = 50;
217  lfa.lfItalic = lfa.lfUnderline = lfa.lfStrikeOut = TRUE;
218 
219  memset(&lfa2, 0xff, sizeof(LOGFONTA));
220  lstrcpyA(lfa.lfFaceName, "Tahoma");
221 
223  expect(Ok, stat);
224  stat = GdipGetLogFontA(font, graphics, &lfa2);
225  expect(Ok, stat);
226 
227  ok(lfa2.lfHeight < 0, "Expected negative height\n");
228  expect(0, lfa2.lfWidth);
229  expect(0, lfa2.lfEscapement);
230  expect(0, lfa2.lfOrientation);
231  ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n");
232  expect(TRUE, lfa2.lfItalic);
233  expect(TRUE, lfa2.lfUnderline);
234  expect(TRUE, lfa2.lfStrikeOut);
235  ok(lfa2.lfCharSet == GetTextCharset(hdc) || lfa2.lfCharSet == ANSI_CHARSET,
236  "Expected %x or %x, got %x\n", GetTextCharset(hdc), ANSI_CHARSET, lfa2.lfCharSet);
237  expect(0, lfa2.lfOutPrecision);
238  expect(0, lfa2.lfClipPrecision);
239  expect(0, lfa2.lfQuality);
240  expect(0, lfa2.lfPitchAndFamily);
241 
243  expect(Ok, stat);
245  "Expected , got %d\n", style);
246 
248  expect(Ok, stat);
250 
251  stat = GdipGetFontHeight(font, graphics, &rval);
252  expect(Ok, stat);
253  expectf(25.347656, rval);
255  expect(Ok, stat);
256  expectf(21.0, rval);
257 
258  stat = GdipGetFamily(font, &family);
259  expect(Ok, stat);
261  expect(Ok, stat);
262  expect(2048, em_height);
264  expect(Ok, stat);
265  expect(2472, line_spacing);
266  GdipDeleteFontFamily(family);
267 
269 
270  memset(&lfa, 0, sizeof(lfa));
271  lfa.lfHeight = -25;
272  lstrcpyA(lfa.lfFaceName, "Tahoma");
274  expect(Ok, stat);
275  memset(&lfa2, 0xff, sizeof(lfa2));
276  stat = GdipGetLogFontA(font, graphics, &lfa2);
277  expect(Ok, stat);
278  expect(lfa.lfHeight, lfa2.lfHeight);
279 
281  expect(Ok, stat);
283 
284  stat = GdipGetFontHeight(font, graphics, &rval);
285  expect(Ok, stat);
286  expectf(30.175781, rval);
288  expect(Ok, stat);
289  expectf(25.0, rval);
290 
291  stat = GdipGetFamily(font, &family);
292  expect(Ok, stat);
294  expect(Ok, stat);
295  expect(2048, em_height);
297  expect(Ok, stat);
298  expect(2472, line_spacing);
299  GdipDeleteFontFamily(family);
300 
302 
303  GdipDeleteGraphics(graphics);
304  ReleaseDC(0, hdc);
305 }
BYTE lfItalic
Definition: dimm.idl:47
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
#define TRUE
Definition: types.h:120
Unit
Definition: gdiplusenums.h:25
HDC WINAPI GetDC(_In_opt_ HWND)
Definition: mk_font.cpp:20
BYTE lfStrikeOut
Definition: dimm.idl:49
GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit)
Definition: font.c:417
static HDC
Definition: imagelist.c:92
BYTE lfUnderline
Definition: dimm.idl:48
GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, LOGFONTA *lfa)
Definition: font.c:432
BYTE lfCharSet
Definition: dimm.idl:50
int32_t INT
Definition: typedefs.h:56
BYTE lfOutPrecision
Definition: dimm.idl:51
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
Definition: graphics.c:2581
LONG lfHeight
Definition: dimm.idl:42
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
png_const_structrp png_const_inforp int * unit
Definition: png.h:2161
LONG lfWeight
Definition: dimm.idl:46
GpStatus WINGDIPAPI GdipGetFontSize(GpFont *font, REAL *size)
Definition: font.c:350
BYTE lfPitchAndFamily
Definition: dimm.idl:54
GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, GDIPCONST LOGFONTA *lfa, GpFont **font)
Definition: font.c:249
GpStatus WINGDIPAPI GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 *LineSpacing)
Definition: font.c:945
GpStatus WINGDIPAPI GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height)
Definition: font.c:552
LONG lfWidth
Definition: dimm.idl:43
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
GpStatus WINGDIPAPI GdipDeleteFontFamily(GpFontFamily *FontFamily)
Definition: font.c:869
LONG lfOrientation
Definition: dimm.idl:45
GpStatus WINGDIPAPI GdipGetFontStyle(GpFont *font, INT *style)
Definition: font.c:393
#define expect(expected, got)
Definition: font.c:28
#define expectf(expected, got)
Definition: font.c:31
float rval
Definition: cylfrac.c:48
HDC hdc
Definition: main.c:9
Definition: stat.h:55
UINT16 line_spacing
Definition: font.c:650
BYTE lfQuality
Definition: dimm.idl:53
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
BYTE lfClipPrecision
Definition: dimm.idl:52
#define ok(value,...)
Definition: atltest.h:57
unsigned short UINT16
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
Definition: graphics.c:2395
GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family)
Definition: font.c:319
int WINAPI GetTextCharset(_In_ HDC)
Definition: text.c:187
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
#define ANSI_CHARSET
Definition: wingdi.h:382
float REAL
Definition: types.h:41
Arabic default style
Definition: afstyles.h:93
#define memset(x, y, z)
Definition: compat.h:39
GpStatus WINGDIPAPI GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 *EmHeight)
Definition: font.c:918
UINT16 em_height
Definition: font.c:650
LONG lfEscapement
Definition: dimm.idl:44

Referenced by START_TEST().

◆ test_long_name()

static void test_long_name ( void  )
static

Definition at line 74 of file font.c.

75 {
77  static const WCHAR path_longname[] = {'w','i','n','e','_','l','o','n','g','n','a','m','e','.','t','t','f',0};
78  GpStatus stat;
79  GpFontCollection *fonts;
80  INT num_families;
81  GpFontFamily *family;
83  GpFont *font;
84 
86  ok(stat == Ok, "GdipNewPrivateFontCollection failed: %d\n", stat);
87 
88  create_testfontfile(path_longname, 1, path);
89 
91  ok(stat == Ok, "GdipPrivateAddFontFile failed: %d\n", stat);
92 
93  stat = GdipGetFontCollectionFamilyCount(fonts, &num_families);
94  ok(stat == Ok, "GdipGetFontCollectionFamilyCount failed: %d\n", stat);
95 
96  ok(num_families == 1, "expected num_families to be 1, got %d\n", num_families);
97 
98  stat = GdipGetFontCollectionFamilyList(fonts, num_families, &family, &num_families);
99  ok(stat == Ok, "GdipGetFontCollectionFamilyList failed: %d\n", stat);
100 
102  ok(stat == Ok, "GdipGetFamilyName failed: %d\n", stat);
103 
104  stat = GdipCreateFont(family, 256.0, FontStyleRegular, UnitPixel, &font);
105  ok(stat == Ok, "GdipCreateFont failed: %d\n", stat);
106 
107  /* Cleanup */
108 
110  ok(stat == Ok, "GdipDeleteFont failed: %d\n", stat);
111 
113  ok(stat == Ok, "GdipDeletePrivateFontCollection failed: %d\n", stat);
114 
116 }
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
Definition: font.c:270
#define LF_FACESIZE
Definition: dimm.idl:39
Definition: mk_font.cpp:20
#define LANG_NEUTRAL
Definition: nls.h:22
int32_t INT
Definition: typedefs.h:56
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
Definition: font.c:144
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:26
GpStatus WINGDIPAPI GdipPrivateAddFontFile(GpFontCollection *collection, GDIPCONST WCHAR *name)
Definition: font.c:1137
GpStatus WINGDIPAPI GdipGetFontCollectionFamilyList(GpFontCollection *fontCollection, INT numSought, GpFontFamily *gpfamilies[], INT *numFound)
Definition: font.c:1574
Definition: stat.h:55
GpStatus WINGDIPAPI GdipGetFontCollectionFamilyCount(GpFontCollection *fontCollection, INT *numFound)
Definition: font.c:1559
GpStatus WINGDIPAPI GdipGetFamilyName(GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language)
Definition: font.c:837
Status
Definition: gdiplustypes.h:24
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
Definition: stat.h:345
#define ok(value,...)
Definition: atltest.h:57
GpStatus WINGDIPAPI GdipNewPrivateFontCollection(GpFontCollection **fontCollection)
Definition: font.c:1096
T1_FIELD_DICT_FONTDICT family_name
Definition: t1tokens.h:30
GpStatus WINGDIPAPI GdipDeletePrivateFontCollection(GpFontCollection **fontCollection)
Definition: font.c:1118
#define DELETE_FONTFILE(filename)
Definition: font.c:67
static void create_testfontfile(const WCHAR *filename, int resource, WCHAR pathW[MAX_PATH])
Definition: font.c:46

Referenced by START_TEST().

Variable Documentation

◆ MSSansSerif

const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'}
static

Definition at line 34 of file font.c.

Referenced by test_fontfamily().

◆ nonexistent

const WCHAR nonexistent[] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'}
static

◆ Tahoma

◆ TimesNewRoman

const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'}
static

Definition at line 35 of file font.c.

Referenced by GdipGetGenericFontFamilySerif(), and test_fontfamily_properties().