19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy/** 2047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * A camera instance can be used to compute 3D transformations and 2147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * generate a matrix that can be applied, for instance, on a 2247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * {@link Canvas}. 2347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Camera { 257fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy private Matrix mMatrix; 267fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy 2747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 2847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Creates a new camera, with empty transformations. 2947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Camera() { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeConstructor(); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 3547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Saves the camera state. Each save should be balanced 3647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * with a call to {@link #restore()}. 3747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 3847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #save() 3947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void save(); 4147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 4247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 4347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Restores the saved state, if any. 4447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 4547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #restore() 4647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void restore(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 5047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Applies a translation transform on all three axis. 5147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 5247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param x The distance to translate by on the X axis 5347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param y The distance to translate by on the Y axis 5447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param z The distance to translate by on the Z axis 5547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void translate(float x, float y, float z); 5747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 5847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 5947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Applies a rotation transform around the X axis. 6047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 6147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param deg The angle of rotation around the X axis, in degrees 6247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 6347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateY(float) 6447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateZ(float) 6547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotate(float, float, float) 6647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void rotateX(float deg); 6847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 6947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 7047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Applies a rotation transform around the Y axis. 7147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 7247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param deg The angle of rotation around the Y axis, in degrees 7347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 7447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateX(float) 7547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateZ(float) 7647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotate(float, float, float) 7747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void rotateY(float deg); 7947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 8047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 8147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Applies a rotation transform around the Z axis. 8247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 8347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param deg The angle of rotation around the Z axis, in degrees 8447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 8547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateX(float) 8647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateY(float) 8747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotate(float, float, float) 8847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void rotateZ(float deg); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 9247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Applies a rotation transform around all three axis. 9347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 9447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param x The angle of rotation around the X axis, in degrees 9547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param y The angle of rotation around the Y axis, in degrees 9647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param z The angle of rotation around the Z axis, in degrees 9747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 9847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateX(float) 9947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateY(float) 10047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @see #rotateZ(float) 10147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 10247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy public native void rotate(float x, float y, float z); 10347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 10447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 105a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Gets the x location of the camera. 106a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * @see #setLocation(float, float, float) 108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase public native float getLocationX(); 110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase /** 112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Gets the y location of the camera. 113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * @see #setLocation(float, float, float) 115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase public native float getLocationY(); 117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase /** 119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * Gets the z location of the camera. 120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * 121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase * @see #setLocation(float, float, float) 122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase */ 123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase public native float getLocationZ(); 124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase /** 12647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Sets the location of the camera. The default location is set at 12747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 0, 0, -8. 12847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 12947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param x The x location of the camera 13047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param y The y location of the camera 13147b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param z The z location of the camera 13247b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 13347b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy public native void setLocation(float x, float y, float z); 13447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 13547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 13647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Computes the matrix corresponding to the current transformation 13747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * and copies it to the supplied matrix object. 13847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 13947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param matrix The matrix to copy the current transforms into 14047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void getMatrix(Matrix matrix) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeGetMatrix(matrix.native_instance); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy 14547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy /** 14647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * Computes the matrix corresponding to the current transformation 14747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * and applies it to the specified Canvas. 14847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * 14947b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy * @param canvas The Canvas to set the transform matrix onto 15047b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void applyToCanvas(Canvas canvas) { 1527fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy if (canvas.isHardwareAccelerated()) { 1537fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy if (mMatrix == null) mMatrix = new Matrix(); 1547fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy getMatrix(mMatrix); 1557fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy canvas.concat(mMatrix); 1567fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy } else { 1575c3d927e17e98e8fd4a9f3c86f7f4def0bcfa816Florin Malita nativeApplyToCanvas(canvas.getNativeCanvasWrapper()); 1587fbbc3c9c3dc25c2bc78bba6fd267bfd99c96b2bRomain Guy } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native float dotWithNormal(float dx, float dy, float dz); 16236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 16447b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy try { 16547b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy nativeDestructor(); 16647b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy } finally { 16747b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy super.finalize(); 16847b8adec3904535c8d8ce2b6e42ecd736f2d90ceRomain Guy } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void nativeConstructor(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void nativeDestructor(); 17336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private native void nativeGetMatrix(long native_matrix); 17436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat private native void nativeApplyToCanvas(long native_canvas); 17536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 17636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat long native_instance; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 178