static void fill_rect(struct test_display *dpy, Picture p, uint8_t op, int x, int y, int w, int h, int dx, int dy, enum mask mask, uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) { XRenderColor render_color; XTrapezoid trap; Picture src; render_color.red = red * alpha; render_color.green = green * alpha; render_color.blue = blue * alpha; render_color.alpha = alpha << 8; trap.left.p1.x = trap.left.p2.x = (x << 16) + dx; trap.top = trap.left.p1.y = trap.right.p1.y = (y << 16) + dy; trap.right.p1.x = trap.right.p2.x = ((x + w) << 16) + dx; trap.bottom = trap.left.p2.y = trap.right.p2.y = ((y + h) << 16) + dy; src = XRenderCreateSolidFill(dpy->dpy, &render_color); XRenderCompositeTrapezoids(dpy->dpy, op, src, p, mask_format(dpy->dpy, mask), 0, 0, &trap, 1); XRenderFreePicture(dpy->dpy, src); }
void DoFixedTrapezoids(XParms xp, Parms p, int reps) { int i; Picture white, black, src, dst; white = XftDrawSrcPicture (aadraw, &aawhite); black = XftDrawSrcPicture (aadraw, &aablack); dst = XftDrawPicture (aadraw); src = black; for (i = 0; i != reps; i++) { XRenderCompositeTrapezoids (xp->d, PictOpOver, src, dst, maskFormat, 0, 0, traps, p->objects); if (src == black) src = white; else src = black; CheckAbort (); } }
/** Composite a list of trapezoids on the appropriate screen. For a * complete description see the protocol document of the RENDER * library. */ void dmxTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst, PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, int ntrap, xTrapezoid *traps) { ScreenPtr pScreen = pDst->pDrawable->pScreen; DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; PictureScreenPtr ps = GetPictureScreen(pScreen); dmxPictPrivPtr pSrcPriv = DMX_GET_PICT_PRIV(pSrc); dmxPictPrivPtr pDstPriv = DMX_GET_PICT_PRIV(pDst); DMX_UNWRAP(Trapezoids, dmxScreen, ps); #if 0 if (ps->Trapezoids) ps->Trapezoids(op, pSrc, pDst, maskFormat, xSrc, ySrc, ntrap, *traps); #endif /* Draw trapezoids on back-end server */ if (pDstPriv->pict) { XRenderPictFormat *pFormat; pFormat = dmxFindFormat(dmxScreen, maskFormat); if (!pFormat) { /* FIXME: Error! */ } XRenderCompositeTrapezoids(dmxScreen->beDisplay, op, pSrcPriv->pict, pDstPriv->pict, pFormat, xSrc, ySrc, (XTrapezoid *)traps, ntrap); dmxSync(dmxScreen, FALSE); } DMX_WRAP(Trapezoids, dmxTrapezoids, dmxScreen, ps); }
void XRenderCompositeDoublePoly (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XPointDouble *fpoints, int npoints, int winding) { Edge *edges; XTrapezoid *traps; int i, nedges, ntraps; XFixed x, y, prevx = 0, prevy = 0, firstx = 0, firsty = 0; XFixed top = 0, bottom = 0; /* GCCism */ edges = (Edge *) Xmalloc (npoints * sizeof (Edge) + (npoints * npoints * sizeof (XTrapezoid))); if (!edges) return; traps = (XTrapezoid *) (edges + npoints); nedges = 0; for (i = 0; i <= npoints; i++) { if (i == npoints) { x = firstx; y = firsty; } else { x = XDoubleToFixed (fpoints[i].x); y = XDoubleToFixed (fpoints[i].y); } if (i) { if (y < top) top = y; else if (y > bottom) bottom = y; if (prevy < y) { edges[nedges].edge.p1.x = prevx; edges[nedges].edge.p1.y = prevy; edges[nedges].edge.p2.x = x; edges[nedges].edge.p2.y = y; edges[nedges].clockWise = True; nedges++; } else if (prevy > y) { edges[nedges].edge.p1.x = x; edges[nedges].edge.p1.y = y; edges[nedges].edge.p2.x = prevx; edges[nedges].edge.p2.y = prevy; edges[nedges].clockWise = False; nedges++; } /* drop horizontal edges */ } else { top = y; bottom = y; firstx = x; firsty = y; } prevx = x; prevy = y; } ntraps = XRenderComputeTrapezoids (edges, nedges, winding, traps); /* XXX adjust xSrc/xDst */ XRenderCompositeTrapezoids (dpy, op, src, dst, maskFormat, xSrc, ySrc, traps, ntraps); Xfree (edges); }
static void trap_tests(struct test *t, enum mask mask, enum trapezoid trapezoid, int reps, int sets, enum target target) { struct test_target real, ref; XTrapezoid *traps; int max_traps = 65536; int r, s, n; traps = malloc(sizeof(*traps) * max_traps); if (traps == NULL) return; printf("Testing trapezoids (%s with mask %s) (%s): ", trapezoid_name(trapezoid), mask_name(mask), test_target_name(target)); fflush(stdout); test_target_create_render(&t->real, target, &real); clear(&t->real, &real); test_target_create_render(&t->ref, target, &ref); clear(&t->ref, &ref); for (s = 0; s < sets; s++) { for (r = 0; r < reps; r++) { XRenderColor render_color; int op = ops[rand() % sizeof(ops)]; int red = rand() % 0xff; int green = rand() % 0xff; int blue = rand() % 0xff; int alpha = rand() % 0xff; int num_traps = rand() % max_traps; Picture src; for (n = 0; n < num_traps; n++) random_trapezoid(&traps[n], 0, 0, 0, real.width, real.height); render_color.red = red * alpha; render_color.green = green * alpha; render_color.blue = blue * alpha; render_color.alpha = alpha << 8; src = XRenderCreateSolidFill(t->real.dpy, &render_color); XRenderCompositeTrapezoids(t->real.dpy, op, src, real.picture, mask_format(t->real.dpy, mask), 0, 0, traps, num_traps); XRenderFreePicture(t->real.dpy, src); src = XRenderCreateSolidFill(t->ref.dpy, &render_color); XRenderCompositeTrapezoids(t->ref.dpy, op, src, ref.picture, mask_format(t->ref.dpy, mask), 0, 0, traps, num_traps); XRenderFreePicture(t->ref.dpy, src); } test_compare(t, real.draw, real.format, ref.draw, ref.format, 0, 0, real.width, real.height, ""); } printf("passed [%d iterations x %d]\n", reps, sets); test_target_destroy_render(&t->real, &real); test_target_destroy_render(&t->ref, &ref); free(traps); }
static void edge_test(struct test *t, enum mask mask, enum edge edge, enum target target) { struct test_target out, ref; XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff }; Picture src_ref, src_out; XTrapezoid trap; int left_or_right, p; test_target_create_render(&t->out, target, &out); set_edge(t->out.dpy, out.picture, edge); src_out = XRenderCreateSolidFill(t->out.dpy, &white); test_target_create_render(&t->ref, target, &ref); set_edge(t->ref.dpy, ref.picture, edge); src_ref = XRenderCreateSolidFill(t->ref.dpy, &white); printf("Testing edges (with mask %s and %s edges) (%s): ", mask_name(mask), edge_name(edge), test_target_name(target)); fflush(stdout); for (left_or_right = 0; left_or_right <= 1; left_or_right++) { for (p = -64; p <= out.width + 64; p++) { char buf[80]; if (left_or_right) { trap.left.p1.x = 0; trap.left.p1.y = 0; trap.left.p2.x = 0; trap.left.p2.y = out.height << 16; trap.right.p1.x = p << 16; trap.right.p1.y = 0; trap.right.p2.x = out.width << 16; trap.right.p2.y = out.height << 16; } else { trap.right.p1.x = out.width << 16; trap.right.p1.y = 0; trap.right.p2.x = out.width << 16; trap.right.p2.y = out.height << 16; trap.left.p1.x = 0; trap.left.p1.y = 0; trap.left.p2.x = p << 16; trap.left.p2.y = out.height << 16; } trap.top = 0; trap.bottom = out.height << 16; sprintf(buf, "trap=((%d, %d), (%d, %d)), ((%d, %d), (%d, %d))\n", trap.left.p1.x >> 16, trap.left.p1.y >> 16, trap.left.p2.x >> 16, trap.left.p2.y >> 16, trap.right.p1.x >> 16, trap.right.p1.y >> 16, trap.right.p2.x >> 16, trap.right.p2.y >> 16); clear(&t->out, &out); XRenderCompositeTrapezoids(t->out.dpy, PictOpSrc, src_out, out.picture, mask_format(t->out.dpy, mask), 0, 0, &trap, 1); clear(&t->ref, &ref); XRenderCompositeTrapezoids(t->ref.dpy, PictOpSrc, src_ref, ref.picture, mask_format(t->ref.dpy, mask), 0, 0, &trap, 1); test_compare(t, out.draw, out.format, ref.draw, ref.format, 0, 0, out.width, out.height, buf); } } XRenderFreePicture(t->out.dpy, src_out); test_target_destroy_render(&t->out, &out); XRenderFreePicture(t->ref.dpy, src_ref); test_target_destroy_render(&t->ref, &ref); printf("pass\n"); }