cc: Add visible_rect to Draw*Quad::SetNew().

Currently the visible_rect is implicitly set to the quad's |rect| value
then later changed by the occlusion/culling code. Instead we want to
compute this value up front and set it on the quad when the quad is
created. So add it to the SetNew() method. Currently it should always
be set to the same value as the |rect|.

R=enne
BUG=344962

Review URL: https://codereview.chromium.org/185563008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255662 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/cc/layers/delegated_frame_provider_unittest.cc b/cc/layers/delegated_frame_provider_unittest.cc
index f29488d..a8e1683 100644
--- a/cc/layers/delegated_frame_provider_unittest.cc
+++ b/cc/layers/delegated_frame_provider_unittest.cc
@@ -50,6 +50,7 @@
     quad->SetNew(sqs.get(),
                  gfx::Rect(0, 0, 10, 10),
                  gfx::Rect(0, 0, 10, 10),
+                 gfx::Rect(0, 0, 10, 10),
                  resource_id,
                  false,
                  gfx::PointF(0.f, 0.f),
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
index fc3c448..31b52920 100644
--- a/cc/layers/delegated_renderer_layer_impl.cc
+++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -364,12 +364,14 @@
 
     if (!top.IsEmpty()) {
       scoped_ptr<SolidColorDrawQuad> top_quad = SolidColorDrawQuad::Create();
-      top_quad->SetNew(shared_quad_state, top, colors[i % kNumColors], false);
+      top_quad->SetNew(
+          shared_quad_state, top, top, colors[i % kNumColors], false);
       quad_sink->Append(top_quad.PassAs<DrawQuad>(), append_quads_data);
 
       scoped_ptr<SolidColorDrawQuad> bottom_quad = SolidColorDrawQuad::Create();
       bottom_quad->SetNew(shared_quad_state,
                           bottom,
+                          bottom,
                           colors[kNumColors - 1 - (i % kNumColors)],
                           false);
       quad_sink->Append(bottom_quad.PassAs<DrawQuad>(), append_quads_data);
@@ -378,13 +380,14 @@
       scoped_ptr<SolidColorDrawQuad> left_quad = SolidColorDrawQuad::Create();
       left_quad->SetNew(shared_quad_state,
                         left,
+                        left,
                         colors[kNumColors - 1 - (i % kNumColors)],
                         false);
       quad_sink->Append(left_quad.PassAs<DrawQuad>(), append_quads_data);
 
       scoped_ptr<SolidColorDrawQuad> right_quad = SolidColorDrawQuad::Create();
       right_quad->SetNew(
-          shared_quad_state, right, colors[i % kNumColors], false);
+          shared_quad_state, right, right, colors[i % kNumColors], false);
       quad_sink->Append(right_quad.PassAs<DrawQuad>(), append_quads_data);
     }
   }
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc
index 5b6a890a..f3988941 100644
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -552,11 +552,19 @@
 
       scoped_ptr<SolidColorDrawQuad> color_quad;
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(20, 20, 3, 7),
+                         gfx::Rect(20, 20, 3, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(23, 20, 4, 7),
+                         gfx::Rect(23, 20, 4, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
     }
 
@@ -589,31 +597,48 @@
         RenderPassDrawQuad::Create();
     render_pass_quad->SetNew(
         shared_quad_state,
-        gfx::Rect(5, 5, 7, 7),  // rect
+        gfx::Rect(5, 5, 7, 7),  // quad_rect
+        gfx::Rect(5, 5, 7, 7),  // visible_rect
         RenderPass::Id(10, 7),  // render_pass_id
-        false,  // is_replica
-        0,  // mask_resource_id
-        child_pass_rect,  // contents_changed_since_last_frame
-        gfx::RectF(),  // mask_uv_rect
-        FilterOperations(),  // filters
-        FilterOperations());  // background_filters
+        false,                  // is_replica
+        0,                      // mask_resource_id
+        child_pass_rect,        // contents_changed_since_last_frame
+        gfx::RectF(),           // mask_uv_rect
+        FilterOperations(),     // filters
+        FilterOperations());    // background_filters
     quad_sink.Append(render_pass_quad.PassAs<DrawQuad>(), &data);
 
     scoped_ptr<SolidColorDrawQuad> color_quad;
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 0, 10, 10),
+                       gfx::Rect(0, 0, 10, 10),
+                       1u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 10, 10, 10),
+                       gfx::Rect(0, 10, 10, 10),
+                       2u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 0, 10, 10),
+                       gfx::Rect(10, 0, 10, 10),
+                       3u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 10, 10, 10),
+                       gfx::Rect(10, 10, 10, 10),
+                       4u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     delegated_renderer_layer->SetFrameDataForRenderPasses(
@@ -960,11 +985,19 @@
 
       scoped_ptr<SolidColorDrawQuad> color_quad;
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(20, 20, 3, 7),
+                         gfx::Rect(20, 20, 3, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(23, 20, 4, 7),
+                         gfx::Rect(23, 20, 4, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
     }
 
@@ -995,31 +1028,48 @@
         RenderPassDrawQuad::Create();
     render_pass_quad->SetNew(
         shared_quad_state,
-        gfx::Rect(5, 5, 7, 7),  // rect
+        gfx::Rect(5, 5, 7, 7),  // quad_rect
+        gfx::Rect(5, 5, 7, 7),  // visible_quad_rect
         RenderPass::Id(10, 7),  // render_pass_id
-        false,  // is_replica
-        0,  // mask_resource_id
-        child_pass_rect,  // contents_changed_since_last_frame
-        gfx::RectF(),  // mask_uv_rect
-        FilterOperations(),  // filters
-        FilterOperations());  // background_filters
+        false,                  // is_replica
+        0,                      // mask_resource_id
+        child_pass_rect,        // contents_changed_since_last_frame
+        gfx::RectF(),           // mask_uv_rect
+        FilterOperations(),     // filters
+        FilterOperations());    // background_filters
     quad_sink.Append(render_pass_quad.PassAs<DrawQuad>(), &data);
 
     scoped_ptr<SolidColorDrawQuad> color_quad;
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 0, 10, 10),
+                       gfx::Rect(0, 0, 10, 10),
+                       1u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 10, 10, 10),
+                       gfx::Rect(0, 10, 10, 10),
+                       2u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 0, 10, 10),
+                       gfx::Rect(10, 0, 10, 10),
+                       3u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 10, 10, 10),
+                       gfx::Rect(10, 10, 10, 10),
+                       4u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     delegated_renderer_layer->SetFrameDataForRenderPasses(
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index be5af99..e98880a 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -115,6 +115,7 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   bool premultiplied_alpha = true;
   gfx::PointF uv_top_left(0.f, 0.f);
   gfx::PointF uv_bottom_right(1.f, 1.f);
@@ -124,6 +125,7 @@
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                hud_resource_->id(),
                premultiplied_alpha,
                uv_top_left,
diff --git a/cc/layers/io_surface_layer_impl.cc b/cc/layers/io_surface_layer_impl.cc
index b8d6919..8779086 100644
--- a/cc/layers/io_surface_layer_impl.cc
+++ b/cc/layers/io_surface_layer_impl.cc
@@ -113,10 +113,12 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<IOSurfaceDrawQuad> quad = IOSurfaceDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                io_surface_size_,
                io_surface_resource_id_,
                IOSurfaceDrawQuad::FLIPPED);
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 05f3e1b..46fa012 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -304,10 +304,12 @@
   if (!ShowDebugBorders())
     return;
 
