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;
60d4289922ce772ed8e170a27d1c9521672b315698Romain Guy        private final Matrix mMtx1;
61b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
62b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        ShadersView(Context c) {
63b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            super(c);
64b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
65b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Bitmap texture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
66b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mTexWidth = texture.getWidth();
67b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mTexHeight = texture.getHeight();
68b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mDrawWidth = mTexWidth * 2.2f;
69b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mDrawHeight = mTexHeight * 1.2f;
70b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
71b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaledShader = new BitmapShader(texture, Shader.TileMode.MIRROR,
72b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Shader.TileMode.MIRROR);
73b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Matrix m2 = new Matrix();
74d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            m2.setScale(0.1f, 0.1f);
75b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaledShader.setLocalMatrix(m2);
76b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
77b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaled2Shader = new BitmapShader(texture, Shader.TileMode.MIRROR,
78b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Shader.TileMode.MIRROR);
79b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            Matrix m3 = new Matrix();
80b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            m3.setScale(0.1f, 0.1f);
81b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mScaled2Shader.setLocalMatrix(m3);
82b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
83b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mHorGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth, 0.0f,
84b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Color.RED, 0x7f00ff00, Shader.TileMode.CLAMP);
85d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            Matrix m4 = new Matrix();
86d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            m4.setScale(0.5f, 0.5f);
87d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            mHorGradient.setLocalMatrix(m4);
88d4289922ce772ed8e170a27d1c9521672b315698Romain Guy
89b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mVertGradient = new LinearGradient(0.0f, 0.0f, 0.0f, mDrawHeight / 2.0f,
90b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    Color.YELLOW, Color.MAGENTA, Shader.TileMode.MIRROR);
91b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
92b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mComposeShader = new ComposeShader(mScaledShader, mHorGradient,
93b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    PorterDuff.Mode.SRC_OVER);
94d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            mMtx1 = new Matrix();
95d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            mMtx1.setTranslate(mTexWidth / 2.0f, mTexHeight / 2.0f);
96d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            mMtx1.postRotate(45, 0, 0);
97d4289922ce772ed8e170a27d1c9521672b315698Romain Guy            mComposeShader.setLocalMatrix(mMtx1);
98d4289922ce772ed8e170a27d1c9521672b315698Romain Guy
99b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mCompose2Shader = new ComposeShader(mHorGradient, mScaledShader,
100b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy                    PorterDuff.Mode.SRC_OUT);
101b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
102db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mColorFilter = new LightingColorFilter(0x0060ffff, 0x00101030);
103db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
104b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint = new Paint();
105b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setAntiAlias(true);
106b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setTextSize(36.0f);
107b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setColor(0xff000000);
1083a03eeedafb3e3335b56bdb9c0a2f02104d32299Romain Guy            mLargePaint.setShadowLayer(3.0f, 0.0f, 3.0f, 0x7f00ff00);
109740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
110b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint = new Paint();
111b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        }
112b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
113b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        @Override
114b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        protected void onDraw(Canvas canvas) {
115b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            super.onDraw(canvas);
116b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRGB(255, 255, 255);
117b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
118b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.save();
119b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(40.0f, 40.0f);
120b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
121b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint.setShader(mComposeShader);
122b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
123b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
124b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
125b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mPaint.setShader(mCompose2Shader);
126b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
127b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
128b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.restore();
129b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
130b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.save();
131b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(40.0f + mDrawWidth + 40.0f, 40.0f);
132b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy
13306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy            mLargePaint.setShader(mHorGradient);
134b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
135740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
136b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mScaled2Shader);
137b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 60.0f, mLargePaint);
138740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
139b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mCompose2Shader);
140db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mLargePaint.setColorFilter(mColorFilter);
141b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 100.0f, mLargePaint);
142db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy            mLargePaint.setColorFilter(null);
143740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
144b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
145b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            mLargePaint.setShader(mVertGradient);
146b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
147740bf2bb2e900d3db2292b5909b4b4c6e90320e6Romain Guy
148b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy            canvas.restore();
149b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy        }
150b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy    }
151b82da65cb1601be504241f36778395cd6cb9f87bRomain Guy}
152