blob: 2726dac7c443a1229bd1a4ebda19e905d5ee44bc [file] [log] [blame]
Chris Craik500ffa42015-06-23 16:59:18 -07001/*
2 * Copyright (C) 2015 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/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, 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
Chris Craik23aa54b2014-10-09 18:11:01 -070017package android.uirendering.cts.testclasses;
18
19import android.graphics.Canvas;
20import android.graphics.Color;
21import android.graphics.Paint;
22import android.graphics.Path;
23import android.graphics.Point;
24import android.graphics.Typeface;
25import android.test.suitebuilder.annotation.SmallTest;
26import android.uirendering.cts.bitmapcomparers.MSSIMComparer;
27import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
28import android.uirendering.cts.testinfrastructure.ActivityTestBase;
29import android.uirendering.cts.testinfrastructure.CanvasClient;
30import android.uirendering.cts.testinfrastructure.ViewInitializer;
31import android.view.View;
32import android.view.ViewGroup;
Chris Craikce240702015-06-12 14:50:29 -070033import android.webkit.WebView;
Chris Craik23aa54b2014-10-09 18:11:01 -070034import com.android.cts.uirendering.R;
35
36public class PathClippingTests extends ActivityTestBase {
Chris Craik3e68f612015-01-21 17:49:27 -080037 // draw circle with hole in it, with stroked circle
Chris Craikce240702015-06-12 14:50:29 -070038 static final CanvasClient sTorusDrawCanvasClient = new CanvasClient() {
Chris Craik23aa54b2014-10-09 18:11:01 -070039 @Override
40 public String getDebugString() {
Chris Craikce240702015-06-12 14:50:29 -070041 return "TorusDraw";
Chris Craik23aa54b2014-10-09 18:11:01 -070042 }
43
44 @Override
45 public void draw(Canvas canvas, int width, int height) {
46 Paint paint = new Paint();
47 paint.setAntiAlias(false);
48 paint.setColor(Color.BLUE);
49 paint.setStyle(Paint.Style.STROKE);
50 paint.setStrokeWidth(20);
Chris Craik3e68f612015-01-21 17:49:27 -080051 canvas.drawCircle(30, 30, 40, paint);
Chris Craik23aa54b2014-10-09 18:11:01 -070052 }
53 };
54
Chris Craik3e68f612015-01-21 17:49:27 -080055 // draw circle with hole in it, by path operations + path clipping
Chris Craikce240702015-06-12 14:50:29 -070056 static final CanvasClient sTorusClipCanvasClient = new CanvasClient() {
Chris Craik23aa54b2014-10-09 18:11:01 -070057 @Override
58 public String getDebugString() {
Chris Craikce240702015-06-12 14:50:29 -070059 return "TorusClipDraw";
Chris Craik23aa54b2014-10-09 18:11:01 -070060 }
61
62 @Override
63 public void draw(Canvas canvas, int width, int height) {
64 canvas.save();
65
66 Path path = new Path();
Chris Craik3e68f612015-01-21 17:49:27 -080067 path.addCircle(30, 30, 50, Path.Direction.CW);
68 path.addCircle(30, 30, 30, Path.Direction.CCW);
Chris Craik23aa54b2014-10-09 18:11:01 -070069
70 canvas.clipPath(path);
71 canvas.drawColor(Color.BLUE);
72
73 canvas.restore();
74 }
75 };
76
77 @SmallTest
78 public void testCircleWithCircle() {
79 createTest()
Chris Craikce240702015-06-12 14:50:29 -070080 .addCanvasClient(sTorusDrawCanvasClient, false)
81 .addCanvasClient(sTorusClipCanvasClient)
Chris Craik23aa54b2014-10-09 18:11:01 -070082 .runWithComparer(new MSSIMComparer(0.90));
83 }
84
85 @SmallTest
86 public void testCircleWithPoints() {
87 createTest()
Chris Craikce240702015-06-12 14:50:29 -070088 .addCanvasClient(sTorusClipCanvasClient)
Chris Craik23aa54b2014-10-09 18:11:01 -070089 .runWithVerifier(new SamplePointVerifier(
90 new Point[] {
91 // inside of circle
Chris Craik3e68f612015-01-21 17:49:27 -080092 new Point(30, 50),
Chris Craik23aa54b2014-10-09 18:11:01 -070093 // on circle
Chris Craik3e68f612015-01-21 17:49:27 -080094 new Point(30 + 32, 30 + 32),
Chris Craik23aa54b2014-10-09 18:11:01 -070095 // outside of circle
Chris Craik3e68f612015-01-21 17:49:27 -080096 new Point(30 + 38, 30 + 38),
97 new Point(80, 80)
Chris Craik23aa54b2014-10-09 18:11:01 -070098 },
99 new int[] {
100 Color.WHITE,
101 Color.BLUE,
102 Color.WHITE,
103 Color.WHITE,
104 }));
105 }
106
107 @SmallTest
108 public void testViewRotate() {
109 createTest()
110 .addLayout(R.layout.blue_padded_layout, new ViewInitializer() {
111 @Override
Chris Craikab53a562015-06-12 15:13:50 -0700112 public void initializeView(View view) {
Chris Craik23aa54b2014-10-09 18:11:01 -0700113 ViewGroup rootView = (ViewGroup) view;
114 rootView.setClipChildren(true);
115 View childView = rootView.getChildAt(0);
Chris Craik3e68f612015-01-21 17:49:27 -0800116 childView.setPivotX(40);
117 childView.setPivotY(40);
Chris Craik23aa54b2014-10-09 18:11:01 -0700118 childView.setRotation(45f);
119
120 }
121 })
122 .runWithVerifier(new SamplePointVerifier(
123 new Point[] {
124 // inside of rotated rect
Chris Craik3e68f612015-01-21 17:49:27 -0800125 new Point(40, 40),
126 new Point(40 + 25, 40 + 25),
Chris Craik23aa54b2014-10-09 18:11:01 -0700127 // outside of rotated rect
Chris Craik3e68f612015-01-21 17:49:27 -0800128 new Point(40 + 31, 40 + 31),
129 new Point(80, 80)
Chris Craik23aa54b2014-10-09 18:11:01 -0700130 },
131 new int[] {
132 Color.BLUE,
133 Color.BLUE,
134 Color.WHITE,
135 Color.WHITE,
136 }));
137 }
138
139 @SmallTest
140 public void testTextClip() {
141 createTest()
142 .addCanvasClient(new CanvasClient() {
143 @Override
144 public void draw(Canvas canvas, int width, int height) {
145 canvas.save();
146
147 Path path = new Path();
Chris Craik3e68f612015-01-21 17:49:27 -0800148 path.addCircle(0, 45, 45, Path.Direction.CW);
149 path.addCircle(90, 45, 45, Path.Direction.CW);
Chris Craik23aa54b2014-10-09 18:11:01 -0700150 canvas.clipPath(path);
151
152 Paint paint = new Paint();
153 paint.setAntiAlias(true);
Chris Craik3e68f612015-01-21 17:49:27 -0800154 paint.setTextSize(90);
Chris Craik23aa54b2014-10-09 18:11:01 -0700155 paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
Chris Craik3e68f612015-01-21 17:49:27 -0800156 canvas.drawText("STRING", 0, 90, paint);
Chris Craik23aa54b2014-10-09 18:11:01 -0700157
158 canvas.restore();
159 }
160 })
161 .runWithComparer(new MSSIMComparer(0.90));
162 }
Chris Craikce240702015-06-12 14:50:29 -0700163
164 @SmallTest
165 public void testWebViewClipWithCircle() {
166 createTest()
167 // golden client - draw a simple non-AA circle
168 .addCanvasClient(new CanvasClient() {
169 @Override
170 public void draw(Canvas canvas, int width, int height) {
171 Paint paint = new Paint();
172 paint.setAntiAlias(false);
173 paint.setColor(Color.BLUE);
174 canvas.drawOval(0, 0, width, height, paint);
175 }
176 }, false)
177 // verify against solid color webview, clipped to its parent oval
178 .addLayout(R.layout.circle_clipped_webview, new ViewInitializer() {
179 @Override
Chris Craikbabcda22015-06-23 13:00:44 -0700180 public void initializeView(View view) {
Chris Craikce240702015-06-12 14:50:29 -0700181 WebView webview = (WebView)view.findViewById(R.id.webview);
182 assertNotNull(webview);
183 webview.loadData("<body style=\"background-color:blue\">", null, null);
184 }
185 })
186 .runWithComparer(new MSSIMComparer(0.95));
187 }
Chris Craik23aa54b2014-10-09 18:11:01 -0700188}