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