Optimize input matrix handling. Improve get(Parent)TextRoot naming.

Fix doc / comment.
This commit is contained in:
Mikael Sand
2017-07-22 17:13:34 +03:00
parent 1e2fd9b102
commit f4779efe9b
5 changed files with 51 additions and 67 deletions
@@ -55,8 +55,11 @@ class ImageShadowNode extends RenderableShadowNode {
private int mMeetOrSlice; private int mMeetOrSlice;
private final AtomicBoolean mLoading = new AtomicBoolean(false); private final AtomicBoolean mLoading = new AtomicBoolean(false);
private static final float[] sMatrixData = new float[9]; private static final float[] sRawMatrix = new float[]{
private static final float[] sRawMatrix = new float[9]; 1, 0, 0,
0, 1, 0,
0, 0, 1
};
private Matrix mMatrix = new Matrix(); private Matrix mMatrix = new Matrix();
@ReactProp(name = "x") @ReactProp(name = "x")
@@ -118,17 +121,8 @@ class ImageShadowNode extends RenderableShadowNode {
@ReactProp(name = "matrix") @ReactProp(name = "matrix")
public void setMatrix(@Nullable ReadableArray matrixArray) { public void setMatrix(@Nullable ReadableArray matrixArray) {
if (matrixArray != null) { if (matrixArray != null) {
int matrixSize = PropHelper.toMatrixData(matrixArray, sMatrixData); int matrixSize = PropHelper.toMatrixData(matrixArray, sRawMatrix, mScale);
if (matrixSize == 6) { if (matrixSize == 6) {
sRawMatrix[0] = sMatrixData[0];
sRawMatrix[1] = sMatrixData[2];
sRawMatrix[2] = sMatrixData[4] * mScale;
sRawMatrix[3] = sMatrixData[1];
sRawMatrix[4] = sMatrixData[3];
sRawMatrix[5] = sMatrixData[5] * mScale;
sRawMatrix[6] = 0;
sRawMatrix[7] = 0;
sRawMatrix[8] = 1;
mMatrix.setValues(sRawMatrix); mMatrix.setValues(sRawMatrix);
} else if (matrixSize != -1) { } else if (matrixSize != -1) {
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6"); FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");
@@ -32,8 +32,11 @@ class LinearGradientShadowNode extends DefinitionShadowNode {
private ReadableArray mGradient; private ReadableArray mGradient;
private Brush.BrushUnits mGradientUnits; private Brush.BrushUnits mGradientUnits;
private static final float[] sMatrixData = new float[9]; private static final float[] sRawMatrix = new float[]{
private static final float[] sRawMatrix = new float[9]; 1, 0, 0,
0, 1, 0,
0, 0, 1
};
private Matrix mMatrix = new Matrix(); private Matrix mMatrix = new Matrix();
@ReactProp(name = "x1") @ReactProp(name = "x1")
@@ -82,17 +85,8 @@ class LinearGradientShadowNode extends DefinitionShadowNode {
@ReactProp(name = "gradientTransform") @ReactProp(name = "gradientTransform")
public void setGradientTransform(@Nullable ReadableArray matrixArray) { public void setGradientTransform(@Nullable ReadableArray matrixArray) {
if (matrixArray != null) { if (matrixArray != null) {
int matrixSize = PropHelper.toMatrixData(matrixArray, sMatrixData); int matrixSize = PropHelper.toMatrixData(matrixArray, sRawMatrix, mScale);
if (matrixSize == 6) { if (matrixSize == 6) {
sRawMatrix[0] = sMatrixData[0];
sRawMatrix[1] = sMatrixData[2];
sRawMatrix[2] = sMatrixData[4] * mScale;
sRawMatrix[3] = sMatrixData[1];
sRawMatrix[4] = sMatrixData[3];
sRawMatrix[5] = sMatrixData[5] * mScale;
sRawMatrix[6] = 0;
sRawMatrix[7] = 0;
sRawMatrix[8] = 1;
mMatrix.setValues(sRawMatrix); mMatrix.setValues(sRawMatrix);
} else if (matrixSize != -1) { } else if (matrixSize != -1) {
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6"); FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");
@@ -48,27 +48,35 @@ class PropHelper {
return null; return null;
} }
private static final int transformInputMatrixSize = 6; private static final int inputMatrixDataSize = 6;
/** /**
* Converts given {@link ReadableArray} to an array of {@code float}. Writes result to the array * Converts given {@link ReadableArray} to a matrix data array, {@code float[6]}.
* passed in {@param into}. This method will write to the output array up to the number of items * Writes result to the array passed in {@param into}.
* from the input array. If the input array is longer than output the remaining part of the input * This method will write exactly six items to the output array from the input array.
* will not be converted. *
* If the input array has a different size, then only the size is returned;
* Does not check output array size. Ensure space for at least six elements.
* *
* @param value input array * @param value input array
* @param into output array * @param sRawMatrix output matrix
* @return number of items copied from input to the output array * @param mScale current resolution scaling
* @return size of input array
*/ */
static int toMatrixData(ReadableArray value, float[] into) { static int toMatrixData(ReadableArray value, float[] sRawMatrix, float mScale) {
int fromSize = value.size(); int fromSize = value.size();
if (fromSize != transformInputMatrixSize) { if (fromSize != inputMatrixDataSize) {
return fromSize; return fromSize;
} }
for (int i = 0; i < transformInputMatrixSize; i++) {
into[i] = (float) value.getDouble(i); sRawMatrix[0] = (float) value.getDouble(0);
} sRawMatrix[1] = (float) value.getDouble(2);
return transformInputMatrixSize; sRawMatrix[2] = (float) value.getDouble(4) * mScale;
sRawMatrix[3] = (float) value.getDouble(1);
sRawMatrix[4] = (float) value.getDouble(3);
sRawMatrix[5] = (float) value.getDouble(5) * mScale;
return inputMatrixDataSize;
} }
static private final Pattern percentageRegExp = Pattern.compile("^(-?\\d+(?:\\.\\d+)?)%$"); static private final Pattern percentageRegExp = Pattern.compile("^(-?\\d+(?:\\.\\d+)?)%$");
@@ -33,8 +33,11 @@ class RadialGradientShadowNode extends DefinitionShadowNode {
private ReadableArray mGradient; private ReadableArray mGradient;
private Brush.BrushUnits mGradientUnits; private Brush.BrushUnits mGradientUnits;
private static final float[] sMatrixData = new float[9]; private static final float[] sRawMatrix = new float[]{
private static final float[] sRawMatrix = new float[9]; 1, 0, 0,
0, 1, 0,
0, 0, 1
};
private Matrix mMatrix = new Matrix(); private Matrix mMatrix = new Matrix();
@ReactProp(name = "fx") @ReactProp(name = "fx")
@@ -95,17 +98,8 @@ class RadialGradientShadowNode extends DefinitionShadowNode {
@ReactProp(name = "gradientTransform") @ReactProp(name = "gradientTransform")
public void setGradientTransform(@Nullable ReadableArray matrixArray) { public void setGradientTransform(@Nullable ReadableArray matrixArray) {
if (matrixArray != null) { if (matrixArray != null) {
int matrixSize = PropHelper.toMatrixData(matrixArray, sMatrixData); int matrixSize = PropHelper.toMatrixData(matrixArray, sRawMatrix, mScale);
if (matrixSize == 6) { if (matrixSize == 6) {
sRawMatrix[0] = sMatrixData[0];
sRawMatrix[1] = sMatrixData[2];
sRawMatrix[2] = sMatrixData[4] * mScale;
sRawMatrix[3] = sMatrixData[1];
sRawMatrix[4] = sMatrixData[3];
sRawMatrix[5] = sMatrixData[5] * mScale;
sRawMatrix[6] = 0;
sRawMatrix[7] = 0;
sRawMatrix[8] = 1;
mMatrix.setValues(sRawMatrix); mMatrix.setValues(sRawMatrix);
} else if (matrixSize != -1) { } else if (matrixSize != -1) {
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6"); FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");
@@ -38,8 +38,11 @@ abstract class VirtualNode extends LayoutShadowNode {
static final float MIN_OPACITY_FOR_DRAW = 0.01f; static final float MIN_OPACITY_FOR_DRAW = 0.01f;
private static final float[] sMatrixData = new float[9]; private static final float[] sRawMatrix = new float[]{
private static final float[] sRawMatrix = new float[9]; 1, 0, 0,
0, 1, 0,
0, 0, 1
};
float mOpacity = 1f; float mOpacity = 1f;
private double mFontSize = -1; private double mFontSize = -1;
private double mParentFontSize = -1; private double mParentFontSize = -1;
@@ -72,23 +75,23 @@ abstract class VirtualNode extends LayoutShadowNode {
} }
GroupShadowNode getTextRoot() { GroupShadowNode getTextRoot() {
GroupShadowNode shadowNode = getShadowNode(GroupShadowNode.class); GroupShadowNode shadowNode = getTextRoot(GroupShadowNode.class);
if (shadowNode == null) { if (shadowNode == null) {
return getShadowNode(TextShadowNode.class); return getTextRoot(TextShadowNode.class);
} }
return shadowNode; return shadowNode;
} }
private GroupShadowNode getParentTextRoot() { private GroupShadowNode getParentTextRoot() {
GroupShadowNode shadowNode = getParentShadowNode(GroupShadowNode.class); GroupShadowNode shadowNode = getParentTextRoot(GroupShadowNode.class);
if (shadowNode == null) { if (shadowNode == null) {
return getParentShadowNode(TextShadowNode.class); return getParentTextRoot(TextShadowNode.class);
} }
return shadowNode; return shadowNode;
} }
@android.support.annotation.Nullable @android.support.annotation.Nullable
private GroupShadowNode getParentShadowNode(Class shadowNodeClass) { private GroupShadowNode getParentTextRoot(Class shadowNodeClass) {
ReactShadowNode node = this.getParent(); ReactShadowNode node = this.getParent();
if (mParentTextRoot == null) { if (mParentTextRoot == null) {
while (node != null) { while (node != null) {
@@ -111,7 +114,7 @@ abstract class VirtualNode extends LayoutShadowNode {
} }
@android.support.annotation.Nullable @android.support.annotation.Nullable
private GroupShadowNode getShadowNode(Class shadowNodeClass) { private GroupShadowNode getTextRoot(Class shadowNodeClass) {
VirtualNode node = this; VirtualNode node = this;
if (mTextRoot == null) { if (mTextRoot == null) {
while (node != null) { while (node != null) {
@@ -214,17 +217,8 @@ abstract class VirtualNode extends LayoutShadowNode {
@ReactProp(name = "matrix") @ReactProp(name = "matrix")
public void setMatrix(@Nullable ReadableArray matrixArray) { public void setMatrix(@Nullable ReadableArray matrixArray) {
if (matrixArray != null) { if (matrixArray != null) {
int matrixSize = PropHelper.toMatrixData(matrixArray, sMatrixData); int matrixSize = PropHelper.toMatrixData(matrixArray, sRawMatrix, mScale);
if (matrixSize == 6) { if (matrixSize == 6) {
sRawMatrix[0] = sMatrixData[0];
sRawMatrix[1] = sMatrixData[2];
sRawMatrix[2] = sMatrixData[4] * mScale;
sRawMatrix[3] = sMatrixData[1];
sRawMatrix[4] = sMatrixData[3];
sRawMatrix[5] = sMatrixData[5] * mScale;
sRawMatrix[6] = 0;
sRawMatrix[7] = 0;
sRawMatrix[8] = 1;
mMatrix.setValues(sRawMatrix); mMatrix.setValues(sRawMatrix);
} else if (matrixSize != -1) { } else if (matrixSize != -1) {
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6"); FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");