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 Sams 209c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system. 2225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * 2325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams **/ 2425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Samspublic class Matrix2f { 2525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 269c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 27ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new identity 2x2 matrix 28ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 2925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public Matrix2f() { 3025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat = new float[4]; 3125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams loadIdentity(); 3225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 3325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 35ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Creates a new matrix and sets its values from the given 36ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * parameter 37ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 38ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param dataArray values to set the matrix to, must be 4 39ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * floats long 40ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 41e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public Matrix2f(float[] dataArray) { 42ef65bb30ed093d625476b5d77737217fd7750a87Stephen Hines mMat = new float[4]; 43e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk System.arraycopy(dataArray, 0, mMat, 0, mMat.length); 44e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 45e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 47ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Return a reference to the internal array representing matrix 48ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * values. Modifying this array will also change the matrix 49ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @return internal array representing the matrix 51ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 52e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk public float[] getArray() { 53e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk return mMat; 54e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk } 55e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk 569c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 57ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Returns the value for a given row and column 58ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 59ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to return 60ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to return 61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 62ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @return value in the yth row and xth column 63ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 64ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public float get(int x, int y) { 65ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines return mMat[x*2 + y]; 6625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 6725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 69ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the value for a given row and column 70ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 71ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param x column of the value to set 72ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines * @param y row of the value to set 73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 74ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines public void set(int x, int y, float v) { 75ec6f200cd8a882458c57a63e1740731f0563cbccStephen Hines mMat[x*2 + y] = v; 7625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 7725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 79ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the matrix values to identity 80ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 8125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadIdentity() { 8225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[0] = 1; 8325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[1] = 0; 8425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 8525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[2] = 0; 8625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mMat[3] = 1; 8725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 8825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 90ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the values of the matrix to those of the parameter 91ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 92ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param src matrix to load the values from 93ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 9425430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void load(Matrix2f src) { 95b3b89f63af148031817c046ba8023b76241c1e7cAlex Sakhartchouk System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length); 9625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams } 9725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 99ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a rotation matrix of given angle 100ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 101ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot rotation angle 102ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 103cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadRotate(float rot) { 104cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float c, s; 105cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk rot *= (float)(java.lang.Math.PI / 180.0f); 106cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk c = (float)java.lang.Math.cos(rot); 107cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk s = (float)java.lang.Math.sin(rot); 108cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = c; 109cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[1] = -s; 110cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[2] = s; 111cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = c; 112cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 113cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 115ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be a scale matrix of given dimensions 116ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 117ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 118ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 119ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 120cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadScale(float x, float y) { 121cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk loadIdentity(); 122cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[0] = x; 123cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk mMat[3] = y; 124cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 125ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk 1269c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 127ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets current values to be the result of multiplying two given 128ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * matrices 129ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 130ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param lhs left hand side matrix 131ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side matrix 132ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 133cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void loadMultiply(Matrix2f lhs, Matrix2f rhs) { 134cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int i=0 ; i<2 ; i++) { 135cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri0 = 0; 136cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float ri1 = 0; 137cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk for (int j=0 ; j<2 ; j++) { 138cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk float rhs_ij = rhs.get(i,j); 139cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri0 += lhs.get(j,0) * rhs_ij; 140cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk ri1 += lhs.get(j,1) * rhs_ij; 141cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 142cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,0, ri0); 143cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk set(i,1, ri1); 144cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 145cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 146cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 1479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 148ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Post-multiplies the current matrix by a given parameter 149ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 150ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rhs right hand side to multiply by 151ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 152cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void multiply(Matrix2f rhs) { 153cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 154cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadMultiply(this, rhs); 155cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk load(tmp); 156cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 158ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 159ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * rotation matrix of given angle 160ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 161ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param rot angle of rotation 162ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 163cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void rotate(float rot) { 164cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 165cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadRotate(rot); 166cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 167cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 169ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Modifies the current matrix by post-multiplying it with a 170ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * scale matrix of given dimensions 171ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * 172ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param x scale component x 173ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * @param y scale component y 174ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 175cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk public void scale(float x, float y) { 176cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk Matrix2f tmp = new Matrix2f(); 177cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk tmp.loadScale(x, y); 178cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk multiply(tmp); 179cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk } 1809c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 181ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk * Sets the current matrix to its transpose 182ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk */ 183518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk public void transpose() { 184518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk float temp = mMat[1]; 185518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[1] = mMat[2]; 186518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk mMat[2] = temp; 187518f033b68649c151cc8725ea8c557eae01cc567Alex Sakhartchouk } 188cf9a44cdf3647c8b31499ad6250f63259c0e34e2Alex Sakhartchouk 18925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams final float[] mMat; 19025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams} 19125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 19225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 19325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams 194