Convert FabricUIManager.measure params to floats

Summary: Convert FabricUIManager.measure params to floats. Currently we convert parameters to ints across the JNI boundary, and then back to floats several times in Java. This is unnecessary and actually makes measurements trickier. The new implementation uses floats across the JNI boundary and uses Float.POSITIVE_INFINITY to represent unconstrained values, which is consistent with Fabric C++ as well.

Reviewed By: shergin, mdvacca

Differential Revision: D15176108

fbshipit-source-id: cf849b3773007637f059279460163872f300a4aa
This commit is contained in:
Joshua Gross 2019-05-03 12:24:41 -07:00 коммит произвёл Facebook Github Bot
Родитель a87af19d3f
Коммит 4a1d532674
4 изменённых файлов: 30 добавлений и 44 удалений

Просмотреть файл

@ -280,10 +280,10 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
String componentName,
ReadableMap localData,
ReadableMap props,
int minWidth,
int maxWidth,
int minHeight,
int maxHeight) {
float minWidth,
float maxWidth,
float minHeight,
float maxHeight) {
return mMountingManager.measure(
mReactApplicationContext,

Просмотреть файл

@ -14,9 +14,6 @@ import com.facebook.yoga.YogaMeasureMode;
public class LayoutMetricsConversions {
// Represents the Layout constraint mode "undefined" from React side.
public static final int REACT_CONSTRAINT_UNDEFINED = -2147483648;
public static float getMinSize(int viewMeasureSpec) {
int mode = View.MeasureSpec.getMode(viewMeasureSpec);
int size = View.MeasureSpec.getSize(viewMeasureSpec);
@ -28,30 +25,27 @@ public class LayoutMetricsConversions {
int mode = View.MeasureSpec.getMode(viewMeasureSpec);
int size = View.MeasureSpec.getSize(viewMeasureSpec);
return mode == View.MeasureSpec.UNSPECIFIED ? REACT_CONSTRAINT_UNDEFINED : size;
// Infinity represents an "unconstrained" size
return mode == View.MeasureSpec.UNSPECIFIED ? Float.POSITIVE_INFINITY : size;
}
public static float getYogaSize(float minSize, float maxSize) {
float yogaSize;
if (minSize == maxSize) {
yogaSize = PixelUtil.toPixelFromDIP(maxSize);
} else if (maxSize == REACT_CONSTRAINT_UNDEFINED) {
yogaSize = 0;
return PixelUtil.toPixelFromDIP(maxSize);
} else if (Float.isInfinite(maxSize)) {
return Float.POSITIVE_INFINITY;
} else {
yogaSize = PixelUtil.toPixelFromDIP(maxSize);
return PixelUtil.toPixelFromDIP(maxSize);
}
return yogaSize;
}
public static YogaMeasureMode getYogaMeasureMode(float minSize, float maxSize) {
YogaMeasureMode yogaMeasureMode;
if (minSize == maxSize) {
yogaMeasureMode = YogaMeasureMode.EXACTLY;
} else if (maxSize == REACT_CONSTRAINT_UNDEFINED) {
yogaMeasureMode = YogaMeasureMode.UNDEFINED;
return YogaMeasureMode.EXACTLY;
} else if (Float.isInfinite(maxSize)) {
return YogaMeasureMode.UNDEFINED;
} else {
yogaMeasureMode = YogaMeasureMode.AT_MOST;
return YogaMeasureMode.AT_MOST;
}
return yogaMeasureMode;
}
}

Просмотреть файл

@ -35,17 +35,13 @@ Size SliderMeasurementsManager::measure(
jstring,
ReadableMap::javaobject,
ReadableMap::javaobject,
jint,
jint,
jint,
jint)>("measure");
jfloat,
jfloat,
jfloat,
jfloat)>("measure");
auto minimumSize = layoutConstraints.minimumSize;
auto maximumSize = layoutConstraints.maximumSize;
int minWidth = (int)minimumSize.width;
int minHeight = (int)minimumSize.height;
int maxWidth = (int)maximumSize.width;
int maxHeight = (int)maximumSize.height;
local_ref<JString> componentName = make_jstring("RCTSlider");
@ -54,10 +50,10 @@ Size SliderMeasurementsManager::measure(
componentName.get(),
nullptr,
nullptr,
minWidth,
maxWidth,
minHeight,
maxHeight));
minimumSize.width,
maximumSize.width,
minimumSize.height,
maximumSize.height));
std::lock_guard<std::mutex> lock(mutex_);
cachedMeasurement_ = measurement;

Просмотреть файл

@ -36,17 +36,13 @@ Size TextLayoutManager::measure(
jstring,
ReadableMap::javaobject,
ReadableMap::javaobject,
jint,
jint,
jint,
jint)>("measure");
jfloat,
jfloat,
jfloat,
jfloat)>("measure");
auto minimumSize = layoutConstraints.minimumSize;
auto maximumSize = layoutConstraints.maximumSize;
int minWidth = (int)minimumSize.width;
int minHeight = (int)minimumSize.height;
int maxWidth = (int)maximumSize.width;
int maxHeight = (int)maximumSize.height;
local_ref<JString> componentName = make_jstring("RCTText");
local_ref<ReadableNativeMap::javaobject> attributedStringRNM =
@ -63,10 +59,10 @@ Size TextLayoutManager::measure(
componentName.get(),
attributedStringRM.get(),
paragraphAttributesRM.get(),
minWidth,
maxWidth,
minHeight,
maxHeight));
minimumSize.width,
maximumSize.width,
minimumSize.height,
maximumSize.height));
}
} // namespace react