51 IDWriteFontFileEnumerator_AddRef(iface);
70 IDWriteFontFile_Release(enumerator->
file);
84 IDWriteFontFile_AddRef(*
file);
86 IDWriteFontFile_AddRef((*
file = enumerator->
file));
96 if (enumerator->
index > 1)
120 if (!(enumerator =
calloc(1,
sizeof(*enumerator))))
125 enumerator->
index = 0;
127 IDWriteFontFile_AddRef(
file);
152 IDWriteFontFileStream_AddRef(iface);
181 *fragment_context =
NULL;
185 *fragment_start =
NULL;
226 if (!(
object =
calloc(1,
sizeof(*
object))))
230 object->refcount = 1;
234 *iface = &
object->IDWriteFontFileStream_iface;
286 ok(
mem !=
NULL,
"Failed to lock font resource\n");
308 object =
calloc(1,
sizeof(*
object));
311 object->refcount = 1;
313 return &
object->IDWriteFontFileLoader_iface;
333 IDWriteFontCollectionLoader_AddRef(iface);
353 IDWriteFontFileLoader_Release(
loader->loader);
367 hr = IDWriteFactory_CreateCustomFontFileReference(
factory,
key, key_size,
loader->loader, &font_file);
373 IDWriteFontFile_Release(font_file);
389 object =
calloc(1,
sizeof(*
object));
391 object->refcount = 1;
393 IDWriteFontFileLoader_AddRef(
object->loader);
395 return &
object->IDWriteFontCollectionLoader_iface;
443 ok(0,
"unexpected call\n");
450 ok(0,
"unexpected\n");
457 ok(0,
"unexpected\n");
482 IDWriteTextAnalysisSource_AddRef(iface);
520 ok(0,
"unexpected\n");
527 ok(0,
"unexpected\n");
542 ok(0,
"unexpected\n");
584 hr = IDWriteFactory_CreateTextAnalyzer(
factory, &analyzer);
591 IDWriteFactory_Release(
factory);
618 hr = IDWriteFontFamily_GetFirstMatchingFont(family,
619 IDWriteTextFormat_GetFontWeight(
format),
620 IDWriteTextFormat_GetFontStretch(
format),
621 IDWriteTextFormat_GetFontStyle(
format),
625 hr = IDWriteFont_CreateFontFace(
font, &fontface);
628 IDWriteFont_Release(
font);
629 IDWriteFontFamily_Release(family);
634#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
638 IUnknown_AddRef(
obj);
639 rc = IUnknown_Release(
obj);
640 ok_(__FILE__,
line)(rc ==
ref,
"expected refcount %ld, got %ld\n",
ref, rc);
659 static const char *kind_names[] = {
668 "STRIKETHROUGH|EFFECT",
701#define NUM_CALL_SEQUENCES 1
737 for (
i = 0;
i <
n;
i++)
738 seq[
i] =
calloc(1,
sizeof(*seq[
i]));
750 add_call(seq, sequence_index, &end_of_sequence);
760 ok_(
file,
line) (0,
"%s: call %s was expected, but got call %s instead\n",
767 ok_(
file,
line) (0,
"%s: call %s was expected, but got call %s instead\n",
775 ok_(
file,
line) (0,
"%s: glyphrun string %s was expected, but got %s instead\n",
779 ok_(
file,
line) (
cmp == 0,
"%s: glyphrun string %s was expected, but got %s instead\n",
786 ok_(
file,
line) (0,
"%s: glyph run locale %s was expected, but got %s instead\n",
790 ok_(
file,
line) (
cmp == 0,
"%s: glyph run locale %s was expected, but got %s instead\n",
796 ok_(
file,
line) (0,
"%s: wrong glyph count, %u was expected, but got %u instead\n",
801 "%s: wrong glyph count, %u was expected, but got %u instead\n",
807 ok_(
file,
line) (0,
"%s: wrong bidi level, %u was expected, but got %u instead\n",
812 "%s: wrong bidi level, %u was expected, but got %u instead\n",
820 ok_(
file,
line) (0,
"%s: underline locale %s was expected, but got %s instead\n",
824 ok_(
file,
line) (
cmp == 0,
"%s: underline locale %s was expected, but got %s instead\n",
835 ok_(
file,
line) (0,
"%s: the call sequence is not complete: expected %s - actual %s\n",
841 ok_(
file,
line) (0,
"%s: the call sequence is not complete: expected %s - actual %s\n",
844 if (
todo && !failcount)
851#define ok_sequence(seq, index, exp, contx, todo) \
852 ok_sequence_(seq, index, (exp), (contx), (todo), __FILE__, __LINE__)
920 *pixels_per_dip = ctxt->
ppdip;
924#define TEST_MEASURING_MODE(ctxt, mode) test_measuring_mode(ctxt, mode, __LINE__)
939 FLOAT baselineOriginX,
940 FLOAT baselineOriginY,
952 ctxt->
originX = baselineOriginX;
953 ctxt->
originY = baselineOriginY;
976 ok(
descr->stringLength > 0,
"got string length %u\n",
descr->stringLength);
978 for (
i = 0;
i <
descr->stringLength;
i++)
995 FLOAT baselineOriginX,
996 FLOAT baselineOriginY,
1006 ok(underline->
runHeight > 0.0f,
"Expected non-zero run height\n");
1007 if (ctxt && ctxt->
format) {
1013 emsize = IDWriteTextFormat_GetFontSize(ctxt->
format);
1014 IDWriteFontFace_GetMetrics(fontface, &
metrics);
1016 ok(emsize ==
metrics.designUnitsPerEm,
"Unexpected font size %f\n", emsize);
1021 IDWriteFontFace_Release(fontface);
1034 FLOAT baselineOriginX,
1035 FLOAT baselineOriginY,
1103 IDWriteInlineObject_AddRef(iface);
1132 ok(0,
"unexpected call\n");
1144 ok(0,
"unexpected call\n");
1187 object->IDWriteInlineObject_iface.lpVtbl =
vtable;
1188 object->refcount = 1;
1233 IUnknown_AddRef(iface);
1269 effect =
calloc(1,
sizeof(*effect));
1288 layout = (
void*)0xdeadbeef;
1289 hr = IDWriteFactory_CreateTextLayout(
factory,
NULL, 0,
NULL, 0.0f, 0.0f, &layout);
1291 ok(layout ==
NULL,
"got %p\n", layout);
1293 layout = (
void*)0xdeadbeef;
1294 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
NULL, 0.0f, 0.0f, &layout);
1296 ok(layout ==
NULL,
"got %p\n", layout);
1298 layout = (
void*)0xdeadbeef;
1299 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
NULL, 1.0f, 0.0f, &layout);
1301 ok(layout ==
NULL,
"got %p\n", layout);
1303 layout = (
void*)0xdeadbeef;
1304 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
NULL, 0.0f, 1.0f, &layout);
1306 ok(layout ==
NULL,
"got %p\n", layout);
1308 layout = (
void*)0xdeadbeef;
1309 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
NULL, 1000.0f, 1000.0f, &layout);
1311 ok(layout ==
NULL,
"got %p\n", layout);
1315 ok(
hr ==
S_OK,
"Failed to create format, hr %#lx.\n",
hr);
1317 layout = (
void*)0xdeadbeef;
1320 ok(layout ==
NULL,
"got %p\n", layout);
1322 layout = (
void *)0xdeadbeef;
1323 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, -100.0f, 100.0f, &layout);
1325 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1327 layout = (
void *)0xdeadbeef;
1328 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 100.0f, -100.0f, &layout);
1330 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1332 layout = (
void *)0xdeadbeef;
1333 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, -100.0f, -100.0f, &layout);
1335 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1337 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 0,
format, 0.0f, 0.0f, &layout);
1338 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1339 IDWriteTextLayout_Release(layout);
1342 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 1000.0f, 1000.0f, &layout);
1343 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1346 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout2, (
void**)&layout2);
1348 IDWriteTextLayout1 *layout1;
1352 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextLayout1, (
void**)&layout1);
1354 IDWriteTextLayout1_Release(layout1);
1357 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (
void**)&format1);
1361 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat, (
void**)&
format);
1367 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextLayout1, (
void**)&layout1);
1369 IDWriteTextLayout1_Release(layout1);
1371 IDWriteTextFormat1_Release(format1);
1372 IDWriteTextFormat_Release(
format);
1374 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat1, (
void**)&format1);
1378 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (
void**)&
format);
1383 IDWriteTextFormat1_Release(format1);
1384 IDWriteTextFormat_Release(
format);
1387 win_skip(
"IDWriteTextLayout2 is not supported.\n");
1389 if (layout2 &&
SUCCEEDED(IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextLayout4, (
void **)&layout4)))
1391 hr = IDWriteTextLayout4_QueryInterface(layout4, &IID_IDWriteTextFormat3, (
void **)&format3);
1392 ok(
hr ==
S_OK,
"Failed to get text format, hr %#lx.\n",
hr);
1393 IDWriteTextFormat3_Release(format3);
1396 win_skip(
"IDWriteTextLayout4 is not supported.\n");
1399 IDWriteTextLayout2_Release(layout2);
1400 IDWriteTextLayout_Release(layout);
1401 IDWriteTextFormat_Release(
format);
1402 IDWriteFactory_Release(
factory);
1406 { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 },
1407 { 1.0, 0.0, 0.0, 1.0, 0.3, 0.2 },
1408 { 1.0, 0.0, 0.0, 1.0,-0.3,-0.2 },
1410 { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
1411 { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 },
1412 { 1.0, 2.0, 0.5, 1.0, 0.0, 0.0 },
1426 layout = (
void*)0xdeadbeef;
1429 ok(layout ==
NULL,
"got %p\n", layout);
1431 layout = (
void*)0xdeadbeef;
1432 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
NULL, 0.0f, 0.0f, 0.0f,
NULL,
1435 ok(layout ==
NULL,
"got %p\n", layout);
1437 layout = (
void*)0xdeadbeef;
1438 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
NULL, 1.0f, 0.0f, 0.0f,
NULL,
1441 ok(layout ==
NULL,
"got %p\n", layout);
1443 layout = (
void*)0xdeadbeef;
1444 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
NULL, 1.0f, 0.0f, 1.0f,
NULL,
1447 ok(layout ==
NULL,
"got %p\n", layout);
1449 layout = (
void*)0xdeadbeef;
1450 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
NULL, 1000.0f, 1000.0f, 1.0f,
NULL,
1453 ok(layout ==
NULL,
"got %p\n", layout);
1458 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1461 layout = (
void*)0xdeadbeef;
1464 ok(layout ==
NULL,
"got %p\n", layout);
1466 layout = (
void *)0xdeadbeef;
1467 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, -100.0f, 100.0f, 1.0f,
1470 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1472 layout = (
void *)0xdeadbeef;
1473 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, -100.0f, 1.0f,
1476 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1478 layout = (
void *)0xdeadbeef;
1479 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, -100.0f, -100.0f, 1.0f,
1482 ok(layout ==
NULL,
"Unexpected pointer %p.\n", layout);
1484 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f,
NULL,
1486 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1490 IDWriteTextLayout_AddRef(layout);
1493 IDWriteTextLayout_Release(layout);
1494 IDWriteTextLayout_Release(layout);
1497 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 0,
format, 100.0f, 100.0f, 1.0f,
NULL,
1499 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1501 dimension = IDWriteTextLayout_GetMaxWidth(layout);
1502 ok(dimension == 100.0,
"got %f\n", dimension);
1504 dimension = IDWriteTextLayout_GetMaxHeight(layout);
1505 ok(dimension == 100.0,
"got %f\n", dimension);
1507 IDWriteTextLayout_Release(layout);
1510 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 1,
format, 100.0f, 100.0f, -1.0f,
NULL,
1512 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1513 IDWriteTextLayout_Release(layout);
1515 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 1,
format, 100.0f, 100.0f, 0.0f,
NULL,
1517 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1518 IDWriteTextLayout_Release(layout);
1523 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 1,
format, 100.0f, 100.0f, 1.0f,
1525 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1526 IDWriteTextLayout_Release(layout);
1529 IDWriteTextFormat_Release(
format);
1530 IDWriteFactory_Release(
factory);
1570 10, 10.0f,
L"en-us", &
format);
1580 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1581 IDWriteTextFormat_Release(
format);
1585 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1588 hr = IDWriteTextFormat_GetFontCollection(
format,
NULL);
1595 hr = IDWriteFactory_GetSystemFontCollection(
factory, &syscoll,
FALSE);
1598 IDWriteFontCollection_Release(syscoll);
1602 align = IDWriteTextFormat_GetTextAlignment(
format);
1605 paralign = IDWriteTextFormat_GetParagraphAlignment(
format);
1608 wrapping = IDWriteTextFormat_GetWordWrapping(
format);
1614 flow = IDWriteTextFormat_GetFlowDirection(
format);
1619 ok(spacing == 0.0,
"got %f\n", spacing);
1626 trimmingsign = (
void*)0xdeadbeef;
1627 hr = IDWriteTextFormat_GetTrimming(
format, &trimming, &trimmingsign);
1632 ok(trimmingsign ==
NULL,
"got %p\n", trimmingsign);
1660 hr = IDWriteTextFormat_SetTrimming(
format, &trimming,
NULL);
1667 hr = IDWriteTextFormat_SetTrimming(
format, &trimming,
NULL);
1670 IDWriteTextFormat_Release(
format);
1671 IDWriteFactory_Release(
factory);
1687 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1689 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 0,
format, 100.0f, 100.0f, 1.0f,
NULL,
1691 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1693 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (
void**)&format2);
1696 len = IDWriteTextFormat_GetLocaleNameLength(format2);
1698 len = IDWriteTextFormat_GetLocaleNameLength(
format);
1700 hr = IDWriteTextFormat_GetLocaleName(format2,
buff,
len);
1702 hr = IDWriteTextFormat_GetLocaleName(format2,
buff,
len+1);
1711 IDWriteTextLayout_Release(layout);
1712 IDWriteTextFormat_Release(
format);
1713 IDWriteTextFormat_Release(format2);
1714 IDWriteFactory_Release(
factory);
1718 {
DRAW_GLYPHRUN, {0x2026, 0}, {
'e',
'n',
'-',
'g',
'b',0}, 1 },
1737 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1739 sign = (
void *)0xdeadbeef;
1749 hr = IDWriteInlineObject_QueryInterface(
sign, &IID_IDWriteTextLayout, (
void**)&unk);
1754 hr = IDWriteInlineObject_GetMetrics(
sign,
NULL);
1784 ok(
hr ==
S_OK,
"Failed to draw trimming sign, hr %#lx.\n",
hr);
1788 IUnknown_Release(effect);
1792 ok(
hr ==
S_OK,
"Failed to draw trimming sign, hr %#lx.\n",
hr);
1795 memset(&ctxt, 0,
sizeof(ctxt));
1797 ok(
hr ==
S_OK,
"Failed to draw trimming sign, hr %#lx.\n",
hr);
1798 ok(ctxt.
originX == 123.0f && ctxt.
originY == 456.0f,
"Unexpected drawing origin\n");
1800 IDWriteInlineObject_Release(
sign);
1804 ok(
hr ==
S_OK,
"Failed to set text alignment, hr %#lx.\n",
hr);
1809 memset(&ctxt, 0,
sizeof(ctxt));
1811 ok(
hr ==
S_OK,
"Failed to draw trimming sign, hr %#lx.\n",
hr);
1812 ok(ctxt.
originX == 123.0f && ctxt.
originY == 456.0f,
"Unexpected drawing origin\n");
1814 IDWriteInlineObject_Release(
sign);
1827 IDWriteTextFormat_Release(
format);
1828 IDWriteFactory_Release(
factory);
1845 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1847 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f,
NULL,
1849 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1851 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (
void**)&fmt2);
1854 weight = IDWriteTextFormat_GetFontWeight(fmt2);
1858 hr = IDWriteTextLayout_GetFontWeight(layout, 0, &
weight, &
range);
1862 range.startPosition = 0;
1868 hr = IDWriteTextLayout_GetFontWeight(layout, 0, &
weight, &
range);
1873 weight = IDWriteTextFormat_GetFontWeight(fmt2);
1878 hr = IDWriteTextLayout_GetFontWeight(layout, 0, &
weight, &
range);
1883 range.startPosition = 0;
1885 hr = IDWriteTextLayout_SetFontWeight(layout, 1000,
range);
1888 size = IDWriteTextLayout_GetMaxWidth(layout);
1891 hr = IDWriteTextLayout_SetMaxWidth(layout, 0.0);
1894 size = IDWriteTextLayout_GetMaxWidth(layout);
1897 hr = IDWriteTextLayout_SetMaxWidth(layout, -1.0);
1900 size = IDWriteTextLayout_GetMaxWidth(layout);
1903 hr = IDWriteTextLayout_SetMaxWidth(layout, 100.0);
1906 size = IDWriteTextLayout_GetMaxWidth(layout);
1909 size = IDWriteTextLayout_GetMaxHeight(layout);
1912 hr = IDWriteTextLayout_SetMaxHeight(layout, 0.0);
1915 size = IDWriteTextLayout_GetMaxHeight(layout);
1918 hr = IDWriteTextLayout_SetMaxHeight(layout, -1.0);
1921 size = IDWriteTextLayout_GetMaxHeight(layout);
1924 hr = IDWriteTextLayout_SetMaxHeight(layout, 100.0);
1927 size = IDWriteTextLayout_GetMaxHeight(layout);
1930 IDWriteTextLayout_Release(layout);
1931 IDWriteTextFormat_Release(fmt2);
1932 IDWriteTextFormat_Release(
format);
1933 IDWriteFactory_Release(
factory);
1949 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
1951 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f,
NULL,
1953 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
1955 hr = IDWriteFactory_CreateEllipsisTrimmingSign(
factory,
format, &inlineobj);
1958 hr = IDWriteFactory_CreateEllipsisTrimmingSign(
factory,
format, &inlineobj2);
1964 inlinetest = (
void*)0x1;
1965 hr = IDWriteTextLayout_GetInlineObject(layout, 0, &inlinetest,
NULL);
1967 ok(inlinetest ==
NULL,
"got %p\n", inlinetest);
1969 range.startPosition = 0;
1971 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj,
range);
1976 inlinetest = (
void*)0x1;
1977 hr = IDWriteTextLayout_GetInlineObject(layout, 2, &inlinetest,
NULL);
1979 ok(inlinetest ==
NULL,
"got %p\n", inlinetest);
1982 r2.startPosition =
r2.length = 100;
1983 hr = IDWriteTextLayout_GetInlineObject(layout, 0, &inlinetest, &
r2);
1985 ok(inlinetest == inlineobj,
"got %p\n", inlinetest);
1986 ok(
r2.startPosition == 0 &&
r2.length == 2,
"got %d, %d\n",
r2.startPosition,
r2.length);
1987 IDWriteInlineObject_Release(inlinetest);
1993 r2.startPosition =
r2.length = 100;
1994 hr = IDWriteTextLayout_GetInlineObject(layout, 1, &inlinetest, &
r2);
1996 ok(inlinetest == inlineobj,
"got %p\n", inlinetest);
1997 ok(
r2.startPosition == 0 &&
r2.length == 2,
"got %d, %d\n",
r2.startPosition,
r2.length);
1998 IDWriteInlineObject_Release(inlinetest);
2002 range.startPosition = 1;
2004 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj2,
range);
2008 r2.startPosition =
r2.length = 100;
2009 hr = IDWriteTextLayout_GetInlineObject(layout, 1, &inlinetest, &
r2);
2011 ok(inlinetest == inlineobj2,
"got %p\n", inlinetest);
2012 ok(
r2.startPosition == 1 &&
r2.length == 1,
"got %d, %d\n",
r2.startPosition,
r2.length);
2013 IDWriteInlineObject_Release(inlinetest);
2019 r2.startPosition =
r2.length = 100;
2020 hr = IDWriteTextLayout_GetInlineObject(layout, 0, &inlinetest, &
r2);
2022 ok(inlinetest == inlineobj,
"got %p\n", inlinetest);
2023 ok(
r2.startPosition == 0 &&
r2.length == 1,
"got %d, %d\n",
r2.startPosition,
r2.length);
2024 IDWriteInlineObject_Release(inlinetest);
2028 range.startPosition = 1;
2030 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj,
range);
2033 r2.startPosition =
r2.length = 100;
2034 hr = IDWriteTextLayout_GetInlineObject(layout, 0, &inlinetest, &
r2);
2036 ok(inlinetest == inlineobj,
"got %p\n", inlinetest);
2037 ok(
r2.startPosition == 0 &&
r2.length == 2,
"got %d, %d\n",
r2.startPosition,
r2.length);
2038 IDWriteInlineObject_Release(inlinetest);
2042 range.startPosition = 1;
2044 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj,
range);
2049 r2.startPosition =
r2.length = 100;
2050 hr = IDWriteTextLayout_GetInlineObject(layout, 0, &inlinetest, &
r2);
2052 ok(inlinetest == inlineobj,
"got %p\n", inlinetest);
2053 ok(
r2.startPosition == 0 &&
r2.length == 3,
"got %d, %d\n",
r2.startPosition,
r2.length);
2054 IDWriteInlineObject_Release(inlinetest);
2059 IDWriteTextLayout_Release(layout);
2063 IDWriteInlineObject_Release(inlineobj);
2064 IDWriteInlineObject_Release(inlineobj2);
2065 IDWriteTextFormat_Release(
format);
2066 IDWriteFactory_Release(
factory);
2083 {
DRAW_GLYPHRUN, {
'a',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
2123 {
DRAW_GLYPHRUN, {
's',
't',
'r',
'i',
'n',
'g',0}, {
'r',
'u',0}, 6 },
2128 {
DRAW_GLYPHRUN, {
'1',
'2',
'3',
'-',
'5',
'2',0}, {
'r',
'u',0}, 6 },
2129 {
DRAW_GLYPHRUN, {0x64a,0x64f,0x633,0x627,0x648,0x650,0x64a,0}, {
'r',
'u',0}, 7, 1 },
2137 static const WCHAR str3W[] = {
'1',
'2',
'3',
'-',
'5',
'2',0x64a,0x64f,0x633,0x627,0x648,0x650,
2138 0x64a,
'7',
'1',
'.',0};
2139 static const WCHAR str2W[] = {0x202a,0x202c,
'a',
'b',0};
2152 memset(&ctxt, 0,
sizeof(ctxt));
2157 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
2159 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, &layout);
2160 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2162 hr = IDWriteFactory_CreateEllipsisTrimmingSign(
factory,
format, &inlineobj);
2165 range.startPosition = 5;
2167 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
2170 range.startPosition = 1;
2172 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj,
range);
2175 range.startPosition = 4;
2177 hr = IDWriteTextLayout_SetDrawingEffect(layout, (
IUnknown*)inlineobj,
range);
2180 range.startPosition = 0;
2182 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
2186 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2189 IDWriteTextLayout_Release(layout);
2192 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 5.0f, 100.0f, &layout);
2193 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2195 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2198 hr = IDWriteTextLayout_GetMetrics(layout, &
tm);
2201 ok(
tm.lineCount == 6,
"got %u\n",
tm.lineCount);
2202 IDWriteTextLayout_Release(layout);
2205 hr = IDWriteFactory_CreateTextLayout(
factory, str2W, 4,
format, 500.0, 100.0, &layout);
2208 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2211 IDWriteTextLayout_Release(layout);
2215 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 500.0f, 100.0f, &layout);
2216 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2219 range.startPosition = 0;
2221 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
2224 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2227 IDWriteTextLayout_Release(layout);
2230 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 500.0f, 100.0f, &layout);
2231 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2234 range.startPosition = 2;
2236 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
2239 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2242 IDWriteTextLayout_Release(layout);
2245 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 0,
format, 500.0f, 100.0f, &layout);
2246 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2249 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2252 IDWriteTextLayout_Release(layout);
2258 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f,
NULL,
2260 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2262 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2267 hr = IDWriteTextLayout_GetMetrics(layout, &
tm);
2271 hr = IDWriteTextLayout_SetMaxWidth(layout,
tm.width + 3.0);
2278 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2283 IDWriteTextLayout_Release(layout);
2288 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f,
NULL,
2290 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2292 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2295 IDWriteTextLayout_Release(layout);
2300 m.m11 =
m.m22 = 2.0;
2301 m.m12 =
m.m21 =
m.dx =
m.dy = 0.0;
2302 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f, &
m,
2304 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2306 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2309 IDWriteTextLayout_Release(layout);
2314 m.m11 =
m.m22 = 2.0;
2315 m.m12 =
m.m21 =
m.dx =
m.dy = 0.0;
2316 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, 1.0f, &
m,
2318 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2320 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0, 0.0);
2323 IDWriteTextLayout_Release(layout);
2325 IDWriteInlineObject_Release(inlineobj);
2336 ok(
hr ==
S_OK,
"Failed to set reading direction, hr %#lx.\n",
hr);
2339 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0f, 0.0f);
2343 IDWriteTextLayout_Release(layout);
2345 IDWriteTextFormat_Release(
format);
2346 IDWriteFactory_Release(
factory);
2359 hr = IDWriteFactory_CreateTypography(
factory, &typography);
2364 hr = IDWriteTypography_AddFontFeature(typography,
feature);
2367 count = IDWriteTypography_GetFontFeatureCount(typography);
2373 hr = IDWriteTypography_AddFontFeature(typography,
feature);
2376 count = IDWriteTypography_GetFontFeatureCount(typography);
2380 hr = IDWriteTypography_GetFontFeature(typography, 0, &
feature);
2386 hr = IDWriteTypography_GetFontFeature(typography, 1, &
feature);
2391 hr = IDWriteTypography_GetFontFeature(typography, 2, &
feature);
2397 hr = IDWriteTypography_AddFontFeature(typography,
feature);
2400 count = IDWriteTypography_GetFontFeatureCount(typography);
2404 hr = IDWriteTypography_GetFontFeature(typography, 2, &
feature);
2409 IDWriteTypography_Release(typography);
2410 IDWriteFactory_Release(
factory);
2415 static const WCHAR str_white_spaceW[] = {
2416 0xc, 0xb, 0x2028, 0x2029,
2420 static const WCHAR str5W[] = {
'a',
'\r',
'b',
'\n',
'c',
'\n',
'\r',
'd',
'\r',
'\n',
'e',0xb,
'f',0xc,
2421 'g',0x0085,
'h',0x2028,
'i',0x2029,0xad,0xa,0};
2422 static const WCHAR str3W[] = {0x2066,
')',
')',0x661,
'(',0x627,
')',0};
2423 static const WCHAR str2W[] = {0x202a,0x202c,
'a',0};
2425 struct test_inline_obj *testinlineobj, *testinlineobj2, *testinlineobj3;
2430 IDWriteTextLayout1 *layout1;
2442 ok(!!testinlineobj,
"Failed to create test inline object.\n");
2444 ok(!!testinlineobj2,
"Failed to create test inline object.\n");
2446 ok(!!testinlineobj3,
"Failed to create test inline object.\n");
2452 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
2454 hr = IDWriteFactory_CreateTextLayout(
factory, str3W, 7,
format, 1000.0, 1000.0, &layout);
2456 hr = IDWriteTextLayout_GetClusterMetrics(layout,
NULL, 0, &
count);
2459 IDWriteTextLayout_Release(layout);
2461 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
2462 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2465 hr = IDWriteTextLayout_GetClusterMetrics(layout,
NULL, 0, &
count);
2480 if (IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout1, (
void**)&layout1) ==
S_OK) {
2485 leading =
trailing = min_advance = 2.0;
2486 hr = IDWriteTextLayout1_GetCharacterSpacing(layout1, 500, &leading, &
trailing,
2489 ok(leading == 0.0 &&
trailing == 0.0 && min_advance == 0.0,
2490 "got %.2f, %.2f, %.2f\n", leading,
trailing, min_advance);
2491 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
2493 leading =
trailing = min_advance = 2.0;
2494 hr = IDWriteTextLayout1_GetCharacterSpacing(layout1, 0, &leading, &
trailing,
2495 &min_advance,
NULL);
2497 ok(leading == 0.0 &&
trailing == 0.0 && min_advance == 0.0,
2498 "got %.2f, %.2f, %.2f\n", leading,
trailing, min_advance);
2500 r.startPosition = 0;
2502 hr = IDWriteTextLayout1_SetCharacterSpacing(layout1, 10.0, 15.0, 0.0,
r);
2506 hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics2,
ARRAY_SIZE(metrics2), &
count);
2517 r.startPosition = 0;
2519 hr = IDWriteTextLayout1_SetCharacterSpacing(layout1, 0.0, 0.0, 0.0,
r);
2523 r.startPosition = 0;
2525 hr = IDWriteTextLayout1_SetCharacterSpacing(layout1, 0.0, 0.0, -10.0,
r);
2528 IDWriteTextLayout1_Release(layout1);
2531 win_skip(
"IDWriteTextLayout1 is not supported, cluster spacing test skipped.\n");
2533 hr = IDWriteFactory_CreateEllipsisTrimmingSign(
factory,
format, &trimm);
2536 range.startPosition = 0;
2538 hr = IDWriteTextLayout_SetInlineObject(layout, trimm,
range);
2543 hr = IDWriteTextLayout_GetClusterMetrics(layout,
NULL, 0, &
count);
2549 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 1, &
count);
2554 hr = IDWriteInlineObject_GetMetrics(trimm, &inline_metrics);
2556 ok(inline_metrics.
width > 0.0 && inline_metrics.
width ==
metrics[0].width,
"got %.2f, expected %.2f\n",
2559 IDWriteTextLayout_Release(layout);
2562 hr = IDWriteFactory_CreateTextLayout(
factory, str2W, 3,
format, 1000.0, 1000.0, &layout);
2568 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 3, &
count);
2574 ok(
metrics[0].canWrapLineAfter == 0,
"got %d\n",
metrics[0].canWrapLineAfter);
2582 ok(
metrics[1].canWrapLineAfter == 0,
"got %d\n",
metrics[1].canWrapLineAfter);
2590 ok(
metrics[2].canWrapLineAfter == 1,
"got %d\n",
metrics[2].canWrapLineAfter);
2596 IDWriteTextLayout_Release(layout);
2599 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
2600 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2602 range.startPosition = 0;
2609 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 3, &
count);
2616 ok(
metrics[0].canWrapLineAfter == 1,
"got %d\n",
metrics[0].canWrapLineAfter);
2623 range.startPosition = 2;
2630 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 3, &
count);
2636 ok(
metrics[0].canWrapLineAfter == 0,
"got %d\n",
metrics[0].canWrapLineAfter);
2644 ok(
metrics[1].canWrapLineAfter == 1,
"got %d\n",
metrics[1].canWrapLineAfter);
2650 IDWriteTextLayout_Release(layout);
2653 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 0,
format, 1000.0f, 1000.0f, &layout);
2654 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2658 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 3, &
count);
2661 IDWriteTextLayout_Release(layout);
2664 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a ", 2,
format, 1000.0f, 1000.0f, &layout);
2665 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2669 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 2, &
count);
2673 ok(
metrics[0].canWrapLineAfter == 0,
"got %d\n",
metrics[0].canWrapLineAfter);
2675 ok(
metrics[1].canWrapLineAfter == 1,
"got %d\n",
metrics[1].canWrapLineAfter);
2676 IDWriteTextLayout_Release(layout);
2679 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a ", 2,
format, 1000.0f, 1000.0f, &layout);
2680 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2682 range.startPosition = 0;
2688 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 2, &
count);
2691 ok(
metrics[0].canWrapLineAfter == 1,
"got %d\n",
metrics[0].canWrapLineAfter);
2693 IDWriteTextLayout_Release(layout);
2696 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a ", 1,
format, 100.0f, 100.0f, &layout);
2697 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2701 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 1, &
count);
2706 IDWriteTextLayout_Release(layout);
2708 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"a ", 1,
format, 100.0f, 100.0f, 1.0f,
NULL,
2710 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2714 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 1, &
count);
2719 IDWriteTextLayout_Release(layout);
2767 IDWriteTextLayout_Release(layout);
2771 100.0f, 200.0f, &layout);
2776 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 20, &
count);
2787 IDWriteTextLayout_Release(layout);
2790 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 100.0f, 200.0f, &layout);
2791 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2795 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 4, &
count);
2799 hr = IDWriteTextLayout_GetMetrics(layout, &text_metrics);
2803 ok(
width < text_metrics.
width,
"unexpected trimming sign width\n");
2809 hr = IDWriteTextLayout_SetTrimming(layout, &trimming_options, trimm);
2812 hr = IDWriteTextLayout_SetMaxWidth(layout,
width);
2817 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 4, &
count);
2821 hr = IDWriteTextLayout_GetLineMetrics(layout, &
line, 1, &
count);
2824 ok(
line.length == 4,
"got %u\n",
line.length);
2825 ok(
line.isTrimmed,
"got %d\n",
line.isTrimmed);
2827 IDWriteTextLayout_Release(layout);
2833 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a b", 3,
format, 1000.0f, 200.0f, &layout);
2834 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2838 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 3, &
count);
2842 ok(
metrics[0].canWrapLineAfter == 0,
"got %d\n",
metrics[0].canWrapLineAfter);
2843 ok(
metrics[1].canWrapLineAfter == 1,
"got %d\n",
metrics[1].canWrapLineAfter);
2844 ok(
metrics[2].canWrapLineAfter == 1,
"got %d\n",
metrics[2].canWrapLineAfter);
2846 IDWriteTextLayout_Release(layout);
2849 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a b", 1,
format, 1000.0f, 200.0f, &layout);
2850 ok(
hr ==
S_OK,
"Failed to create layout, hr %#lx.\n",
hr);
2854 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 1, &
count);
2855 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
2856 ok(
count == 1,
"Unexpected cluster count %u.\n",
count);
2858 hr = IDWriteTextLayout_SetMaxWidth(layout,
metrics[0].
width / 2.0f);
2859 ok(
hr ==
S_OK,
"Failed to set layout width, hr %#lx.\n",
hr);
2864 hr = IDWriteTextLayout_SetTrimming(layout, &trimming_options, trimm);
2865 ok(
hr ==
S_OK,
"Failed to set trimming options, hr %#lx.\n",
hr);
2869 hr = IDWriteTextLayout_GetClusterMetrics(layout,
metrics, 1, &
count);
2870 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
2871 ok(
count == 1,
"Unexpected cluster count %u.\n",
count);
2873 hr = IDWriteTextLayout_GetLineMetrics(layout, &
line, 1, &
count);
2874 ok(
hr ==
S_OK,
"Failed to get line metrics, hr %#lx.\n",
hr);
2876 ok(
line.length == 1,
"Unexpected line length %u.\n",
line.length);
2877 ok(
line.isTrimmed,
"Unexpected trimming flag %x.\n",
line.isTrimmed);
2881 ok(
hr ==
S_OK,
"Draw() failed, hr %#lx.\n",
hr);
2884 IDWriteTextLayout_Release(layout);
2889 IDWriteInlineObject_Release(trimm);
2890 IDWriteTextFormat_Release(
format);
2891 IDWriteFactory_Release(
factory);
2908 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
2914 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
2915 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2917 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat, (
void**)&format2);
2920 hr = IDWriteTextFormat_GetLocaleName(format2, buffW,
ARRAY_SIZE(buffW));
2924 hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW,
ARRAY_SIZE(buffW),
NULL);
2928 IDWriteTextFormat_Release(format2);
2929 IDWriteTextLayout_Release(layout);
2930 IDWriteTextFormat_Release(
format);
2934 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
2936 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
2937 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
2939 range.startPosition = 0;
2941 hr = IDWriteTextLayout_SetLocaleName(layout,
L"en-us",
range);
2942 ok(
hr ==
S_OK,
"Failed to set locale name, hr %#lx.\n",
hr);
2944 hr = IDWriteTextLayout_SetLocaleName(layout,
NULL,
range);
2948 hr = IDWriteTextLayout_SetLocaleName(layout,
L"abcd",
range);
2949 ok(
hr ==
S_OK,
"Failed to set locale name, hr %#lx.\n",
hr);
2951 hr = IDWriteTextLayout_GetLocaleName(layout, 0,
NULL, 0,
NULL);
2955 hr = IDWriteTextLayout_GetLocaleName(layout, 0,
NULL, 1,
NULL);
2959 hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW,
ARRAY_SIZE(buffW), &
range);
2966 hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW, 1,
NULL);
2968 ok(buffW[0] == 0,
"got %x\n", buffW[0]);
2975 range.startPosition = 0;
2977 hr = IDWriteTextLayout_SetLocaleName(layout, buffW,
range);
2981 hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW,
ARRAY_SIZE(buffW),
NULL);
2986 range.startPosition = 0;
2988 hr = IDWriteTextLayout_SetLocaleName(layout,
L"eN-uS",
range);
2989 ok(
hr ==
S_OK,
"Failed to set locale name, hr %#lx.\n",
hr);
2993 hr = IDWriteTextLayout_GetLocaleName(layout, 0, buffW,
ARRAY_SIZE(buffW), &
range);
3002 hr = IDWriteTextLayout_GetLocaleName(layout, 100, buffW,
ARRAY_SIZE(buffW), &
range);
3008 IDWriteTextLayout_Release(layout);
3009 IDWriteTextFormat_Release(
format);
3010 IDWriteFactory_Release(
factory);
3015 static const WCHAR strW[] = {
'a',
'e',0x0300,
'd',0};
3017 IDWriteTextLayout1 *layout1;
3030 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3034 IDWriteTextFormat_Release(
format);
3036 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout1, (
void**)&layout1);
3037 IDWriteTextLayout_Release(layout);
3040 win_skip(
"SetPairKerning() is not supported.\n");
3041 IDWriteFactory_Release(
factory);
3046 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0,
NULL,
NULL);
3047 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0,
NULL, &
range);
3050 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &
kerning,
NULL);
3053 range.startPosition = 0;
3056 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &
kerning, &
range);
3062 hr = IDWriteTextLayout1_GetClusterMetrics(layout1, clusters, 4, &
count);
3071 range.startPosition = 0;
3073 hr = IDWriteTextLayout1_SetPairKerning(layout1, 2,
range);
3077 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &
kerning, &
range);
3082 hr = IDWriteTextLayout1_GetClusterMetrics(layout1, clusters, 4, &
count);
3090 IDWriteTextLayout1_Release(layout1);
3091 IDWriteFactory_Release(
factory);
3108 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3110 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3111 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3112 IDWriteTextFormat_Release(
format);
3114 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout2, (
void**)&layout2);
3115 IDWriteTextLayout_Release(layout);
3118 win_skip(
"SetVerticalGlyphOrientation() is not supported.\n");
3119 IDWriteFactory_Release(
factory);
3123 orientation = IDWriteTextLayout2_GetVerticalGlyphOrientation(layout2);
3129 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (
void **)&format1);
3132 orientation = IDWriteTextFormat1_GetVerticalGlyphOrientation(format1);
3138 orientation = IDWriteTextLayout2_GetVerticalGlyphOrientation(layout2);
3141 orientation = IDWriteTextFormat1_GetVerticalGlyphOrientation(format1);
3147 orientation = IDWriteTextLayout2_GetVerticalGlyphOrientation(layout2);
3150 IDWriteTextFormat1_Release(format1);
3152 IDWriteTextLayout2_Release(layout2);
3153 IDWriteFactory_Release(
factory);
3158 struct minwidth_test {
3160 const WCHAR mintext[10];
3161 } minwidth_tests[] = {
3162 { {
' ',
'a',
'b',
' ',0}, {
'a',
'b',0} },
3163 { {
'a',
'\n',
' ',
' ',0}, {
'a',0} },
3164 { {
'a',
'\n',
' ',
' ',
'b',0}, {
'b',0} },
3165 { {
'a',
'b',
'c',
'\n',
' ',
' ',
'b',0}, {
'a',
'b',
'c',0} },
3179 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3181 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3182 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3184 hr = IDWriteTextLayout_DetermineMinWidth(layout,
NULL);
3186 IDWriteTextLayout_Release(layout);
3189 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 0,
format, 100.0f, 100.0f, &layout);
3190 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3193 hr = IDWriteTextLayout_DetermineMinWidth(layout, &minwidth);
3195 ok(minwidth == 0.0f,
"got %f\n", minwidth);
3196 IDWriteTextLayout_Release(layout);
3202 hr = IDWriteFactory_CreateTextLayout(
factory, minwidth_tests[
i].mintext,
lstrlenW(minwidth_tests[
i].mintext),
format, 1000.0f, 1000.0f, &layout);
3211 IDWriteTextLayout_Release(layout);
3217 hr = IDWriteTextLayout_DetermineMinWidth(layout, &minwidth);
3219 ok(minwidth ==
width,
"test %u: expected width %f, got %f\n",
i,
width, minwidth);
3221 IDWriteTextLayout_Release(layout);
3224 IDWriteTextFormat_Release(
format);
3225 IDWriteFactory_Release(
factory);
3241 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3243 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3244 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3247 r.startPosition = 1;
3249 hr = IDWriteTextLayout_SetFontSize(layout, -15.0,
r);
3252 hr = IDWriteTextLayout_SetFontSize(layout, 0.0,
r);
3255 r.startPosition = 1;
3258 hr = IDWriteTextLayout_GetFontSize(layout, 0, &
size, &
r);
3260 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
3263 r.startPosition = 1;
3265 hr = IDWriteTextLayout_SetFontSize(layout, 15.0,
r);
3269 r.startPosition = 1;
3271 hr = IDWriteTextLayout_SetFontSize(layout, 123.0,
r);
3275 hr = IDWriteTextLayout_GetFontSize(layout, 1, &
size, &
r);
3279 r.startPosition = 0;
3281 hr = IDWriteTextLayout_SetFontSize(layout, 15.0,
r);
3285 hr = IDWriteTextLayout_GetFontSize(layout, 1, &
size, &
r);
3290 hr = IDWriteTextLayout_GetFontSize(layout, 0, &
size, &
r);
3292 ok(
r.startPosition == 0 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3296 r.startPosition =
r.length = 0;
3297 hr = IDWriteTextLayout_GetFontSize(layout, 20, &
size, &
r);
3299 ok(
r.startPosition == 4 &&
r.length == ~0
u-4,
"got %u, %u\n",
r.startPosition,
r.length);
3302 r.startPosition = 100;
3304 hr = IDWriteTextLayout_SetFontSize(layout, 25.0,
r);
3308 r.startPosition =
r.length = 0;
3309 hr = IDWriteTextLayout_GetFontSize(layout, 100, &
size, &
r);
3311 ok(
r.startPosition == 100 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3314 IDWriteTextLayout_Release(layout);
3315 IDWriteTextFormat_Release(
format);
3316 IDWriteFactory_Release(
factory);
3332 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3334 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3335 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3338 r.startPosition = 1;
3340 hr = IDWriteTextLayout_SetFontFamilyName(layout,
NULL,
r);
3343 r.startPosition = 1;
3348 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
3351 r.startPosition = 1;
3353 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"TaHoma",
r);
3357 r.startPosition = 1;
3359 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"Arial",
r);
3362 r.startPosition = 0;
3368 ok(
r.startPosition == 1 &&
r.length == 1,
"got %u, %u\n",
r.startPosition,
r.length);
3370 r.startPosition = 1;
3372 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"Arial",
r);
3375 r.startPosition = 1;
3379 ok(
r.startPosition == 1 &&
r.length == 1,
"got %u, %u\n",
r.startPosition,
r.length);
3381 r.startPosition = 0;
3383 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"Arial",
r);
3389 ok(
r.startPosition == 0 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3392 IDWriteTextLayout_Release(layout);
3393 IDWriteTextFormat_Release(
format);
3394 IDWriteFactory_Release(
factory);
3410 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3412 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3413 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3416 r.startPosition = 1;
3421 r.startPosition = 1;
3423 hr = IDWriteTextLayout_GetFontStyle(layout, 0, &
style, &
r);
3425 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
3428 r.startPosition = 1;
3434 r.startPosition = 1;
3440 hr = IDWriteTextLayout_GetFontStyle(layout, 1, &
style, &
r);
3444 r.startPosition = 0;
3450 hr = IDWriteTextLayout_GetFontStyle(layout, 1, &
style, &
r);
3455 hr = IDWriteTextLayout_GetFontStyle(layout, 0, &
style, &
r);
3457 ok(
r.startPosition == 0 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3461 r.startPosition =
r.length = 0;
3462 hr = IDWriteTextLayout_GetFontStyle(layout, 20, &
style, &
r);
3464 ok(
r.startPosition == 4 &&
r.length == ~0
u-4,
"got %u, %u\n",
r.startPosition,
r.length);
3467 r.startPosition = 100;
3473 r.startPosition =
r.length = 0;
3474 hr = IDWriteTextLayout_GetFontStyle(layout, 100, &
style, &
r);
3476 ok(
r.startPosition == 100 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3479 IDWriteTextLayout_Release(layout);
3480 IDWriteTextFormat_Release(
format);
3481 IDWriteFactory_Release(
factory);
3497 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3499 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3500 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3503 r.startPosition = 1;
3508 r.startPosition = 1;
3511 hr = IDWriteTextLayout_GetFontStretch(layout, 0, &stretch, &
r);
3513 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
3516 r.startPosition = 1;
3522 r.startPosition = 1;
3528 hr = IDWriteTextLayout_GetFontStretch(layout, 1, &stretch, &
r);
3532 r.startPosition = 0;
3538 hr = IDWriteTextLayout_GetFontStretch(layout, 1, &stretch, &
r);
3543 hr = IDWriteTextLayout_GetFontStretch(layout, 0, &stretch, &
r);
3545 ok(
r.startPosition == 0 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3549 r.startPosition =
r.length = 0;
3550 hr = IDWriteTextLayout_GetFontStretch(layout, 20, &stretch, &
r);
3552 ok(
r.startPosition == 4 &&
r.length == ~0
u-4,
"got %u, %u\n",
r.startPosition,
r.length);
3555 r.startPosition = 100;
3561 r.startPosition =
r.length = 0;
3562 hr = IDWriteTextLayout_GetFontStretch(layout, 100, &stretch, &
r);
3564 ok(
r.startPosition == 100 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3568 r.startPosition = 0;
3573 IDWriteTextLayout_Release(layout);
3574 IDWriteTextFormat_Release(
format);
3575 IDWriteFactory_Release(
factory);
3591 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3593 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
3594 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3596 r.startPosition = 1;
3599 hr = IDWriteTextLayout_GetStrikethrough(layout, 0, &
value, &
r);
3601 ok(
r.startPosition == 0 &&
r.length == ~0
u,
"got %u, %u\n",
r.startPosition,
r.length);
3604 r.startPosition = 1;
3606 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
r);
3610 hr = IDWriteTextLayout_GetStrikethrough(layout, 1, &
value, &
r);
3613 ok(
r.startPosition == 1 &&
r.length == 1,
"got %u, %u\n",
r.startPosition,
r.length);
3616 r.startPosition =
r.length = 0;
3617 hr = IDWriteTextLayout_GetStrikethrough(layout, 20, &
value, &
r);
3619 ok(
r.startPosition == 2 &&
r.length == ~0
u-2,
"got %u, %u\n",
r.startPosition,
r.length);
3622 r.startPosition = 100;
3624 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
r);
3628 r.startPosition =
r.length = 0;
3629 hr = IDWriteTextLayout_GetStrikethrough(layout, 100, &
value, &
r);
3631 ok(
r.startPosition == 100 &&
r.length == 4,
"got %u, %u\n",
r.startPosition,
r.length);
3634 IDWriteTextLayout_Release(layout);
3635 IDWriteTextFormat_Release(
format);
3636 IDWriteFactory_Release(
factory);
3641 static const WCHAR str2W[] = {0x2066,
')',
')',0x661,
'(',0x627,
')',0};
3655 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3657 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 500.0f, 1000.0f, &layout);
3658 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3661 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &
count);
3668 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
3673 ok(
metrics.widthIncludingTrailingWhitespace ==
width,
"got %.2f, expected %.2f\n",
3678 ok(
metrics.maxBidiReorderingDepth == 1,
"got %u\n",
metrics.maxBidiReorderingDepth);
3681 IDWriteTextLayout_Release(layout);
3684 hr = IDWriteFactory_CreateTextLayout(
factory, str2W, 7,
format, 500.0, 1000.0, &layout);
3688 metrics.maxBidiReorderingDepth = 0;
3689 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
3694 ok(
metrics.widthIncludingTrailingWhitespace > 0.0,
"got %.2f\n",
metrics.widthIncludingTrailingWhitespace);
3699 ok(
metrics.maxBidiReorderingDepth > 1,
"got %u\n",
metrics.maxBidiReorderingDepth);
3702 IDWriteTextLayout_Release(layout);
3705 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 1000.0f, &layout);
3706 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3709 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 1, &
count);
3714 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
3719 ok(
metrics.widthIncludingTrailingWhitespace == clusters[0].
width,
"got %.2f\n",
metrics.widthIncludingTrailingWhitespace);
3723 ok(
metrics.maxBidiReorderingDepth == 1,
"got %u\n",
metrics.maxBidiReorderingDepth);
3725 IDWriteTextLayout_Release(layout);
3728 hr = IDWriteFactory_CreateTextLayout(
factory,
L" ", 1,
format, 500.0f, 1000.0f, &layout);
3729 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3732 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
3733 ok(
hr ==
S_OK,
"Failed to get layout metrics, hr %#lx.\n",
hr);
3737 ok(
metrics.widthIncludingTrailingWhitespace > 0.0f,
"Unexpected full width %f.\n",
3738 metrics.widthIncludingTrailingWhitespace);
3740 ok(
metrics.layoutWidth == 500.0,
"Unexpected box width %f.\n",
metrics.layoutWidth);
3741 ok(
metrics.layoutHeight == 1000.0,
"Unexpected box height %f.\n",
metrics.layoutHeight);
3742 ok(
metrics.maxBidiReorderingDepth == 1,
"Unexpected reordering depth %u.\n",
metrics.maxBidiReorderingDepth);
3743 ok(
metrics.lineCount == 1,
"Unexpected line count %u.\n",
metrics.lineCount);
3744 IDWriteTextLayout_Release(layout);
3746 IDWriteTextFormat_Release(
format);
3747 IDWriteFactory_Release(
factory);
3763 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3765 flow = IDWriteTextFormat_GetFlowDirection(
format);
3768 reading = IDWriteTextFormat_GetReadingDirection(
format);
3771 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 500.0f, 1000.0f, &layout);
3772 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3773 IDWriteTextLayout_Release(layout);
3779 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 500.0f, 1000.0f, &layout);
3780 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3781 IDWriteTextLayout_Release(layout);
3789 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 500.0f, 1000.0f, &layout);
3790 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3791 IDWriteTextLayout_Release(layout);
3794 win_skip(
"DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT is not supported\n");
3796 IDWriteTextFormat_Release(
format);
3797 IDWriteFactory_Release(
factory);
3801 {
DRAW_GLYPHRUN|
DRAW_EFFECT, {
'a',
'e',0x0300,0}, {
'e',
'n',
'-',
'u',
's',0}, 2 },
3802 {
DRAW_GLYPHRUN, {
'd',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
3807 {
DRAW_GLYPHRUN|
DRAW_EFFECT, {
'a',
'e',0}, {
'e',
'n',
'-',
'u',
's',0}, 2 },
3808 {
DRAW_GLYPHRUN, {
'c',
'd',0}, {
'e',
'n',
'-',
'u',
's',0}, 2 },
3824 static const WCHAR strW[] = {
'a',
'e',0x0300,
'd',0};
3840 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3847 r.startPosition = 100;
3849 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3852 r.startPosition =
r.length = 0;
3853 hr = IDWriteTextLayout_GetDrawingEffect(layout, 101, &unk, &
r);
3855 ok(
r.startPosition == 100 &&
r.length == 10,
"got %u, %u\n",
r.startPosition,
r.length);
3856 IUnknown_Release(unk);
3858 r.startPosition =
r.length = 0;
3859 unk = (
void*)0xdeadbeef;
3860 hr = IDWriteTextLayout_GetDrawingEffect(layout, 1000, &unk, &
r);
3862 ok(
r.startPosition == 110 &&
r.length == ~0
u-110,
"got %u, %u\n",
r.startPosition,
r.length);
3863 ok(unk ==
NULL,
"got %p\n", unk);
3866 r.startPosition = 0;
3868 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3875 IDWriteTextLayout_Release(layout);
3878 hr = IDWriteFactory_CreateTextLayout(
factory,
L"aecd", 4,
format, 500.0f, 1000.0f, &layout);
3879 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3881 r.startPosition = 0;
3883 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3890 IDWriteTextLayout_Release(layout);
3896 hr = IDWriteFactory_CreateTextLayout(
factory,
L"aecd", 4,
format, 500.0f, 1000.0f, &layout);
3897 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
3899 r.startPosition = 0;
3901 hr = IDWriteTextLayout_SetInlineObject(layout,
sign,
r);
3904 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3913 hr = IDWriteTextLayout_SetDrawingEffect(layout,
NULL,
r);
3916 r.startPosition = 1;
3918 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3927 r.startPosition = 0;
3929 hr = IDWriteTextLayout_SetDrawingEffect(layout,
NULL,
r);
3932 r.startPosition = 0;
3934 hr = IDWriteTextLayout_SetDrawingEffect(layout, effect,
r);
3943 IDWriteTextLayout_Release(layout);
3945 ref = IUnknown_Release(effect);
3946 ok(
ref == 0,
"Unexpected effect refcount %lu\n",
ref);
3947 IDWriteInlineObject_Release(
sign);
3948 IDWriteTextFormat_Release(
format);
3949 IDWriteFactory_Release(
factory);
3958 hr = IDWriteLocalizedStrings_FindLocaleName(
strings,
L"en-us", &
index, &exists);
3973 static const WCHAR str3W[] = {
'a',
'\r',
'b',
'\n',
'c',
'\n',
'\r',
'd',
'\r',
'\n',0};
3974 static const WCHAR strW[] = {
'a',
'b',
'c',
'd',
' ',0};
3975 static const WCHAR str2W[] = {
'a',
'b',
'\r',
'c',
'd',0};
3976 static const WCHAR str4W[] = {
'a',
'\r',0};
3993 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
3999 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics, 0, &
count);
4004 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics, 1, &
count);
4012 IDWriteTextLayout_Release(layout);
4013 IDWriteTextFormat_Release(
format);
4016 hr = IDWriteFactory_GetSystemFontCollection(
factory, &syscollection,
FALSE);
4018 familycount = IDWriteFontCollection_GetFontFamilyCount(syscollection);
4020 for (
i = 0;
i < familycount;
i++) {
4029 hr = IDWriteFontCollection_GetFontFamily(syscollection,
i, &family);
4036 hr = IDWriteFont_CreateFontFace(
font, &fontface);
4039 hr = IDWriteFontFamily_GetFamilyNames(family, &
names);
4051 hr = IDWriteFontFace_GetFiles(fontface, &
count, &
file);
4057 hr = IDWriteFontFileLoader_QueryInterface(
loader, &IID_IDWriteLocalFontFileLoader, (
void**)&localloader);
4059 IDWriteFontFileLoader_Release(
loader);
4061 hr = IDWriteFontFile_GetReferenceKey(
file, &
key, &keysize);
4069 IDWriteLocalFontFileLoader_Release(localloader);
4070 IDWriteFontFile_Release(
file);
4073 IDWriteLocalizedStrings_Release(
names);
4074 IDWriteFont_Release(
font);
4079 IDWriteFontFace_GetMetrics(fontface, &fontmetrics);
4082 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4084 hr = IDWriteFactory_CreateTextLayout(
factory,
L"", 1,
format, 30000.0f, 100.0f, &layout);
4085 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4102 IDWriteTextLayout_Release(layout);
4104 IDWriteTextFormat_Release(
format);
4105 IDWriteFontFace_Release(fontface);
4106 IDWriteFontFamily_Release(family);
4108 IDWriteFontCollection_Release(syscollection);
4112 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4115 ok(fontface !=
NULL,
"got %p\n", fontface);
4118 hr = IDWriteFactory_CreateTextLayout(
factory, str2W, 5,
format, 10000.0, 1000.0, &layout);
4130 IDWriteTextLayout_Release(layout);
4131 IDWriteTextFormat_Release(
format);
4136 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4138 hr = IDWriteFactory_CreateTextLayout(
factory, str3W, 10,
format, 100.0, 300.0, &layout);
4168 IDWriteTextLayout_Release(layout);
4176 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics, 1, &
count);
4187 range.startPosition = 0;
4189 hr = IDWriteTextLayout_SetFontSize(layout, 80.0f,
range);
4193 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics + 1, 1, &
count);
4200 hr = IDWriteTextLayout_SetFontSize(layout, 12.0f,
range);
4203 range.startPosition = 1;
4205 hr = IDWriteTextLayout_SetFontSize(layout, 80.0f,
range);
4210 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics + 1, 1, &
count);
4216 IDWriteTextLayout_Release(layout);
4219 hr = IDWriteFactory_CreateTextLayout(
factory, str4W, 2,
format, 100.0f, 300.0f, &layout);
4236 range.startPosition = 1;
4238 hr = IDWriteTextLayout_SetFontSize(layout, 80.0f,
range);
4241 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics + 2, 2, &
count);
4248 hr = IDWriteTextLayout_SetFontSize(layout, 12.0f,
range);
4250 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics + 2, 2, &
count);
4269 IDWriteTextLayout_Release(layout);
4274 hr = IDWriteFactory_CreateTextLayout(
factory, str4W, 1,
format, 100.0f, 300.0f, &layout);
4275 ok(
hr ==
S_OK,
"Failed to create layout, hr %#lx.\n",
hr);
4278 ok(
hr ==
S_OK,
"Failed to get line metrics, hr %#lx.\n",
hr);
4283 ok(
hr ==
S_OK,
"Failed to set spacing method, hr %#lx.\n",
hr);
4285 hr = IDWriteTextLayout_GetLineMetrics(layout,
metrics + 1, 1, &
count);
4286 ok(
hr ==
S_OK,
"Failed to get line metrics, hr %#lx.\n",
hr);
4293 IDWriteTextLayout_Release(layout);
4296 win_skip(
"Proportional spacing is not supported.\n");
4298 IDWriteTextFormat_Release(
format);
4299 IDWriteFontFace_Release(fontface);
4300 IDWriteFactory_Release(
factory);
4305 static const WCHAR stringsW[][10] = {
4324 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4326 v = IDWriteTextFormat_GetTextAlignment(
format);
4329 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f, &layout);
4330 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4332 v = IDWriteTextLayout_GetTextAlignment(layout);
4341 v = IDWriteTextFormat_GetTextAlignment(
format);
4344 v = IDWriteTextLayout_GetTextAlignment(layout);
4347 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat1, (
void**)&format1);
4352 v = IDWriteTextFormat_GetTextAlignment(
format);
4355 v = IDWriteTextLayout_GetTextAlignment(layout);
4358 v = IDWriteTextFormat1_GetTextAlignment(format1);
4361 IDWriteTextFormat1_Release(format1);
4364 win_skip(
"IDWriteTextFormat1 is not supported\n");
4366 IDWriteTextLayout_Release(layout);
4381 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters,
ARRAY_SIZE(clusters), &
count);
4396 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4408 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4415 IDWriteTextLayout_Release(layout);
4424 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4431 IDWriteTextLayout_Release(layout);
4433 if (stringsW[
i][0]) {
4440 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4445 IDWriteTextLayout_Release(layout);
4455 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4461 IDWriteTextLayout_Release(layout);
4464 IDWriteTextFormat_Release(
format);
4465 IDWriteFactory_Release(
factory);
4483 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4485 v = IDWriteTextFormat_GetParagraphAlignment(
format);
4488 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f, &layout);
4489 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4491 v = IDWriteTextLayout_GetParagraphAlignment(layout);
4500 v = IDWriteTextFormat_GetParagraphAlignment(
format);
4503 v = IDWriteTextLayout_GetParagraphAlignment(layout);
4509 v = IDWriteTextLayout_GetParagraphAlignment(layout);
4513 hr = IDWriteTextLayout_GetLineMetrics(layout,
lines, 1, &
count);
4521 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4533 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4540 IDWriteTextLayout_Release(layout);
4546 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f, &layout);
4547 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4549 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4555 IDWriteTextLayout_Release(layout);
4557 IDWriteTextFormat_Release(
format);
4558 IDWriteFactory_Release(
factory);
4577 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4579 v = IDWriteTextFormat_GetReadingDirection(
format);
4582 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f, &layout);
4583 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4585 v = IDWriteTextLayout_GetReadingDirection(layout);
4588 v = IDWriteTextFormat_GetReadingDirection(
format);
4595 hr = IDWriteTextLayout_GetLineMetrics(layout,
lines, 1, &
count);
4600 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 1, &
count);
4605 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4620 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4635 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
4646 IDWriteTextLayout_Release(layout);
4648 IDWriteTextFormat_Release(
format);
4649 IDWriteFactory_Release(
factory);
4663 if ((ppdip <= 0.0) ||
4664 (
m->m11 *
m->m22 != 0.0 && (
m->m12 != 0.0 ||
m->m21 != 0.0)) ||
4665 (
m->m12 *
m->m21 != 0.0 && (
m->m11 != 0.0 ||
m->m22 != 0.0)))
4668 det =
m->m11 *
m->m22 -
m->m12 *
m->m21;
4684 vec[1] = (-
m->m12 *
vec2[0] +
m->m11 *
vec2[1] - (
m->m11 *
m->dy -
m->m12 *
m->dx)) / det;
4694 int x = *(
int *)&
left;
4702 return abs(
x -
y) <= 16;
4711 { { 0.0, 1.0, 2.0, 0.0, 0.2, 0.3 }, 1.0 },
4712 { { 0.0, 1.0, 2.0, 0.0, 0.0, 0.0 }, 1.0 },
4713 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, 1.0 },
4714 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, 0.9 },
4715 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, -1.0 },
4716 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, 0.0 },
4717 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.3 }, 1.0 },
4718 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, 10.0 },
4719 { { 1.0, 0.0, 0.0, 10.0, 0.0, 0.0 }, 10.0 },
4720 { { 0.0, 1.0, 1.0, 0.0, 0.2, 0.6 }, 1.0 },
4721 { { 0.0, 2.0, 2.0, 0.0, 0.2, 0.6 }, 1.0 },
4722 { { 0.0, 0.5, -0.5, 0.0, 0.2, 0.6 }, 1.0 },
4723 { { 1.0, 2.0, 0.0, 1.0, 0.2, 0.6 }, 1.0 },
4724 { { 1.0, 1.0, 0.0, 1.0, 0.2, 0.6 }, 1.0 },
4725 { { 0.5, 0.5, -0.5, 0.5, 0.2, 0.6 }, 1.0 },
4726 { { 0.5, 0.5, -0.5, 0.5, 0.0, 0.0 }, 100.0 },
4727 { { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, 100.0 },
4728 { { 0.0, 1.0, -1.0, 0.0, 0.2, 0.6 }, 1.0 },
4729 { { -1.0, 0.0, 0.0, -1.0, 0.2, 0.6 }, 1.0 },
4730 { { 0.0, -1.0, 1.0, 0.0, 0.2, 0.6 }, 1.0 },
4731 { { 1.0, 0.0, 0.0, 1.0,-0.1, 0.2 }, 1.0 },
4732 { { 0.0, 1.0, -1.0, 0.0,-0.2,-0.3 }, 1.0 },
4733 { { -1.0, 0.0, 0.0, -1.0,-0.3,-1.6 }, 1.0 },
4734 { { 0.0, -1.0, 1.0, 0.0,-0.7, 0.6 }, 10.0 },
4735 { { 0.0, 2.0, 1.0, 0.0, 0.2, 0.6 }, 1.0 },
4736 { { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }, 1.0 },
4737 { { 3.0, 0.0, 0.0, 5.0, 0.2,-0.3 }, 10.0 },
4738 { { 0.0, -3.0, 5.0, 0.0,-0.1, 0.7 }, 10.0 },
4742 { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 },
4743 { 1.0, 0.0, 0.0, 1.0, 0.2, 0.3 },
4744 { 2.0, 0.0, 0.0, 2.0, 0.2, 0.3 },
4745 { 2.0, 1.0, 2.0, 2.0, 0.2, 0.3 },
4764 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4767 IDWriteFontFace_GetMetrics(fontface, &
metrics);
4769 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f, &layout);
4770 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
4777 memset(&ctxt.
m, 0,
sizeof(ctxt.
m));
4801 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, originX, 0.0);
4802 ok(
hr ==
S_OK,
"%d: unexpected hr %#lx.\n",
i,
hr);
4803 ok(ctxt.
originX == originX,
"%d: got %f, originX %f\n",
i, ctxt.
originX, originX);
4810 hr = IDWriteFactory_CreateGdiCompatibleTextLayout(
factory,
L"a", 1,
format, 500.0f, 100.0f,
4812 ok(
hr ==
S_OK,
"%d: failed to create text layout, hr %#lx.\n",
i,
hr);
4815 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, originX, 0.0);
4816 ok(
hr ==
S_OK,
"%d: unexpected hr %#lx.\n",
i,
hr);
4817 ok(ctxt.
originX == originX,
"%d: got %f, originX %f\n",
i, ctxt.
originX, originX);
4821 IDWriteTextLayout_Release(layout2);
4825 IDWriteTextLayout_Release(layout);
4826 IDWriteTextFormat_Release(
format);
4827 IDWriteFontFace_Release(fontface);
4828 IDWriteFactory_Release(
factory);
4833 static const WCHAR strW[] = {
'a',
' ',
's',
'o',
'm',
'e',
' ',
't',
'e',
'x',
't',
' ',
'a',
'n',
'd',
4834 ' ',
'a',
' ',
'b',
'i',
't',
' ',
'm',
'o',
'r',
'e',
'\n',
'b'};
4846 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
4848 v = IDWriteTextFormat_GetWordWrapping(
format);
4854 v = IDWriteTextLayout_GetWordWrapping(layout);
4863 v = IDWriteTextFormat_GetWordWrapping(
format);
4871 hr = IDWriteTextLayout_GetLineMetrics(layout,
NULL, 0, &
count);
4879 hr = IDWriteTextLayout_GetLineMetrics(layout,
NULL, 0, &
count);
4883 IDWriteTextLayout_Release(layout);
4884 IDWriteTextFormat_Release(
format);
4885 IDWriteFactory_Release(
factory);
4895 IDWriteFontCollection_AddRef(iface);
4915 ok(0,
"unexpected call\n");
4921 if (
index == 123456)
4928 hr = IDWriteFactory_GetSystemFontCollection(
factory, &syscollection,
FALSE);
4931 hr = IDWriteFontCollection_FindFamilyName(syscollection,
L"Tahoma", &
index, &exists);
4934 hr = IDWriteFontCollection_GetFontFamily(syscollection,
index, family);
4937 IDWriteFontCollection_Release(syscollection);
4938 IDWriteFactory_Release(
factory);
4942 ok(0,
"unexpected call\n");
4959 ok(0,
"unexpected call\n");
4983 hr = IDWriteFont_GetFontFamily(
font, &family);
4986 hr = IDWriteFontFamily_GetFamilyNames(family, &
names);
4989 hr = IDWriteLocalizedStrings_FindLocaleName(
names,
L"en-us", &
index, &exists);
4995 IDWriteLocalizedStrings_Release(
names);
4996 IDWriteFontFamily_Release(family);
5004 UINT32 U = (
C >> 16) & ((1 << 5) - 1);
5007 **
ptr = 0xD800 | (W << 6) | X >> 10; *
ptr += 1;
5008 **
ptr = (
WCHAR)(0xDC00 | (
X & ((1 << 10) - 1))); *
ptr += 1;
5018 static const WCHAR str2W[] = {
'a',0x3058,
'b',0};
5019 static const UINT32 variation_selectors[] =
5021 0x180b, 0x180c, 0x180d,
5023 0xfe00, 0xfe01, 0xfe02, 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07,
5024 0xfe08, 0xfe09, 0xfe0a, 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f,
5026 0xe0100, 0xe0121, 0xe01ef,
5032 UINT32 mappedlength, vs_length;
5048 win_skip(
"MapCharacters() is not supported.\n");
5053 hr = IDWriteFactory2_GetSystemFontFallback(factory2, &fallback);
5055 ok(fallback !=
NULL,
"got %p\n", fallback);
5059 font = (
void*)0xdeadbeef;
5063 ok(mappedlength == 0,
"got %u\n", mappedlength);
5071 font = (
void*)0xdeadbeef;
5075 ok(mappedlength == 0,
"got %u\n", mappedlength);
5086 ok(mappedlength == 1,
"got %u\n", mappedlength);
5090 IDWriteFont_Release(
font);
5100 ok(mappedlength == 3,
"got %u\n", mappedlength);
5105 IDWriteFont_Release(
font);
5115 ok(mappedlength == 1,
"got %u\n", mappedlength);
5119 IDWriteFont_Release(
font);
5128 ok(mappedlength == 1,
"Unexpected length %u.\n", mappedlength);
5132 IDWriteFont_Release(
font);
5143 ok(mappedlength == 1,
"got %u\n", mappedlength);
5149 ok(
hr ==
S_OK && exists,
"Unexpected hr %#lx, exists %d.\n",
hr, exists);
5153 IDWriteLocalizedStrings_Release(
strings);
5154 IDWriteFont_Release(
font);
5164 ok(mappedlength == 1,
"got %u\n", mappedlength);
5172 ok(
hr ==
S_OK && exists,
"Unexpected hr %#lx, exists %d.\n",
hr, exists);
5176 IDWriteLocalizedStrings_Release(
strings);
5177 IDWriteFont_Release(
font);
5184 hr = IDWriteFactory2_RegisterFontFileLoader(factory2, resource_loader);
5190 ok(!!hrsrc,
"Failed to find font resource\n");
5200 vs_length = variation_selectors[
i] > 0xffff ? 2 : 1;
5216 ok(mappedlength == vs_length + 1,
"Unexpected mapped length %u.\n", mappedlength);
5219 IDWriteFont_Release(
font);
5228 ok(mappedlength == vs_length,
"Unexpected mapped length %u.\n", mappedlength);
5229 if (variation_selectors[
i] < 0xfe00)
5232 if (
font) IDWriteFont_Release(
font);
5237 ok(!
font,
"Unexpected font instance.\n");
5241 if (variation_selectors[
i] >= 0xfe00)
5248 font = (
void *)0xdeadbeef;
5252 ok(mappedlength == vs_length * 2,
"Unexpected mapped length %u.\n", mappedlength);
5253 ok(!
font,
"Unexpected font instance.\n");
5258 ok(mappedlength == vs_length * 2,
"Unexpected mapped length %u.\n", mappedlength);
5259 ok(!
font,
"Unexpected font instance.\n");
5267 font = (
void *)0xdeadbeef;
5271 ok(mappedlength == vs_length + 1,
"Unexpected mapped length %u.\n", mappedlength);
5274 IDWriteFont_Release(
font);
5283 hr = IDWriteFactory2_UnregisterFontFileLoader(factory2, resource_loader);
5287 IDWriteFontFileLoader_Release(resource_loader);
5289 IDWriteFontFallback_Release(fallback);
5290 IDWriteFactory2_Release(factory2);
5308 static const struct fallback_test
5315 { { 0x25d4, 0},
L"Segoe UI Symbol;Meiryo UI" },
5328 win_skip(
"System font fallback API is not supported.\n");
5332 hr = IDWriteFactory2_GetSystemFontFallback(
factory, &fallback);
5343 if (
hr !=
S_OK)
continue;
5346 if (!
font)
continue;
5357 IDWriteFont_Release(
font);
5360 IDWriteFontFallback_Release(fallback);
5361 IDWriteFactory2_Release(
factory);
5372 const WCHAR *familyW;
5381 hr = IDWriteFactory_QueryInterface(
factory, &IID_IDWriteFactory2, (
void**)&factory2);
5382 IDWriteFactory_Release(
factory);
5385 win_skip(
"IDWriteFontFallbackBuilder is not supported\n");
5390 hr = IDWriteFactory2_CreateFontFallbackBuilder(factory2, &builder);
5396 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
5402 IDWriteFontFallback_AddRef(fallback);
5406 IDWriteFontFallback_Release(fallback);
5409 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback2);
5410 ok(
hr ==
S_OK,
"Failed to create fallback object, hr %#lx.\n",
hr);
5411 ok(fallback != fallback2,
"Unexpected fallback instance.\n");
5412 IDWriteFontFallback_Release(fallback2);
5425 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 0, &familyW, 1,
NULL,
NULL,
NULL, 1.0f);
5428 hr = IDWriteFontFallbackBuilder_AddMapping(builder,
NULL, 0, &familyW, 1,
NULL,
NULL,
NULL, 1.0f);
5434 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, -1.0f);
5437 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, 0.0f);
5443 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, 1.0f);
5447 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, 2.0f);
5451 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, 3.0f);
5456 hr = IDWriteFontFallbackBuilder_AddMapping(builder, &
range, 1, &familyW, 1,
NULL,
NULL,
NULL, 4.0f);
5459 IDWriteFontFallback_Release(fallback);
5462 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder,
NULL);
5464 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
5471 font = (
void*)0xdeadbeef;
5475 ok(mappedlength == 1,
"Unexpected length %u.\n", mappedlength);
5477 ok(!
font,
"Unexpected font instance %p.\n",
font);
5479 IDWriteFontFallback_Release(fallback);
5486 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
5496 ok(mappedlength == 1,
"Unexpected length %u.\n", mappedlength);
5500 IDWriteFont_Release(
font);
5502 IDWriteFontFallback_Release(fallback);
5509 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
5519 ok(mappedlength == 1,
"Unexpected length %u.\n", mappedlength);
5523 IDWriteFont_Release(
font);
5525 IDWriteFontFallback_Release(fallback);
5531 ok(
hr ==
S_OK,
"Failed to add mapping, hr %#lx.\n",
hr);
5533 hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
5543 ok(mappedlength == 1,
"Unexpected length %u.\n", mappedlength);
5547 IDWriteFont_Release(
font);
5549 if (
SUCCEEDED(IDWriteFontFallback_QueryInterface(fallback, &IID_IDWriteFontFallback1, (
void **)&fallback1)))
5551 IDWriteFontFallback1_Release(fallback1);
5554 win_skip(
"IDWriteFontFallback1 is not supported.\n");
5556 IDWriteFontFallback_Release(fallback);
5558 IDWriteFontFallbackBuilder_Release(builder);
5559 ref = IDWriteFactory2_Release(factory2);
5560 ok(
ref == 0,
"Factory is not released, ref %lu.\n",
ref);
5584 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5586 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
5587 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
5590 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &
count);
5591 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
5597 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
5598 ok(
hr ==
S_OK,
"Failed to get layout metrics, hr %#lx.\n",
hr);
5601 ok(
metrics.lineCount == 1,
"Unexpected line count %u.\n",
metrics.lineCount);
5602 IDWriteTextLayout_Release(layout);
5603 IDWriteTextFormat_Release(
format);
5607 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5610 hr = IDWriteFactory_CreateTextLayout(
factory,
L"abcd", 4,
format, 1000.0f, 1000.0f, &layout);
5611 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
5612 IDWriteTextFormat_Release(
format);
5614 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout2, (
void**)&layout2);
5615 IDWriteTextLayout_Release(layout);
5618 win_skip(
"GetFontFallback() is not supported.\n");
5619 IDWriteFactory_Release(
factory);
5624 hr = IDWriteTextLayout2_GetFontFallback(layout2,
NULL);
5626 fallback = (
void*)0xdeadbeef;
5627 hr = IDWriteTextLayout2_GetFontFallback(layout2, &fallback);
5629 ok(fallback ==
NULL,
"got %p\n", fallback);
5631 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (
void**)&format1);
5634 fallback = (
void*)0xdeadbeef;
5635 hr = IDWriteTextFormat1_GetFontFallback(format1, &fallback);
5637 ok(fallback ==
NULL,
"got %p\n", fallback);
5639 hr = IDWriteFactory_QueryInterface(
factory, &IID_IDWriteFactory2, (
void**)&factory2);
5643 hr = IDWriteFactory2_GetSystemFontFallback(factory2, &fallback);
5645 ok(fallback !=
NULL,
"got %p\n", fallback);
5647 hr = IDWriteTextFormat1_SetFontFallback(format1, fallback);
5650 fallback2 = (
void*)0xdeadbeef;
5651 hr = IDWriteTextLayout2_GetFontFallback(layout2, &fallback2);
5653 ok(fallback2 == fallback,
"got %p\n", fallback2);
5655 hr = IDWriteTextLayout2_SetFontFallback(layout2,
NULL);
5658 fallback2 = (
void*)0xdeadbeef;
5659 hr = IDWriteTextFormat1_GetFontFallback(format1, &fallback2);
5661 ok(fallback2 ==
NULL,
"got %p\n", fallback2);
5663 if (
SUCCEEDED(IDWriteFontFallback_QueryInterface(fallback, &IID_IDWriteFontFallback1, (
void **)&fallback1)))
5665 IDWriteFontFallback1_Release(fallback1);
5668 win_skip(
"IDWriteFontFallback1 is not supported.\n");
5670 IDWriteFontFallback_Release(fallback);
5671 IDWriteTextFormat1_Release(format1);
5672 IDWriteTextLayout2_Release(layout2);
5673 IDWriteFactory_Release(
factory);
5689 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5691 hr = IDWriteFactory_CreateTextLayout(
factory,
L"afib", 4,
format, 1000.0f, 1000.0f, &layout);
5692 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
5693 IDWriteTextFormat_Release(
format);
5695 hr = IDWriteFactory_CreateTypography(
factory, &typography);
5699 range.startPosition = 0;
5701 hr = IDWriteTextLayout_SetTypography(layout, typography,
range);
5705 hr = IDWriteTextLayout_GetTypography(layout, 0, &typography2,
NULL);
5707 ok(typography2 == typography,
"got %p, expected %p\n", typography2, typography);
5708 IDWriteTypography_Release(typography2);
5709 IDWriteTypography_Release(typography);
5711 hr = IDWriteFactory_CreateTypography(
factory, &typography2);
5714 range.startPosition = 0;
5716 hr = IDWriteTextLayout_SetTypography(layout, typography2,
range);
5719 IDWriteTypography_Release(typography2);
5721 hr = IDWriteTextLayout_GetTypography(layout, 0, &typography, &
range);
5725 IDWriteTypography_Release(typography);
5727 IDWriteTextLayout_Release(layout);
5728 IDWriteFactory_Release(
factory);
5745 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5747 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat1, (
void**)&format1);
5748 IDWriteTextFormat_Release(
format);
5750 win_skip(
"SetLastLineWrapping() is not supported\n");
5751 IDWriteFactory_Release(
factory);
5755 ret = IDWriteTextFormat1_GetLastLineWrapping(format1);
5758 hr = IDWriteTextFormat1_SetLastLineWrapping(format1,
FALSE);
5762 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
5764 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout2, (
void**)&layout2);
5766 IDWriteTextLayout_Release(layout);
5768 ret = IDWriteTextLayout2_GetLastLineWrapping(layout2);
5771 hr = IDWriteTextLayout2_SetLastLineWrapping(layout2,
TRUE);
5774 IDWriteTextLayout2_Release(layout2);
5775 IDWriteTextFormat1_Release(format1);
5776 IDWriteFactory_Release(
factory);
5793 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5795 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat1, (
void**)&format1);
5796 IDWriteTextFormat_Release(
format);
5798 win_skip(
"SetOpticalAlignment() is not supported\n");
5799 IDWriteFactory_Release(
factory);
5803 alignment = IDWriteTextFormat1_GetOpticalAlignment(format1);
5807 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
5809 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout2, (
void**)&layout2);
5811 IDWriteTextLayout_Release(layout);
5812 IDWriteTextFormat1_Release(format1);
5814 alignment = IDWriteTextLayout2_GetOpticalAlignment(layout2);
5817 hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (
void**)&format1);
5820 alignment = IDWriteTextFormat1_GetOpticalAlignment(format1);
5829 alignment = IDWriteTextFormat1_GetOpticalAlignment(format1);
5838 alignment = IDWriteTextLayout2_GetOpticalAlignment(layout2);
5841 IDWriteTextLayout2_Release(layout2);
5842 IDWriteTextFormat1_Release(format1);
5843 IDWriteFactory_Release(
factory);
5847 {
DRAW_GLYPHRUN, {
'a',
'e',0x0300,0}, {
'e',
'n',
'-',
'u',
's',0}, 2 },
5848 {
DRAW_GLYPHRUN, {
'd',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5854 {
DRAW_GLYPHRUN, {
'a',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5855 {
DRAW_GLYPHRUN, {
'e',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5861 {
DRAW_GLYPHRUN, {
'a',0}, {
'e',
'n',
'-',
'c',
'a',0}, 1 },
5862 {
DRAW_GLYPHRUN, {
'e',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5869 {
DRAW_GLYPHRUN, {
'a',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5870 {
DRAW_GLYPHRUN, {
'e',0}, {
'e',
'n',
'-',
'u',
's',0}, 1 },
5878 static const WCHAR strW[] = {
'a',
'e',0x0300,
'd',0};
5892 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
5898 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters,
ARRAY_SIZE(clusters), &
count);
5899 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
5901 ok(
count == 3,
"Unexpected cluster count %u.\n",
count);
5903 range.startPosition = 0;
5905 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
5909 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters,
ARRAY_SIZE(clusters), &
count);
5910 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
5912 ok(
count == 3,
"Unexpected cluster count %u.\n",
count);
5919 IDWriteTextLayout_Release(layout);
5923 hr = IDWriteFactory_CreateTextLayout(
factory,
strW, 2,
format, 1000.0f, 1000.0f, &layout);
5926 range.startPosition = 0;
5928 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
5931 range.startPosition = 0;
5933 hr = IDWriteTextLayout_SetFontSize(layout, 100.0f,
range);
5942 range.startPosition = 0;
5944 hr = IDWriteTextLayout_SetLocaleName(layout,
L"en-CA",
range);
5952 IDWriteTextLayout_Release(layout);
5955 hr = IDWriteFactory_CreateTextLayout(
factory,
strW, 2,
format, 1000.0f, 1000.0f, &layout);
5958 range.startPosition = 0;
5960 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
5963 range.startPosition = 0;
5965 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
5973 IDWriteTextLayout_Release(layout);
5975 IDWriteTextFormat_Release(
format);
5978 hr = IDWriteFactory_GetSystemFontCollection(
factory, &syscollection,
FALSE);
5980 count = IDWriteFontCollection_GetFontFamilyCount(syscollection);
5998 hr = IDWriteFontCollection_GetFontFamily(syscollection,
i, &family);
6005 hr = IDWriteFont_CreateFontFace(
font, &fontface);
6008 hr = IDWriteFontFamily_GetFamilyNames(family, &
names);
6020 hr = IDWriteFontFace_GetFiles(fontface, &
count, &
file);
6026 hr = IDWriteFontFileLoader_QueryInterface(
loader, &IID_IDWriteLocalFontFileLoader, (
void**)&localloader);
6028 IDWriteFontFileLoader_Release(
loader);
6030 hr = IDWriteFontFile_GetReferenceKey(
file, &
key, &keysize);
6038 IDWriteLocalFontFileLoader_Release(localloader);
6039 IDWriteFontFile_Release(
file);
6042 IDWriteLocalizedStrings_Release(
names);
6043 IDWriteFont_Release(
font);
6048 IDWriteFontFace_GetMetrics(fontface, &fontmetrics);
6051 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6056 for (codepoint =
' '; codepoint < 0xffff; ++codepoint)
6059 hr = IDWriteFontFace_GetGlyphIndices(fontface, &codepoint, 1, &glyph);
6067 skip(
"Couldn't find reasonable test string.\n");
6072 hr = IDWriteFactory_CreateTextLayout(
factory,
str, 1,
format, 30000.0f, 100.0f, &layout);
6075 range.startPosition = 0;
6077 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
6080 memset(&ctxt, 0,
sizeof(ctxt));
6083 hr = IDWriteTextLayout_Draw(layout, &ctxt, &
testrenderer, 0.0f, 0.0f);
6088 IDWriteTextLayout_Release(layout);
6090 IDWriteTextFormat_Release(
format);
6091 IDWriteFontFace_Release(fontface);
6092 IDWriteFontFamily_Release(family);
6094 IDWriteFontCollection_Release(syscollection);
6096 IDWriteFactory_Release(
factory);
6111 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6113 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 1000.0f, 1000.0f, &layout);
6114 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
6116 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout3, (
void**)&layout3);
6121 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat2, (
void**)&format2);
6123 IDWriteTextFormat2_Release(format2);
6125 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat2, (
void**)&format2);
6129 IDWriteTextFormat2_Release(format2);
6132 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextFormat1, (
void**)&format1);
6135 hr = IDWriteTextFormat1_QueryInterface(format1, &IID_IDWriteTextFormat2, (
void**)&format2);
6138 IDWriteTextFormat2_Release(format2);
6139 IDWriteTextFormat1_Release(format1);
6141 hr = IDWriteTextLayout3_QueryInterface(layout3, &IID_IDWriteTextFormat2, (
void**)&format2);
6144 IDWriteTextFormat2_Release(format2);
6146 hr = IDWriteTextLayout3_InvalidateLayout(layout3);
6148 IDWriteTextLayout3_Release(layout3);
6151 win_skip(
"IDWriteTextLayout3::InvalidateLayout() is not supported.\n");
6153 IDWriteTextLayout_Release(layout);
6154 IDWriteTextFormat_Release(
format);
6155 IDWriteFactory_Release(
factory);
6170 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6184 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 1000.0f, 1000.0f, &layout);
6185 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
6199 if (IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat2, (
void**)&format2) ==
S_OK) {
6202 hr = IDWriteTextFormat2_GetLineSpacing(format2, &spacing);
6213 hr = IDWriteTextFormat2_SetLineSpacing(format2, &spacing);
6218 hr = IDWriteTextFormat2_SetLineSpacing(format2, &spacing);
6223 hr = IDWriteTextFormat2_SetLineSpacing(format2, &spacing);
6227 hr = IDWriteTextFormat2_SetLineSpacing(format2, &spacing);
6232 hr = IDWriteTextFormat2_SetLineSpacing(format2, &spacing);
6235 hr = IDWriteTextFormat2_GetLineSpacing(format2, &spacing);
6239 IDWriteTextFormat2_Release(format2);
6242 IDWriteTextLayout_Release(layout);
6243 IDWriteTextFormat_Release(
format);
6244 IDWriteFactory_Release(
factory);
6249 static const struct overhangs_test
6251 FLOAT uniform_baseline;
6255 } overhangs_tests[] = {
6256 { 16.0f, { 10.0f, 50.0f, 20.0f }, { 1.0f, 2.0f, 3.0f, 4.0f }, { 1.0f, 6.0f, 3.0f, 0.0f } },
6257 { 15.0f, { 10.0f, 50.0f, 20.0f }, { 1.0f, 2.0f, 3.0f, 4.0f }, { 1.0f, 7.0f, 3.0f, -1.0f } },
6258 { 16.0f, { 10.0f, 50.0f, 20.0f }, { -1.0f, 0.0f, -3.0f, 4.0f }, { -1.0f, 4.0f, -3.0f, 0.0f } },
6259 { 15.0f, { 10.0f, 50.0f, 20.0f }, { -1.0f, 10.0f, 3.0f, -4.0f }, { -1.0f, 15.0f, 3.0f, -9.0f } },
6269 ok(!!inline_obj,
"Failed to create test inline object.\n");
6275 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6277 hr = IDWriteFactory_CreateTextLayout(
factory,
L"A", 1,
format, 1000.0f, 1000.0f, &layout);
6278 ok(
hr ==
S_OK,
"Failed to create text layout, hr %lx.\n",
hr);
6281 const struct overhangs_test *
test = &overhangs_tests[
i];
6290 test->uniform_baseline);
6291 ok(
hr ==
S_OK,
"Failed to set line spacing, hr %#lx.\n",
hr);
6293 hr = IDWriteTextLayout_SetInlineObject(layout,
NULL,
range);
6294 ok(
hr ==
S_OK,
"Failed to reset inline object, hr %#lx.\n",
hr);
6297 ok(
hr ==
S_OK,
"Failed to set inline object, hr %#lx.\n",
hr);
6299 hr = IDWriteTextLayout_GetMetrics(layout, &
metrics);
6300 ok(
hr ==
S_OK,
"Failed to get layout metrics, hr %#lx.\n",
hr);
6302 ok(
metrics.width ==
test->metrics.width,
"%u: unexpected formatted width.\n",
i);
6303 ok(
metrics.height ==
test->metrics.height * 2.0f,
"%u: unexpected formatted height.\n",
i);
6305 hr = IDWriteTextLayout_SetMaxWidth(layout,
metrics.width);
6306 hr = IDWriteTextLayout_SetMaxHeight(layout,
test->metrics.height);
6308 hr = IDWriteTextLayout_GetOverhangMetrics(layout, &overhang_metrics);
6309 ok(
hr ==
S_OK,
"Failed to get overhang metrics, hr %#lx.\n",
hr);
6311 ok(!
memcmp(&overhang_metrics, &
test->expected,
sizeof(overhang_metrics)),
6312 "%u: unexpected overhang metrics (%f, %f, %f, %f).\n",
i, overhang_metrics.
left, overhang_metrics.
top,
6317 IDWriteTextLayout_Release(layout);
6318 IDWriteTextFormat_Release(
format);
6319 IDWriteFactory_Release(
factory);
6340 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6342 tabstop = IDWriteTextFormat_GetIncrementalTabStop(
format);
6343 ok(tabstop == 4.0f *
size,
"Unexpected tab stop %f.\n", tabstop);
6345 IDWriteTextFormat_Release(
format);
6350 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6352 hr = IDWriteTextFormat_SetIncrementalTabStop(
format, 0.0f);
6355 hr = IDWriteTextFormat_SetIncrementalTabStop(
format, -10.0f);
6358 tabstop = IDWriteTextFormat_GetIncrementalTabStop(
format);
6359 ok(tabstop == 40.0f,
"Unexpected tab stop %f.\n", tabstop);
6361 hr = IDWriteTextFormat_SetIncrementalTabStop(
format, 100.0f);
6362 ok(
hr ==
S_OK,
"Failed to set tab stop value, hr %#lx.\n",
hr);
6364 tabstop = IDWriteTextFormat_GetIncrementalTabStop(
format);
6365 ok(tabstop == 100.0f,
"Unexpected tab stop %f.\n", tabstop);
6367 hr = IDWriteFactory_CreateTextLayout(
factory,
L"\ta\tb", 4,
format, 1000.0f, 1000.0f, &layout);
6368 ok(
hr ==
S_OK,
"Failed to create text layout, hr %lx.\n",
hr);
6370 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &
count);
6371 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
6372 ok(clusters[0].isWhitespace,
"Unexpected isWhitespace.\n");
6373 ok(!clusters[1].isWhitespace,
"Unexpected isWhitespace.\n");
6374 ok(clusters[2].isWhitespace,
"Unexpected isWhitespace.\n");
6375 ok(!clusters[3].isWhitespace,
"Unexpected isWhitespace.\n");
6377 ok(clusters[0].
width == tabstop,
"Unexpected tab width.\n");
6378 ok(clusters[1].
width + clusters[2].
width == tabstop,
"Unexpected tab width.\n");
6380 range.startPosition = 0;
6382 hr = IDWriteTextLayout_SetFontSize(layout, 20.0f,
range);
6383 ok(
hr ==
S_OK,
"Failed to set font size, hr %#lx.\n",
hr);
6385 tabstop = IDWriteTextLayout_GetIncrementalTabStop(layout);
6386 ok(tabstop == 100.0f,
"Unexpected tab stop %f.\n", tabstop);
6388 hr = IDWriteTextLayout_GetClusterMetrics(layout, clusters, 4, &
count);
6389 ok(
hr ==
S_OK,
"Failed to get cluster metrics, hr %#lx.\n",
hr);
6390 ok(clusters[0].isWhitespace,
"Unexpected isWhitespace.\n");
6391 ok(!clusters[1].isWhitespace,
"Unexpected isWhitespace.\n");
6392 ok(clusters[2].isWhitespace,
"Unexpected isWhitespace.\n");
6393 ok(!clusters[3].isWhitespace,
"Unexpected isWhitespace.\n");
6395 ok(clusters[0].
width == tabstop,
"Unexpected tab width.\n");
6396 ok(clusters[1].
width + clusters[2].
width == tabstop,
"Unexpected tab width.\n");
6398 IDWriteTextLayout_Release(layout);
6400 IDWriteTextFormat_Release(
format);
6402 IDWriteFactory_Release(
factory);
6419 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6421 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 1000.0f, 1000.0f, &layout);
6422 ok(
hr ==
S_OK,
"Failed to create text layout, hr %lx.\n",
hr);
6424 IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout4, (
void **)&layout4);
6426 IDWriteTextLayout_Release(layout);
6430 win_skip(
"Text layout does not support variable fonts.\n");
6431 IDWriteFactory_Release(
factory);
6432 IDWriteTextFormat_Release(
format);
6436 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat3, (
void **)&format3);
6439 axes = IDWriteTextFormat3_GetAutomaticFontAxes(format3);
6448 IDWriteTextFormat3_Release(format3);
6450 axes = IDWriteTextLayout4_GetAutomaticFontAxes(layout4);
6459 IDWriteTextLayout4_Release(layout4);
6462 hr = IDWriteFactory_CreateTextLayout(
factory,
L"a", 1,
format, 1000.0f, 1000.0f, &layout);
6463 ok(
hr ==
S_OK,
"Failed to create text layout, hr %lx.\n",
hr);
6465 hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout4, (
void **)&layout4);
6468 axes = IDWriteTextLayout4_GetAutomaticFontAxes(layout4);
6471 hr = IDWriteTextLayout4_QueryInterface(layout4, &IID_IDWriteTextFormat3, (
void **)&format3);
6474 axes = IDWriteTextFormat3_GetAutomaticFontAxes(format3);
6480 axes = IDWriteTextFormat3_GetAutomaticFontAxes(format3);
6486 IDWriteTextFormat3_Release(format3);
6488 IDWriteTextLayout_Release(layout);
6490 IDWriteTextLayout4_Release(layout4);
6491 IDWriteTextFormat_Release(
format);
6492 IDWriteFactory_Release(
factory);
6514 win_skip(
"Text format does not support variations.\n");
6518 hr = IDWriteFactory6_CreateTextFormat(
factory,
L"test_family",
NULL,
NULL, 0, 10.0f,
L"en-us", &format3);
6521 hr = IDWriteTextFormat3_GetFontCollection(format3, &
collection);
6524 hr = IDWriteFontCollection_QueryInterface(
collection, &IID_IDWriteFontCollection2, (
void **)&collection2);
6527 model = IDWriteFontCollection2_GetFontFamilyModel(collection2);
6531 IDWriteFontCollection2_Release(collection2);
6533 count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
6536 stretch = IDWriteTextFormat3_GetFontStretch(format3);
6539 style = IDWriteTextFormat3_GetFontStyle(format3);
6542 weight = IDWriteTextFormat3_GetFontWeight(format3);
6547 axes[0].
value = 200.0f;
6548 hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 1);
6551 weight = IDWriteTextFormat3_GetFontWeight(format3);
6554 IDWriteTextFormat3_Release(format3);
6561 hr = IDWriteTextFormat_QueryInterface(
format, &IID_IDWriteTextFormat3, (
void **)&format3);
6564 count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
6568 hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 1);
6570 ok(axes[0].axisTag == 0 && axes[0].
value == 0.0f,
"Unexpected value.\n");
6573 axes[0].
value = 200.0f;
6575 axes[1].
value = 2.0f;
6576 hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 2);
6579 count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
6582 hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 1);
6585 hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 0);
6588 hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 2);
6591 hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 0);
6594 count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
6597 IDWriteTextFormat3_Release(format3);
6598 IDWriteTextFormat_Release(
format);
6600 IDWriteFactory6_Release(
factory);
6609 IDWriteTextLayout1 *layout1;
6623 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
6627 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, &layout);
6628 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
6631 range.startPosition = 10;
6636 range.startPosition = 10;
6641 range.startPosition = 10;
6647 hr = IDWriteTextLayout_GetFontWeight(layout, 0, &
weight, &
range);
6649 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6652 hr = IDWriteTextLayout_GetFontWeight(layout, 10, &
weight, &
range);
6654 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6657 range.startPosition = 0;
6663 range.startPosition = 10;
6665 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"family",
range);
6668 range.startPosition = 10;
6670 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"family",
range);
6673 range.startPosition = 10;
6675 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"family",
range);
6678 range.startPosition = 0;
6680 hr = IDWriteTextLayout_SetFontFamilyName(layout,
L"Tahoma",
range);
6684 range.startPosition = 10;
6689 range.startPosition = 10;
6694 range.startPosition = 10;
6700 hr = IDWriteTextLayout_GetFontStyle(layout, 0, &
style, &
range);
6702 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6705 hr = IDWriteTextLayout_GetFontStyle(layout, 10, &
style, &
range);
6707 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6710 range.startPosition = 0;
6716 range.startPosition = 10;
6721 range.startPosition = 10;
6726 range.startPosition = 10;
6732 hr = IDWriteTextLayout_GetFontStretch(layout, 0, &stretch, &
range);
6734 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6737 hr = IDWriteTextLayout_GetFontStretch(layout, 10, &stretch, &
range);
6739 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6742 range.startPosition = 0;
6748 range.startPosition = 10;
6750 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
6753 range.startPosition = 10;
6755 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
6758 range.startPosition = 10;
6760 hr = IDWriteTextLayout_SetUnderline(layout,
TRUE,
range);
6764 hr = IDWriteTextLayout_GetUnderline(layout, 0, &
value, &
range);
6766 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6769 hr = IDWriteTextLayout_GetUnderline(layout, 10, &
value, &
range);
6771 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6774 range.startPosition = 0;
6776 hr = IDWriteTextLayout_SetUnderline(layout,
FALSE,
range);
6780 range.startPosition = 10;
6782 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
6785 range.startPosition = 10;
6787 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
6790 range.startPosition = 10;
6792 hr = IDWriteTextLayout_SetStrikethrough(layout,
TRUE,
range);
6796 hr = IDWriteTextLayout_GetStrikethrough(layout, 0, &
value, &
range);
6798 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6801 hr = IDWriteTextLayout_GetStrikethrough(layout, 10, &
value, &
range);
6803 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6806 range.startPosition = 0;
6808 hr = IDWriteTextLayout_SetStrikethrough(layout,
FALSE,
range);
6812 range.startPosition = 10;
6814 hr = IDWriteTextLayout_SetLocaleName(layout,
L"locale",
range);
6817 range.startPosition = 10;
6819 hr = IDWriteTextLayout_SetLocaleName(layout,
L"locale",
range);
6822 range.startPosition = 10;
6824 hr = IDWriteTextLayout_SetLocaleName(layout,
L"locale",
range);
6827 range.startPosition = 0;
6829 hr = IDWriteTextLayout_SetLocaleName(layout,
L"ru",
range);
6836 range.startPosition = 10;
6838 hr = IDWriteTextLayout_SetInlineObject(layout,
sign,
range);
6841 range.startPosition = 10;
6843 hr = IDWriteTextLayout_SetInlineObject(layout,
sign,
range);
6846 range.startPosition = 10;
6848 hr = IDWriteTextLayout_SetInlineObject(layout,
sign,
range);
6853 hr = IDWriteTextLayout_GetInlineObject(layout, 10, &
object, &
range);
6855 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6857 IDWriteInlineObject_Release(
object);
6859 range.startPosition = 0;
6861 hr = IDWriteTextLayout_SetInlineObject(layout,
NULL,
range);
6865 range.startPosition = 10;
6870 range.startPosition = 10;
6875 range.startPosition = 10;
6880 range.startPosition = 0;
6882 hr = IDWriteTextLayout_SetDrawingEffect(layout,
NULL,
range);
6885 IDWriteInlineObject_Release(
sign);
6888 hr = IDWriteFactory_CreateTypography(
factory, &typography);
6891 range.startPosition = 10;
6893 hr = IDWriteTextLayout_SetTypography(layout, typography,
range);
6896 range.startPosition = 10;
6898 hr = IDWriteTextLayout_SetTypography(layout, typography,
range);
6901 range.startPosition = 10;
6903 hr = IDWriteTextLayout_SetTypography(layout, typography,
range);
6906 range.startPosition = 0;
6908 hr = IDWriteTextLayout_SetTypography(layout,
NULL,
range);
6911 IDWriteTypography_Release(typography);
6915 ok(
hr ==
S_OK,
"Failed to get system collection, hr %#lx.\n",
hr);
6917 range.startPosition = 10;
6922 range.startPosition = 10;
6927 range.startPosition = 10;
6932 range.startPosition = 0;
6934 hr = IDWriteTextLayout_SetFontCollection(layout,
NULL,
range);
6939 hr = IDWriteTextLayout_GetFontCollection(layout, 10, &collection2, &
range);
6941 ok(
range.length == ~0
u,
"Unexpected range length %u.\n",
range.length);
6943 IDWriteFontCollection_Release(collection2);
6947 if (
SUCCEEDED(IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout1, (
void **)&layout1)))
6950 range.startPosition = 10;
6952 hr = IDWriteTextLayout1_SetPairKerning(layout1,
TRUE,
range);
6955 range.startPosition = 10;
6957 hr = IDWriteTextLayout1_SetPairKerning(layout1,
TRUE,
range);
6960 range.startPosition = 10;
6962 hr = IDWriteTextLayout1_SetPairKerning(layout1,
TRUE,
range);
6966 hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &
value, &
range);
6968 ok(
range.startPosition == 0 &&
range.length == 10,
"Unexpected range (%u, %u).\n",
range.startPosition,
range.length);
6972 hr = IDWriteTextLayout1_GetPairKerning(layout1, 10, &
value, &
range);
6974 ok(
range.startPosition == 10 &&
range.length == ~0
u - 10,
"Unexpected range (%u, %u).\n",
6978 range.startPosition = 0;
6980 hr = IDWriteTextLayout1_SetPairKerning(layout1,
FALSE,
range);
6983 IDWriteTextLayout1_Release(layout1);
6986 IDWriteTextLayout_Release(layout);
6988 IDWriteTextFormat_Release(
format);
6989 IDWriteFactory_Release(
factory);
7008 ok(
hr ==
S_OK,
"Failed to create text format, hr %#lx.\n",
hr);
7010 hr = IDWriteFactory_CreateTextLayout(
factory,
L"string", 6,
format, 100.0f, 100.0f, &layout);
7011 ok(
hr ==
S_OK,
"Failed to create text layout, hr %#lx.\n",
hr);
7020 ok(
count == 1,
"Unexpected metrics count %u.\n",
count);
7023 ok(!!
metrics[0].isText,
"Expected text range.\n");
7032 ok(
count == 1,
"Unexpected metrics count %u.\n",
count);
7035 ok(!!
metrics[0].isText,
"Expected text range.\n");
7038 range.startPosition = 3;
7040 hr = IDWriteTextLayout_SetFontSize(layout, 20.0f,
range);
7049 ok(
count == 1,
"Unexpected metrics count %u.\n",
count);
7052 ok(!!
metrics[0].isText,
"Expected text range.\n");
7054 hr = IDWriteTextLayout_GetLineMetrics(layout, &
line, 1, &
count);
7056 ok(
line.height ==
metrics[0].height,
"Unexpected range height.\n");
7059 hr = IDWriteFactory_CreateEllipsisTrimmingSign(
factory,
format, &inlineobj);
7062 hr = IDWriteTextLayout_SetInlineObject(layout, inlineobj,
range);
7071 ok(
count == 2,
"Unexpected metrics count %u.\n",
count);
7074 ok(!!
metrics[0].isText,
"Expected text range.\n");
7077 ok(!
metrics[1].isText,
"Unexpected text range.\n");
7085 ok(
count == 1,
"Unexpected metrics count %u.\n",
count);
7088 ok(!
metrics[0].isText,
"Unexpected text range.\n");
7090 IDWriteInlineObject_Release(inlineobj);
7091 IDWriteTextLayout_Release(layout);
7092 IDWriteTextFormat_Release(
format);
7094 IDWriteFactory_Release(
factory);
7102 win_skip(
"failed to create factory\n");
7154 IDWriteFactory_Release(
factory);
COMPILER_DEPENDENT_UINT64 UINT64
static struct sockaddr_in sa
_Check_return_ _Ret_maybenull_ _In_ size_t alignment
#define InterlockedIncrement
#define InterlockedDecrement
static const WCHAR nameW[]
@ DWRITE_MEASURING_MODE_GDI_CLASSIC
@ DWRITE_MEASURING_MODE_NATURAL
@ DWRITE_MEASURING_MODE_GDI_NATURAL
HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnknown **ret)
static void cleanup(void)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
LPVOID WINAPI LockResource(HGLOBAL handle)
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP wchar_t *__cdecl wcstok(wchar_t *, const wchar_t *)
_ACRTIMP double __cdecl fabs(double)
_ACRTIMP float __cdecl fabsf(float)
_ACRTIMP double __cdecl floor(double)
@ DWRITE_SCRIPT_SHAPES_NO_VISUAL
DWRITE_PARAGRAPH_ALIGNMENT
@ DWRITE_PARAGRAPH_ALIGNMENT_FAR
@ DWRITE_PARAGRAPH_ALIGNMENT_NEAR
@ DWRITE_PARAGRAPH_ALIGNMENT_CENTER
@ DWRITE_BREAK_CONDITION_MUST_BREAK
@ DWRITE_BREAK_CONDITION_CAN_BREAK
@ DWRITE_BREAK_CONDITION_MAY_NOT_BREAK
@ DWRITE_BREAK_CONDITION_NEUTRAL
@ DWRITE_WORD_WRAPPING_NO_WRAP
@ DWRITE_WORD_WRAPPING_WRAP
@ DWRITE_WORD_WRAPPING_CHARACTER
@ DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES
@ DWRITE_FONT_WEIGHT_NORMAL
@ DWRITE_FONT_WEIGHT_BOLD
@ DWRITE_FONT_WEIGHT_HEAVY
@ DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT
@ DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
@ DWRITE_FONT_STYLE_NORMAL
@ DWRITE_FONT_STYLE_ITALIC
@ DWRITE_FONT_STYLE_OBLIQUE
@ DWRITE_FACTORY_TYPE_ISOLATED
@ DWRITE_TEXT_ALIGNMENT_CENTER
@ DWRITE_TEXT_ALIGNMENT_JUSTIFIED
@ DWRITE_TEXT_ALIGNMENT_LEADING
@ DWRITE_TEXT_ALIGNMENT_TRAILING
@ DWRITE_TRIMMING_GRANULARITY_WORD
@ DWRITE_TRIMMING_GRANULARITY_CHARACTER
@ DWRITE_TRIMMING_GRANULARITY_NONE
@ DWRITE_READING_DIRECTION_TOP_TO_BOTTOM
@ DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
@ DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
@ DWRITE_FONT_STRETCH_EXPANDED
@ DWRITE_FONT_STRETCH_NORMAL
@ DWRITE_FONT_STRETCH_UNDEFINED
@ DWRITE_FONT_STRETCH_ULTRA_EXPANDED
@ DWRITE_FONT_STRETCH_CONDENSED
@ DWRITE_FONT_FEATURE_TAG_KERNING
DWRITE_LINE_SPACING_METHOD
@ DWRITE_LINE_SPACING_METHOD_PROPORTIONAL
@ DWRITE_LINE_SPACING_METHOD_UNIFORM
@ DWRITE_LINE_SPACING_METHOD_DEFAULT
DWRITE_VERTICAL_GLYPH_ORIENTATION
@ DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED
@ DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT
@ DWRITE_OPTICAL_ALIGNMENT_NONE
@ DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS
@ DWRITE_FONT_FAMILY_MODEL_TYPOGRAPHIC
UINT32 trailingWhitespaceLength
@ DWRITE_FONT_AXIS_TAG_WEIGHT
@ DWRITE_FONT_AXIS_TAG_WIDTH
DWRITE_AUTOMATIC_FONT_AXES
@ DWRITE_AUTOMATIC_FONT_AXES_OPTICAL_SIZE
@ DWRITE_AUTOMATIC_FONT_AXES_NONE
@ DWRITE_FONT_LINE_GAP_USAGE_DEFAULT
@ DWRITE_FONT_LINE_GAP_USAGE_ENABLED
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLint GLint GLsizei GLsizei height
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLint GLint GLsizei width
GLuint GLenum GLenum transform
GLenum GLenum GLenum GLenum GLenum scale
GLsizei const GLchar *const * strings
GLenum GLuint GLint GLenum face
GLsizei GLenum const GLvoid GLuint GLsizei GLfloat * metrics
GLuint GLsizei GLsizei * length
GLsizei GLenum GLboolean sink
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
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 * u
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 GLint GLint j
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
#define memcpy(s1, s2, n)
struct task_struct * current
static struct test_info tests[]
static HRESULT WINAPI fontcollection_QI(IDWriteFontCollection *iface, REFIID riid, void **obj)
static void test_line_spacing(void)
static ULONG WINAPI testeffect_AddRef(IUnknown *iface)
static const struct drawcall_entry draweffect4_seq[]
static ULONG WINAPI singlefontfileenumerator_AddRef(IDWriteFontFileEnumerator *iface)
static HRESULT WINAPI testrenderer_IsPixelSnappingDisabled(IDWriteTextRenderer *iface, void *context, BOOL *disabled)
static ULONG WINAPI fontdatastream_Release(IDWriteFontFileStream *iface)
static void test_InvalidateLayout(void)
static IDWriteTextRenderer testrenderer
static const struct drawcall_entry drawunderline_seq[]
static const struct drawcall_entry drawunderline4_seq[]
#define TEST_MEASURING_MODE(ctxt, mode)
static HRESULT create_fontdatastream(LPVOID data, UINT size, IDWriteFontFileStream **iface)
static const struct drawcall_entry drawunderline3_seq[]
static void test_pixelsnapping(void)
static void test_SetWordWrapping(void)
static HRESULT WINAPI fontdatastream_GetLastWriteTime(IDWriteFontFileStream *iface, UINT64 *last_writetime)
static DWRITE_READING_DIRECTION WINAPI analysissource_GetParagraphReadingDirection(IDWriteTextAnalysisSource *iface)
static void test_SetTextAlignment(void)
static ULONG WINAPI analysissource_Release(IDWriteTextAnalysisSource *iface)
static BOOL get_enus_string(IDWriteLocalizedStrings *strings, WCHAR *buff, UINT32 size)
static HRESULT WINAPI fontdatastream_ReadFileFragment(IDWriteFontFileStream *iface, void const **fragment_start, UINT64 offset, UINT64 fragment_size, void **fragment_context)
static const IDWriteTextRendererVtbl testrenderervtbl
static HRESULT WINAPI resourcecollectionloader_CreateEnumeratorFromKey(IDWriteFontCollectionLoader *iface, IDWriteFactory *factory, const void *key, UINT32 key_size, IDWriteFontFileEnumerator **enumerator)
static struct testanalysissink analysissink
static DWRITE_MATRIX compattransforms[]
static void test_SetFontStretch(void)
static HRESULT WINAPI analysissink_SetBidiLevel(IDWriteTextAnalysisSink *iface, UINT32 position, UINT32 length, UINT8 explicitLevel, UINT8 resolvedLevel)
static const struct drawcall_entry draw_trimmed_seq[]
static HRESULT WINAPI analysissource_GetNumberSubstitution(IDWriteTextAnalysisSource *iface, UINT32 position, UINT32 *text_len, IDWriteNumberSubstitution **substitution)
static void test_SetFontSize(void)
static void test_GetLocaleName(void)
static void test_CreateEllipsisTrimmingSign(void)
static void test_SetVerticalGlyphOrientation(void)
static HRESULT WINAPI testinlineobj_GetMetrics(IDWriteInlineObject *iface, DWRITE_INLINE_OBJECT_METRICS *metrics)
static struct drawcall_sequence * expected_seq[1]
static void test_SetParagraphAlignment(void)
static BOOL float_eq(FLOAT left, FLOAT right)
static void test_Draw(void)
static const struct drawcall_entry draweffect3_seq[]
static IDWriteTextAnalysisSource analysissource
static ULONG WINAPI resourcecollectionloader_Release(IDWriteFontCollectionLoader *iface)
static void test_layout_range_length(void)
static void test_GetMetrics(void)
static void test_typography(void)
static ULONG WINAPI testinlineobj_AddRef(IDWriteInlineObject *iface)
static IDWriteFontCollection fallbackcollection
static HRESULT WINAPI testinlineobj3_GetMetrics(IDWriteInlineObject *iface, DWRITE_INLINE_OBJECT_METRICS *metrics)
static void test_CreateGdiCompatibleTextLayout(void)
static HRESULT WINAPI fontcollection_GetFontFamily(IDWriteFontCollection *iface, UINT32 index, IDWriteFontFamily **family)
static IUnknown * create_test_effect(void)
static void test_HitTestTextRange(void)
static UINT32 WINAPI fontcollection_GetFontFamilyCount(IDWriteFontCollection *iface)
static void _expect_ref(IUnknown *obj, ULONG ref, int line)
static HRESULT WINAPI testrenderer_DrawStrikethrough(IDWriteTextRenderer *iface, void *context, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_STRIKETHROUGH const *strikethrough, IUnknown *effect)
static const IDWriteFontCollectionVtbl fallbackcollectionvtbl
static void test_SetFontStyle(void)
static void test_text_format_axes(void)
static HRESULT WINAPI testinlineobj_Draw(IDWriteInlineObject *iface, void *client_drawingontext, IDWriteTextRenderer *renderer, FLOAT originX, FLOAT originY, BOOL is_sideways, BOOL is_rtl, IUnknown *drawing_effect)
static HRESULT WINAPI testrenderer_QI(IDWriteTextRenderer *iface, REFIID riid, void **obj)
static void test_GetLineMetrics(void)
static void utf32_to_utf16(UINT32 C, WCHAR **ptr)
static HRESULT create_enumerator(IDWriteFontFile *file, IDWriteFontFileEnumerator **ret)
static HRESULT WINAPI singlefontfileenumerator_QueryInterface(IDWriteFontFileEnumerator *iface, REFIID riid, void **obj)
static void test_GetOverhangMetrics(void)
static ULONG WINAPI resourcefontfileloader_AddRef(IDWriteFontFileLoader *iface)
static void test_SetUnderline(void)
static struct test_inline_obj * create_test_inline_object(const IDWriteInlineObjectVtbl *vtable)
static HRESULT WINAPI analysissink_SetNumberSubstitution(IDWriteTextAnalysisSink *iface, UINT32 position, UINT32 length, IDWriteNumberSubstitution *substitution)
static const struct IDWriteFontFileLoaderVtbl resourcefontfileloadervtbl
static struct test_effect * test_effect_from_IUnknown(IUnknown *iface)
static const struct drawcall_entry draweffect2_seq[]
static FLOAT get_scaled_font_metric(UINT32 metric, FLOAT emSize, const DWRITE_FONT_METRICS *metrics)
static void test_SetLastLineWrapping(void)
static ULONG WINAPI fontdatastream_AddRef(IDWriteFontFileStream *iface)
static struct resource_file_loader * impl_from_IDWriteFontFileLoader(IDWriteFontFileLoader *iface)
static HRESULT WINAPI testrenderer_DrawUnderline(IDWriteTextRenderer *iface, void *context, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_UNDERLINE const *underline, IUnknown *effect)
static void ok_sequence_(struct drawcall_sequence **seq, int sequence_index, const struct drawcall_entry *expected, const char *context, BOOL todo, const char *file, int line)
static void add_call(struct drawcall_sequence **seq, int sequence_index, const struct drawcall_entry *call)
static const struct drawcall_entry drawellipsis_seq[]
static ULONG WINAPI testrenderer_Release(IDWriteTextRenderer *iface)
static HRESULT WINAPI testrenderer_GetPixelsPerDip(IDWriteTextRenderer *iface, void *context, FLOAT *pixels_per_dip)
static ULONG WINAPI analysissource_AddRef(IDWriteTextAnalysisSource *iface)
static HRESULT WINAPI resourcecollectionloader_QueryInterface(IDWriteFontCollectionLoader *iface, REFIID riid, void **obj)
static HRESULT WINAPI analysissink_SetLineBreakpoints(IDWriteTextAnalysisSink *iface, UINT32 position, UINT32 length, DWRITE_LINE_BREAKPOINT const *breakpoints)
static IDWriteTextAnalysisSourceVtbl analysissourcevtbl
static const struct drawcall_entry draw_seq3[]
static ULONG WINAPI resourcecollectionloader_AddRef(IDWriteFontCollectionLoader *iface)
static DWRITE_MATRIX layoutcreate_transforms[]
static const IDWriteInlineObjectVtbl testinlineobjvtbl3
static IDWriteFontCollectionLoader * create_resource_collection_loader(IDWriteFontFileLoader *loader)
static void test_FontFallbackBuilder(void)
#define ok_sequence(seq, index, exp, contx, todo)
static void test_SetFlowDirection(void)
static HRESULT WINAPI fontdatastream_QueryInterface(IDWriteFontFileStream *iface, REFIID riid, void **obj)
static HRESULT WINAPI resourcefontfileloader_QueryInterface(IDWriteFontFileLoader *iface, REFIID riid, void **obj)
static const struct drawcall_entry draw_seq5[]
static HRESULT WINAPI analysissource_GetTextAtPosition(IDWriteTextAnalysisSource *iface, UINT32 position, WCHAR const **text, UINT32 *text_len)
static const struct drawcall_entry draw_single_run_seq[]
static IDWriteFactory * create_factory(void)
static struct test_inline_obj * impl_from_IDWriteInlineObject(IDWriteInlineObject *iface)
static void WINAPI fontdatastream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
#define EXPECT_REF(obj, ref)
static const struct IDWriteFontCollectionLoaderVtbl resourcecollectionloadervtbl
static const struct drawcall_entry draw_seq4[]
static HRESULT WINAPI testinlineobj_GetBreakConditions(IDWriteInlineObject *iface, DWRITE_BREAK_CONDITION *before, DWRITE_BREAK_CONDITION *after)
static void init_call_sequences(struct drawcall_sequence **seq, int n)
static ULONG WINAPI fontcollection_AddRef(IDWriteFontCollection *iface)
#define NUM_CALL_SEQUENCES
static HRESULT WINAPI testinlineobj_GetOverhangMetrics(IDWriteInlineObject *iface, DWRITE_OVERHANG_METRICS *overhangs)
static HRESULT WINAPI testinlineobj3_GetOverhangMetrics(IDWriteInlineObject *iface, DWRITE_OVERHANG_METRICS *overhangs)
static BOOL is_font_name_match(const WCHAR *name, const WCHAR *list)
static HRESULT WINAPI singlefontfileenumerator_MoveNext(IDWriteFontFileEnumerator *iface, BOOL *current)
static void test_SetDrawingEffect(void)
static ULONG WINAPI analysissink_Release(IDWriteTextAnalysisSink *iface)
static HRESULT WINAPI resourcefontfileloader_CreateStreamFromKey(IDWriteFontFileLoader *iface, const void *ref_key, UINT32 key_size, IDWriteFontFileStream **stream)
static ULONG WINAPI testeffect_Release(IUnknown *iface)
static void test_SetInlineObject(void)
static HRESULT WINAPI analysissource_QueryInterface(IDWriteTextAnalysisSource *iface, REFIID riid, void **obj)
static const struct drawcall_entry draweffect_seq[]
static HRESULT WINAPI analysissink_SetScriptAnalysis(IDWriteTextAnalysisSink *iface, UINT32 position, UINT32 length, DWRITE_SCRIPT_ANALYSIS const *sa)
static const struct drawcall_entry draw_seq2[]
static HRESULT WINAPI fontdatastream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size)
static void test_SetReadingDirection(void)
static const IDWriteFontFileStreamVtbl fontdatastreamvtbl
static const WCHAR g_blahfontW[]
static FLOAT snap_coord(const DWRITE_MATRIX *m, FLOAT ppdip, FLOAT coord)
static void test_fallback(void)
static struct test_fontdatastream * impl_from_IDWriteFontFileStream(IDWriteFontFileStream *iface)
static ULONG WINAPI fontcollection_Release(IDWriteFontCollection *iface)
static ULONG WINAPI testrenderer_AddRef(IDWriteTextRenderer *iface)
static void test_system_fallback(void)
static const IDWriteInlineObjectVtbl testinlineobjvtbl
static HRESULT WINAPI testeffect_QI(IUnknown *iface, REFIID riid, void **obj)
static void get_font_name(IDWriteFont *font, WCHAR *name, UINT32 size)
static const IDWriteInlineObjectVtbl testinlineobjvtbl2
static struct drawcall_sequence * sequences[NUM_CALL_SEQUENCES]
static void * create_factory_iid(REFIID riid)
static void test_SetPairKerning(void)
static void test_DetermineMinWidth(void)
static HRESULT WINAPI singlefontfileenumerator_GetCurrentFontFile(IDWriteFontFileEnumerator *iface, IDWriteFontFile **file)
static HRESULT WINAPI analysissource_GetLocaleName(IDWriteTextAnalysisSource *iface, UINT32 position, UINT32 *text_len, WCHAR const **locale)
static void test_SetOpticalAlignment(void)
static const struct drawcall_entry draw_seq[]
static void test_SetLocaleName(void)
static const struct drawcall_entry empty_seq[]
static void test_SetTypography(void)
static struct snapping_test snapping_tests[]
static void get_script_analysis(const WCHAR *str, UINT32 len, DWRITE_SCRIPT_ANALYSIS *sa)
static struct testanalysissink * impl_from_IDWriteTextAnalysisSink(IDWriteTextAnalysisSink *iface)
static HRESULT WINAPI fontcollection_FindFamilyName(IDWriteFontCollection *iface, WCHAR const *name, UINT32 *index, BOOL *exists)
static void test_SetStrikethrough(void)
static void test_fontweight(void)
static ULONG WINAPI resourcefontfileloader_Release(IDWriteFontFileLoader *iface)
static ULONG WINAPI analysissink_AddRef(IDWriteTextAnalysisSink *iface)
static const struct drawcall_entry drawunderline2_seq[]
static struct resource_collection_loader * impl_from_IDWriteFontFileCollectionLoader(IDWriteFontCollectionLoader *iface)
static HRESULT WINAPI testinlineobj2_GetBreakConditions(IDWriteInlineObject *iface, DWRITE_BREAK_CONDITION *before, DWRITE_BREAK_CONDITION *after)
static ULONG WINAPI testinlineobj_Release(IDWriteInlineObject *iface)
static void test_CreateTextLayout(void)
static HRESULT WINAPI testrenderer_DrawInlineObject(IDWriteTextRenderer *iface, void *context, FLOAT originX, FLOAT originY, IDWriteInlineObject *object, BOOL is_sideways, BOOL is_rtl, IUnknown *effect)
static void test_CreateTextFormat(void)
static const struct drawcall_entry draw_ltr_reordered_run_seq[]
static void test_automatic_font_axes(void)
static IDWriteTextAnalysisSinkVtbl analysissinkvtbl
static IDWriteFontFace * get_fontface_from_format(IDWriteTextFormat *format)
static void test_tab_stops(void)
static IDWriteFontFileLoader * create_resource_file_loader(void)
static const IUnknownVtbl testeffectvtbl
static void test_SetFontFamilyName(void)
static HRESULT WINAPI analysissource_GetTextBeforePosition(IDWriteTextAnalysisSource *iface, UINT32 position, WCHAR const **text, UINT32 *text_len)
static HRESULT WINAPI testrenderer_GetCurrentTransform(IDWriteTextRenderer *iface, void *context, DWRITE_MATRIX *m)
static ULONG WINAPI singlefontfileenumerator_Release(IDWriteFontFileEnumerator *iface)
static const struct IDWriteFontFileEnumeratorVtbl singlefontfileenumeratorvtbl
static HRESULT WINAPI analysissink_QueryInterface(IDWriteTextAnalysisSink *iface, REFIID riid, void **obj)
static HRESULT WINAPI testrenderer_DrawGlyphRun(IDWriteTextRenderer *iface, void *context, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE mode, DWRITE_GLYPH_RUN const *run, DWRITE_GLYPH_RUN_DESCRIPTION const *descr, IUnknown *effect)
static void test_measuring_mode(const struct renderer_context *ctxt, DWRITE_MEASURING_MODE mode, int line)
static void test_GetClusterMetrics(void)
static const char * get_draw_kind_name(unsigned short kind)
static HRESULT WINAPI fontcollection_GetFontFromFontFace(IDWriteFontCollection *iface, IDWriteFontFace *face, IDWriteFont **font)
static HRESULT WINAPI testinlineobj_QI(IDWriteInlineObject *iface, REFIID riid, void **obj)
static const WCHAR * g_source
static void test_MapCharacters(void)
static struct test_fontenumerator * impl_from_IDWriteFontFileEnumerator(IDWriteFontFileEnumerator *iface)
#define cmp(status, error)
INTERNETFEATURELIST feature
#define LOCALE_NAME_MAX_LENGTH
#define MAKEINTRESOURCE(i)
#define IsEqualIID(riid1, riid2)
struct dirent *__cdecl readdir(DIR *)
static __inline const char * wine_dbgstr_guid(const GUID *id)
static const char *static const char const char DWORD void DWORD *static const char const char DWORD void DWORD *static const char DWORD DWORD void * buff
DWRITE_FONT_AXIS_TAG axisTag
IDWriteFontFace * fontFace
DWRITE_GLYPH_OFFSET const * glyphOffsets
FLOAT const * glyphAdvances
DWRITE_FONT_LINE_GAP_USAGE fontLineGapUsage
DWRITE_LINE_SPACING_METHOD method
DWRITE_MEASURING_MODE measuringMode
DWRITE_TRIMMING_GRANULARITY granularity
DWRITE_MEASURING_MODE measuringMode
WCHAR locale[LOCALE_NAME_MAX_LENGTH]
struct drawcall_entry * sequence
IDWriteTextFormat * format
IDWriteFontCollectionLoader IDWriteFontCollectionLoader_iface
IDWriteFontFileLoader * loader
IDWriteFontFileLoader IDWriteFontFileLoader_iface
IDWriteFontFileStream IDWriteFontFileStream_iface
IDWriteFontFileEnumerator IDWriteFontFileEnumerator_iface
IDWriteInlineObject IDWriteInlineObject_iface
DWRITE_INLINE_OBJECT_METRICS metrics
DWRITE_OVERHANG_METRICS overhangs
DWRITE_SCRIPT_ANALYSIS sa
IDWriteTextAnalysisSink IDWriteTextAnalysisSink_iface
__inline int before(__u32 seq1, __u32 seq2)
__inline int after(__u32 seq1, __u32 seq2)
FT_UInt FT_UInt FT_Vector * kerning
#define CONTAINING_RECORD(address, type, field)
static size_t align(size_t addr, size_t alignment)
#define DWRITE_E_FLOWDIRECTIONCONFLICTS
#define E_NOT_SUFFICIENT_BUFFER