Commit 2906d8e0 authored by achaulk@chromium.org's avatar achaulk@chromium.org

Let OverlayStrategySingleOnTop select non-topmost quad

Old code was too restrictive, and did not properly select the correct quad.
New code chooses the topmost overlayable plane that does not intersect any
rects above it.

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288049 0039d316-1c4b-4281-b951-d872f2087c98
parent 51470c5a
...@@ -28,13 +28,38 @@ bool OverlayStrategySingleOnTop::Attempt( ...@@ -28,13 +28,38 @@ bool OverlayStrategySingleOnTop::Attempt(
DCHECK(root_render_pass); DCHECK(root_render_pass);
QuadList& quad_list = root_render_pass->quad_list; QuadList& quad_list = root_render_pass->quad_list;
const DrawQuad* candidate_quad = quad_list.front(); QuadList::iterator candidate_iterator = quad_list.end();
if (candidate_quad->material != DrawQuad::TEXTURE_CONTENT) for (QuadList::iterator it = quad_list.begin(); it != quad_list.end(); ++it) {
return false; const DrawQuad* draw_quad = *it;
if (draw_quad->material == DrawQuad::TEXTURE_CONTENT) {
const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(candidate_quad); const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(draw_quad);
if (!resource_provider_->AllowOverlay(quad.resource_id)) if (!resource_provider_->AllowOverlay(quad.resource_id)) {
continue;
}
// Check that no prior quads overlap it.
bool intersects = false;
gfx::RectF rect = draw_quad->rect;
draw_quad->quadTransform().TransformRect(&rect);
for (QuadList::iterator overlap_iter = quad_list.begin();
overlap_iter != it;
++overlap_iter) {
gfx::RectF overlap_rect = (*overlap_iter)->rect;
(*overlap_iter)->quadTransform().TransformRect(&overlap_rect);
if (rect.Intersects(overlap_rect)) {
intersects = true;
break;
}
}
if (intersects)
continue;
candidate_iterator = it;
break;
}
}
if (candidate_iterator == quad_list.end())
return false; return false;
const TextureDrawQuad& quad =
*TextureDrawQuad::MaterialCast(*candidate_iterator);
// Simple quads only. // Simple quads only.
gfx::OverlayTransform overlay_transform = gfx::OverlayTransform overlay_transform =
...@@ -69,8 +94,7 @@ bool OverlayStrategySingleOnTop::Attempt( ...@@ -69,8 +94,7 @@ bool OverlayStrategySingleOnTop::Attempt(
// If the candidate can be handled by an overlay, create a pass for it. // If the candidate can be handled by an overlay, create a pass for it.
if (candidates[1].overlay_handled) { if (candidates[1].overlay_handled) {
scoped_ptr<DrawQuad> overlay_quad = quad_list.take(quad_list.begin()); quad_list.erase(candidate_iterator);
quad_list.erase(quad_list.begin());
candidate_list->swap(candidates); candidate_list->swap(candidates);
return true; return true;
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment