Files
react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/TextLayoutManager.mm
T
Valentin Shergin 60f15d6b5d Tracking time spent on measuring text in TransactionTelemetry
Summary:
Now we not only measure how many times we measured text but also measure how much time it takes. This way we can see which portion of the layout process is spent by layout itself (and measuring embedded components).

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: mdvacca

Differential Revision: D26827447

fbshipit-source-id: e0b09fcacc86aed50dd94b48458215adbb0a60ef
2021-03-11 14:34:22 -08:00

100 lines
3.2 KiB
Plaintext

/*
* 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/renderer/mounting/TransactionTelemetry.h>
#include <react/utils/ManagedObjectWrapper.h>
#import "RCTTextLayoutManager.h"
namespace facebook {
namespace react {
TextLayoutManager::TextLayoutManager(ContextContainer::Shared const &contextContainer)
{
self_ = wrapManagedObject([RCTTextLayoutManager new]);
}
std::shared_ptr<void> TextLayoutManager::getNativeTextLayoutManager() const
{
assert(self_ && "Stored NativeTextLayoutManager must not be null.");
return self_;
}
TextMeasurement TextLayoutManager::measure(
AttributedStringBox attributedStringBox,
ParagraphAttributes paragraphAttributes,
LayoutConstraints layoutConstraints) const
{
RCTTextLayoutManager *textLayoutManager = (RCTTextLayoutManager *)unwrapManagedObject(self_);
auto measurement = TextMeasurement{};
switch (attributedStringBox.getMode()) {
case AttributedStringBox::Mode::Value: {
auto &attributedString = attributedStringBox.getValue();
measurement = measureCache_.get(
{attributedString, paragraphAttributes, layoutConstraints}, [&](TextMeasureCacheKey const &key) {
auto telemetry = TransactionTelemetry::threadLocalTelemetry();
if (telemetry) {
telemetry->willMeasureText();
}
auto measurement = [textLayoutManager measureAttributedString:attributedString
paragraphAttributes:paragraphAttributes
layoutConstraints:layoutConstraints];
if (telemetry) {
telemetry->didMeasureText();
}
return measurement;
});
break;
}
case AttributedStringBox::Mode::OpaquePointer: {
NSAttributedString *nsAttributedString =
(NSAttributedString *)unwrapManagedObject(attributedStringBox.getOpaquePointer());
auto telemetry = TransactionTelemetry::threadLocalTelemetry();
if (telemetry) {
telemetry->willMeasureText();
}
measurement = [textLayoutManager measureNSAttributedString:nsAttributedString
paragraphAttributes:paragraphAttributes
layoutConstraints:layoutConstraints];
if (telemetry) {
telemetry->didMeasureText();
}
break;
}
}
measurement.size = layoutConstraints.clamp(measurement.size);
return measurement;
}
LinesMeasurements TextLayoutManager::measureLines(
AttributedString attributedString,
ParagraphAttributes paragraphAttributes,
Size size) const
{
RCTTextLayoutManager *textLayoutManager = (RCTTextLayoutManager *)unwrapManagedObject(self_);
return [textLayoutManager getLinesForAttributedString:attributedString
paragraphAttributes:paragraphAttributes
size:{size.width, size.height}];
}
} // namespace react
} // namespace facebook