Index: third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
index 8504021eea4c5e77618401dfd9af5fa839648687..93a7f66d944274b4b8b90ae60a1ca830143f2724 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp |
@@ -833,12 +833,18 @@ PaintResult PaintLayerPainter::PaintFragmentByApplyingTransform( |
LayoutPoint delta; |
paint_layer_.ConvertToLayerCoords(painting_info.root_layer, delta); |
delta.MoveBy(fragment_translation); |
+ delta += painting_info.sub_pixel_accumulation; |
+ IntPoint rounded_delta = RoundedIntPoint(delta); |
+ |
TransformationMatrix transform( |
paint_layer_.RenderableTransform(painting_info.GetGlobalPaintFlags())); |
- IntPoint rounded_delta = RoundedIntPoint(delta); |
transform.PostTranslate(rounded_delta.X(), rounded_delta.Y()); |
- LayoutSize adjusted_sub_pixel_accumulation = |
- painting_info.sub_pixel_accumulation + (delta - rounded_delta); |
+ |
+ LayoutSize new_sub_pixel_accumulation; |
+ if (transform.IsIdentityOrTranslation()) |
+ new_sub_pixel_accumulation += delta - rounded_delta; |
+ // Otherwise discard the sub-pixel remainder because paint offset can't be |
+ // transformed by a non-translation transform. |
// TODO(jbroman): Put the real transform origin here, instead of using a |
// matrix with the origin baked in. |
@@ -852,7 +858,7 @@ PaintResult PaintLayerPainter::PaintFragmentByApplyingTransform( |
&paint_layer_, |
LayoutRect(EnclosingIntRect( |
transform.Inverse().MapRect(painting_info.paint_dirty_rect))), |
- painting_info.GetGlobalPaintFlags(), adjusted_sub_pixel_accumulation); |
+ painting_info.GetGlobalPaintFlags(), new_sub_pixel_accumulation); |
transformed_painting_info.ancestor_has_clip_path_clipping = |
painting_info.ancestor_has_clip_path_clipping; |