-  gfx::Rect content_rect(content_bounds());
+  gfx::Rect quad_rect(content_bounds());
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
       DebugBorderDrawQuad::Create();
-  debug_border_quad->SetNew(shared_quad_state, content_rect, color, width);
+  debug_border_quad->SetNew(
+      shared_quad_state, quad_rect, visible_quad_rect, color, width);
   quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/nine_patch_layer_impl.cc b/cc/layers/nine_patch_layer_impl.cc
index a053d5e1..4d364464 100644
--- a/cc/layers/nine_patch_layer_impl.cc
+++ b/cc/layers/nine_patch_layer_impl.cc
@@ -224,6 +224,7 @@
   quad->SetNew(shared_quad_state,
                layer_top_left,
                opaque_rect,
+               layer_top_left,
                resource,
                premultiplied_alpha,
                uv_top_left.origin(),
@@ -237,6 +238,7 @@
   quad->SetNew(shared_quad_state,
                layer_top_right,
                opaque_rect,
+               layer_top_right,
                resource,
                premultiplied_alpha,
                uv_top_right.origin(),
@@ -250,6 +252,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom_left,
                opaque_rect,
+               layer_bottom_left,
                resource,
                premultiplied_alpha,
                uv_bottom_left.origin(),
@@ -263,6 +266,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom_right,
                opaque_rect,
+               layer_bottom_right,
                resource,
                premultiplied_alpha,
                uv_bottom_right.origin(),
@@ -276,6 +280,7 @@
   quad->SetNew(shared_quad_state,
                layer_top,
                opaque_rect,
+               layer_top,
                resource,
                premultiplied_alpha,
                uv_top.origin(),
@@ -289,6 +294,7 @@
   quad->SetNew(shared_quad_state,
                layer_left,
                opaque_rect,
+               layer_left,
                resource,
                premultiplied_alpha,
                uv_left.origin(),
@@ -302,6 +308,7 @@
   quad->SetNew(shared_quad_state,
                layer_right,
                opaque_rect,
+               layer_right,
                resource,
                premultiplied_alpha,
                uv_right.origin(),
@@ -315,6 +322,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom,
                opaque_rect,
+               layer_bottom,
                resource,
                premultiplied_alpha,
                uv_bottom.origin(),
@@ -329,6 +337,7 @@
     quad->SetNew(shared_quad_state,
                  layer_center,
                  opaque_rect,
+                 layer_center,
                  resource,
                  premultiplied_alpha,
                  uv_center.origin(),
diff --git a/cc/layers/painted_scrollbar_layer_impl.cc b/cc/layers/painted_scrollbar_layer_impl.cc
index 2af722d..bddd7e1 100644
--- a/cc/layers/painted_scrollbar_layer_impl.cc
+++ b/cc/layers/painted_scrollbar_layer_impl.cc
@@ -83,6 +83,7 @@
   AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
 
   gfx::Rect thumb_quad_rect = ComputeThumbQuadRect();
+  gfx::Rect visible_thumb_quad_rect = thumb_quad_rect;
 
   ResourceProvider::ResourceId thumb_resource_id =
       layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_);
@@ -96,6 +97,7 @@
     quad->SetNew(shared_quad_state,
                  thumb_quad_rect,
                  opaque_rect,
+                 visible_thumb_quad_rect,
                  thumb_resource_id,
                  premultipled_alpha,
                  uv_top_left,
@@ -107,6 +109,7 @@
   }
 
   gfx::Rect track_quad_rect = content_bounds_rect;
+  gfx::Rect visible_track_quad_rect = track_quad_rect;
   if (track_resource_id && !track_quad_rect.IsEmpty()) {
     gfx::Rect opaque_rect(contents_opaque() ? track_quad_rect : gfx::Rect());
     const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -114,6 +117,7 @@
     quad->SetNew(shared_quad_state,
                  track_quad_rect,
                  opaque_rect,
+                 visible_track_quad_rect,
                  track_resource_id,
                  premultipled_alpha,
                  uv_top_left,
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index fc8647c..f2c3c3e 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -139,6 +139,7 @@
 
     gfx::Rect geometry_rect = rect;
     gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect();
+    gfx::Rect visible_geometry_rect = geometry_rect;
     gfx::Size texture_size = rect.size();
     gfx::RectF texture_rect = gfx::RectF(texture_size);
     gfx::Rect quad_content_rect = rect;
@@ -148,6 +149,7 @@
     quad->SetNew(shared_quad_state,
                  geometry_rect,
                  opaque_rect,
+                 visible_geometry_rect,
                  texture_rect,
                  texture_size,
                  RGBA_8888,
@@ -198,7 +200,12 @@
       scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
           DebugBorderDrawQuad::Create();
       gfx::Rect geometry_rect = iter.geometry_rect();
-      debug_border_quad->SetNew(shared_quad_state, geometry_rect, color, width);
+      gfx::Rect visible_geometry_rect = geometry_rect;
+      debug_border_quad->SetNew(shared_quad_state,
+                                geometry_rect,
+                                visible_geometry_rect,
+                                color,
+                                width);
       quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(),
                         append_quads_data);
     }
@@ -213,18 +220,24 @@
        iter;
        ++iter) {
     gfx::Rect geometry_rect = iter.geometry_rect();
+    gfx::Rect visible_geometry_rect = geometry_rect;
     if (!*iter || !iter->IsReadyToDraw()) {
       if (DrawCheckerboardForMissingTiles()) {
         // TODO(enne): Figure out how to show debug "invalidated checker" color
         scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
         SkColor color = DebugColors::DefaultCheckerboardColor();
-        quad->SetNew(shared_quad_state, geometry_rect, color);
+        quad->SetNew(
+            shared_quad_state, geometry_rect, visible_geometry_rect, color);
         if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data))
           append_quads_data->num_missing_tiles++;
       } else {
         SkColor color = SafeOpaqueBackgroundColor();
         scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-        quad->SetNew(shared_quad_state, geometry_rect, color, false);
+        quad->SetNew(shared_quad_state,
+                     geometry_rect,
+                     visible_geometry_rect,
+                     color,
+                     false);
         if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data))
           append_quads_data->num_missing_tiles++;
       }
@@ -249,6 +262,7 @@
         quad->SetNew(shared_quad_state,
                      geometry_rect,
                      opaque_rect,
+                     visible_geometry_rect,
                      tile_version.get_resource_id(),
                      texture_rect,
                      iter.texture_size(),
@@ -269,6 +283,7 @@
         quad->SetNew(shared_quad_state,
                      geometry_rect,
                      opaque_rect,
+                     visible_geometry_rect,
                      texture_rect,
                      iter.texture_size(),
                      format,
@@ -282,6 +297,7 @@
         scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
         quad->SetNew(shared_quad_state,
                      geometry_rect,
+                     visible_geometry_rect,
                      tile_version.get_solid_color(),
                      false);
         draw_quad = quad.PassAs<DrawQuad>();
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc
index 6c0ec34..a87d692 100644
--- a/cc/layers/render_surface_impl.cc
+++ b/cc/layers/render_surface_impl.cc
@@ -154,6 +154,8 @@
                             owning_layer_->blend_mode());
 
   if (owning_layer_->ShowDebugBorders()) {
+    gfx::Rect quad_rect = content_rect_;
+    gfx::Rect visible_quad_rect = quad_rect;
     SkColor color = for_replica ?
                     DebugColors::SurfaceReplicaBorderColor() :
                     DebugColors::SurfaceBorderColor();
@@ -164,7 +166,8 @@
                       owning_layer_->layer_tree_impl());
     scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
         DebugBorderDrawQuad::Create();
-    debug_border_quad->SetNew(shared_quad_state, content_rect_, color, width);
+    debug_border_quad->SetNew(
+        shared_quad_state, quad_rect, visible_quad_rect, color, width);
     quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(), append_quads_data);
   }
 
@@ -209,6 +212,7 @@
         uv_scale_y);
   }
 
