| // 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_LIB_VOLATILE_PATH_TRACKER_H_ |
| #define FLUTTER_LIB_VOLATILE_PATH_TRACKER_H_ |
| |
| #include <deque> |
| #include <memory> |
| #include <mutex> |
| #include <vector> |
| |
| #include "flutter/fml/macros.h" |
| #include "flutter/fml/task_runner.h" |
| #include "flutter/fml/trace_event.h" |
| #include "third_party/skia/include/core/SkPath.h" |
| |
| namespace flutter { |
| |
| namespace testing { |
| class ShellTest; |
| } // namespace testing |
| |
| /// A cache for paths drawn from dart:ui. |
| /// |
| /// Whenever a flutter::CanvasPath is created, it must Insert an entry into |
| /// this cache. Whenever a frame is drawn, the shell must call OnFrame. The |
| /// cache will flip the volatility bit on the SkPath and remove it from the |
| /// cache. If the Dart object is released, Erase must be called to avoid |
| /// tracking a path that is no longer referenced in Dart code. |
| /// |
| /// Enabling this cache may cause difficult to predict minor pixel differences |
| /// when paths are rendered. If deterministic rendering is needed, e.g. for a |
| /// screen diffing test, this class will not cache any paths and will |
| /// automatically set the volatility of the path to false. |
| class VolatilePathTracker { |
| public: |
| /// The fields of this struct must only accessed on the UI task runner. |
| struct TrackedPath { |
| bool tracking_volatility = false; |
| int frame_count = 0; |
| SkPath path; |
| }; |
| |
| VolatilePathTracker(fml::RefPtr<fml::TaskRunner> ui_task_runner, |
| bool enabled); |
| |
| static constexpr int kFramesOfVolatility = 2; |
| |
| // Starts tracking a path. |
| // Must be called from the UI task runner. |
| // |
| // Callers should only insert paths that are currently volatile. |
| void Track(const std::shared_ptr<TrackedPath>& path); |
| |
| // Called by the shell at the end of a frame after notifying Dart about idle |
| // time. |
| // |
| // This method will flip the volatility bit to false for any paths that have |
| // survived the |kFramesOfVolatility|. |
| // |
| // Must be called from the UI task runner. |
| void OnFrame(); |
| |
| bool enabled() const { return enabled_; } |
| |
| private: |
| fml::RefPtr<fml::TaskRunner> ui_task_runner_; |
| std::vector<std::weak_ptr<TrackedPath>> paths_; |
| bool enabled_ = true; |
| |
| friend class testing::ShellTest; |
| |
| FML_DISALLOW_COPY_AND_ASSIGN(VolatilePathTracker); |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_LIB_VOLATILE_PATH_TRACKER_H_ |