mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
60f15d6b5d
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
100 lines
3.2 KiB
Plaintext
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
|