/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "rsMatrix2x2.h"
#include "rsMatrix3x3.h"
#include "rsMatrix4x4.h"

#include "stdlib.h"
#include "string.h"
#include "math.h"

namespace android {
namespace renderscript {

void Matrix3x3::loadIdentity() {
    m[0] = 1.f;
    m[1] = 0.f;
    m[2] = 0.f;
    m[3] = 0.f;
    m[4] = 1.f;
    m[5] = 0.f;
    m[6] = 0.f;
    m[7] = 0.f;
    m[8] = 1.f;
}

void Matrix3x3::load(const float *v) {
    memcpy(m, v, sizeof(m));
}

void Matrix3x3::load(const rs_matrix3x3 *v) {
    memcpy(m, v->m, sizeof(m));
}

void Matrix3x3::loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
    // Use a temporary variable to support the case where one of the inputs
    // is also the destination, e.g. left.loadMultiply(left, right);
    Matrix3x3 temp;
    for (int i=0 ; i<3 ; i++) {
        float ri0 = 0;
        float ri1 = 0;
        float ri2 = 0;
        for (int j=0 ; j<3 ; j++) {
            const float rhs_ij = ((const Matrix3x3 *)rhs)->get(i, j);
            ri0 += ((const Matrix3x3 *)lhs)->get(j, 0) * rhs_ij;
            ri1 += ((const Matrix3x3 *)lhs)->get(j, 1) * rhs_ij;
            ri2 += ((const Matrix3x3 *)lhs)->get(j, 2) * rhs_ij;
        }
        temp.set(i, 0, ri0);
        temp.set(i, 1, ri1);
        temp.set(i, 2, ri2);
    }
    load(&temp);
}

void Matrix3x3::transpose() {
    int i, j;
    float temp;
    for (i = 0; i < 2; ++i) {
        for (j = i + 1; j < 3; ++j) {
            temp = get(i, j);
            set(i, j, get(j, i));
            set(j, i, temp);
        }
    }
}

} // namespace renderscript
} // namespace android
