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.support.test.filters.LargeTest; 26 import android.support.test.runner.AndroidJUnit4; 27 import android.uirendering.cts.bitmapcomparers.BitmapComparer; 28 import android.uirendering.cts.bitmapcomparers.MSSIMComparer; 29 import android.uirendering.cts.testinfrastructure.ActivityTestBase; 30 import android.uirendering.cts.testinfrastructure.CanvasClient; 31 import android.uirendering.cts.testinfrastructure.DisplayModifier; 32 import android.uirendering.cts.testinfrastructure.ResourceModifier; 33 34 import org.junit.Test; 35 import org.junit.runner.RunWith; 36 37 /** 38 * Test cases of all combination of resource modifications. 39 */ 40 @LargeTest 41 @RunWith(AndroidJUnit4.class) 42 public class SweepTests extends ActivityTestBase { 43 private final static DisplayModifier COLOR_FILTER_GRADIENT_MODIFIER = new DisplayModifier() { 44 private final Rect mBounds = new Rect(30, 30, 150, 150); 45 private final int[] mColors = new int[] { 46 Color.RED, Color.GREEN, Color.BLUE 47 }; 48 49 private final Bitmap mBitmap = createGradient(); 50 51 @Override 52 public void modifyDrawing(Paint paint, Canvas canvas) { 53 canvas.drawBitmap(mBitmap, 0, 0, paint); 54 } 55 56 private Bitmap createGradient() { 57 LinearGradient gradient = new LinearGradient(15, 45, 75, 45, mColors, null, 58 Shader.TileMode.REPEAT); 59 Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888); 60 Paint p = new Paint(); 61 p.setShader(gradient); 62 Canvas c = new Canvas(bitmap); 63 c.drawRect(mBounds, p); 64 return bitmap; 65 } 66 }; 67 68 public static final DisplayModifier mCircleDrawModifier = new DisplayModifier() { 69 @Override 70 public void modifyDrawing(Paint paint, Canvas canvas) { 71 canvas.drawCircle(TEST_WIDTH / 2, TEST_HEIGHT / 2, TEST_HEIGHT / 2, paint); 72 } 73 }; 74 75 /** 76 * 0.5 defines minimum similarity as 50% 77 */ 78 private static final float HIGH_THRESHOLD = 0.5f; 79 80 private static final BitmapComparer[] DEFAULT_MSSIM_COMPARER = new BitmapComparer[] { 81 new MSSIMComparer(HIGH_THRESHOLD) 82 }; 83 84 @Test 85 public void testBasicDraws() { 86 sweepModifiersForMask(DisplayModifier.Accessor.SHAPES_MASK, null, DEFAULT_MSSIM_COMPARER); 87 } 88 89 @Test 90 public void testBasicShaders() { 91 sweepModifiersForMask(DisplayModifier.Accessor.SHADER_MASK, mCircleDrawModifier, 92 DEFAULT_MSSIM_COMPARER); 93 } 94 95 @Test 96 public void testColorFilterUsingGradient() { 97 sweepModifiersForMask(DisplayModifier.Accessor.COLOR_FILTER_MASK, 98 COLOR_FILTER_GRADIENT_MODIFIER, DEFAULT_MSSIM_COMPARER); 99 } 100 101 protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp, 102 BitmapComparer[] bitmapComparers) { 103 if ((mask & DisplayModifier.Accessor.ALL_OPTIONS_MASK) == 0) { 104 throw new IllegalArgumentException("Attempt to test with a mask that is invalid"); 105 } 106 // Get the accessor of all the different modifications possible 107 final DisplayModifier.Accessor modifierAccessor = new DisplayModifier.Accessor(mask); 108 // Initialize the resources that we will need to access 109 ResourceModifier.init(getActivity().getResources()); 110 // For each modification combination, we will get the CanvasClient associated with it and 111 // from there execute a normal canvas test with that. 112 CanvasClient canvasClient = (canvas, width, height) -> { 113 Paint paint = new Paint(); 114 modifierAccessor.modifyDrawing(canvas, paint); 115 if (drawOp != null) { 116 drawOp.modifyDrawing(paint, canvas); 117 } 118 }; 119 120 int index = 0; 121 // Create the test cases with each combination 122 do { 123 int arrIndex = Math.min(index, bitmapComparers.length - 1); 124 TestCaseBuilder builder = createTest(); 125 String debugString = modifierAccessor.getDebugString(); 126 if (debugString.contains("bitmapMesh")) { 127 builder.addCanvasClient(debugString, canvasClient); 128 } else { 129 builder.addCanvasClient(debugString, canvasClient); 130 } 131 builder.runWithComparer(bitmapComparers[arrIndex]); 132 index++; 133 } while (modifierAccessor.step()); 134 } 135 } 136