Matrix2f.java revision 98a281354fe06d1f970d0521c9a08d9eb0aa1a45
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/** 2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 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