125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/*
225430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams * Copyright (C) 2009 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
2325430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams/**
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
29ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
37ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
49ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
59ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * Returns the value for a given row and column
61ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
62ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @param i row of the value to return
63ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @param j column of the value to return
64ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
65ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return value in the ith row and jth column
66ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    */
6725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public float get(int i, int j) {
6825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        return mMat[i*2 + j];
6925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
7025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
71ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
72ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * Sets the value for a given row and column
73ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
74ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @param i row of the value to set
75ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @param j column of the value to set
76ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    */
7725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    public void set(int i, int j, float v) {
7825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        mMat[i*2 + j] = v;
7925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams    }
8025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams
81ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
92ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
101ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
117ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
129ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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
150ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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    }
160ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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    }
171ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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    }
183ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    /**
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