Skip to content

Commit

Permalink
More efficient decoding of Dynamic value in LayoutShadowNode
Browse files Browse the repository at this point in the history
Reviewed By: astreet

Differential Revision: D4627219

fbshipit-source-id: 1495d58b08af3c619a8dc0d2df655e0c42aa813e
  • Loading branch information
Emil Sjolander authored and facebook-github-bot committed Mar 1, 2017
1 parent d5a381f commit fb266fc
Showing 1 changed file with 118 additions and 62 deletions.
Expand Up @@ -15,7 +15,6 @@
import com.facebook.yoga.YogaJustify; import com.facebook.yoga.YogaJustify;
import com.facebook.yoga.YogaOverflow; import com.facebook.yoga.YogaOverflow;
import com.facebook.yoga.YogaPositionType; import com.facebook.yoga.YogaPositionType;
import com.facebook.yoga.YogaValue;
import com.facebook.yoga.YogaUnit; import com.facebook.yoga.YogaUnit;
import com.facebook.yoga.YogaWrap; import com.facebook.yoga.YogaWrap;
import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.annotations.ReactProp;
Expand All @@ -32,33 +31,52 @@
*/ */
public class LayoutShadowNode extends ReactShadowNode { public class LayoutShadowNode extends ReactShadowNode {


private static boolean dynamicIsPercent(Dynamic dynamic) { /**
return dynamic.getType() == ReadableType.String && dynamic.asString().endsWith("%"); * A Mutable version of com.facebook.yoga.YogaValue
} */

private static class MutableYogaValue {
private static float getDynamicAsPercent(Dynamic dynamic) { float value;
final String value = dynamic.asString(); YogaUnit unit;
return Float.parseFloat(value.substring(0, value.length() - 1));
} void setFromDynamic(Dynamic dynamic) {

if (dynamic.isNull()) {
private static float getDynamicAsFloat(Dynamic dynamic) { unit = YogaUnit.UNDEFINED;
return (float) PixelUtil.toPixelFromDIP(dynamic.asDouble()); value = YogaConstants.UNDEFINED;
} else if (dynamic.getType() == ReadableType.String) {
final String s = dynamic.asString();
if (s.equals("auto")) {
unit = YogaUnit.AUTO;
value = YogaConstants.UNDEFINED;
} else if (s.endsWith("%")) {
unit = YogaUnit.PERCENT;
value = Float.parseFloat(s.substring(0, s.length() - 1));
} else {
throw new IllegalArgumentException("Unknown value: " + s);
}
} else {
unit = YogaUnit.POINT;
value = PixelUtil.toPixelFromDIP(dynamic.asDouble());
}
}
} }


private static boolean isNull(Dynamic d) { private final MutableYogaValue mTempYogaValue = new MutableYogaValue();
return d == null || d.isNull();
}


@ReactProp(name = ViewProps.WIDTH) @ReactProp(name = ViewProps.WIDTH)
public void setWidth(Dynamic width) { public void setWidth(Dynamic width) {
if (isVirtual()) { if (isVirtual()) {
return; return;
} }


if (!isNull(width) && dynamicIsPercent(width)) { mTempYogaValue.setFromDynamic(width);
setStyleWidthPercent(getDynamicAsPercent(width)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleWidth(isNull(width) ? YogaConstants.UNDEFINED : getDynamicAsFloat(width)); case UNDEFINED:
setStyleWidth(mTempYogaValue.value);
break;
case PERCENT:
setStyleWidthPercent(mTempYogaValue.value);
break;
} }


width.recycle(); width.recycle();
Expand All @@ -70,10 +88,15 @@ public void setMinWidth(Dynamic minWidth) {
return; return;
} }


if (!isNull(minWidth) && dynamicIsPercent(minWidth)) { mTempYogaValue.setFromDynamic(minWidth);
setStyleMinWidthPercent(getDynamicAsPercent(minWidth)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleMinWidth(isNull(minWidth) ? YogaConstants.UNDEFINED : getDynamicAsFloat(minWidth)); case UNDEFINED:
setStyleMinWidth(mTempYogaValue.value);
break;
case PERCENT:
setStyleMinWidthPercent(mTempYogaValue.value);
break;
} }


minWidth.recycle(); minWidth.recycle();
Expand All @@ -85,10 +108,15 @@ public void setMaxWidth(Dynamic maxWidth) {
return; return;
} }


if (!isNull(maxWidth) && dynamicIsPercent(maxWidth)) { mTempYogaValue.setFromDynamic(maxWidth);
setStyleMaxWidthPercent(getDynamicAsPercent(maxWidth)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleMaxWidth(isNull(maxWidth) ? YogaConstants.UNDEFINED : getDynamicAsFloat(maxWidth)); case UNDEFINED:
setStyleMaxWidth(mTempYogaValue.value);
break;
case PERCENT:
setStyleMaxWidthPercent(mTempYogaValue.value);
break;
} }


maxWidth.recycle(); maxWidth.recycle();
Expand All @@ -100,10 +128,15 @@ public void setHeight(Dynamic height) {
return; return;
} }


if (!isNull(height) && dynamicIsPercent(height)) { mTempYogaValue.setFromDynamic(height);
setStyleHeightPercent(getDynamicAsPercent(height)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleHeight(isNull(height) ? YogaConstants.UNDEFINED : getDynamicAsFloat(height)); case UNDEFINED:
setStyleHeight(mTempYogaValue.value);
break;
case PERCENT:
setStyleHeightPercent(mTempYogaValue.value);
break;
} }


height.recycle(); height.recycle();
Expand All @@ -115,10 +148,15 @@ public void setMinHeight(Dynamic minHeight) {
return; return;
} }


if (!isNull(minHeight) && dynamicIsPercent(minHeight)) { mTempYogaValue.setFromDynamic(minHeight);
setStyleMinHeightPercent(getDynamicAsPercent(minHeight)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleMinHeight(isNull(minHeight) ? YogaConstants.UNDEFINED : getDynamicAsFloat(minHeight)); case UNDEFINED:
setStyleMinHeight(mTempYogaValue.value);
break;
case PERCENT:
setStyleMinHeightPercent(mTempYogaValue.value);
break;
} }


minHeight.recycle(); minHeight.recycle();
Expand All @@ -130,10 +168,15 @@ public void setMaxHeight(Dynamic maxHeight) {
return; return;
} }


