Index: views/view.cc |
diff --git a/views/view.cc b/views/view.cc |
index 392ca08337deb01e025c14d5e9a9ab472fb04af0..cf6a790e9068209cd4491adf80cd0eb2108fe9ae 100644 |
--- a/views/view.cc |
+++ b/views/view.cc |
@@ -413,8 +413,22 @@ void View::SetTransform(const ui::Transform& transform) { |
SchedulePaint(); |
} else { |
transform_.reset(new ui::Transform(transform)); |
- // TODO: this needs to trigger a paint on the widget. It shouldn't use |
- // SchedulePaint as we don't want to mark the views dirty. |
+#if defined(COMPOSITOR_2) |
+ if (!texture_.get()) { |
+ // We don't yet have a texture. SchedulePaint so one is created. |
+ SchedulePaint(); |
+ } else { |
+ // We have a texture. When the transform changes and the texture is up to |
+ // date we don't want to SchedulePaint as it'll trigger painting to the |
+ // texture. Instead we tell the Widget to paint, which makes the |
+ // compositor draw using the existing texture. |
+ // We schedule paint the complete bounds as compositor generally don't |
+ // support partial painting. |
+ Widget* widget = GetWidget(); |
+ if (widget) |
+ widget->SchedulePaintInRect(widget->GetRootView()->bounds()); |
+ } |
+#endif |
} |
} |
@@ -1169,9 +1183,19 @@ void View::PaintToTexture(const gfx::Rect& dirty_region) { |
return; |
if (ShouldPaintToTexture() && texture_needs_updating_) { |
- texture_clip_rect_ = dirty_region; |
- Paint(NULL); |
- texture_clip_rect_.SetRect(0, 0, 0, 0); |
+ if (!texture_.get()) { |
+ // If we have no texture paint the whole view. We do this to handle two |
+ // cases: |
+ // . Workaround for WidgetWin/WindowWin. In particular its possible to |
+ // create the rootview at the non-client size, even though we'll never |
+ // paint at that size. |
+ // . In case the texture is recreated and a partial paint was scheduled. |
+ Paint(NULL); |
+ } else { |
+ texture_clip_rect_ = dirty_region; |
+ Paint(NULL); |
+ texture_clip_rect_.SetRect(0, 0, 0, 0); |
+ } |
} else { |
// Forward to all children as a descendant may be dirty and have a texture. |
for (int i = child_count() - 1; i >= 0; --i) { |