|
7 | 7 |
|
8 | 8 | package com.facebook.react.uimanager; |
9 | 9 |
|
| 10 | +import android.graphics.Matrix; |
| 11 | + |
10 | 12 | import com.facebook.common.logging.FLog; |
11 | 13 | import com.facebook.react.bridge.ReadableArray; |
12 | 14 | import com.facebook.react.bridge.ReadableMap; |
@@ -107,4 +109,87 @@ public static void processTransform(ReadableArray transforms, double[] result) { |
107 | 109 | MatrixMathHelper.multiplyInto(result, result, helperMatrix); |
108 | 110 | } |
109 | 111 | } |
| 112 | + |
| 113 | + |
| 114 | + private static double convertToDegrees(ReadableMap transformMap, String key) { |
| 115 | + double value; |
| 116 | + boolean inRadians = true; |
| 117 | + if (transformMap.getType(key) == ReadableType.String) { |
| 118 | + String stringValue = transformMap.getString(key); |
| 119 | + if (stringValue.endsWith("deg")) { |
| 120 | + inRadians = false; |
| 121 | + } |
| 122 | + if (stringValue.endsWith("rad") || stringValue.endsWith("deg")) { |
| 123 | + stringValue = stringValue.substring(0, stringValue.length() - 3); |
| 124 | + } |
| 125 | + value = Float.parseFloat(stringValue); |
| 126 | + } else { |
| 127 | + value = transformMap.getDouble(key); |
| 128 | + } |
| 129 | + return inRadians ? MatrixMathHelper.radiansToDegrees(value) : value; |
| 130 | + } |
| 131 | + |
| 132 | + |
| 133 | + public static boolean tryProcessTransformBySkiaMatrix(ReadableArray transforms, Matrix matrix, |
| 134 | + int viewWidth, int viewHeight) { |
| 135 | + assert matrix != null; |
| 136 | + matrix.reset(); |
| 137 | + // center of view. |
| 138 | + int originX = viewWidth / 2, originY = viewHeight / 2; |
| 139 | + |
| 140 | + for (int transformIdx = 0, size = transforms.size(); transformIdx < size; transformIdx++) { |
| 141 | + ReadableMap transform = transforms.getMap(transformIdx); |
| 142 | + String transformType = transform.keySetIterator().nextKey(); |
| 143 | + |
| 144 | + if ("translate".equals(transformType)) { |
| 145 | + ReadableArray value = transform.getArray(transformType); |
| 146 | + double x = value.getDouble(0); |
| 147 | + double y = value.getDouble(1); |
| 148 | + double z = value.size() > 2 ? value.getDouble(2) : 0d; |
| 149 | + // Not support translate in z axis. |
| 150 | + if (z != 0) { |
| 151 | + return false; |
| 152 | + } |
| 153 | + originX += x; |
| 154 | + originY += y; |
| 155 | + matrix.postTranslate(PixelUtil.toPixelFromDIP((float) x), PixelUtil.toPixelFromDIP((float) y)); |
| 156 | + } else if ("translateX".equals(transformType)) { |
| 157 | + double x = transform.getDouble(transformType); |
| 158 | + originX += x; |
| 159 | + matrix.postTranslate(PixelUtil.toPixelFromDIP(x), 0); |
| 160 | + } else if ("translateY".equals(transformType)) { |
| 161 | + double y = transform.getDouble(transformType); |
| 162 | + originY += y; |
| 163 | + matrix.postTranslate(0, PixelUtil.toPixelFromDIP(y)); |
| 164 | + } |
| 165 | + } |
| 166 | + |
| 167 | + for (int transformIdx = 0, size = transforms.size(); transformIdx < size; transformIdx++) { |
| 168 | + ReadableMap transform = transforms.getMap(transformIdx); |
| 169 | + String transformType = transform.keySetIterator().nextKey(); |
| 170 | + |
| 171 | + if ("rotate".equals(transformType) || "rotateZ".equals(transformType)) { |
| 172 | + matrix.postRotate((float) convertToDegrees(transform, transformType), originX, originY); |
| 173 | + } else if ("scale".equals(transformType)) { |
| 174 | + float scale = (float)transform.getDouble(transformType); |
| 175 | + matrix.postScale(scale, scale, originX, originY); |
| 176 | + } else if ("scaleX".equals(transformType)) { |
| 177 | + matrix.postScale((float)transform.getDouble(transformType), 1, originX, originY); |
| 178 | + } else if ("scaleY".equals(transformType)) { |
| 179 | + matrix.postScale(1, (float)transform.getDouble(transformType), originX, originY); |
| 180 | + } else if ("translate".equals(transformType) || "translateX".equals(transformType) |
| 181 | + || "translateY".equals(transformType)) { |
| 182 | + // translate has been processed. |
| 183 | + } else if ("skewX".equals(transformType)) { |
| 184 | + matrix.postSkew((float) convertToRadians(transform, transformType), 0); |
| 185 | + } else if ("skewY".equals(transformType)) { |
| 186 | + matrix.postSkew(0, (float) convertToRadians(transform, transformType)); |
| 187 | + } else { |
| 188 | + // matrix, perspective rotateX rotateY |
| 189 | + return false; |
| 190 | + } |
| 191 | + } |
| 192 | + return true; |
| 193 | + } |
| 194 | + |
110 | 195 | } |
0 commit comments