125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/* 2ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project 325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * you may not use this file except in compliance with the License. 625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * You may obtain a copy of the License at 725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 1025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Unless required by applicable law or agreed to in writing, software 1125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * See the License for the specific language governing permissions and 1425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * limitations under the License. 1525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams */ 1625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspackage android.renderscript; 1825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samsimport java.lang.Math; 2025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samsimport android.util.Log; 2125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 2225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 2411518acc8c416023d8c2192b441a1767205676d9Robert Ly * Class for exposing the native Renderscript rs_matrix2x2 type back to the Android system. 2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 2625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams **/ 2725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix2f { 2825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 30ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new identity 2x2 matrix 31ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public Matrix2f() { 3325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat = new float[4]; 3425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams loadIdentity(); 3525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 3625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 38ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new matrix and sets its values from the given 39ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * parameter 40ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 41ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param dataArray values to set the matrix to, must be 4 42ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * floats long 43ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 44e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public Matrix2f(float[] dataArray) { 45ef65bb30ed093d625476b5d77737217fd7750a87Stephen Hines mMat = new float[4]; 46e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 47e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 48e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 499c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Return a reference to the internal array representing matrix 51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * values. Modifying this array will also change the matrix 52ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 53ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @return internal array representing the matrix 54ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 55e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public float[] getArray() { 56e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk return mMat; 57e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 58e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 599c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Returns the value for a given row and column 61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 62ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to return 63ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to return 64ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 65ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @return value in the yth row and xth column 66ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 67ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public float get(int x, int y) { 68ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines return mMat[x*2 + y]; 6925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 7025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the value for a given row and column 73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 74ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to set 75ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to set 76ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 77ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public void set(int x, int y, float v) { 78ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines mMat[x*2 + y] = v; 7925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 8025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 819c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 82ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the matrix values to identity 83ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 8425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadIdentity() { 8525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[0] = 1; 8625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[1] = 0; 8725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 8825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[2] = 0; 8925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[3] = 1; 9025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 9125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 929c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 93ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the values of the matrix to those of the parameter 94ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 95ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param src matrix to load the values from 96ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 9725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void load(Matrix2f src) { 98b3b89f63af148031817c046ba8023b76241c1e7cAlex Sakhartchouk System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 9925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 10025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 1019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 102ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a rotation matrix of given angle 103ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 104ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot rotation angle 105ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 106cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot) { 107cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 108cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 109cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 110cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 111cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = c; 112cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = -s; 113cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[2] = s; 114cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = c; 115cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 116cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1179c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 118ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a scale matrix of given dimensions 119ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 120ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 121ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 122ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 123cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y) { 124cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 125cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 126cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = y; 127cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 128ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 1299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 130ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be the result of multiplying two given 131ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * matrices 132ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 133ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param lhs left hand side matrix 134ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side matrix 135ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 136cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadMultiply(Matrix2f lhs, Matrix2f rhs) { 137cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int i=0 ; i<2 ; i++) { 138cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri0 = 0; 139cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri1 = 0; 140cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int j=0 ; j<2 ; j++) { 141cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float rhs_ij = rhs.get(i,j); 142cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri0 += lhs.get(j,0) * rhs_ij; 143cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri1 += lhs.get(j,1) * rhs_ij; 144cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 145cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,0, ri0); 146cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,1, ri1); 147cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 148cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 149cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1509c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 151ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Post-multiplies the current matrix by a given parameter 152ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 153ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side to multiply by 154ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 155cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void multiply(Matrix2f rhs) { 156cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 157cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadMultiply(this, rhs); 158cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk load(tmp); 159cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 161ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 162ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * rotation matrix of given angle 163ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 164ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 165ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 166cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot) { 167cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 168cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot); 169cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 170cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1719c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 172ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 173ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * scale matrix of given dimensions 174ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 175ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 176ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 177ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 178cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y) { 179cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 180cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y); 181cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 182cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 184ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the current matrix to its transpose 185ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 186518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk public void transpose() { 187518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk float temp = mMat[1]; 188518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[1] = mMat[2]; 189518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[2] = temp; 190518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 191cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 19225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 19325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams} 19425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 19525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 19625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 197