1d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy/*
2d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * Copyright (C) 2010 The Android Open Source Project
3d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy *
4d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * you may not use this file except in compliance with the License.
6d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * You may obtain a copy of the License at
7d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy *
8d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy *
10d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * Unless required by applicable law or agreed to in writing, software
11d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * See the License for the specific language governing permissions and
14d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * limitations under the License.
15d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy */
16d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui;
18d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
19d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.app.Activity;
20d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.content.Context;
21d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Bitmap;
22d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.BitmapFactory;
23d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.BitmapShader;
24d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Canvas;
25d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Color;
26d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.LinearGradient;
27d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Matrix;
28d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Paint;
29d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.graphics.Shader;
30d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.os.Bundle;
31d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guyimport android.view.View;
32d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
33d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy@SuppressWarnings({"UnusedDeclaration"})
34d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guypublic class ShadersActivity extends Activity {
35d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy    @Override
36d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy    protected void onCreate(Bundle savedInstanceState) {
37d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        super.onCreate(savedInstanceState);
38d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
39d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        setContentView(new ShadersView(this));
40d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy    }
41d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
42d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    public static class ShadersView extends View {
43d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private BitmapShader mRepeatShader;
44d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private BitmapShader mTranslatedShader;
45d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private BitmapShader mScaledShader;
46d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private int mTexWidth;
47d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private int mTexHeight;
48d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private Paint mPaint;
49d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private float mDrawWidth;
50d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private float mDrawHeight;
51d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private LinearGradient mHorGradient;
52d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private LinearGradient mDiagGradient;
53d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        private LinearGradient mVertGradient;
548164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy        private Bitmap mTexture;
5563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        private Matrix mMtx1;
5663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        private Matrix mMtx2;
5763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet        private Matrix mMtx3;
58d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
59d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        public ShadersView(Context c) {
60d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            super(c);
61d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
628164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mTexture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
638164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mTexWidth = mTexture.getWidth();
648164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mTexHeight = mTexture.getHeight();
65d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mDrawWidth = mTexWidth * 2.2f;
66d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mDrawHeight = mTexHeight * 1.2f;
67d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
688164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mRepeatShader = new BitmapShader(mTexture, Shader.TileMode.REPEAT,
69d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                    Shader.TileMode.REPEAT);
70d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
718164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mTranslatedShader = new BitmapShader(mTexture, Shader.TileMode.REPEAT,
72d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                    Shader.TileMode.REPEAT);
7363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx1 = new Matrix();
7463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx1.setTranslate(mTexWidth / 2.0f, mTexHeight / 2.0f);
7563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx1.postRotate(45, 0, 0);
7663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mTranslatedShader.setLocalMatrix(mMtx1);
77d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
788164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            mScaledShader = new BitmapShader(mTexture, Shader.TileMode.MIRROR,
79d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                    Shader.TileMode.MIRROR);
8063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx2 = new Matrix();
8163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx2.setScale(0.5f, 0.5f);
8263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mScaledShader.setLocalMatrix(mMtx2);
83d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
840bb5667b4ef91fefd0500fae0186789d15d54e0eRomain Guy            mHorGradient = new LinearGradient(0.0f, 0.0f, 1.0f, 0.0f,
85ae5575b3421c8fbe590ab046d7d5f2b36ecfd821Romain Guy                    Color.RED, Color.GREEN, Shader.TileMode.CLAMP);
8663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx3 = new Matrix();
8763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx3.setScale(mDrawHeight, 1.0f);
8863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx3.postRotate(-90.0f);
8963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mMtx3.postTranslate(0.0f, mDrawHeight);
9063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet            mHorGradient.setLocalMatrix(mMtx3);
91d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
92d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mDiagGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth / 1.5f, mDrawHeight,
93d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                    Color.BLUE, Color.MAGENTA, Shader.TileMode.CLAMP);
94d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
95d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mVertGradient = new LinearGradient(0.0f, 0.0f, 0.0f, mDrawHeight / 2.0f,
96d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                    Color.YELLOW, Color.MAGENTA, Shader.TileMode.MIRROR);
97d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
98d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint = new Paint();
99d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        }
100d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
101d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        @Override
102d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        protected void onDraw(Canvas canvas) {
103d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            super.onDraw(canvas);
104c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy            //canvas.drawRGB(255, 255, 255);
1058164c2d338781c3a3c4a443941070dca5d88f2a7Romain Guy            canvas.drawBitmap(mTexture, 0.0f, 0.0f, null);
106d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
107d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            // Bitmap shaders
108d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.save();
109d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(40.0f, 40.0f);
110d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
111d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mRepeatShader);
112d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
113d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
114d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
115d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mTranslatedShader);
116d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
117d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
118d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
119d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mScaledShader);
120d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
121d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
122d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.restore();
123d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
124d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            // Gradients
125d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.save();
126d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(40.0f + mDrawWidth + 40.0f, 40.0f);
127d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
128d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mHorGradient);
129d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
130d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
131d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
132d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mDiagGradient);
133d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
134d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy
135d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
136d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            mPaint.setShader(mVertGradient);
137d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
138d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
139d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy            canvas.restore();
140d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy        }
141d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy    }
142d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy}
143