imlib_copy_drawable_to_image() and

imlib_create_image_from_drawable():
- When mask is set to (Pixmap)1 (and the context drawable is a window)
  the window shape is used for image alpha.

imlib_create_image_from_drawable() and
imlib_create_scaled_image_from_drawable():
- Set image F_HAS_ALPHA alpha flag according to whether or not useful image
  alpha data was generated.


SVN revision: 22712
This commit is contained in:
Kim Woelders 2006-05-18 19:23:26 +00:00
parent b09023b6da
commit 7f1bc6088f
3 changed files with 38 additions and 14 deletions

View File

@ -2098,11 +2098,12 @@ imlib_create_image_using_copied_data(int width, int height, DATA32 * data)
* @return a valid image, otherwise NULL.
*
* Return an image (using the mask @p mask to determine the alpha channel)
* from the current drawable. If the mask is 0 it will not create a
* useful alpha channel in the image. It will create an image from the
* from the current drawable.
* If @p mask is 0 it will not create a useful alpha channel in the image.
* If @p mask is 1 the mask will be set to the shape mask of the drawable.
* It will create an image from the
* (@p x, @p y, @p width , @p height) rectangle in the drawable. If @p
* need_to_grab_x
* is 1 it will also grab the X Server to avoid possible race
* need_to_grab_x is 1 it will also grab the X Server to avoid possible race
* conditions in grabbing. If you have not already grabbed the server
* you MUST set this to 1. Imlib2 returns a valid image handle on
* success or NULL on failure.
@ -2118,13 +2119,21 @@ imlib_create_image_from_drawable(Pixmap mask, int x, int y, int width,
if (!ctx)
ctx = imlib_context_new();
if (mask)
domask = 1;
{
domask = 1;
if (mask == (Pixmap)1)
mask = None;
}
im = __imlib_CreateImage(width, height, NULL);
im->data = malloc(width * height * sizeof(DATA32));
__imlib_GrabDrawableToRGBA(im->data, 0, 0, width, height, ctx->display,
ctx->drawable, mask, ctx->visual, ctx->colormap,
ctx->depth, x, y, width, height, domask,
ctx->depth, x, y, width, height, &domask,
need_to_grab_x);
if (domask)
SET_FLAG(im->flags, F_HAS_ALPHA);
else
UNSET_FLAG(im->flags, F_HAS_ALPHA);
return (Imlib_Image) im;
}
@ -2265,8 +2274,12 @@ imlib_create_scaled_image_from_drawable(Pixmap mask, int source_x,
__imlib_GrabDrawableToRGBA(im->data, 0, 0, destination_width,
source_height, ctx->display, p, m,
ctx->visual, ctx->colormap, ctx->depth, 0, 0,
destination_width, destination_height, domask,
destination_width, destination_height, &domask,
need_to_grab_x);
if (domask)
SET_FLAG(im->flags, F_HAS_ALPHA);
else
UNSET_FLAG(im->flags, F_HAS_ALPHA);
XFreePixmap(ctx->display, p);
if (m != None)
{
@ -2290,10 +2303,11 @@ imlib_create_scaled_image_from_drawable(Pixmap mask, int source_x,
* @param need_to_grab_x Grab flag.
* @return A char.
*
* Grabs a section of the current drawable (optionally using the
* pixmap @p mask
* Grabs a section of the current drawable (optionally using the pixmap @p mask
* provided as a corresponding mask for that drawable - if @p mask is 0
* this is not used). It grabs the (@p x, @p y, @p width, @p height) rectangle and
* this is not used).
* If @p mask is 1 the mask will be set to the shape mask of the drawable.
* It grabs the (@p x, @p y, @p width, @p height) rectangle and
* places it at the destination (@p destination_x, @p destination_y) location in the current image. If
* @p need_to_grab_x is 1 it will grab and ungrab the server whilst doing
* this - you need to do this if you have not already grabbed the
@ -2314,7 +2328,11 @@ imlib_copy_drawable_to_image(Pixmap mask, int x, int y, int width, int height,
CHECK_PARAM_POINTER_RETURN("imlib_copy_drawable_to_image", "image",
ctx->image, 0);
if (mask)
domask = 1;
{
domask = 1;
if (mask == (Pixmap)1)
mask = None;
}
CAST_IMAGE(im, ctx->image);
if ((!(im->data)) && (im->loader) && (im->loader->load))
@ -2365,7 +2383,7 @@ imlib_copy_drawable_to_image(Pixmap mask, int x, int y, int width, int height,
im->w, im->h, ctx->display,
ctx->drawable, mask, ctx->visual,
ctx->colormap, ctx->depth, x, y, width,
height, domask, need_to_grab_x);
height, &domask, need_to_grab_x);
}
#endif

View File

@ -461,11 +461,12 @@ char
__imlib_GrabDrawableToRGBA(DATA32 * data, int ox, int oy, int ow, int oh,
Display * d, Drawable p, Pixmap m, Visual * v,
Colormap cm, int depth, int x, int y,
int w, int h, char domask, char grab)
int w, int h, char *pdomask, char grab)
{
XErrorHandler prev_erh = NULL;
XWindowAttributes xatt, ratt;
char is_pixmap = 0, created_mask = 0, is_shm = 0, is_mshm = 0;
char domask;
int i;
int src_x, src_y, src_w, src_h, origw, origh;
int width, height, clipx, clipy;
@ -474,6 +475,7 @@ __imlib_GrabDrawableToRGBA(DATA32 * data, int ox, int oy, int ow, int oh,
static signed char x_does_shm = -1;
XColor cols[256];
domask = (pdomask) ? *pdomask : 0;
/* FIXME: oh isnt used - i wonder if there's a bug looming... */
oh = 0;
origw = w;
@ -785,6 +787,10 @@ __imlib_GrabDrawableToRGBA(DATA32 * data, int ox, int oy, int ow, int oh,
XFreePixmap(d, m);
if (mxim)
XDestroyImage(mxim);
if ((pdomask) && (!m) && (xatt.depth != 32))
*pdomask = 0;
return 1;
}

View File

@ -7,7 +7,7 @@ __hidden char
__imlib_GrabDrawableToRGBA(DATA32 *data, int ox, int oy, int ow, int oh,
Display *d, Drawable p, Pixmap m, Visual *v,
Colormap cm, int depth, int x, int y,
int w, int h, char domask, char grab);
int w, int h, char *domask, char grab);
__hidden void
__imlib_GrabXImageToRGBA(DATA32 *data, int ox, int oy, int ow, int oh,
Display *d, XImage *xim, XImage *mxim, Visual *v,