void graphene_matrix_project_rect_bounds (const graphene_matrix_t *m, const graphene_rect_t *r, graphene_rect_t *res) { graphene_point_t points[4]; graphene_point_t ret[4]; float min_x, min_y; float max_x, max_y; int i; graphene_rect_get_top_left (r, &points[0]); graphene_rect_get_top_right (r, &points[1]); graphene_rect_get_bottom_left (r, &points[2]); graphene_rect_get_bottom_right (r, &points[3]); graphene_matrix_project_point (m, &points[0], &ret[0]); graphene_matrix_project_point (m, &points[1], &ret[1]); graphene_matrix_project_point (m, &points[2], &ret[2]); graphene_matrix_project_point (m, &points[3], &ret[3]); min_x = max_x = ret[0].x; min_y = max_y = ret[0].y; for (i = 1; i < 4; i++) { min_x = MIN (ret[i].x, min_x); min_y = MIN (ret[i].y, min_y); max_x = MAX (ret[i].x, max_x); max_y = MAX (ret[i].y, max_y); } graphene_rect_init (res, min_x, min_y, max_x - min_x, max_y - min_y); }
/** * graphene_matrix_transform_rect: * @m: a #graphene_matrix_t * @r: a #graphene_rect_t * @res: (out caller-allocates): return location for the * transformed quad * * Transforms a #graphene_rect_t using the given matrix @m. The * result is a coplanar quad. * * Since: 1.0 */ void graphene_matrix_transform_rect (const graphene_matrix_t *m, const graphene_rect_t *r, graphene_quad_t *res) { graphene_point_t points[4]; graphene_point_t ret[4]; graphene_rect_get_top_left (r, &points[0]); graphene_rect_get_top_right (r, &points[1]); graphene_rect_get_bottom_right (r, &points[2]); graphene_rect_get_bottom_left (r, &points[3]); graphene_matrix_transform_point (m, &points[0], &ret[0]); graphene_matrix_transform_point (m, &points[1], &ret[1]); graphene_matrix_transform_point (m, &points[2], &ret[2]); graphene_matrix_transform_point (m, &points[3], &ret[3]); graphene_quad_init (res, &ret[0], &ret[1], &ret[2], &ret[3]); }