11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/trees/occlusion.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/base/math_util.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/rect.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace cc { 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOcclusion::Occlusion() { 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOcclusion::Occlusion(const gfx::Transform& draw_transform, 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const SimpleEnclosedRegion& occlusion_from_outside_target, 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const SimpleEnclosedRegion& occlusion_from_inside_target) 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : draw_transform_(draw_transform), 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_outside_target_(occlusion_from_outside_target), 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_inside_target_(occlusion_from_inside_target) { 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Occlusion::IsOccluded(const gfx::Rect& content_rect) const { 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (content_rect.IsEmpty()) 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (occlusion_from_inside_target_.IsEmpty() && 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_outside_target_.IsEmpty()) { 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect unoccluded_rect_in_target_surface = 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUnoccludedRectInTargetSurface(content_rect); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return unoccluded_rect_in_target_surface.IsEmpty(); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Rect Occlusion::GetUnoccludedContentRect( 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& content_rect) const { 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (content_rect.IsEmpty()) 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return content_rect; 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (occlusion_from_inside_target_.IsEmpty() && 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_outside_target_.IsEmpty()) { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return content_rect; 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect unoccluded_rect_in_target_surface = 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUnoccludedRectInTargetSurface(content_rect); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (unoccluded_rect_in_target_surface.IsEmpty()) 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return gfx::Rect(); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Transform inverse_draw_transform(gfx::Transform::kSkipInitialization); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool ok = draw_transform_.GetInverse(&inverse_draw_transform); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(ok); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect unoccluded_rect = MathUtil::ProjectEnclosingClippedRect( 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci inverse_draw_transform, unoccluded_rect_in_target_surface); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unoccluded_rect.Intersect(content_rect); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return unoccluded_rect; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Rect Occlusion::GetUnoccludedRectInTargetSurface( 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& content_rect) const { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Take the ToEnclosingRect at each step, as we want to contain any unoccluded 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // partial pixels in the resulting Rect. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect unoccluded_rect_in_target_surface = 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MathUtil::MapEnclosingClippedRect(draw_transform_, content_rect); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_LE(occlusion_from_inside_target_.GetRegionComplexity(), 1u); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_LE(occlusion_from_outside_target_.GetRegionComplexity(), 1u); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // These subtract operations are more lossy than if we did both operations at 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // once. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unoccluded_rect_in_target_surface.Subtract( 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_inside_target_.bounds()); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unoccluded_rect_in_target_surface.Subtract( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci occlusion_from_outside_target_.bounds()); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return unoccluded_rect_in_target_surface; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace cc 82