Bug 1370757 - Only push device aligned clips. r?lsalzman draft
authorMarkus Stange <mstange@themasta.com>
Tue, 06 Jun 2017 19:19:51 -0400
changeset 592154 f6473095261e82fc679219e0caf75e6ac2abb5cd
parent 592129 8a990794c2ee923ccd839750912d10ff3a690a2a
child 592155 1a4f0e6bc57372b42e8d60cfbf0008fa99df55b7
push id63299
push userbmo:mstange@themasta.com
push dateSat, 10 Jun 2017 19:30:58 +0000
reviewerslsalzman
bugs1370757, 1364007
milestone55.0a1
Bug 1370757 - Only push device aligned clips. r?lsalzman The new clip from bug 1364007 can cause us to clip to a rectangle that's not aligned to device pixels. With the current rect inflation, we didn't notice, but if we want to remove the inflation then we need to make sure to round out the rect that we clip to. MozReview-Commit-ID: BO9zds8fiKI
gfx/thebes/gfxQuartzNativeDrawing.cpp
--- a/gfx/thebes/gfxQuartzNativeDrawing.cpp
+++ b/gfx/thebes/gfxQuartzNativeDrawing.cpp
@@ -45,16 +45,22 @@ gfxQuartzNativeDrawing::BeginNativeDrawi
 
     transform.PostTranslate(-mNativeRect.x, -mNativeRect.y);
     mTempDrawTarget->SetTransform(transform);
 
     dt = mTempDrawTarget;
   } else {
     // Clip the DT in case BorrowedCGContext needs to create a new layer.
     // This prevents it from creating a new layer the size of the window.
+    // But make sure that this clip is device pixel aligned.
+    Matrix transform = dt->GetTransform();
+
+    Rect deviceRect = transform.TransformBounds(mNativeRect);
+    deviceRect.RoundOut();
+    mNativeRect = transform.Inverse().TransformBounds(deviceRect);
     mDrawTarget->PushClipRect(mNativeRect);
   }
 
   MOZ_ASSERT(dt->GetBackendType() == BackendType::SKIA);
   mCGContext = mBorrowedContext.Init(dt);
 
   if (NS_WARN_IF(!mCGContext)) {
     // Failed borrowing CG context, so we need to clean up.