1 #include "evas_common.h"
2 #include "evas_private.h"
3 #include "evas_engine.h"
4 #include "Evas_Engine_XRender_Xcb.h"
8 _xre_gradient_new(Xcb_Image_Info *xcbinf)
12 if (!xcbinf) return NULL;
13 gr = calloc(1, sizeof(XR_Gradient));
15 gr->grad = evas_common_gradient_new();
22 gr->xcbinf->references++;
28 _xre_gradient_free(XR_Gradient *gr)
32 evas_common_gradient_free(gr->grad);
34 _xr_render_surface_free(gr->surface);
35 _xr_image_info_free(gr->xcbinf);
40 _xre_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta)
43 evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta);
48 _xre_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta)
51 evas_common_gradient_alpha_stop_add(gr->grad, a, delta);
56 _xre_gradient_clear(XR_Gradient *gr)
59 evas_common_gradient_clear(gr->grad);
64 _xre_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha)
66 evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha);
71 _xre_gradient_alpha_data_set(XR_Gradient *gr, void *amap, int len)
73 evas_common_gradient_alpha_data_set(gr->grad, amap, len);
78 _xre_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h)
81 evas_common_gradient_fill_set(gr->grad, x, y, w, h);
86 _xre_gradient_fill_angle_set(XR_Gradient *gr, double angle)
89 evas_common_gradient_fill_angle_set(gr->grad, angle);
94 _xre_gradient_fill_spread_set(XR_Gradient *gr, int spread)
97 evas_common_gradient_fill_spread_set(gr->grad, spread);
102 _xre_gradient_angle_set(XR_Gradient *gr, double angle)
105 evas_common_gradient_map_angle_set(gr->grad, angle);
110 _xre_gradient_offset_set(XR_Gradient *gr, float offset)
113 evas_common_gradient_map_offset_set(gr->grad, offset);
118 _xre_gradient_direction_set(XR_Gradient *gr, int direction)
121 evas_common_gradient_map_direction_set(gr->grad, direction);
126 _xre_gradient_type_set(XR_Gradient *gr, char *name, char *params)
129 evas_common_gradient_type_set(gr->grad, name, params);
134 _xre_gradient_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h)
138 if ((w < 1) || (h < 1)) return;
139 if (!rs || !dc || !gr) return;
140 if (!gr->xcbinf || !gr->grad || !gr->grad->type.geometer) return;
142 if (gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) ||
143 gr->grad->type.geometer->has_mask(gr->grad, dc->render_op))
145 if (((gr->sw != w) || (gr->sh != h)) && gr->surface)
147 _xr_render_surface_free(gr->surface);
153 gr->surface = _xr_render_surface_new(gr->xcbinf, w, h, gr->xcbinf->fmt32, 1);
154 if (!gr->surface) return;
159 int op = dc->render_op, cuse = dc->clip.use;
162 im = (RGBA_Image*) evas_cache_image_empty(evas_common_image_cache_get());
165 _xr_render_surface_free(gr->surface);
169 evas_cache_image_surface_alloc(&im->cache_entry, w, h);
170 dc->render_op = _EVAS_RENDER_FILL;
172 evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad);
173 _xr_render_surface_argb_pixels_fill(gr->surface, w, h, im->image.data, 0, 0, w, h);
174 evas_cache_image_drop(&im->cache_entry);
178 gr->surface->alpha = alpha;
179 _xr_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->w, gr->surface->h, x, y, w, h, 0);
181 gr->sw = w; gr->sh = h;