Files
react-native/ReactCommon/react/renderer/textlayoutmanager/platform/android/TextLayoutManager.cpp
T
David Vacca 3093010ea5 move fabric to ReactCommon/react/renderer
Summary:
This diff moves fabric C++ code from ReactCommon/fabric to ReactCommon/react/renderer
As part of this diff I also refactored components, codegen and callsites on CatalystApp, FB4A and venice

Script: P137350694

changelog: [internal] internal refactor

Reviewed By: fkgozali

Differential Revision: D22852139

fbshipit-source-id: f85310ba858b6afd81abfd9cbe6d70b28eca7415
2020-07-31 13:34:29 -07:00

124 lines
4.1 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "TextLayoutManager.h"
#include <react/jni/ReadableNativeMap.h>
#include <react/renderer/attributedstring/conversions.h>
#include <react/renderer/core/conversions.h>
using namespace facebook::jni;
namespace facebook {
namespace react {
TextLayoutManager::~TextLayoutManager() {}
void *TextLayoutManager::getNativeTextLayoutManager() const {
return self_;
}
TextMeasurement TextLayoutManager::measure(
AttributedStringBox attributedStringBox,
ParagraphAttributes paragraphAttributes,
LayoutConstraints layoutConstraints) const {
auto &attributedString = attributedStringBox.getValue();
return measureCache_.get(
{attributedString, paragraphAttributes, layoutConstraints},
[&](TextMeasureCacheKey const &key) {
return doMeasure(
attributedString, paragraphAttributes, layoutConstraints);
});
}
TextMeasurement TextLayoutManager::doMeasure(
AttributedString attributedString,
ParagraphAttributes paragraphAttributes,
LayoutConstraints layoutConstraints) const {
const jni::global_ref<jobject> &fabricUIManager =
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
int attachmentsCount = 0;
for (auto fragment : attributedString.getFragments()) {
if (fragment.isAttachment()) {
attachmentsCount++;
}
}
auto env = Environment::current();
auto attachmentPositions = env->NewFloatArray(attachmentsCount * 2);
static auto measure =
jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
->getMethod<jlong(
jint,
jstring,
ReadableMap::javaobject,
ReadableMap::javaobject,
ReadableMap::javaobject,
jfloat,
jfloat,
jfloat,
jfloat,
jfloatArray)>("measure");
auto minimumSize = layoutConstraints.minimumSize;
auto maximumSize = layoutConstraints.maximumSize;
auto serializedAttributedString = toDynamic(attributedString);
local_ref<JString> componentName = make_jstring("RCTText");
local_ref<ReadableNativeMap::javaobject> attributedStringRNM =
ReadableNativeMap::newObjectCxxArgs(serializedAttributedString);
local_ref<ReadableNativeMap::javaobject> paragraphAttributesRNM =
ReadableNativeMap::newObjectCxxArgs(toDynamic(paragraphAttributes));
local_ref<ReadableMap::javaobject> attributedStringRM = make_local(
reinterpret_cast<ReadableMap::javaobject>(attributedStringRNM.get()));
local_ref<ReadableMap::javaobject> paragraphAttributesRM = make_local(
reinterpret_cast<ReadableMap::javaobject>(paragraphAttributesRNM.get()));
auto size = yogaMeassureToSize(measure(
fabricUIManager,
-1,
componentName.get(),
attributedStringRM.get(),
paragraphAttributesRM.get(),
nullptr,
minimumSize.width,
maximumSize.width,
minimumSize.height,
maximumSize.height,
attachmentPositions));
jfloat *attachmentData = env->GetFloatArrayElements(attachmentPositions, 0);
auto attachments = TextMeasurement::Attachments{};
if (attachmentsCount > 0) {
folly::dynamic fragments = serializedAttributedString["fragments"];
int attachmentIndex = 0;
for (int i = 0; i < fragments.size(); i++) {
folly::dynamic fragment = fragments[i];
if (fragment["isAttachment"] == true) {
float top = attachmentData[attachmentIndex * 2];
float left = attachmentData[attachmentIndex * 2 + 1];
float width = (float)fragment["width"].getDouble();
float height = (float)fragment["height"].getDouble();
auto rect = facebook::react::Rect{{left, top},
facebook::react::Size{width, height}};
attachments.push_back(TextMeasurement::Attachment{rect, false});
attachmentIndex++;
}
}
}
// DELETE REF
env->DeleteLocalRef(attachmentPositions);
return TextMeasurement{size, attachments};
}
} // namespace react
} // namespace facebook