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