Remove isTextNode optimization

Reviewed By: astreet

Differential Revision: D4146785

fbshipit-source-id: e20d780fbd5759b8f38b809e8cadf29cedee82a8
This commit is contained in:
Emil Sjolander 2016-11-08 09:07:48 -08:00 committed by Facebook Github Bot
parent 47d9cb4dac
commit 81e4139edc
6 changed files with 7 additions and 72 deletions

View File

@ -89,7 +89,6 @@ typedef struct CSSNode {
CSSLayout layout; CSSLayout layout;
uint32_t lineIndex; uint32_t lineIndex;
bool hasNewLayout; bool hasNewLayout;
bool isTextNode;
CSSNodeRef parent; CSSNodeRef parent;
CSSNodeListRef children; CSSNodeListRef children;
bool isDirty; bool isDirty;
@ -382,7 +381,6 @@ void CSSNodeStyleSetFlex(const CSSNodeRef node, const float flex) {
CSS_NODE_PROPERTY_IMPL(void *, Context, context, context); CSS_NODE_PROPERTY_IMPL(void *, Context, context, context);
CSS_NODE_PROPERTY_IMPL(CSSPrintFunc, PrintFunc, printFunc, print); CSS_NODE_PROPERTY_IMPL(CSSPrintFunc, PrintFunc, printFunc, print);
CSS_NODE_PROPERTY_IMPL(bool, IsTextnode, isTextNode, isTextNode);
CSS_NODE_PROPERTY_IMPL(bool, HasNewLayout, hasNewLayout, hasNewLayout); CSS_NODE_PROPERTY_IMPL(bool, HasNewLayout, hasNewLayout, hasNewLayout);
CSS_NODE_STYLE_PROPERTY_IMPL(CSSDirection, Direction, direction, direction); CSS_NODE_STYLE_PROPERTY_IMPL(CSSDirection, Direction, direction, direction);
@ -2104,8 +2102,7 @@ static inline bool newMeasureSizeIsStricterAndStillValid(CSSMeasureMode sizeMode
lastSize > size && lastComputedSize <= size; lastSize > size && lastComputedSize <= size;
} }
bool CSSNodeCanUseCachedMeasurement(const bool isTextNode, bool CSSNodeCanUseCachedMeasurement(const CSSMeasureMode widthMode,
const CSSMeasureMode widthMode,
const float width, const float width,
const CSSMeasureMode heightMode, const CSSMeasureMode heightMode,
const float height, const float height,
@ -2134,7 +2131,7 @@ bool CSSNodeCanUseCachedMeasurement(const bool isTextNode,
newMeasureSizeIsStricterAndStillValid( newMeasureSizeIsStricterAndStillValid(
widthMode, width - marginRow, lastWidthMode, lastWidth, lastComputedWidth); widthMode, width - marginRow, lastWidthMode, lastWidth, lastComputedWidth);
const bool heightIsCompatible = isTextNode || hasSameHeightSpec || const bool heightIsCompatible = hasSameHeightSpec ||
newSizeIsExactAndMatchesOldMeasuredSize(heightMode, newSizeIsExactAndMatchesOldMeasuredSize(heightMode,
height - marginColumn, height - marginColumn,
lastComputedHeight) || lastComputedHeight) ||
@ -2203,8 +2200,7 @@ bool layoutNodeInternal(const CSSNodeRef node,
const float marginAxisColumn = getMarginAxis(node, CSSFlexDirectionColumn); const float marginAxisColumn = getMarginAxis(node, CSSFlexDirectionColumn);
// First, try to use the layout cache. // First, try to use the layout cache.
if (CSSNodeCanUseCachedMeasurement(node->isTextNode, if (CSSNodeCanUseCachedMeasurement(widthMeasureMode,
widthMeasureMode,
availableWidth, availableWidth,
heightMeasureMode, heightMeasureMode,
availableHeight, availableHeight,
@ -2220,8 +2216,7 @@ bool layoutNodeInternal(const CSSNodeRef node,
} else { } else {
// Try to use the measurement cache. // Try to use the measurement cache.
for (uint32_t i = 0; i < layout->nextCachedMeasurementsIndex; i++) { for (uint32_t i = 0; i < layout->nextCachedMeasurementsIndex; i++) {
if (CSSNodeCanUseCachedMeasurement(node->isTextNode, if (CSSNodeCanUseCachedMeasurement(widthMeasureMode,
widthMeasureMode,
availableWidth, availableWidth,
heightMeasureMode, heightMeasureMode,
availableHeight, availableHeight,

View File

@ -161,8 +161,7 @@ WIN_EXPORT void CSSNodePrint(const CSSNodeRef node, const CSSPrintOptions option
WIN_EXPORT bool CSSValueIsUndefined(const float value); WIN_EXPORT bool CSSValueIsUndefined(const float value);
WIN_EXPORT bool CSSNodeCanUseCachedMeasurement(const bool isTextNode, WIN_EXPORT bool CSSNodeCanUseCachedMeasurement(const CSSMeasureMode widthMode,
const CSSMeasureMode widthMode,
const float width, const float width,
const CSSMeasureMode heightMode, const CSSMeasureMode heightMode,
const float height, const float height,
@ -195,7 +194,6 @@ WIN_EXPORT bool CSSNodeCanUseCachedMeasurement(const bool isTextNode,
CSS_NODE_PROPERTY(void *, Context, context); CSS_NODE_PROPERTY(void *, Context, context);
CSS_NODE_PROPERTY(CSSMeasureFunc, MeasureFunc, measureFunc); CSS_NODE_PROPERTY(CSSMeasureFunc, MeasureFunc, measureFunc);
CSS_NODE_PROPERTY(CSSPrintFunc, PrintFunc, printFunc); CSS_NODE_PROPERTY(CSSPrintFunc, PrintFunc, printFunc);
CSS_NODE_PROPERTY(bool, IsTextnode, isTextNode);
CSS_NODE_PROPERTY(bool, HasNewLayout, hasNewLayout); CSS_NODE_PROPERTY(bool, HasNewLayout, hasNewLayout);
CSS_NODE_STYLE_PROPERTY(CSSDirection, Direction, direction); CSS_NODE_STYLE_PROPERTY(CSSDirection, Direction, direction);

View File

@ -140,18 +140,6 @@ public class CSSNode implements CSSNodeAPI<CSSNode> {
return mChildren == null ? -1 : mChildren.indexOf(child); return mChildren == null ? -1 : mChildren.indexOf(child);
} }
private native void jni_CSSNodeSetIsTextNode(long nativePointer, boolean isTextNode);
@Override
public void setIsTextNode(boolean isTextNode) {
jni_CSSNodeSetIsTextNode(mNativePointer, isTextNode);
}
private native boolean jni_CSSNodeGetIsTextNode(long nativePointer);
@Override
public boolean isTextNode() {
return jni_CSSNodeGetIsTextNode(mNativePointer);
}
private native void jni_CSSNodeCalculateLayout(long nativePointer); private native void jni_CSSNodeCalculateLayout(long nativePointer);
@Override @Override
public void calculateLayout(CSSLayoutContext layoutContext) { public void calculateLayout(CSSLayoutContext layoutContext) {

View File

@ -31,8 +31,6 @@ public interface CSSNodeAPI<CSSNodeType extends CSSNodeAPI> {
int indexOf(CSSNodeType child); int indexOf(CSSNodeType child);
void setMeasureFunction(MeasureFunction measureFunction); void setMeasureFunction(MeasureFunction measureFunction);
boolean isMeasureDefined(); boolean isMeasureDefined();
void setIsTextNode(boolean isTextNode);
boolean isTextNode();
void calculateLayout(CSSLayoutContext layoutContext); void calculateLayout(CSSLayoutContext layoutContext);
boolean isDirty(); boolean isDirty();
boolean hasNewLayout(); boolean hasNewLayout();

View File

@ -58,7 +58,6 @@ public class CSSNodeDEPRECATED implements CSSNodeAPI<CSSNodeDEPRECATED> {
private @Nullable CSSNodeDEPRECATED mParent; private @Nullable CSSNodeDEPRECATED mParent;
private @Nullable MeasureFunction mMeasureFunction = null; private @Nullable MeasureFunction mMeasureFunction = null;
private LayoutState mLayoutState = LayoutState.DIRTY; private LayoutState mLayoutState = LayoutState.DIRTY;
private boolean mIsTextNode = false;
private Object mData; private Object mData;
@Override @Override
@ -124,16 +123,6 @@ public class CSSNodeDEPRECATED implements CSSNodeAPI<CSSNodeDEPRECATED> {
return mMeasureFunction != null; return mMeasureFunction != null;
} }
@Override
public void setIsTextNode(boolean isTextNode) {
mIsTextNode = isTextNode;
}
@Override
public boolean isTextNode() {
return mIsTextNode;
}
long measure(float width, CSSMeasureMode widthMode, float height, CSSMeasureMode heightMode) { long measure(float width, CSSMeasureMode widthMode, float height, CSSMeasureMode heightMode) {
if (!isMeasureDefined()) { if (!isMeasureDefined()) {
throw new RuntimeException("Measure function isn't defined!"); throw new RuntimeException("Measure function isn't defined!");

View File

@ -240,7 +240,6 @@ public class LayoutEngine {
} }
/*package*/ static boolean canUseCachedMeasurement( /*package*/ static boolean canUseCachedMeasurement(
boolean isTextNode,
float availableWidth, float availableWidth,
float availableHeight, float availableHeight,
float marginRow, float marginRow,
@ -281,38 +280,6 @@ public class LayoutEngine {
return true; return true;
} }
// We know this to be text so we can apply some more specialized heuristics.
if (isTextNode) {
if (isWidthSame) {
if (heightMeasureMode == CSSMeasureMode.UNDEFINED) {
// Width is the same and height is not restricted. Re-use cahced value.
return true;
}
if (heightMeasureMode == CSSMeasureMode.AT_MOST &&
cachedLayout.computedHeight < (availableHeight - marginColumn)) {
// Width is the same and height restriction is greater than the cached height. Re-use cached value.
return true;
}
// Width is the same but height restriction imposes smaller height than previously measured.
// Update the cached value to respect the new height restriction.
cachedLayout.computedHeight = availableHeight - marginColumn;
return true;
}
if (cachedLayout.widthMeasureMode == CSSMeasureMode.UNDEFINED) {
if (widthMeasureMode == CSSMeasureMode.UNDEFINED ||
(widthMeasureMode == CSSMeasureMode.AT_MOST &&
cachedLayout.computedWidth <= (availableWidth - marginRow))) {
// Previsouly this text was measured with no width restriction, if width is now restricted
// but to a larger value than the previsouly measured width we can re-use the measurement
// as we know it will fit.
return true;
}
}
}
return false; return false;
} }
@ -364,13 +331,13 @@ public class LayoutEngine {
node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN]); node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN]);
// First, try to use the layout cache. // First, try to use the layout cache.
if (canUseCachedMeasurement(node.isTextNode(), availableWidth, availableHeight, marginAxisRow, marginAxisColumn, if (canUseCachedMeasurement(availableWidth, availableHeight, marginAxisRow, marginAxisColumn,
widthMeasureMode, heightMeasureMode, layout.cachedLayout)) { widthMeasureMode, heightMeasureMode, layout.cachedLayout)) {
cachedResults = layout.cachedLayout; cachedResults = layout.cachedLayout;
} else { } else {
// Try to use the measurement cache. // Try to use the measurement cache.
for (int i = 0; i < layout.nextCachedMeasurementsIndex; i++) { for (int i = 0; i < layout.nextCachedMeasurementsIndex; i++) {
if (canUseCachedMeasurement(node.isTextNode(), availableWidth, availableHeight, marginAxisRow, marginAxisColumn, if (canUseCachedMeasurement(availableWidth, availableHeight, marginAxisRow, marginAxisColumn,
widthMeasureMode, heightMeasureMode, layout.cachedMeasurements[i])) { widthMeasureMode, heightMeasureMode, layout.cachedMeasurements[i])) {
cachedResults = layout.cachedMeasurements[i]; cachedResults = layout.cachedMeasurements[i];
break; break;