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