Esempio n. 1
0
static pixman_image_t *
create_bits_picture(PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
{
    PixmapPtr pixmap;
    FbBits *bits;
    FbStride stride;
    int bpp;
    pixman_image_t *image;

    fbGetDrawablePixmap(pict->pDrawable, pixmap, *xoff, *yoff);
    fbGetPixmapBitsData(pixmap, bits, stride, bpp);

    image = pixman_image_create_bits((pixman_format_code_t) pict->format,
                                     pixmap->drawable.width,
                                     pixmap->drawable.height, (uint32_t *) bits,
                                     stride * sizeof(FbStride));

    if (!image)
        return NULL;

#ifdef FB_ACCESS_WRAPPER
#if FB_SHIFT==5

    pixman_image_set_accessors(image,
                               (pixman_read_memory_func_t) wfbReadMemory,
                               (pixman_write_memory_func_t) wfbWriteMemory);

#else

#error The pixman library only works when FbBits is 32 bits wide

#endif
#endif

    /* pCompositeClip is undefined for source pictures, so
     * only set the clip region for pictures with drawables
     */
    if (has_clip) {
        if (pict->clientClipType != CT_NONE)
            pixman_image_set_has_client_clip(image, TRUE);

        if (*xoff || *yoff)
            pixman_region_translate(pict->pCompositeClip, *xoff, *yoff);

        pixman_image_set_clip_region(image, pict->pCompositeClip);

        if (*xoff || *yoff)
            pixman_region_translate(pict->pCompositeClip, -*xoff, -*yoff);
    }

    /* Indexed table */
    if (pict->pFormat->index.devPrivate)
        pixman_image_set_indexed(image, pict->pFormat->index.devPrivate);

    /* Add in drawable origin to position within the image */
    *xoff += pict->pDrawable->x;
    *yoff += pict->pDrawable->y;

    return image;
}
Esempio n. 2
0
static pixman_image_t *
create_bits_picture(PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
{
	PixmapPtr pixmap;
	FbBits *bits;
	FbStride stride;
	int bpp;
	pixman_image_t *image;

	fbGetDrawablePixmap(pict->pDrawable, pixmap, *xoff, *yoff);
	fbGetPixmapBitsData(pixmap, bits, stride, bpp);

	image = pixman_image_create_bits((pixman_format_code_t) pict->format,
					 pixmap->drawable.width,
					 pixmap->drawable.height, (uint32_t *) bits,
					 stride * sizeof(FbStride));

	if (!image)
		return NULL;

	/* pCompositeClip is undefined for source pictures, so
	 * only set the clip region for pictures with drawables
	 */
	if (has_clip) {
		if (picture_has_clip(pict))
			pixman_image_set_has_client_clip(image, TRUE);

		if (*xoff || *yoff)
			pixman_region_translate(pict->pCompositeClip, *xoff, *yoff);

		pixman_image_set_clip_region(image, pict->pCompositeClip);

		if (*xoff || *yoff)
			pixman_region_translate(pict->pCompositeClip, -*xoff, -*yoff);
	}

	/* Indexed table */
	if (pict->pFormat->index.devPrivate)
		pixman_image_set_indexed(image, pict->pFormat->index.devPrivate);

	/* Add in drawable origin to position within the image */
	*xoff += pict->pDrawable->x;
	*yoff += pict->pDrawable->y;

	return image;
}