From 49c95f5a302d8b8ab5482a1cbf99ce3ce4f79593 Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Thu, 8 Jun 2017 17:52:47 +0300 Subject: [PATCH] Implement transform matrix property for ImageShadowNode Add conditional translation.preConcat(mMatrix) statement --- .../java/com/horcrux/svg/ImageShadowNode.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/android/src/main/java/com/horcrux/svg/ImageShadowNode.java b/android/src/main/java/com/horcrux/svg/ImageShadowNode.java index 14b470b7..395edfc5 100644 --- a/android/src/main/java/com/horcrux/svg/ImageShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/ImageShadowNode.java @@ -38,6 +38,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import com.facebook.react.bridge.ReadableArray; + /** * Shadow node for virtual Image view */ @@ -53,6 +55,10 @@ public class ImageShadowNode extends RenderableShadowNode { private int mMeetOrSlice; private AtomicBoolean mLoading = new AtomicBoolean(false); + private static final float[] sMatrixData = new float[9]; + private static final float[] sRawMatrix = new float[9]; + protected Matrix mMatrix = new Matrix(); + @ReactProp(name = "x") public void setX(String x) { mX = x; @@ -109,6 +115,32 @@ public class ImageShadowNode extends RenderableShadowNode { markUpdated(); } + @ReactProp(name = "matrix") + public void setMatrix(@Nullable ReadableArray matrixArray) { + if (matrixArray != null) { + int matrixSize = PropHelper.toFloatArray(matrixArray, sMatrixData); + 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); + } else if (matrixSize != -1) { + FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6"); + } + } else { + mMatrix = null; + } + + markUpdated(); + } + + @Override public void draw(final Canvas canvas, final Paint paint, final float opacity) { if (!mLoading.get()) { @@ -187,6 +219,9 @@ public class ImageShadowNode extends RenderableShadowNode { transform.mapRect(renderRect); Matrix translation = new Matrix(); translation.postTranslate(rectX, rectY); + if (mMatrix != null) { + translation.preConcat(mMatrix); + } translation.mapRect(renderRect); Path clip = new Path();