148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy/*
248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * Copyright (C) 2010 The Android Open Source Project
348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy *
448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * you may not use this file except in compliance with the License.
648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * You may obtain a copy of the License at
748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy *
848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy *
1048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * Unless required by applicable law or agreed to in writing, software
1148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
1248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * See the License for the specific language governing permissions and
1448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy * limitations under the License.
1548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy */
1648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui;
1848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
1948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.app.Activity;
2048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.content.Context;
2148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Bitmap;
2248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.BitmapFactory;
2348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.BitmapShader;
2448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Canvas;
2548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Color;
2648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.ComposeShader;
2748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.LinearGradient;
2848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Matrix;
2948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Paint;
3048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.PorterDuff;
3148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.graphics.Shader;
3248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.os.Bundle;
3348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guyimport android.view.View;
3448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
3548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy@SuppressWarnings({"UnusedDeclaration"})
3648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guypublic class AdvancedBlendActivity extends Activity {
3748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy    @Override
3848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy    protected void onCreate(Bundle savedInstanceState) {
3948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        super.onCreate(savedInstanceState);
4048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
4148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        setContentView(new ShadersView(this));
4248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy    }
4348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
44ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet    public static class ShadersView extends View {
4548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private BitmapShader mScaledShader;
4648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private int mTexWidth;
4748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private int mTexHeight;
4848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private Paint mPaint;
4948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private float mDrawWidth;
5048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private float mDrawHeight;
5148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private LinearGradient mHorGradient;
5248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mComposeShader;
5348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mCompose2Shader;
5448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mCompose3Shader;
5548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mCompose4Shader;
5648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mCompose5Shader;
5748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private ComposeShader mCompose6Shader;
5848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        private BitmapShader mScaled2Shader;
5948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
60ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet        public ShadersView(Context c) {
6148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            super(c);
6248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
6348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            Bitmap texture = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1);
6448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mTexWidth = texture.getWidth();
6548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mTexHeight = texture.getHeight();
6648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mDrawWidth = mTexWidth * 2.2f;
6748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mDrawHeight = mTexHeight * 1.2f;
6848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
6948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mScaledShader = new BitmapShader(texture, Shader.TileMode.MIRROR,
7048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    Shader.TileMode.MIRROR);
7148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            Matrix m2 = new Matrix();
7248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            m2.setScale(0.5f, 0.5f);
7348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mScaledShader.setLocalMatrix(m2);
74ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
7548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mScaled2Shader = new BitmapShader(texture, Shader.TileMode.MIRROR,
7648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    Shader.TileMode.MIRROR);
7748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            Matrix m3 = new Matrix();
7848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            m3.setScale(0.1f, 0.1f);
7948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mScaled2Shader.setLocalMatrix(m3);
8048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
8148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mHorGradient = new LinearGradient(0.0f, 0.0f, mDrawWidth, 0.0f,
8248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    Color.BLACK, Color.WHITE, Shader.TileMode.CLAMP);
83ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
8448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mComposeShader = new ComposeShader(mScaledShader, mHorGradient,
8548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.DARKEN);
8648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mCompose2Shader = new ComposeShader(mScaledShader, mHorGradient,
8748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.LIGHTEN);
8848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mCompose3Shader = new ComposeShader(mScaledShader, mHorGradient,
8948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.MULTIPLY);
9048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mCompose4Shader = new ComposeShader(mScaledShader, mHorGradient,
9148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.SCREEN);
9248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mCompose5Shader = new ComposeShader(mScaledShader, mHorGradient,
9348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.ADD);
9448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mCompose6Shader = new ComposeShader(mHorGradient, mScaledShader,
9548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy                    PorterDuff.Mode.OVERLAY);
9648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
9748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint = new Paint();
9848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        }
9948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
10048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        @Override
10148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        protected void onDraw(Canvas canvas) {
10248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            super.onDraw(canvas);
10348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRGB(255, 255, 255);
10448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
10548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.save();
10648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(40.0f, 40.0f);
10748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
10848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mComposeShader);
10948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
110ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
11148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
11248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mCompose2Shader);
11348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
11448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
11548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
11648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mCompose3Shader);
11748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
11848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
11948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.restore();
120ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
12148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.save();
12248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(40.0f + mDrawWidth + 40.0f, 40.0f);
123ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
12448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mCompose4Shader);
12548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
12648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
12748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
12848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mCompose5Shader);
12948daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
13048daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy
13148daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.translate(0.0f, 40.0f + mDrawHeight);
13248daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            mPaint.setShader(mCompose6Shader);
13348daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.drawRect(0.0f, 0.0f, mDrawWidth, mDrawHeight, mPaint);
134ec31a7f119608b94ea1bb41275811027a360bf30Xavier Ducrohet
13548daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy            canvas.restore();
13648daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy        }
13748daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy    }
13848daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy}
139