1 package org.robolectric.shadows; 2 3 import static com.google.common.truth.Truth.assertThat; 4 5 import android.graphics.Matrix; 6 import android.graphics.PointF; 7 import android.graphics.RectF; 8 import androidx.test.ext.junit.runners.AndroidJUnit4; 9 import org.junit.Test; 10 import org.junit.runner.RunWith; 11 import org.robolectric.shadow.api.Shadow; 12 13 @RunWith(AndroidJUnit4.class) 14 public class ShadowMatrixTest { 15 private static final float EPSILON = 1e-7f; 16 17 @Test preOperationsAreStacked()18 public void preOperationsAreStacked() { 19 Matrix m = new Matrix(); 20 m.preRotate(4, 8, 15); 21 m.preTranslate(16, 23); 22 m.preSkew(42, 108); 23 24 assertThat(((ShadowMatrix) Shadow.extract(m)).getPreOperations()) 25 .containsExactly("skew 42.0 108.0", "translate 16.0 23.0", "rotate 4.0 8.0 15.0"); 26 } 27 28 @Test postOperationsAreQueued()29 public void postOperationsAreQueued() { 30 Matrix m = new Matrix(); 31 m.postRotate(4, 8, 15); 32 m.postTranslate(16, 23); 33 m.postSkew(42, 108); 34 35 assertThat(((ShadowMatrix) Shadow.extract(m)).getPostOperations()) 36 .containsExactly("rotate 4.0 8.0 15.0", "translate 16.0 23.0", "skew 42.0 108.0"); 37 } 38 39 @Test setOperationsOverride()40 public void setOperationsOverride() { 41 Matrix m = new Matrix(); 42 m.setRotate(4); 43 m.setRotate(8); 44 m.setRotate(15); 45 m.setRotate(16); 46 m.setRotate(23); 47 m.setRotate(42); 48 m.setRotate(108); 49 50 assertThat(((ShadowMatrix) Shadow.extract(m)).getSetOperations()) 51 .containsEntry("rotate", "108.0"); 52 } 53 54 @Test set_shouldAddOpsToMatrix()55 public void set_shouldAddOpsToMatrix() { 56 final Matrix matrix = new Matrix(); 57 matrix.setScale(1, 1); 58 matrix.preScale(2, 2, 2, 2); 59 matrix.postScale(3, 3, 3, 3); 60 61 final ShadowMatrix shadow = Shadow.extract(matrix); 62 assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 1.0"); 63 assertThat(shadow.getPreOperations().get(0)).isEqualTo("scale 2.0 2.0 2.0 2.0"); 64 assertThat(shadow.getPostOperations().get(0)).isEqualTo("scale 3.0 3.0 3.0 3.0"); 65 } 66 67 @Test setScale_shouldAddOpsToMatrix()68 public void setScale_shouldAddOpsToMatrix() { 69 final Matrix matrix = new Matrix(); 70 matrix.setScale(1, 2, 3, 4); 71 72 final ShadowMatrix shadow = Shadow.extract(matrix); 73 assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 2.0 3.0 4.0"); 74 } 75 76 @Test set_shouldOverrideValues()77 public void set_shouldOverrideValues() { 78 final Matrix matrix1 = new Matrix(); 79 matrix1.setScale(1, 2); 80 81 final Matrix matrix2 = new Matrix(); 82 matrix2.setScale(3, 4); 83 matrix2.set(matrix1); 84 85 final ShadowMatrix shadow = Shadow.extract(matrix2); 86 assertThat(shadow.getSetOperations().get("scale")).isEqualTo("1.0 2.0"); 87 } 88 89 @Test set_whenNull_shouldReset()90 public void set_whenNull_shouldReset() { 91 final Matrix matrix1 = new Matrix(); 92 matrix1.setScale(1, 2); 93 94 final Matrix matrix2 = new Matrix(); 95 matrix2.set(matrix1); 96 matrix2.set(null); 97 98 final ShadowMatrix shadow = Shadow.extract(matrix2); 99 assertThat(shadow.getSetOperations()).isEmpty(); 100 } 101 102 @Test testIsIdentity()103 public void testIsIdentity() { 104 final Matrix matrix = new Matrix(); 105 assertThat(matrix.isIdentity()).isTrue(); 106 107 matrix.postScale(2.0f, 2.0f); 108 assertThat(matrix.isIdentity()).isFalse(); 109 } 110 111 @Test testIsAffine()112 public void testIsAffine() { 113 final Matrix matrix = new Matrix(); 114 assertThat(matrix.isAffine()).isTrue(); 115 116 matrix.postScale(2.0f, 2.0f); 117 assertThat(matrix.isAffine()).isTrue(); 118 matrix.postTranslate(1.0f, 2.0f); 119 assertThat(matrix.isAffine()).isTrue(); 120 matrix.postRotate(45.0f); 121 assertThat(matrix.isAffine()).isTrue(); 122 123 matrix.setValues(new float[] {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 2.0f}); 124 assertThat(matrix.isAffine()).isFalse(); 125 } 126 127 @Test testRectStaysRect()128 public void testRectStaysRect() { 129 final Matrix matrix = new Matrix(); 130 assertThat(matrix.rectStaysRect()).isTrue(); 131 132 matrix.postScale(2.0f, 2.0f); 133 assertThat(matrix.rectStaysRect()).isTrue(); 134 matrix.postTranslate(1.0f, 2.0f); 135 assertThat(matrix.rectStaysRect()).isTrue(); 136 matrix.postRotate(45.0f); 137 assertThat(matrix.rectStaysRect()).isFalse(); 138 matrix.postRotate(45.0f); 139 assertThat(matrix.rectStaysRect()).isTrue(); 140 } 141 142 @Test testGetSetValues()143 public void testGetSetValues() { 144 final Matrix matrix = new Matrix(); 145 final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f}; 146 matrix.setValues(values); 147 final float[] matrixValues = new float[9]; 148 matrix.getValues(matrixValues); 149 assertThat(matrixValues).isEqualTo(values); 150 } 151 152 @Test testGetSetValues_withLargeArray()153 public void testGetSetValues_withLargeArray() { 154 final Matrix matrix = new Matrix(); 155 final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f}; 156 matrix.setValues(values); 157 final float[] matrixValues = new float[10]; 158 matrix.getValues(matrixValues); 159 // First 9 elements should match. 160 for (int i = 0; i < 9; i++) { 161 assertThat(matrixValues[i]).isEqualTo(values[i]); 162 } 163 // The last element should not have been set. 164 assertThat(matrixValues[9]).isEqualTo(0); 165 } 166 167 @Test(expected = ArrayIndexOutOfBoundsException.class) testGetValues_withSmallArray()168 public void testGetValues_withSmallArray() { 169 final Matrix matrix = new Matrix(); 170 final float[] matrixValues = new float[8]; 171 matrix.getValues(matrixValues); 172 } 173 174 @Test(expected = ArrayIndexOutOfBoundsException.class) testSetValues_withSmallArray()175 public void testSetValues_withSmallArray() { 176 final Matrix matrix = new Matrix(); 177 final float[] values = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f}; 178 matrix.setValues(values); 179 } 180 181 @Test testSet()182 public void testSet() { 183 final Matrix matrix1 = new Matrix(); 184 matrix1.postScale(2.0f, 2.0f); 185 matrix1.postTranslate(1.0f, 2.0f); 186 matrix1.postRotate(45.0f); 187 188 final Matrix matrix2 = new Matrix(); 189 matrix2.set(matrix1); 190 assertThat(matrix1).isEqualTo(matrix2); 191 192 matrix2.set(null); 193 assertThat(matrix2.isIdentity()).isTrue(); 194 } 195 196 @Test testReset()197 public void testReset() { 198 final Matrix matrix = new Matrix(); 199 matrix.postScale(2.0f, 2.0f); 200 matrix.postTranslate(1.0f, 2.0f); 201 matrix.postRotate(45.0f); 202 matrix.reset(); 203 assertThat(matrix.isIdentity()).isTrue(); 204 } 205 206 @Test testSetTranslate()207 public void testSetTranslate() { 208 final Matrix matrix = new Matrix(); 209 matrix.setTranslate(2.0f, 2.0f); 210 assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(3.0f, 3.0f)); 211 matrix.setTranslate(-2.0f, -2.0f); 212 assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(-1.0f, -1.0f)); 213 } 214 215 @Test testPostTranslate()216 public void testPostTranslate() { 217 final Matrix matrix1 = new Matrix(); 218 matrix1.postTranslate(1.0f, 1.0f); 219 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f)); 220 221 matrix1.postTranslate(2.0f, 2.0f); 222 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f)); 223 224 final Matrix matrix2 = new Matrix(); 225 matrix2.setScale(2.0f, 2.0f); 226 matrix2.postTranslate(-5.0f, 10.0f); 227 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(-3.0f, 12.0f)); 228 } 229 230 @Test testPreTranslate()231 public void testPreTranslate() { 232 final Matrix matrix1 = new Matrix(); 233 matrix1.preTranslate(1.0f, 1.0f); 234 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f)); 235 236 matrix1.preTranslate(2.0f, 2.0f); 237 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f)); 238 239 final Matrix matrix2 = new Matrix(); 240 matrix2.setScale(2.0f, 2.0f); 241 matrix2.preTranslate(-5.0f, 10.0f); 242 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(-8.0f, 22.0f)); 243 } 244 245 @Test testSetScale()246 public void testSetScale() { 247 final Matrix matrix = new Matrix(); 248 matrix.setScale(2.0f, 2.0f); 249 assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(2.0f, 2.0f)); 250 matrix.setScale(-2.0f, -3.0f); 251 assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-4.0f, -9.0f)); 252 matrix.setScale(-2.0f, -3.0f, 1.0f, 1.0f); 253 assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-1.0f, -5.0f)); 254 } 255 256 @Test testPostScale()257 public void testPostScale() { 258 final Matrix matrix1 = new Matrix(); 259 matrix1.postScale(2.0f, 2.0f); 260 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f)); 261 262 matrix1.postScale(2.0f, 2.0f); 263 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f)); 264 265 final Matrix matrix2 = new Matrix(); 266 matrix2.postScale(2.0f, 2.0f, 1.0f, 1.0f); 267 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f)); 268 269 matrix2.setTranslate(1.0f, 2.0f); 270 matrix2.postScale(2.0f, 2.0f, 1.0f, 1.0f); 271 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(3.0f, 5.0f)); 272 } 273 274 @Test testPreScale()275 public void testPreScale() { 276 final Matrix matrix1 = new Matrix(); 277 matrix1.preScale(2.0f, 2.0f); 278 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(2.0f, 2.0f)); 279 280 matrix1.preScale(2.0f, 2.0f); 281 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(4.0f, 4.0f)); 282 283 final Matrix matrix2 = new Matrix(); 284 matrix2.preScale(2.0f, 2.0f, 1.0f, 1.0f); 285 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f)); 286 287 matrix2.setTranslate(1.0f, 2.0f); 288 matrix2.preScale(2.0f, 2.0f, 1.0f, 1.0f); 289 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(2.0f, 3.0f)); 290 } 291 292 @Test testSetRotate()293 public void testSetRotate() { 294 final Matrix matrix = new Matrix(); 295 matrix.setRotate(90.0f); 296 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f)); 297 matrix.setRotate(180.0f); 298 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f)); 299 matrix.setRotate(270.0f); 300 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f)); 301 matrix.setRotate(360.0f); 302 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 303 304 matrix.setRotate(45.0f, 0.0f, 1.0f); 305 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 306 } 307 308 @Test testPostRotate()309 public void testPostRotate() { 310 final Matrix matrix = new Matrix(); 311 matrix.postRotate(90.0f); 312 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f)); 313 matrix.postRotate(90.0f); 314 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f)); 315 matrix.postRotate(90.0f); 316 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f)); 317 matrix.postRotate(90.0f); 318 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 319 320 matrix.setTranslate(1.0f, 2.0f); 321 matrix.postRotate(45.0f, 0.0f, 1.0f); 322 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-0.70710677f, 3.1213202f)); 323 } 324 325 @Test testPreRotate()326 public void testPreRotate() { 327 final Matrix matrix = new Matrix(); 328 matrix.preRotate(90.0f); 329 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f)); 330 matrix.preRotate(90.0f); 331 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f)); 332 matrix.preRotate(90.0f); 333 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f)); 334 matrix.preRotate(90.0f); 335 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 336 337 matrix.setTranslate(1.0f, 2.0f); 338 matrix.preRotate(45.0f, 0.0f, 1.0f); 339 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 3.0f)); 340 } 341 342 @Test testSetSinCos()343 public void testSetSinCos() { 344 final Matrix matrix = new Matrix(); 345 matrix.setSinCos(1.0f, 0.0f); 346 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(-1.0f, 0.0f)); 347 matrix.setSinCos(0.0f, -1.0f); 348 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, -1.0f)); 349 matrix.setSinCos(-1.0f, 0.0f); 350 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(1.0f, 0.0f)); 351 matrix.setSinCos(0.0f, 1.0f); 352 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 353 354 final float sinCos = (float) Math.sqrt(2) / 2; 355 matrix.setSinCos(sinCos, sinCos, 0.0f, 1.0f); 356 assertPointsEqual(mapPoint(matrix, 0.0f, 1.0f), new PointF(0.0f, 1.0f)); 357 } 358 359 @Test testSetSkew()360 public void testSetSkew() { 361 final Matrix matrix = new Matrix(); 362 matrix.setSkew(2.0f, 2.0f); 363 assertPointsEqual(mapPoint(matrix, 1.0f, 1.0f), new PointF(3.0f, 3.0f)); 364 matrix.setSkew(-2.0f, -3.0f); 365 assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-4.0f, -3.0f)); 366 matrix.setSkew(-2.0f, -3.0f, 1.0f, 1.0f); 367 assertPointsEqual(mapPoint(matrix, 2.0f, 3.0f), new PointF(-2.0f, 0.0f)); 368 } 369 370 @Test testPostSkew()371 public void testPostSkew() { 372 final Matrix matrix1 = new Matrix(); 373 matrix1.postSkew(2.0f, 2.0f); 374 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(3.0f, 3.0f)); 375 376 matrix1.postSkew(2.0f, 2.0f); 377 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(9.0f, 9.0f)); 378 379 final Matrix matrix2 = new Matrix(); 380 matrix2.postSkew(2.0f, 2.0f, 1.0f, 1.0f); 381 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f)); 382 383 matrix2.setTranslate(1.0f, 2.0f); 384 matrix2.postSkew(2.0f, 2.0f, 1.0f, 1.0f); 385 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(6.0f, 5.0f)); 386 } 387 388 @Test testPreSkew()389 public void testPreSkew() { 390 final Matrix matrix1 = new Matrix(); 391 matrix1.preSkew(2.0f, 2.0f); 392 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(3.0f, 3.0f)); 393 394 matrix1.preSkew(2.0f, 2.0f); 395 assertPointsEqual(mapPoint(matrix1, 1.0f, 1.0f), new PointF(9.0f, 9.0f)); 396 397 final Matrix matrix2 = new Matrix(); 398 matrix2.preSkew(2.0f, 2.0f, 1.0f, 1.0f); 399 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(1.0f, 1.0f)); 400 401 matrix2.setTranslate(1.0f, 2.0f); 402 matrix2.preSkew(2.0f, 2.0f, 1.0f, 1.0f); 403 assertPointsEqual(mapPoint(matrix2, 1.0f, 1.0f), new PointF(2.0f, 3.0f)); 404 } 405 406 @Test testSetConcat()407 public void testSetConcat() { 408 final Matrix scaleMatrix = new Matrix(); 409 scaleMatrix.setScale(2.0f, 3.0f); 410 final Matrix translateMatrix = new Matrix(); 411 translateMatrix.postTranslate(5.0f, 7.0f); 412 final Matrix matrix = new Matrix(); 413 matrix.setConcat(translateMatrix, scaleMatrix); 414 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(9.0f, 13.0f)); 415 416 final Matrix rotateMatrix = new Matrix(); 417 rotateMatrix.postRotate(90.0f); 418 matrix.setConcat(rotateMatrix, matrix); 419 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(-13.0f, 9.0f)); 420 } 421 422 @Test testPostConcat()423 public void testPostConcat() { 424 final Matrix matrix = new Matrix(); 425 matrix.postScale(2.0f, 3.0f); 426 final Matrix translateMatrix = new Matrix(); 427 translateMatrix.postTranslate(5.0f, 7.0f); 428 matrix.postConcat(translateMatrix); 429 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(9.0f, 13.0f)); 430 431 final Matrix rotateMatrix = new Matrix(); 432 rotateMatrix.postRotate(90.0f); 433 matrix.postConcat(rotateMatrix); 434 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(-13.0f, 9.0f)); 435 } 436 437 @Test testPreConcat()438 public void testPreConcat() { 439 final Matrix matrix = new Matrix(); 440 matrix.preScale(2.0f, 3.0f); 441 final Matrix translateMatrix = new Matrix(); 442 translateMatrix.setTranslate(5.0f, 7.0f); 443 matrix.preConcat(translateMatrix); 444 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(14.0f, 27.0f)); 445 446 final Matrix rotateMatrix = new Matrix(); 447 rotateMatrix.setRotate(90.0f); 448 matrix.preConcat(rotateMatrix); 449 assertPointsEqual(mapPoint(matrix, 2.0f, 2.0f), new PointF(6.0f, 27.0f)); 450 } 451 452 @Test testInvert()453 public void testInvert() { 454 final Matrix matrix = new Matrix(); 455 final Matrix inverse = new Matrix(); 456 matrix.setScale(0.0f, 1.0f); 457 assertThat(matrix.invert(inverse)).isFalse(); 458 matrix.setScale(1.0f, 0.0f); 459 assertThat(matrix.invert(inverse)).isFalse(); 460 461 matrix.setScale(1.0f, 1.0f); 462 checkInverse(matrix); 463 matrix.setScale(-3.0f, 5.0f); 464 checkInverse(matrix); 465 matrix.setTranslate(5.0f, 2.0f); 466 checkInverse(matrix); 467 matrix.setScale(-3.0f, 5.0f); 468 matrix.postTranslate(5.0f, 2.0f); 469 checkInverse(matrix); 470 matrix.setScale(-3.0f, 5.0f); 471 matrix.postRotate(-30f, 1.0f, 2.0f); 472 matrix.postTranslate(5.0f, 2.0f); 473 checkInverse(matrix); 474 } 475 476 @Test testMapRect()477 public void testMapRect() { 478 final Matrix matrix = new Matrix(); 479 matrix.postScale(2.0f, 3.0f); 480 final RectF input = new RectF(1.0f, 1.0f, 2.0f, 2.0f); 481 final RectF output1 = new RectF(); 482 matrix.mapRect(output1, input); 483 assertThat(output1).isEqualTo(new RectF(2.0f, 3.0f, 4.0f, 6.0f)); 484 485 matrix.postScale(-1.0f, -1.0f); 486 final RectF output2 = new RectF(); 487 matrix.mapRect(output2, input); 488 assertThat(output2).isEqualTo(new RectF(-4.0f, -6.0f, -2.0f, -3.0f)); 489 } 490 491 @Test testMapPoints()492 public void testMapPoints() { 493 final Matrix matrix = new Matrix(); 494 matrix.postTranslate(-1.0f, -2.0f); 495 matrix.postScale(2.0f, 3.0f); 496 final float[] input = { 497 0.0f, 0.0f, 498 1.0f, 2.0f 499 }; 500 final float[] output = new float[input.length]; 501 matrix.mapPoints(output, input); 502 assertThat(output).usingExactEquality().containsExactly(-2.0f, -6.0f, 0.0f, 0.0f); 503 } 504 505 @Test testMapVectors()506 public void testMapVectors() { 507 final Matrix matrix = new Matrix(); 508 matrix.postTranslate(-1.0f, -2.0f); 509 matrix.postScale(2.0f, 3.0f); 510 final float[] input = { 511 0.0f, 0.0f, 512 1.0f, 2.0f 513 }; 514 final float[] output = new float[input.length]; 515 matrix.mapVectors(output, input); 516 assertThat(output).usingExactEquality().containsExactly(0.0f, 0.0f, 2.0f, 6.0f); 517 } 518 mapPoint(Matrix matrix, float x, float y)519 private static PointF mapPoint(Matrix matrix, float x, float y) { 520 float[] pf = new float[] {x, y}; 521 matrix.mapPoints(pf); 522 return new PointF(pf[0], pf[1]); 523 } 524 assertPointsEqual(PointF actual, PointF expected)525 private static void assertPointsEqual(PointF actual, PointF expected) { 526 assertThat(actual.x).isWithin(EPSILON).of(expected.x); 527 assertThat(actual.y).isWithin(EPSILON).of(expected.y); 528 } 529 checkInverse(Matrix matrix)530 private static void checkInverse(Matrix matrix) { 531 final Matrix inverse = new Matrix(); 532 assertThat(matrix.invert(inverse)).isTrue(); 533 matrix.postConcat(inverse); 534 assertThat(matrix.isIdentity()).isTrue(); 535 } 536 } 537