Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / cc / output / overlay_strategy_single_on_top.cc
index 405a191..64ebf7c 100644 (file)
@@ -4,10 +4,9 @@
 
 #include "cc/output/overlay_strategy_single_on_top.h"
 
-#include "cc/output/output_surface.h"
 #include "cc/quads/draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
-#include "ui/gfx/rect_conversions.h"
+#include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/transform.h"
 
 namespace cc {
@@ -29,13 +28,38 @@ bool OverlayStrategySingleOnTop::Attempt(
   DCHECK(root_render_pass);
 
   QuadList& quad_list = root_render_pass->quad_list;
-  const DrawQuad* candidate_quad = quad_list.front();
-  if (candidate_quad->material != DrawQuad::TEXTURE_CONTENT)
-    return false;
-
-  const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(candidate_quad);
-  if (!resource_provider_->AllowOverlay(quad.resource_id))
+  QuadList::iterator candidate_iterator = quad_list.end();
+  for (QuadList::iterator it = quad_list.begin(); it != quad_list.end(); ++it) {
+    const DrawQuad* draw_quad = *it;
+    if (draw_quad->material == DrawQuad::TEXTURE_CONTENT) {
+      const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(draw_quad);
+      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;
+  const TextureDrawQuad& quad =
+      *TextureDrawQuad::MaterialCast(*candidate_iterator);
 
   // Simple quads only.
   gfx::OverlayTransform overlay_transform =
@@ -70,8 +94,7 @@ bool OverlayStrategySingleOnTop::Attempt(
 
   // If the candidate can be handled by an overlay, create a pass for it.
   if (candidates[1].overlay_handled) {
-    scoped_ptr<DrawQuad> overlay_quad = quad_list.take(quad_list.begin());
-    quad_list.erase(quad_list.begin());
+    quad_list.erase(candidate_iterator);
     candidate_list->swap(candidates);
     return true;
   }