1b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy/*
2b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * Copyright (C) 2010 The Android Open Source Project
3b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy *
4b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * you may not use this file except in compliance with the License.
6b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * You may obtain a copy of the License at
7b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy *
8b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy *
10b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * Unless required by applicable law or agreed to in writing, software
11b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * See the License for the specific language governing permissions and
14b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy * limitations under the License.
15b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy */
16b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui;
18b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
19b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.app.Activity;
20b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.content.Context;
21b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Bitmap;
22b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.BitmapFactory;
23b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.BitmapShader;
24b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Canvas;
25b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Color;
26db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyimport android.graphics.ColorFilter;
27b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.ComposeShader;
28db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyimport android.graphics.LightingColorFilter;
29b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.LinearGradient;
30b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Matrix;
31b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Paint;
32b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.PorterDuff;
33b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.graphics.Shader;
34b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.os.Bundle;
35b82da65cb1601be504241f36778395cd6cb9f87bRomain Guyimport android.view.View;
36b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
37b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy@SuppressWarnings({"UnusedDeclaration"})
38b82da65cb1601be504241f36778395cd6cb9f87bRomain Guypublic class MoreShadersActivity extends Activity {
39b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    @Override
40b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    protected void onCreate(Bundle savedInstanceState) {
41b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        super.onCreate(savedInstanceState);
42b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
43b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        setContentView(new ShadersView(this));
44b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    }
45b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
46b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    static class ShadersView extends View {
47b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private BitmapShader mScaledShader;
48b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private int mTexWidth;
49b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private int mTexHeight;
50b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private Paint mPaint;
51b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private float mDrawWidth;
52b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private float mDrawHeight;
53b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private LinearGradient mHorGradient;
54b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private LinearGradient mVertGradient;
55b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private ComposeShader mComposeShader;
56b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private ComposeShader mCompose2Shader;
57b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private Paint mLargePaint;
58b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        private BitmapShader mScaled2Shader;
59db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        private ColorFilter mColorFilter;
60b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
61b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        ShadersView(Context c) {
62b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            super(c);
63b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
64b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Bitmap texture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
65b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mTexWidth = texture.getWidth();
66b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mTexHeight = texture.getHeight();
67b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mDrawWidth = mTexWidth * 2.2f;
68b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mDrawHeight = mTexHeight * 1.2f;
69b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
70b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaledShader = new BitmapShader(texture, Shader.TileMode.MIRROR,
71b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Shader.TileMode.MIRROR);
72b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Matrix m2 = new Matrix();
73b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            m2.setScale(0.5f, 0.5f);
74b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaledShader.setLocalMatrix(m2);
75b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
76b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaled2Shader = new BitmapShader(texture, Shader.TileMode.MIRROR,
77b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Shader.TileMode.MIRROR);
78b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Matrix m3 = new Matrix();
79b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            m3.setScale(0.1f, 0.1f);
80b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaled2Shader.setLocalMatrix(m3);
81b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
82b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mHorGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth, 0.0f,
83b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Color.RED, 0x7f00ff00, Shader.TileMode.CLAMP);
84b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
85b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mVertGradient = new LinearGradient(0.0f, 0.0f, 0.0f, mDrawHeight / 2.0f,
86b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Color.YELLOW, Color.MAGENTA, Shader.TileMode.MIRROR);
87b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
88b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mComposeShader = new ComposeShader(mScaledShader, mHorGradient,
89b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    PorterDuff.Mode.SRC_OVER);
90b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mCompose2Shader = new ComposeShader(mHorGradient, mScaledShader,
91b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    PorterDuff.Mode.SRC_OUT);
92b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
93db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mColorFilter = new LightingColorFilter(0x0060ffff, 0x00101030);
94db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
95b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint = new Paint();
96b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setAntiAlias(true);
97b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setTextSize(36.0f);
98b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setColor(0xff000000);
993a03eeedafb3e3335b56bdb9c0a2f02104d32299Romain Guy            mLargePaint.setShadowLayer(3.0f, 0.0f, 3.0f, 0x7f00ff00);
100740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
101b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint = new Paint();
102b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        }
103b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
104b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        @Override
105b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        protected void onDraw(Canvas canvas) {
106b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            super.onDraw(canvas);
107b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRGB(255, 255, 255);
108b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
109b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.save();
110b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(40.0f, 40.0f);
111b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
112b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint.setShader(mComposeShader);
113b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
114b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
115b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
116b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint.setShader(mCompose2Shader);
117b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
118b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
119b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.restore();
120b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
121b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.save();
122b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(40.0f + mDrawWidth + 40.0f, 40.0f);
123b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
12406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy            mLargePaint.setShader(mHorGradient);
125b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
126740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
127b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mScaled2Shader);
128b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 60.0f, mLargePaint);
129740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
130b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mCompose2Shader);
131db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mLargePaint.setColorFilter(mColorFilter);
132b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 100.0f, mLargePaint);
133db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mLargePaint.setColorFilter(null);
134740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
135b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
136b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mVertGradient);
137b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
138740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
139b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.restore();
140b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        }
141b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    }
142b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy}
143