• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "cc/output/overlay_strategy_single_on_top.h"
6 
7 #include "cc/output/output_surface.h"
8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/texture_draw_quad.h"
10 #include "ui/gfx/rect_conversions.h"
11 #include "ui/gfx/transform.h"
12 
13 namespace cc {
14 
OverlayStrategySingleOnTop(OverlayCandidateValidator * capability_checker,ResourceProvider * resource_provider)15 OverlayStrategySingleOnTop::OverlayStrategySingleOnTop(
16     OverlayCandidateValidator* capability_checker,
17     ResourceProvider* resource_provider)
18     : capability_checker_(capability_checker),
19       resource_provider_(resource_provider) {}
20 
Attempt(RenderPassList * render_passes_in_draw_order,OverlayCandidateList * candidate_list)21 bool OverlayStrategySingleOnTop::Attempt(
22     RenderPassList* render_passes_in_draw_order,
23     OverlayCandidateList* candidate_list) {
24   // Only attempt to handle very simple case for now.
25   if (!capability_checker_)
26     return false;
27 
28   RenderPass* root_render_pass = render_passes_in_draw_order->back();
29   DCHECK(root_render_pass);
30 
31   QuadList& quad_list = root_render_pass->quad_list;
32   const DrawQuad* candidate_quad = quad_list.front();
33   if (candidate_quad->material != DrawQuad::TEXTURE_CONTENT)
34     return false;
35 
36   const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(candidate_quad);
37   if (!resource_provider_->AllowOverlay(quad.resource_id))
38     return false;
39 
40   // Simple quads only.
41   gfx::OverlayTransform overlay_transform =
42       OverlayCandidate::GetOverlayTransform(quad.quadTransform(), quad.flipped);
43   if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID ||
44       !quad.quadTransform().IsIdentityOrTranslation() || quad.needs_blending ||
45       quad.shared_quad_state->opacity != 1.f ||
46       quad.shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode ||
47       quad.premultiplied_alpha || quad.background_color != SK_ColorTRANSPARENT)
48     return false;
49 
50   // Add our primary surface.
51   OverlayCandidateList candidates;
52   OverlayCandidate main_image;
53   main_image.display_rect = root_render_pass->output_rect;
54   main_image.format = RGBA_8888;
55   candidates.push_back(main_image);
56 
57   // Add the overlay.
58   OverlayCandidate candidate;
59   candidate.transform = overlay_transform;
60   candidate.display_rect =
61       OverlayCandidate::GetOverlayRect(quad.quadTransform(), quad.rect);
62   candidate.uv_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right);
63   candidate.format = RGBA_8888;
64   candidate.resource_id = quad.resource_id;
65   candidate.plane_z_order = 1;
66   candidates.push_back(candidate);
67 
68   // Check for support.
69   capability_checker_->CheckOverlaySupport(&candidates);
70 
71   // If the candidate can be handled by an overlay, create a pass for it.
72   if (candidates[1].overlay_handled) {
73     scoped_ptr<DrawQuad> overlay_quad = quad_list.take(quad_list.begin());
74     quad_list.erase(quad_list.begin());
75     candidate_list->swap(candidates);
76     return true;
77   }
78   return false;
79 }
80 
81 }  // namespace cc
82