2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
4 #include "evas_common.h"
5 /* #include "evas_macros.h" */
6 #include "evas_private.h"
7 #include "evas_engine.h"
8 #include "Evas_Engine_XRender_Xcb.h"
11 /* As opposed to libXRender, we don't have
12 * XDoubleToFixed in XCB :/
14 #define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
16 /* this is a work around broken xrender - when/if this ever gets fixed in xorg
17 * we can comment this out and one day remove it - for now keep it until such
18 * a fix is spotted in the wild
20 #define BROKEN_XORG_XRENDER 1
23 set_filter(Xcb_Render_Surface *s, int smooth)
25 const char *f = smooth ? "best": "nearest";
27 xcb_render_set_picture_filter (s->xcbinf->conn, s->pic, strlen (f), f, 0, NULL);
30 xcb_render_pictforminfo_t *
31 xcb_render_find_visual_format (xcb_connection_t *c, xcb_visualid_t visual)
33 xcb_render_query_pict_formats_cookie_t cookie;
34 xcb_render_query_pict_formats_reply_t *rep;
35 xcb_render_pictscreen_iterator_t screen_iter;
36 xcb_render_pictformat_t format = { 0 };
38 cookie = xcb_render_query_pict_formats (c);
39 rep = xcb_render_query_pict_formats_reply (c, cookie, NULL);
43 screen_iter = xcb_render_query_pict_formats_screens_iterator (rep);
44 for (; screen_iter.rem; xcb_render_pictscreen_next (&screen_iter)) {
45 xcb_render_pictdepth_iterator_t depth_iter;
47 depth_iter = xcb_render_pictscreen_depths_iterator (screen_iter.data);
48 for (; depth_iter.rem; xcb_render_pictdepth_next (&depth_iter)) {
49 xcb_render_pictvisual_iterator_t visual_iter;
51 visual_iter = xcb_render_pictdepth_visuals_iterator (depth_iter.data);
52 for (; visual_iter.rem; xcb_render_pictvisual_next (&visual_iter)) {
53 if (visual == visual_iter.data->visual) {
54 format = visual_iter.data->format;
60 xcb_render_pictforminfo_iterator_t forminfo_iter;
62 forminfo_iter = xcb_render_query_pict_formats_formats_iterator (rep);
63 for (; forminfo_iter.rem; xcb_render_pictforminfo_next (&forminfo_iter)) {
64 if (forminfo_iter.data->id == format) {
65 xcb_render_pictforminfo_t *forminfo;
67 forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
68 memcpy (forminfo, forminfo_iter.data, sizeof (xcb_render_pictforminfo_t));
81 _xr_render_surface_new(Xcb_Image_Info *xcbinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha)
83 Xcb_Render_Surface *rs;
87 if ((!xcbinf) || (!fmt) || (w < 1) || (h < 1)) return NULL;
89 rs = calloc(1, sizeof(Xcb_Render_Surface));
94 rs->fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
100 memcpy (rs->fmt, fmt, sizeof (xcb_render_pictforminfo_t));
102 rs->depth = fmt->depth;
104 rs->draw = xcb_generate_id(xcbinf->conn);
105 xcb_create_pixmap(xcbinf->conn, fmt->depth, rs->draw, xcbinf->root, w, h);
112 rs->xcbinf->references++;
113 mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
117 rs->pic = xcb_generate_id(xcbinf->conn);
118 xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, fmt->id, mask, values);
121 xcb_free_pixmap(rs->xcbinf->conn, rs->draw);
122 rs->xcbinf->references--;
132 _xr_render_surface_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, int alpha)
134 Xcb_Render_Surface *rs;
138 if ((!xcbinf) || (draw == 0) || (w < 1) || (h < 1)) return NULL;
139 rs = calloc(1, sizeof(Xcb_Render_Surface));
140 if (!rs) return NULL;
144 /* if (fmt->depth == xcbinf->fmt32->depth) */
145 /* rs->fmt = xcbinf->fmt32; */
146 /* else if (fmt->depth == xcbinf->fmt24->depth) */
147 /* rs->fmt = xcbinf->fmt24; */
148 /* else if (fmt->depth == xcbinf->fmt8->depth) */
149 /* rs->fmt = xcbinf->fmt8; */
150 /* else if (fmt->depth == xcbinf->fmt4->depth) */
151 /* rs->fmt = xcbinf->fmt4; */
153 /* rs->fmt = xcbinf->fmt1; */
156 rs->fmt = xcb_render_find_visual_format(xcbinf->conn, xcbinf->vis);
163 rs->depth = rs->fmt->depth;
164 if (rs->fmt->depth == 32) rs->alpha = 1;
167 rs->xcbinf->references++;
168 mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
172 rs->pic = xcb_generate_id(xcbinf->conn);
173 xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, rs->fmt->id, mask, values);
176 rs->xcbinf->references--;
186 _xr_render_surface_format_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha)
188 Xcb_Render_Surface *rs;
192 if ((!xcbinf) || (!fmt) || (draw == 0) || (w < 1) || (h < 1)) return NULL;
193 rs = calloc(1, sizeof(Xcb_Render_Surface));
194 if (!rs) return NULL;
198 rs->fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t));
199 memcpy (rs->fmt, fmt, sizeof (xcb_render_pictforminfo_t));
201 rs->depth = fmt->depth;
202 if (fmt->depth == 32) rs->alpha = 1;
203 rs->xcbinf->references++;
206 mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA;
210 rs->pic = xcb_generate_id(xcbinf->conn);
211 xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, fmt->id, mask, values);
214 rs->xcbinf->references--;
224 _xr_render_surface_free(Xcb_Render_Surface *rs)
229 if ((rs->allocated) && (rs->draw != 0))
230 xcb_free_pixmap(rs->xcbinf->conn, rs->draw);
232 xcb_render_free_picture(rs->xcbinf->conn, rs->pic);
233 _xr_image_info_free(rs->xcbinf);
241 _xr_render_surface_repeat_set(Xcb_Render_Surface *rs, int repeat)
246 mask = XCB_RENDER_CP_REPEAT;
248 xcb_render_change_picture(rs->xcbinf->conn, rs->pic, mask, value);
252 _xr_render_surface_solid_rectangle_set(Xcb_Render_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h)
254 xcb_render_color_t col;
255 xcb_rectangle_t rect;
262 col.red = (r << 8) | r;
263 col.green = (g << 8) | g;
264 col.blue = (b << 8) | b;
265 col.alpha = (a << 8) | a;
270 xcb_render_fill_rectangles(rs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, rs->pic, col, 1, &rect);
274 _xr_render_surface_argb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h)
276 Xcb_Image_Image *xcbim;
277 unsigned int *p, *sp, *sple, *spe;
278 unsigned int jump, sjump;
279 unsigned int a, r, g, b, aa;
281 xcbim = _xr_image_new(rs->xcbinf, w, h, rs->depth);
283 p = (unsigned int *)xcbim->data;
284 sp = ((unsigned int *)pixels) + (y * sw) + x;
285 jump = ((xcbim->line_bytes / 4) - w);
287 spe = sp + ((h - 1) * sw) + w;
289 #ifdef WORDS_BIGENDIAN
290 (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
292 (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
300 switch (a = A_VAL(sp))
306 *p = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | 0xff;
310 r = ((R_VAL(sp)) * aa) >> 8;
311 g = ((G_VAL(sp)) * aa) >> 8;
312 b = ((B_VAL(sp)) * aa) >> 8;
313 *p = (b << 24) | (g << 16) | (r << 8) | a;
330 switch (a = (*sp & 0xff000000))
340 *p = a + (((((*sp) >> 8) & 0xff) * aa) & 0xff00) +
341 (((((*sp) & 0x00ff00ff) * aa) >> 8) & 0x00ff00ff);
351 _xr_image_put(xcbim, rs->draw, x, y, w, h);
355 _xr_render_surface_rgb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h)
357 Xcb_Image_Image *xcbim;
358 unsigned int *p, *sp, *sple, *spe;
359 unsigned int jump, sjump;
361 xcbim = _xr_image_new(rs->xcbinf, w, h, rs->depth);
363 p = (unsigned int *)xcbim->data;
364 sp = ((unsigned int *)pixels) + (y * sw) + x;
365 jump = ((xcbim->line_bytes / 4) - w);
367 spe = sp + ((h - 1) * sw) + w;
369 #ifdef WORDS_BIGENDIAN
370 (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
372 (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
380 *p = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff;
395 *p = 0xff000000 | *sp;
403 _xr_image_put(xcbim, rs->draw, x, y, w, h);
407 _xr_render_surface_clips_set(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh)
410 xcb_rectangle_t *rect = NULL;
412 if ((dc) && (dc->clip.use))
414 RECTS_CLIP_TO_RECT(rx, ry, rw, rh,
415 dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
417 if ((!dc) || (!dc->cutout.rects))
419 rect = malloc(sizeof(xcb_rectangle_t));
433 rects = evas_common_draw_context_apply_cutouts(dc);
435 rect = malloc(num * sizeof(xcb_rectangle_t));
437 for (i = 0; i < num; i++)
439 r = rects->rects + i;
442 rect[i].width = r->w;
443 rect[i].height = r->h;
445 evas_common_draw_context_apply_clear_cutouts(rects);
448 xcb_render_set_picture_clip_rectangles(rs->xcbinf->conn, rs->pic, 0, 0, num, rect);
452 /* initialized the transform to the identity */
454 init_transform (xcb_render_transform_t *t)
456 t->matrix11 = t->matrix22 = t->matrix33 = DOUBLE_TO_FIXED(1);
458 t->matrix12 = t->matrix13 = t->matrix21 = t->matrix23 =
459 t->matrix31 = t->matrix32 = 0;
463 set_transform_scale(xcb_render_transform_t *t,
469 if ((sw > 1) && (w > 1))
471 if ((sh > 1) && (h > 1))
473 t->matrix11 = DOUBLE_TO_FIXED((double)sw / (double)w);
474 t->matrix22 = DOUBLE_TO_FIXED((double)sh / (double)h);
477 // when color multiplier is used want: instead
478 // CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check.
480 _xr_render_surface_composite(Xcb_Render_Surface *srs,
481 Xcb_Render_Surface *drs,
482 RGBA_Draw_Context *dc,
493 Xcb_Render_Surface *trs = NULL;
494 xcb_render_transform_t xf;
495 xcb_render_picture_t mask = XCB_NONE;
497 uint32_t value_list[1];
499 xcb_render_pict_op_t op;
501 if ((sw < 1) || (sh < 1) || (w < 1) || (h < 1)) return;
503 is_scaling = e = (sw != w) || (sh != h);
505 value_mask = XCB_RENDER_CP_CLIP_MASK;
507 xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
508 xcb_render_change_picture(drs->xcbinf->conn, drs->pic, value_mask, value_list);
512 op = XCB_RENDER_PICT_OP_OVER;
513 if (dc->render_op == _EVAS_RENDER_BLEND)
515 if (!srs->alpha) op = XCB_RENDER_PICT_OP_SRC;
517 else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
518 op = XCB_RENDER_PICT_OP_ATOP;
519 else if (dc->render_op == _EVAS_RENDER_MUL)
520 op = XCB_RENDER_PICT_OP_IN;
521 else if (dc->render_op == _EVAS_RENDER_COPY)
522 op = XCB_RENDER_PICT_OP_SRC;
523 else if (dc->render_op == _EVAS_RENDER_COPY_REL)
524 op = XCB_RENDER_PICT_OP_IN;
525 else if (dc->render_op == _EVAS_RENDER_MASK)
526 op = XCB_RENDER_PICT_OP_IN_REVERSE;
528 if ((dc) && (dc->mul.use))
532 if ((op == XCB_RENDER_PICT_OP_OVER) && (!dc->mul.col)) return;
533 a = dc->mul.col >> 24;
534 r = (dc->mul.col >> 16) & 0xff;
535 g = (dc->mul.col >> 8) & 0xff;
536 b = dc->mul.col & 0xff;
537 if (dc->mul.col != 0xffffffff)
539 if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) ||
540 (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a))
542 srs->xcbinf->mul_r = r;
543 srs->xcbinf->mul_g = g;
544 srs->xcbinf->mul_b = b;
545 srs->xcbinf->mul_a = a;
546 _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul,
553 mask = srs->xcbinf->mul->pic;
554 if (dc->mul.col == (a * 0x01010101))
556 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
558 xcb_render_change_picture(srs->xcbinf->conn, mask, value_mask, value_list);
562 if ((srs->alpha) || (a != 0xff))
563 trs = _xr_render_surface_new(srs->xcbinf, sw + e, sh + e,
564 srs->xcbinf->fmt32, 1);
566 trs = _xr_render_surface_new(srs->xcbinf, sw + e, sh + e,
567 srs->fmt, srs->alpha);
570 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
572 xcb_render_change_picture(srs->xcbinf->conn, mask, value_mask, value_list);
573 xcb_render_set_picture_transform(trs->xcbinf->conn, srs->pic, xf);
574 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic,
575 sx, sy, 0, 0, 0, 0, sw, sh);
576 /* fill right and bottom pixel so interpolation works right */
579 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic,
580 sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
581 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic,
582 sx, sy + sh - 1, 0, 0, 0, sh, sw, 1);
583 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic,
584 sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1);
591 _xr_render_surface_clips_set(drs, dc, x, y, w, h);
594 set_filter(trs, smooth);
596 set_transform_scale(&xf, sw, sh, w, h);
597 xcb_render_set_picture_transform(trs->xcbinf->conn, trs->pic, xf);
599 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
601 if (dc->render_op == _EVAS_RENDER_MUL)
603 xcb_render_change_picture(trs->xcbinf->conn, trs->pic, value_mask, value_list);
605 xcb_render_composite(trs->xcbinf->conn, op, trs->pic, mask, drs->pic,
606 0, 0, 0, 0, x, y, w, h);
607 _xr_render_surface_free(trs);
611 if (srs->bordered && is_scaling)
613 trs = _xr_render_surface_new(srs->xcbinf, sw + 1, sh + 1,
614 srs->fmt, srs->alpha);
617 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
619 xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
620 xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf);
621 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic,
622 sx, sy, 0, 0, 0, 0, sw, sh);
624 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic,
625 sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
626 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic,
627 sx, sy + sh - 1, 0, 0, 0, sh, sw, 1);
628 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic,
629 sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1);
631 set_filter(trs, smooth);
633 set_transform_scale(&xf, sw, sh, w, h);
634 xcb_render_set_picture_transform(trs->xcbinf->conn, trs->pic, xf);
636 if (dc->render_op == _EVAS_RENDER_MUL)
638 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
640 xcb_render_change_picture(trs->xcbinf->conn, trs->pic, value_mask, value_list);
643 xcb_render_composite(trs->xcbinf->conn, op, trs->pic, mask, drs->pic,
644 0, 0, 0, 0, x, y, w, h);
645 _xr_render_surface_free(trs);
649 set_filter(srs, smooth);
651 set_transform_scale(&xf, sw, sh, w, h);
652 xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf);
654 value_mask = XCB_RENDER_CP_COMPONENT_ALPHA;
656 if (dc->render_op == _EVAS_RENDER_MUL)
658 xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
660 xcb_render_composite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic,
661 ((sx * w) + (sw / 2)) / sw,
662 ((sy * h) + (sh / 2)) / sh,
669 _xr_render_surface_copy(Xcb_Render_Surface *srs, Xcb_Render_Surface *drs, int sx, int sy, int x, int y, int w, int h)
671 xcb_render_transform_t xf;
673 uint32_t value_list[1];
675 if ((w < 1) || (h < 1) || (!srs) || (!drs)) return;
678 #ifdef BROKEN_XORG_XRENDER
679 /* FIXME: why do we need to change the identity matrix if the src surface
684 xf.matrix11 = xf.matrix22 = xf.matrix33 = 1;
687 xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf);
688 /* set_filter(srs, 0); */
690 value_mask = XCB_RENDER_CP_CLIP_MASK;
692 xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
693 xcb_render_change_picture(drs->xcbinf->conn, drs->pic, value_mask, value_list);
695 xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, drs->pic,
696 sx, sy, 0, 0, x, y, w, h);
700 _xr_render_surface_rectangle_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h)
702 xcb_render_color_t col;
703 xcb_rectangle_t rect;
707 xcb_render_pict_op_t op;
709 if ((!rs) || (!dc)) return;
710 if ((w < 1) || (h < 1)) return;
711 a = dc->col.col >> 24;
712 r = (dc->col.col >> 16) & 0xff;
713 g = (dc->col.col >> 8 ) & 0xff;
714 b = (dc->col.col ) & 0xff;
715 col.red = (r << 8) | r;
716 col.green = (g << 8) | g;
717 col.blue = (b << 8) | b;
718 col.alpha = (a << 8) | a;
720 op = XCB_RENDER_PICT_OP_SRC;
721 if (dc->render_op == _EVAS_RENDER_BLEND)
723 if (!dc->col.col) return;
724 if (a == 0xff) op = XCB_RENDER_PICT_OP_SRC;
726 else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
728 if (!dc->col.col) return;
729 op = XCB_RENDER_PICT_OP_ATOP;
731 else if (dc->render_op == _EVAS_RENDER_MUL)
733 if (dc->col.col == 0xffffffff) return;
734 op = XCB_RENDER_PICT_OP_IN;
736 else if (dc->render_op == _EVAS_RENDER_COPY)
737 op = XCB_RENDER_PICT_OP_SRC;
738 else if (dc->render_op == _EVAS_RENDER_COPY_REL)
739 op = XCB_RENDER_PICT_OP_IN;
740 else if (dc->render_op == _EVAS_RENDER_MASK)
741 op = XCB_RENDER_PICT_OP_IN_REVERSE;
743 value_mask = XCB_RENDER_CP_CLIP_MASK;
745 xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, &value_list);
747 _xr_render_surface_clips_set(rs, dc, x, y, w, h);
752 xcb_render_fill_rectangles(rs->xcbinf->conn, op, rs->pic, col, 1, &rect);
756 _xr_render_surface_line_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2)
758 /* uint32_t value_mask; */
759 /* uint32_t value_list[1]; */
762 /* if ((!rs) || (!dc)) return; */
763 /* op = XCB_RENDER_PICT_OP_SRC; */
764 /* value_mask = XCB_RENDER_CP_CLIP_MASK; */
765 /* value_list[0] = 0; */
766 /* xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, value_list); */
767 /* _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); */
770 /* int r, g, b, a; */
771 /* XPointDouble poly[4]; */
773 /* double len, ddx, ddy; */
777 /* len = sqrt((double)(dx * dx) + (double)(dy * dy)); */
778 /* ddx = (0.5 * dx) / len; */
779 /* ddy = (0.5 * dy) / len; */
780 /* poly[0].x = (x1 + ddx); */
781 /* poly[0].y = (y1 - ddy); */
782 /* poly[1].x = (x2 + ddx); */
783 /* poly[1].y = (y2 - ddy); */
784 /* poly[2].x = (x2 - ddx); */
785 /* poly[2].y = (y2 + ddy); */
786 /* poly[3].x = (x1 - ddx); */
787 /* poly[3].y = (y1 + ddy); */
789 /* a = (dc->col.col >> 24) & 0xff; */
790 /* if (a == 0) return; */
791 /* if (a < 0xff) op = XCB_RENDER_PICT_OP_OVER; */
792 /* r = (dc->col.col >> 16) & 0xff; */
793 /* g = (dc->col.col >> 8 ) & 0xff; */
794 /* b = (dc->col.col ) & 0xff; */
795 /* if ((rs->xcbinf->mul_r != r) || (rs->xcbinf->mul_g != g) || */
796 /* (rs->xcbinf->mul_b != b) || (rs->xcbinf->mul_a != a)) */
798 /* rs->xcbinf->mul_r = r; */
799 /* rs->xcbinf->mul_g = g; */
800 /* rs->xcbinf->mul_b = b; */
801 /* rs->xcbinf->mul_a = a; */
802 /* _xr_render_surface_solid_rectangle_set(rs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); */
804 /* XRenderCompositeDoublePoly(rs->xcbinf->conn, op, */
805 /* rs->xcbinf->mul->pic, rs->pic, */
806 /* rs->xcbinf->fmt8, 0, 0, 0, 0, */
807 /* poly, 4, EvenOddRule); */
812 _xre_poly_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points)
814 /* RGBA_Polygon_Point *pt; */
816 /* XPointDouble *pts; */
817 /* int r, g, b, a; */
818 /* uint32_t value_mask; */
819 /* uint32_t value_list[1]; */
822 /* if ((!rs) || (!dc)) return; */
824 /* for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) num++; */
825 /* if (num < 3) return; */
826 /* a = (dc->col.col >> 24) & 0xff; */
827 /* if (a == 0) return; */
828 /* op = XCB_RENDER_PICT_OP_OVER; */
829 /* r = (dc->col.col >> 16) & 0xff; */
830 /* g = (dc->col.col >> 8 ) & 0xff; */
831 /* b = (dc->col.col ) & 0xff; */
832 /* if ((rs->xcbinf->mul_r != r) || (rs->xcbinf->mul_g != g) || */
833 /* (rs->xcbinf->mul_b != b) || (rs->xcbinf->mul_a != a)) */
835 /* rs->xcbinf->mul_r = r; */
836 /* rs->xcbinf->mul_g = g; */
837 /* rs->xcbinf->mul_b = b; */
838 /* rs->xcbinf->mul_a = a; */
839 /* _xr_render_surface_solid_rectangle_set(rs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); */
841 /* pts = malloc(num * sizeof(XPointDouble)); */
842 /* if (!pts) return; */
844 /* for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) */
848 /* pts[i].x = pt->x; */
849 /* pts[i].y = pt->y; */
853 /* value_mask = XCB_RENDER_CP_CLIP_MASK; */
854 /* value_list[0] = 0; */
855 /* xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, value_list); */
857 /* _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); */
858 /* XRenderCompositeDoublePoly(rs->xcbinf->conn, op, */
859 /* rs->xcbinf->mul->pic, rs->pic, */
860 /* rs->xcbinf->fmt8, 0, 0, 0, 0, */
861 /* pts, num, Complex); */