+  gfx::Rect visible_content_rect(content_rect_);
   ResourceProvider::ResourceId mask_resource_id =
       mask_layer ? mask_layer->ContentsResourceId() : 0;
   gfx::Rect contents_changed_since_last_frame =
@@ -217,6 +221,7 @@
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                content_rect_,
+               visible_content_rect,
                render_pass_id,
                for_replica,
                mask_resource_id,
diff --git a/cc/layers/solid_color_layer_impl.cc b/cc/layers/solid_color_layer_impl.cc
index faa967be..b5514e74 100644
--- a/cc/layers/solid_color_layer_impl.cc
+++ b/cc/layers/solid_color_layer_impl.cc
@@ -34,13 +34,17 @@
   int height = content_bounds().height();
   for (int x = 0; x < width; x += tile_size_) {
     for (int y = 0; y < height; y += tile_size_) {
-      gfx::Rect solid_tile_rect(x,
-                              y,
-                              std::min(width - x, tile_size_),
-                              std::min(height - y, tile_size_));
+      gfx::Rect quad_rect(x,
+                          y,
+                          std::min(width - x, tile_size_),
+                          std::min(height - y, tile_size_));
+      gfx::Rect visible_quad_rect(quad_rect);
       scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-      quad->SetNew(
-          shared_quad_state, solid_tile_rect, background_color(), false);
+      quad->SetNew(shared_quad_state,
+                   quad_rect,
+                   visible_quad_rect,
+                   background_color(),
+                   false);
       quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
     }
   }
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.cc b/cc/layers/solid_color_scrollbar_layer_impl.cc
index 0cfc853..027e122 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl.cc
+++ b/cc/layers/solid_color_scrollbar_layer_impl.cc
@@ -91,14 +91,16 @@
 
 void SolidColorScrollbarLayerImpl::AppendQuads(QuadSink* quad_sink,
                            AppendQuadsData* append_quads_data) {
-  gfx::Rect thumb_quad_rect = ComputeThumbQuadRect();
+  gfx::Rect thumb_quad_rect(ComputeThumbQuadRect());
+  gfx::Rect visible_quad_rect(thumb_quad_rect);
 
   SharedQuadState* shared_quad_state =
       quad_sink->UseSharedQuadState(CreateSharedQuadState());
   AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
 
   scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-  quad->SetNew(shared_quad_state, thumb_quad_rect, color_, false);
+  quad->SetNew(
+      shared_quad_state, thumb_quad_rect, visible_quad_rect, color_, false);
   quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index 6906f4e..1d7f735 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -46,7 +46,8 @@
 
   scoped_ptr<SurfaceDrawQuad> quad = SurfaceDrawQuad::Create();
   gfx::Rect quad_rect(content_bounds());
-  quad->SetNew(shared_quad_state, quad_rect, surface_id_);
+  gfx::Rect visible_quad_rect(quad_rect);
+  quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, surface_id_);
   quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc
