1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE2.0 9 * 10 * Unless required by applicable law or agreed to in riting, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.uirendering.cts.testclasses; 17 18 import android.graphics.Bitmap; 19 import android.graphics.Canvas; 20 import android.graphics.Color; 21 import android.graphics.LinearGradient; 22 import android.graphics.Paint; 23 import android.graphics.Rect; 24 import android.graphics.Shader; 25 import android.uirendering.cts.bitmapcomparers.BitmapComparer; 26 import android.uirendering.cts.bitmapcomparers.MSSIMComparer; 27 import android.uirendering.cts.testinfrastructure.ActivityTestBase; 28 import android.uirendering.cts.testinfrastructure.CanvasClient; 29 import android.uirendering.cts.testinfrastructure.DisplayModifier; 30 import android.uirendering.cts.testinfrastructure.ResourceModifier; 31 32 import androidx.test.filters.LargeTest; 33 import androidx.test.runner.AndroidJUnit4; 34 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 38 /** 39 * Test cases of all combination of resource modifications. 40 */ 41 @LargeTest 42 @RunWith(AndroidJUnit4.class) 43 public class SweepTests extends ActivityTestBase { 44 private final static DisplayModifier COLOR_FILTER_GRADIENT_MODIFIER = new DisplayModifier() { 45 private final Rect mBounds = new Rect(30, 30, 150, 150); 46 private final int[] mColors = new int[] { 47 Color.RED, Color.GREEN, Color.BLUE 48 }; 49 50 private final Bitmap mBitmap = createGradient(); 51 52 @Override 53 public void modifyDrawing(Paint paint, Canvas canvas) { 54 canvas.drawBitmap(mBitmap, 0, 0, paint); 55 } 56 57 private Bitmap createGradient() { 58 LinearGradient gradient = new LinearGradient(15, 45, 75, 45, mColors, null, 59 Shader.TileMode.REPEAT); 60 Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888); 61 Paint p = new Paint(); 62 p.setShader(gradient); 63 Canvas c = new Canvas(bitmap); 64 c.drawRect(mBounds, p); 65 return bitmap; 66 } 67 }; 68 69 public static final DisplayModifier mCircleDrawModifier = new DisplayModifier() { 70 @Override 71 public void modifyDrawing(Paint paint, Canvas canvas) { 72 canvas.drawCircle(TEST_WIDTH / 2, TEST_HEIGHT / 2, TEST_HEIGHT / 2, paint); 73 } 74 }; 75 76 /** 77 * 0.5 defines minimum similarity as 50% 78 */ 79 private static final float HIGH_THRESHOLD = 0.5f; 80 81 private static final BitmapComparer[] DEFAULT_MSSIM_COMPARER = new BitmapComparer[] { 82 new MSSIMComparer(HIGH_THRESHOLD) 83 }; 84 85 @Test testBasicDraws()86 public void testBasicDraws() { 87 sweepModifiersForMask(DisplayModifier.Accessor.SHAPES_MASK, null, DEFAULT_MSSIM_COMPARER); 88 } 89 90 @Test testBasicShaders()91 public void testBasicShaders() { 92 sweepModifiersForMask(DisplayModifier.Accessor.SHADER_MASK, mCircleDrawModifier, 93 DEFAULT_MSSIM_COMPARER); 94 } 95 96 @Test testColorFilterUsingGradient()97 public void testColorFilterUsingGradient() { 98 sweepModifiersForMask(DisplayModifier.Accessor.COLOR_FILTER_MASK, 99 COLOR_FILTER_GRADIENT_MODIFIER, DEFAULT_MSSIM_COMPARER); 100 } 101 sweepModifiersForMask(int mask, final DisplayModifier drawOp, BitmapComparer[] bitmapComparers)102 protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp, 103 BitmapComparer[] bitmapComparers) { 104 if ((mask & DisplayModifier.Accessor.ALL_OPTIONS_MASK) == 0) { 105 throw new IllegalArgumentException("Attempt to test with a mask that is invalid"); 106 } 107 // Get the accessor of all the different modifications possible 108 final DisplayModifier.Accessor modifierAccessor = new DisplayModifier.Accessor(mask); 109 // Initialize the resources that we will need to access 110 ResourceModifier.init(getActivity().getResources()); 111 // For each modification combination, we will get the CanvasClient associated with it and 112 // from there execute a normal canvas test with that. 113 CanvasClient canvasClient = (canvas, width, height) -> { 114 Paint paint = new Paint(); 115 paint.setAntiAlias(false); 116 modifierAccessor.modifyDrawing(canvas, paint); 117 if (drawOp != null) { 118 drawOp.modifyDrawing(paint, canvas); 119 } 120 }; 121 122 int index = 0; 123 // Create the test cases with each combination 124 do { 125 int arrIndex = Math.min(index, bitmapComparers.length - 1); 126 TestCaseBuilder builder = createTest(); 127 String debugString = modifierAccessor.getDebugString(); 128 if (debugString.contains("bitmapMesh")) { 129 builder.addCanvasClient(debugString, canvasClient); 130 } else { 131 builder.addCanvasClient(debugString, canvasClient); 132 } 133 builder.runWithComparer(bitmapComparers[arrIndex]); 134 index++; 135 } while (modifierAccessor.step()); 136 } 137 } 138