[java] simplify Spacing, reduce allocations

This commit is contained in:
Felix Oghină
2015-05-15 14:13:25 +01:00
parent b5da5e4d7c
commit 11f09d1a65

View File

@@ -8,6 +8,8 @@
*/
package com.facebook.csslayout;
import javax.annotation.Nullable;
/**
* Class representing CSS spacing (padding, margin, and borders). This is mostly necessary to
* properly implement interactions and updates for properties like margin, marginLeft, and
@@ -54,9 +56,7 @@ public class Spacing {
public static final int ALL = 8;
private final float[] mSpacing = newFullSpacingArray();
private final float[] mDefaultSpacing = newSpacingResultArray();
private final float[] mSpacingResult = newSpacingResultArray();
private boolean mDirty;
@Nullable private float[] mDefaultSpacing = null;
/**
* Set a spacing value.
@@ -70,9 +70,9 @@ public class Spacing {
public boolean set(int spacingType, float value) {
if (!FloatUtil.floatsEqual(mSpacing[spacingType], value)) {
mSpacing[spacingType] = value;
mDirty = true;
return true;
}
return mDirty;
return false;
}
/**
@@ -84,11 +84,14 @@ public class Spacing {
* @return
*/
public boolean setDefault(int spacingType, float value) {
if (mDefaultSpacing == null) {
mDefaultSpacing = newSpacingResultArray();
}
if (!FloatUtil.floatsEqual(mDefaultSpacing[spacingType], value)) {
mDefaultSpacing[spacingType] = value;
mDirty = true;
return true;
}
return mDirty;
return false;
}
/**
@@ -97,8 +100,18 @@ public class Spacing {
* @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM}
*/
public float get(int spacingType) {
ensureResult();
return mSpacingResult[spacingType];
int secondType = spacingType == TOP || spacingType == BOTTOM ? VERTICAL : HORIZONTAL;
float defaultValue = spacingType == START || spacingType == END ? CSSConstants.UNDEFINED : 0;
return
!CSSConstants.isUndefined(mSpacing[spacingType])
? mSpacing[spacingType]
: !CSSConstants.isUndefined(mSpacing[secondType])
? mSpacing[secondType]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing != null
? mDefaultSpacing[spacingType]
: defaultValue;
}
/**
@@ -143,64 +156,4 @@ public class Spacing {
defaultValue,
};
}
/**
* Given the {@param fullSpacing} and the spacingResult from {@link #newSpacingResultArray()} from
* a View, update the result array to reflect values that have been set in {@param fullSpacing}
* array. {@param defaultValues} specifies the result values that should be used whenever a
* spacing property hasn't been set.
*/
private void ensureResult() {
if (mDirty) {
mSpacingResult[TOP] =
!CSSConstants.isUndefined(mSpacing[TOP])
? mSpacing[TOP]
: !CSSConstants.isUndefined(mSpacing[VERTICAL])
? mSpacing[VERTICAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[TOP];
mSpacingResult[BOTTOM] =
!CSSConstants.isUndefined(mSpacing[BOTTOM])
? mSpacing[BOTTOM]
: !CSSConstants.isUndefined(mSpacing[VERTICAL])
? mSpacing[VERTICAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[BOTTOM];
mSpacingResult[LEFT] =
!CSSConstants.isUndefined(mSpacing[LEFT])
? mSpacing[LEFT]
: !CSSConstants.isUndefined(mSpacing[HORIZONTAL])
? mSpacing[HORIZONTAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[LEFT];
mSpacingResult[RIGHT] =
!CSSConstants.isUndefined(mSpacing[RIGHT])
? mSpacing[RIGHT]
: !CSSConstants.isUndefined(mSpacing[HORIZONTAL])
? mSpacing[HORIZONTAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[RIGHT];
mSpacingResult[START] =
!CSSConstants.isUndefined(mSpacing[START])
? mSpacing[START]
: !CSSConstants.isUndefined(mSpacing[HORIZONTAL])
? mSpacing[HORIZONTAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[START];
mSpacingResult[END] =
!CSSConstants.isUndefined(mSpacing[END])
? mSpacing[END]
: !CSSConstants.isUndefined(mSpacing[HORIZONTAL])
? mSpacing[HORIZONTAL]
: !CSSConstants.isUndefined(mSpacing[ALL])
? mSpacing[ALL]
: mDefaultSpacing[END];
mDirty = false;
}
}
}