/* * 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 #import "RCTTextLayoutManager.h" namespace facebook { namespace react { TextLayoutManager::TextLayoutManager(ContextContainer::Shared const &contextContainer) { self_ = wrapManagedObject([RCTTextLayoutManager new]); } std::shared_ptr 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) { return [textLayoutManager measureAttributedString:attributedString paragraphAttributes:paragraphAttributes layoutConstraints:layoutConstraints]; }); break; } case AttributedStringBox::Mode::OpaquePointer: { NSAttributedString *nsAttributedString = (NSAttributedString *)unwrapManagedObject(attributedStringBox.getOpaquePointer()); measurement = [textLayoutManager measureNSAttributedString:nsAttributedString paragraphAttributes:paragraphAttributes layoutConstraints:layoutConstraints]; 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