Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
surface_transaction.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/impeller/toolkit/android/surface_transaction.h"
6
7#include "flutter/impeller/toolkit/android/hardware_buffer.h"
8#include "flutter/impeller/toolkit/android/surface_control.h"
10
11namespace impeller::android {
12
14 : transaction_(GetProcTable().ASurfaceTransaction_create()) {}
15
17
19 return transaction_.is_valid();
20}
21
25
27 if (!IsValid()) {
28 return false;
29 }
30
31 if (!callback) {
32 callback = []() {};
33 }
34
35 const auto& proc_table = GetProcTable();
36
37 auto data = std::make_unique<TransactionInFlightData>();
38 data->callback = callback;
39 proc_table.ASurfaceTransaction_setOnComplete(
40 transaction_.get(), //
41 data.release(), //
42 [](void* context, ASurfaceTransactionStats* stats) -> void {
43 auto data = reinterpret_cast<TransactionInFlightData*>(context);
44 data->callback();
45 delete data;
46 });
47 proc_table.ASurfaceTransaction_apply(transaction_.get());
48
49 // Transactions may not be applied over and over.
50 transaction_.reset();
51 return true;
52}
53
55 const HardwareBuffer* buffer) {
56 if (control == nullptr || buffer == nullptr) {
57 VALIDATION_LOG << "Invalid control or buffer.";
58 return false;
59 }
60 GetProcTable().ASurfaceTransaction_setBuffer(transaction_.get(), //
61 control->GetHandle(), //
62 buffer->GetHandle(), //
63 -1);
64 return true;
65}
66
68 const Color& color) {
69 if (!IsValid() || !control.IsValid()) {
70 return false;
71 }
72 GetProcTable().ASurfaceTransaction_setColor(transaction_.get(), //
73 control.GetHandle(), //
74 color.red, //
75 color.green, //
76 color.blue, //
77 color.alpha, //
78 ADATASPACE_SRGB_LINEAR //
79 );
80 return true;
81}
82
84 const SurfaceControl* new_parent) {
85 if (!IsValid() || !control.IsValid()) {
86 return false;
87 }
88 if (new_parent && !new_parent->IsValid()) {
89 return false;
90 }
91 GetProcTable().ASurfaceTransaction_reparent(
92 transaction_.get(), //
93 control.GetHandle(), //
94 new_parent == nullptr ? nullptr : new_parent->GetHandle() //
95 );
96 return true;
97}
98
100 return GetProcTable().IsValid() &&
101 GetProcTable().ASurfaceTransaction_create.IsAvailable();
102}
103
104} // namespace impeller::android
SkColor4f color
void reset(const T &value=Traits::InvalidValue())
bool is_valid() const
const T & get() const
A wrapper for AHardwareBuffer https://developer.android.com/ndk/reference/group/a-hardware-buffer.
A wrapper for ASurfaceControl. https://developer.android.com/ndk/reference/group/native-activity#asur...
ASurfaceControl * GetHandle() const
bool SetContents(const SurfaceControl *control, const HardwareBuffer *buffer)
Encodes that the updated contents of a surface control are specified by the given hardware buffer....
std::function< void(void)> OnCompleteCallback
bool Apply(OnCompleteCallback callback=nullptr)
Applies the updated encoded in the transaction and invokes the callback when the updated are complete...
bool SetBackgroundColor(const SurfaceControl &control, const Color &color)
Encodes the updated background color of the surface control. The update will not be committed till th...
bool SetParent(const SurfaceControl &control, const SurfaceControl *new_parent=nullptr)
Set the new parent control of the given control. If the new parent is null, it is removed from the co...
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
static const uint8_t buffer[]
const ProcTable & GetProcTable()
Definition proc_table.cc:12
bool IsValid() const
If a valid proc table could be setup. This may fail in case of setup on non-Android platforms.
Definition proc_table.cc:65
SurfaceTransaction::OnCompleteCallback callback
#define VALIDATION_LOG
Definition validation.h:73