/* EINA - EFL data type library * Copyright (C) 2007-2014 Jorge Luis Zapata * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. * If not, see . */ #ifndef EINA_MATRIX3_H_ #define EINA_MATRIX3_H_ #include "eina_quad.h" /** * @file * @ender_group{Eina_Matrix_Type} * @ender_group{Eina_Matrix3_F16p16} * @ender_group{Eina_Matrix3} */ /** * @defgroup Eina_Matrix_Type Matrices type * @ingroup Eina_Basic * @brief Matrix3 types * @{ */ typedef enum _Eina_Matrix_Type { EINA_MATRIX_TYPE_IDENTITY, /**< Identity matrix3 type */ EINA_MATRIX_TYPE_AFFINE, /**< Affine matrix3 type */ EINA_MATRIX_TYPE_PROJECTIVE, /**< Projective matrix3 type */ EINA_MATRIX_TYPE_LAST /**< The total number of matrix3 types */ } Eina_Matrix_Type; /** * @} * @defgroup Eina_Matrix3_F16p16 Matrices in fixed point * @ingroup Eina_Basic * @brief Fixed point matrices operations * @{ */ /** * Fixed point matrix3 handler */ typedef struct _Eina_Matrix3_F16p16 Eina_Matrix3_F16p16; struct _Eina_Matrix3_F16p16 { Eina_F16p16 xx; /**< xx in x' = (x * xx) + (y * xy) + xz */ Eina_F16p16 xy; /**< xy in x' = (x * xx) + (y * xy) + xz */ Eina_F16p16 xz; /**< xz in x' = (x * xx) + (y * xy) + xz */ Eina_F16p16 yx; /**< yx in y' = (x * yx) + (y * yy) + yz */ Eina_F16p16 yy; /**< yy in y' = (x * yx) + (y * yy) + yz */ Eina_F16p16 yz; /**< yz in y' = (x * yx) + (y * yy) + yz */ Eina_F16p16 zx; /**< zx in z' = (x * zx) + (y * zy) + zz */ Eina_F16p16 zy; /**< zy in z' = (x * zx) + (y * zy) + zz */ Eina_F16p16 zz; /**< zz in z' = (x * zx) + (y * zy) + zz */ }; /** * @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. * * @since 1.14 */ EAPI void eina_matrix3_f16p16_identity(Eina_Matrix3_F16p16 *m); /** * @since 1.14 */ EAPI void eina_matrix3_f16p16_compose(const Eina_Matrix3_F16p16 *m1, const Eina_Matrix3_F16p16 *m2, Eina_Matrix3_F16p16 *dst); /** * @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. * * @since 1.14 */ EAPI Eina_Matrix_Type eina_matrix3_f16p16_type_get(const Eina_Matrix3_F16p16 *m); /** * @} * @defgroup Eina_Matrix3 Matrices in floating point * @ingroup Eina_Basic * @brief Matrix definition and operations * @{ */ /** Helper macro for printf formatting */ #define EINA_MATRIX3_FORMAT "g %g %g | %g %g %g | %g %g %g" /** Helper macro for printf formatting arg */ #define EINA_MATRIX3_ARGS(m) (m)->xx, (m)->xy, (m)->xz, \ (m)->yx, (m)->yy, (m)->yz, \ (m)->zx, (m)->zy, (m)->zz /** * Floating point matrix3 handler */ typedef struct _Eina_Matrix3 Eina_Matrix3; struct _Eina_Matrix3 { double xx; /**< xx in x' = (x * xx) + (y * xy) + xz */ double xy; /**< xy in x' = (x * xx) + (y * xy) + xz */ double xz; /**< xz in x' = (x * xx) + (y * xy) + xz */ double yx; /**< yx in y' = (x * yx) + (y * yy) + yz */ double yy; /**< yy in y' = (x * yx) + (y * yy) + yz */ double yz; /**< yz in y' = (x * yx) + (y * yy) + yz */ double zx; /**< zx in z' = (x * zx) + (y * zy) + zz */ double zy; /**< zy in z' = (x * zx) + (y * zy) + zz */ double zz; /**< zz in z' = (x * zx) + (y * zy) + zz */ }; /** * @brief Return the type of the given floating point matrix. * * @param m The floating 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. * * @since 1.14 */ EAPI Eina_Matrix_Type eina_matrix3_type_get(const Eina_Matrix3 *m); /** * @brief Set the values of the coefficients of the given floating * point matrix. * * @param m The floating point matrix. * @param xx The first coefficient value. * @param xy The second coefficient value. * @param xz The third coefficient value. * @param yx The fourth coefficient value. * @param yy The fifth coefficient value. * @param yz The sixth coefficient value. * @param zx The seventh coefficient value. * @param zy The heighth coefficient value. * @param zz 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 eina_matrix3_values_get() * * @since 1.14 */ 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); /** * @brief Get the values of the coefficients of the given floating * point matrix. * * @param m The floating point matrix. * @param xx The first coefficient value. * @param xy The second coefficient value. * @param xz The third coefficient value. * @param yx The fourth coefficient value. * @param yy The fifth coefficient value. * @param yz The sixth coefficient value. * @param zx The seventh coefficient value. * @param zy The heighth coefficient value. * @param zz 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 eina_matrix3_values_set() * * @since 1.14 */ 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); /** * @brief Get the values of the coefficients of the given fixed * point matrix. * * @param m The fixed point matrix. * @param xx The first coefficient value. * @param xy The second coefficient value. * @param xz The third coefficient value. * @param yx The fourth coefficient value. * @param yy The fifth coefficient value. * @param yz The sixth coefficient value. * @param zx The seventh coefficient value. * @param zy The heighth coefficient value. * @param zz 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 eina_matrix3_values_set() * * @since 1.14 */ 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); /** * @brief Transform the given floating point matrix to the given fixed * point matrix. * * @param m The floating point matrix. * @param fm The fixed point matrix. * * This function transforms the floating point matrix @p m to a fixed * point matrix and store the coefficients into the fixed point matrix * @p fm. * * @since 1.14 */ EAPI void eina_matrix3_matrix3_f16p16_to(const Eina_Matrix3 *m, Eina_Matrix3_F16p16 *fm); /** * @brief Check whether the two given matrices are equal or not. * * @param m1 The first matrix. * @param m2 The second matrix. * @return EINA_TRUE if the two matrices are equal, 0 otherwise. * * This function return EINA_TRUE if thematrices @p m1 and @p m2 are * equal, EINA_FALSE otherwise. No check is done on the matrices. * * @since 1.14 */ EAPI Eina_Bool eina_matrix3_equal(const Eina_Matrix3 *m1, const Eina_Matrix3 *m2); /** * @since 1.14 */ EAPI void eina_matrix3_compose(const Eina_Matrix3 *m1, const Eina_Matrix3 *m2, Eina_Matrix3 *dst); /** * 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 * * @since 1.14 */ EAPI void eina_matrix3_translate(Eina_Matrix3 *t, double tx, double ty); /** * 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 * * @since 1.14 */ EAPI void eina_matrix3_scale(Eina_Matrix3 *t, double sx, double sy); /** * Set the matrix values for a rotation * @param[in] m The matrix to set the rotation values * @param[in] rad The radius to rotate the matrix * * @since 1.14 */ EAPI void eina_matrix3_rotate(Eina_Matrix3 *t, double rad); /** * @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. * * @since 1.14 */ EAPI void eina_matrix3_identity(Eina_Matrix3 *t); /** * @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. * * @since 1.14 */ EAPI double eina_matrix3_determinant(const Eina_Matrix3 *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. * * @since 1.14 */ EAPI void eina_matrix3_divide(Eina_Matrix3 *m, double scalar); /** * @brief Compute the inverse of the given matrix. * * @param m The matrix to inverse. * @param m2 The inverse matrix. * * This function inverse the matrix @p m and stores the result in * @p m2. No check is done on @p m or @p m2. If @p m can not be * invertible, then @p m2 is set to the identity matrix. * * @since 1.14 */ EAPI void eina_matrix3_inverse(const Eina_Matrix3 *m, Eina_Matrix3 *m2); /** * @since 1.14 */ EAPI void eina_matrix3_transpose(const Eina_Matrix3 *m, Eina_Matrix3 *a); /** * @since 1.14 */ EAPI void eina_matrix3_cofactor(const Eina_Matrix3 *m, Eina_Matrix3 *a); /** * @since 1.14 */ EAPI void eina_matrix3_adjoint(const Eina_Matrix3 *m, Eina_Matrix3 *a); /** * @since 1.14 */ EAPI void eina_matrix3_point_transform(const Eina_Matrix3 *m, double x, double y, double *xr, double *yr); /** * @since 1.14 */ EAPI void eina_matrix3_rectangle_transform(const Eina_Matrix3 *m, const Eina_Rectangle *r, const Eina_Quad *q); /** * @brief Creates a projective matrix that maps a quadrangle to a quadrangle */ EAPI Eina_Bool eina_matrix3_quad_quad_map(Eina_Matrix3 *m, const Eina_Quad *src, const Eina_Quad *dst); /** * @since 1.14 */ EAPI Eina_Bool eina_matrix3_square_quad_map(Eina_Matrix3 *m, const Eina_Quad *q); /** * @since 1.14 */ EAPI Eina_Bool eina_matrix3_quad_square_map(Eina_Matrix3 *m, const Eina_Quad *q); /** * @} */ #endif /*EINA_MATRIX3_H_*/