Merge pull request #89 from foghina/better_spacing
[java] simplify Spacing, reduce allocations
This commit is contained in:
@@ -8,6 +8,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.facebook.csslayout;
|
package com.facebook.csslayout;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class representing CSS spacing (padding, margin, and borders). This is mostly necessary to
|
* Class representing CSS spacing (padding, margin, and borders). This is mostly necessary to
|
||||||
* properly implement interactions and updates for properties like margin, marginLeft, and
|
* properly implement interactions and updates for properties like margin, marginLeft, and
|
||||||
@@ -54,9 +56,7 @@ public class Spacing {
|
|||||||
public static final int ALL = 8;
|
public static final int ALL = 8;
|
||||||
|
|
||||||
private final float[] mSpacing = newFullSpacingArray();
|
private final float[] mSpacing = newFullSpacingArray();
|
||||||
private final float[] mDefaultSpacing = newSpacingResultArray();
|
@Nullable private float[] mDefaultSpacing = null;
|
||||||
private final float[] mSpacingResult = newSpacingResultArray();
|
|
||||||
private boolean mDirty;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a spacing value.
|
* Set a spacing value.
|
||||||
@@ -70,9 +70,9 @@ public class Spacing {
|
|||||||
public boolean set(int spacingType, float value) {
|
public boolean set(int spacingType, float value) {
|
||||||
if (!FloatUtil.floatsEqual(mSpacing[spacingType], value)) {
|
if (!FloatUtil.floatsEqual(mSpacing[spacingType], value)) {
|
||||||
mSpacing[spacingType] = value;
|
mSpacing[spacingType] = value;
|
||||||
mDirty = true;
|
return true;
|
||||||
}
|
}
|
||||||
return mDirty;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,11 +84,14 @@ public class Spacing {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean setDefault(int spacingType, float value) {
|
public boolean setDefault(int spacingType, float value) {
|
||||||
|
if (mDefaultSpacing == null) {
|
||||||
|
mDefaultSpacing = newSpacingResultArray();
|
||||||
|
}
|
||||||
if (!FloatUtil.floatsEqual(mDefaultSpacing[spacingType], value)) {
|
if (!FloatUtil.floatsEqual(mDefaultSpacing[spacingType], value)) {
|
||||||
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}
|
* @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM}
|
||||||
*/
|
*/
|
||||||
public float get(int spacingType) {
|
public float get(int spacingType) {
|
||||||
ensureResult();
|
int secondType = spacingType == TOP || spacingType == BOTTOM ? VERTICAL : HORIZONTAL;
|
||||||
return mSpacingResult[spacingType];
|
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,
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user