1ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy/* 2ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * Copyright (C) 2010 The Android Open Source Project 3ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * 4ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * you may not use this file except in compliance with the License. 6ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * You may obtain a copy of the License at 7ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * 8ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * 10ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * Unless required by applicable law or agreed to in writing, software 11ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * See the License for the specific language governing permissions and 14ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy * limitations under the License. 15ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy */ 16ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 17f607bdc167f66b3e7003acaa4736ae46d78c1492Romain Guypackage com.android.test.hwui; 18ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 19ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.app.Activity; 20ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.content.Context; 21ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.graphics.Bitmap; 22ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.graphics.BitmapFactory; 23ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.graphics.Camera; 24ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.graphics.Canvas; 25ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.graphics.Matrix; 26ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.os.Bundle; 27ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guyimport android.view.View; 28ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 29ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy@SuppressWarnings({"UnusedDeclaration"}) 30ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guypublic class Transform3dActivity extends Activity { 31ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy @Override 32ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy protected void onCreate(Bundle savedInstanceState) { 33ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy super.onCreate(savedInstanceState); 34ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy final Transform3dView view = new Transform3dView(this); 35ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy setContentView(view); 36ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 37ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 38ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy static class Transform3dView extends View { 39ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy private final Bitmap mBitmap1; 40ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy private Camera mCamera; 41ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy private Matrix mMatrix; 42ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 43ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy Transform3dView(Context c) { 44ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy super(c); 45ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 46ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy mBitmap1 = BitmapFactory.decodeResource(c.getResources(), R.drawable.sunset1); 47ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy mCamera = new Camera(); 48ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy mMatrix = new Matrix(); 49ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 50ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 51ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy @Override 52ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy protected void onDraw(Canvas canvas) { 53ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy super.onDraw(canvas); 54ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 55ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.drawARGB(255, 255, 255, 255); 56ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 57ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy final float centerX = getWidth() / 2.0f - mBitmap1.getWidth() / 2.0f; 58ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy final float centerY = getHeight() / 2.0f - mBitmap1.getHeight() / 2.0f; 59ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy final Camera camera = mCamera; 60ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 61ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy final Matrix matrix = mMatrix; 62ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 63ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy rotate(centerX, centerY, camera, matrix, 32.0f); 64ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy drawBitmap(canvas, centerX, centerY, 0.0f, matrix); 65ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 66ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy rotate(centerX, centerY, camera, matrix, 12.0f); 67ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy drawBitmap(canvas, centerX, centerY, -mBitmap1.getWidth(), matrix); 68ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 69ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy rotate(centerX, centerY, camera, matrix, 52.0f); 70ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy drawBitmap(canvas, centerX, centerY, mBitmap1.getWidth(), matrix); 71ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 72ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy rotate(centerX, centerY, camera, matrix, 122.0f); 73ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy drawBitmap(canvas, centerX, centerY, mBitmap1.getWidth() * 2.0f, matrix); 74ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 75ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 76ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 77ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy private void drawBitmap(Canvas canvas, float centerX, float centerY, float offset, 78ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy Matrix matrix) { 79ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.save(); 80ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.translate(offset, 0.0f); 81ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.concat(matrix); 82ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.drawBitmap(mBitmap1, centerX, centerY, null); 83ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy canvas.restore(); 84ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 85ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 86ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy private void rotate(float centerX, float centerY, Camera camera, 87ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy Matrix matrix, float angle) { 88ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy camera.save(); 89ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy camera.rotateY(angle); 90ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy camera.getMatrix(matrix); 91ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy camera.restore(); 92ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy 93ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy matrix.preTranslate(-centerX, -centerY); 94ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy matrix.postTranslate(centerX, centerY); 95ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 96ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy } 97ba7186e0828b6fa53dadff75bc51547d5150c3d1Romain Guy} 98