/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.drawee.drawable; import android.graphics.Matrix; import android.graphics.Rect; import com.facebook.testing.robolectric.v2.WithTestDefaultsRunner; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static com.facebook.drawee.drawable.ScalingUtils.ScaleType; /** * Tests for scale type calculations. */ @RunWith(WithTestDefaultsRunner.class) public class ScalingUtilsTest { private final Matrix mExpectedMatrix = new Matrix(); private final Matrix mActualMatrix = new Matrix(); private final Rect mParentBounds = new Rect(10, 15, 410, 315); @Before public void setUp() { } @Test public void testFitXY() { test(1.60f, 2.00f, 10, 15, 250, 150, ScaleType.FIT_XY); test(0.50f, 1.50f, 10, 15, 800, 200, ScaleType.FIT_XY); test(0.50f, 0.75f, 10, 15, 800, 400, ScaleType.FIT_XY); test(2.00f, 2.00f, 10, 15, 200, 150, ScaleType.FIT_XY); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.FIT_XY); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.FIT_XY); test(2.00f, 1.50f, 10, 15, 200, 200, ScaleType.FIT_XY); test(2.00f, 0.75f, 10, 15, 200, 400, ScaleType.FIT_XY); test(0.80f, 0.75f, 10, 15, 500, 400, ScaleType.FIT_XY); } @Test public void testFitStart() { test(1.60f, 1.60f, 10, 15, 250, 150, ScaleType.FIT_START); test(0.50f, 0.50f, 10, 15, 800, 200, ScaleType.FIT_START); test(0.50f, 0.50f, 10, 15, 800, 400, ScaleType.FIT_START); test(2.00f, 2.00f, 10, 15, 200, 150, ScaleType.FIT_START); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.FIT_START); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.FIT_START); test(1.50f, 1.50f, 10, 15, 200, 200, ScaleType.FIT_START); test(0.75f, 0.75f, 10, 15, 200, 400, ScaleType.FIT_START); test(0.75f, 0.75f, 10, 15, 500, 400, ScaleType.FIT_START); } @Test public void testFitCenter() { test(1.60f, 1.60f, 10, 45, 250, 150, ScaleType.FIT_CENTER); test(0.50f, 0.50f, 10, 115, 800, 200, ScaleType.FIT_CENTER); test(0.50f, 0.50f, 10, 65, 800, 400, ScaleType.FIT_CENTER); test(2.00f, 2.00f, 10, 15, 200, 150, ScaleType.FIT_CENTER); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.FIT_CENTER); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.FIT_CENTER); test(1.50f, 1.50f, 60, 15, 200, 200, ScaleType.FIT_CENTER); test(0.75f, 0.75f, 135, 15, 200, 400, ScaleType.FIT_CENTER); test(0.75f, 0.75f, 23, 15, 500, 400, ScaleType.FIT_CENTER); } @Test public void testFitEnd() { test(1.60f, 1.60f, 10, 75, 250, 150, ScaleType.FIT_END); test(0.50f, 0.50f, 10, 215, 800, 200, ScaleType.FIT_END); test(0.50f, 0.50f, 10, 115, 800, 400, ScaleType.FIT_END); test(2.00f, 2.00f, 10, 15, 200, 150, ScaleType.FIT_END); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.FIT_END); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.FIT_END); test(1.50f, 1.50f, 110, 15, 200, 200, ScaleType.FIT_END); test(0.75f, 0.75f, 260, 15, 200, 400, ScaleType.FIT_END); test(0.75f, 0.75f, 35, 15, 500, 400, ScaleType.FIT_END); } @Test public void testCenter() { test(1.00f, 1.00f, 85, 90, 250, 150, ScaleType.CENTER); test(1.00f, 1.00f, -189, 65, 800, 200, ScaleType.CENTER); test(1.00f, 1.00f, -189, -34, 800, 400, ScaleType.CENTER); test(1.00f, 1.00f, 110, 90, 200, 150, ScaleType.CENTER); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.CENTER); test(1.00f, 1.00f, -189, -134, 800, 600, ScaleType.CENTER); test(1.00f, 1.00f, 110, 65, 200, 200, ScaleType.CENTER); test(1.00f, 1.00f, 110, -34, 200, 400, ScaleType.CENTER); test(1.00f, 1.00f, -39, -34, 500, 400, ScaleType.CENTER); } @Test public void testCenterInside() { test(1.00f, 1.00f, 85, 90, 250, 150, ScaleType.CENTER_INSIDE); test(0.50f, 0.50f, 10, 115, 800, 200, ScaleType.CENTER_INSIDE); test(0.50f, 0.50f, 10, 65, 800, 400, ScaleType.CENTER_INSIDE); test(1.00f, 1.00f, 110, 90, 200, 150, ScaleType.CENTER_INSIDE); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.CENTER_INSIDE); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.CENTER_INSIDE); test(1.00f, 1.00f, 110, 65, 200, 200, ScaleType.CENTER_INSIDE); test(0.75f, 0.75f, 135, 15, 200, 400, ScaleType.CENTER_INSIDE); test(0.75f, 0.75f, 23, 15, 500, 400, ScaleType.CENTER_INSIDE); } @Test public void testCenterCrop() { test(2.00f, 2.00f, -39, 15, 250, 150, ScaleType.CENTER_CROP); test(1.50f, 1.50f, -389, 15, 800, 200, ScaleType.CENTER_CROP); test(0.75f, 0.75f, -89, 15, 800, 400, ScaleType.CENTER_CROP); test(2.00f, 2.00f, 10, 15, 200, 150, ScaleType.CENTER_CROP); test(1.00f, 1.00f, 10, 15, 400, 300, ScaleType.CENTER_CROP); test(0.50f, 0.50f, 10, 15, 800, 600, ScaleType.CENTER_CROP); test(2.00f, 2.00f, 10, -34, 200, 200, ScaleType.CENTER_CROP); test(2.00f, 2.00f, 10, -234, 200, 400, ScaleType.CENTER_CROP); test(0.80f, 0.80f, 10, 5, 500, 400, ScaleType.CENTER_CROP); } @Test public void testFocusCrop_DefaultFocus() { test(2.00f, 2.00f, -39, 15, 250, 150, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(1.50f, 1.50f, -389, 15, 800, 200, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(0.75f, 0.75f, -89, 15, 800, 400, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 150, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(1.00f, 1.00f, 10, 15, 400, 300, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(0.50f, 0.50f, 10, 15, 800, 600, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -34, 200, 200, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -234, 200, 400, 0.50f, 0.50f, ScaleType.FOCUS_CROP); test(0.80f, 0.80f, 10, 5, 500, 400, 0.50f, 0.50f, ScaleType.FOCUS_CROP); } @Test public void testFocusCrop_FocusCentered() { test(2.00f, 2.00f, -14, 15, 250, 150, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(1.50f, 1.50f, -329, 15, 800, 200, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(0.75f, 0.75f, -59, 15, 800, 400, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 150, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(1.00f, 1.00f, 10, 15, 400, 300, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(0.50f, 0.50f, 10, 15, 800, 600, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -54, 200, 200, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -274, 200, 400, 0.45f, 0.55f, ScaleType.FOCUS_CROP); test(0.80f, 0.80f, 10, 2, 500, 400, 0.45f, 0.51f, ScaleType.FOCUS_CROP); } @Test public void testFocusCrop_FocusTopLeft() { test(2.00f, 2.00f, 10, 15, 250, 150, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(1.50f, 1.50f, 10, 15, 800, 200, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(0.75f, 0.75f, 10, 15, 800, 400, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 150, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(1.00f, 1.00f, 10, 15, 400, 300, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(0.50f, 0.50f, 10, 15, 800, 600, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 200, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 400, 0.00f, 0.00f, ScaleType.FOCUS_CROP); test(0.80f, 0.80f, 10, 15, 500, 400, 0.00f, 0.00f, ScaleType.FOCUS_CROP); } @Test public void testFocusCrop_FocusBottomRight() { test(2.00f, 2.00f, -89, 15, 250, 150, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(1.50f, 1.50f, -789, 15, 800, 200, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(0.75f, 0.75f, -189, 15, 800, 400, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, 15, 200, 150, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(1.00f, 1.00f, 10, 15, 400, 300, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(0.50f, 0.50f, 10, 15, 800, 600, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -84, 200, 200, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(2.00f, 2.00f, 10, -484, 200, 400, 1.00f, 1.00f, ScaleType.FOCUS_CROP); test(0.80f, 0.80f, 10, -4, 500, 400, 1.00f, 1.00f, ScaleType.FOCUS_CROP); } private void test( // expected float scaleX, float scaleY, float translateX, float translateY, // params int childWidth, int childHeight, ScaleType scaleType) { test(scaleX, scaleY, translateX, translateY, childWidth, childHeight, 0.5f, 0.5f, scaleType); } private void test( // expected float scaleX, float scaleY, float translateX, float translateY, // params int childWidth, int childHeight, float focusX, float focusY, ScaleType scaleType) { mExpectedMatrix.reset(); if (scaleType == ScaleType.CENTER) { Assert.assertEquals(1.0f, scaleX, 0); Assert.assertEquals(1.0f, scaleY, 0); mExpectedMatrix.setTranslate(translateX, translateY); } else { createTransform( mExpectedMatrix, scaleX, scaleY, translateX, translateY); } mActualMatrix.reset(); ScalingUtils.getTransform( mActualMatrix, mParentBounds, childWidth, childHeight, focusX, focusY, scaleType); AndroidGraphicsTestUtils.assertEquals(mExpectedMatrix, mActualMatrix); } private static Matrix createTransform( Matrix transform, float scaleX, float scaleY, float translateX, float translateY) { transform.setScale(scaleX, scaleY); transform.postTranslate(translateX, translateY); return transform; } }