Bug 1388662 - Correct canvas transform in layers-free mode. r=mtseng draft
authorEthan Lin <ethlin@mozilla.com>
Wed, 09 Aug 2017 16:54:24 +0800
changeset 643093 53e0ba84d90478f7dbef9d1a5def403f4ad6d598
parent 642204 65507616792c990b1230888612dd7ffc13ed32b4
child 725205 df37db60b277801f50f7736a5660fe63dca2625a
push id72989
push userbmo:ethlin@mozilla.com
push dateWed, 09 Aug 2017 08:55:34 +0000
reviewersmtseng
bugs1388662
milestone57.0a1
Bug 1388662 - Correct canvas transform in layers-free mode. r=mtseng MozReview-Commit-ID: 5J0I1OTA6Ql
layout/generic/nsHTMLCanvasFrame.cpp
--- a/layout/generic/nsHTMLCanvasFrame.cpp
+++ b/layout/generic/nsHTMLCanvasFrame.cpp
@@ -172,21 +172,24 @@ public:
         wr::LayoutRect r = aSc.ToRelativeLayoutRect(bounds);
         aBuilder.PushIFrame(r, data->GetPipelineId().ref());
 
         gfx::Matrix4x4 scTransform;
         if (data->NeedsYFlip()) {
           scTransform = scTransform.PreTranslate(0, data->GetSize().height, 0).PreScale(1, -1, 1);
         }
 
+        gfxRect destGFXRect = mFrame->PresContext()->AppUnitsToGfxUnits(dest);
+        scTransform.PreScale(destGFXRect.Width() / canvasSizeInPx.width,
+                             destGFXRect.Height() / canvasSizeInPx.height, 1.0f);
+
         MaybeIntSize scaleToSize;
         LayerRect scBounds(0, 0, bounds.width, bounds.height);
         wr::ImageRendering filter = wr::ToImageRendering(nsLayoutUtils::GetSamplingFilterForFrame(mFrame));
         wr::MixBlendMode mixBlendMode = wr::MixBlendMode::Normal;
-
         aManager->WrBridge()->AddWebRenderParentCommand(OpUpdateAsyncImagePipeline(data->GetPipelineId().value(),
                                                                                    scBounds,
                                                                                    scTransform,
                                                                                    scaleToSize,
                                                                                    filter,
                                                                                    mixBlendMode));
         break;
       }