/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.litho;
import com.facebook.yoga.YogaConstants;
import com.facebook.yoga.YogaEdge;
import java.util.Arrays;
public class Edges {
private static final int[] sFlagsMap = {
1, /*LEFT*/
2, /*TOP*/
4, /*RIGHT*/
8, /*BOTTOM*/
16, /*START*/
32, /*END*/
64, /*HORIZONTAL*/
128, /*VERTICAL*/
256, /*ALL*/
};
private final float[] mEdges = new float[] {
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
YogaConstants.UNDEFINED,
};
private int mValueFlags = 0;
private float mDefaultValue = 0;
private boolean mHasAliasesSet;
public boolean set(YogaEdge edge, float value) {
if (!floatsEqual(mEdges[edge.intValue()], value)) {
mEdges[edge.intValue()] = value;
if (YogaConstants.isUndefined(value)) {
mValueFlags &= ~sFlagsMap[edge.intValue()];
} else {
mValueFlags |= sFlagsMap[edge.intValue()];
}
mHasAliasesSet =
(mValueFlags & sFlagsMap[YogaEdge.ALL.intValue()]) != 0 ||
(mValueFlags & sFlagsMap[YogaEdge.VERTICAL.intValue()]) != 0 ||
(mValueFlags & sFlagsMap[YogaEdge.HORIZONTAL.intValue()]) != 0;
return true;
}
return false;
}
public float get(YogaEdge edge) {
float defaultValue = (edge == YogaEdge.START || edge == YogaEdge.END
? YogaConstants.UNDEFINED
: mDefaultValue);
if (mValueFlags == 0) {
return defaultValue;
}
if ((mValueFlags & sFlagsMap[edge.intValue()]) != 0) {
return mEdges[edge.intValue()];
}
if (mHasAliasesSet) {
YogaEdge secondType = edge == YogaEdge.TOP || edge == YogaEdge.BOTTOM
? YogaEdge.VERTICAL
: YogaEdge.HORIZONTAL;
if ((mValueFlags & sFlagsMap[secondType.intValue()]) != 0) {
return mEdges[secondType.intValue()];
} else if ((mValueFlags & sFlagsMap[YogaEdge.ALL.intValue()]) != 0) {
return mEdges[YogaEdge.ALL.intValue()];
}
}
return defaultValue;
}
public float getRaw(YogaEdge edge) {
return mEdges[edge.intValue()];
}
public void reset() {
Arrays.fill(mEdges, YogaConstants.UNDEFINED);
mHasAliasesSet = false;
mValueFlags = 0;
}
private static boolean floatsEqual(float f1, float f2) {
if (Float.isNaN(f1) || Float.isNaN(f2)) {
return Float.isNaN(f1) && Float.isNaN(f2);
}
return Math.abs(f2 - f1) < .00001f;
}
}