index cafe542..5deb73a 100644
--- a/cc/layers/texture_layer_impl.cc
+++ b/cc/layers/texture_layer_impl.cc
@@ -172,12 +172,14 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect = opaque ? quad_rect : gfx::Rect();
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
   ResourceProvider::ResourceId id =
       valid_texture_copy_ ? texture_copy_->id() : external_texture_resource_;
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                id,
                premultiplied_alpha_,
                uv_top_left_,
diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc
index d2767cf..cc58112 100644
--- a/cc/layers/tiled_layer_impl.cc
+++ b/cc/layers/tiled_layer_impl.cc
@@ -170,6 +170,7 @@
       for (int i = left; i <= right; ++i) {
         DrawableTile* tile = TileAt(i, j);
         gfx::Rect tile_rect = tiler_->tile_bounds(i, j);
+        gfx::Rect visible_tile_rect = tile_rect;
         SkColor border_color;
         float border_width;
 
@@ -182,8 +183,11 @@
         }
         scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
             DebugBorderDrawQuad::Create();
-        debug_border_quad->SetNew(
-            shared_quad_state, tile_rect, border_color, border_width);
+        debug_border_quad->SetNew(shared_quad_state,
+                                  tile_rect,
+                                  visible_tile_rect,
+                                  border_color,
+                                  border_width);
         quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(),
                           append_quads_data);
       }
