Fix caching of imlib images (has been severely crippled for some time).
SVN revision: 17613
This commit is contained in:
parent
a201daf79f
commit
5d8a30e301
|
@ -161,8 +161,8 @@ EwinBorderDraw(EWin * ewin, int do_shape, int do_paint)
|
|||
|
||||
#if 0 /* Debug */
|
||||
Eprintf("EwinBorderDraw %#lx %s d=%d s=%d p=%d\n",
|
||||
_EwinGetClientXwin(ewin), EoGetName(ewin), EoGetDesk(ewin), do_shape,
|
||||
do_paint);
|
||||
_EwinGetClientXwin(ewin), EoGetName(ewin), EoGetDeskNum(ewin),
|
||||
do_shape, do_paint);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < ewin->border->num_winparts; i++)
|
||||
|
|
79
src/iclass.c
79
src/iclass.c
|
@ -830,6 +830,7 @@ ImagestateMakePmapMask(ImageState * is, Drawable win, PmapMask * pmm,
|
|||
#ifdef ENABLE_TRANSPARENCY
|
||||
Imlib_Image *ii = NULL;
|
||||
int flags;
|
||||
Pixmap pmap, mask;
|
||||
|
||||
flags = ICLASS_ATTR_OPAQUE;
|
||||
if (Conf.trans.alpha > 0)
|
||||
|
@ -964,36 +965,36 @@ ImagestateMakePmapMask(ImageState * is, Drawable win, PmapMask * pmm,
|
|||
#endif
|
||||
}
|
||||
|
||||
pmm->type = 1;
|
||||
imlib_render_pixmaps_for_whole_image_at_size(&pmm->pmap, &pmm->mask,
|
||||
w, h);
|
||||
if (ii)
|
||||
{
|
||||
pmm->type = 0;
|
||||
pmap = ECreatePixmap(win, w, h, VRoot.depth);
|
||||
imlib_context_set_drawable(pmap);
|
||||
imlib_render_image_on_drawable_at_size(0, 0, w, h);
|
||||
imlib_context_set_drawable(win);
|
||||
pmm->pmap = pmap;
|
||||
pmm->mask = None;
|
||||
}
|
||||
else
|
||||
{
|
||||
pmm->type = 1;
|
||||
imlib_render_pixmaps_for_whole_image_at_size(&pmm->pmap,
|
||||
&pmm->mask, w, h);
|
||||
}
|
||||
|
||||
if (ii && make_mask && !(flags & ICLASS_ATTR_NO_CLIP))
|
||||
{
|
||||
Pixmap pmap = 0, mask = 0;
|
||||
GC gc;
|
||||
|
||||
imlib_context_set_image(is->im);
|
||||
if (imlib_image_has_alpha())
|
||||
{
|
||||
/* Due to the blending the mask will always be 0 here */
|
||||
|
||||
/* Make the scaled clip mask to be used */
|
||||
imlib_render_pixmaps_for_whole_image_at_size(&pmap, &mask, w,
|
||||
h);
|
||||
|
||||
/* And now some uglyness to make a single "Imlib2 pixmap/mask" thing */
|
||||
/* Replace the mask with the correct one */
|
||||
pmm->mask = ECreatePixmapCopy(mask, w, h, 1);
|
||||
|
||||
/* Replace the pmap with the previously blended one */
|
||||
gc = ECreateGC(pmm->pmap, 0, NULL);
|
||||
XCopyArea(disp, pmm->pmap, pmap, gc, 0, 0, w, h, 0, 0);
|
||||
EFreeGC(gc);
|
||||
|
||||
/* Free the old pixmap without associated mask */
|
||||
imlib_free_pixmap_and_mask(pmm->pmap);
|
||||
|
||||
/* We now have the copied pixmap with proper mask */
|
||||
pmm->pmap = pmap;
|
||||
pmm->mask = mask;
|
||||
imlib_free_pixmap_and_mask(pmap);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
@ -1042,7 +1043,7 @@ ImagestateMakePmapMask(ImageState * is, Drawable win, PmapMask * pmm,
|
|||
if (ii)
|
||||
{
|
||||
imlib_context_set_image(ii);
|
||||
imlib_free_image();
|
||||
imlib_free_image_and_decache();
|
||||
}
|
||||
#else
|
||||
make_mask = 0;
|
||||
|
@ -1178,39 +1179,38 @@ ITApply(Window win, ImageClass * ic, ImageState * is, int w, int h, int state,
|
|||
if (is->im && w <= 8192 && h <= 8192)
|
||||
{
|
||||
PmapMask pmm;
|
||||
int decache = 1;
|
||||
|
||||
ImagestateMakePmapMask(is, win, &pmm, 1, w, h, image_type);
|
||||
|
||||
if (pmm.pmap)
|
||||
{
|
||||
Pixmap pmap = pmm.pmap;
|
||||
|
||||
if (ts && text)
|
||||
{
|
||||
TextstateDrawText(ts, pmm.pmap, text, ic->padding.left,
|
||||
if (pmm.type != 0)
|
||||
pmap = ECreatePixmapCopy(pmm.pmap, w, h, VRoot.depth);
|
||||
|
||||
TextstateDrawText(ts, pmap, text, ic->padding.left,
|
||||
ic->padding.top,
|
||||
w - (ic->padding.left +
|
||||
ic->padding.right),
|
||||
h - (ic->padding.top +
|
||||
ic->padding.bottom),
|
||||
0, TextclassGetJustification(tc));
|
||||
decache = 1;
|
||||
}
|
||||
|
||||
/* Set window pixmap */
|
||||
ESetWindowBackgroundPixmap(win, pmap);
|
||||
if (pmap != pmm.pmap)
|
||||
EFreePixmap(pmap);
|
||||
|
||||
if (pmm.w == w && pmm.h == h)
|
||||
{
|
||||
ESetWindowBackgroundPixmap(win, pmm.pmap);
|
||||
EShapeCombineMask(win, ShapeBounding, 0, 0,
|
||||
pmm.mask, ShapeSet);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Tiled */
|
||||
ESetWindowBackgroundPixmap(win, pmm.pmap);
|
||||
if (pmm.mask)
|
||||
EShapeCombineMaskTiled(win, ShapeBounding, 0, 0,
|
||||
pmm.mask, ShapeSet, w, h);
|
||||
}
|
||||
EShapeCombineMask(win, ShapeBounding, 0, 0,
|
||||
pmm.mask, ShapeSet);
|
||||
else if (pmm.mask)
|
||||
EShapeCombineMaskTiled(win, ShapeBounding, 0, 0,
|
||||
pmm.mask, ShapeSet, w, h);
|
||||
}
|
||||
|
||||
FreePmapMask(&pmm);
|
||||
|
@ -1219,10 +1219,7 @@ ITApply(Window win, ImageClass * ic, ImageState * is, int w, int h, int state,
|
|||
if ((is->unloadable) || (Conf.memory_paranoia))
|
||||
{
|
||||
imlib_context_set_image(is->im);
|
||||
if (decache)
|
||||
imlib_free_image_and_decache();
|
||||
else
|
||||
imlib_free_image();
|
||||
imlib_free_image();
|
||||
is->im = NULL;
|
||||
}
|
||||
}
|
||||
|
|
15
src/x.c
15
src/x.c
|
@ -1290,6 +1290,21 @@ EShapePropagate(Window win)
|
|||
ExShapePropagate(xid);
|
||||
}
|
||||
|
||||
Pixmap
|
||||
ECreatePixmapCopy(Pixmap src, unsigned int w, unsigned int h,
|
||||
unsigned int depth)
|
||||
{
|
||||
Pixmap pmap;
|
||||
GC gc;
|
||||
|
||||
pmap = ECreatePixmap(src, w, h, depth);
|
||||
gc = ECreateGC(src, 0, NULL);
|
||||
XCopyArea(disp, src, pmap, gc, 0, 0, w, h, 0, 0);
|
||||
EFreeGC(gc);
|
||||
|
||||
return pmap;
|
||||
}
|
||||
|
||||
GC
|
||||
ECreateGC(Drawable d, unsigned long mask, XGCValues * val)
|
||||
{
|
||||
|
|
|
@ -90,8 +90,6 @@ Bool EQueryPointer(Window win, int *px, int *py, Window * pchild,
|
|||
#define ELowerWindow(win) XLowerWindow(disp, win)
|
||||
#define EClearWindow(win) XClearWindow(disp, win)
|
||||
#define EClearArea(win, x, y, w, h, exp) XClearArea(disp, win, x, y, w, h, exp)
|
||||
#define ECreatePixmap(draw, w, h, dep) XCreatePixmap(disp, draw, w, h, dep)
|
||||
#define EFreePixmap(pmap) XFreePixmap(disp, pmap)
|
||||
|
||||
void EShapeCombineMask(Window win, int dest, int x, int y,
|
||||
Pixmap pmap, int op);
|
||||
|
@ -108,6 +106,11 @@ int EShapeCopy(Window dst, Window src);
|
|||
void EShapePropagate(Window win);
|
||||
Pixmap EWindowGetShapePixmap(Window win);
|
||||
|
||||
#define ECreatePixmap(draw, w, h, depth) XCreatePixmap(disp, draw, w, h, depth)
|
||||
#define EFreePixmap(pmap) XFreePixmap(disp, pmap)
|
||||
Pixmap ECreatePixmapCopy(Pixmap src, unsigned int w,
|
||||
unsigned int h, unsigned int depth);
|
||||
|
||||
GC ECreateGC(Drawable d, unsigned long mask, XGCValues * val);
|
||||
int EFreeGC(GC gc);
|
||||
|
||||
|
|
Loading…
Reference in New Issue