egl/sfopenvg/riMath.h
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:45:05 +0100
branchEGL_MERGE
changeset 88 a5a3a8cb368e
parent 57 2bf8a359aa2f
permissions -rw-r--r--
Merge the OpenVG RI optimisations into the extra copy of sfopenvg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     1
#ifndef __RIMATH_H
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     2
#define __RIMATH_H
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     3
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     4
/*------------------------------------------------------------------------
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     5
 *
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     6
 * OpenVG 1.1 Reference Implementation
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     7
 * -----------------------------------
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     8
 *
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
     9
 * Copyright (c) 2007 The Khronos Group Inc.
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    10
 * Portions Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    11
 *
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    12
 * Permission is hereby granted, free of charge, to any person obtaining a
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    13
 * copy of this software and /or associated documentation files
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    14
 * (the "Materials "), to deal in the Materials without restriction,
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    15
 * including without limitation the rights to use, copy, modify, merge,
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    16
 * publish, distribute, sublicense, and/or sell copies of the Materials,
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    17
 * and to permit persons to whom the Materials are furnished to do so,
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    18
 * subject to the following conditions:
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    19
 *
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    20
 * The above copyright notice and this permission notice shall be included
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    21
 * in all copies or substantial portions of the Materials.
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    22
 *
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    23
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    24
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    25
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    26
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    27
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    28
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    29
 * THE USE OR OTHER DEALINGS IN THE MATERIALS.
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    30
 *
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    31
 *//**
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    32
 * \file
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    33
 * \brief	Math functions, Vector and Matrix classes.
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    34
 * \note
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    35
 *//*-------------------------------------------------------------------*/
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    36
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    37
#ifndef __RIDEFS_H
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    38
#include "riDefs.h"
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    39
#endif
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    40
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    41
#include <math.h>
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    42
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    43
namespace OpenVGRI
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    44
{
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    45
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    46
/*-------------------------------------------------------------------*//*!
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    47
* \brief
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    48
* \param
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    49
* \return
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    50
* \note
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    51
*//*-------------------------------------------------------------------*/
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    52
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    53
RI_INLINE int		RI_ISNAN(float a)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    54
{
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    55
    RIfloatInt p;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    56
    p.f = a;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    57
    unsigned int exponent = (p.i>>23) & 0xff;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    58
    unsigned int mantissa = p.i & 0x7fffff;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    59
    if(exponent == 255 && mantissa)
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    60
        return 1;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    61
    return 0;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    62
}
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    63
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    64
#if (RI_MANTISSA_BITS > 23)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    65
#error RI_MANTISSA_BITS is greater than 23
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    66
#elif (RI_EXPONENT_BITS > 8)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    67
#error RI_EXPONENT_BITS is greater than 8
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    68
#elif (RI_MANTISSA_BITS != 23) || (RI_EXPONENT_BITS != 8)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    69
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    70
class RIfloat
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    71
{
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    72
public:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    73
    RIfloat() : v(0.0f)						{ removeBits(); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    74
    RIfloat(float a) : v(a)					{ removeBits(); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    75
    RIfloat(double a) : v((float)a)			{ removeBits(); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    76
    RIfloat(int a) : v((float)a)			{ removeBits(); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    77
    RIfloat(unsigned int a) : v((float)a)	{ removeBits(); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    78
    RIfloat&	operator=(const RIfloat &a)	{ v = a.v; removeBits(); return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    79
    RIfloat&	operator+=(const RIfloat &a){ v += a.v; removeBits(); return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    80
    RIfloat&	operator-=(const RIfloat &a){ v -= a.v; removeBits(); return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    81
    RIfloat&	operator*=(const RIfloat &a){ v *= a.v; removeBits(); return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    82
    RIfloat&	operator/=(const RIfloat &a){ v /= a.v; removeBits(); return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    83
    RIfloat		operator-() const			{ return -v; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    84
    operator float() const					{ return v; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    85
    operator double() const					{ return (double)v; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    86
    operator int() const					{ return (int)v; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
    87
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    88
    friend RIfloat	operator+(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    89
    friend RIfloat	operator+(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    90
    friend RIfloat	operator+(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    91
    friend RIfloat	operator-(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    92
    friend RIfloat	operator-(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    93
    friend RIfloat	operator-(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    94
    friend RIfloat	operator*(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    95
    friend RIfloat	operator*(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    96
    friend RIfloat	operator*(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    97
    friend RIfloat	operator/(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    98
    friend RIfloat	operator/(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
    99
    friend RIfloat	operator/(const RIfloat &a, float b);
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   100
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   101
    friend bool		operator<(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   102
    friend bool		operator<(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   103
    friend bool		operator<(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   104
    friend bool		operator>(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   105
    friend bool		operator>(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   106
    friend bool		operator>(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   107
    friend bool		operator<=(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   108
    friend bool		operator<=(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   109
    friend bool		operator<=(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   110
    friend bool		operator>=(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   111
    friend bool		operator>=(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   112
    friend bool		operator>=(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   113
    friend bool		operator==(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   114
    friend bool		operator==(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   115
    friend bool		operator==(const RIfloat &a, float b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   116
    friend bool		operator!=(const RIfloat &a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   117
    friend bool		operator!=(float a, const RIfloat &b);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   118
    friend bool		operator!=(const RIfloat &a, float b);
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   119
private:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   120
    void	removeBits()
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   121
    {
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   122
        RIfloatInt p;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   123
        p.f = v;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   124
        unsigned int exponent = (p.i>>23) & 0xff;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   125
        if(exponent == 0 || exponent == 255)
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   126
            return;	//zero, denormal, infinite, or NaN
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   127
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   128
        p.i &= ~((1<<(23-RI_MANTISSA_BITS))-1);
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   129
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   130
#if (RI_EXPONENT_BITS != 8)
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   131
        if (exponent > 127 + (1 << (RI_EXPONENT_BITS-1)))
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   132
            exponent = 127 + (1 << (RI_EXPONENT_BITS-1));
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   133
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   134
        if (exponent < 127 + 1 - (1 << (RI_EXPONENT_BITS-1)))
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   135
            exponent = 127 + 1 - (1 << (RI_EXPONENT_BITS-1));
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   136
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   137
        p.i &= ~(0xff<<23);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   138
        p.i |= exponent<<23;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   139
#endif
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   140
        v = p.f;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   141
    }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   142
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   143
    float		v;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   144
};
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   145
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   146
RI_INLINE RIfloat operator+(const RIfloat &a, const RIfloat &b)	{ return RIfloat(a.v+b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   147
RI_INLINE RIfloat operator+(float a, const RIfloat &b)			{ return RIfloat(a+b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   148
RI_INLINE RIfloat operator+(const RIfloat &a, float b)			{ return RIfloat(a.v+b); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   149
RI_INLINE RIfloat operator-(const RIfloat &a, const RIfloat &b)	{ return RIfloat(a.v-b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   150
RI_INLINE RIfloat operator-(float a, const RIfloat &b)			{ return RIfloat(a-b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   151
RI_INLINE RIfloat operator-(const RIfloat &a, float b)			{ return RIfloat(a.v-b); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   152
RI_INLINE RIfloat operator*(const RIfloat &a, const RIfloat &b)	{ return RIfloat(a.v*b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   153
RI_INLINE RIfloat operator*(float a, const RIfloat &b)			{ return RIfloat(a*b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   154
RI_INLINE RIfloat operator*(const RIfloat &a, float b)			{ return RIfloat(a.v*b); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   155
RI_INLINE RIfloat operator/(const RIfloat &a, const RIfloat &b)	{ return RIfloat(a.v/b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   156
RI_INLINE RIfloat operator/(float a, const RIfloat &b)			{ return RIfloat(a/b.v); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   157
RI_INLINE RIfloat operator/(const RIfloat &a, float b)			{ return RIfloat(a.v/b); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   158
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   159
RI_INLINE bool operator<(const RIfloat &a, const RIfloat &b)	{ return a.v < b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   160
RI_INLINE bool operator<(float a, const RIfloat &b)				{ return a < b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   161
RI_INLINE bool operator<(const RIfloat &a, float b)				{ return a.v < b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   162
RI_INLINE bool operator>(const RIfloat &a, const RIfloat &b)	{ return a.v > b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   163
RI_INLINE bool operator>(float a, const RIfloat &b)				{ return a > b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   164
RI_INLINE bool operator>(const RIfloat &a, float b)				{ return a.v > b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   165
RI_INLINE bool operator<=(const RIfloat &a, const RIfloat &b)	{ return a.v <= b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   166
RI_INLINE bool operator<=(float a, const RIfloat &b)			{ return a <= b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   167
RI_INLINE bool operator<=(const RIfloat &a, float b)			{ return a.v <= b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   168
RI_INLINE bool operator>=(const RIfloat &a, const RIfloat &b)	{ return a.v >= b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   169
RI_INLINE bool operator>=(float a, const RIfloat &b)			{ return a >= b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   170
RI_INLINE bool operator>=(const RIfloat &a, float b)			{ return a.v >= b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   171
RI_INLINE bool operator==(const RIfloat &a, const RIfloat &b)	{ return a.v == b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   172
RI_INLINE bool operator==(float a, const RIfloat &b)			{ return a == b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   173
RI_INLINE bool operator==(const RIfloat &a, float b)			{ return a.v == b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   174
RI_INLINE bool operator!=(const RIfloat &a, const RIfloat &b)	{ return a.v != b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   175
RI_INLINE bool operator!=(float a, const RIfloat &b)			{ return a != b.v ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   176
RI_INLINE bool operator!=(const RIfloat &a, float b)			{ return a.v != b ? true : false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   177
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   178
#else
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   179
typedef float RIfloat;
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   180
#endif
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   181
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   182
#define	PI						3.141592654f
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   183
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   184
RI_INLINE int       RI_ROUND_TO_INT(RIfloat v)                  { return (v >= 0.0f) ? (int)(v+0.5f) : (int)(v-0.5f); }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   185
RI_INLINE RIfloat	RI_MAX(RIfloat a, RIfloat b)				{ return (a > b) ? a : b; }
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   186
RI_INLINE int		RI_MAX(int a, int b)						{ return (a > b) ? a : b; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   187
RI_INLINE RIfloat	RI_MIN(RIfloat a, RIfloat b)				{ return (a < b) ? a : b; }
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   188
RI_INLINE int		RI_MIN(int a, int b)						{ return (a < b) ? a : b; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   189
RI_INLINE RIfloat	RI_CLAMP(RIfloat a, RIfloat l, RIfloat h)	{ if(RI_ISNAN(a)) return l; RI_ASSERT(l <= h); return (a < l) ? l : (a > h) ? h : a; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   190
RI_INLINE void		RI_SWAP(RIfloat &a, RIfloat &b)				{ RIfloat tmp = a; a = b; b = tmp; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   191
RI_INLINE RIfloat	RI_ABS(RIfloat a)							{ return (a < 0.0f) ? -a : a; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   192
RI_INLINE RIfloat	RI_SQR(RIfloat a)							{ return a * a; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   193
RI_INLINE RIfloat	RI_DEG_TO_RAD(RIfloat a)					{ return a * PI / 180.0f; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   194
RI_INLINE RIfloat	RI_RAD_TO_DEG(RIfloat a)					{ return a * 180.0f/ PI; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   195
RI_INLINE RIfloat	RI_MOD(RIfloat a, RIfloat b)				{ if(RI_ISNAN(a) || RI_ISNAN(b)) return 0.0f; RI_ASSERT(b >= 0.0f); if(b == 0.0f) return 0.0f; RIfloat f = (RIfloat)fmod(a, b); if(f < 0.0f) f += b; RI_ASSERT(f >= 0.0f && f <= b); return f; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   196
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   197
#define RI_ANY_SWAP(type, a, b) {type tmp = a; a = b; b = tmp;}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   198
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   199
RI_INLINE void      RI_INT16_SWAP(RIint16 &a, RIint16 &b) {RIint16 tmp = a; a = b; b = tmp;}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   200
RI_INLINE int       RI_INT_ABS(int a)                   { return (a >= 0) ? a : -a; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   201
RI_INLINE int		RI_INT_MAX(int a, int b)			{ return (a > b) ? a : b; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   202
RI_INLINE int		RI_INT_MIN(int a, int b)			{ return (a < b) ? a : b; }
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   203
RI_INLINE int       RI_INT_CLAMP(int a, int l, int h)   { return (a < l) ? l : (a > h) ? h : a; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   204
RI_INLINE void		RI_INT_SWAP(int &a, int &b)			{ int tmp = a; a = b; b = tmp; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   205
RI_INLINE int		RI_INT_MOD(int a, int b)			{ RI_ASSERT(b >= 0); if(!b) return 0; int i = a % b; if(i < 0) i += b; RI_ASSERT(i >= 0 && i < b); return i; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   206
RI_INLINE int		RI_INT_ADDSATURATE(int a, int b)	{ RI_ASSERT(b >= 0); int r = a + b; return (r >= a) ? r : RI_INT32_MAX; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   207
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   208
RI_INLINE int       RI_SHL(int a, int sh)
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   209
{
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   210
    RI_ASSERT(sh >= 0 && sh <= 31);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   211
    int r = a << sh;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   212
    RI_ASSERT(a >= 0 ? (r >= 0) : (r < 0));
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   213
    return r;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   214
}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   215
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   216
RI_INLINE int RI_SHR(int a, int sh)
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   217
{
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   218
    RI_ASSERT(sh >= 0 && sh <= 31);
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   219
    int r = a >> sh;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   220
    return r;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   221
}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   222
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   223
class Matrix3x3;
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   224
class Vector2;
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   225
class Vector3;
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   226
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   227
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   228
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   229
//MatrixRxC, R = number of rows, C = number of columns
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   230
//indexing: matrix[row][column]
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   231
//Matrix3x3 inline functions cannot be inside the class because Vector3 is not defined yet when Matrix3x3 is defined
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   232
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   233
class Matrix3x3
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   234
{
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   235
public:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   236
    RI_INLINE					Matrix3x3		();						//initialized to identity
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   237
    RI_INLINE					Matrix3x3		( const Matrix3x3& m );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   238
    RI_INLINE					Matrix3x3		( RIfloat m00, RIfloat m01, RIfloat m02, RIfloat m10, RIfloat m11, RIfloat m12, RIfloat m20, RIfloat m21, RIfloat m22 );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   239
    RI_INLINE					~Matrix3x3		();
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   240
    RI_INLINE Matrix3x3&		operator=		( const Matrix3x3& m );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   241
    RI_INLINE Vector3&			operator[]		( int i );				//returns a row vector
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   242
    RI_INLINE const Vector3&	operator[]		( int i ) const;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   243
    RI_INLINE void				set				( RIfloat m00, RIfloat m01, RIfloat m02, RIfloat m10, RIfloat m11, RIfloat m12, RIfloat m20, RIfloat m21, RIfloat m22 );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   244
    RI_INLINE const Vector3		getRow			( int i ) const;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   245
    RI_INLINE const Vector3		getColumn		( int i ) const;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   246
    RI_INLINE void				setRow			( int i, const Vector3& v );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   247
    RI_INLINE void				setColumn		( int i, const Vector3& v );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   248
    RI_INLINE void				operator*=		( const Matrix3x3& m );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   249
    RI_INLINE void				operator*=		( RIfloat f );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   250
    RI_INLINE void				operator+=		( const Matrix3x3& m );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   251
    RI_INLINE void				operator-=		( const Matrix3x3& m );
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   252
    RI_INLINE const Matrix3x3	operator-		() const;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   253
    RI_INLINE void				identity		();
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   254
    RI_INLINE void				transpose		();
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   255
    bool						invert			();	//if the matrix is singular, returns false and leaves it unmodified
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   256
    RI_INLINE RIfloat				det				() const;
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   257
    RI_INLINE bool				isAffine		() const;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   258
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   259
private:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   260
    RIfloat						matrix[3][3];
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   261
};
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   262
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   263
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   264
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   265
class Vector2
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   266
{
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   267
public:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   268
    RI_INLINE					Vector2			() : x(0.0f), y(0.0f)					{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   269
    RI_INLINE					Vector2			( const Vector2& v ) : x(v.x), y(v.y)	{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   270
    RI_INLINE					Vector2			( RIfloat fx, RIfloat fy ) : x(fx), y(fy)	{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   271
    RI_INLINE					~Vector2		()								{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   272
    RI_INLINE Vector2&			operator=		( const Vector2& v )			{ x = v.x; y = v.y; return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   273
    RI_INLINE RIfloat&			operator[]		( int i )						{ RI_ASSERT(i>=0&&i<2); return (&x)[i]; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   274
    RI_INLINE const RIfloat&	operator[]		( int i ) const					{ RI_ASSERT(i>=0&&i<2); return (&x)[i]; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   275
    RI_INLINE void				set				( RIfloat fx, RIfloat fy )			{ x = fx; y = fy; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   276
    RI_INLINE void				operator*=		( RIfloat f )						{ x *= f; y *= f; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   277
    RI_INLINE void				operator+=		( const Vector2& v )			{ x += v.x; y += v.y; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   278
    RI_INLINE void				operator-=		( const Vector2& v )			{ x -= v.x; y -= v.y; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   279
    RI_INLINE const Vector2		operator-		() const						{ return Vector2(-x,-y); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   280
    //if the vector is zero, returns false and leaves it unmodified
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   281
    RI_INLINE bool				normalize		()								{ double l = (double)x*(double)x+(double)y*(double)y; if( l == 0.0 ) return false; l = 1.0 / sqrt(l); x = (RIfloat)((double)x * l); y = (RIfloat)((double)y * l); return true; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   282
    RI_INLINE RIfloat			length			() const						{ return (RIfloat)sqrt((double)x*(double)x+(double)y*(double)y); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   283
    RI_INLINE void				scale			( const Vector2& v )			{ x *= v.x; y *= v.y; }	//component-wise scale
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   284
    RI_INLINE void				negate			()								{ x = -x; y = -y; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   285
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   286
    RIfloat						x,y;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   287
};
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   288
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   289
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   290
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   291
class Vector3
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   292
{
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   293
public:
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   294
    RI_INLINE					Vector3			() : x(0.0f), y(0.0f), z(0.0f)							{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   295
    RI_INLINE					Vector3			( const Vector3& v ) : x(v.x), y(v.y), z(v.z)			{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   296
    RI_INLINE					Vector3			( RIfloat fx, RIfloat fy, RIfloat fz ) : x(fx), y(fy), z(fz)	{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   297
    RI_INLINE					~Vector3		()								{}
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   298
    RI_INLINE Vector3&			operator=		( const Vector3& v )			{ x = v.x; y = v.y; z = v.z; return *this; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   299
    RI_INLINE RIfloat&			operator[]		( int i )						{ RI_ASSERT(i>=0&&i<3); return (&x)[i]; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   300
    RI_INLINE const RIfloat&	operator[]		( int i ) const					{ RI_ASSERT(i>=0&&i<3); return (&x)[i]; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   301
    RI_INLINE void				set				( RIfloat fx, RIfloat fy, RIfloat fz ){ x = fx; y = fy; z = fz; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   302
    RI_INLINE void				operator*=		( RIfloat f )						{ x *= f; y *= f; z *= f; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   303
    RI_INLINE void				operator+=		( const Vector3& v )			{ x += v.x; y += v.y; z += v.z; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   304
    RI_INLINE void				operator-=		( const Vector3& v )			{ x -= v.x; y -= v.y; z -= v.z; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   305
    RI_INLINE const Vector3		operator-		() const						{ return Vector3(-x,-y,-z); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   306
    //if the vector is zero, returns false and leaves it unmodified
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   307
    RI_INLINE bool				normalize		()								{ double l = (double)x*(double)x+(double)y*(double)y+(double)z*(double)z; if( l == 0.0 ) return false; l = 1.0 / sqrt(l); x = (RIfloat)((double)x * l); y = (RIfloat)((double)y * l); z = (RIfloat)((double)z * l); return true; }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   308
    RI_INLINE RIfloat			length			() const						{ return (RIfloat)sqrt((double)x*(double)x+(double)y*(double)y+(double)z*(double)z); }
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   309
    RI_INLINE void				scale			( const Vector3& v )			{ x *= v.x; y *= v.y; z *= v.z; }	//component-wise scale
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   310
    RI_INLINE void				negate			()								{ x = -x; y = -y; z = -z; }
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   311
88
a5a3a8cb368e Merge the OpenVG RI optimisations into the extra copy of sfopenvg
William Roberts <williamr@symbian.org>
parents: 57
diff changeset
   312
    RIfloat						x,y,z;
57
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   313
};
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   314
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   315
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   316
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   317
//Vector2 global functions
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   318
RI_INLINE bool			operator==	( const Vector2& v1, const Vector2& v2 )	{ return (v1.x == v2.x) && (v1.y == v2.y); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   319
RI_INLINE bool			operator!=	( const Vector2& v1, const Vector2& v2 )	{ return (v1.x != v2.x) || (v1.y != v2.y); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   320
RI_INLINE bool			isEqual		( const Vector2& v1, const Vector2& v2, RIfloat epsilon )	{ return RI_SQR(v2.x-v1.x) + RI_SQR(v2.y-v1.y) <= epsilon*epsilon; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   321
RI_INLINE bool			isZero		( const Vector2& v )						{ return (v.x == 0.0f) && (v.y == 0.0f); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   322
RI_INLINE const Vector2	operator*	( RIfloat f, const Vector2& v )				{ return Vector2(v.x*f,v.y*f); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   323
RI_INLINE const Vector2	operator*	( const Vector2& v, RIfloat f )				{ return Vector2(v.x*f,v.y*f); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   324
RI_INLINE const Vector2	operator+	( const Vector2& v1, const Vector2& v2 )	{ return Vector2(v1.x+v2.x, v1.y+v2.y); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   325
RI_INLINE const Vector2	operator-	( const Vector2& v1, const Vector2& v2 )	{ return Vector2(v1.x-v2.x, v1.y-v2.y); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   326
RI_INLINE RIfloat		dot			( const Vector2& v1, const Vector2& v2 )	{ return v1.x*v2.x+v1.y*v2.y; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   327
//if v is a zero vector, returns a zero vector
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   328
RI_INLINE const Vector2	normalize	( const Vector2& v )						{ double l = (double)v.x*(double)v.x+(double)v.y*(double)v.y; if( l != 0.0 ) l = 1.0 / sqrt(l); return Vector2((RIfloat)((double)v.x * l), (RIfloat)((double)v.y * l)); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   329
//if onThis is a zero vector, returns a zero vector
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   330
RI_INLINE const Vector2	project		( const Vector2& v, const Vector2& onThis ) { RIfloat l = dot(onThis,onThis); if( l != 0.0f ) l = dot(v, onThis)/l; return onThis * l; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   331
RI_INLINE const Vector2	lerp		( const Vector2& v1, const Vector2& v2, RIfloat ratio )	{ return v1 + ratio * (v2 - v1); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   332
RI_INLINE const Vector2	scale		( const Vector2& v1, const Vector2& v2 )	{ return Vector2(v1.x*v2.x, v1.y*v2.y); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   333
//matrix * column vector. The input vector2 is implicitly expanded to (x,y,1)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   334
RI_INLINE const Vector2 affineTransform( const Matrix3x3& m, const Vector2& v )	{ RI_ASSERT(m.isAffine()); return Vector2(v.x * m[0][0] + v.y * m[0][1] + m[0][2], v.x * m[1][0] + v.y * m[1][1] + m[1][2]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   335
//matrix * column vector. The input vector2 is implicitly expanded to (x,y,0)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   336
RI_INLINE const Vector2 affineTangentTransform(const Matrix3x3& m, const Vector2& v)	{ RI_ASSERT(m.isAffine()); return Vector2(v.x * m[0][0] + v.y * m[0][1], v.x * m[1][0] + v.y * m[1][1]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   337
RI_INLINE const Vector2 perpendicularCW(const Vector2& v)						{ return Vector2(v.y, -v.x); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   338
RI_INLINE const Vector2 perpendicularCCW(const Vector2& v)						{ return Vector2(-v.y, v.x); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   339
RI_INLINE const Vector2 perpendicular(const Vector2& v, bool cw)				{ if(cw) return Vector2(v.y, -v.x); return Vector2(-v.y, v.x); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   340
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   341
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   342
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   343
//Vector3 global functions
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   344
RI_INLINE bool			operator==	( const Vector3& v1, const Vector3& v2 )	{ return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   345
RI_INLINE bool			operator!=	( const Vector3& v1, const Vector3& v2 )	{ return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   346
RI_INLINE bool			isEqual		( const Vector3& v1, const Vector3& v2, RIfloat epsilon )	{ return RI_SQR(v2.x-v1.x) + RI_SQR(v2.y-v1.y) + RI_SQR(v2.z-v1.z) <= epsilon*epsilon; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   347
RI_INLINE const Vector3	operator*	( RIfloat f, const Vector3& v )				{ return Vector3(v.x*f,v.y*f,v.z*f); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   348
RI_INLINE const Vector3	operator*	( const Vector3& v, RIfloat f )				{ return Vector3(v.x*f,v.y*f,v.z*f); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   349
RI_INLINE const Vector3	operator+	( const Vector3& v1, const Vector3& v2 )	{ return Vector3(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   350
RI_INLINE const Vector3	operator-	( const Vector3& v1, const Vector3& v2 )	{ return Vector3(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   351
RI_INLINE RIfloat		dot			( const Vector3& v1, const Vector3& v2 )	{ return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   352
RI_INLINE const Vector3	cross		( const Vector3& v1, const Vector3& v2 )	{ return Vector3( v1.y*v2.z-v1.z*v2.y, v1.z*v2.x-v1.x*v2.z, v1.x*v2.y-v1.y*v2.x ); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   353
//if v is a zero vector, returns a zero vector
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   354
RI_INLINE const Vector3	normalize	( const Vector3& v )						{ double l = (double)v.x*(double)v.x+(double)v.y*(double)v.y+(double)v.z*(double)v.z; if( l != 0.0 ) l = 1.0 / sqrt(l); return Vector3((RIfloat)((double)v.x * l), (RIfloat)((double)v.y * l), (RIfloat)((double)v.z * l)); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   355
RI_INLINE const Vector3	lerp		( const Vector3& v1, const Vector3& v2, RIfloat ratio )	{ return v1 + ratio * (v2 - v1); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   356
RI_INLINE const Vector3	scale		( const Vector3& v1, const Vector3& v2 )	{ return Vector3(v1.x*v2.x, v1.y*v2.y, v1.z*v2.z); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   357
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   358
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   359
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   360
//matrix * column vector
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   361
RI_INLINE const Vector3	operator*	( const Matrix3x3& m, const Vector3& v)		{ return Vector3( v.x*m[0][0]+v.y*m[0][1]+v.z*m[0][2], v.x*m[1][0]+v.y*m[1][1]+v.z*m[1][2], v.x*m[2][0]+v.y*m[2][1]+v.z*m[2][2] ); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   362
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   363
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   364
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   365
//Matrix3x3 global functions
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   366
RI_INLINE bool				operator==	( const Matrix3x3& m1, const Matrix3x3& m2 )	{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) if( m1[i][j] != m2[i][j] ) return false; return true; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   367
RI_INLINE bool				operator!=	( const Matrix3x3& m1, const Matrix3x3& m2 )	{ return !(m1 == m2); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   368
RI_INLINE const Matrix3x3	operator*	( const Matrix3x3& m1, const Matrix3x3& m2 )	{ Matrix3x3 t; for(int i=0;i<3;i++) for(int j=0;j<3;j++) t[i][j] = m1[i][0] * m2[0][j] + m1[i][1] * m2[1][j] + m1[i][2] * m2[2][j]; return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   369
RI_INLINE const Matrix3x3	operator*	( RIfloat f, const Matrix3x3& m )					{ Matrix3x3 t(m); t *= f; return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   370
RI_INLINE const Matrix3x3	operator*	( const Matrix3x3& m, RIfloat f )					{ Matrix3x3 t(m); t *= f; return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   371
RI_INLINE const Matrix3x3	operator+	( const Matrix3x3& m1, const Matrix3x3& m2 )	{ Matrix3x3 t(m1); t += m2; return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   372
RI_INLINE const Matrix3x3	operator-	( const Matrix3x3& m1, const Matrix3x3& m2 )	{ Matrix3x3 t(m1); t -= m2; return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   373
RI_INLINE const Matrix3x3	transpose	( const Matrix3x3& m )							{ Matrix3x3 t(m); t.transpose(); return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   374
// if the matrix is singular, returns it unmodified
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   375
RI_INLINE const Matrix3x3	invert		( const Matrix3x3& m )							{ Matrix3x3 t(m); t.invert(); return t; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   376
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   377
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   378
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   379
//Matrix3x3 inline functions (cannot be inside the class because Vector3 is not defined yet when Matrix3x3 is defined)
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   380
RI_INLINE					Matrix3x3::Matrix3x3	()									{ identity(); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   381
RI_INLINE					Matrix3x3::Matrix3x3	( const Matrix3x3& m )				{ *this = m; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   382
RI_INLINE					Matrix3x3::Matrix3x3	( RIfloat m00, RIfloat m01, RIfloat m02, RIfloat m10, RIfloat m11, RIfloat m12, RIfloat m20, RIfloat m21, RIfloat m22 )	{ set(m00,m01,m02,m10,m11,m12,m20,m21,m22); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   383
RI_INLINE					Matrix3x3::~Matrix3x3	()									{}
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   384
RI_INLINE Matrix3x3&		Matrix3x3::operator=	( const Matrix3x3& m )				{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) matrix[i][j] = m.matrix[i][j]; return *this; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   385
RI_INLINE Vector3&			Matrix3x3::operator[]	( int i )							{ RI_ASSERT(i>=0&&i<3); return (Vector3&)matrix[i][0]; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   386
RI_INLINE const Vector3&	Matrix3x3::operator[]	( int i ) const						{ RI_ASSERT(i>=0&&i<3); return (const Vector3&)matrix[i][0]; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   387
RI_INLINE void				Matrix3x3::set			( RIfloat m00, RIfloat m01, RIfloat m02, RIfloat m10, RIfloat m11, RIfloat m12, RIfloat m20, RIfloat m21, RIfloat m22 ) { matrix[0][0] = m00; matrix[0][1] = m01; matrix[0][2] = m02; matrix[1][0] = m10; matrix[1][1] = m11; matrix[1][2] = m12; matrix[2][0] = m20; matrix[2][1] = m21; matrix[2][2] = m22; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   388
RI_INLINE const Vector3		Matrix3x3::getRow		( int i ) const						{ RI_ASSERT(i>=0&&i<3); return Vector3(matrix[i][0], matrix[i][1], matrix[i][2]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   389
RI_INLINE const Vector3		Matrix3x3::getColumn	( int i ) const						{ RI_ASSERT(i>=0&&i<3); return Vector3(matrix[0][i], matrix[1][i], matrix[2][i]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   390
RI_INLINE void				Matrix3x3::setRow		( int i, const Vector3& v )			{ RI_ASSERT(i>=0&&i<3); matrix[i][0] = v.x; matrix[i][1] = v.y; matrix[i][2] = v.z; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   391
RI_INLINE void				Matrix3x3::setColumn	( int i, const Vector3& v )			{ RI_ASSERT(i>=0&&i<3); matrix[0][i] = v.x; matrix[1][i] = v.y; matrix[2][i] = v.z; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   392
RI_INLINE void				Matrix3x3::operator*=	( const Matrix3x3& m )				{ *this = *this * m; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   393
RI_INLINE void				Matrix3x3::operator*=	( RIfloat f )							{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) matrix[i][j] *= f; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   394
RI_INLINE void				Matrix3x3::operator+=	( const Matrix3x3& m )				{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) matrix[i][j] += m.matrix[i][j]; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   395
RI_INLINE void				Matrix3x3::operator-=	( const Matrix3x3& m )				{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) matrix[i][j] -= m.matrix[i][j]; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   396
RI_INLINE const Matrix3x3	Matrix3x3::operator-	() const							{ return Matrix3x3( -matrix[0][0],-matrix[0][1],-matrix[0][2], -matrix[1][0],-matrix[1][1],-matrix[1][2], -matrix[2][0],-matrix[2][1],-matrix[2][2]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   397
RI_INLINE void				Matrix3x3::identity		()									{ for(int i=0;i<3;i++) for(int j=0;j<3;j++) matrix[i][j] = (i == j) ? 1.0f : 0.0f; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   398
RI_INLINE void				Matrix3x3::transpose	()									{ RI_SWAP(matrix[1][0], matrix[0][1]); RI_SWAP(matrix[2][0], matrix[0][2]); RI_SWAP(matrix[2][1], matrix[1][2]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   399
RI_INLINE RIfloat			Matrix3x3::det			() const							{ return matrix[0][0] * (matrix[1][1]*matrix[2][2] - matrix[2][1]*matrix[1][2]) + matrix[0][1] * (matrix[2][0]*matrix[1][2] - matrix[1][0]*matrix[2][2]) + matrix[0][2] * (matrix[1][0]*matrix[2][1] - matrix[2][0]*matrix[1][1]); }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   400
RI_INLINE bool				Matrix3x3::isAffine		() const							{ if(matrix[2][0] == 0.0f && matrix[2][1] == 0.0f && matrix[2][2] == 1.0f) return true; return false; }
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   401
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   402
//==============================================================================================
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   403
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   404
}	//namespace OpenVGRI
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   405
2bf8a359aa2f Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg
Jose Thachil<jose.thachil@cell-telecom.com>
parents:
diff changeset
   406
#endif /* __RIMATH_H */