text: /*
   * 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/attributedstring/conversions.h>
  #include <react/core/conversions.h>
  #include <react/jni/ReadableNativeMap.h>
  
  using namespace facebook::jni;
  
  namespace facebook {
  namespace react {
  
  TextLayoutManager::~TextLayoutManager() {}
  
  void *TextLayoutManager::getNativeTextLayoutManager() const {
    return self_;
  }
  
  Size 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);
        });
  }
  
  Size TextLayoutManager::doMeasure(
      AttributedString attributedString,
      ParagraphAttributes paragraphAttributes,
      LayoutConstraints layoutConstraints) const {
    const jni::global_ref<jobject> &fabricUIManager =
        contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
  
    static auto measure =
        jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
            ->getMethod<jlong(
                jint,
                jstring,
                ReadableMap::javaobject,
                ReadableMap::javaobject,
                ReadableMap::javaobject,
                jfloat,
                jfloat,
                jfloat,
                jfloat)>("measure");
  
    auto minimumSize = layoutConstraints.minimumSize;
    auto maximumSize = layoutConstraints.maximumSize;
  
    local_ref<JString> componentName = make_jstring("RCTText");
    local_ref<ReadableNativeMap::javaobject> attributedStringRNM =
        ReadableNativeMap::newObjectCxxArgs(toDynamic(attributedString));
    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()));
    return yogaMeassureToSize(measure(
        fabricUIManager,
        -1,
        componentName.get(),
        attributedStringRM.get(),
        paragraphAttributesRM.get(),
        nullptr,
        minimumSize.width,
        maximumSize.width,
        minimumSize.height,
        maximumSize.height));
  }
  
  } // namespace react
  } // namespace facebook
  