1 /*
2  * Copyright (C) 2016 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 
17 package android.view.cts;
18 
19 import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
20 import static android.opengl.GLES20.GL_SCISSOR_TEST;
21 import static android.opengl.GLES20.glClear;
22 import static android.opengl.GLES20.glClearColor;
23 import static android.opengl.GLES20.glEnable;
24 import static android.opengl.GLES20.glScissor;
25 
26 import android.graphics.Color;
27 import android.opengl.GLSurfaceView;
28 
29 import java.util.concurrent.CountDownLatch;
30 
31 import javax.microedition.khronos.egl.EGLConfig;
32 import javax.microedition.khronos.opengles.GL10;
33 
34 public class PixelCopyGLProducerCtsActivity extends GLSurfaceViewCtsActivity {
35     private static class QuadColorGLRenderer implements GLSurfaceView.Renderer {
36 
37         private final int mTopLeftColor;
38         private final int mTopRightColor;
39         private final int mBottomLeftColor;
40         private final int mBottomRightColor;
41 
42         private CountDownLatch mFence;
43 
44         private int mWidth, mHeight;
45 
QuadColorGLRenderer(int topLeft, int topRight, int bottomLeft, int bottomRight)46         public QuadColorGLRenderer(int topLeft, int topRight, int bottomLeft, int bottomRight) {
47             mTopLeftColor = topLeft;
48             mTopRightColor = topRight;
49             mBottomLeftColor = bottomLeft;
50             mBottomRightColor = bottomRight;
51         }
52 
53         @Override
onSurfaceCreated(GL10 gl, EGLConfig config)54         public void onSurfaceCreated(GL10 gl, EGLConfig config) {
55         }
56 
57         @Override
onSurfaceChanged(GL10 gl, int width, int height)58         public void onSurfaceChanged(GL10 gl, int width, int height) {
59             mWidth = width;
60             mHeight = height;
61         }
62 
63         @Override
onDrawFrame(GL10 gl)64         public void onDrawFrame(GL10 gl) {
65             int cx = mWidth / 2;
66             int cy = mHeight / 2;
67 
68             glEnable(GL_SCISSOR_TEST);
69 
70             glScissor(0, cy, cx, mHeight - cy);
71             clearColor(mTopLeftColor);
72 
73             glScissor(cx, cy, mWidth - cx, mHeight - cy);
74             clearColor(mTopRightColor);
75 
76             glScissor(0, 0, cx, cy);
77             clearColor(mBottomLeftColor);
78 
79             glScissor(cx, 0, mWidth - cx, cy);
80             clearColor(mBottomRightColor);
81 
82             if (mFence != null) {
83                 mFence.countDown();
84             }
85         }
86 
clearColor(int color)87         private void clearColor(int color) {
88             glClearColor(Color.red(color) / 255.0f,
89                     Color.green(color) / 255.0f,
90                     Color.blue(color) / 255.0f,
91                     Color.alpha(color) / 255.0f);
92             glClear(GL_COLOR_BUFFER_BIT);
93         }
94     }
95 
96     private QuadColorGLRenderer mRenderer;
97 
98     @Override
configureGLSurfaceView()99     protected void configureGLSurfaceView() {
100         mView.setEGLContextClientVersion(2);
101         mRenderer = new QuadColorGLRenderer(
102                 Color.RED, Color.GREEN, Color.BLUE, Color.BLACK);
103         mView.setRenderer(mRenderer);
104         mView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
105         mView.getHolder().setFixedSize(100, 100);
106     }
107 
setSwapFence(CountDownLatch swapFence)108     public void setSwapFence(CountDownLatch swapFence) {
109         mRenderer.mFence = swapFence;
110     }
111 }
112