// Copyright 2013 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/base/invalidation_region.h" #include "base/metrics/histogram.h" namespace { const int kMaxInvalidationRectCount = 256; } // namespace namespace cc { InvalidationRegion::InvalidationRegion() = default; InvalidationRegion::~InvalidationRegion() = default; void InvalidationRegion::Swap(Region* region) { FinalizePendingRects(); region_.Swap(region); } void InvalidationRegion::Clear() { pending_rects_.clear(); region_.Clear(); } void InvalidationRegion::Union(const gfx::Rect& rect) { if (pending_rects_.size() >= kMaxInvalidationRectCount) pending_rects_[0].Union(rect); else pending_rects_.push_back(rect); } void InvalidationRegion::FinalizePendingRects() { if (pending_rects_.empty()) return; if (region_.GetRegionComplexity() + pending_rects_.size() > kMaxInvalidationRectCount) { gfx::Rect pending_bounds = region_.bounds(); for (auto& rect : pending_rects_) pending_bounds.Union(rect); region_ = pending_bounds; } else { for (auto& rect : pending_rects_) region_.Union(rect); } pending_rects_.clear(); } } // namespace cc