18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
163298a7d84b96ade73c6b170671711a8f2792ae59Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// must include config.h first for webkit to fiddle with new/delete
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkANP.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SK_SCALAR_IS_FIXED
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void fromFloat(SkScalar dst[], const float src[], int n) {
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < n; i++) {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dst[i] = SkFloatToScalar(src[i]);
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void toFloat(float dst[], const SkScalar src[], int n) {
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < n; i++) {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dst[i] = SkScalarToFloat(src[i]);
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ANPMatrix* anp_newMatrix() {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return new ANPMatrix;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_deleteMatrix(ANPMatrix* matrix) {
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete matrix;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ANPMatrixFlag anp_getFlags(const ANPMatrix* matrix) {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return matrix->getType();
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_copy(ANPMatrix* dst, const ANPMatrix* src) {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    *dst = *src;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_get3x3(const ANPMatrix* matrix, float dst[9]) {
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < 9; i++) {
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dst[i] = SkScalarToFloat(matrix->get(i));
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_set3x3(ANPMatrix* matrix, const float src[9]) {
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = 0; i < 9; i++) {
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        matrix->set(i, SkFloatToScalar(src[i]));
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_setIdentity(ANPMatrix* matrix) {
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->reset();
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_preTranslate(ANPMatrix* matrix, float tx, float ty) {
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->preTranslate(SkFloatToScalar(tx), SkFloatToScalar(ty));
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_postTranslate(ANPMatrix* matrix, float tx, float ty) {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->postTranslate(SkFloatToScalar(tx), SkFloatToScalar(ty));
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_preScale(ANPMatrix* matrix, float sx, float sy) {
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->preScale(SkFloatToScalar(sx), SkFloatToScalar(sy));
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_postScale(ANPMatrix* matrix, float sx, float sy) {
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->postScale(SkFloatToScalar(sx), SkFloatToScalar(sy));
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_preSkew(ANPMatrix* matrix, float kx, float ky) {
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->preSkew(SkFloatToScalar(kx), SkFloatToScalar(ky));
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_postSkew(ANPMatrix* matrix, float kx, float ky) {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->postSkew(SkFloatToScalar(kx), SkFloatToScalar(ky));
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_preRotate(ANPMatrix* matrix, float degrees) {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->preRotate(SkFloatToScalar(degrees));
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_postRotate(ANPMatrix* matrix, float degrees) {
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->postRotate(SkFloatToScalar(degrees));
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_preConcat(ANPMatrix* matrix, const ANPMatrix* other) {
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->preConcat(*other);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_postConcat(ANPMatrix* matrix, const ANPMatrix* other) {
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->postConcat(*other);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool anp_invert(ANPMatrix* dst, const ANPMatrix* src) {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return src->invert(dst);
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void anp_mapPoints(ANPMatrix* matrix, float dst[], const float src[],
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          int32_t count) {
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SK_SCALAR_IS_FLOAT
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    matrix->mapPoints(reinterpret_cast<SkPoint*>(dst),
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                      reinterpret_cast<const SkPoint*>(src), count);
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int N = 64;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkPoint tmp[N];
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int n = count;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (n > N) {
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            n = N;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fromFloat(&tmp[0].fX, src, n*2);
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        matrix->mapPoints(tmp, n);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        toFloat(dst, &tmp[0].fX, n*2);
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        count -= n;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (count > 0);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSIGN(obj, name)   (obj)->name = anp_##name
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ANPMatrixInterfaceV0_Init(ANPInterface* value) {
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ANPMatrixInterfaceV0* i = reinterpret_cast<ANPMatrixInterfaceV0*>(value);
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, newMatrix);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, deleteMatrix);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, getFlags);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, copy);
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, get3x3);
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, set3x3);
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, setIdentity);
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, preTranslate);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, postTranslate);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, preScale);
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, postScale);
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, preSkew);
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, postSkew);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, preRotate);
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, postRotate);
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, preConcat);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, postConcat);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, invert);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSIGN(i, mapPoints);
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
168