diff options
Diffstat (limited to 'src/gallium/state_trackers/vega/matrix.h')
-rw-r--r-- | src/gallium/state_trackers/vega/matrix.h | 462 |
1 files changed, 0 insertions, 462 deletions
diff --git a/src/gallium/state_trackers/vega/matrix.h b/src/gallium/state_trackers/vega/matrix.h deleted file mode 100644 index 794c7e7a4ce..00000000000 --- a/src/gallium/state_trackers/vega/matrix.h +++ /dev/null @@ -1,462 +0,0 @@ -/************************************************************************** - * - * Copyright 2009 VMware, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - -#ifndef MATRIX_H -#define MATRIX_H - -#include "VG/openvg.h" - -#include "pipe/p_compiler.h" -#include "util/u_math.h" - -#include <stdio.h> -#include <math.h> - -#define floatsEqual(x, y) (fabs(x - y) <= 0.00001f * MIN2(fabs(x), fabs(y))) -#define floatIsZero(x) (floatsEqual((x) + 1, 1)) -#define ABS(x) (fabsf(x)) - -#define DEGREES_TO_RADIANS(d) (0.0174532925199 * (d)) -#define FLT_TO_INT(flt) float_to_int_floor(((VGuint*)&(flt))[0]) - -static INLINE VGint float_to_int_floor(VGuint bits) -{ - int sign = (bits >> 31) ? -1 : 1; - int exp = ((bits >> 23) & 255) - 127; - int mant = bits & 0x007fffff; - int sh = 23 - exp; - - /* abs(value) >= 2^31 -> clamp. */ - - if (exp >= 31) - return (VGint)((sign < 0) ? 0x80000000u : 0x7fffffffu); - - /* abs(value) < 1 -> return -1 or 0. */ - - if (exp < 0) - return (sign < 0 && (exp > -127 || mant != 0)) ? -1 : 0; - - /* abs(value) >= 2^23 -> shift left. */ - - mant |= 0x00800000; - if (sh <= 0) - return sign * (mant << -sh); - - /* Negative -> add a rounding term. */ - - if (sign < 0) - mant += (1 << sh) - 1; - - /* Shift right to obtain the result. */ - - return sign * (mant >> sh); -} - - -struct matrix { - VGfloat m[9]; -}; - -static INLINE void matrix_init(struct matrix *mat, - const VGfloat *val) -{ - memcpy(mat->m, val, sizeof(VGfloat) * 9); -} - -static INLINE void matrix_inits(struct matrix *mat, - VGfloat m11, VGfloat m12, VGfloat m13, - VGfloat m21, VGfloat m22, VGfloat m23, - VGfloat m31, VGfloat m32, VGfloat m33) -{ - mat->m[0] = m11; mat->m[1] = m12; mat->m[2] = m13; - mat->m[3] = m21; mat->m[4] = m22; mat->m[5] = m23; - mat->m[6] = m31; mat->m[7] = m32; mat->m[8] = m33; -} - -static INLINE void matrix_load_identity(struct matrix *matrix) -{ - static const VGfloat identity[9] = {1.f, 0.f, 0.f, - 0.f, 1.f, 0.f, - 0.f, 0.f, 1.f}; - memcpy(matrix->m, identity, sizeof(identity)); -} - -static INLINE VGboolean matrix_is_identity(struct matrix *matrix) -{ - return floatsEqual(matrix->m[0], 1) && floatIsZero(matrix->m[1]) && - floatIsZero(matrix->m[2]) && - floatIsZero(matrix->m[3]) && floatsEqual(matrix->m[4], 1) && - floatIsZero(matrix->m[5]) && - floatIsZero(matrix->m[6]) && floatIsZero(matrix->m[7]) && - floatIsZero(matrix->m[8]); -} - -static INLINE VGboolean matrix_is_affine(struct matrix *matrix) -{ - return floatIsZero(matrix->m[2]) && floatIsZero(matrix->m[5]) - && floatsEqual(matrix->m[8], 1); -} - - -static INLINE void matrix_make_affine(struct matrix *matrix) -{ - matrix->m[2] = 0.f; - matrix->m[5] = 0.f; - matrix->m[8] = 1.f; -} - -static INLINE void matrix_mult(struct matrix *dst, - const struct matrix *src) -{ - VGfloat m11 = dst->m[0]*src->m[0] + dst->m[3]*src->m[1] + dst->m[6]*src->m[2]; - VGfloat m12 = dst->m[0]*src->m[3] + dst->m[3]*src->m[4] + dst->m[6]*src->m[5]; - VGfloat m13 = dst->m[0]*src->m[6] + dst->m[3]*src->m[7] + dst->m[6]*src->m[8]; - - VGfloat m21 = dst->m[1]*src->m[0] + dst->m[4]*src->m[1] + dst->m[7]*src->m[2]; - VGfloat m22 = dst->m[1]*src->m[3] + dst->m[4]*src->m[4] + dst->m[7]*src->m[5]; - VGfloat m23 = dst->m[1]*src->m[6] + dst->m[4]*src->m[7] + dst->m[7]*src->m[8]; - - VGfloat m31 = dst->m[2]*src->m[0] + dst->m[5]*src->m[1] + dst->m[8]*src->m[2]; - VGfloat m32 = dst->m[2]*src->m[3] + dst->m[5]*src->m[4] + dst->m[8]*src->m[5]; - VGfloat m33 = dst->m[2]*src->m[6] + dst->m[5]*src->m[7] + dst->m[8]*src->m[8]; - - dst->m[0] = m11; dst->m[1] = m21; dst->m[2] = m31; - dst->m[3] = m12; dst->m[4] = m22; dst->m[5] = m32; - dst->m[6] = m13; dst->m[7] = m23; dst->m[8] = m33; -} - - -static INLINE void matrix_map_point(struct matrix *mat, - VGfloat x, VGfloat y, - VGfloat *out_x, VGfloat *out_y) -{ - /* to be able to do matrix_map_point(m, x, y, &x, &y) use - * temporaries */ - VGfloat tmp_x = x, tmp_y = y; - - *out_x = mat->m[0]*tmp_x + mat->m[3]*tmp_y + mat->m[6]; - *out_y = mat->m[1]*tmp_x + mat->m[4]*tmp_y + mat->m[7]; - if (!matrix_is_affine(mat)) { - VGfloat w = 1/(mat->m[2]*tmp_x + mat->m[5]*tmp_y + mat->m[8]); - *out_x *= w; - *out_y *= w; - } -} - -static INLINE void matrix_translate(struct matrix *dst, - VGfloat tx, VGfloat ty) -{ - if (!matrix_is_affine(dst)) { - struct matrix trans_matrix; - matrix_load_identity(&trans_matrix); - trans_matrix.m[6] = tx; - trans_matrix.m[7] = ty; - matrix_mult(dst, &trans_matrix); - } else { - dst->m[6] += tx*dst->m[0] + ty*dst->m[3]; - dst->m[7] += ty*dst->m[4] + tx*dst->m[1]; - } -} - -static INLINE void matrix_scale(struct matrix *dst, - VGfloat sx, VGfloat sy) -{ - if (!matrix_is_affine(dst)) { - struct matrix scale_matrix; - matrix_load_identity(&scale_matrix); - scale_matrix.m[0] = sx; - scale_matrix.m[4] = sy; - matrix_mult(dst, &scale_matrix); - } else { - dst->m[0] *= sx; dst->m[1] *= sx; - dst->m[3] *= sy; dst->m[4] *= sy; - } -} - -static INLINE void matrix_shear(struct matrix *dst, - VGfloat shx, VGfloat shy) -{ - struct matrix shear_matrix; - matrix_load_identity(&shear_matrix); - shear_matrix.m[1] = shy; - shear_matrix.m[3] = shx; - matrix_mult(dst, &shear_matrix); -} - -static INLINE void matrix_rotate(struct matrix *dst, - VGfloat angle) -{ - struct matrix mat; - float sin_val = 0; - float cos_val = 0; - - - if (floatsEqual(angle, 90) || floatsEqual(angle, -270)) - sin_val = 1.f; - else if (floatsEqual(angle, 270) || floatsEqual(angle, -90)) - sin_val = -1.f; - else if (floatsEqual(angle, 180)) - cos_val = -1.f; - else { - double radians = DEGREES_TO_RADIANS(angle); - sin_val = (float) sin(radians); - cos_val = (float) cos(radians); - } - - if (!matrix_is_affine(dst)) { - matrix_load_identity(&mat); - mat.m[0] = cos_val; mat.m[1] = sin_val; - mat.m[3] = -sin_val; mat.m[4] = cos_val; - - matrix_mult(dst, &mat); - } else { - VGfloat m11 = cos_val*dst->m[0] + sin_val*dst->m[3]; - VGfloat m12 = cos_val*dst->m[1] + sin_val*dst->m[4]; - VGfloat m21 = -sin_val*dst->m[0] + cos_val*dst->m[3]; - VGfloat m22 = -sin_val*dst->m[1] + cos_val*dst->m[4]; - dst->m[0] = m11; dst->m[1] = m12; - dst->m[3] = m21; dst->m[4] = m22; - } -} - - -static INLINE VGfloat matrix_determinant(struct matrix *mat) -{ - return mat->m[0]*(mat->m[8]*mat->m[4]-mat->m[7]*mat->m[5]) - - mat->m[3]*(mat->m[8]*mat->m[1]-mat->m[7]*mat->m[2])+ - mat->m[6]*(mat->m[5]*mat->m[1]-mat->m[4]*mat->m[2]); -} - - -static INLINE void matrix_adjoint(struct matrix *mat) -{ - VGfloat h[9]; - h[0] = mat->m[4]*mat->m[8] - mat->m[5]*mat->m[7]; - h[3] = mat->m[5]*mat->m[6] - mat->m[3]*mat->m[8]; - h[6] = mat->m[3]*mat->m[7] - mat->m[4]*mat->m[6]; - h[1] = mat->m[2]*mat->m[7] - mat->m[1]*mat->m[8]; - h[4] = mat->m[0]*mat->m[8] - mat->m[2]*mat->m[6]; - h[7] = mat->m[1]*mat->m[6] - mat->m[0]*mat->m[7]; - h[2] = mat->m[1]*mat->m[5] - mat->m[2]*mat->m[4]; - h[5] = mat->m[2]*mat->m[3] - mat->m[0]*mat->m[5]; - h[8] = mat->m[0]*mat->m[4] - mat->m[1]*mat->m[3]; - - - memcpy(mat->m, h, sizeof(VGfloat) * 9); -} - -static INLINE void matrix_divs(struct matrix *mat, - VGfloat s) -{ - mat->m[0] /= s; - mat->m[1] /= s; - mat->m[2] /= s; - mat->m[3] /= s; - mat->m[4] /= s; - mat->m[5] /= s; - mat->m[6] /= s; - mat->m[7] /= s; - mat->m[8] /= s; -} - -static INLINE VGboolean matrix_invert(struct matrix *mat) -{ - VGfloat det = matrix_determinant(mat); - - if (floatIsZero(det)) - return VG_FALSE; - - matrix_adjoint(mat); - matrix_divs(mat, det); - return VG_TRUE; -} - -static INLINE VGboolean matrix_is_invertible(struct matrix *mat) -{ - return !floatIsZero(matrix_determinant(mat)); -} - - -static INLINE VGboolean matrix_square_to_quad(VGfloat dx0, VGfloat dy0, - VGfloat dx1, VGfloat dy1, - VGfloat dx3, VGfloat dy3, - VGfloat dx2, VGfloat dy2, - struct matrix *mat) -{ - VGfloat ax = dx0 - dx1 + dx2 - dx3; - VGfloat ay = dy0 - dy1 + dy2 - dy3; - - if (floatIsZero(ax) && floatIsZero(ay)) { - /* affine case */ - matrix_inits(mat, - dx1 - dx0, dy1 - dy0, 0, - dx2 - dx1, dy2 - dy1, 0, - dx0, dy0, 1); - } else { - VGfloat a, b, c, d, e, f, g, h; - VGfloat ax1 = dx1 - dx2; - VGfloat ax2 = dx3 - dx2; - VGfloat ay1 = dy1 - dy2; - VGfloat ay2 = dy3 - dy2; - - /* determinants */ - VGfloat gtop = ax * ay2 - ax2 * ay; - VGfloat htop = ax1 * ay - ax * ay1; - VGfloat bottom = ax1 * ay2 - ax2 * ay1; - - if (!bottom) - return VG_FALSE; - - g = gtop / bottom; - h = htop / bottom; - - a = dx1 - dx0 + g * dx1; - b = dx3 - dx0 + h * dx3; - c = dx0; - d = dy1 - dy0 + g * dy1; - e = dy3 - dy0 + h * dy3; - f = dy0; - - matrix_inits(mat, - a, d, g, - b, e, h, - c, f, 1.f); - } - - return VG_TRUE; -} - -static INLINE VGboolean matrix_quad_to_square(VGfloat sx0, VGfloat sy0, - VGfloat sx1, VGfloat sy1, - VGfloat sx2, VGfloat sy2, - VGfloat sx3, VGfloat sy3, - struct matrix *mat) -{ - if (!matrix_square_to_quad(sx0, sy0, sx1, sy1, - sx2, sy2, sx3, sy3, - mat)) - return VG_FALSE; - - return matrix_invert(mat); -} - - -static INLINE VGboolean matrix_quad_to_quad(VGfloat dx0, VGfloat dy0, - VGfloat dx1, VGfloat dy1, - VGfloat dx2, VGfloat dy2, - VGfloat dx3, VGfloat dy3, - VGfloat sx0, VGfloat sy0, - VGfloat sx1, VGfloat sy1, - VGfloat sx2, VGfloat sy2, - VGfloat sx3, VGfloat sy3, - struct matrix *mat) -{ - struct matrix sqr_to_qd; - - if (!matrix_square_to_quad(dx0, dy0, dx1, dy1, - dx2, dy2, dx3, dy3, - mat)) - return VG_FALSE; - - if (!matrix_quad_to_square(sx0, sy0, sx1, sy1, - sx2, sy2, sx3, sy3, - &sqr_to_qd)) - return VG_FALSE; - - matrix_mult(mat, &sqr_to_qd); - - return VG_TRUE; -} - - -static INLINE VGboolean null_line(const VGfloat *l) -{ - return floatsEqual(l[0], l[2]) && floatsEqual(l[1], l[3]); -} - -static INLINE void line_normal(float *l, float *norm) -{ - norm[0] = l[0]; - norm[1] = l[1]; - - norm[2] = l[0] + (l[3] - l[1]); - norm[3] = l[1] - (l[2] - l[0]); -} - -static INLINE void line_normalize(float *l) -{ - float x = l[2] - l[0]; - float y = l[3] - l[1]; - float len = (float) sqrt(x*x + y*y); - l[2] = l[0] + x/len; - l[3] = l[1] + y/len; -} - -static INLINE VGfloat line_length(VGfloat x1, VGfloat y1, - VGfloat x2, VGfloat y2) -{ - VGfloat x = x2 - x1; - VGfloat y = y2 - y1; - return (VGfloat) sqrt(x*x + y*y); -} - -static INLINE VGfloat line_lengthv(const VGfloat *l) -{ - VGfloat x = l[2] - l[0]; - VGfloat y = l[3] - l[1]; - return (VGfloat) sqrt(x*x + y*y); -} - - -static INLINE void line_point_at(float *l, float t, float *pt) -{ - float dx = l[2] - l[0]; - float dy = l[3] - l[1]; - - pt[0] = l[0] + dx * t; - pt[1] = l[1] + dy * t; -} - -static INLINE void vector_unit(float *vec) -{ - float len = (float) sqrt(vec[0] * vec[0] + vec[1] * vec[1]); - vec[0] /= len; - vec[1] /= len; -} - -static INLINE void line_normal_vector(float *line, float *vec) -{ - VGfloat normal[4]; - - line_normal(line, normal); - - vec[0] = normal[2] - normal[0]; - vec[1] = normal[3] - normal[1]; - - vector_unit(vec); -} - -#endif |