|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef FLUTTER_FLOW_PAINT_REGION_H_ | 
|  | #define FLUTTER_FLOW_PAINT_REGION_H_ | 
|  |  | 
|  | #include <utility> | 
|  | #include <vector> | 
|  | #include "flutter/fml/logging.h" | 
|  | #include "third_party/skia/include/core/SkRect.h" | 
|  |  | 
|  | namespace flutter { | 
|  |  | 
|  | // Corresponds to area on the screen where the layer subtree has painted to. | 
|  | // | 
|  | // The area is used when adding damage of removed or dirty layer to overall | 
|  | // damage. | 
|  | // | 
|  | // Because there is a PaintRegion for each layer, it must be able to represent | 
|  | // the area with minimal overhead. This is accomplished by having one | 
|  | // vector<SkRect> shared between all paint regions, and each paint region | 
|  | // keeping begin and end index of rects relevant to particular subtree. | 
|  | // | 
|  | // All rects are in screen coordinates. | 
|  | class PaintRegion { | 
|  | public: | 
|  | PaintRegion() = default; | 
|  | PaintRegion(std::shared_ptr<std::vector<SkRect>> rects, | 
|  | size_t from, | 
|  | size_t to, | 
|  | bool has_readback, | 
|  | bool has_texture) | 
|  | : rects_(std::move(rects)), | 
|  | from_(from), | 
|  | to_(to), | 
|  | has_readback_(has_readback), | 
|  | has_texture_(has_texture) {} | 
|  |  | 
|  | std::vector<SkRect>::const_iterator begin() const { | 
|  | FML_DCHECK(is_valid()); | 
|  | return rects_->begin() + from_; | 
|  | } | 
|  |  | 
|  | std::vector<SkRect>::const_iterator end() const { | 
|  | FML_DCHECK(is_valid()); | 
|  | return rects_->begin() + to_; | 
|  | } | 
|  |  | 
|  | // Compute bounds for this region | 
|  | SkRect ComputeBounds() const; | 
|  |  | 
|  | bool is_valid() const { return rects_ != nullptr; } | 
|  |  | 
|  | // Returns true if there is a layer in subtree represented by this region | 
|  | // that performs readback | 
|  | bool has_readback() const { return has_readback_; } | 
|  |  | 
|  | // Returns whether there is a TextureLayer in subtree represented by this | 
|  | // region. | 
|  | bool has_texture() const { return has_texture_; } | 
|  |  | 
|  | private: | 
|  | std::shared_ptr<std::vector<SkRect>> rects_; | 
|  | size_t from_ = 0; | 
|  | size_t to_ = 0; | 
|  | bool has_readback_ = false; | 
|  | bool has_texture_ = false; | 
|  | }; | 
|  |  | 
|  | }  // namespace flutter | 
|  |  | 
|  | #endif  // FLUTTER_FLOW_PAINT_REGION_H_ |