198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2009-2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.Math;
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system.
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Matrix2f {
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Creates a new identity 2x2 matrix
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Matrix2f() {
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat = new float[4];
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Creates a new matrix and sets its values from the given
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * parameter
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param dataArray values to set the matrix to, must be 4
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *                  floats long
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Matrix2f(float[] dataArray) {
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat = new float[4];
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Return a reference to the internal array representing matrix
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * values. Modifying this array will also change the matrix
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return internal array representing the matrix
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public float[] getArray() {
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mMat;
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Returns the value for a given row and column
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x column of the value to return
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y row of the value to return
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return value in the yth row and xth column
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public float get(int x, int y) {
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mMat[x*2 + y];
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the value for a given row and column
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x column of the value to set
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y row of the value to set
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void set(int x, int y, float v) {
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[x*2 + y] = v;
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the matrix values to identity
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadIdentity() {
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = 1;
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] = 0;
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[2] = 0;
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] = 1;
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the values of the matrix to those of the parameter
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param src matrix to load the values from
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void load(Matrix2f src) {
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be a rotation matrix of given angle
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot rotation angle
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadRotate(float rot) {
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float c, s;
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rot *= (float)(java.lang.Math.PI / 180.0f);
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        c = (float)java.lang.Math.cos(rot);
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        s = (float)java.lang.Math.sin(rot);
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = c;
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] = -s;
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[2] = s;
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] = c;
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be a scale matrix of given dimensions
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadScale(float x, float y) {
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        loadIdentity();
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[0] = x;
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[3] = y;
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets current values to be the result of multiplying two given
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * matrices
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param lhs left hand side matrix
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rhs right hand side matrix
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int i=0 ; i<2 ; i++) {
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float ri0 = 0;
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            float ri1 = 0;
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            for (int j=0 ; j<2 ; j++) {
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                float rhs_ij = rhs.get(i,j);
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ri0 += lhs.get(j,0) * rhs_ij;
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ri1 += lhs.get(j,1) * rhs_ij;
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            set(i,0, ri0);
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            set(i,1, ri1);
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Post-multiplies the current matrix by a given parameter
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rhs right hand side to multiply by
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void multiply(Matrix2f rhs) {
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix2f tmp = new Matrix2f();
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadMultiply(this, rhs);
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        load(tmp);
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the current matrix by post-multiplying it with a
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * rotation matrix of given angle
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param rot angle of rotation
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void rotate(float rot) {
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix2f tmp = new Matrix2f();
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadRotate(rot);
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Modifies the current matrix by post-multiplying it with a
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * scale matrix of given dimensions
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    *
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param x scale component x
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param y scale component y
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void scale(float x, float y) {
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Matrix2f tmp = new Matrix2f();
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        tmp.loadScale(x, y);
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        multiply(tmp);
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Sets the current matrix to its transpose
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void transpose() {
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        float temp = mMat[1];
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[1] = mMat[2];
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMat[2] = temp;
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    final float[] mMat;
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
197