if (!isNull(maxHeight) && dynamicIsPercent(maxHeight)) { mTempYogaValue.setFromDynamic(maxHeight);
setStyleMaxHeightPercent(getDynamicAsPercent(maxHeight)); switch (mTempYogaValue.unit) {
} else { case POINT:
setStyleMaxHeight(isNull(maxHeight) ? YogaConstants.UNDEFINED : getDynamicAsFloat(maxHeight)); case UNDEFINED:
setStyleMaxHeight(mTempYogaValue.value);
break;
case PERCENT:
setStyleMaxHeightPercent(mTempYogaValue.value);
break;
} }


maxHeight.recycle(); maxHeight.recycle();
Expand Down Expand Up @@ -169,10 +212,15 @@ public void setFlexBasis(Dynamic flexBasis) {
return; return;
} }


if (!isNull(flexBasis) && dynamicIsPercent(flexBasis)) { mTempYogaValue.setFromDynamic(flexBasis);
setFlexBasisPercent(getDynamicAsPercent(flexBasis)); switch (mTempYogaValue.unit) {
} else { case POINT:
setFlexBasis(isNull(flexBasis) ? 0 : getDynamicAsFloat(flexBasis)); case UNDEFINED:
setFlexBasis(mTempYogaValue.value);
break;
case PERCENT:
setFlexBasisPercent(mTempYogaValue.value);
break;
} }


flexBasis.recycle(); flexBasis.recycle();
Expand Down Expand Up @@ -258,12 +306,15 @@ public void setMargins(int index, Dynamic margin) {
return; return;
} }


if (!isNull(margin) && dynamicIsPercent(margin)) { mTempYogaValue.setFromDynamic(margin);
setMarginPercent(ViewProps.PADDING_MARGIN_SPACING_TYPES[index], getDynamicAsPercent(margin)); switch (mTempYogaValue.unit) {
} else { case POINT:
setMargin( case UNDEFINED:
ViewProps.PADDING_MARGIN_SPACING_TYPES[index], setMargin(ViewProps.PADDING_MARGIN_SPACING_TYPES[index], mTempYogaValue.value);
isNull(margin) ? YogaConstants.UNDEFINED : getDynamicAsFloat(margin)); break;
case PERCENT:
setMarginPercent(ViewProps.PADDING_MARGIN_SPACING_TYPES[index], mTempYogaValue.value);
break;
} }


margin.recycle(); margin.recycle();
Expand All @@ -283,13 +334,15 @@ public void setPaddings(int index, Dynamic padding) {
return; return;
} }


if (!isNull(padding) && dynamicIsPercent(padding)) { mTempYogaValue.setFromDynamic(padding);
setPaddingPercent( switch (mTempYogaValue.unit) {
ViewProps.PADDING_MARGIN_SPACING_TYPES[index], getDynamicAsPercent(padding)); case POINT:
} else { case UNDEFINED:
setPadding( setPadding(ViewProps.PADDING_MARGIN_SPACING_TYPES[index], mTempYogaValue.value);
ViewProps.PADDING_MARGIN_SPACING_TYPES[index], break;
isNull(padding) ? YogaConstants.UNDEFINED : getDynamicAsFloat(padding)); case PERCENT:
setPaddingPercent(ViewProps.PADDING_MARGIN_SPACING_TYPES[index], mTempYogaValue.value);
break;
} }


padding.recycle(); padding.recycle();
Expand Down Expand Up @@ -320,12 +373,15 @@ public void setPositionValues(int index, Dynamic position) {
return; return;
} }


if (!isNull(position) && dynamicIsPercent(position)) { mTempYogaValue.setFromDynamic(position);
setPositionPercent(ViewProps.POSITION_SPACING_TYPES[index], getDynamicAsPercent(position)); switch (mTempYogaValue.unit) {
} else { case POINT:
setPosition( case UNDEFINED:
ViewProps.POSITION_SPACING_TYPES[index], setPosition(ViewProps.POSITION_SPACING_TYPES[index], mTempYogaValue.value);
isNull(position) ? YogaConstants.UNDEFINED : getDynamicAsFloat(position)); break;
case PERCENT:
setPositionPercent(ViewProps.POSITION_SPACING_TYPES[index], mTempYogaValue.value);
break;
} }


position.recycle(); position.recycle();
Expand Down

0 comments on commit fb266fc

Please sign in to comment.