1a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy/*
2a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * Copyright (C) 2010 The Android Open Source Project
3a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy *
4a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * you may not use this file except in compliance with the License.
6a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * You may obtain a copy of the License at
7a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy *
8a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy *
10a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * Unless required by applicable law or agreed to in writing, software
11a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * See the License for the specific language governing permissions and
14a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy * limitations under the License.
15a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy */
16a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
17a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
18f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui;
19a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
20a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.app.Activity;
21a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.content.Context;
22a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.Bitmap;
23a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.BitmapFactory;
24a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.Canvas;
25a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.Color;
26a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.LinearGradient;
27a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.Paint;
28a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.PorterDuff;
29a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.PorterDuffXfermode;
30a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.graphics.Shader;
31a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.os.Bundle;
32a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guyimport android.view.View;
33a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
34a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy@SuppressWarnings({"UnusedDeclaration"})
35a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guypublic class FramebufferBlendActivity extends Activity {
36a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    @Override
37a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    protected void onCreate(Bundle savedInstanceState) {
38a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        super.onCreate(savedInstanceState);
39a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
40a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        setContentView(new BlendView(this));
41a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    }
42a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
43a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    static class BlendView extends View {
44a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private int mTexWidth;
45a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private int mTexHeight;
46a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private Paint mPaint;
47a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private LinearGradient mHorGradient;
48a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private Bitmap mTexture;
49a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
50a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        BlendView(Context c) {
51a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            super(c);
52a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
53a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mTexture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
54a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mTexWidth = mTexture.getWidth();
55a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mTexHeight = mTexture.getHeight();
56a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
57a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mHorGradient = new LinearGradient(0.0f, 0.0f, mTexWidth, 0.0f,
58a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy                    Color.BLACK, Color.WHITE, Shader.TileMode.CLAMP);
59a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
60a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint = new Paint();
61a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        }
62a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
63a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        @Override
64a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        protected void onDraw(Canvas canvas) {
65a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            super.onDraw(canvas);
66a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.drawRGB(255, 255, 255);
67a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
68a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.save();
69a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.translate(40.0f, 40.0f);
70a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
71a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmap(canvas, PorterDuff.Mode.DARKEN);
72a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmap(canvas, PorterDuff.Mode.LIGHTEN);
73a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmap(canvas, PorterDuff.Mode.MULTIPLY);
74a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
75a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.restore();
76a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
77a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.save();
78a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.translate(40.0f + mTexWidth + 40.0f, 40.0f);
79a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
80a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmap(canvas, PorterDuff.Mode.SCREEN);
81a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmap(canvas, PorterDuff.Mode.ADD);
82a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            drawBlendedBitmapInverse(canvas, PorterDuff.Mode.OVERLAY);
83a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
84a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.restore();
85a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        }
86a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
87a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private void drawBlendedBitmap(Canvas canvas, PorterDuff.Mode mode) {
88a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setShader(null);
89a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setXfermode(null);
90a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.drawBitmap(mTexture, 0.0f, 0.0f, mPaint);
91a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
92a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setShader(mHorGradient);
93a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setXfermode(new PorterDuffXfermode(mode));
94a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.drawRect(0.0f, 0.0f, mTexWidth, mTexHeight, mPaint);
95a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
96a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.translate(0.0f, 40.0f + mTexHeight);
97a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        }
98a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
99a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        private void drawBlendedBitmapInverse(Canvas canvas, PorterDuff.Mode mode) {
100a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setXfermode(null);
101a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setShader(mHorGradient);
102a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.drawRect(0.0f, 0.0f, mTexWidth, mTexHeight, mPaint);
103a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
104a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setXfermode(new PorterDuffXfermode(mode));
105a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            mPaint.setShader(null);
106a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.drawBitmap(mTexture, 0.0f, 0.0f, mPaint);
107a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
108a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy            canvas.translate(0.0f, 40.0f + mTexHeight);
109a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        }
110a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    }
111a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy}
112