@@ -199,6 +203,7 @@
       gfx::Rect tile_rect = tiler_->tile_bounds(i, j);
       gfx::Rect display_rect = tile_rect;
       tile_rect.Intersect(content_rect);
+      gfx::Rect visible_tile_rect = tile_rect;
 
       // Skip empty tiles.
       if (tile_rect.IsEmpty())
@@ -217,7 +222,7 @@
         scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
             CheckerboardDrawQuad::Create();
         checkerboard_quad->SetNew(
-            shared_quad_state, tile_rect, checker_color);
+            shared_quad_state, tile_rect, visible_tile_rect, checker_color);
         if (quad_sink->Append(checkerboard_quad.PassAs<DrawQuad>(),
                               append_quads_data))
           append_quads_data->num_missing_tiles++;
@@ -244,6 +249,7 @@
       quad->SetNew(shared_quad_state,
                    tile_rect,
                    tile_opaque_rect,
+                   visible_tile_rect,
                    tile->resource_id(),
                    tex_coord_rect,
                    texture_size,
diff --git a/cc/layers/ui_resource_layer_impl.cc b/cc/layers/ui_resource_layer_impl.cc
index ad7fd2c..65b930c 100644
--- a/cc/layers/ui_resource_layer_impl.cc
+++ b/cc/layers/ui_resource_layer_impl.cc
@@ -111,17 +111,17 @@
 
   DCHECK(!bounds().IsEmpty());
 
-  gfx::Rect quad_rect(bounds());
-
   bool opaque = layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_) ||
                 contents_opaque();
