blob: a2abe3ac17327e85780c9354d8bdb9488dfe98a6 [file]
// 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.
#include "flutter/shell/platform/embedder/embedder_semantics_update.h"
namespace flutter {
EmbedderSemanticsUpdate::EmbedderSemanticsUpdate(
const SemanticsNodeUpdates& nodes,
const CustomAccessibilityActionUpdates& actions) {
for (const auto& value : nodes) {
AddNode(value.second);
}
for (const auto& value : actions) {
AddAction(value.second);
}
update_ = {
.struct_size = sizeof(FlutterSemanticsUpdate),
.nodes_count = nodes_.size(),
.nodes = nodes_.data(),
.custom_actions_count = actions_.size(),
.custom_actions = actions_.data(),
};
}
void EmbedderSemanticsUpdate::AddNode(const SemanticsNode& node) {
SkMatrix transform = node.transform.asM33();
FlutterTransformation flutter_transform{
transform.get(SkMatrix::kMScaleX), transform.get(SkMatrix::kMSkewX),
transform.get(SkMatrix::kMTransX), transform.get(SkMatrix::kMSkewY),
transform.get(SkMatrix::kMScaleY), transform.get(SkMatrix::kMTransY),
transform.get(SkMatrix::kMPersp0), transform.get(SkMatrix::kMPersp1),
transform.get(SkMatrix::kMPersp2)};
// Do not add new members to FlutterSemanticsNode.
// This would break the forward compatibility of FlutterSemanticsUpdate.
// All new members must be added to FlutterSemanticsNode2 instead.
nodes_.push_back({
sizeof(FlutterSemanticsNode),
node.id,
static_cast<FlutterSemanticsFlag>(node.flags),
static_cast<FlutterSemanticsAction>(node.actions),
node.textSelectionBase,
node.textSelectionExtent,
node.scrollChildren,
node.scrollIndex,
node.scrollPosition,
node.scrollExtentMax,
node.scrollExtentMin,
node.elevation,
node.thickness,
node.label.c_str(),
node.hint.c_str(),
node.value.c_str(),
node.increasedValue.c_str(),
node.decreasedValue.c_str(),
static_cast<FlutterTextDirection>(node.textDirection),
FlutterRect{node.rect.fLeft, node.rect.fTop, node.rect.fRight,
node.rect.fBottom},
flutter_transform,
node.childrenInTraversalOrder.size(),
node.childrenInTraversalOrder.data(),
node.childrenInHitTestOrder.data(),
node.customAccessibilityActions.size(),
node.customAccessibilityActions.data(),
node.platformViewId,
node.tooltip.c_str(),
});
}
void EmbedderSemanticsUpdate::AddAction(
const CustomAccessibilityAction& action) {
// Do not add new members to FlutterSemanticsCustomAction.
// This would break the forward compatibility of FlutterSemanticsUpdate.
// All new members must be added to FlutterSemanticsCustomAction2 instead.
actions_.push_back({
sizeof(FlutterSemanticsCustomAction),
action.id,
static_cast<FlutterSemanticsAction>(action.overrideId),
action.label.c_str(),
action.hint.c_str(),
});
}
EmbedderSemanticsUpdate::~EmbedderSemanticsUpdate() {}
EmbedderSemanticsUpdate2::EmbedderSemanticsUpdate2(
const SemanticsNodeUpdates& nodes,
const CustomAccessibilityActionUpdates& actions) {
nodes_.reserve(nodes.size());
node_pointers_.reserve(nodes.size());
actions_.reserve(actions.size());
action_pointers_.reserve(actions.size());
for (const auto& value : nodes) {
AddNode(value.second);
}
for (const auto& value : actions) {
AddAction(value.second);
}
for (size_t i = 0; i < nodes_.size(); i++) {
node_pointers_.push_back(&nodes_[i]);
}
for (size_t i = 0; i < actions_.size(); i++) {
action_pointers_.push_back(&actions_[i]);
}
update_ = {
.struct_size = sizeof(FlutterSemanticsUpdate2),
.node_count = node_pointers_.size(),
.nodes = node_pointers_.data(),
.custom_action_count = action_pointers_.size(),
.custom_actions = action_pointers_.data(),
};
}
EmbedderSemanticsUpdate2::~EmbedderSemanticsUpdate2() {}
void EmbedderSemanticsUpdate2::AddNode(const SemanticsNode& node) {
SkMatrix transform = node.transform.asM33();
FlutterTransformation flutter_transform{
transform.get(SkMatrix::kMScaleX), transform.get(SkMatrix::kMSkewX),
transform.get(SkMatrix::kMTransX), transform.get(SkMatrix::kMSkewY),
transform.get(SkMatrix::kMScaleY), transform.get(SkMatrix::kMTransY),
transform.get(SkMatrix::kMPersp0), transform.get(SkMatrix::kMPersp1),
transform.get(SkMatrix::kMPersp2)};
nodes_.push_back({
sizeof(FlutterSemanticsNode2),
node.id,
static_cast<FlutterSemanticsFlag>(node.flags),
static_cast<FlutterSemanticsAction>(node.actions),
node.textSelectionBase,
node.textSelectionExtent,
node.scrollChildren,
node.scrollIndex,
node.scrollPosition,
node.scrollExtentMax,
node.scrollExtentMin,
node.elevation,
node.thickness,
node.label.c_str(),
node.hint.c_str(),
node.value.c_str(),
node.increasedValue.c_str(),
node.decreasedValue.c_str(),
static_cast<FlutterTextDirection>(node.textDirection),
FlutterRect{node.rect.fLeft, node.rect.fTop, node.rect.fRight,
node.rect.fBottom},
flutter_transform,
node.childrenInTraversalOrder.size(),
node.childrenInTraversalOrder.data(),
node.childrenInHitTestOrder.data(),
node.customAccessibilityActions.size(),
node.customAccessibilityActions.data(),
node.platformViewId,
node.tooltip.c_str(),
});
}
void EmbedderSemanticsUpdate2::AddAction(
const CustomAccessibilityAction& action) {
actions_.push_back({
sizeof(FlutterSemanticsCustomAction2),
action.id,
static_cast<FlutterSemanticsAction>(action.overrideId),
action.label.c_str(),
action.hint.c_str(),
});
}
} // namespace flutter