| // 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_IMPELLER_TOOLKIT_ANDROID_SURFACE_TRANSACTION_H_ | |
| #define FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_TRANSACTION_H_ | |
| #include <functional> | |
| #include <map> | |
| #include "flutter/fml/unique_object.h" | |
| #include "impeller/geometry/color.h" | |
| #include "impeller/toolkit/android/proc_table.h" | |
| namespace impeller::android { | |
| class SurfaceControl; | |
| class HardwareBuffer; | |
| //------------------------------------------------------------------------------ | |
| /// @brief A wrapper for ASurfaceTransaction. | |
| /// https://developer.android.com/ndk/reference/group/native-activity#asurfacetransaction | |
| /// | |
| /// A surface transaction is a collection of updates to the | |
| /// hierarchy of surfaces (represented by `ASurfaceControl` | |
| /// instances) that are applied atomically in the compositor. | |
| /// | |
| /// This wrapper is only available on Android API 29 and above. | |
| /// | |
| /// @note Transactions should be short lived objects (create, apply, | |
| /// collect). But, if these are used on multiple threads, they must | |
| /// be externally synchronized. | |
| /// | |
| class SurfaceTransaction { | |
| public: | |
| //---------------------------------------------------------------------------- | |
| /// @return `true` if any surface transactions can be created on this | |
| /// platform. | |
| /// | |
| static bool IsAvailableOnPlatform(); | |
| SurfaceTransaction(); | |
| ~SurfaceTransaction(); | |
| SurfaceTransaction(const SurfaceTransaction&) = delete; | |
| SurfaceTransaction& operator=(const SurfaceTransaction&) = delete; | |
| bool IsValid() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Encodes that the updated contents of a surface control are | |
| /// specified by the given hardware buffer. The update will not be | |
| /// committed till the call to `Apply` however. | |
| /// | |
| /// @see `SurfaceTransaction::Apply`. | |
| /// | |
| /// @param[in] control The control | |
| /// @param[in] buffer The hardware buffer | |
| /// | |
| /// @return If the update was encoded in the transaction. | |
| /// | |
| [[nodiscard]] bool SetContents(const SurfaceControl* control, | |
| const HardwareBuffer* buffer); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Encodes the updated background color of the surface control. | |
| /// The update will not be committed till the call to `Apply` | |
| /// however. | |
| /// | |
| /// @see `SurfaceTransaction::Apply`. | |
| /// | |
| /// @param[in] control The control | |
| /// @param[in] color The color | |
| /// | |
| /// @return `true` if the background control will be set when transaction | |
| /// is applied. | |
| /// | |
| [[nodiscard]] bool SetBackgroundColor(const SurfaceControl& control, | |
| const Color& color); | |
| using OnCompleteCallback = std::function<void(void)>; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Applies the updated encoded in the transaction and invokes the | |
| /// callback when the updated are complete. | |
| /// | |
| /// @warning The callback will be invoked on a system managed thread. | |
| /// | |
| /// @note It is fine to immediately destroy the transaction after the | |
| /// call to apply. It is not necessary to wait for transaction | |
| /// completion to collect the transaction handle. | |
| /// | |
| /// @param[in] callback The callback | |
| /// | |
| /// @return `true` if the surface transaction was applied. `true` does not | |
| /// indicate the application was completed however. Only the | |
| /// invocation of the callback denotes transaction completion. | |
| /// | |
| [[nodiscard]] bool Apply(OnCompleteCallback callback = nullptr); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Set the new parent control of the given control. If the new | |
| /// parent is null, it is removed from the control hierarchy. | |
| /// | |
| /// @param[in] control The control | |
| /// @param[in] new_parent The new parent | |
| /// | |
| /// @return `true` if the control will be re-parented when the transaction | |
| /// is applied. | |
| /// | |
| [[nodiscard]] bool SetParent(const SurfaceControl& control, | |
| const SurfaceControl* new_parent = nullptr); | |
| private: | |
| struct UniqueASurfaceTransactionTraits { | |
| static ASurfaceTransaction* InvalidValue() { return nullptr; } | |
| static bool IsValid(ASurfaceTransaction* value) { | |
| return value != InvalidValue(); | |
| } | |
| static void Free(ASurfaceTransaction* value) { | |
| GetProcTable().ASurfaceTransaction_delete(value); | |
| } | |
| }; | |
| fml::UniqueObject<ASurfaceTransaction*, UniqueASurfaceTransactionTraits> | |
| transaction_; | |
| }; | |
| } // namespace impeller::android | |
| #endif // FLUTTER_IMPELLER_TOOLKIT_ANDROID_SURFACE_TRANSACTION_H_ |