blob: a64533982d2f925e14b0cd3d80bf90c6e75ceda1 [file] [log] [blame]
// Copyright 2015 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/test/surface_hittest_test_helpers.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/delegated_frame_data.h"
#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/shared_quad_state.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/surface_draw_quad.h"
namespace cc {
namespace test {
void CreateSharedQuadState(RenderPass* pass,
const gfx::Transform& transform,
const gfx::Rect& root_rect) {
SharedQuadState* child_shared_state = pass->CreateAndAppendSharedQuadState();
child_shared_state->SetAll(transform, root_rect.size(), root_rect, root_rect,
false, 1.0f, SkXfermode::kSrcOver_Mode, 0);
}
void CreateSolidColorDrawQuad(RenderPass* pass,
const gfx::Transform& transform,
const gfx::Rect& root_rect,
const gfx::Rect& quad_rect) {
CreateSharedQuadState(pass, transform, root_rect);
SolidColorDrawQuad* color_quad =
pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
color_quad->SetNew(pass->shared_quad_state_list.back(), quad_rect, quad_rect,
SK_ColorYELLOW, false);
}
void CreateRenderPassDrawQuad(RenderPass* pass,
const gfx::Transform& transform,
const gfx::Rect& root_rect,
const gfx::Rect& quad_rect,
const RenderPassId& render_pass_id) {
CreateSharedQuadState(pass, transform, root_rect);
RenderPassDrawQuad* render_pass_quad =
pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
render_pass_quad->SetNew(pass->shared_quad_state_list.back(), quad_rect,
quad_rect, render_pass_id, ResourceId(),
gfx::Vector2dF(), gfx::Size(), FilterOperations(),
gfx::Vector2dF(), gfx::PointF(), FilterOperations());
}
void CreateSurfaceDrawQuad(RenderPass* pass,
const gfx::Transform& transform,
const gfx::Rect& root_rect,
const gfx::Rect& quad_rect,
SurfaceId surface_id) {
CreateSharedQuadState(pass, transform, root_rect);
SurfaceDrawQuad* surface_quad =
pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>();
surface_quad->SetNew(pass->shared_quad_state_list.back(), quad_rect,
quad_rect, surface_id);
}
void CreateRenderPass(const RenderPassId& render_pass_id,
const gfx::Rect& rect,
const gfx::Transform& transform_to_root_target,
RenderPassList* render_pass_list) {
std::unique_ptr<RenderPass> render_pass = RenderPass::Create();
render_pass->SetNew(render_pass_id, rect, rect, transform_to_root_target);
render_pass_list->push_back(std::move(render_pass));
}
CompositorFrame CreateCompositorFrameWithRenderPassList(
RenderPassList* render_pass_list) {
std::unique_ptr<DelegatedFrameData> root_delegated_frame_data(
new DelegatedFrameData);
root_delegated_frame_data->render_pass_list.swap(*render_pass_list);
CompositorFrame root_frame;
root_frame.delegated_frame_data = std::move(root_delegated_frame_data);
return root_frame;
}
CompositorFrame CreateCompositorFrame(const gfx::Rect& root_rect,
RenderPass** render_pass) {
RenderPassList render_pass_list;
RenderPassId root_id(1, 1);
CreateRenderPass(root_id, root_rect, gfx::Transform(), &render_pass_list);
CompositorFrame root_frame =
CreateCompositorFrameWithRenderPassList(&render_pass_list);
*render_pass = root_frame.delegated_frame_data->render_pass_list.back().get();
return root_frame;
}
TestSurfaceHittestDelegate::TestSurfaceHittestDelegate()
: reject_target_overrides_(0), accept_target_overrides_(0) {}
TestSurfaceHittestDelegate::~TestSurfaceHittestDelegate() {}
void TestSurfaceHittestDelegate::AddInsetsForRejectSurface(
const SurfaceId& surface_id,
const gfx::Insets& inset) {
insets_for_reject_.insert(std::make_pair(surface_id, inset));
}
void TestSurfaceHittestDelegate::AddInsetsForAcceptSurface(
const SurfaceId& surface_id,
const gfx::Insets& inset) {
insets_for_accept_.insert(std::make_pair(surface_id, inset));
}
bool TestSurfaceHittestDelegate::RejectHitTarget(
const SurfaceDrawQuad* surface_quad,
const gfx::Point& point_in_quad_space) {
if (!insets_for_reject_.count(surface_quad->surface_id))
return false;
gfx::Rect bounds(surface_quad->rect);
bounds.Inset(insets_for_reject_[surface_quad->surface_id]);
// If the point provided falls outside the inset, then we skip this surface.
if (!bounds.Contains(point_in_quad_space)) {
if (surface_quad->rect.Contains(point_in_quad_space))
++reject_target_overrides_;
return true;
}
return false;
}
bool TestSurfaceHittestDelegate::AcceptHitTarget(
const SurfaceDrawQuad* surface_quad,
const gfx::Point& point_in_quad_space) {
if (!insets_for_accept_.count(surface_quad->surface_id))
return false;
gfx::Rect bounds(surface_quad->rect);
bounds.Inset(insets_for_accept_[surface_quad->surface_id]);
// If the point provided falls outside the inset, then we accept this surface.
if (!bounds.Contains(point_in_quad_space)) {
++accept_target_overrides_;
return true;
}
return false;
}
} // namespace test
} // namespace cc