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