1 /*
2  * Copyright (C) 2009-2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.renderscript;
18 
19 
20 /**
21  * Class for exposing the native RenderScript rs_matrix2x2 type back to the Android system.
22  *
23  **/
24 public class Matrix2f {
25 
26     /**
27     * Creates a new identity 2x2 matrix
28     */
Matrix2f()29     public Matrix2f() {
30         mMat = new float[4];
31         loadIdentity();
32     }
33 
34     /**
35     * Creates a new matrix and sets its values from the given
36     * parameter
37     *
38     * @param dataArray values to set the matrix to, must be 4
39     *                  floats long
40     */
Matrix2f(float[] dataArray)41     public Matrix2f(float[] dataArray) {
42         mMat = new float[4];
43         System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
44     }
45 
46     /**
47     * Return a reference to the internal array representing matrix
48     * values. Modifying this array will also change the matrix
49     *
50     * @return internal array representing the matrix
51     */
getArray()52     public float[] getArray() {
53         return mMat;
54     }
55 
56     /**
57     * Returns the value for a given row and column
58     *
59     * @param x column of the value to return
60     * @param y row of the value to return
61     *
62     * @return value in the yth row and xth column
63     */
get(int x, int y)64     public float get(int x, int y) {
65         return mMat[x*2 + y];
66     }
67 
68     /**
69     * Sets the value for a given row and column
70     *
71     * @param x column of the value to set
72     * @param y row of the value to set
73     */
set(int x, int y, float v)74     public void set(int x, int y, float v) {
75         mMat[x*2 + y] = v;
76     }
77 
78     /**
79     * Sets the matrix values to identity
80     */
loadIdentity()81     public void loadIdentity() {
82         mMat[0] = 1;
83         mMat[1] = 0;
84 
85         mMat[2] = 0;
86         mMat[3] = 1;
87     }
88 
89     /**
90     * Sets the values of the matrix to those of the parameter
91     *
92     * @param src matrix to load the values from
93     */
load(Matrix2f src)94     public void load(Matrix2f src) {
95         System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
96     }
97 
98     /**
99     * Sets current values to be a rotation matrix of given angle
100     *
101     * @param rot rotation angle
102     */
loadRotate(float rot)103     public void loadRotate(float rot) {
104         float c, s;
105         rot *= (float)(java.lang.Math.PI / 180.0f);
106         c = (float)java.lang.Math.cos(rot);
107         s = (float)java.lang.Math.sin(rot);
108         mMat[0] = c;
109         mMat[1] = -s;
110         mMat[2] = s;
111         mMat[3] = c;
112     }
113 
114     /**
115     * Sets current values to be a scale matrix of given dimensions
116     *
117     * @param x scale component x
118     * @param y scale component y
119     */
loadScale(float x, float y)120     public void loadScale(float x, float y) {
121         loadIdentity();
122         mMat[0] = x;
123         mMat[3] = y;
124     }
125 
126     /**
127     * Sets current values to be the result of multiplying two given
128     * matrices
129     *
130     * @param lhs left hand side matrix
131     * @param rhs right hand side matrix
132     */
loadMultiply(Matrix2f lhs, Matrix2f rhs)133     public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
134         for (int i=0 ; i<2 ; i++) {
135             float ri0 = 0;
136             float ri1 = 0;
137             for (int j=0 ; j<2 ; j++) {
138                 float rhs_ij = rhs.get(i,j);
139                 ri0 += lhs.get(j,0) * rhs_ij;
140                 ri1 += lhs.get(j,1) * rhs_ij;
141             }
142             set(i,0, ri0);
143             set(i,1, ri1);
144         }
145     }
146 
147     /**
148     * Post-multiplies the current matrix by a given parameter
149     *
150     * @param rhs right hand side to multiply by
151     */
multiply(Matrix2f rhs)152     public void multiply(Matrix2f rhs) {
153         Matrix2f tmp = new Matrix2f();
154         tmp.loadMultiply(this, rhs);
155         load(tmp);
156     }
157     /**
158     * Modifies the current matrix by post-multiplying it with a
159     * rotation matrix of given angle
160     *
161     * @param rot angle of rotation
162     */
rotate(float rot)163     public void rotate(float rot) {
164         Matrix2f tmp = new Matrix2f();
165         tmp.loadRotate(rot);
166         multiply(tmp);
167     }
168     /**
169     * Modifies the current matrix by post-multiplying it with a
170     * scale matrix of given dimensions
171     *
172     * @param x scale component x
173     * @param y scale component y
174     */
scale(float x, float y)175     public void scale(float x, float y) {
176         Matrix2f tmp = new Matrix2f();
177         tmp.loadScale(x, y);
178         multiply(tmp);
179     }
180     /**
181     * Sets the current matrix to its transpose
182     */
transpose()183     public void transpose() {
184         float temp = mMat[1];
185         mMat[1] = mMat[2];
186         mMat[2] = temp;
187     }
188 
189     final float[] mMat;
190 }
191 
192 
193 
194