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