From: Philipp Knechtges philipp-dev@knechtges.com
The functionality to draw ID2D1GeometryGroup is currently missing. Nothing is drawn. This causes the blank pages in the bug below.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51139 --- dlls/d2d1/tests/d2d1.c | 219 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index ae0b6f51bdc..474d59cfa72 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -7052,6 +7052,7 @@ static void test_gradient(BOOL d3d11) static void test_draw_geometry(BOOL d3d11) { ID2D1TransformedGeometry *transformed_geometry[4]; + ID2D1GeometryGroup *geometry_group; ID2D1RectangleGeometry *rect_geometry[2]; D2D1_POINT_2F point = {0.0f, 0.0f}; D2D1_ROUNDED_RECT rounded_rect; @@ -7961,6 +7962,117 @@ static void test_draw_geometry(BOOL d3d11) hr = ID2D1PathGeometry_Open(geometry, &sink); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ set_point(&point, -0.402914f, 0.915514f); + ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW); + quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f); + quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f); + quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f); + quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f); + quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f); + quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f); + quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f); + quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f); + quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f); + quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f); + quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f); + quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f); + ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED); + + hr = ID2D1GeometrySink_Close(sink); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1GeometrySink_Release(sink); + + set_matrix_identity(&matrix); + translate_matrix(&matrix, 40.0f, 160.0f); + scale_matrix(&matrix, 20.0f, 80.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_matrix_identity(&matrix); + translate_matrix(&matrix, 160.0f, 640.0f); + scale_matrix(&matrix, 40.0f, 160.0f); + rotate_matrix(&matrix, M_PI / -5.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1PathGeometry_Release(geometry); + + set_matrix_identity(&matrix); + scale_matrix(&matrix, 0.5f, 1.0f); + translate_matrix(&matrix, -80.0f, 0.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_matrix_identity(&matrix); + rotate_matrix(&matrix, M_PI / 2.0f); + translate_matrix(&matrix, 80.0f, -320.0f); + scale_matrix(&matrix, 2.0f, 0.25f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1Factory_CreateGeometryGroup(factory, D2D1_FILL_MODE_WINDING, + (ID2D1Geometry**) &transformed_geometry, 4, &geometry_group); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1TransformedGeometry_Release(transformed_geometry[3]); + ID2D1TransformedGeometry_Release(transformed_geometry[2]); + ID2D1TransformedGeometry_Release(transformed_geometry[1]); + ID2D1TransformedGeometry_Release(transformed_geometry[0]); + + ID2D1RenderTarget_BeginDraw(rt); + ID2D1RenderTarget_Clear(rt, &color); + ID2D1RenderTarget_DrawGeometry(rt, (ID2D1Geometry *)geometry_group, (ID2D1Brush *)brush, 10.0f, NULL); + hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1GeometryGroup_Release(geometry_group); + + match = compare_figure(&ctx, 0, 0, 160, 160, 0xff652e89, 256, + "iTANiwEagQEkeSp0LnIWAhZyFAYUchQGFHIUBhRyFAYUchQGFHIUBhRyFAYUchQGFHIUBhRyFAYU" + "cxQFFHMUBRRzFAUUcxQFFHMUBRRzFAUUcxQFFHMUBRRzFAUUcxQFFHQUBBR0FAQUdBQDFHUUAxR1" + "FAMUdRQDFHUUAxR1FQIUdhQCFHYUAhR2FAIUdhQCFHYUAhR2FAIUdhQBFHgoeCh4KHkmeiZ7JHwk" + "fSJ+In8ggAEfggEeggEdhAEchQEbhQEahwEZhwEYiQEXiQEWigEWigEWigEWiwEViwEViwEViwEV" + "igEXiQEXiQEXiQEYhwEZhgEbgwEefyR5KXQvbxgEGG4VBxhtMnAudCp6IoMBGOMu"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 160, 0, 320, 160, 0xff652e89, 512, + "xpcBB7QCEqkCG6ACJJgCLI8CNYcCHgMc/gEeDBr4AR4UGPIBHR0W7AEdIxbmAR0pFt8BHTAV2gEd" + "MBrWARwuIdMBGiwi1gEYKiPZARYoJNwBFiQk4AEWHyWxAQQvFhsltgEKKBYWJrwBECBOwQEXF0rI" + "ARwOSM4Ba9UBYeABRf0BOIoCMZECLJYCKJoCJ5wCJp0CJJ8CIqICH6QCHagCGa4CFLoCB/yUAQAA"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 0, 160, 160, 320, 0xff652e89, 512, + "yWQBnQEEmQEHlgELkwENkAEQjgETiwEVigEXhwEZhgEahQEcgwEdggEfgAEgfyF+I30jfCR8JXom" + "eid4KHgodxQCFHYUAhR1FAMUdBUEFHMUBRRyFQUUchQHFHEUBxRwFAgUcBQJFG4UChRuFAoUbRUL" + "FGwUDBRsFAwUbBQNFGwUDBRsFAwUbRQMFGwUDBRsFAwUbRQLFWwUDBRtFAsUbRQLFG0VCxRtFAsU" + "bRQLFG4UCxRtFAsUbhQKFG4UCxRuFAoUbhQKFG4VCRRvFAoUbhQKFG8UCRRvFAoUbxQJFG8UCRRw" + "FAgVbxQJFHAUCBRwFAgUcBUIFHAUCBRwFAgUcRQHFHEUBxRyFAYUchQGFHMUBRRzFAUUdBQEFHQU" + "BBR1FAQUdBQEFHUUAxR1FAMUdhQCFHYUAhR2FQEUdxQBFHcpeCh4KHkneSd6JnoneiZ7JXwkfSN+" + "In8hgAEggQEfgwEdhAEdhAEchQEbhgEahwEZiAEYGAFwGBYCcRcUBHEXEgZyFhEHchcOCXMWDAtz" + "FgsMdBYIDnQWBhB1FgQQdhYCEnYqdyl3KXcpeCd5J3kneSd5JnomeyR8JHwkfCN9I30ifiF/IX4h" + "fyF/IH8ggAEgfyCAASCAAR+AAR+BAR6CAR6BAR6CAR2CAR2DARyEARuEARuFARqGARmGARiKARSR" + "AQqhYwAA"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 160, 160, 320, 320, 0xff652e89, 1024, + "ytABA7gCCbICD60CFKkCF6cCGqMCHqACIZ0CJJoCJpgCKZUCFgIUkgIWBBWPAhYHFI4CFQoUjAIV" + "DBSKAhUNFYgCFQ8UhwIVERSFAhUTFIMCFRQVgQIUFxSAAhQZFP4BFBoV/AEUHBT7ARQeFPkBFB8V" + "9wEUIRT2ARQjFPQBFSMV8gEVJRTxARUnFPABFCgV7gEUKhTtARQsFOwBFCwV7AEULBTsARUsFOwB" + "FSsV7AEULBTtARQsFO0BFCsU7QEVKxTtARUqFe0BFSoU7gEUKxTuARQqFe4BFCoU7wEUKhTuARUp" + "FO8BFSkU7wEVKBXvARUoFPABFCkU8AEUKBTxARQoFPEBFCcV8QEUJxTxARUnFPEBFSYU8gEVJhTy" + "ARUlFfIBFSUU8wEUJRXzARQlFPQBFCUU9AEUJBT1ARQkFPUBFCMU9gEUIhT2ARUhFPcBFSAU+AEV" + "HxT5ARUeFPoBFR4U+gEVHRT7ARUcFPwBFRsU/QEVGhT+ARUZFP8BFBkUgAIUGBSBAhQXFIICFBcU" + "ggIUFhSDAhQVFIQCFBQUhQIUExSGAhQSFIcCFBIUhwIUERSIAhUPFIkCFg0UigIXCxSNAhYJFI8C" + "FggUkAIXBRSSAhcDFJQCFwEUlgIrlwIpmgImnAIkngIjnwIhoQIfowIepAIcpgIbpgIaqAIZqAIZ" + "qAIYKwP7ARgnBf0BGCMI/QEZHgz+ARgbD/8BGBcSgAIYEhaAAhoNGIICGggcgwIaBB+DAjyEAjyF" + "AjqGAjmIAjiIAiECFIkCFAIIBBSKAhQNFIsCFAwUjAIUCxSNAhQKFI4CFAkUjwIUBxWQAhQGFZEC" + "FAUVkQIUBRWRAhQFFZECFQMVkwIUAxWTAhQDFZMCFAIVlAIVARWVAiqVAimWAimWAiiYAiaZAiaZ" + "AiWaAiScAiKdAiGeAh+hAhyjAhmuAg3GxgEA"); + ok(match, "Figure does not match.\n"); + + hr = ID2D1Factory_CreatePathGeometry(factory, &geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = ID2D1PathGeometry_Open(geometry, &sink); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + set_point(&point, 20.0f, 80.0f); ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW); quadratic_to(sink, 20.0f, 160.0f, 60.0f, 160.0f); @@ -8002,6 +8114,7 @@ static void test_draw_geometry(BOOL d3d11) static void test_fill_geometry(BOOL d3d11) { ID2D1TransformedGeometry *transformed_geometry[4]; + ID2D1GeometryGroup *geometry_group; ID2D1RectangleGeometry *rect_geometry[2]; D2D1_POINT_2F point = {0.0f, 0.0f}; D2D1_ROUNDED_RECT rounded_rect; @@ -8719,6 +8832,112 @@ static void test_fill_geometry(BOOL d3d11) hr = ID2D1PathGeometry_Open(geometry, &sink); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ set_point(&point, -0.402914f, 0.915514f); + ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED); + quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f); + quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f); + quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f); + quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f); + quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f); + quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f); + quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f); + quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f); + quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f); + quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f); + quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f); + quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f); + ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED); + + hr = ID2D1GeometrySink_Close(sink); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1GeometrySink_Release(sink); + + set_matrix_identity(&matrix); + translate_matrix(&matrix, 40.0f, 160.0f); + scale_matrix(&matrix, 20.0f, 80.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_matrix_identity(&matrix); + translate_matrix(&matrix, 160.0f, 640.0f); + scale_matrix(&matrix, 40.0f, 160.0f); + rotate_matrix(&matrix, M_PI / -5.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1PathGeometry_Release(geometry); + + set_matrix_identity(&matrix); + scale_matrix(&matrix, 0.5f, 1.0f); + translate_matrix(&matrix, -80.0f, 0.0f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_matrix_identity(&matrix); + rotate_matrix(&matrix, M_PI / 2.0f); + translate_matrix(&matrix, 80.0f, -320.0f); + scale_matrix(&matrix, 2.0f, 0.25f); + hr = ID2D1Factory_CreateTransformedGeometry(factory, + (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1Factory_CreateGeometryGroup(factory, D2D1_FILL_MODE_WINDING, + (ID2D1Geometry**) &transformed_geometry, 4, &geometry_group); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1TransformedGeometry_Release(transformed_geometry[3]); + ID2D1TransformedGeometry_Release(transformed_geometry[2]); + ID2D1TransformedGeometry_Release(transformed_geometry[1]); + ID2D1TransformedGeometry_Release(transformed_geometry[0]); + + ID2D1RenderTarget_BeginDraw(rt); + ID2D1RenderTarget_Clear(rt, &color); + ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry_group, (ID2D1Brush *)brush, NULL); + hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1GeometryGroup_Release(geometry_group); + + match = compare_figure(&ctx, 0, 0, 160, 160, 0xff652e89, 32, + "zzIBlwEOjQEXiAEahgEahgEahgEahgEahgEahgEahgEahgEahgEahgEahwEZhwEZhwEZhwEZhwEZ" + "hwEZhwEZhwEZhwEZhwEZiAEYiAEYiAEXiQEXiQEXiQEXiQEXiQEXigEWigEWigEWigEWigEWigEW" + "igEVjAEUjAEUjAEUjQESjgESjwEQkAEQkQEOkgENlAEMlAELlgEKlwEImAEImQEHmQEGmwEFmwEE" + "nQEDnQECngECngECngECnwEBnwEBnwEBnwEBngEDnQEDnQEDnQEEmwEFmgEHmQEHlwELkQERjAEX" + "hgEdhAEfgwEchwEWjwEMqTEA"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 160, 0, 320, 160, 0xff652e89, 32, + "h58BBrUCD6wCGKQCIJsCKZMCMIwCNoUCPf8BQ/kBSPQBTu0BTu4BTfEBSfUBRfkBQf0BPYECOYUC" + "NIoCMI4CK+UBAS0W/AEHIweQAgsZBpcCEAwIngIepAIZqQIWrAITsAIRswIOtQIMuAIJuwIHwAIB" + "ypwB"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 0, 160, 160, 320, 0xff652e89, 32, + "wW4DnAEEmwEFmgEHmAEIlwEKlQELlAEMkwEOkQEPkAEQkAERjgESjgESjQEUjAEUiwEWigEWiQEX" + "iQEYhwEZhwEZhgEbhQEbhAEchAEdggEeggEeggEfgAEggAEggAEhgAEggAEggQEggAEggAEggQEf" + "gQEggQEfgQEfggEfgQEfgQEfggEfgQEfggEeggEfggEeggEeggEegwEeggEegwEdgwEegwEdgwEd" + "hAEchAEdhAEchAEchAEdhAEchAEchQEbhQEbhgEahgEahwEZhwEZiAEYiAEYiQEYiAEYiQEXiQEX" + "igEWigEWiwEViwEVjAEUjAEUjAEUjQETjQETjgESjgETjgESjwERkAEQkgEOkwENlAEMlQELlgEK" + "lwEJmAEJmAEImQEHmgEGmwEFnAEEnQEEnQEDnQEDngECngEDngECngECnwECngECnwECngECngED" + "ngECEgGLAQMQAosBAw4EjAEDCwWNAQQJBo0BBQYIjQEHAgqNARKOARKPARCQARCQARCQAQ+RAQ6S" + "AQ6SAQ2TAQ2SAQ2TAQ2TAQyTAQyUAQyTAQyUAQuVAQuUAQuVAQqWAQmWAQqWAQmXAQiXAQiYAQeY" + "AQeZAQWbAQSDZwAA"); + ok(match, "Figure does not match.\n"); + match = compare_figure(&ctx, 160, 160, 320, 320, 0xff652e89, 32, + "g90BBLkCCLYCC7ICDrACEa0CFKoCF6cCGqQCHKMCHqECIJ8CIpwCJJsCJpkCKJcCKZYCK5QCLZIC" + "L5ACMI8CMo0CNIsCNYoCN4gCOYcCOYYCO4QCPYICPoECQIACQYACQIECQIACQIECQIECQIECP4IC" + "P4ICP4ECP4ICP4ICPoMCPoMCPoMCPYQCPYMCPYQCPYQCPYQCPIUCPIUCPIUCO4YCO4YCOoYCO4YC" + "OocCOocCOocCOYgCOYgCOIkCOIkCN4oCNosCNYwCNI0CM44CMo4CM44CMo8CMZACMJECL5ICLpMC" + "LZQCLJUCK5YCK5YCKpcCKZgCKJkCJ5oCJpsCJpsCJZwCJJ4CIqACIKICH6MCHaUCG6cCGakCF6wC" + "Fa0CE68CEbECD7MCDrQCDLYCCrgCCbkCB7sCBrsCBbwCBbwCBL0CBL0CBL0CBL0CA70CBL0CBL0C" + "BLwCBSUBlgIFIQSXAgYbCJcCBxcKmQIIEQ6ZAgoMEJoCDQUTnAIknAIjnQIingIhnwIgoAIfoQIe" + "ogIdowIcpAIbpQIapQIZpgIZpgIZpwIYpwIXqAIXqAIXqQIVqgIVqgIUqwITrQISrQIRrgIQsAIO" + "sQIMswILtQIIhs4B"); + ok(match, "Figure does not match.\n"); + + hr = ID2D1Factory_CreatePathGeometry(factory, &geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = ID2D1PathGeometry_Open(geometry, &sink); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + set_point(&point, -0.402914f, 0.915514f); ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW); quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);