-  gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect());
-  scoped_ptr<TextureDrawQuad> quad;
 
-  quad = TextureDrawQuad::Create();
+  gfx::Rect quad_rect(bounds());
+  gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
+  scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                resource,
                premultiplied_alpha,
                uv_top_left_,
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc
index 9a772c5..20c8c44 100644
--- a/cc/layers/video_layer_impl.cc
+++ b/cc/layers/video_layer_impl.cc
@@ -134,6 +134,7 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   gfx::Rect visible_rect = frame_->visible_rect();
   gfx::Size coded_size = frame_->coded_size();
 
@@ -159,6 +160,7 @@
       texture_quad->SetNew(shared_quad_state,
                            quad_rect,
                            opaque_rect,
+                           visible_quad_rect,
                            software_resources_[0],
                            premultiplied_alpha,
                            uv_top_left,
@@ -175,15 +177,16 @@
         break;
       gfx::SizeF tex_scale(tex_width_scale, tex_height_scale);
       scoped_ptr<YUVVideoDrawQuad> yuv_video_quad = YUVVideoDrawQuad::Create();
-      yuv_video_quad->SetNew(shared_quad_state,
-                             quad_rect,
-                             opaque_rect,
-                             tex_scale,
-                             frame_resources_[0],
-                             frame_resources_[1],
-                             frame_resources_[2],
-                             frame_resources_.size() > 3 ?
-                                 frame_resources_[3] : 0);
+      yuv_video_quad->SetNew(
+          shared_quad_state,
+          quad_rect,
+          opaque_rect,
+          visible_quad_rect,
+          tex_scale,
+          frame_resources_[0],
+          frame_resources_[1],
+          frame_resources_[2],
+          frame_resources_.size() > 3 ? frame_resources_[3] : 0);
       quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data);
       break;
     }
@@ -200,6 +203,7 @@
       texture_quad->SetNew(shared_quad_state,
                            quad_rect,
                            opaque_rect,
+                           visible_quad_rect,
                            frame_resources_[0],
                            premultiplied_alpha,
                            uv_top_left,
@@ -222,6 +226,7 @@
           shared_quad_state,
           quad_rect,
           opaque_rect,
+          visible_quad_rect,
           frame_resources_[0],
           scale * provider_client_impl_->stream_texture_matrix());
       quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(),
@@ -238,6 +243,7 @@
       io_surface_quad->SetNew(shared_quad_state,
                               quad_rect,
                               opaque_rect,
+                              visible_quad_rect,
                               visible_size,
                               frame_resources_[0],
                               IOSurfaceDrawQuad::UNFLIPPED);