145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2009-2012 The Android Open Source Project
345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License.
645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at
745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software
1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and
1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License.
1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */
1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript;
1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.Math;
2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
2145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
24032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system.
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
2645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Matrix2f {
2845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Creates a new identity 2x2 matrix
3145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public Matrix2f() {
3345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat = new float[4];
3445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        loadIdentity();
3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
3645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Creates a new matrix and sets its values from the given
3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * parameter
4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param dataArray values to set the matrix to, must be 4
4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *                  floats long
4345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public Matrix2f(float[] dataArray) {
4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat = new float[4];
4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Return a reference to the internal array representing matrix
5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * values. Modifying this array will also change the matrix
5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return internal array representing the matrix
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public float[] getArray() {
5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mMat;
5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
6045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Returns the value for a given row and column
6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param x column of the value to return
6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param y row of the value to return
6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return value in the yth row and xth column
6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public float get(int x, int y) {
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mMat[x*2 + y];
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets the value for a given row and column
7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param x column of the value to set
7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param y row of the value to set
7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void set(int x, int y, float v) {
7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[x*2 + y] = v;
7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets the matrix values to identity
8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void loadIdentity() {
8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[0] = 1;
8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[1] = 0;
8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[2] = 0;
8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[3] = 1;
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets the values of the matrix to those of the parameter
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param src matrix to load the values from
9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void load(Matrix2f src) {
9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets current values to be a rotation matrix of given angle
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param rot rotation angle
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void loadRotate(float rot) {
10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        float c, s;
10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rot *= (float)(java.lang.Math.PI / 180.0f);
10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        c = (float)java.lang.Math.cos(rot);
11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        s = (float)java.lang.Math.sin(rot);
11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[0] = c;
11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[1] = -s;
11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[2] = s;
11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[3] = c;
11545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
11845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets current values to be a scale matrix of given dimensions
11945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
12045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param x scale component x
12145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param y scale component y
12245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
12345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void loadScale(float x, float y) {
12445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        loadIdentity();
12545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[0] = x;
12645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[3] = y;
12745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
12845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
12945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
13045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets current values to be the result of multiplying two given
13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * matrices
13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param lhs left hand side matrix
13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param rhs right hand side matrix
13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int i=0 ; i<2 ; i++) {
13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            float ri0 = 0;
13945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            float ri1 = 0;
14045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            for (int j=0 ; j<2 ; j++) {
14145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                float rhs_ij = rhs.get(i,j);
14245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                ri0 += lhs.get(j,0) * rhs_ij;
14345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                ri1 += lhs.get(j,1) * rhs_ij;
14445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
14545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            set(i,0, ri0);
14645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            set(i,1, ri1);
14745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Post-multiplies the current matrix by a given parameter
15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param rhs right hand side to multiply by
15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void multiply(Matrix2f rhs) {
15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Matrix2f tmp = new Matrix2f();
15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        tmp.loadMultiply(this, rhs);
15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        load(tmp);
15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Modifies the current matrix by post-multiplying it with a
16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * rotation matrix of given angle
16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param rot angle of rotation
16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
16645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void rotate(float rot) {
16745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Matrix2f tmp = new Matrix2f();
16845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        tmp.loadRotate(rot);
16945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        multiply(tmp);
17045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
17145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
17245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Modifies the current matrix by post-multiplying it with a
17345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * scale matrix of given dimensions
17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    *
17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param x scale component x
17645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param y scale component y
17745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
17845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void scale(float x, float y) {
17945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Matrix2f tmp = new Matrix2f();
18045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        tmp.loadScale(x, y);
18145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        multiply(tmp);
18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Sets the current matrix to its transpose
18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void transpose() {
18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        float temp = mMat[1];
18845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[1] = mMat[2];
18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMat[2] = temp;
19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    final float[] mMat;
19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
197