1/*
2 * Copyright (C) 2010 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
17package com.android.test.hwui;
18
19import android.app.Activity;
20import android.content.Context;
21import android.graphics.Bitmap;
22import android.graphics.BitmapFactory;
23import android.graphics.BitmapShader;
24import android.graphics.Canvas;
25import android.graphics.Color;
26import android.graphics.ColorFilter;
27import android.graphics.ComposeShader;
28import android.graphics.LightingColorFilter;
29import android.graphics.LinearGradient;
30import android.graphics.Matrix;
31import android.graphics.Paint;
32import android.graphics.PorterDuff;
33import android.graphics.Shader;
34import android.os.Bundle;
35import android.view.View;
36
37@SuppressWarnings({"UnusedDeclaration"})
38public class MoreShadersActivity extends Activity {
39    @Override
40    protected void onCreate(Bundle savedInstanceState) {
41        super.onCreate(savedInstanceState);
42
43        setContentView(new ShadersView(this));
44    }
45
46    static class ShadersView extends View {
47        private BitmapShader mScaledShader;
48        private int mTexWidth;
49        private int mTexHeight;
50        private Paint mPaint;
51        private float mDrawWidth;
52        private float mDrawHeight;
53        private LinearGradient mHorGradient;
54        private LinearGradient mVertGradient;
55        private ComposeShader mComposeShader;
56        private ComposeShader mCompose2Shader;
57        private Paint mLargePaint;
58        private BitmapShader mScaled2Shader;
59        private ColorFilter mColorFilter;
60        private final Matrix mMtx1;
61
62        ShadersView(Context c) {
63            super(c);
64
65            Bitmap texture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
66            mTexWidth = texture.getWidth();
67            mTexHeight = texture.getHeight();
68            mDrawWidth = mTexWidth * 2.2f;
69            mDrawHeight = mTexHeight * 1.2f;
70
71            mScaledShader = new BitmapShader(texture, Shader.TileMode.MIRROR,
72                    Shader.TileMode.MIRROR);
73            Matrix m2 = new Matrix();
74            m2.setScale(0.1f, 0.1f);
75            mScaledShader.setLocalMatrix(m2);
76
77            mScaled2Shader = new BitmapShader(texture, Shader.TileMode.MIRROR,
78                    Shader.TileMode.MIRROR);
79            Matrix m3 = new Matrix();
80            m3.setScale(0.1f, 0.1f);
81            mScaled2Shader.setLocalMatrix(m3);
82
83            mHorGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth, 0.0f,
84                    Color.RED, 0x7f00ff00, Shader.TileMode.CLAMP);
85            Matrix m4 = new Matrix();
86            m4.setScale(0.5f, 0.5f);
87            mHorGradient.setLocalMatrix(m4);
88
89            mVertGradient = new LinearGradient(0.0f, 0.0f, 0.0f, mDrawHeight / 2.0f,
90                    Color.YELLOW, Color.MAGENTA, Shader.TileMode.MIRROR);
91
92            mComposeShader = new ComposeShader(mScaledShader, mHorGradient,
93                    PorterDuff.Mode.SRC_OVER);
94            mMtx1 = new Matrix();
95            mMtx1.setTranslate(mTexWidth / 2.0f, mTexHeight / 2.0f);
96            mMtx1.postRotate(45, 0, 0);
97            mComposeShader.setLocalMatrix(mMtx1);
98
99            mCompose2Shader = new ComposeShader(mHorGradient, mScaledShader,
100                    PorterDuff.Mode.SRC_OUT);
101
102            mColorFilter = new LightingColorFilter(0x0060ffff, 0x00101030);
103
104            mLargePaint = new Paint();
105            mLargePaint.setAntiAlias(true);
106            mLargePaint.setTextSize(36.0f);
107            mLargePaint.setColor(0xff000000);
108            mLargePaint.setShadowLayer(3.0f, 0.0f, 3.0f, 0x7f00ff00);
109
110            mPaint = new Paint();
111        }
112
113        @Override
114        protected void onDraw(Canvas canvas) {
115            super.onDraw(canvas);
116            canvas.drawRGB(255, 255, 255);
117
118            canvas.save();
119            canvas.translate(40.0f, 40.0f);
120
121            mPaint.setShader(mComposeShader);
122            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
123
124            canvas.translate(0.0f, 40.0f + mDrawHeight);
125            mPaint.setShader(mCompose2Shader);
126            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
127
128            canvas.restore();
129
130            canvas.save();
131            canvas.translate(40.0f + mDrawWidth + 40.0f, 40.0f);
132
133            mLargePaint.setShader(mHorGradient);
134            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
135
136            mLargePaint.setShader(mScaled2Shader);
137            canvas.drawText("OpenGL rendering", 0.0f, 60.0f, mLargePaint);
138
139            mLargePaint.setShader(mCompose2Shader);
140            mLargePaint.setColorFilter(mColorFilter);
141            canvas.drawText("OpenGL rendering", 0.0f, 100.0f, mLargePaint);
142            mLargePaint.setColorFilter(null);
143
144            canvas.translate(0.0f, 40.0f + mDrawHeight);
145            mLargePaint.setShader(mVertGradient);
146            canvas.drawText("OpenGL rendering", 0.0f, 20.0f, mLargePaint);
147
148            canvas.restore();
149        }
150    }
151}
152