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