From 1baecca49a02625ab3399cb09119422181dc00ea Mon Sep 17 00:00:00 2001 From: Artur Wieczorek <7330332+a-wi@users.noreply.github.com> Date: Tue, 29 Nov 2022 18:39:42 +0200 Subject: [PATCH] Add tests to check clipping for wxGCDC Tests to check clipping when origin of the parent wxDC is shifted and has negative coordinates. --- tests/graphics/clippingbox.cpp | 521 +++++++++++++++++++-------------- 1 file changed, 296 insertions(+), 225 deletions(-) diff --git a/tests/graphics/clippingbox.cpp b/tests/graphics/clippingbox.cpp index eb89e0541b..7dc2e9a57f 100644 --- a/tests/graphics/clippingbox.cpp +++ b/tests/graphics/clippingbox.cpp @@ -25,7 +25,7 @@ #include "testfile.h" #include "waitforpaint.h" -static const wxSize s_dcSize(120, 140); +static const wxSize s_dcSize(260, 300); static const wxColour s_bgColour(*wxWHITE); // colour to draw outside clipping box static const wxColour s_fgColour(*wxGREEN); // colour to draw inside clipping box static const wxColour s_tmpColour(*wxBLUE); @@ -618,7 +618,7 @@ static void OneRegionOverTransformedDC(wxDC& dc, const wxBitmap& bmp, bool check // Setting one clipping region inside DC area // with applied some transformations. - wxRect r1(-10, -20, 80, 75); + wxRect r1(-5, -10, 80, 75); #if wxUSE_DC_TRANSFORM_MATRIX if ( useTransformMatrix ) @@ -639,6 +639,7 @@ static void OneRegionOverTransformedDC(wxDC& dc, const wxBitmap& bmp, bool check dc.SetClippingRegion(r1); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); + wxRect r2; if ( checkExtCoords ) { @@ -775,20 +776,20 @@ static void OneRegionAndDCTransformation(wxDC& dc, const wxBitmap& bmp, bool che // Setting one clipping region inside DC area // and applying DC transformation afterwards. - wxRect r(-10, -21, 26, 21); + wxRect r(-5, -7, 26, 21); #if wxUSE_DC_TRANSFORM_MATRIX if ( useTransformMatrix ) { wxAffineMatrix2D m; - m.Translate(42, 78); + m.Translate(52, 87); m.Scale(2.0, 3.0); dc.SetTransformMatrix(m); } else #endif // wxUSE_DC_TRANSFORM_MATRIX { - dc.SetDeviceOrigin(10, 15); + dc.SetDeviceOrigin(20, 24); dc.SetUserScale(0.5, 1.5); dc.SetLogicalScale(4.0, 2.0); dc.SetLogicalOrigin(-16, -21); @@ -817,8 +818,9 @@ static void OneRegionAndDCTransformation(wxDC& dc, const wxBitmap& bmp, bool che dc.SetClippingRegion(x, y, w, h); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); - const int clipX = -13; - const int clipY = -24; + + const int clipX = -3; + const int clipY = -7; const int clipW = 26; const int clipH = 21; if ( checkExtCoords ) @@ -1095,7 +1097,7 @@ static void OneLargeDevRegion(wxDC& dc, const wxBitmap& bmp, bool checkExtCoords dc.SetLogicalScale(4.0, 2.0); dc.SetLogicalOrigin(-15, -20); } - wxRegion reg(-10, -20, s_dcSize.GetWidth()+30, s_dcSize.GetHeight()+50); + wxRegion reg(-20, -30, s_dcSize.GetWidth()+30, s_dcSize.GetHeight()+50); dc.SetDeviceClippingRegion(reg); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); @@ -1145,7 +1147,7 @@ static void OneOuterDevRegion(wxDC& dc, const wxBitmap& bmp, bool useTransformMa dc.SetLogicalScale(4.0, 2.0); dc.SetLogicalOrigin(-15, -20); } - wxRegion reg(200, 80, 20, 40); + wxRegion reg(300, 80, 20, 40); dc.SetDeviceClippingRegion(reg); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); @@ -1236,15 +1238,15 @@ static void OneDevRegionNonRect(wxDC& dc, const wxBitmap& bmp, bool checkExtCoor // Setting one triangular clipping region in device coordinates. const wxPoint poly[3] = { - wxPoint(3, 5), - wxPoint(68, 18), - wxPoint(40, 72) + wxPoint(13, 25), + wxPoint(68, 38), + wxPoint(40, 92) }; // Expected clipping box in device coordinates. - const int clipX = 4; - const int clipY = 6; - const int clipW = 64; + const int clipX = 14; + const int clipY = 26; + const int clipW = 54; const int clipH = 66; // Draw image with reference triangle. @@ -1407,7 +1409,7 @@ static void OneDevRegionOverTransformedDC(wxDC& dc, const wxBitmap& bmp, bool ch // Set one clipping region in device coordinates inside // DC area with applied some transformations. - wxRect r1(8, 15, 60, 75); + wxRect r1(18, 35, 60, 75); #if wxUSE_DC_TRANSFORM_MATRIX if ( useTransformMatrix ) @@ -1462,8 +1464,8 @@ static void OneDevRegionOverRotatedDC(wxDC& dc) return; // Setting one clipping region inside DC area. - const int x = 8; - const int y = 15; + const int x = 28; + const int y = 35; const int w = 60; const int h = 75; @@ -1532,7 +1534,7 @@ static void OneDevRegionAndDCTransformation(wxDC& dc, const wxBitmap& bmp, bool // Set one clipping region in device coordinates inside // DC area and apply DC transformation afterwards. - wxRect r1(8, 15, 60, 75); + wxRect r1(28, 60, 60, 75); #if wxUSE_DC_TRANSFORM_MATRIX if ( useTransformMatrix ) @@ -1576,6 +1578,7 @@ static void OneDevRegionAndDCTransformation(wxDC& dc, const wxBitmap& bmp, bool dc.SetClippingRegion(x, y, w, h); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); + wxRect r2(0, 0, s_dcSize.GetWidth(), s_dcSize.GetHeight()); wxRect r = r1.Intersect(r2); REQUIRE( !r.IsEmpty() ); @@ -1668,12 +1671,12 @@ static void TwoDevRegionsOverlappingNegDim(wxDC& dc, const wxBitmap& bmp, bool c // Final clipping box should be an intersection of these two regions // with positive size values. const int x1 = 31; - const int y1 = 20; + const int y1 = 40; const int w1 = -80; - const int h1 = -75; + const int h1 = -95; const int x2 = 20; - const int y2 = 6; + const int y2 = 30; const int w2 = 40; const int h2 = 30; wxClipRect r1(x1, y1, w1, h1); @@ -1703,6 +1706,7 @@ static void TwoDevRegionsOverlappingNegDim(wxDC& dc, const wxBitmap& bmp, bool c dc.SetDeviceClippingRegion(reg2); dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); + if ( checkExtCoords ) { wxPoint pos = dc.DeviceToLogical(r.GetPosition()); @@ -1820,7 +1824,12 @@ static void InitialStateWithRotatedGCForDC(wxGCDC& dc, const wxBitmap& bmp, cons // Initial wxGCDC clipping box with rotated wxGraphicsContext. wxGraphicsContext* gc = dc.GetGraphicsContext(); gc->Rotate(wxDegToRad(6)); - + { + // Flush cashed clipping region extents + wxPoint org = dc.GetDeviceOrigin(); + dc.SetDeviceOrigin(org.x + 1, org.y); + dc.SetDeviceOrigin(org.x, org.y); + } dc.SetBackground(wxBrush(s_fgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); @@ -2194,53 +2203,69 @@ TEST_CASE("ClippingBoxTestCase::wxDC", "[clip][dc]") #if wxUSE_GRAPHICS_CONTEXT TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") { - wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(10, 20)); + wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); +#ifdef __WXMSW__ + int depth = GENERATE(24, 32); + wxBitmap bmp(s_dcSize, depth); +#else wxBitmap bmp(s_dcSize); +#endif wxMemoryDC mdc(bmp); mdc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); mdc.Clear(); mdc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); + mdc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); + wxRect dcClip; + mdc.GetClippingBox(dcClip); + wxPoint dcOrigin = -mdc.DeviceToLogical(0, 0); wxGCDC dc(mdc); + dc.GetGraphicsContext()->SetAntialiasMode(wxANTIALIAS_NONE); + dc.GetGraphicsContext()->DisableOffset(); + wxRect gdcClip; + dc.GetClippingBox(gdcClip); + REQUIRE(dcClip == gdcClip); + REQUIRE(-dcOrigin == dcClip.GetTopLeft()); SECTION("InitialState") { - InitialState(dc, bmp, mdc.GetDeviceOrigin()); + InitialState(dc, bmp, dcOrigin); } SECTION("InitialStateWithTransformedDC 1") { - InitialStateWithTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("InitialStateWithTransformedDC 2") { - InitialStateWithTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("InitialStateWithTransformedDC Transform Matrix") { - InitialStateWithTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("InitialStateWithRotatedDC") { - InitialStateWithRotatedDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedDC(dc, bmp, dcOrigin); } SECTION("SameRegionRepeatRotatedDC") { - SameRegionRepeatRotatedDC(dc, mdc.GetDeviceOrigin()); + SameRegionRepeatRotatedDC(dc, dcOrigin); } SECTION("OneRegion") { - OneRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneRegion(dc, bmp, dcOrigin); } SECTION("OneLargeRegion") { - OneLargeRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneLargeRegion(dc, bmp, dcOrigin); } SECTION("OneOuterRegion") @@ -2250,12 +2275,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneRegionNegDim") { - OneRegionNegDim(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionNegDim(dc, bmp, dcOrigin); } SECTION("OneRegionAndReset") { - OneRegionAndReset(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionAndReset(dc, bmp, dcOrigin); } SECTION("OneRegionAndEmpty") @@ -2265,17 +2290,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneRegionOverTransformedDC 1") { - OneRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionOverTransformedDC 2") { - OneRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionOverTransformedDC Transform Matrix") { - OneRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionOverRotatedDC") @@ -2285,17 +2310,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneRegionAndDCTransformation 1") { - OneRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionAndDCTransformation 2") { - OneRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionAndDCTransformation Transform Matrix") { - OneRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionRTL") @@ -2305,12 +2330,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("TwoRegionsOverlapping") { - TwoRegionsOverlapping(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlapping(dc, bmp, dcOrigin); } SECTION("TwoRegionsOverlappingNegDim") { - TwoRegionsOverlappingNegDim(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlappingNegDim(dc, bmp, dcOrigin); } SECTION("TwoRegionsNonOverlapping") @@ -2325,17 +2350,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneDevRegion 1") { - OneDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegion 2") { - OneDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegion Transform Matrix") { - OneDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionRTL") @@ -2350,17 +2375,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneLargeDevRegion 1") { - OneLargeDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneLargeDevRegion 2") { - OneLargeDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneLargeDevRegion Transform Matrix") { - OneLargeDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneOuterDevRegion") @@ -2375,47 +2400,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneDevRegionNegDim 1") { - OneDevRegionNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNegDim 2") { - OneDevRegionNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNegDim Transform Matrix") { - OneDevRegionNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionNonRect 1") { - OneDevRegionNonRect(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNonRect 2") { - OneDevRegionNonRect(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNonRect Transform Matrix") { - OneDevRegionNonRect(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndReset 1") { - OneDevRegionAndReset(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndReset 2") { - OneDevRegionAndReset(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndReset Transform Matrix") { - OneDevRegionAndReset(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndEmpty") @@ -2429,17 +2454,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") } SECTION("OneDevRegionOverTransformedDC 1") { - OneDevRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC 2") { - OneDevRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC Transform Matrix") { - OneDevRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionOverRotatedDC") @@ -2449,47 +2474,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("OneDevRegionAndDCTransformation 1") { - OneDevRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation 2") { - OneDevRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation Transform Matrix") { - OneDevRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlapping 1") { - TwoDevRegionsOverlapping(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping 2") { - TwoDevRegionsOverlapping(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping Transform Matrix") { - TwoDevRegionsOverlapping(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 1") { - TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 2") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim Transform Matrix") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsNonOverlapping") @@ -2514,7 +2539,7 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") SECTION("InitialStateWithRotatedGCForDC") { - InitialStateWithRotatedGCForDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedGCForDC(dc, bmp, dcOrigin); } } @@ -2522,56 +2547,68 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC", "[clip][dc][gcdc]") #if wxUSE_GRAPHICS_GDIPLUS TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") { - wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(10, 20)); + wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + int depth = GENERATE(24, 32); - wxBitmap bmp(s_dcSize); + wxBitmap bmp(s_dcSize, depth); wxMemoryDC mdc(bmp); mdc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); mdc.Clear(); mdc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); + mdc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); + wxRect dcClip; + mdc.GetClippingBox(dcClip); + wxPoint dcOrigin = -mdc.DeviceToLogical(0, 0); wxGraphicsRenderer* rend = wxGraphicsRenderer::GetGDIPlusRenderer(); REQUIRE(rend); wxGraphicsContext* ctx = rend->CreateContext(mdc); + ctx->SetAntialiasMode(wxANTIALIAS_NONE); + ctx->DisableOffset(); wxGCDC dc(ctx); + wxRect gdcClip; + dc.GetClippingBox(gdcClip); + REQUIRE(dcClip == gdcClip); + REQUIRE(-dcOrigin == dcClip.GetTopLeft()); SECTION("InitialState") { - InitialState(dc, bmp, mdc.GetDeviceOrigin()); + InitialState(dc, bmp, dcOrigin); } SECTION("InitialStateWithTransformedDC 1") { - InitialStateWithTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("InitialStateWithTransformedDC 2") { - InitialStateWithTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("InitialStateWithTransformedDC Transform Matrix") { - InitialStateWithTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("InitialStateWithRotatedDC") { - InitialStateWithRotatedDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedDC(dc, bmp, dcOrigin); } SECTION("SameRegionRepeatRotatedDC") { - SameRegionRepeatRotatedDC(dc, mdc.GetDeviceOrigin()); + SameRegionRepeatRotatedDC(dc, dcOrigin); } SECTION("OneRegion") { - OneRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneRegion(dc, bmp, dcOrigin); } SECTION("OneLargeRegion") { - OneLargeRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneLargeRegion(dc, bmp, dcOrigin); } SECTION("OneOuterRegion") @@ -2581,12 +2618,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneRegionNegDim") { - OneRegionNegDim(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionNegDim(dc, bmp, dcOrigin); } SECTION("OneRegionAndReset") { - OneRegionAndReset(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionAndReset(dc, bmp, dcOrigin); } SECTION("OneRegionAndEmpty") @@ -2596,17 +2633,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneRegionOverTransformedDC 1") { - OneRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionOverTransformedDC 2") { - OneRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionOverTransformedDC Transform Matrix") { - OneRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionOverRotatedDC") @@ -2616,17 +2653,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneRegionAndDCTransformation 1") { - OneRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionAndDCTransformation 2") { - OneRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionAndDCTransformation Transform Matrix") { - OneRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionRTL") @@ -2636,12 +2673,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("TwoRegionsOverlapping") { - TwoRegionsOverlapping(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlapping(dc, bmp, dcOrigin); } SECTION("TwoRegionsOverlappingNegDim") { - TwoRegionsOverlappingNegDim(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlappingNegDim(dc, bmp, dcOrigin); } SECTION("TwoRegionsNonOverlapping") @@ -2656,17 +2693,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneDevRegion 1") { - OneDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegion 2") { - OneDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegion Transform Matrix") { - OneDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionRTL") @@ -2681,17 +2718,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneLargeDevRegion 1") { - OneLargeDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneLargeDevRegion 2") { - OneLargeDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneLargeDevRegion Transform Matrix") { - OneLargeDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneOuterDevRegion") @@ -2706,47 +2743,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneDevRegionNegDim 1") { - OneDevRegionNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNegDim 2") { - OneDevRegionNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNegDim Transform Matrix") { - OneDevRegionNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionNonRect 1") { - OneDevRegionNonRect(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNonRect 2") { - OneDevRegionNonRect(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNonRect Transform Matrix") { - OneDevRegionNonRect(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndReset 1") { - OneDevRegionAndReset(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndReset 2") { - OneDevRegionAndReset(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndReset Transform Matrix") { - OneDevRegionAndReset(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndEmpty") @@ -2761,17 +2798,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneDevRegionOverTransformedDC 1") { - OneDevRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC 2") { - OneDevRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC Transform Matrix") { - OneDevRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionOverRotatedDC") @@ -2782,47 +2819,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("OneDevRegionAndDCTransformation 1") { - OneDevRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation 2") { - OneDevRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation Transform Matrix") { - OneDevRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlapping 1") { - TwoDevRegionsOverlapping(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping 2") { - TwoDevRegionsOverlapping(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping Transform Matrix") { - TwoDevRegionsOverlapping(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 1") { - TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 2") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim Transform Matrix") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsNonOverlapping") @@ -2847,7 +2884,7 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") SECTION("InitialStateWithRotatedGCForDC") { - InitialStateWithRotatedGCForDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedGCForDC(dc, bmp, dcOrigin); } } #endif // wxUSE_GRAPHICS_GDIPLUS @@ -2855,56 +2892,68 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(GDI+)", "[clip][dc][gcdc][gdiplus]") #if wxUSE_GRAPHICS_DIRECT2D TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") { - wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(10, 20)); + wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + int depth = GENERATE(24, 32); - wxBitmap bmp(s_dcSize); + wxBitmap bmp(s_dcSize, depth); wxMemoryDC mdc(bmp); mdc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); mdc.Clear(); mdc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); + mdc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); + wxRect dcClip; + mdc.GetClippingBox(dcClip); + wxPoint dcOrigin = -mdc.DeviceToLogical(0, 0); wxGraphicsRenderer* rend = wxGraphicsRenderer::GetDirect2DRenderer(); REQUIRE(rend); wxGraphicsContext* ctx = rend->CreateContext(mdc); + ctx->SetAntialiasMode(wxANTIALIAS_NONE); + ctx->DisableOffset(); wxGCDC dc(ctx); + wxRect gdcClip; + dc.GetClippingBox(gdcClip); + REQUIRE(dcClip == gdcClip); + REQUIRE(-dcOrigin == dcClip.GetTopLeft()); SECTION("InitialState") { - InitialState(dc, bmp, mdc.GetDeviceOrigin()); + InitialState(dc, bmp, dcOrigin); } SECTION("InitialStateWithTransformedDC 1") { - InitialStateWithTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("InitialStateWithTransformedDC 2") { - InitialStateWithTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("InitialStateWithTransformedDC Transform Matrix") { - InitialStateWithTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("InitialStateWithRotatedDC") { - InitialStateWithRotatedDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedDC(dc, bmp, dcOrigin); } SECTION("SameRegionRepeatRotatedDC") { - SameRegionRepeatRotatedDC(dc, mdc.GetDeviceOrigin()); + SameRegionRepeatRotatedDC(dc, dcOrigin); } SECTION("OneRegion") { - OneRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneRegion(dc, bmp, dcOrigin); } SECTION("OneLargeRegion") { - OneLargeRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneLargeRegion(dc, bmp, dcOrigin); } SECTION("OneOuterRegion") @@ -2914,12 +2963,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneRegionNegDim") { - OneRegionNegDim(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionNegDim(dc, bmp, dcOrigin); } SECTION("OneRegionAndReset") { - OneRegionAndReset(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionAndReset(dc, bmp, dcOrigin); } SECTION("OneRegionAndEmpty") @@ -2929,17 +2978,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneRegionOverTransformedDC 1") { - OneRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionOverTransformedDC 2") { - OneRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionOverTransformedDC Transform Matrix") { - OneRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionOverRotatedDC") @@ -2949,17 +2998,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneRegionAndDCTransformation 1") { - OneRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionAndDCTransformation 2") { - OneRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionAndDCTransformation Transform Matrix") { - OneRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionRTL") @@ -2969,12 +3018,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("TwoRegionsOverlapping") { - TwoRegionsOverlapping(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlapping(dc, bmp, dcOrigin); } SECTION("TwoRegionsOverlappingNegDim") { - TwoRegionsOverlappingNegDim(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlappingNegDim(dc, bmp, dcOrigin); } SECTION("TwoRegionsNonOverlapping") @@ -2989,17 +3038,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneDevRegion 1") { - OneDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegion 2") { - OneDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegion Transform Matrix") { - OneDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionRTL") @@ -3014,17 +3063,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneLargeDevRegion 1") { - OneLargeDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneLargeDevRegion 2") { - OneLargeDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneLargeDevRegion Transform Matrix") { - OneLargeDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneOuterDevRegion") @@ -3039,47 +3088,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneDevRegionNegDim 1") { - OneDevRegionNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNegDim 2") { - OneDevRegionNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNegDim Transform Matrix") { - OneDevRegionNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionNonRect 1") { - OneDevRegionNonRect(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNonRect 2") { - OneDevRegionNonRect(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNonRect Transform Matrix") { - OneDevRegionNonRect(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndReset 1") { - OneDevRegionAndReset(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndReset 2") { - OneDevRegionAndReset(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndReset Transform Matrix") { - OneDevRegionAndReset(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndEmpty") @@ -3094,17 +3143,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneDevRegionOverTransformedDC 1") { - OneDevRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC 2") { - OneDevRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC Transform Matrix") { - OneDevRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionOverRotatedDC") @@ -3114,47 +3163,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("OneDevRegionAndDCTransformation 1") { - OneDevRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation 2") { - OneDevRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation Transform Matrix") { - OneDevRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlapping 1") { - TwoDevRegionsOverlapping(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping 2") { - TwoDevRegionsOverlapping(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping Transform Matrix") { - TwoDevRegionsOverlapping(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 1") { - TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 2") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim Transform Matrix") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsNonOverlapping") @@ -3179,7 +3228,7 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") SECTION("InitialStateWithRotatedGCForDC") { - InitialStateWithRotatedGCForDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedGCForDC(dc, bmp, dcOrigin); } } #endif // wxUSE_GRAPHICS_DIRECT2D @@ -3188,56 +3237,72 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Direct2D)", "[clip][dc][gcdc][direct2d]") #if wxUSE_CAIRO TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") { - wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(10, 20)); + wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); +#ifdef __WXMSW__ + int depth = GENERATE(24, 32); + wxBitmap bmp(s_dcSize, depth); +#else wxBitmap bmp(s_dcSize); +#endif wxMemoryDC mdc(bmp); mdc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); mdc.Clear(); mdc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); + mdc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); + wxRect dcClip; + mdc.GetClippingBox(dcClip); + wxPoint dcOrigin = -mdc.DeviceToLogical(0, 0); wxGraphicsRenderer* rend = wxGraphicsRenderer::GetCairoRenderer(); REQUIRE(rend); wxGraphicsContext* ctx = rend->CreateContext(mdc); + ctx->SetAntialiasMode(wxANTIALIAS_NONE); + ctx->DisableOffset(); wxGCDC dc(ctx); + wxRect gdcClip; + dc.GetClippingBox(gdcClip); + REQUIRE(dcClip == gdcClip); + REQUIRE(-dcOrigin == dcClip.GetTopLeft()); SECTION("InitialState") { - InitialState(dc, bmp, mdc.GetDeviceOrigin()); + InitialState(dc, bmp, dcOrigin); } SECTION("InitialStateWithTransformedDC 1") { - InitialStateWithTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("InitialStateWithTransformedDC 2") { - InitialStateWithTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("InitialStateWithTransformedDC Transform Matrix") { - InitialStateWithTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + InitialStateWithTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("InitialStateWithRotatedDC") { - InitialStateWithRotatedDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedDC(dc, bmp, dcOrigin); } SECTION("SameRegionRepeatRotatedDC") { - SameRegionRepeatRotatedDC(dc, mdc.GetDeviceOrigin()); + SameRegionRepeatRotatedDC(dc, dcOrigin); } SECTION("OneRegion") { - OneRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneRegion(dc, bmp, dcOrigin); } SECTION("OneLargeRegion") { - OneLargeRegion(dc, bmp, mdc.GetDeviceOrigin()); + OneLargeRegion(dc, bmp, dcOrigin); } SECTION("OneOuterRegion") @@ -3247,12 +3312,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneRegionNegDim") { - OneRegionNegDim(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionNegDim(dc, bmp, dcOrigin); } SECTION("OneRegionAndReset") { - OneRegionAndReset(dc, bmp, mdc.GetDeviceOrigin()); + OneRegionAndReset(dc, bmp, dcOrigin); } SECTION("OneRegionAndEmpty") @@ -3262,17 +3327,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneRegionOverTransformedDC 1") { - OneRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionOverTransformedDC 2") { - OneRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionOverTransformedDC Transform Matrix") { - OneRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionOverRotatedDC") @@ -3282,17 +3347,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneRegionAndDCTransformation 1") { - OneRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneRegionAndDCTransformation 2") { - OneRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneRegionAndDCTransformation Transform Matrix") { - OneRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("OneRegionRTL") @@ -3302,12 +3367,12 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("TwoRegionsOverlapping") { - TwoRegionsOverlapping(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlapping(dc, bmp, dcOrigin); } SECTION("TwoRegionsOverlappingNegDim") { - TwoRegionsOverlappingNegDim(dc, bmp, mdc.GetDeviceOrigin()); + TwoRegionsOverlappingNegDim(dc, bmp, dcOrigin); } SECTION("TwoRegionsNonOverlapping") @@ -3322,17 +3387,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneDevRegion 1") { - OneDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegion 2") { - OneDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegion Transform Matrix") { - OneDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionRTL") @@ -3347,17 +3412,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneLargeDevRegion 1") { - OneLargeDevRegion(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, false, false, dcOrigin); } SECTION("OneLargeDevRegion 2") { - OneLargeDevRegion(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, false, dcOrigin); } SECTION("OneLargeDevRegion Transform Matrix") { - OneLargeDevRegion(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneLargeDevRegion(dc, bmp, true, true, dcOrigin); } SECTION("OneOuterDevRegion") @@ -3372,47 +3437,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneDevRegionNegDim 1") { - OneDevRegionNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNegDim 2") { - OneDevRegionNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNegDim Transform Matrix") { - OneDevRegionNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNegDim(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionNonRect 1") { - OneDevRegionNonRect(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionNonRect 2") { - OneDevRegionNonRect(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionNonRect Transform Matrix") { - OneDevRegionNonRect(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionNonRect(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndReset 1") { - OneDevRegionAndReset(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndReset 2") { - OneDevRegionAndReset(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndReset Transform Matrix") { - OneDevRegionAndReset(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndReset(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionAndEmpty") @@ -3427,17 +3492,17 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneDevRegionOverTransformedDC 1") { - OneDevRegionOverTransformedDC(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC 2") { - OneDevRegionOverTransformedDC(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionOverTransformedDC Transform Matrix") { - OneDevRegionOverTransformedDC(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionOverTransformedDC(dc, bmp, true, true, dcOrigin); } SECTION("OneDevRegionOverRotatedDC") @@ -3447,47 +3512,47 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("OneDevRegionAndDCTransformation 1") { - OneDevRegionAndDCTransformation(dc, bmp, false, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, false, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation 2") { - OneDevRegionAndDCTransformation(dc, bmp, true, false, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, false, dcOrigin); } SECTION("OneDevRegionAndDCTransformation Transform Matrix") { - OneDevRegionAndDCTransformation(dc, bmp, true, true, mdc.GetDeviceOrigin()); + OneDevRegionAndDCTransformation(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlapping 1") { - TwoDevRegionsOverlapping(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping 2") { - TwoDevRegionsOverlapping(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlapping Transform Matrix") { - TwoDevRegionsOverlapping(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlapping(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 1") { - TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, false, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim 2") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, false, dcOrigin); } SECTION("TwoDevRegionsOverlappingNegDim Transform Matrix") { - TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, mdc.GetDeviceOrigin()); + TwoDevRegionsOverlappingNegDim(dc, bmp, true, true, dcOrigin); } SECTION("TwoDevRegionsNonOverlapping") @@ -3512,7 +3577,7 @@ TEST_CASE("ClippingBoxTestCase::wxGCDC(Cairo)", "[clip][dc][gcdc][cairo]") SECTION("InitialStateWithRotatedGCForDC") { - InitialStateWithRotatedGCForDC(dc, bmp, mdc.GetDeviceOrigin()); + InitialStateWithRotatedGCForDC(dc, bmp, dcOrigin); } } #endif // wxUSE_CAIRO @@ -3842,6 +3907,11 @@ TEST_CASE("ClippingBoxTestCase::wxSVGFileDC", "[clip][dc][svgdc]") TEST_CASE("ClippingBoxTestCase::wxClientDC", "[clip][dc][clientdc]") { wxBitmap bmp; // We need wxNullBitmap because we can't check the output + // Ensure window is large enough for testing + wxSize winSize = wxTheApp->GetTopWindow()->GetSize(); + winSize.x = wxMax(winSize.x, s_dcSize.x + 50); + winSize.y = wxMax(winSize.y, s_dcSize.y + 50); + wxTheApp->GetTopWindow()->SetSize(winSize); #if defined(__WXGTK__) && !defined(__WXGTK3__) // Under wxGTK2 we need to have two children (at least) because if there // is exactly one child its size is set to fill the whole parent frame @@ -3849,7 +3919,6 @@ TEST_CASE("ClippingBoxTestCase::wxClientDC", "[clip][dc][clientdc]") wxScopedPtr w0(new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY)); #endif // wxGTK 2 wxScopedPtr win(new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY, wxPoint(0, 0))); - win->SetClientSize(s_dcSize); // Wait for the first paint event to be sure @@ -3859,8 +3928,7 @@ TEST_CASE("ClippingBoxTestCase::wxClientDC", "[clip][dc][clientdc]") waitForPaint.YieldUntilPainted(); wxClientDC dc(win.get()); - REQUIRE(dc.GetSize().x == s_dcSize.x); - REQUIRE(dc.GetSize().y == s_dcSize.y); + REQUIRE(dc.GetSize() == s_dcSize); dc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); @@ -4617,15 +4685,18 @@ static void RegionsAndPushPopState(wxScopedPtr& gc, const wxB TEST_CASE("ClippingBoxTestCaseGC::DefaultRenderer", "[clip][gc][default]") { wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); - wxPoint parentDcLocOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); +#ifdef __WXMSW__ int depth = GENERATE(24, 32); - wxBitmap bmp(s_dcSize, depth); +#else + wxBitmap bmp(s_dcSize); +#endif wxMemoryDC dc(bmp); dc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); dc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); - dc.SetLogicalOrigin(parentDcLocOrigin.x, parentDcLocOrigin.y); + dc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); wxRect dcClip; dc.GetClippingBox(dcClip); wxPoint dcOrigin = -dc.DeviceToLogical(0, 0); @@ -4722,7 +4793,7 @@ TEST_CASE("ClippingBoxTestCaseGC::DefaultRenderer", "[clip][gc][default]") TEST_CASE("ClippingBoxTestCaseGC::GDI+Renderer", "[clip][gc][gdiplus]") { wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); - wxPoint parentDcLocOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); int depth = GENERATE(24, 32); wxBitmap bmp(s_dcSize, depth); @@ -4730,7 +4801,7 @@ TEST_CASE("ClippingBoxTestCaseGC::GDI+Renderer", "[clip][gc][gdiplus]") dc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); dc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); - dc.SetLogicalOrigin(parentDcLocOrigin.x, parentDcLocOrigin.y); + dc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); wxRect dcClip; dc.GetClippingBox(dcClip); wxPoint dcOrigin = -dc.DeviceToLogical(0, 0); @@ -4827,7 +4898,7 @@ TEST_CASE("ClippingBoxTestCaseGC::GDI+Renderer", "[clip][gc][gdiplus]") TEST_CASE("ClippingBoxTestCaseGC::Direct2DRenderer", "[clip][gc][direct2d]") { wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); - wxPoint parentDcLocOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); int depth = GENERATE(24, 32); wxBitmap bmp(s_dcSize, depth); @@ -4835,7 +4906,7 @@ TEST_CASE("ClippingBoxTestCaseGC::Direct2DRenderer", "[clip][gc][direct2d]") dc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); dc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); - dc.SetLogicalOrigin(parentDcLocOrigin.x, parentDcLocOrigin.y); + dc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); wxRect dcClip; dc.GetClippingBox(dcClip); wxPoint dcOrigin = -dc.DeviceToLogical(0, 0); @@ -4933,7 +5004,7 @@ TEST_CASE("ClippingBoxTestCaseGC::Direct2DRenderer", "[clip][gc][direct2d]") TEST_CASE("ClippingBoxTestCaseGC::CairoRenderer", "[clip][gc][cairo]") { wxPoint parentDcDevOrigin = GENERATE(wxPoint(0, 0), wxPoint(4, 12), wxPoint(-6, -8)); - wxPoint parentDcLocOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); + wxPoint parentDcLogOrigin = GENERATE(wxPoint(0, 0), wxPoint(-6, -8), wxPoint(4, 12)); #ifdef __WXMSW__ int depth = GENERATE(24, 32); @@ -4945,7 +5016,7 @@ TEST_CASE("ClippingBoxTestCaseGC::CairoRenderer", "[clip][gc][cairo]") dc.SetBackground(wxBrush(s_bgColour, wxBRUSHSTYLE_SOLID)); dc.Clear(); dc.SetDeviceOrigin(parentDcDevOrigin.x, parentDcDevOrigin.y); - dc.SetLogicalOrigin(parentDcLocOrigin.x, parentDcLocOrigin.y); + dc.SetLogicalOrigin(parentDcLogOrigin.x, parentDcLogOrigin.y); wxRect dcClip; dc.GetClippingBox(dcClip); wxPoint dcOrigin = -dc.DeviceToLogical(0, 0);