blob: 70921701207de1974116e8984836aeee67406d51 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/output/overlay_strategy_underlay_cast.h"
#include "base/containers/adapters.h"
#include "cc/quads/draw_quad.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "ui/gfx/geometry/rect_conversions.h"
namespace cc {
OverlayStrategyUnderlayCast::OverlayStrategyUnderlayCast(
OverlayCandidateValidator* capability_checker)
: OverlayStrategyUnderlay(capability_checker) {}
OverlayStrategyUnderlayCast::~OverlayStrategyUnderlayCast() {}
bool OverlayStrategyUnderlayCast::Attempt(
ResourceProvider* resource_provider,
RenderPass* render_pass,
OverlayCandidateList* candidate_list,
std::vector<gfx::Rect>* content_bounds) {
const QuadList& const_quad_list = render_pass->quad_list;
bool found_underlay = false;
gfx::Rect content_rect;
for (const auto* quad : base::Reversed(const_quad_list)) {
if (OverlayCandidate::IsInvisibleQuad(quad))
continue;
const auto& transform = quad->shared_quad_state->quad_to_target_transform;
gfx::RectF quad_rect = gfx::RectF(quad->rect);
transform.TransformRect(&quad_rect);
bool is_underlay = false;
if (!found_underlay) {
OverlayCandidate candidate;
is_underlay =
OverlayCandidate::FromDrawQuad(resource_provider, quad, &candidate);
found_underlay = is_underlay;
}
if (!found_underlay && quad->material == DrawQuad::SOLID_COLOR) {
const SolidColorDrawQuad* solid = SolidColorDrawQuad::MaterialCast(quad);
if (solid->color == SK_ColorBLACK)
continue;
}
if (is_underlay) {
content_rect.Subtract(gfx::ToEnclosedRect(quad_rect));
} else {
content_rect.Union(gfx::ToEnclosingRect(quad_rect));
}
}
const bool result = OverlayStrategyUnderlay::Attempt(
resource_provider, render_pass, candidate_list, content_bounds);
DCHECK(content_bounds && content_bounds->empty());
DCHECK(result == found_underlay);
if (found_underlay) {
content_bounds->push_back(content_rect);
}
return result;
}
} // namespace cc