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);
}
示例#2
0
文件: do_traps.c 项目: aosm/X11
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 ();
    }
}
示例#3
0
/** 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);
}
示例#4
0
文件: Poly.c 项目: narenas/nx-libs
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);
}
示例#6
0
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");
}