-
Notifications
You must be signed in to change notification settings - Fork 24.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
YogaNodeProperties
implementation based on ByteBuffer
Summary: @public Adds an implementation of `YogaNodeProperties` that accesses style and layout properties using a `ByteBuffer` rather than JNI calls. We hope for a speed improvement. This needs further cleanup after experimenting, e.g. to codegen the offsets. Reviewed By: pasqualeanatriello Differential Revision: D8911723 fbshipit-source-id: 3c24b57eb545155878896ebb5d64d4553eb6bedc
- Loading branch information
1 parent
930bf16
commit 0c97e75
Showing
7 changed files
with
749 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
151 changes: 151 additions & 0 deletions
151
ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeMemoryLayout.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
/* | ||
* Copyright (c) 2014-present, Facebook, Inc. | ||
* | ||
* This source code is licensed under the MIT license found in the LICENSE | ||
* file in the root directory of this source tree. | ||
* | ||
*/ | ||
|
||
package com.facebook.yoga; | ||
|
||
import com.facebook.proguard.annotations.DoNotStrip; | ||
import java.nio.ByteBuffer; | ||
|
||
@DoNotStrip | ||
/* package */ final class YogaNodeMemoryLayout { | ||
|
||
private static final int FLOAT_SIZE = 4; | ||
private static final int INT_SIZE = 4; | ||
private static final int VALUE_SIZE = FLOAT_SIZE + INT_SIZE; | ||
private static final byte FALSE = 0; | ||
private static final byte TRUE = 1; | ||
private static final int AUTO = YogaUnit.AUTO.intValue(); | ||
private static final int POINT = YogaUnit.POINT.intValue(); | ||
private static final int PERCENT = YogaUnit.PERCENT.intValue(); | ||
private static final int UNDEFINED = YogaUnit.UNDEFINED.intValue(); | ||
|
||
// TODO(davidaurelio) code-gen these values | ||
static final int styleDirection = 0; | ||
static final int styleFlexDirection = 4; | ||
static final int styleJustifyContent = 8; | ||
static final int styleAlignContent = 12; | ||
static final int styleAlignItems = 16; | ||
static final int styleAlignSelf = 20; | ||
static final int stylePositionType = 24; | ||
static final int styleFlexWrap = 28; | ||
static final int styleOverflow = 32; | ||
static final int styleDisplay = 36; | ||
static final int styleFlex = 40; | ||
static final int styleFlexGrow = 48; | ||
static final int styleFlexShrink = 56; | ||
static final int styleFlexBasis = 64; | ||
static final int styleMargin = 72; | ||
static final int stylePosition = 144; | ||
static final int stylePadding = 216; | ||
static final int styleBorder = 288; | ||
static final int styleDimensions = 360; | ||
static final int styleMinDimensions = 376; | ||
static final int styleMaxDimensions = 392; | ||
static final int styleAspectRatio = 408; | ||
|
||
static final int styleWidth = styleDimensions; | ||
static final int styleHeight = styleDimensions + VALUE_SIZE; | ||
static final int styleMinWidth = styleMinDimensions; | ||
static final int styleMinHeight = styleMinDimensions + VALUE_SIZE; | ||
static final int styleMaxWidth = styleMaxDimensions; | ||
static final int styleMaxHeight = styleMaxDimensions + VALUE_SIZE; | ||
|
||
static final int layoutPosition = 0; | ||
static final int layoutDimensions = 16; | ||
static final int layoutMargin = 24; | ||
static final int layoutBorder = 48; | ||
static final int layoutPadding = 72; | ||
static final int layoutDirection = 96; | ||
static final int layoutComputedFlexBasisGeneration = 100; | ||
static final int layoutComputedFlexBasis = 104; | ||
static final int layoutHadOverflow = 112; | ||
static final int layoutGenerationCount = 116; | ||
static final int layoutLastOwnerDirection = 120; | ||
static final int layoutNextCachedMeasurementsIndex = 124; | ||
static final int layoutCachedMeasurements = 128; | ||
static final int layoutMeasuredDimensions = 512; | ||
static final int layoutCachedLayout = 520; | ||
static final int layoutDidUseLegacyFlag = 544; | ||
static final int layoutDoesLegacyStretchFlagAffectsLayout = 545; | ||
|
||
static final int layoutX = layoutPosition; | ||
static final int layoutY = layoutPosition + FLOAT_SIZE; | ||
static final int layoutWidth = layoutDimensions; | ||
static final int layoutHeight = layoutDimensions + FLOAT_SIZE; | ||
|
||
static int stylePositionOffset(YogaEdge edge) { | ||
return stylePosition + edge.intValue() * VALUE_SIZE; | ||
} | ||
|
||
static int styleMarginOffset(YogaEdge edge) { | ||
return styleMargin + edge.intValue() * VALUE_SIZE; | ||
} | ||
|
||
static int layoutMarginOffset(YogaEdge edge) { | ||
return layoutMargin + edge.intValue() * FLOAT_SIZE; | ||
} | ||
|
||
static int stylePaddingOffset(YogaEdge edge) { | ||
return stylePadding + edge.intValue() * VALUE_SIZE; | ||
} | ||
|
||
static int layoutPaddingOffset(YogaEdge edge) { | ||
return layoutPadding + edge.intValue() * FLOAT_SIZE; | ||
} | ||
|
||
static int styleBorderOffset(YogaEdge edge) { | ||
return styleBorder + edge.intValue() * VALUE_SIZE; | ||
} | ||
|
||
static int layoutBorderOffset(YogaEdge edge) { | ||
return layoutBorder + edge.intValue() * FLOAT_SIZE; | ||
} | ||
|
||
static void putOptional(ByteBuffer buffer, int offset, float value) { | ||
buffer.putFloat(offset, value); | ||
buffer.put( | ||
offset + FLOAT_SIZE, YogaConstants.isUndefined(value) ? TRUE : FALSE); // bool isUndefined_ | ||
} | ||
|
||
static float getOptional(ByteBuffer buffer, int offset) { | ||
return getBoolean(buffer, offset + FLOAT_SIZE) | ||
? YogaConstants.UNDEFINED | ||
: buffer.getFloat(offset); | ||
} | ||
|
||
private static void putValue(ByteBuffer buffer, int offset, float value, int unit) { | ||
if (YogaConstants.isUndefined(value)) { | ||
value = YogaConstants.UNDEFINED; | ||
unit = UNDEFINED; | ||
} | ||
buffer.putFloat(offset, value); | ||
buffer.putInt(offset + FLOAT_SIZE, unit); | ||
} | ||
|
||
static void putAutoValue(ByteBuffer buffer, int offset) { | ||
putValue(buffer, offset, 0, AUTO); | ||
} | ||
|
||
static void putPointValue(ByteBuffer buffer, int offset, float value) { | ||
putValue(buffer, offset, value, POINT); | ||
} | ||
|
||
static void putPercentValue(ByteBuffer buffer, int offset, float value) { | ||
putValue(buffer, offset, value, PERCENT); | ||
} | ||
|
||
static YogaValue getValue(ByteBuffer buffer, int offset) { | ||
float value = buffer.getFloat(offset); | ||
int unit = buffer.getInt(offset + FLOAT_SIZE); | ||
return new YogaValue(value, YogaUnit.fromInt(unit)); | ||
} | ||
|
||
static boolean getBoolean(ByteBuffer buffer, int offset) { | ||
return buffer.get(offset) != 0; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.