10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2011 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix2x2.h"
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix3x3.h"
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix4x4.h"
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "stdlib.h"
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "string.h"
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "math.h"
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android;
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript;
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Matrix3x3::loadIdentity() {
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[0] = 1.f;
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[1] = 0.f;
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[2] = 0.f;
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[3] = 0.f;
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[4] = 1.f;
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[5] = 0.f;
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[6] = 0.f;
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[7] = 0.f;
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    m[8] = 1.f;
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Matrix3x3::load(const float *v) {
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(m, v, sizeof(m));
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Matrix3x3::load(const rs_matrix3x3 *v) {
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    memcpy(m, v->m, sizeof(m));
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Matrix3x3::loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (int i=0 ; i<3 ; i++) {
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        float ri0 = 0;
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        float ri1 = 0;
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        float ri2 = 0;
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (int j=0 ; j<3 ; j++) {
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const float rhs_ij = ((const Matrix3x3 *)rhs)->get(i, j);
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ri0 += ((const Matrix3x3 *)lhs)->get(j, 0) * rhs_ij;
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ri1 += ((const Matrix3x3 *)lhs)->get(j, 1) * rhs_ij;
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ri2 += ((const Matrix3x3 *)lhs)->get(j, 2) * rhs_ij;
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        set(i, 0, ri0);
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        set(i, 1, ri1);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        set(i, 2, ri2);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid Matrix3x3::transpose() {
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int i, j;
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    float temp;
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (i = 0; i < 2; ++i) {
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (j = i + 1; j < 3; ++j) {
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            temp = get(i, j);
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            set(i, j, get(j, i));
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            set(j, i, temp);
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
77