ector: implements bounds_get for gradients in Cairo backend.

This commit is contained in:
Cedric BAIL 2015-04-03 16:37:55 +02:00
parent 2d9bccbfdc
commit 510a3e42e8
6 changed files with 55 additions and 15 deletions

View File

@ -3,7 +3,15 @@
typedef void cairo_pattern_t;
typedef struct {
double xx; double yx;
double xy; double yy;
double x0; double y0;
} cairo_matrix_t;
typedef struct _Ector_Cairo_Surface_Data Ector_Cairo_Surface_Data;
typedef struct _Ector_Renderer_Cairo_Base_Data Ector_Renderer_Cairo_Base_Data;
struct _Ector_Cairo_Surface_Data
{
cairo_t *cairo;
@ -14,6 +22,14 @@ struct _Ector_Cairo_Surface_Data
Eina_Bool internal : 1;
};
struct _Ector_Renderer_Cairo_Base_Data
{
Ector_Cairo_Surface_Data *parent;
Ector_Renderer_Generic_Base_Data *generic;
cairo_matrix_t *m;
};
#define CHECK_CAIRO(Parent) (!(Parent && Parent->cairo))
#define USE(Obj, Sym, Error) \

View File

@ -12,12 +12,6 @@
#include "ector_private.h"
#include "ector_cairo_private.h"
typedef struct {
double xx; double yx;
double xy; double yy;
double x0; double y0;
} cairo_matrix_t;
typedef enum {
CAIRO_OPERATOR_CLEAR,
@ -71,15 +65,6 @@ static void (*cairo_rectangle)(cairo_t *cr, double x, double y, double width, do
static void (*cairo_clip)(cairo_t *cr) = NULL;
static void (*cairo_device_to_user)(cairo_t *cr, double *x, double *y) = NULL;
typedef struct _Ector_Renderer_Cairo_Base_Data Ector_Renderer_Cairo_Base_Data;
struct _Ector_Renderer_Cairo_Base_Data
{
Ector_Cairo_Surface_Data *parent;
Ector_Renderer_Generic_Base_Data *generic;
cairo_matrix_t *m;
};
static cairo_matrix_t identity;
// Cairo need unpremul color, so force unpremul here

View File

@ -117,6 +117,25 @@ _ector_renderer_cairo_gradient_linear_ector_renderer_cairo_base_fill(Eo *obj,
return EINA_TRUE;
}
static Eina_Bool
_ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_bounds_get(Eo *obj,
Ector_Renderer_Cairo_Gradient_Linear_Data *pd EINA_UNUSED,
Eina_Rectangle *r)
{
Ector_Renderer_Generic_Gradient_Linear_Data *gld;
Ector_Renderer_Cairo_Base_Data *bd;
gld = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_GRADIENT_RADIAL_MIXIN);
bd = eo_data_scope_get(obj, ECTOR_RENDERER_CAIRO_BASE_CLASS);
EINA_RECTANGLE_SET(r,
bd->generic->origin.x + gld->start.x,
bd->generic->origin.y + gld->start.y,
gld->end.x - gld->start.x,
gld->end.y - gld->start.x);
return EINA_TRUE;
}
void
_ector_renderer_cairo_gradient_linear_eo_base_destructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Linear_Data *pd)

View File

@ -5,6 +5,7 @@ class Ector.Renderer.Cairo.Gradient_Linear (Ector.Renderer.Cairo.Base, Ector.Ren
implements {
Ector.Renderer.Generic.Base.prepare;
Ector.Renderer.Generic.Base.draw;
Ector.Renderer.Generic.Base.bounds_get;
Ector.Renderer.Cairo.Base.fill;
Eo.Base.destructor;
Efl.Gfx.Gradient.Base.stop.set;

View File

@ -122,6 +122,24 @@ _ector_renderer_cairo_gradient_radial_ector_renderer_cairo_base_fill(Eo *obj, Ec
return EINA_TRUE;
}
static Eina_Bool
_ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_bounds_get(Eo *obj EINA_UNUSED,
Ector_Renderer_Cairo_Gradient_Radial_Data *pd EINA_UNUSED,
Eina_Rectangle *r)
{
Ector_Renderer_Generic_Gradient_Radial_Data *gld;
Ector_Renderer_Cairo_Base_Data *bd;
gld = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_GRADIENT_RADIAL_MIXIN);
bd = eo_data_scope_get(obj, ECTOR_RENDERER_CAIRO_BASE_CLASS);
EINA_RECTANGLE_SET(r,
bd->generic->origin.x + gld->radial.x - gld->radius,
bd->generic->origin.y + gld->radial.y - gld->radius,
gld->radius * 2, gld->radius * 2);
return EINA_TRUE;
}
void
_ector_renderer_cairo_gradient_radial_eo_base_destructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Radial_Data *pd)

View File

@ -5,6 +5,7 @@ class Ector.Renderer.Cairo.Gradient_Radial (Ector.Renderer.Cairo.Base, Ector.Ren
implements {
Ector.Renderer.Generic.Base.prepare;
Ector.Renderer.Generic.Base.draw;
Ector.Renderer.Generic.Base.bounds_get;
Ector.Renderer.Cairo.Base.fill;
Eo.Base.destructor;
Efl.Gfx.Gradient.Base.stop.set;