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
17package android.support.v8.renderscript;
18
19import java.lang.Math;
20import android.util.Log;
21
22
23/**
24 * Class for exposing the native Renderscript rs_matrix2x2 type back to the Android system.
25 *
26 **/
27public class Matrix2f {
28
29    /**
30    * Creates a new identity 2x2 matrix
31    */
32    public Matrix2f() {
33        mMat = new float[4];
34        loadIdentity();
35    }
36
37    /**
38    * Creates a new matrix and sets its values from the given
39    * parameter
40    *
41    * @param dataArray values to set the matrix to, must be 4
42    *                  floats long
43    */
44    public Matrix2f(float[] dataArray) {
45        mMat = new float[4];
46        System.arraycopy(dataArray, 0, mMat, 0, mMat.length);
47    }
48
49    /**
50    * Return a reference to the internal array representing matrix
51    * values. Modifying this array will also change the matrix
52    *
53    * @return internal array representing the matrix
54    */
55    public float[] getArray() {
56        return mMat;
57    }
58
59    /**
60    * Returns the value for a given row and column
61    *
62    * @param x column of the value to return
63    * @param y row of the value to return
64    *
65    * @return value in the yth row and xth column
66    */
67    public float get(int x, int y) {
68        return mMat[x*2 + y];
69    }
70
71    /**
72    * Sets the value for a given row and column
73    *
74    * @param x column of the value to set
75    * @param y row of the value to set
76    */
77    public void set(int x, int y, float v) {
78        mMat[x*2 + y] = v;
79    }
80
81    /**
82    * Sets the matrix values to identity
83    */
84    public void loadIdentity() {
85        mMat[0] = 1;
86        mMat[1] = 0;
87
88        mMat[2] = 0;
89        mMat[3] = 1;
90    }
91
92    /**
93    * Sets the values of the matrix to those of the parameter
94    *
95    * @param src matrix to load the values from
96    */
97    public void load(Matrix2f src) {
98        System.arraycopy(src.getArray(), 0, mMat, 0, mMat.length);
99    }
100
101    /**
102    * Sets current values to be a rotation matrix of given angle
103    *
104    * @param rot rotation angle
105    */
106    public void loadRotate(float rot) {
107        float c, s;
108        rot *= (float)(java.lang.Math.PI / 180.0f);
109        c = (float)java.lang.Math.cos(rot);
110        s = (float)java.lang.Math.sin(rot);
111        mMat[0] = c;
112        mMat[1] = -s;
113        mMat[2] = s;
114        mMat[3] = c;
115    }
116
117    /**
118    * Sets current values to be a scale matrix of given dimensions
119    *
120    * @param x scale component x
121    * @param y scale component y
122    */
123    public void loadScale(float x, float y) {
124        loadIdentity();
125        mMat[0] = x;
126        mMat[3] = y;
127    }
128
129    /**
130    * Sets current values to be the result of multiplying two given
131    * matrices
132    *
133    * @param lhs left hand side matrix
134    * @param rhs right hand side matrix
135    */
136    public void loadMultiply(Matrix2f lhs, Matrix2f rhs) {
137        for (int i=0 ; i<2 ; i++) {
138            float ri0 = 0;
139            float ri1 = 0;
140            for (int j=0 ; j<2 ; j++) {
141                float rhs_ij = rhs.get(i,j);
142                ri0 += lhs.get(j,0) * rhs_ij;
143                ri1 += lhs.get(j,1) * rhs_ij;
144            }
145            set(i,0, ri0);
146            set(i,1, ri1);
147        }
148    }
149
150    /**
151    * Post-multiplies the current matrix by a given parameter
152    *
153    * @param rhs right hand side to multiply by
154    */
155    public void multiply(Matrix2f rhs) {
156        Matrix2f tmp = new Matrix2f();
157        tmp.loadMultiply(this, rhs);
158        load(tmp);
159    }
160    /**
161    * Modifies the current matrix by post-multiplying it with a
162    * rotation matrix of given angle
163    *
164    * @param rot angle of rotation
165    */
166    public void rotate(float rot) {
167        Matrix2f tmp = new Matrix2f();
168        tmp.loadRotate(rot);
169        multiply(tmp);
170    }
171    /**
172    * Modifies the current matrix by post-multiplying it with a
173    * scale matrix of given dimensions
174    *
175    * @param x scale component x
176    * @param y scale component y
177    */
178    public void scale(float x, float y) {
179        Matrix2f tmp = new Matrix2f();
180        tmp.loadScale(x, y);
181        multiply(tmp);
182    }
183    /**
184    * Sets the current matrix to its transpose
185    */
186    public void transpose() {
187        float temp = mMat[1];
188        mMat[1] = mMat[2];
189        mMat[2] = temp;
190    }
191
192    final float[] mMat;
193}
194
195
196
197