EAPI void eina_matrix3_cofactor(const Eina_Matrix3 *m, Eina_Matrix3 *a) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; a11 = (MATRIX_YY(m) * MATRIX_ZZ(m)) - (MATRIX_YZ(m) * MATRIX_ZY(m)); a12 = -1 * ((MATRIX_YX(m) * MATRIX_ZZ(m)) - (MATRIX_YZ(m) * MATRIX_ZX(m))); a13 = (MATRIX_YX(m) * MATRIX_ZY(m)) - (MATRIX_YY(m) * MATRIX_ZX(m)); a21 = -1 * ((MATRIX_XY(m) * MATRIX_ZZ(m)) - (MATRIX_XZ(m) * MATRIX_ZY(m))); a22 = (MATRIX_XX(m) * MATRIX_ZZ(m)) - (MATRIX_XZ(m) * MATRIX_ZX(m)); a23 = -1 * ((MATRIX_XX(m) * MATRIX_ZY(m)) - (MATRIX_XY(m) * MATRIX_ZX(m))); a31 = (MATRIX_XY(m) * MATRIX_YZ(m)) - (MATRIX_XZ(m) * MATRIX_YY(m)); a32 = -1 * ((MATRIX_XX(m) * MATRIX_YZ(m)) - (MATRIX_XZ(m) * MATRIX_YX(m))); a33 = (MATRIX_XX(m) * MATRIX_YY(m)) - (MATRIX_XY(m) * MATRIX_YX(m)); MATRIX_XX(a) = a11; MATRIX_XY(a) = a12; MATRIX_XZ(a) = a13; MATRIX_YX(a) = a21; MATRIX_YY(a) = a22; MATRIX_YZ(a) = a23; MATRIX_ZX(a) = a31; MATRIX_ZY(a) = a32; MATRIX_ZZ(a) = a33; }
/** * @brief Return the determinant of the given matrix. * * @param m The matrix. * @return The determinant. * * This function returns the determinant of the matrix @p m. No check * is done on @p m. */ EAPI double enesim_matrix_determinant(const Enesim_Matrix *m) { double det; det = MATRIX_XX(m) * ((MATRIX_YY(m) * MATRIX_ZZ(m)) - (MATRIX_YZ(m) * MATRIX_ZY(m))); det -= MATRIX_XY(m) * ((MATRIX_YX(m) * MATRIX_ZZ(m)) - (MATRIX_YZ(m) * MATRIX_ZX(m))); det += MATRIX_XZ(m) * ((MATRIX_YX(m) * MATRIX_ZY(m)) - (MATRIX_YY(m) * MATRIX_ZX(m))); return det; }
EAPI void eina_matrix4_matrix3_to(Eina_Matrix3 *m3, const Eina_Matrix4 *m4) { MATRIX_XX(m3) = MATRIX_XX(m4); MATRIX_XY(m3) = MATRIX_XY(m4); MATRIX_XZ(m3) = MATRIX_XZ(m4); MATRIX_YX(m3) = MATRIX_YX(m4); MATRIX_YY(m3) = MATRIX_YY(m4); MATRIX_YZ(m3) = MATRIX_YZ(m4); MATRIX_ZX(m3) = MATRIX_ZX(m4); MATRIX_ZY(m3) = MATRIX_ZY(m4); MATRIX_ZZ(m3) = MATRIX_ZZ(m4); }
EAPI Eina_Bool eina_matrix3_square_quad_map(Eina_Matrix3 *m, const Eina_Quad *q) { // x0 - x1 + x2 - x3 double ex = QUAD_X0(q) - QUAD_X1(q) + QUAD_X2(q) - QUAD_X3(q); // y0 - y1 + y2 - y3 double ey = QUAD_Y0(q) - QUAD_Y1(q) + QUAD_Y2(q) - QUAD_Y3(q); /* paralellogram */ if (!ex && !ey) { /* create the affine matrix */ MATRIX_XX(m) = QUAD_X1(q) - QUAD_X0(q); MATRIX_XY(m) = QUAD_X2(q) - QUAD_X1(q); MATRIX_XZ(m) = QUAD_X0(q); MATRIX_YX(m) = QUAD_Y1(q) - QUAD_Y0(q); MATRIX_YY(m) = QUAD_Y2(q) - QUAD_Y1(q); MATRIX_YZ(m) = QUAD_Y0(q); MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 1; return EINA_TRUE; } else { double dx1 = QUAD_X1(q) - QUAD_X2(q); // x1 - x2 double dx2 = QUAD_X3(q) - QUAD_X2(q); // x3 - x2 double dy1 = QUAD_Y1(q) - QUAD_Y2(q); // y1 - y2 double dy2 = QUAD_Y3(q) - QUAD_Y2(q); // y3 - y2 double den = (dx1 * dy2) - (dx2 * dy1); if (!den) return EINA_FALSE; MATRIX_ZX(m) = ((ex * dy2) - (dx2 * ey)) / den; MATRIX_ZY(m) = ((dx1 * ey) - (ex * dy1)) / den; MATRIX_ZZ(m) = 1; MATRIX_XX(m) = QUAD_X1(q) - QUAD_X0(q) + (MATRIX_ZX(m) * QUAD_X1(q)); MATRIX_XY(m) = QUAD_X3(q) - QUAD_X0(q) + (MATRIX_ZY(m) * QUAD_X3(q)); MATRIX_XZ(m) = QUAD_X0(q); MATRIX_YX(m) = QUAD_Y1(q) - QUAD_Y0(q) + (MATRIX_ZX(m) * QUAD_Y1(q)); MATRIX_YY(m) = QUAD_Y3(q) - QUAD_Y0(q) + (MATRIX_ZY(m) * QUAD_Y3(q)); MATRIX_YZ(m) = QUAD_Y0(q); return EINA_TRUE; } }
EAPI void enesim_matrix_transpose(const Enesim_Matrix *m, Enesim_Matrix *a) { MATRIX_XX(a) = MATRIX_XX(m); MATRIX_XY(a) = MATRIX_YX(m); MATRIX_XZ(a) = MATRIX_ZX(m); MATRIX_YX(a) = MATRIX_XY(m); MATRIX_YY(a) = MATRIX_YY(m); MATRIX_YZ(a) = MATRIX_ZY(m); MATRIX_ZX(a) = MATRIX_XZ(m); MATRIX_ZY(a) = MATRIX_YZ(m); MATRIX_ZZ(a) = MATRIX_ZZ(m); }
EAPI void eina_matrix3_transpose(const Eina_Matrix3 *m, Eina_Matrix3 *a) { MATRIX_XX(a) = MATRIX_XX(m); MATRIX_XY(a) = MATRIX_YX(m); MATRIX_XZ(a) = MATRIX_ZX(m); MATRIX_YX(a) = MATRIX_XY(m); MATRIX_YY(a) = MATRIX_YY(m); MATRIX_YZ(a) = MATRIX_ZY(m); MATRIX_ZX(a) = MATRIX_XZ(m); MATRIX_ZY(a) = MATRIX_YZ(m); MATRIX_ZZ(a) = MATRIX_ZZ(m); }
EAPI void eina_matrix3_rotate(Eina_Matrix3 *m, double rad) { double c, s; #if 0 c = cosf(rad); s = sinf(rad); #else /* normalize the angle between -pi,pi */ rad = fmod(rad + M_PI, 2 * M_PI) - M_PI; c = _cos(rad); s = _sin(rad); #endif Eina_Matrix3 tmp; MATRIX_XX(&tmp) = c; MATRIX_XY(&tmp) = -s; MATRIX_XZ(&tmp) = 0; MATRIX_YX(&tmp) = s; MATRIX_YY(&tmp) = c; MATRIX_YZ(&tmp) = 0; MATRIX_ZX(&tmp) = 0; MATRIX_ZY(&tmp) = 0; MATRIX_ZZ(&tmp) = 1; eina_matrix3_compose(m, &tmp, m); }
EAPI void eina_matrix3_compose(const Eina_Matrix3 *m1, const Eina_Matrix3 *m2, Eina_Matrix3 *dst) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; a11 = (MATRIX_XX(m1) * MATRIX_XX(m2)) + (MATRIX_XY(m1) * MATRIX_YX(m2)) + (MATRIX_XZ(m1) * MATRIX_ZX(m2)); a12 = (MATRIX_XX(m1) * MATRIX_XY(m2)) + (MATRIX_XY(m1) * MATRIX_YY(m2)) + (MATRIX_XZ(m1) * MATRIX_ZY(m2)); a13 = (MATRIX_XX(m1) * MATRIX_XZ(m2)) + (MATRIX_XY(m1) * MATRIX_YZ(m2)) + (MATRIX_XZ(m1) * MATRIX_ZZ(m2)); a21 = (MATRIX_YX(m1) * MATRIX_XX(m2)) + (MATRIX_YY(m1) * MATRIX_YX(m2)) + (MATRIX_YZ(m1) * MATRIX_ZX(m2)); a22 = (MATRIX_YX(m1) * MATRIX_XY(m2)) + (MATRIX_YY(m1) * MATRIX_YY(m2)) + (MATRIX_YZ(m1) * MATRIX_ZY(m2)); a23 = (MATRIX_YX(m1) * MATRIX_XZ(m2)) + (MATRIX_YY(m1) * MATRIX_YZ(m2)) + (MATRIX_YZ(m1) * MATRIX_ZZ(m2)); a31 = (MATRIX_ZX(m1) * MATRIX_XX(m2)) + (MATRIX_ZY(m1) * MATRIX_YX(m2)) + (MATRIX_ZZ(m1) * MATRIX_ZX(m2)); a32 = (MATRIX_ZX(m1) * MATRIX_XY(m2)) + (MATRIX_ZY(m1) * MATRIX_YY(m2)) + (MATRIX_ZZ(m1) * MATRIX_ZY(m2)); a33 = (MATRIX_ZX(m1) * MATRIX_XZ(m2)) + (MATRIX_ZY(m1) * MATRIX_YZ(m2)) + (MATRIX_ZZ(m1) * MATRIX_ZZ(m2)); MATRIX_XX(dst) = a11; MATRIX_XY(dst) = a12; MATRIX_XZ(dst) = a13; MATRIX_YX(dst) = a21; MATRIX_YY(dst) = a22; MATRIX_YZ(dst) = a23; MATRIX_ZX(dst) = a31; MATRIX_ZY(dst) = a32; MATRIX_ZZ(dst) = a33; }
EAPI Eina_Matrix_Type eina_matrix4_type_get(const Eina_Matrix4 *m) { if ((MATRIX_XX(m) == 1) && (MATRIX_XY(m) == 0) && (MATRIX_XZ(m) == 0) && (MATRIX_XW(m) == 0) && (MATRIX_YX(m) == 0) && (MATRIX_YY(m) == 1) && (MATRIX_YZ(m) == 0) && (MATRIX_YW(m) == 0) && (MATRIX_ZX(m) == 0) && (MATRIX_ZY(m) == 0) && (MATRIX_ZZ(m) == 1) && (MATRIX_ZW(m) == 0) && (MATRIX_WX(m) == 0) && (MATRIX_WY(m) == 0) && (MATRIX_WZ(m) == 0) && (MATRIX_WW(m) == 1)) return EINA_MATRIX_TYPE_IDENTITY; return EINA_MATRIX_TYPE_AFFINE; }
EAPI void enesim_matrix_point_transform(const Enesim_Matrix *m, double x, double y, double *xr, double *yr) { double xrr, yrr; if (!MATRIX_ZX(m) && !MATRIX_ZY(m)) { xrr = (x * MATRIX_XX(m) + y * MATRIX_XY(m) + MATRIX_XZ(m)); yrr = (x * MATRIX_YX(m) + y * MATRIX_YY(m) + MATRIX_YZ(m)); } else { xrr = (x * MATRIX_XX(m) + y * MATRIX_XY(m) + MATRIX_XZ(m)) / (x * MATRIX_ZX(m) + y * MATRIX_ZY(m) + MATRIX_ZZ(m)); yrr = (x * MATRIX_YX(m) + y * MATRIX_YY(m) + MATRIX_YZ(m)) / (x * MATRIX_ZX(m) + y * MATRIX_ZY(m) + MATRIX_ZZ(m)); } if (xr) *xr = xrr; if (yr) *yr = yrr; }
EAPI void eina_matrix3_matrix4_to(Eina_Matrix4 *m4, const Eina_Matrix3 *m3) { MATRIX_XX(m4) = MATRIX_XX(m3); MATRIX_XY(m4) = MATRIX_XY(m3); MATRIX_XZ(m4) = MATRIX_XZ(m3); MATRIX_XW(m4) = 0; MATRIX_YX(m4) = MATRIX_YX(m3); MATRIX_YY(m4) = MATRIX_YY(m3); MATRIX_YZ(m4) = MATRIX_YZ(m3); MATRIX_YW(m4) = 0; MATRIX_ZX(m4) = MATRIX_ZX(m3); MATRIX_ZY(m4) = MATRIX_ZY(m3); MATRIX_ZZ(m4) = MATRIX_ZZ(m3); MATRIX_ZW(m4) = 0; MATRIX_WX(m4) = 0; MATRIX_WY(m4) = 0; MATRIX_WZ(m4) = 0; MATRIX_WW(m4) = 1; }
/** * Set the matrix values for a scale * @param[in] m The matrix to set the scale values * @param[in] sx The X coordinate scale * @param[in] sy The Y coordinate scale */ EAPI void enesim_matrix_scale(Enesim_Matrix *m, double sx, double sy) { MATRIX_XX(m) = sx; MATRIX_XY(m) = 0; MATRIX_XZ(m) = 0; MATRIX_YX(m) = 0; MATRIX_YY(m) = sy; MATRIX_YZ(m) = 0; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 1; }
/** * Set the matrix values for a translation * @param[in] m The matrix to set the translation values * @param[in] tx The X coordinate translate * @param[in] ty The Y coordinate translate */ EAPI void enesim_matrix_translate(Enesim_Matrix *m, double tx, double ty) { MATRIX_XX(m) = 1; MATRIX_XY(m) = 0; MATRIX_XZ(m) = tx; MATRIX_YX(m) = 0; MATRIX_YY(m) = 1; MATRIX_YZ(m) = ty; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 1; }
/** * @brief Set the given floating point matrix to the identity matrix. * * @param m The floating point matrix to set * * This function sets @p m to the identity matrix. No check is done on * @p m. */ EAPI void enesim_matrix_identity(Enesim_Matrix *m) { MATRIX_XX(m) = 1; MATRIX_XY(m) = 0; MATRIX_XZ(m) = 0; MATRIX_YX(m) = 0; MATRIX_YY(m) = 1; MATRIX_YZ(m) = 0; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 1; }
/** * @brief Set the given fixed point matrix to the identity matrix. * * @param m The fixed point matrix to set * * This function sets @p m to the identity matrix. No check is done on * @p m. */ EAPI void enesim_matrix_f16p16_identity(Enesim_Matrix_F16p16 *m) { MATRIX_XX(m) = 65536; MATRIX_XY(m) = 0; MATRIX_XZ(m) = 0; MATRIX_YX(m) = 0; MATRIX_YY(m) = 65536; MATRIX_YZ(m) = 0; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 65536; }
/** * @brief Get the values of the coefficients of the given floating * point matrix. * * @param m The floating point matrix. * @param a The first coefficient value. * @param b The second coefficient value. * @param c The third coefficient value. * @param d The fourth coefficient value. * @param e The fifth coefficient value. * @param f The sixth coefficient value. * @param g The seventh coefficient value. * @param h The heighth coefficient value. * @param i The nineth coefficient value. * * This function gets the values of the coefficients of the matrix * @p m. No check is done on @p m. * * @see enesim_matrix_values_set() */ EAPI void enesim_matrix_values_get(const Enesim_Matrix *m, double *a, double *b, double *c, double *d, double *e, double *f, double *g, double *h, double *i) { if (a) *a = MATRIX_XX(m); if (b) *b = MATRIX_XY(m); if (c) *c = MATRIX_XZ(m); if (d) *d = MATRIX_YX(m); if (e) *e = MATRIX_YY(m); if (f) *f = MATRIX_YZ(m); if (g) *g = MATRIX_ZX(m); if (h) *h = MATRIX_ZY(m); if (i) *i = MATRIX_ZZ(m); }
/** * @brief Return the type of the given fixed point matrix. * * @param m The fixed point matrix. * @return The type of the matrix. * * This function returns the type of the matrix @p m. No check is done * on @p m. */ EAPI Enesim_Matrix_Type enesim_matrix_f16p16_type_get(const Enesim_Matrix_F16p16 *m) { if ((MATRIX_ZX(m) != 0) || (MATRIX_ZY(m) != 0) || (MATRIX_ZZ(m) != 65536)) return ENESIM_MATRIX_TYPE_PROJECTIVE; else { if ((MATRIX_XX(m) == 65536) && (MATRIX_XY(m) == 0) && (MATRIX_XZ(m) == 0) && (MATRIX_YX(m) == 0) && (MATRIX_YY(m) == 65536) && (MATRIX_YZ(m) == 0)) return ENESIM_MATRIX_TYPE_IDENTITY; else return ENESIM_MATRIX_TYPE_AFFINE; } }
/** * @brief Set the values of the coefficients of the given floating * point matrix. * * @param m The floating point matrix. * @param a The first coefficient value. * @param b The second coefficient value. * @param c The third coefficient value. * @param d The fourth coefficient value. * @param e The fifth coefficient value. * @param f The sixth coefficient value. * @param g The seventh coefficient value. * @param h The heighth coefficient value. * @param i The nineth coefficient value. * * This function sets the values of the coefficients of the matrix * @p m. No check is done on @p m. * * @see enesim_matrix_values_get() */ EAPI void enesim_matrix_values_set(Enesim_Matrix *m, double a, double b, double c, double d, double e, double f, double g, double h, double i) { MATRIX_XX(m) = a; MATRIX_XY(m) = b; MATRIX_XZ(m) = c; MATRIX_YX(m) = d; MATRIX_YY(m) = e; MATRIX_YZ(m) = f; MATRIX_ZX(m) = g; MATRIX_ZY(m) = h; MATRIX_ZZ(m) = i; }
EAPI void eina_matrix3_identity(Eina_Matrix3 *m) { MATRIX_XX(m) = 1; MATRIX_XY(m) = 0; MATRIX_XZ(m) = 0; MATRIX_YX(m) = 0; MATRIX_YY(m) = 1; MATRIX_YZ(m) = 0; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 1; }
EAPI void eina_matrix3_f16p16_identity(Eina_Matrix3_F16p16 *m) { MATRIX_XX(m) = 65536; MATRIX_XY(m) = 0; MATRIX_XZ(m) = 0; MATRIX_YX(m) = 0; MATRIX_YY(m) = 65536; MATRIX_YZ(m) = 0; MATRIX_ZX(m) = 0; MATRIX_ZY(m) = 0; MATRIX_ZZ(m) = 65536; }
/** * @brief Get the values of the coefficients of the given fixed * point matrix. * * @param m The fixed point matrix. * @param a The first coefficient value. * @param b The second coefficient value. * @param c The third coefficient value. * @param d The fourth coefficient value. * @param e The fifth coefficient value. * @param f The sixth coefficient value. * @param g The seventh coefficient value. * @param h The heighth coefficient value. * @param i The nineth coefficient value. * * This function gets the values of the coefficients of the matrix * @p m. No check is done on @p m. * * @see enesim_matrix_values_set() */ EAPI void enesim_matrix_fixed_values_get(const Enesim_Matrix *m, Eina_F16p16 *a, Eina_F16p16 *b, Eina_F16p16 *c, Eina_F16p16 *d, Eina_F16p16 *e, Eina_F16p16 *f, Eina_F16p16 *g, Eina_F16p16 *h, Eina_F16p16 *i) { if (a) *a = eina_f16p16_double_from(MATRIX_XX(m)); if (b) *b = eina_f16p16_double_from(MATRIX_XY(m)); if (c) *c = eina_f16p16_double_from(MATRIX_XZ(m)); if (d) *d = eina_f16p16_double_from(MATRIX_YX(m)); if (e) *e = eina_f16p16_double_from(MATRIX_YY(m)); if (f) *f = eina_f16p16_double_from(MATRIX_YZ(m)); if (g) *g = eina_f16p16_double_from(MATRIX_ZX(m)); if (h) *h = eina_f16p16_double_from(MATRIX_ZY(m)); if (i) *i = eina_f16p16_double_from(MATRIX_ZZ(m)); }
/** * @brief Divide the given matrix by the given scalar. * * @param m The matrix. * @param scalar The scalar number. * * This function divides the matrix @p m by @p scalar. No check * is done on @p m. */ EAPI void enesim_matrix_divide(Enesim_Matrix *m, double scalar) { MATRIX_XX(m) /= scalar; MATRIX_XY(m) /= scalar; MATRIX_XZ(m) /= scalar; MATRIX_YX(m) /= scalar; MATRIX_YY(m) /= scalar; MATRIX_YZ(m) /= scalar; MATRIX_ZX(m) /= scalar; MATRIX_ZY(m) /= scalar; MATRIX_ZZ(m) /= scalar; }
/*============================================================================* * API * *============================================================================*/ EAPI Eina_Matrix_Type eina_matrix3_type_get(const Eina_Matrix3 *m) { if ((MATRIX_ZX(m) != 0) || (MATRIX_ZY(m) != 0) || (MATRIX_ZZ(m) != 1)) return EINA_MATRIX_TYPE_PROJECTIVE; else { if ((MATRIX_XX(m) == 1) && (MATRIX_XY(m) == 0) && (MATRIX_XZ(m) == 0) && (MATRIX_YX(m) == 0) && (MATRIX_YY(m) == 1) && (MATRIX_YZ(m) == 0)) return EINA_MATRIX_TYPE_IDENTITY; else return EINA_MATRIX_TYPE_AFFINE; } }
EAPI void eina_matrix3_scale(Eina_Matrix3 *m, double sx, double sy) { Eina_Matrix3 tmp; MATRIX_XX(&tmp) = sx; MATRIX_XY(&tmp) = 0; MATRIX_XZ(&tmp) = 0; MATRIX_YX(&tmp) = 0; MATRIX_YY(&tmp) = sy; MATRIX_YZ(&tmp) = 0; MATRIX_ZX(&tmp) = 0; MATRIX_ZY(&tmp) = 0; MATRIX_ZZ(&tmp) = 1; eina_matrix3_compose(m, &tmp, m); }
EAPI void eina_matrix3_translate(Eina_Matrix3 *m, double tx, double ty) { Eina_Matrix3 tmp; MATRIX_XX(&tmp) = 1; MATRIX_XY(&tmp) = 0; MATRIX_XZ(&tmp) = tx; MATRIX_YX(&tmp) = 0; MATRIX_YY(&tmp) = 1; MATRIX_YZ(&tmp) = ty; MATRIX_ZX(&tmp) = 0; MATRIX_ZY(&tmp) = 0; MATRIX_ZZ(&tmp) = 1; eina_matrix3_compose(m, &tmp, m); }
EAPI void eina_matrix3_divide(Eina_Matrix3 *m, double scalar) { MATRIX_XX(m) /= scalar; MATRIX_XY(m) /= scalar; MATRIX_XZ(m) /= scalar; MATRIX_YX(m) /= scalar; MATRIX_YY(m) /= scalar; MATRIX_YZ(m) /= scalar; MATRIX_ZX(m) /= scalar; MATRIX_ZY(m) /= scalar; MATRIX_ZZ(m) /= scalar; }
EAPI void eina_matrix3_values_get(const Eina_Matrix3 *m, double *xx, double *xy, double *xz, double *yx, double *yy, double *yz, double *zx, double *zy, double *zz) { if (xx) *xx = MATRIX_XX(m); if (xy) *xy = MATRIX_XY(m); if (xz) *xz = MATRIX_XZ(m); if (yx) *yx = MATRIX_YX(m); if (yy) *yy = MATRIX_YY(m); if (yz) *yz = MATRIX_YZ(m); if (zx) *zx = MATRIX_ZX(m); if (zy) *zy = MATRIX_ZY(m); if (zz) *zz = MATRIX_ZZ(m); }
EAPI void eina_matrix3_values_set(Eina_Matrix3 *m, double xx, double xy, double xz, double yx, double yy, double yz, double zx, double zy, double zz) { MATRIX_XX(m) = xx; MATRIX_XY(m) = xy; MATRIX_XZ(m) = xz; MATRIX_YX(m) = yx; MATRIX_YY(m) = yy; MATRIX_YZ(m) = yz; MATRIX_ZX(m) = zx; MATRIX_ZY(m) = zy; MATRIX_ZZ(m) = zz; }
EAPI void eina_matrix3_fixed_values_get(const Eina_Matrix3 *m, Eina_F16p16 *xx, Eina_F16p16 *xy, Eina_F16p16 *xz, Eina_F16p16 *yx, Eina_F16p16 *yy, Eina_F16p16 *yz, Eina_F16p16 *zx, Eina_F16p16 *zy, Eina_F16p16 *zz) { if (xx) *xx = eina_f16p16_double_from(MATRIX_XX(m)); if (xy) *xy = eina_f16p16_double_from(MATRIX_XY(m)); if (xz) *xz = eina_f16p16_double_from(MATRIX_XZ(m)); if (yx) *yx = eina_f16p16_double_from(MATRIX_YX(m)); if (yy) *yy = eina_f16p16_double_from(MATRIX_YY(m)); if (yz) *yz = eina_f16p16_double_from(MATRIX_YZ(m)); if (zx) *zx = eina_f16p16_double_from(MATRIX_ZX(m)); if (zy) *zy = eina_f16p16_double_from(MATRIX_ZY(m)); if (zz) *zz = eina_f16p16_double_from(MATRIX_ZZ(m)); }
EAPI void eina_matrix3_f16p16_compose(const Eina_Matrix3_F16p16 *m1, const Eina_Matrix3_F16p16 *m2, Eina_Matrix3_F16p16 *dst) { Eina_F16p16 a11, a12, a13, a21, a22, a23, a31, a32, a33; a11 = eina_f16p16_mul(MATRIX_XX(m1), MATRIX_XX(m2)) + eina_f16p16_mul(MATRIX_XY(m1), MATRIX_YX(m2)) + eina_f16p16_mul(MATRIX_XZ(m1), MATRIX_ZX(m2)); a12 = eina_f16p16_mul(MATRIX_XX(m1), MATRIX_XY(m2)) + eina_f16p16_mul(MATRIX_XY(m1), MATRIX_YY(m2)) + eina_f16p16_mul(MATRIX_XZ(m1), MATRIX_ZY(m2)); a13 = eina_f16p16_mul(MATRIX_XX(m1), MATRIX_XZ(m2)) + eina_f16p16_mul(MATRIX_XY(m1), MATRIX_YZ(m2)) + eina_f16p16_mul(MATRIX_XZ(m1), MATRIX_ZZ(m2)); a21 = eina_f16p16_mul(MATRIX_YX(m1), MATRIX_XX(m2)) + eina_f16p16_mul(MATRIX_YY(m1), MATRIX_YX(m2)) + eina_f16p16_mul(MATRIX_YZ(m1), MATRIX_ZX(m2)); a22 = eina_f16p16_mul(MATRIX_YX(m1), MATRIX_XY(m2)) + eina_f16p16_mul(MATRIX_YY(m1), MATRIX_YY(m2)) + eina_f16p16_mul(MATRIX_YZ(m1), MATRIX_ZY(m2)); a23 = eina_f16p16_mul(MATRIX_YX(m1), MATRIX_XZ(m2)) + eina_f16p16_mul(MATRIX_YY(m1), MATRIX_YZ(m2)) + eina_f16p16_mul(MATRIX_YZ(m1), MATRIX_ZZ(m2)); a31 = eina_f16p16_mul(MATRIX_ZX(m1), MATRIX_XX(m2)) + eina_f16p16_mul(MATRIX_ZY(m1), MATRIX_YX(m2)) + eina_f16p16_mul(MATRIX_ZZ(m1), MATRIX_ZX(m2)); a32 = eina_f16p16_mul(MATRIX_ZX(m1), MATRIX_XY(m2)) + eina_f16p16_mul(MATRIX_ZY(m1), MATRIX_YY(m2)) + eina_f16p16_mul(MATRIX_ZZ(m1), MATRIX_ZY(m2)); a33 = eina_f16p16_mul(MATRIX_ZX(m1), MATRIX_XZ(m2)) + eina_f16p16_mul(MATRIX_ZY(m1), MATRIX_YZ(m2)) + eina_f16p16_mul(MATRIX_ZZ(m1), MATRIX_ZZ(m2)); MATRIX_XX(dst) = a11; MATRIX_XY(dst) = a12; MATRIX_XZ(dst) = a13; MATRIX_YX(dst) = a21; MATRIX_YY(dst) = a22; MATRIX_YZ(dst) = a23; MATRIX_ZX(dst) = a31; MATRIX_ZY(dst) = a32; MATRIX_ZZ(dst) = a33; }