summaryrefslogtreecommitdiff
path: root/beryl-plugins/src/blurfx.c
diff options
context:
space:
mode:
authorracarr <racarr@d7aaf104-2d23-0410-ae22-9d23157bf5a3>2006-12-18 04:22:26 +0000
committerracarr <racarr@d7aaf104-2d23-0410-ae22-9d23157bf5a3>2006-12-18 04:22:26 +0000
commit1c73601946ee1779c0a7a49373dd7cb6df88e16f (patch)
treedab16d079da0deb046b18eecd47f1e51bb704495 /beryl-plugins/src/blurfx.c
parent348bae4cdd40a155c87ce7be92e8752ffa74a5aa (diff)
downloadmarex-dev-1c73601946ee1779c0a7a49373dd7cb6df88e16f.tar.gz
marex-dev-1c73601946ee1779c0a7a49373dd7cb6df88e16f.tar.bz2
Run indent.sh on beryl-plugins most of the files had such mixed coding styles it was a real pain to work with
git-svn-id: file:///beryl/trunk@1849 d7aaf104-2d23-0410-ae22-9d23157bf5a3
Diffstat (limited to 'beryl-plugins/src/blurfx.c')
-rw-r--r--beryl-plugins/src/blurfx.c9198
1 files changed, 4585 insertions, 4613 deletions
diff --git a/beryl-plugins/src/blurfx.c b/beryl-plugins/src/blurfx.c
index f922ad5..62e0e2d 100644
--- a/beryl-plugins/src/blurfx.c
+++ b/beryl-plugins/src/blurfx.c
@@ -34,4862 +34,4834 @@
#include "blurfx.h"
// return plugin data
-CompPluginVTable *getCompPluginInfo(void)
+CompPluginVTable *
+getCompPluginInfo (void)
{
- return &blurfxVTable;
+ return &blurfxVTable;
}
-static Bool blurfxInit(CompPlugin * p)
+static Bool
+blurfxInit (CompPlugin * p)
{
- blurShader[0][0] = gaussian5x5_V;
- blurShader[0][1] = gaussian5x5_H;
- blurShader[1][0] = linear5x5_V;
- blurShader[1][1] = linear5x5_H;
-
- blurShader[2][0] = gaussian9x9_V;
- blurShader[2][1] = gaussian9x9_H;
- blurShader[3][0] = linear9x9_V;
- blurShader[3][1] = linear9x9_H;
-
- blurShader[4][0] = gaussian13x13_V;
- blurShader[4][1] = gaussian13x13_H;
- blurShader[5][0] = linear13x13_V;
- blurShader[5][1] = linear13x13_H;
-
- blurShader[6][0] = gaussian17x17_V;
- blurShader[6][1] = gaussian17x17_H;
- blurShader[7][0] = linear17x17_V;
- blurShader[7][1] = linear17x17_H;
-
- blurShader[8][0] = gaussian21x21_V;
- blurShader[8][1] = gaussian21x21_H;
- blurShader[9][0] = linear21x21_V;
- blurShader[9][1] = linear21x21_H;
-
- displayPrivateIndex = allocateDisplayPrivateIndex();
- if (displayPrivateIndex < 0)
- return FALSE;
- return TRUE;
+ blurShader[0][0] = gaussian5x5_V;
+ blurShader[0][1] = gaussian5x5_H;
+ blurShader[1][0] = linear5x5_V;
+ blurShader[1][1] = linear5x5_H;
+
+ blurShader[2][0] = gaussian9x9_V;
+ blurShader[2][1] = gaussian9x9_H;
+ blurShader[3][0] = linear9x9_V;
+ blurShader[3][1] = linear9x9_H;
+
+ blurShader[4][0] = gaussian13x13_V;
+ blurShader[4][1] = gaussian13x13_H;
+ blurShader[5][0] = linear13x13_V;
+ blurShader[5][1] = linear13x13_H;
+
+ blurShader[6][0] = gaussian17x17_V;
+ blurShader[6][1] = gaussian17x17_H;
+ blurShader[7][0] = linear17x17_V;
+ blurShader[7][1] = linear17x17_H;
+
+ blurShader[8][0] = gaussian21x21_V;
+ blurShader[8][1] = gaussian21x21_H;
+ blurShader[9][0] = linear21x21_V;
+ blurShader[9][1] = linear21x21_H;
+
+ displayPrivateIndex = allocateDisplayPrivateIndex ();
+ if (displayPrivateIndex < 0)
+ return FALSE;
+ return TRUE;
}
-static void blurfxFini(CompPlugin * p)
+static void
+blurfxFini (CompPlugin * p)
{
- if (displayPrivateIndex >= 0)
- freeDisplayPrivateIndex(displayPrivateIndex);
+ if (displayPrivateIndex >= 0)
+ freeDisplayPrivateIndex (displayPrivateIndex);
}
-static Bool blurfxInitDisplay(CompPlugin * p, CompDisplay * d)
+static Bool
+blurfxInitDisplay (CompPlugin * p, CompDisplay * d)
{
- //Generate a blur display
- BlurfxDisplay *bd =
- (BlurfxDisplay *) calloc(1, sizeof(BlurfxDisplay));
- //Allocate a private index
- bd->screenPrivateIndex = allocateScreenPrivateIndex(d);
- //Check if its valid
- if (bd->screenPrivateIndex < 0) {
- //Its invalid so free memory and return
- free(bd);
- return FALSE;
- }
-
- blurfxDisplayInitOptions(bd);
-
- //Record the display
- d->privates[displayPrivateIndex].ptr = bd;
- return TRUE;
+ //Generate a blur display
+ BlurfxDisplay *bd = (BlurfxDisplay *) calloc (1, sizeof (BlurfxDisplay));
+ //Allocate a private index
+ bd->screenPrivateIndex = allocateScreenPrivateIndex (d);
+ //Check if its valid
+ if (bd->screenPrivateIndex < 0)
+ {
+ //Its invalid so free memory and return
+ free (bd);
+ return FALSE;
+ }
+
+ blurfxDisplayInitOptions (bd);
+
+ //Record the display
+ d->privates[displayPrivateIndex].ptr = bd;
+ return TRUE;
}
-static void blurfxFiniDisplay(CompPlugin * p, CompDisplay * d)
+static void
+blurfxFiniDisplay (CompPlugin * p, CompDisplay * d)
{
- BLURFX_DISPLAY(d);
- //Free the private index
- freeScreenPrivateIndex(d, bd->screenPrivateIndex);
- //Free the pointer
- free(bd);
+ BLURFX_DISPLAY (d);
+ //Free the private index
+ freeScreenPrivateIndex (d, bd->screenPrivateIndex);
+ //Free the pointer
+ free (bd);
}
-static Bool blurfxInitScreen(CompPlugin * p, CompScreen * s)
+static Bool
+blurfxInitScreen (CompPlugin * p, CompScreen * s)
{
- BLURFX_DISPLAY(s->display);
- // Create a blur screen
- BlurfxScreen *bs =
- (BlurfxScreen *) calloc(1, sizeof(BlurfxScreen));
- s->privates[bd->screenPrivateIndex].ptr = bs;
-
- bs->blur_supported = TRUE;
- bs->fboBlur_supported = TRUE;
- bs->mblur_supported = TRUE;
- bs->reflection_supported = TRUE;
- bs->rb_supported = TRUE;
-
- const char *glExtensions =
- (const char *) glGetString(GL_EXTENSIONS);
-
- // Check for extensions and disable unsupported features
- if (!s->fbo) {
- fprintf(stderr,
- "No framebuffer_object support! (only simple blur aviable)\n");
- bs->fboBlur_supported = FALSE;
- }
- if (!s->fragmentProgram) {
- fprintf(stderr,
- "No fragment_program support! (only simple blur aviable)\n");
- bs->fboBlur_supported = FALSE;
- }
- if (!s->textureRectangle) {
- fprintf(stderr,
- "No texture_rectangle support! (blur effects disabled)\n");
- bs->blur_supported = FALSE;
- bs->fboBlur_supported = FALSE;
- bs->mblur_supported = FALSE;
- }
- if (!s->textureEnvCombine) {
- fprintf(stderr,
- "No texture_env_combine support! (blur and reflection effects disabled)\n");
- bs->blur_supported = FALSE;
- bs->fboBlur_supported = FALSE;
- bs->reflection_supported = FALSE;
- }
-
- if (strstr(glExtensions, "GL_EXT_packed_depth_stencil")
- || strstr(glExtensions, "GL_NV_packed_depth_stencil")) {
- bs->rb_supported = TRUE;
- } else {
- fprintf(stderr,
- "No packed_depth_stencil support! (this may cause some artefacts in fbo mode)\n");
- bs->rb_supported = FALSE;
- }
-
- // initialize all variables
- bs->windowPrivateIndex = allocateWindowPrivateIndex(s);
-
- bs->vertArray.vertices = 0;
- bs->vertArray.vCount = 0;
- bs->vertArray.vertexSize = 0;
-
- bs->screenDamage = XCreateRegion();
- bs->occlusion = XCreateRegion();
- bs->blurredRegion = XCreateRegion();
-
- bs->mb_activated = FALSE;
- bs->mb_update = TRUE;
-
- bs->noBlurWMask = 0;
- bs->noReflectionWMask = 0;
-
- // setup settings
- blurfxScreenInitOptions(bs);
-
- int i = 0;
- for (i = 0; i < LIST_SIZE(mBlurModes); i++)
- if (strcmp
- (bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE].value.
- s, mBlurModes[i]) == 0)
- bs->mb_mode = i;
-
- for (i = 0; i < LIST_SIZE(blurShaderNames); i++)
- if (strcmp
- (bs->opt[BLURFX_SCREEN_OPTION_BLUR_SHADER].value.s,
- blurShaderNames[i]) == 0)
- bs->blur_shader = i;
-
- addScreenAction(s,
- &bd->opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE].
- value.action);
-
- //Take over the window draw function
- WRAP(bs, s, drawWindowTexture, blurfxDrawWindowTexture);
- WRAP(bs, s, drawWindow, blurfxDrawWindow);
- WRAP(bs, s, damageWindowRect, blurfxDamageWindowRect);
- WRAP(bs, s, paintScreen, blurfxPaintScreen);
- WRAP(bs, s, addWindowGeometry, blurfxAddWindowGeometry);
- WRAP(bs, s, preparePaintScreen, blurfxPreparePaintScreen);
- WRAP(bs, s, paintTransformedScreen, blurfxPaintTransformedScreen);
-
- damageScreen(s);
-
- bs->ipcs_disable_blur =
- IPCS_GetAtom(IPCS_OBJECT(s), IPCS_BOOL, "DISABLE_BLUR", TRUE);
- bs->ipcs_disable_reflection =
- IPCS_GetAtom(IPCS_OBJECT(s), IPCS_BOOL, "DISABLE_REFLECTION",
- TRUE);
- bs->ipcs_disable_mblur =
- IPCS_GetAtom(IPCS_OBJECT(s), IPCS_BOOL, "DISABLE_MOTION_BLUR",
- TRUE);
-
- return TRUE;
+ BLURFX_DISPLAY (s->display);
+ // Create a blur screen
+ BlurfxScreen *bs = (BlurfxScreen *) calloc (1, sizeof (BlurfxScreen));
+ s->privates[bd->screenPrivateIndex].ptr = bs;
+
+ bs->blur_supported = TRUE;
+ bs->fboBlur_supported = TRUE;
+ bs->mblur_supported = TRUE;
+ bs->reflection_supported = TRUE;
+ bs->rb_supported = TRUE;
+
+ const char *glExtensions = (const char *)glGetString (GL_EXTENSIONS);
+
+ // Check for extensions and disable unsupported features
+ if (!s->fbo)
+ {
+ fprintf (stderr,
+ "No framebuffer_object support! (only simple blur aviable)\n");
+ bs->fboBlur_supported = FALSE;
+ }
+ if (!s->fragmentProgram)
+ {
+ fprintf (stderr,
+ "No fragment_program support! (only simple blur aviable)\n");
+ bs->fboBlur_supported = FALSE;
+ }
+ if (!s->textureRectangle)
+ {
+ fprintf (stderr,
+ "No texture_rectangle support! (blur effects disabled)\n");
+ bs->blur_supported = FALSE;
+ bs->fboBlur_supported = FALSE;
+ bs->mblur_supported = FALSE;
+ }
+ if (!s->textureEnvCombine)
+ {
+ fprintf (stderr,
+ "No texture_env_combine support! (blur and reflection effects disabled)\n");
+ bs->blur_supported = FALSE;
+ bs->fboBlur_supported = FALSE;
+ bs->reflection_supported = FALSE;
+ }
+
+ if (strstr (glExtensions, "GL_EXT_packed_depth_stencil")
+ || strstr (glExtensions, "GL_NV_packed_depth_stencil"))
+ {
+ bs->rb_supported = TRUE;
+ }
+ else
+ {
+ fprintf (stderr,
+ "No packed_depth_stencil support! (this may cause some artefacts in fbo mode)\n");
+ bs->rb_supported = FALSE;
+ }
+
+ // initialize all variables
+ bs->windowPrivateIndex = allocateWindowPrivateIndex (s);
+
+ bs->vertArray.vertices = 0;
+ bs->vertArray.vCount = 0;
+ bs->vertArray.vertexSize = 0;
+
+ bs->screenDamage = XCreateRegion ();
+ bs->occlusion = XCreateRegion ();
+ bs->blurredRegion = XCreateRegion ();
+
+ bs->mb_activated = FALSE;
+ bs->mb_update = TRUE;
+
+ bs->noBlurWMask = 0;
+ bs->noReflectionWMask = 0;
+
+ // setup settings
+ blurfxScreenInitOptions (bs);
+
+ int i = 0;
+ for (i = 0; i < LIST_SIZE (mBlurModes); i++)
+ if (strcmp
+ (bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE].value.
+ s, mBlurModes[i]) == 0)
+ bs->mb_mode = i;
+
+ for (i = 0; i < LIST_SIZE (blurShaderNames); i++)
+ if (strcmp
+ (bs->opt[BLURFX_SCREEN_OPTION_BLUR_SHADER].value.s,
+ blurShaderNames[i]) == 0)
+ bs->blur_shader = i;
+
+ addScreenAction (s,
+ &bd->opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE].
+ value.action);
+
+ //Take over the window draw function
+ WRAP (bs, s, drawWindowTexture, blurfxDrawWindowTexture);
+ WRAP (bs, s, drawWindow, blurfxDrawWindow);
+ WRAP (bs, s, damageWindowRect, blurfxDamageWindowRect);
+ WRAP (bs, s, paintScreen, blurfxPaintScreen);
+ WRAP (bs, s, addWindowGeometry, blurfxAddWindowGeometry);
+ WRAP (bs, s, preparePaintScreen, blurfxPreparePaintScreen);
+ WRAP (bs, s, paintTransformedScreen, blurfxPaintTransformedScreen);
+
+ damageScreen (s);
+
+ bs->ipcs_disable_blur =
+ IPCS_GetAtom (IPCS_OBJECT (s), IPCS_BOOL, "DISABLE_BLUR", TRUE);
+ bs->ipcs_disable_reflection =
+ IPCS_GetAtom (IPCS_OBJECT (s), IPCS_BOOL, "DISABLE_REFLECTION", TRUE);
+ bs->ipcs_disable_mblur =
+ IPCS_GetAtom (IPCS_OBJECT (s), IPCS_BOOL, "DISABLE_MOTION_BLUR",
+ TRUE);
+
+ return TRUE;
}
-static void blurfxFiniScreen(CompPlugin * p, CompScreen * s)
+static void
+blurfxFiniScreen (CompPlugin * p, CompScreen * s)
{
- BLURFX_SCREEN(s);
- BLURFX_DISPLAY(s->display);
-
- // delete shaders
- if (bs->blurShaderV)
- (*s->deletePrograms) (1, &bs->blurShaderV);
- if (bs->blurShaderH)
- (*s->deletePrograms) (1, &bs->blurShaderH);
-
- // delete the textures
- if (bs->backTex.handle)
- glDeleteTextures(1, &bs->backTex.handle);
- if (bs->motionTex.handle)
- glDeleteTextures(1, &bs->motionTex.handle);
- if (bs->blurTempTexV.handle)
- glDeleteTextures(1, &bs->blurTempTexV.handle);
- if (bs->blurTempTexH.handle)
- glDeleteTextures(1, &bs->blurTempTexH.handle);
- if (bs->modTex.handle)
- glDeleteTextures(1, &bs->modTex.handle);
-
- // delete framebuffer object
- if (bs->fbo) {
- s->deleteFramebuffers(1, &bs->fbo);
- if (bs->rb_supported)
- s->deleteRenderbuffers(1, &bs->rb);
- }
- // free some pointers
- free(bs->vertArray.vertices);
-
- freeWindowPrivateIndex(s, bs->windowPrivateIndex);
-
- XDestroyRegion(bs->screenDamage);
- XDestroyRegion(bs->occlusion);
- XDestroyRegion(bs->blurredRegion);
-
-
- // restore the original function
- UNWRAP(bs, s, drawWindowTexture);
- UNWRAP(bs, s, drawWindow);
- UNWRAP(bs, s, damageWindowRect);
- UNWRAP(bs, s, paintScreen);
- UNWRAP(bs, s, addWindowGeometry);
- UNWRAP(bs, s, preparePaintScreen);
- UNWRAP(bs, s, paintTransformedScreen);
-
- removeScreenAction(s,
- &bd->
- opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE].
- value.action);
-
- // free the screen pointer
- free(bs);
+ BLURFX_SCREEN (s);
+ BLURFX_DISPLAY (s->display);
+
+ // delete shaders
+ if (bs->blurShaderV)
+ (*s->deletePrograms) (1, &bs->blurShaderV);
+ if (bs->blurShaderH)
+ (*s->deletePrograms) (1, &bs->blurShaderH);
+
+ // delete the textures
+ if (bs->backTex.handle)
+ glDeleteTextures (1, &bs->backTex.handle);
+ if (bs->motionTex.handle)
+ glDeleteTextures (1, &bs->motionTex.handle);
+ if (bs->blurTempTexV.handle)
+ glDeleteTextures (1, &bs->blurTempTexV.handle);
+ if (bs->blurTempTexH.handle)
+ glDeleteTextures (1, &bs->blurTempTexH.handle);
+ if (bs->modTex.handle)
+ glDeleteTextures (1, &bs->modTex.handle);
+
+ // delete framebuffer object
+ if (bs->fbo)
+ {
+ s->deleteFramebuffers (1, &bs->fbo);
+ if (bs->rb_supported)
+ s->deleteRenderbuffers (1, &bs->rb);
+ }
+ // free some pointers
+ free (bs->vertArray.vertices);
+
+ freeWindowPrivateIndex (s, bs->windowPrivateIndex);
+
+ XDestroyRegion (bs->screenDamage);
+ XDestroyRegion (bs->occlusion);
+ XDestroyRegion (bs->blurredRegion);
+
+
+ // restore the original function
+ UNWRAP (bs, s, drawWindowTexture);
+ UNWRAP (bs, s, drawWindow);
+ UNWRAP (bs, s, damageWindowRect);
+ UNWRAP (bs, s, paintScreen);
+ UNWRAP (bs, s, addWindowGeometry);
+ UNWRAP (bs, s, preparePaintScreen);
+ UNWRAP (bs, s, paintTransformedScreen);
+
+ removeScreenAction (s,
+ &bd->
+ opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE].
+ value.action);
+
+ // free the screen pointer
+ free (bs);
}
-static Bool blurfxInitWindow(CompPlugin * p, CompWindow * w)
+static Bool
+blurfxInitWindow (CompPlugin * p, CompWindow * w)
{
- BlurfxWindow *bw;
-
- BLURFX_SCREEN(w->screen);
-
- // create window
- bw = calloc(1, sizeof(BlurfxWindow));
- if (!bw)
- return FALSE;
-
- // initialize variables
- bw->my_next = w->next;
- bw->lastX = w->attrib.x;
- bw->lastY = w->attrib.y;
- bw->lastPAttrib = w->lastPaint;
- bw->decoArray.vertices = NULL;
- bw->decoArray.indices = NULL;
- bw->decoArray.vCount = 0;
- bw->decoArray.vertexSize = 0;
- bw->decoArray.indexSize = 0;
- bw->decoArray.indexCount = 0;
- bw->paintRegion = XCreateRegion();
- bw->damageRegion = XCreateRegion();
- bw->texDamage = XCreateRegion();
- bw->bTexRegion = XCreateRegion();
- bw->clip = XCreateRegion();
- bw->hasTexture = FALSE;
- bw->vertArray.vertices = 0;
- bw->vertArray.vCount = 0;
- bw->vertArray.vertexSize = 0;
- bw->isSwitcher = FALSE;
-
- Atom type;
- int format;
- unsigned long nitems;
- unsigned long bytes_after;
- Window *xw;
-
- int result = XGetWindowProperty(w->screen->display->display, w->id,
- XInternAtom(w->screen->display->
- display,
- "_SWITCH_SELECT_WINDOW",
- 0),
- 0L, 1L,
- False, XA_WINDOW, &type, &format,
- &nitems,
- &bytes_after, (void *) &xw);
-
- if (result == Success && type == XA_WINDOW)
- bw->isSwitcher = TRUE;
-
- w->privates[bs->windowPrivateIndex].ptr = bw;
-
- damageScreen(w->screen);
-
- bw->ipcs_disable_blur =
- IPCS_GetAtom(IPCS_OBJECT(w), IPCS_BOOL, "DISABLE_BLUR", TRUE);
- bw->ipcs_disable_reflection =
- IPCS_GetAtom(IPCS_OBJECT(w), IPCS_BOOL, "DISABLE_REFLECTION",
- TRUE);
-
- return TRUE;
+ BlurfxWindow *bw;
+
+ BLURFX_SCREEN (w->screen);
+
+ // create window
+ bw = calloc (1, sizeof (BlurfxWindow));
+ if (!bw)
+ return FALSE;
+
+ // initialize variables
+ bw->my_next = w->next;
+ bw->lastX = w->attrib.x;
+ bw->lastY = w->attrib.y;
+ bw->lastPAttrib = w->lastPaint;
+ bw->decoArray.vertices = NULL;
+ bw->decoArray.indices = NULL;
+ bw->decoArray.vCount = 0;
+ bw->decoArray.vertexSize = 0;
+ bw->decoArray.indexSize = 0;
+ bw->decoArray.indexCount = 0;
+ bw->paintRegion = XCreateRegion ();
+ bw->damageRegion = XCreateRegion ();
+ bw->texDamage = XCreateRegion ();
+ bw->bTexRegion = XCreateRegion ();
+ bw->clip = XCreateRegion ();
+ bw->hasTexture = FALSE;
+ bw->vertArray.vertices = 0;
+ bw->vertArray.vCount = 0;
+ bw->vertArray.vertexSize = 0;
+ bw->isSwitcher = FALSE;
+
+ Atom type;
+ int format;
+ unsigned long nitems;
+ unsigned long bytes_after;
+ Window *xw;
+
+ int result = XGetWindowProperty (w->screen->display->display, w->id,
+ XInternAtom (w->screen->display->display,
+ "_SWITCH_SELECT_WINDOW",
+ 0),
+ 0L, 1L,
+ False, XA_WINDOW, &type, &format,
+ &nitems,
+ &bytes_after, (void *)&xw);
+
+ if (result == Success && type == XA_WINDOW)
+ bw->isSwitcher = TRUE;
+
+ w->privates[bs->windowPrivateIndex].ptr = bw;
+
+ damageScreen (w->screen);
+
+ bw->ipcs_disable_blur =
+ IPCS_GetAtom (IPCS_OBJECT (w), IPCS_BOOL, "DISABLE_BLUR", TRUE);
+ bw->ipcs_disable_reflection =
+ IPCS_GetAtom (IPCS_OBJECT (w), IPCS_BOOL, "DISABLE_REFLECTION", TRUE);
+
+ return TRUE;
}
-static void blurfxFiniWindow(CompPlugin * p, CompWindow * w)
+static void
+blurfxFiniWindow (CompPlugin * p, CompWindow * w)
{
- BLURFX_WINDOW(w);
-
- // free regions
- XDestroyRegion(bw->paintRegion);
- XDestroyRegion(bw->damageRegion);
- XDestroyRegion(bw->texDamage);
- XDestroyRegion(bw->bTexRegion);
- XDestroyRegion(bw->clip);
-
- // delete blur cache texture
- if (bw->hasTexture)
- glDeleteTextures(1, &bw->blurTex.handle);
-
- // free used memory
- if (bw->decoArray.vertices)
- free(bw->decoArray.vertices);
- if (bw->decoArray.indices)
- free(bw->decoArray.indices);
- if (bw->vertArray.vertices)
- free(bw->vertArray.vertices);
-
- // free window pointer
- free(bw);
+ BLURFX_WINDOW (w);
+
+ // free regions
+ XDestroyRegion (bw->paintRegion);
+ XDestroyRegion (bw->damageRegion);
+ XDestroyRegion (bw->texDamage);
+ XDestroyRegion (bw->bTexRegion);
+ XDestroyRegion (bw->clip);
+
+ // delete blur cache texture
+ if (bw->hasTexture)
+ glDeleteTextures (1, &bw->blurTex.handle);
+
+ // free used memory
+ if (bw->decoArray.vertices)
+ free (bw->decoArray.vertices);
+ if (bw->decoArray.indices)
+ free (bw->decoArray.indices);
+ if (bw->vertArray.vertices)
+ free (bw->vertArray.vertices);
+
+ // free window pointer
+ free (bw);
}
-static CompOption *blurfxGetDisplayOptions(CompDisplay * display,
- int *count)
+static CompOption *
+blurfxGetDisplayOptions (CompDisplay * display, int *count)
{
- if (display) {
- BLURFX_DISPLAY(display);
-
- *count = NUM_OPTIONS(bd);
- return bd->opt;
- } else {
- BlurfxDisplay *bd =
- (BlurfxDisplay *) calloc(1, sizeof(BlurfxDisplay));
- blurfxDisplayInitOptions(bd);
- *count = NUM_OPTIONS(bd);
- return bd->opt;
- }
+ if (display)
+ {
+ BLURFX_DISPLAY (display);
+
+ *count = NUM_OPTIONS (bd);
+ return bd->opt;
+ }
+ else
+ {
+ BlurfxDisplay *bd =
+ (BlurfxDisplay *) calloc (1, sizeof (BlurfxDisplay));
+ blurfxDisplayInitOptions (bd);
+ *count = NUM_OPTIONS (bd);
+ return bd->opt;
+ }
}
static Bool
-blurfxSetDisplayOption(CompDisplay * display, char *name,
- CompOptionValue * value)
+blurfxSetDisplayOption (CompDisplay * display, char *name,
+ CompOptionValue * value)
{
- CompOption *o;
- int index;
+ CompOption *o;
+ int index;
- BLURFX_DISPLAY(display);
+ BLURFX_DISPLAY (display);
- o = compFindOption(bd->opt, NUM_OPTIONS(bd), name, &index);
- if (!o)
- return FALSE;
+ o = compFindOption (bd->opt, NUM_OPTIONS (bd), name, &index);
+ if (!o)
+ return FALSE;
- switch (index) {
- case BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE:
- if (setDisplayAction(display, o, value))
- return TRUE;
- break;
- default:
- break;
- }
+ switch (index)
+ {
+ case BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE:
+ if (setDisplayAction (display, o, value))
+ return TRUE;
+ break;
+ default:
+ break;
+ }
- return FALSE;
+ return FALSE;
}
-static void blurfxDisplayInitOptions(BlurfxDisplay * bd)
+static void
+blurfxDisplayInitOptions (BlurfxDisplay * bd)
{
- CompOption *o;
-
- o = &bd->opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE];
- o->name = "motion_blur_toggle";
- o->group = N_("Motion Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Toggle motion blur");
- o->longDesc = N_("Toggle motion blur effect");
- o->type = CompOptionTypeAction;
- o->value.action.initiate = blurfxToggleMotionBlur;
- o->value.action.terminate = 0;
- o->value.action.bell = FALSE;
- o->value.action.edgeMask = 0;
- o->value.action.type = CompBindingTypeKey;
- o->value.action.state = CompActionStateInitKey;
- o->value.action.key.modifiers =
- BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE_MOD_DEFAULT;
- o->value.action.key.keysym =
- XStringToKeysym
- (BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE_KEY_DEFAULT);
+ CompOption *o;
+
+ o = &bd->opt[BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE];
+ o->name = "motion_blur_toggle";
+ o->group = N_("Motion Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Toggle motion blur");
+ o->longDesc = N_("Toggle motion blur effect");
+ o->type = CompOptionTypeAction;
+ o->value.action.initiate = blurfxToggleMotionBlur;
+ o->value.action.terminate = 0;
+ o->value.action.bell = FALSE;
+ o->value.action.edgeMask = 0;
+ o->value.action.type = CompBindingTypeKey;
+ o->value.action.state = CompActionStateInitKey;
+ o->value.action.key.modifiers =
+ BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE_MOD_DEFAULT;
+ o->value.action.key.keysym =
+ XStringToKeysym
+ (BLURFX_DISPLAY_OPTION_MOTION_BLUR_TOGGLE_KEY_DEFAULT);
}
static Bool
-blurfxSetScreenOption(CompScreen * s, char *name, CompOptionValue * value)
+blurfxSetScreenOption (CompScreen * s, char *name, CompOptionValue * value)
{
- CompOption *o;
- int index;
-
- BLURFX_SCREEN(s);
-
- o = compFindOption(bs->opt, NUM_OPTIONS(bs), name, &index);
- if (!o)
- return FALSE;
-
- switch (index) {
- case BLURFX_SCREEN_OPTION_BLUR_WINDOWS:
- case BLURFX_SCREEN_OPTION_BLUR_DECORATION:
- case BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS:
- case BLURFX_SCREEN_OPTION_REFLECTION_DECORATION:
- case BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN:
- case BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW:
- case BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN:
- case BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW:
- case BLURFX_SCREEN_OPTION_REFLECTION_SCALE:
- case BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL:
- case BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN:
- case BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP:
- case BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN:
- if (compSetBoolOption(o, value)) {
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES:
- if (compSetBoolOption(o, value)) {
- if (!value->b) {
- CompWindow *w;
- for (w = s->windows; w; w = w->next) {
- BLURFX_WINDOW(w);
- if (bw->hasTexture) {
- bw->hasTexture = FALSE;
- glDeleteTextures(1,
- &bw->
- blurTex.
- handle);
- bw->blurTex.handle = 0;
- }
- }
- }
- damageScreen(s);
- return TRUE;
- }
- break;
-
- case BLURFX_SCREEN_OPTION_BLUR_SHADER:
- if (compSetStringOption(o, value)) {
- int i = 0;
- for (i = 0; i < LIST_SIZE(blurShaderNames); i++)
- if (strcmp(value->s, blurShaderNames[i]) ==
- 0)
- bs->blur_shader = i;
-
- if (bs->fboBlur_supported && bs->hasInit
- && !bs->
- opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].
- value.b) {
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s,
- &bs->blurShaderV,
- blurShader[bs->blur_shader][0]);
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s,
- &bs->blurShaderH,
- blurShader[bs->blur_shader][1]);
- damageScreen(s);
- CompWindow *w;
- for (w = s->windows; w; w = w->next) {
- BLURFX_WINDOW(w);
- if (bw->hasTexture) {
- bw->hasTexture = FALSE;
- glDeleteTextures(1,
- &bw->
- blurTex.
- handle);
- bw->blurTex.handle = 0;
- }
- }
- }
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF:
- case BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF:
- case BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF:
- if (compSetOptionList(o, value)) {
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_REFLECTION_FILE:
- if (compSetStringOption(o, value)) {
- if (bs->reflection_supported) {
- loadPngToTexture2D(s, bs, &bs->modTex, value->s);
- damageScreen(s);
- }
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR:
- case BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA:
- if (compSetBoolOption(o, value)) {
- if (bs->reflection_supported) {
- loadPngToTexture2D(s, bs, &bs->modTex,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_REFLECTION_FILE].
- value.s);
- damageScreen(s);
- }
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_BLUR_SATURATION:
- case BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH:
- if (compSetFloatOption(o, value)) {
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_DISABLE_BLUR_WINDOW_TYPE:
- if (compSetOptionList(o, value)) {
- bs->noBlurWMask =
- compWindowTypeMaskFromStringList(&o->value);
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_WINDOW_TYPE:
- if (compSetOptionList(o, value)) {
- bs->noReflectionWMask =
- compWindowTypeMaskFromStringList(&o->value);
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE:
- if (compSetStringOption(o, value)) {
- int i;
- for (i = 0; i < LIST_SIZE(mBlurModes); i++)
- if (strcmp(value->s, mBlurModes[i]) == 0)
- bs->mb_mode = i;
-
- if (bs->hasInit && bs->mblur_supported
- && bs->motionTex.handle) {
- glDeleteTextures(1, &bs->motionTex.handle);
- bs->motionTex.handle = 0;
- }
- if (bs->hasInit && bs->mblur_supported
- && (bs->mb_mode == 0 || bs->mb_mode == 2)) {
- genBlurTexture(bs, &bs->motionTex,
- s->width, s->height,
- bs->mb_mode);
- }
- bs->mb_update = TRUE;
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR:
- if (compSetBoolOption(o, value)) {
- if (!bs->hasInit)
- return TRUE;
-
- if (bs->fboBlur_supported && !value->b) {
- // load shaders
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s,
- &bs->blurShaderV,
- blurShader[bs->blur_shader][0]);
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s,
- &bs->blurShaderH,
- blurShader[bs->blur_shader][1]);
- bs->downSample = 1.0;
- }
- CompWindow *w;
- for (w = s->windows; w; w = w->next) {
- BLURFX_WINDOW(w);
- if (bw->hasTexture) {
- bw->hasTexture = FALSE;
- glDeleteTextures(1,
- &bw->blurTex.
- handle);
- bw->blurTex.handle = 0;
- }
- }
- damageScreen(s);
- return TRUE;
- }
- break;
- case BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH:
- if (compSetIntOption(o, value)) {
- if (!bs->hasInit)
- return TRUE;
-
- if (!bs->fboBlur_supported
- || bs->
- opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].
- value.b) {
- bs->downSample =
- bs->
- opt
- [BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH].
- value.i;
- CompWindow *w;
- for (w = s->windows; w; w = w->next) {
- BLURFX_WINDOW(w);
- if (bw->hasTexture) {
- bw->hasTexture = FALSE;
- glDeleteTextures(1,
- &bw->
- blurTex.
- handle);
- bw->blurTex.handle = 0;
- }
- }
- }
- damageScreen(s);
- return TRUE;
- }
- break;
- default:
- break;
- }
- return FALSE;
+ CompOption *o;
+ int index;
+
+ BLURFX_SCREEN (s);
+
+ o = compFindOption (bs->opt, NUM_OPTIONS (bs), name, &index);
+ if (!o)
+ return FALSE;
+
+ switch (index)
+ {
+ case BLURFX_SCREEN_OPTION_BLUR_WINDOWS:
+ case BLURFX_SCREEN_OPTION_BLUR_DECORATION:
+ case BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS:
+ case BLURFX_SCREEN_OPTION_REFLECTION_DECORATION:
+ case BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN:
+ case BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW:
+ case BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN:
+ case BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW:
+ case BLURFX_SCREEN_OPTION_REFLECTION_SCALE:
+ case BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL:
+ case BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN:
+ case BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP:
+ case BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN:
+ if (compSetBoolOption (o, value))
+ {
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES:
+ if (compSetBoolOption (o, value))
+ {
+ if (!value->b)
+ {
+ CompWindow *w;
+ for (w = s->windows; w; w = w->next)
+ {
+ BLURFX_WINDOW (w);
+ if (bw->hasTexture)
+ {
+ bw->hasTexture = FALSE;
+ glDeleteTextures (1, &bw->blurTex.handle);
+ bw->blurTex.handle = 0;
+ }
+ }
+ }
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+
+ case BLURFX_SCREEN_OPTION_BLUR_SHADER:
+ if (compSetStringOption (o, value))
+ {
+ int i = 0;
+ for (i = 0; i < LIST_SIZE (blurShaderNames); i++)
+ if (strcmp (value->s, blurShaderNames[i]) == 0)
+ bs->blur_shader = i;
+
+ if (bs->fboBlur_supported && bs->hasInit
+ && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b)
+ {
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s,
+ &bs->blurShaderV, blurShader[bs->blur_shader][0]);
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s,
+ &bs->blurShaderH, blurShader[bs->blur_shader][1]);
+ damageScreen (s);
+ CompWindow *w;
+ for (w = s->windows; w; w = w->next)
+ {
+ BLURFX_WINDOW (w);
+ if (bw->hasTexture)
+ {
+ bw->hasTexture = FALSE;
+ glDeleteTextures (1, &bw->blurTex.handle);
+ bw->blurTex.handle = 0;
+ }
+ }
+ }
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF:
+ case BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF:
+ case BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF:
+ if (compSetOptionList (o, value))
+ {
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_REFLECTION_FILE:
+ if (compSetStringOption (o, value))
+ {
+ if (bs->reflection_supported)
+ {
+ loadPngToTexture2D (s, bs, &bs->modTex, value->s);
+ damageScreen (s);
+ }
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR:
+ case BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA:
+ if (compSetBoolOption (o, value))
+ {
+ if (bs->reflection_supported)
+ {
+ loadPngToTexture2D (s, bs, &bs->modTex,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_REFLECTION_FILE].
+ value.s);
+ damageScreen (s);
+ }
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_BLUR_SATURATION:
+ case BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH:
+ if (compSetFloatOption (o, value))
+ {
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_DISABLE_BLUR_WINDOW_TYPE:
+ if (compSetOptionList (o, value))
+ {
+ bs->noBlurWMask = compWindowTypeMaskFromStringList (&o->value);
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_WINDOW_TYPE:
+ if (compSetOptionList (o, value))
+ {
+ bs->noReflectionWMask =
+ compWindowTypeMaskFromStringList (&o->value);
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE:
+ if (compSetStringOption (o, value))
+ {
+ int i;
+ for (i = 0; i < LIST_SIZE (mBlurModes); i++)
+ if (strcmp (value->s, mBlurModes[i]) == 0)
+ bs->mb_mode = i;
+
+ if (bs->hasInit && bs->mblur_supported && bs->motionTex.handle)
+ {
+ glDeleteTextures (1, &bs->motionTex.handle);
+ bs->motionTex.handle = 0;
+ }
+ if (bs->hasInit && bs->mblur_supported
+ && (bs->mb_mode == 0 || bs->mb_mode == 2))
+ {
+ genBlurTexture (bs, &bs->motionTex,
+ s->width, s->height, bs->mb_mode);
+ }
+ bs->mb_update = TRUE;
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR:
+ if (compSetBoolOption (o, value))
+ {
+ if (!bs->hasInit)
+ return TRUE;
+
+ if (bs->fboBlur_supported && !value->b)
+ {
+ // load shaders
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s,
+ &bs->blurShaderV, blurShader[bs->blur_shader][0]);
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s,
+ &bs->blurShaderH, blurShader[bs->blur_shader][1]);
+ bs->downSample = 1.0;
+ }
+ CompWindow *w;
+ for (w = s->windows; w; w = w->next)
+ {
+ BLURFX_WINDOW (w);
+ if (bw->hasTexture)
+ {
+ bw->hasTexture = FALSE;
+ glDeleteTextures (1, &bw->blurTex.handle);
+ bw->blurTex.handle = 0;
+ }
+ }
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ case BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH:
+ if (compSetIntOption (o, value))
+ {
+ if (!bs->hasInit)
+ return TRUE;
+
+ if (!bs->fboBlur_supported
+ || bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b)
+ {
+ bs->downSample =
+ bs->
+ opt[BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH].value.i;
+ CompWindow *w;
+ for (w = s->windows; w; w = w->next)
+ {
+ BLURFX_WINDOW (w);
+ if (bw->hasTexture)
+ {
+ bw->hasTexture = FALSE;
+ glDeleteTextures (1, &bw->blurTex.handle);
+ bw->blurTex.handle = 0;
+ }
+ }
+ }
+ damageScreen (s);
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
}
-static CompOption *blurfxGetScreenOptions(CompScreen * s, int *count)
+static CompOption *
+blurfxGetScreenOptions (CompScreen * s, int *count)
{
- if (s) {
- BLURFX_SCREEN(s);
-
- *count = NUM_OPTIONS(bs);
- return bs->opt;
- } else {
- BlurfxScreen *bs =
- (BlurfxScreen *) calloc(1, sizeof(BlurfxScreen));
- blurfxScreenInitOptions(bs);
- *count = NUM_OPTIONS(bs);
- return bs->opt;
- }
+ if (s)
+ {
+ BLURFX_SCREEN (s);
+
+ *count = NUM_OPTIONS (bs);
+ return bs->opt;
+ }
+ else
+ {
+ BlurfxScreen *bs = (BlurfxScreen *) calloc (1, sizeof (BlurfxScreen));
+ blurfxScreenInitOptions (bs);
+ *count = NUM_OPTIONS (bs);
+ return bs->opt;
+ }
}
-static void blurfxScreenInitOptions(BlurfxScreen * bs)
+static void
+blurfxScreenInitOptions (BlurfxScreen * bs)
{
- CompOption *o;
- int i;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION];
- o->name = "blur_decoration";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur decoration");
- o->longDesc = N_("Blur decorations");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_BLUR_DECORATION_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS];
- o->name = "blur_windows";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur windows");
- o->longDesc = N_("Blur windows");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_BLUR_WINDOWS_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION];
- o->name = "reflection_decoration";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection decoration");
- o->longDesc = N_("Draw reflection for decorations");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_DECORATION_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS];
- o->name = "reflection_windows";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection windows");
- o->longDesc = N_("Draw reflection for windows");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN];
- o->name = "blur_transformed_screen";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur transformed screen");
- o->longDesc = N_("Draw blur if the screen is transformed");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW];
- o->name = "blur_transformed_window";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur transformed window");
- o->longDesc = N_("Draw blur if window is transformed");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_SHADER];
- o->name = "blur_shader";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur Shader");
- o->longDesc = N_("Blur Shader");
- o->type = CompOptionTypeString;
- o->value.s = strdup(BLURFX_SCREEN_OPTION_BLUR_SHADER_DEFAULT);
- o->rest.s.string = blurShaderNames;
- o->rest.s.nString = LIST_SIZE(blurShaderNames);
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR];
- o->name = "force_non_fbo_blur";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Force non fbo blur");
- o->longDesc = N_("Force non fbo blur");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH];
- o->name = "non_fbo_blur_strength";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Non fbo blur strength");
- o->longDesc = N_("Non fbo mode blur strength");
- o->type = CompOptionTypeInt;
- o->value.i = BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH_DEFAULT;
- o->rest.i.min = 2;
- o->rest.i.max = 12;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES];
- o->name = "blur_cache";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Use blur cache");
- o->longDesc = N_("Enables blur cache texture system");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES_DEFAULT;
-
- o = &bs->
- opt[BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN];
- o->name = "no_cache_when_transformed";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable blur cache on transformed screen");
- o->longDesc = N_("Disables blur cache on transformed screen");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN_DEFAULT;
-
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP];
- o->name = "disable_deco_alpha_dep";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable decoration alpha dependency");
- o->longDesc = N_("Disable decoration alpha dependency");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF];
- o->name = "disable_blur_on_screengrab_of";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable blur on screengrab of");
- o->longDesc =
- N_
- ("Disable drawing of blur when an other plugin grabs the input");
- o->type = CompOptionTypeList;
- o->value.list.type = CompOptionTypeString;
- o->value.list.nValue = LIST_SIZE(blurDisable);
- o->value.list.value =
- malloc(sizeof(CompOptionValue) * LIST_SIZE(blurDisable));
- for (i = 0; i < LIST_SIZE(blurDisable); i++)
- o->value.list.value[i].s = strdup(blurDisable[i]);
-
- o = &bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN];
- o->name = "reflection_transformed_screen";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection transformed screen");
- o->longDesc = N_("Draw reflection if the screen is transformed");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW];
- o->name = "reflection_transformed_window";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection transformed window");
- o->longDesc = N_("Draw reflection if the screen is transformed");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW_DEFAULT;
-
- o = &bs->
- opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF];
- o->name = "disable_reflection_on_screengrab_of";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable reflection on screengrab of");
- o->longDesc =
- N_
- ("Disable drawing of reflection when an other plugin grabs the input");
- o->type = CompOptionTypeList;
- o->value.list.type = CompOptionTypeString;
- o->value.list.nValue = 0;
- o->value.list.value = NULL;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_FILE];
- o->name = "reflection_file";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "file;image;pngonly;";
- o->shortDesc = N_("Reflection file");
- o->longDesc = N_("Reflection image file");
- o->type = CompOptionTypeString;
- o->value.s = strdup(BLURFX_SCREEN_OPTION_REFLECTION_FILE_DEFAULT);
- o->rest.s.string = 0;
- o->rest.s.nString = 0;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_SCALE];
- o->name = "reflection_scale";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection scale");
- o->longDesc = N_("Scale reflection image");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_SCALE_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL];
- o->name = "reflection_proportional";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection proportional");
- o->longDesc = N_("Scale proportional");
- o->type = CompOptionTypeBool;
- o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR];
- o->name = "reflection_use_image_colors";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection Use Colors");
- o->longDesc = N_("Do not generate grayscale reflection");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA];
- o->name = "reflection_use_image_alpha";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Reflection Use Alpha");
- o->longDesc = N_("Use image alpha channel");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE];
- o->name = "motion_blur_mode";
- o->group = N_("Motion Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Motion Blur Mode");
- o->longDesc =
- N_
- ("Motion blur mode: simple = uses texture copy and blending; accum ="
- " uses gl accumulation buffer; fbo = uses framebuffer objects and float texture;");
- o->type = CompOptionTypeString;
- o->value.s = strdup(BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE_DEFAULT);
- o->rest.s.string = mBlurModes;
- o->rest.s.nString = LIST_SIZE(mBlurModes);
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF];
- o->name = "motion_blur_on_screengrab_of";
- o->group = N_("Motion Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Motion blur on screengrab of");
- o->longDesc = N_("Activate motion blur on screengrab");
- o->type = CompOptionTypeList;
- o->value.list.type = CompOptionTypeString;
- o->value.list.nValue = 0;
- o->value.list.value = NULL;
-
- o = &bs->
- opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN];
- o->name = "motion_blur_on_transformed_screen";
- o->group = N_("Motion Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Motion blur on transformed screen");
- o->longDesc =
- N_("Execute motion blur if the screen is transformed");
- o->type = CompOptionTypeBool;
- o->value.b =
- BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN_DEFAULT;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH];
- o->name = "motion_blur_strength";
- o->group = N_("Motion Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Motion blur strength");
- o->longDesc = N_("Motion blur strength");
- o->type = CompOptionTypeFloat;
- o->value.f = BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH_DEFAULT;
- o->rest.f.min = 0.0;
- o->rest.f.max = 100.0;
- o->rest.f.precision = 0.01;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_WINDOW_TYPE];
- o->name = "disable_blur_window_types";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable Blur Window Types");
- o->longDesc = N_("Window types for that blur should be disabled");
- o->type = CompOptionTypeList;
- o->value.list.type = CompOptionTypeString;
- o->value.list.nValue = 0;
- o->value.list.value = NULL;
- o->rest.s.string = (char **) windowTypeString;
- o->rest.s.nString = nWindowTypeString;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_WINDOW_TYPE];
- o->name = "disable_reflection_window_types";
- o->group = N_("Reflection");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Disable Reflection Window Types");
- o->longDesc =
- N_("Window types for that reflection should be disabled");
- o->type = CompOptionTypeList;
- o->value.list.type = CompOptionTypeString;
- o->value.list.nValue = 0;
- o->value.list.value = NULL;
- o->rest.s.string = (char **) windowTypeString;
- o->rest.s.nString = nWindowTypeString;
-
- o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION];
- o->name = "blur_saturation";
- o->group = N_("Blur");
- o->subGroup = N_("");
- o->displayHints = "";
- o->shortDesc = N_("Blur saturation");
- o->longDesc = N_("Blur saturation");
- o->type = CompOptionTypeFloat;
- o->value.f = BLURFX_SCREEN_OPTION_BLUR_SATURATION_DEFAULT;
- o->rest.f.min = 0.0;
- o->rest.f.max = 100.0;
- o->rest.f.precision = 0.1;
+ CompOption *o;
+ int i;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION];
+ o->name = "blur_decoration";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur decoration");
+ o->longDesc = N_("Blur decorations");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_BLUR_DECORATION_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS];
+ o->name = "blur_windows";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur windows");
+ o->longDesc = N_("Blur windows");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_BLUR_WINDOWS_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION];
+ o->name = "reflection_decoration";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection decoration");
+ o->longDesc = N_("Draw reflection for decorations");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_DECORATION_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS];
+ o->name = "reflection_windows";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection windows");
+ o->longDesc = N_("Draw reflection for windows");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN];
+ o->name = "blur_transformed_screen";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur transformed screen");
+ o->longDesc = N_("Draw blur if the screen is transformed");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW];
+ o->name = "blur_transformed_window";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur transformed window");
+ o->longDesc = N_("Draw blur if window is transformed");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_SHADER];
+ o->name = "blur_shader";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur Shader");
+ o->longDesc = N_("Blur Shader");
+ o->type = CompOptionTypeString;
+ o->value.s = strdup (BLURFX_SCREEN_OPTION_BLUR_SHADER_DEFAULT);
+ o->rest.s.string = blurShaderNames;
+ o->rest.s.nString = LIST_SIZE (blurShaderNames);
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR];
+ o->name = "force_non_fbo_blur";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Force non fbo blur");
+ o->longDesc = N_("Force non fbo blur");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH];
+ o->name = "non_fbo_blur_strength";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Non fbo blur strength");
+ o->longDesc = N_("Non fbo mode blur strength");
+ o->type = CompOptionTypeInt;
+ o->value.i = BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH_DEFAULT;
+ o->rest.i.min = 2;
+ o->rest.i.max = 12;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES];
+ o->name = "blur_cache";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Use blur cache");
+ o->longDesc = N_("Enables blur cache texture system");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN];
+ o->name = "no_cache_when_transformed";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable blur cache on transformed screen");
+ o->longDesc = N_("Disables blur cache on transformed screen");
+ o->type = CompOptionTypeBool;
+ o->value.b =
+ BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN_DEFAULT;
+
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP];
+ o->name = "disable_deco_alpha_dep";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable decoration alpha dependency");
+ o->longDesc = N_("Disable decoration alpha dependency");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF];
+ o->name = "disable_blur_on_screengrab_of";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable blur on screengrab of");
+ o->longDesc =
+ N_("Disable drawing of blur when an other plugin grabs the input");
+ o->type = CompOptionTypeList;
+ o->value.list.type = CompOptionTypeString;
+ o->value.list.nValue = LIST_SIZE (blurDisable);
+ o->value.list.value =
+ malloc (sizeof (CompOptionValue) * LIST_SIZE (blurDisable));
+ for (i = 0; i < LIST_SIZE (blurDisable); i++)
+ o->value.list.value[i].s = strdup (blurDisable[i]);
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN];
+ o->name = "reflection_transformed_screen";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection transformed screen");
+ o->longDesc = N_("Draw reflection if the screen is transformed");
+ o->type = CompOptionTypeBool;
+ o->value.b =
+ BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW];
+ o->name = "reflection_transformed_window";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection transformed window");
+ o->longDesc = N_("Draw reflection if the screen is transformed");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF];
+ o->name = "disable_reflection_on_screengrab_of";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable reflection on screengrab of");
+ o->longDesc =
+ N_
+ ("Disable drawing of reflection when an other plugin grabs the input");
+ o->type = CompOptionTypeList;
+ o->value.list.type = CompOptionTypeString;
+ o->value.list.nValue = 0;
+ o->value.list.value = NULL;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_FILE];
+ o->name = "reflection_file";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "file;image;pngonly;";
+ o->shortDesc = N_("Reflection file");
+ o->longDesc = N_("Reflection image file");
+ o->type = CompOptionTypeString;
+ o->value.s = strdup (BLURFX_SCREEN_OPTION_REFLECTION_FILE_DEFAULT);
+ o->rest.s.string = 0;
+ o->rest.s.nString = 0;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_SCALE];
+ o->name = "reflection_scale";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection scale");
+ o->longDesc = N_("Scale reflection image");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_SCALE_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL];
+ o->name = "reflection_proportional";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection proportional");
+ o->longDesc = N_("Scale proportional");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR];
+ o->name = "reflection_use_image_colors";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection Use Colors");
+ o->longDesc = N_("Do not generate grayscale reflection");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA];
+ o->name = "reflection_use_image_alpha";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Reflection Use Alpha");
+ o->longDesc = N_("Use image alpha channel");
+ o->type = CompOptionTypeBool;
+ o->value.b = BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE];
+ o->name = "motion_blur_mode";
+ o->group = N_("Motion Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Motion Blur Mode");
+ o->longDesc =
+ N_
+ ("Motion blur mode: simple = uses texture copy and blending; accum ="
+ " uses gl accumulation buffer; fbo = uses framebuffer objects and float texture;");
+ o->type = CompOptionTypeString;
+ o->value.s = strdup (BLURFX_SCREEN_OPTION_MOTION_BLUR_MODE_DEFAULT);
+ o->rest.s.string = mBlurModes;
+ o->rest.s.nString = LIST_SIZE (mBlurModes);
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF];
+ o->name = "motion_blur_on_screengrab_of";
+ o->group = N_("Motion Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Motion blur on screengrab of");
+ o->longDesc = N_("Activate motion blur on screengrab");
+ o->type = CompOptionTypeList;
+ o->value.list.type = CompOptionTypeString;
+ o->value.list.nValue = 0;
+ o->value.list.value = NULL;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN];
+ o->name = "motion_blur_on_transformed_screen";
+ o->group = N_("Motion Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Motion blur on transformed screen");
+ o->longDesc = N_("Execute motion blur if the screen is transformed");
+ o->type = CompOptionTypeBool;
+ o->value.b =
+ BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN_DEFAULT;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH];
+ o->name = "motion_blur_strength";
+ o->group = N_("Motion Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Motion blur strength");
+ o->longDesc = N_("Motion blur strength");
+ o->type = CompOptionTypeFloat;
+ o->value.f = BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH_DEFAULT;
+ o->rest.f.min = 0.0;
+ o->rest.f.max = 100.0;
+ o->rest.f.precision = 0.01;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_WINDOW_TYPE];
+ o->name = "disable_blur_window_types";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable Blur Window Types");
+ o->longDesc = N_("Window types for that blur should be disabled");
+ o->type = CompOptionTypeList;
+ o->value.list.type = CompOptionTypeString;
+ o->value.list.nValue = 0;
+ o->value.list.value = NULL;
+ o->rest.s.string = (char **)windowTypeString;
+ o->rest.s.nString = nWindowTypeString;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_WINDOW_TYPE];
+ o->name = "disable_reflection_window_types";
+ o->group = N_("Reflection");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Disable Reflection Window Types");
+ o->longDesc = N_("Window types for that reflection should be disabled");
+ o->type = CompOptionTypeList;
+ o->value.list.type = CompOptionTypeString;
+ o->value.list.nValue = 0;
+ o->value.list.value = NULL;
+ o->rest.s.string = (char **)windowTypeString;
+ o->rest.s.nString = nWindowTypeString;
+
+ o = &bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION];
+ o->name = "blur_saturation";
+ o->group = N_("Blur");
+ o->subGroup = N_("");
+ o->displayHints = "";
+ o->shortDesc = N_("Blur saturation");
+ o->longDesc = N_("Blur saturation");
+ o->type = CompOptionTypeFloat;
+ o->value.f = BLURFX_SCREEN_OPTION_BLUR_SATURATION_DEFAULT;
+ o->rest.f.min = 0.0;
+ o->rest.f.max = 100.0;
+ o->rest.f.precision = 0.1;
}
-static void blurfxPreparePaintScreen(CompScreen * s, int ms)
+static void
+blurfxPreparePaintScreen (CompScreen * s, int ms)
{
- BLURFX_SCREEN(s);
- Bool mba = FALSE;
- int i;
-
- // activate motion blur on desired screen grab
- for (i = 0;
- i <
- bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- mba |=
- screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- bs->motion_blur_active |= bs->mb_activated;
- bs->motion_blur_active |= mba;
-
- bs->motion_blur_active &= bs->mblur_supported;
-
- // fade motion blur out if no longer active
- if (mba || bs->mb_activated) {
- bs->mb_timer = 500;
- } else {
- bs->mb_timer -= ms;
- }
-
- // calculate motion blur strength dependent on framerate
- float val = 101 - MIN(100, MAX(1, ms));
-
- float a_val =
- (bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH].value.f /
- 20.0);
- a_val = a_val * a_val;
- a_val /= 100.0;
-
- bs->mb_alpha = 1.0 - pow(a_val, 1.0 / val);
-
- if (bs->motion_blur_active && bs->mb_timer <= 0)
- damageScreen(s);
-
- if (bs->mb_timer <= 0) {
- bs->motion_blur_active = FALSE;
- }
- if (bs->mb_update && bs->motion_blur_active)
- damageScreen(s);
-
- UNWRAP(bs, s, preparePaintScreen);
- (*s->preparePaintScreen) (s, ms);
- WRAP(bs, s, preparePaintScreen, blurfxPreparePaintScreen);
+ BLURFX_SCREEN (s);
+ Bool mba = FALSE;
+ int i;
+
+ // activate motion blur on desired screen grab
+ for (i = 0;
+ i <
+ bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ mba |=
+ screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ bs->motion_blur_active |= bs->mb_activated;
+ bs->motion_blur_active |= mba;
+
+ bs->motion_blur_active &= bs->mblur_supported;
+
+ // fade motion blur out if no longer active
+ if (mba || bs->mb_activated)
+ {
+ bs->mb_timer = 500;
+ }
+ else
+ {
+ bs->mb_timer -= ms;
+ }
+
+ // calculate motion blur strength dependent on framerate
+ float val = 101 - MIN (100, MAX (1, ms));
+
+ float a_val =
+ (bs->opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_STRENGTH].value.f / 20.0);
+ a_val = a_val * a_val;
+ a_val /= 100.0;
+
+ bs->mb_alpha = 1.0 - pow (a_val, 1.0 / val);
+
+ if (bs->motion_blur_active && bs->mb_timer <= 0)
+ damageScreen (s);
+
+ if (bs->mb_timer <= 0)
+ {
+ bs->motion_blur_active = FALSE;
+ }
+ if (bs->mb_update && bs->motion_blur_active)
+ damageScreen (s);
+
+ UNWRAP (bs, s, preparePaintScreen);
+ (*s->preparePaintScreen) (s, ms);
+ WRAP (bs, s, preparePaintScreen, blurfxPreparePaintScreen);
}
static Bool
-blurfxPaintScreen(CompScreen * s, const ScreenPaintAttrib * sa,
- Region region, int output, unsigned int mask)
+blurfxPaintScreen (CompScreen * s, const ScreenPaintAttrib * sa,
+ Region region, int output, unsigned int mask)
{
- Bool status, blur_fbo;
- BLURFX_SCREEN(s);
-
- int i;
- Region bigregion = XCreateRegion();
- XRectangle rect;
-
- bs->fboActive = FALSE;
-
- bs->realPaintRegion = region;
-
- bs->output = output;
-
- // blur needs bigger repaint regions
- for (i = 0; i < region->numRects; i++) {
- rect.x = region->rects[i].x1 - 7;
- rect.y = region->rects[i].y1 - 7;
- rect.width = region->rects[i].x2 - rect.x + 14;
- rect.height = region->rects[i].y2 - rect.y + 14;
-
- XUnionRectWithRegion(&rect, bigregion, bigregion);
- }
-
- //Initiliaze the screen if ith hasnt beens
- if (bs->hasInit != 1) {
- initBlurfxScreen(bs, s->width, s->height, s);
- }
- // clear screen damage region
- XUnionRegion(getEmptyRegion(), getEmptyRegion(), bs->screenDamage);
-
- // enable blur if needed
- blur_fbo = bs->blur_supported && bs->fboBlur_supported
- && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b;
- blur_fbo &= bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
-
- if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].
- value.b)
- blur_fbo &=
- !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
-
- for (i = 0;
- i <
- bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- blur_fbo &=
- !screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- bs->od_active = FALSE;
-
- // calculate occluted regions
- if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b) {
- bs->mode = MODE_OCCLUSION;
- bs->od_active = TRUE;
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bs->occlusion);
- CompWindow *w;
- for (w = s->reverseWindows; w; w = w->prev) {
- BLURFX_WINDOW(w);
- if (w->destroyed)
- continue;
-
- if (!w->shaded) {
- if (w->attrib.map_state != IsViewable
- || !w->damaged)
- continue;
- }
- XUnionRegion(bs->occlusion, getEmptyRegion(),
- bw->clip);
- (*s->drawWindow) (w, &w->paint, &s->region,
- PAINT_WINDOW_SOLID_MASK);
- }
- }
-
- bs->mode = MODE_NORMAL;
-
- Bool splash =
- IPCS_GetBoolND(IPCS_OBJECT(s), "SPLASH_IS_ACTIVE", FALSE);
-
- blur_fbo &= !DISABLE_FEATURE(s, bs->ipcs_disable_blur);
- blur_fbo &= !splash;
- bs->motion_blur_active &=
- !DISABLE_FEATURE(s, bs->ipcs_disable_mblur);
- bs->motion_blur_active &= !splash;
-
- if (!bs->motion_blur_active)
- bs->mb_update = TRUE;
-
- Bool enable_scissor = FALSE;
-
- // store the projection matrix
- glGetFloatv(GL_PROJECTION_MATRIX, bs->pm);
-
- if ((blur_fbo || (bs->motion_blur_active && bs->mb_mode == 2))
- && s->fbo) {
-
- float ModelView[16];
- glGetFloatv(GL_MODELVIEW_MATRIX, ModelView);
-
-
- // redirect all drawing operations into background texture
- bindFbo(s, bs->backTex);
-
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(bs->pm);
- glMatrixMode(GL_MODELVIEW);
- glLoadMatrixf(ModelView);
-
- // paint the screen into fbo
- UNWRAP(bs, s, paintScreen);
- status =
- (*s->paintScreen) (s, sa, bigregion, output, mask);
- WRAP(bs, s, paintScreen, blurfxPaintScreen);
-
- unbindFbo(s);
-
- if (bs->motion_blur_active && bs->mb_mode == 2
- && output + 1 == s->nOutputDev) {
-
- // blend actual screen into motion blur texture
- if (glIsEnabled(GL_SCISSOR_TEST)) {
- glDisable(GL_SCISSOR_TEST);
- enable_scissor = TRUE;
- }
- glPushAttrib(GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
- GLERR;
- bindFbo(s, bs->motionTex);
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, s->width, s->height);
- glTranslatef(-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
- glScalef(1.0f / s->width, -1.0f / s->height, 1.0f);
- glTranslatef(0.0f, -s->height, 0.0f);
-
- if (bs->mb_update) {
- glClearColor(1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glDisable(GL_BLEND);
- } else
- glEnable(GL_BLEND);
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- bs->mb_alpha =
- (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
- (bs->
- mb_timer
- /
- 500.0))
- * 0.5;
- bs->mb_alpha = MIN(1.0, bs->mb_alpha);
- glColor4f(1, 1, 1,
- (bs->mb_update) ? 1.0 : bs->mb_alpha);
- enableBlurfxTexture(&bs->backTex,
- COMP_TEXTURE_FILTER_FAST);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
- GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,
- GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB,
- GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,
- GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,
- GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA,
- GL_PRIMARY_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA,
- GL_SRC_ALPHA);
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, bs->backTex.height);
- glVertex2f(0, 0);
- glTexCoord2f(0, 0);
- glVertex2f(0, bs->backTex.height);
- glTexCoord2f(bs->backTex.width, 0);
- glVertex2f(bs->backTex.width, bs->backTex.height);
- glTexCoord2f(bs->backTex.width,
- bs->backTex.height);
- glVertex2f(bs->backTex.width, 0);
-
- glEnd();
-
- glDisable(GL_BLEND);
-
- glPopMatrix();
- unbindFbo(s);
-
- // paint motion blur texture
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, s->width, s->height);
- glTranslatef(-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
- glScalef(1.0f / s->width, -1.0f / s->height, 1.0f);
- glTranslatef(0.0f, -s->height, 0.0f);
-
- glColor4f(1.0, 1.0, 1.0, 1.0);
-
- switchBlurfxTexture(&bs->backTex, &bs->motionTex,
- COMP_TEXTURE_FILTER_FAST);
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, bs->backTex.height);
- glVertex2f(0, 0);
- glTexCoord2f(0, 0);
- glVertex2f(0, bs->backTex.height);
- glTexCoord2f(bs->backTex.width, 0);
- glVertex2f(bs->backTex.width, bs->backTex.height);
- glTexCoord2f(bs->backTex.width,
- bs->backTex.height);
- glVertex2f(bs->backTex.width, 0);
-
- glEnd();
-
- disableBlurfxTexture(&bs->motionTex);
-
- glPopMatrix();
- glViewport(s->outputDev[bs->output].region.extents.
- x1,
- s->height -
- s->outputDev[bs->output].region.extents.
- y2, s->outputDev[bs->output].width,
- s->outputDev[bs->output].height);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
- GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB,
- GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB,
- GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB,
- GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA,
- GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA,
- GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA,
- GL_PREVIOUS);
-
- glPopAttrib();
- GLERR;
-
- bs->mb_update = FALSE;
- damageScreen(s);
-
- } else {
-
- glPushMatrix();
- glLoadIdentity();
- prepareXCoords(s, output, -DEFAULT_Z_CAMERA);
-
- // draw background texture
- int stride;
- CompMatrix mat;
- mat.xx = 1.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = -1.0;
- mat.x0 = 0;
- mat.y0 = s->height;
-
- stride = 4 * sizeof(GLfloat);
- genGeometry(&bs->vertArray, mat, 0,
- &s->outputDev[bs->output].region);
- glVertexPointer(2, GL_FLOAT, stride,
- bs->vertArray.vertices + 2);
- glTexCoordPointer(2, GL_FLOAT, stride,
- bs->vertArray.vertices);
- glColor4f(1.0, 1.0, 1.0, 1.0);
-
- enableBlurfxTexture(&bs->backTex,
- COMP_TEXTURE_FILTER_FAST);
-
- glDrawArrays(GL_QUADS, 0, bs->vertArray.vCount);
-
- disableBlurfxTexture(&bs->backTex);
-
- glPopMatrix();
- }
-
- } else {
- UNWRAP(bs, s, paintScreen);
- status =
- (*s->paintScreen) (s, sa, bigregion, output, mask);
- WRAP(bs, s, paintScreen, blurfxPaintScreen);
- }
-
- if (bs->motion_blur_active && glIsEnabled(GL_SCISSOR_TEST)) {
- glDisable(GL_SCISSOR_TEST);
- enable_scissor = TRUE;
- }
-
- if (bs->motion_blur_active && bs->mb_mode == 0
- && output + 1 == s->nOutputDev) {
-
- // blend motion blur texture to screen
- glPushAttrib(GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
- GLERR;
- glPushMatrix();
- glLoadIdentity();
- glViewport(0, 0, s->width, s->height);
- glTranslatef(-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
- glScalef(1.0f / s->width, -1.0f / s->height, 1.0f);
- glTranslatef(0.0f, -s->height, 0.0f);
-
- enableBlurfxTexture(&bs->motionTex,
- COMP_TEXTURE_FILTER_FAST);
-
- if (!bs->mb_update) {
- glEnable(GL_BLEND);
-
- glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
- bs->mb_alpha =
- (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
- (bs->
- mb_timer
- /
- 500.0))
- * 0.5;
- glColor4f(1, 1, 1, bs->mb_alpha);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
- GL_MODULATE);
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, bs->motionTex.height);
- glVertex2f(0, 0);
- glTexCoord2f(0, 0);
- glVertex2f(0, bs->motionTex.height);
- glTexCoord2f(bs->motionTex.width, 0);
- glVertex2f(bs->motionTex.width,
- bs->motionTex.height);
- glTexCoord2f(bs->motionTex.width,
- bs->motionTex.height);
- glVertex2f(bs->motionTex.width, 0);
- glEnd();
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
- GL_REPLACE);
-
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- GLERR;
- glDisable(GL_BLEND);
- }
- // copy new screen to motion blur texture
- glCopyTexSubImage2D(bs->motionTex.target, 0, 0, 0, 0, 0,
- s->width, s->height);
- GLERR;
-
- disableBlurfxTexture(&bs->motionTex);
-
- glViewport(s->outputDev[bs->output].region.extents.x1,
- s->height -
- s->outputDev[bs->output].region.extents.y2,
- s->outputDev[bs->output].width,
- s->outputDev[bs->output].height);
-
- glPopMatrix();
- glPopAttrib();
- GLERR;
-
- bs->mb_update = FALSE;
- damageScreen(s);
- }
-
- if (bs->motion_blur_active && bs->mb_mode == 1
- && output + 1 == s->nOutputDev) {
-
- // create motion blur effect using accumulation buffer
- bs->mb_alpha =
- (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
- (bs->
- mb_timer /
- 500.0)) *
- 0.5;
- if (bs->mb_update) {
- glAccum(GL_LOAD, 1.0);
- } else {
- glAccum(GL_MULT, 1.0 - bs->mb_alpha);
- glAccum(GL_ACCUM, bs->mb_alpha);
- glAccum(GL_RETURN, 1.0);
- }
- bs->mb_update = FALSE;
- damageScreen(s);
- }
-
- if (enable_scissor)
- glEnable(GL_SCISSOR_TEST);
-
- XDestroyRegion(bigregion);
- return status;
+ Bool status, blur_fbo;
+ BLURFX_SCREEN (s);
+
+ int i;
+ Region bigregion = XCreateRegion ();
+ XRectangle rect;
+
+ bs->fboActive = FALSE;
+
+ bs->realPaintRegion = region;
+
+ bs->output = output;
+
+ // blur needs bigger repaint regions
+ for (i = 0; i < region->numRects; i++)
+ {
+ rect.x = region->rects[i].x1 - 7;
+ rect.y = region->rects[i].y1 - 7;
+ rect.width = region->rects[i].x2 - rect.x + 14;
+ rect.height = region->rects[i].y2 - rect.y + 14;
+
+ XUnionRectWithRegion (&rect, bigregion, bigregion);
+ }
+
+ //Initiliaze the screen if ith hasnt beens
+ if (bs->hasInit != 1)
+ {
+ initBlurfxScreen (bs, s->width, s->height, s);
+ }
+ // clear screen damage region
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bs->screenDamage);
+
+ // enable blur if needed
+ blur_fbo = bs->blur_supported && bs->fboBlur_supported
+ && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b;
+ blur_fbo &= bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
+
+ if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].value.b)
+ blur_fbo &= !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
+
+ for (i = 0;
+ i <
+ bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ blur_fbo &=
+ !screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ bs->od_active = FALSE;
+
+ // calculate occluted regions
+ if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b)
+ {
+ bs->mode = MODE_OCCLUSION;
+ bs->od_active = TRUE;
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bs->occlusion);
+ CompWindow *w;
+ for (w = s->reverseWindows; w; w = w->prev)
+ {
+ BLURFX_WINDOW (w);
+ if (w->destroyed)
+ continue;
+
+ if (!w->shaded)
+ {
+ if (w->attrib.map_state != IsViewable || !w->damaged)
+ continue;
+ }
+ XUnionRegion (bs->occlusion, getEmptyRegion (), bw->clip);
+ (*s->drawWindow) (w, &w->paint, &s->region,
+ PAINT_WINDOW_SOLID_MASK);
+ }
+ }
+
+ bs->mode = MODE_NORMAL;
+
+ Bool splash = IPCS_GetBoolND (IPCS_OBJECT (s), "SPLASH_IS_ACTIVE", FALSE);
+
+ blur_fbo &= !DISABLE_FEATURE (s, bs->ipcs_disable_blur);
+ blur_fbo &= !splash;
+ bs->motion_blur_active &= !DISABLE_FEATURE (s, bs->ipcs_disable_mblur);
+ bs->motion_blur_active &= !splash;
+
+ if (!bs->motion_blur_active)
+ bs->mb_update = TRUE;
+
+ Bool enable_scissor = FALSE;
+
+ // store the projection matrix
+ glGetFloatv (GL_PROJECTION_MATRIX, bs->pm);
+
+ if ((blur_fbo || (bs->motion_blur_active && bs->mb_mode == 2)) && s->fbo)
+ {
+
+ float ModelView[16];
+ glGetFloatv (GL_MODELVIEW_MATRIX, ModelView);
+
+
+ // redirect all drawing operations into background texture
+ bindFbo (s, bs->backTex);
+
+ glMatrixMode (GL_PROJECTION);
+ glLoadMatrixf (bs->pm);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadMatrixf (ModelView);
+
+ // paint the screen into fbo
+ UNWRAP (bs, s, paintScreen);
+ status = (*s->paintScreen) (s, sa, bigregion, output, mask);
+ WRAP (bs, s, paintScreen, blurfxPaintScreen);
+
+ unbindFbo (s);
+
+ if (bs->motion_blur_active && bs->mb_mode == 2
+ && output + 1 == s->nOutputDev)
+ {
+
+ // blend actual screen into motion blur texture
+ if (glIsEnabled (GL_SCISSOR_TEST))
+ {
+ glDisable (GL_SCISSOR_TEST);
+ enable_scissor = TRUE;
+ }
+ glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
+ GLERR;
+ bindFbo (s, bs->motionTex);
+ glPushMatrix ();
+ glLoadIdentity ();
+ glViewport (0, 0, s->width, s->height);
+ glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
+ glScalef (1.0f / s->width, -1.0f / s->height, 1.0f);
+ glTranslatef (0.0f, -s->height, 0.0f);
+
+ if (bs->mb_update)
+ {
+ glClearColor (1.0, 1.0, 1.0, 1.0);
+ glClear (GL_COLOR_BUFFER_BIT);
+ glDisable (GL_BLEND);
+ }
+ else
+ glEnable (GL_BLEND);
+
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ bs->mb_alpha =
+ (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
+ (bs->
+ mb_timer
+ / 500.0)) * 0.5;
+ bs->mb_alpha = MIN (1.0, bs->mb_alpha);
+ glColor4f (1, 1, 1, (bs->mb_update) ? 1.0 : bs->mb_alpha);
+ enableBlurfxTexture (&bs->backTex, COMP_TEXTURE_FILTER_FAST);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, bs->backTex.height);
+ glVertex2f (0, 0);
+ glTexCoord2f (0, 0);
+ glVertex2f (0, bs->backTex.height);
+ glTexCoord2f (bs->backTex.width, 0);
+ glVertex2f (bs->backTex.width, bs->backTex.height);
+ glTexCoord2f (bs->backTex.width, bs->backTex.height);
+ glVertex2f (bs->backTex.width, 0);
+
+ glEnd ();
+
+ glDisable (GL_BLEND);
+
+ glPopMatrix ();
+ unbindFbo (s);
+
+ // paint motion blur texture
+ glPushMatrix ();
+ glLoadIdentity ();
+ glViewport (0, 0, s->width, s->height);
+ glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
+ glScalef (1.0f / s->width, -1.0f / s->height, 1.0f);
+ glTranslatef (0.0f, -s->height, 0.0f);
+
+ glColor4f (1.0, 1.0, 1.0, 1.0);
+
+ switchBlurfxTexture (&bs->backTex, &bs->motionTex,
+ COMP_TEXTURE_FILTER_FAST);
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, bs->backTex.height);
+ glVertex2f (0, 0);
+ glTexCoord2f (0, 0);
+ glVertex2f (0, bs->backTex.height);
+ glTexCoord2f (bs->backTex.width, 0);
+ glVertex2f (bs->backTex.width, bs->backTex.height);
+ glTexCoord2f (bs->backTex.width, bs->backTex.height);
+ glVertex2f (bs->backTex.width, 0);
+
+ glEnd ();
+
+ disableBlurfxTexture (&bs->motionTex);
+
+ glPopMatrix ();
+ glViewport (s->outputDev[bs->output].region.extents.
+ x1,
+ s->height -
+ s->outputDev[bs->output].region.extents.
+ y2, s->outputDev[bs->output].width,
+ s->outputDev[bs->output].height);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
+
+ glPopAttrib ();
+ GLERR;
+
+ bs->mb_update = FALSE;
+ damageScreen (s);
+
+ }
+ else
+ {
+
+ glPushMatrix ();
+ glLoadIdentity ();
+ prepareXCoords (s, output, -DEFAULT_Z_CAMERA);
+
+ // draw background texture
+ int stride;
+ CompMatrix mat;
+ mat.xx = 1.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = -1.0;
+ mat.x0 = 0;
+ mat.y0 = s->height;
+
+ stride = 4 * sizeof (GLfloat);
+ genGeometry (&bs->vertArray, mat, 0,
+ &s->outputDev[bs->output].region);
+ glVertexPointer (2, GL_FLOAT, stride, bs->vertArray.vertices + 2);
+ glTexCoordPointer (2, GL_FLOAT, stride, bs->vertArray.vertices);
+ glColor4f (1.0, 1.0, 1.0, 1.0);
+
+ enableBlurfxTexture (&bs->backTex, COMP_TEXTURE_FILTER_FAST);
+
+ glDrawArrays (GL_QUADS, 0, bs->vertArray.vCount);
+
+ disableBlurfxTexture (&bs->backTex);
+
+ glPopMatrix ();
+ }
+
+ }
+ else
+ {
+ UNWRAP (bs, s, paintScreen);
+ status = (*s->paintScreen) (s, sa, bigregion, output, mask);
+ WRAP (bs, s, paintScreen, blurfxPaintScreen);
+ }
+
+ if (bs->motion_blur_active && glIsEnabled (GL_SCISSOR_TEST))
+ {
+ glDisable (GL_SCISSOR_TEST);
+ enable_scissor = TRUE;
+ }
+
+ if (bs->motion_blur_active && bs->mb_mode == 0
+ && output + 1 == s->nOutputDev)
+ {
+
+ // blend motion blur texture to screen
+ glPushAttrib (GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT);
+ GLERR;
+ glPushMatrix ();
+ glLoadIdentity ();
+ glViewport (0, 0, s->width, s->height);
+ glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
+ glScalef (1.0f / s->width, -1.0f / s->height, 1.0f);
+ glTranslatef (0.0f, -s->height, 0.0f);
+
+ enableBlurfxTexture (&bs->motionTex, COMP_TEXTURE_FILTER_FAST);
+
+ if (!bs->mb_update)
+ {
+ glEnable (GL_BLEND);
+
+ glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+ bs->mb_alpha =
+ (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
+ (bs->
+ mb_timer
+ / 500.0)) * 0.5;
+ glColor4f (1, 1, 1, bs->mb_alpha);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, bs->motionTex.height);
+ glVertex2f (0, 0);
+ glTexCoord2f (0, 0);
+ glVertex2f (0, bs->motionTex.height);
+ glTexCoord2f (bs->motionTex.width, 0);
+ glVertex2f (bs->motionTex.width, bs->motionTex.height);
+ glTexCoord2f (bs->motionTex.width, bs->motionTex.height);
+ glVertex2f (bs->motionTex.width, 0);
+ glEnd ();
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ GLERR;
+ glDisable (GL_BLEND);
+ }
+ // copy new screen to motion blur texture
+ glCopyTexSubImage2D (bs->motionTex.target, 0, 0, 0, 0, 0,
+ s->width, s->height);
+ GLERR;
+
+ disableBlurfxTexture (&bs->motionTex);
+
+ glViewport (s->outputDev[bs->output].region.extents.x1,
+ s->height -
+ s->outputDev[bs->output].region.extents.y2,
+ s->outputDev[bs->output].width,
+ s->outputDev[bs->output].height);
+
+ glPopMatrix ();
+ glPopAttrib ();
+ GLERR;
+
+ bs->mb_update = FALSE;
+ damageScreen (s);
+ }
+
+ if (bs->motion_blur_active && bs->mb_mode == 1
+ && output + 1 == s->nOutputDev)
+ {
+
+ // create motion blur effect using accumulation buffer
+ bs->mb_alpha =
+ (bs->mb_timer / 500.0) * bs->mb_alpha + (1.0 -
+ (bs->
+ mb_timer /
+ 500.0)) * 0.5;
+ if (bs->mb_update)
+ {
+ glAccum (GL_LOAD, 1.0);
+ }
+ else
+ {
+ glAccum (GL_MULT, 1.0 - bs->mb_alpha);
+ glAccum (GL_ACCUM, bs->mb_alpha);
+ glAccum (GL_RETURN, 1.0);
+ }
+ bs->mb_update = FALSE;
+ damageScreen (s);
+ }
+
+ if (enable_scissor)
+ glEnable (GL_SCISSOR_TEST);
+
+ XDestroyRegion (bigregion);
+ return status;
}
static void
-blurfxPaintTransformedScreen(CompScreen * s, const ScreenPaintAttrib * sa,
- Region region, int output, unsigned int mask)
+blurfxPaintTransformedScreen (CompScreen * s, const ScreenPaintAttrib * sa,
+ Region region, int output, unsigned int mask)
{
- BLURFX_SCREEN(s);
-
- bs->realPaintRegion = &s->region;
-
- // calculate occluted regions
- if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b) {
- bs->mode = MODE_OCCLUSION;
- bs->od_active = TRUE;
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bs->occlusion);
- CompWindow *w;
- for (w = s->reverseWindows; w; w = w->prev) {
- BLURFX_WINDOW(w);
- if (w->destroyed)
- continue;
-
- if (!w->shaded) {
- if (w->attrib.map_state != IsViewable
- || !w->damaged)
- continue;
- }
- XUnionRegion(bs->occlusion, getEmptyRegion(),
- bw->clip);
- (*s->drawWindow) (w, &w->paint, &s->region,
- PAINT_WINDOW_SOLID_MASK);
- }
- }
- bs->mode = MODE_NORMAL;
- UNWRAP(bs, s, paintTransformedScreen);
- (*s->paintTransformedScreen) (s, sa, region, output, mask);
- WRAP(bs, s, paintTransformedScreen, blurfxPaintTransformedScreen);
+ BLURFX_SCREEN (s);
+
+ bs->realPaintRegion = &s->region;
+
+ // calculate occluted regions
+ if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b)
+ {
+ bs->mode = MODE_OCCLUSION;
+ bs->od_active = TRUE;
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bs->occlusion);
+ CompWindow *w;
+ for (w = s->reverseWindows; w; w = w->prev)
+ {
+ BLURFX_WINDOW (w);
+ if (w->destroyed)
+ continue;
+
+ if (!w->shaded)
+ {
+ if (w->attrib.map_state != IsViewable || !w->damaged)
+ continue;
+ }
+ XUnionRegion (bs->occlusion, getEmptyRegion (), bw->clip);
+ (*s->drawWindow) (w, &w->paint, &s->region,
+ PAINT_WINDOW_SOLID_MASK);
+ }
+ }
+ bs->mode = MODE_NORMAL;
+ UNWRAP (bs, s, paintTransformedScreen);
+ (*s->paintTransformedScreen) (s, sa, region, output, mask);
+ WRAP (bs, s, paintTransformedScreen, blurfxPaintTransformedScreen);
}
static Bool
-blurfxDrawWindow(CompWindow * w, const WindowPaintAttrib * attrib,
- Region region, unsigned int mask)
+blurfxDrawWindow (CompWindow * w, const WindowPaintAttrib * attrib,
+ Region region, unsigned int mask)
{
- Bool status;
- int i;
-
- BLURFX_SCREEN(w->screen);
- BLURFX_WINDOW(w);
-
- CompScreen *s = w->screen;
- Bool blur_enabled, reflection_enabled;
-
- if (bs->mode == MODE_OCCLUSION) {
- UNWRAP(bs, s, drawWindow);
- status = (*s->drawWindow) (w, attrib, region, mask);
- WRAP(bs, s, drawWindow, blurfxDrawWindow);
- return status;
- }
-
- if (bs->fboActive && !bs->rb_supported)
- glDisable(GL_STENCIL_TEST);
-
- // enable blur and/or reflection
- blur_enabled = bs->blur_supported;
- reflection_enabled = bs->reflection_supported;
-
- blur_enabled &=
- bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
- reflection_enabled &=
- bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION].value.b
- || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b;
-
- blur_enabled &= !(mask & PAINT_WINDOW_SOLID_MASK);
-
- reflection_enabled &= !(mask & PAINT_WINDOW_SOLID_MASK);
- reflection_enabled &= bs->modTex.handle > 0;
-
- if (bs->
- opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN].
- value.b && (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) {
- bs->motion_blur_active = bs->mblur_supported;
- bs->mb_timer = 500;
- }
-
- if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].
- value.b)
- blur_enabled &=
- !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
- if (!bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN].
- value.b)
- reflection_enabled &=
- !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
-
- if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW].value.b)
- blur_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
- if (!bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW].
- value.b)
- reflection_enabled &=
- !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
-
- for (i = 0;
- i <
- bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- blur_enabled &=
- !screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- for (i = 0;
- i <
- bs->
- opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- reflection_enabled &=
- !screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- Bool splash =
- IPCS_GetBoolND(IPCS_OBJECT(s), "SPLASH_IS_ACTIVE", FALSE);
-
- blur_enabled &= !DISABLE_FEATURE(s, bs->ipcs_disable_blur);
- blur_enabled &= !DISABLE_FEATURE(w, bw->ipcs_disable_blur);
- blur_enabled &= !splash;
-
- reflection_enabled &=
- !DISABLE_FEATURE(s, bs->ipcs_disable_reflection);
- reflection_enabled &=
- !DISABLE_FEATURE(w, bw->ipcs_disable_reflection);
- reflection_enabled &= !splash;
-
-
- // check for restacking and update damage if needed
- if (w->next != bw->my_next) {
- XRectangle rect;
-
- rect.x = WIN_X(w) - 7;
- rect.y = WIN_Y(w) - 7;
- rect.width = WIN_W(w) + 14;
- rect.height = WIN_H(w) + 14;
-
- XUnionRectWithRegion(&rect, bs->screenDamage,
- bs->screenDamage);
- bw->my_next = w->next;
- }
-
- if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].value.b)
- XUnionRegion(bw->texDamage, bs->screenDamage,
- bw->texDamage);
-
- bw->mvm_updated = FALSE;
-
- if (blur_enabled || reflection_enabled) {
-
- // clear our decoration vertex array
- bw->decoArray.vCount = 0;
- bw->decoArray.indexSize = 0;
- bw->decoArray.indexCount = 0;
-
- // store region we need to paint
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->paintRegion);
- XIntersectRegion(bs->realPaintRegion, region,
- bw->paintRegion);
- bw->texUpdated = FALSE;
-
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bs->blurredRegion);
-
- // paint blur and reflection
-
- bs->mode = MODE_BLURREFLECTION;
-
- bs->paintingSwitcher = bw->isSwitcher;
-
- UNWRAP(bs, s, drawWindow);
- status = (*s->drawWindow) (w, attrib, region, mask);
- WRAP(bs, s, drawWindow, blurfxDrawWindow);
-
- glColor4usv(defaultColor);
- screenTexEnvMode(w->screen, GL_REPLACE);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- GLERR;
-
- // paint window
- bs->mode = MODE_NORMAL;
- bs->was_transformed = FALSE;
-
- UNWRAP(bs, s, drawWindow);
- status = (*s->drawWindow) (w, attrib, region, mask);
- WRAP(bs, s, drawWindow, blurfxDrawWindow);
-
- } else {
- // paint window
- bs->mode = MODE_NORMAL;
- bs->was_transformed = FALSE;
-
- UNWRAP(bs, s, drawWindow);
- status = (*s->drawWindow) (w, attrib, region, mask);
- WRAP(bs, s, drawWindow, blurfxDrawWindow);
-
- }
-
- if (bs->was_transformed)
- XUnionRegion(&s->outputDev[bs->output].region,
- bs->screenDamage, bs->screenDamage);
-
- if (!(mask & PAINT_WINDOW_SOLID_MASK)
- && !WINDOW_INPUT_INVISIBLE(w)) {
-
- // not all plugins send damage events on move or scale
- XRectangle rect;
-
- if (bw->lastX != w->attrib.x || bw->lastY != w->attrib.y
- || w->lastPaint.xScale != attrib->xScale
- || w->lastPaint.yScale != attrib->yScale) {
- rect.x = bw->lastPAttrib.xTranslate +
- (-w->output.left * bw->lastPAttrib.xScale) +
- bw->lastX;
- rect.y =
- bw->lastPAttrib.yTranslate +
- (-w->output.top * bw->lastPAttrib.yScale) +
- bw->lastY;
- rect.width = WIN_W(w) * bw->lastPAttrib.xScale;
- rect.height = WIN_H(w) * bw->lastPAttrib.yScale;
- XUnionRectWithRegion(&rect, bs->screenDamage,
- bs->screenDamage);
- rect.x =
- attrib->xTranslate +
- (-w->output.left * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (-w->output.top * attrib->yScale) +
- w->attrib.x;
- rect.width = WIN_W(w) * attrib->xScale;
- rect.height = WIN_H(w) * attrib->yScale;
- XUnionRectWithRegion(&rect, bs->screenDamage,
- bs->screenDamage);
- }
- bw->lastX = w->attrib.x;
- bw->lastY = w->attrib.y;
-
- if (bw->lastPAttrib.xScale != 1.0
- || bw->lastPAttrib.yScale != 1.0) {
- for (i = 0; i < bw->damageRegion->numRects; i++) {
- BOX box = bw->damageRegion->rects[i];
- rect.x = bw->lastPAttrib.xTranslate +
- (box.x1 -
- w->attrib.x) * bw->lastPAttrib.xScale;
- rect.y =
- bw->lastPAttrib.yTranslate + (box.y1 -
- w->
- attrib.
- y) *
- bw->lastPAttrib.yScale;
- rect.width =
- (box.x2 -
- box.x1) * bw->lastPAttrib.xScale;
- rect.height =
- (box.y2 -
- box.y1) * bw->lastPAttrib.yScale;
- XUnionRectWithRegion(&rect,
- bs->screenDamage,
- bs->screenDamage);
- }
- } else {
- XUnionRegion(bw->damageRegion, bs->screenDamage,
- bs->screenDamage);
- }
- bw->lastPAttrib = *attrib;
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->damageRegion);
- }
-
- return status;
+ Bool status;
+ int i;
+
+ BLURFX_SCREEN (w->screen);
+ BLURFX_WINDOW (w);
+
+ CompScreen *s = w->screen;
+ Bool blur_enabled, reflection_enabled;
+
+ if (bs->mode == MODE_OCCLUSION)
+ {
+ UNWRAP (bs, s, drawWindow);
+ status = (*s->drawWindow) (w, attrib, region, mask);
+ WRAP (bs, s, drawWindow, blurfxDrawWindow);
+ return status;
+ }
+
+ if (bs->fboActive && !bs->rb_supported)
+ glDisable (GL_STENCIL_TEST);
+
+ // enable blur and/or reflection
+ blur_enabled = bs->blur_supported;
+ reflection_enabled = bs->reflection_supported;
+
+ blur_enabled &=
+ bs->opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
+ reflection_enabled &=
+ bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION].value.b
+ || bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b;
+
+ blur_enabled &= !(mask & PAINT_WINDOW_SOLID_MASK);
+
+ reflection_enabled &= !(mask & PAINT_WINDOW_SOLID_MASK);
+ reflection_enabled &= bs->modTex.handle > 0;
+
+ if (bs->
+ opt[BLURFX_SCREEN_OPTION_MOTION_BLUR_ON_TRANSFORMED_SCREEN].
+ value.b && (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK))
+ {
+ bs->motion_blur_active = bs->mblur_supported;
+ bs->mb_timer = 500;
+ }
+
+ if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].value.b)
+ blur_enabled &= !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
+ if (!bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN].value.b)
+ reflection_enabled &=
+ !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
+
+ if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW].value.b)
+ blur_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
+ if (!bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW].value.b)
+ reflection_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
+
+ for (i = 0;
+ i <
+ bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ blur_enabled &=
+ !screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ for (i = 0;
+ i <
+ bs->
+ opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ reflection_enabled &=
+ !screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ Bool splash = IPCS_GetBoolND (IPCS_OBJECT (s), "SPLASH_IS_ACTIVE", FALSE);
+
+ blur_enabled &= !DISABLE_FEATURE (s, bs->ipcs_disable_blur);
+ blur_enabled &= !DISABLE_FEATURE (w, bw->ipcs_disable_blur);
+ blur_enabled &= !splash;
+
+ reflection_enabled &= !DISABLE_FEATURE (s, bs->ipcs_disable_reflection);
+ reflection_enabled &= !DISABLE_FEATURE (w, bw->ipcs_disable_reflection);
+ reflection_enabled &= !splash;
+
+
+ // check for restacking and update damage if needed
+ if (w->next != bw->my_next)
+ {
+ XRectangle rect;
+
+ rect.x = WIN_X (w) - 7;
+ rect.y = WIN_Y (w) - 7;
+ rect.width = WIN_W (w) + 14;
+ rect.height = WIN_H (w) + 14;
+
+ XUnionRectWithRegion (&rect, bs->screenDamage, bs->screenDamage);
+ bw->my_next = w->next;
+ }
+
+ if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].value.b)
+ XUnionRegion (bw->texDamage, bs->screenDamage, bw->texDamage);
+
+ bw->mvm_updated = FALSE;
+
+ if (blur_enabled || reflection_enabled)
+ {
+
+ // clear our decoration vertex array
+ bw->decoArray.vCount = 0;
+ bw->decoArray.indexSize = 0;
+ bw->decoArray.indexCount = 0;
+
+ // store region we need to paint
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->paintRegion);
+ XIntersectRegion (bs->realPaintRegion, region, bw->paintRegion);
+ bw->texUpdated = FALSE;
+
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (),
+ bs->blurredRegion);
+
+ // paint blur and reflection
+
+ bs->mode = MODE_BLURREFLECTION;
+
+ bs->paintingSwitcher = bw->isSwitcher;
+
+ UNWRAP (bs, s, drawWindow);
+ status = (*s->drawWindow) (w, attrib, region, mask);
+ WRAP (bs, s, drawWindow, blurfxDrawWindow);
+
+ glColor4usv (defaultColor);
+ screenTexEnvMode (w->screen, GL_REPLACE);
+ glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ GLERR;
+
+ // paint window
+ bs->mode = MODE_NORMAL;
+ bs->was_transformed = FALSE;
+
+ UNWRAP (bs, s, drawWindow);
+ status = (*s->drawWindow) (w, attrib, region, mask);
+ WRAP (bs, s, drawWindow, blurfxDrawWindow);
+
+ }
+ else
+ {
+ // paint window
+ bs->mode = MODE_NORMAL;
+ bs->was_transformed = FALSE;
+
+ UNWRAP (bs, s, drawWindow);
+ status = (*s->drawWindow) (w, attrib, region, mask);
+ WRAP (bs, s, drawWindow, blurfxDrawWindow);
+
+ }
+
+ if (bs->was_transformed)
+ XUnionRegion (&s->outputDev[bs->output].region,
+ bs->screenDamage, bs->screenDamage);
+
+ if (!(mask & PAINT_WINDOW_SOLID_MASK) && !WINDOW_INPUT_INVISIBLE (w))
+ {
+
+ // not all plugins send damage events on move or scale
+ XRectangle rect;
+
+ if (bw->lastX != w->attrib.x || bw->lastY != w->attrib.y
+ || w->lastPaint.xScale != attrib->xScale
+ || w->lastPaint.yScale != attrib->yScale)
+ {
+ rect.x = bw->lastPAttrib.xTranslate +
+ (-w->output.left * bw->lastPAttrib.xScale) + bw->lastX;
+ rect.y =
+ bw->lastPAttrib.yTranslate +
+ (-w->output.top * bw->lastPAttrib.yScale) + bw->lastY;
+ rect.width = WIN_W (w) * bw->lastPAttrib.xScale;
+ rect.height = WIN_H (w) * bw->lastPAttrib.yScale;
+ XUnionRectWithRegion (&rect, bs->screenDamage, bs->screenDamage);
+ rect.x =
+ attrib->xTranslate +
+ (-w->output.left * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (-w->output.top * attrib->yScale) + w->attrib.x;
+ rect.width = WIN_W (w) * attrib->xScale;
+ rect.height = WIN_H (w) * attrib->yScale;
+ XUnionRectWithRegion (&rect, bs->screenDamage, bs->screenDamage);
+ }
+ bw->lastX = w->attrib.x;
+ bw->lastY = w->attrib.y;
+
+ if (bw->lastPAttrib.xScale != 1.0 || bw->lastPAttrib.yScale != 1.0)
+ {
+ for (i = 0; i < bw->damageRegion->numRects; i++)
+ {
+ BOX box = bw->damageRegion->rects[i];
+ rect.x = bw->lastPAttrib.xTranslate +
+ (box.x1 - w->attrib.x) * bw->lastPAttrib.xScale;
+ rect.y =
+ bw->lastPAttrib.yTranslate + (box.y1 -
+ w->
+ attrib.
+ y) * bw->lastPAttrib.yScale;
+ rect.width = (box.x2 - box.x1) * bw->lastPAttrib.xScale;
+ rect.height = (box.y2 - box.y1) * bw->lastPAttrib.yScale;
+ XUnionRectWithRegion (&rect,
+ bs->screenDamage, bs->screenDamage);
+ }
+ }
+ else
+ {
+ XUnionRegion (bw->damageRegion, bs->screenDamage,
+ bs->screenDamage);
+ }
+ bw->lastPAttrib = *attrib;
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->damageRegion);
+ }
+
+ return status;
}
static void
-blurfxDrawWindowTexture(CompWindow * w, CompTexture * texture,
- const WindowPaintAttrib * attrib,
- unsigned int mask)
+blurfxDrawWindowTexture (CompWindow * w, CompTexture * texture,
+ const WindowPaintAttrib * attrib, unsigned int mask)
{
- CompScreen *s = w->screen;
- Bool blur_enabled, reflection_enabled;
- int i;
-
-
- BLURFX_SCREEN(w->screen);
- BLURFX_WINDOW(w);
-
- // enable blur and/or reflection
- blur_enabled = bs->blur_supported;
- reflection_enabled = bs->reflection_supported;
-
- blur_enabled &=
- (mask & PAINT_WINDOW_DECORATION_MASK) ? bs->
- opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b : bs->
- opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
- reflection_enabled &=
- (mask & PAINT_WINDOW_DECORATION_MASK) ? bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION].value.b : bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b;
-
- if ((mask & PAINT_WINDOW_DECORATION_MASK) && w->input.top == 0
- && w->input.bottom == 0 && w->input.left == 0
- && w->input.right == 0) {
- if (!bw->isSwitcher) {
- blur_enabled = FALSE;
- reflection_enabled = FALSE;
- }
- }
-
- if (!(mask & PAINT_WINDOW_DECORATION_MASK)) {
- blur_enabled &= !(bs->noBlurWMask & w->type);
- reflection_enabled &= !(bs->noReflectionWMask & w->type);
- blur_enabled &= w->alpha || attrib->opacity < OPAQUE;
- reflection_enabled &= w->alpha || attrib->opacity < OPAQUE;
- }
-
- reflection_enabled &= bs->modTex.handle > 0;
-
- if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].
- value.b)
- blur_enabled &=
- !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
- if (!bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN].
- value.b)
- reflection_enabled &=
- !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
-
- if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW].value.b)
- blur_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
- if (!bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW].
- value.b)
- reflection_enabled &=
- !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
-
- for (i = 0;
- i <
- bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- blur_enabled &=
- !screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- for (i = 0;
- i <
- bs->
- opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
- value.list.nValue; i++) {
- reflection_enabled &=
- !screenGrabExist(s,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
- value.list.value[i].s, 0);
- }
-
- Bool splash =
- IPCS_GetBoolND(IPCS_OBJECT(s), "SPLASH_IS_ACTIVE", FALSE);
-
- blur_enabled &= !DISABLE_FEATURE(s, bs->ipcs_disable_blur);
- blur_enabled &= !DISABLE_FEATURE(w, bw->ipcs_disable_blur);
- blur_enabled &= !splash;
-
- reflection_enabled &=
- !DISABLE_FEATURE(s, bs->ipcs_disable_reflection);
- reflection_enabled &=
- !DISABLE_FEATURE(w, bw->ipcs_disable_reflection);
- reflection_enabled &= !splash;
-
- // add window region to occlusion region
- if (bs->mode == MODE_OCCLUSION) {
- if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK))
- return;
- if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
- return;
- if (mask & PAINT_WINDOW_DECORATION_MASK)
- return;
- if (mask & PAINT_WINDOW_TRANSLUCENT_MASK)
- return;
- if (WINDOW_INPUT_INVISIBLE(w))
- return;
- XUnionRegion(w->region, bs->occlusion, bs->occlusion);
- return;
- }
- // draw normal window
- if (bs->mode == MODE_NORMAL) {
- GLERR;
- UNWRAP(bs, w->screen, drawWindowTexture);
- (*w->screen->drawWindowTexture) (w, texture, attrib, mask);
- WRAP(bs, w->screen, drawWindowTexture,
- blurfxDrawWindowTexture);
+ CompScreen *s = w->screen;
+ Bool blur_enabled, reflection_enabled;
+ int i;
+
+
+ BLURFX_SCREEN (w->screen);
+ BLURFX_WINDOW (w);
+
+ // enable blur and/or reflection
+ blur_enabled = bs->blur_supported;
+ reflection_enabled = bs->reflection_supported;
+
+ blur_enabled &=
+ (mask & PAINT_WINDOW_DECORATION_MASK) ? bs->
+ opt[BLURFX_SCREEN_OPTION_BLUR_DECORATION].value.b : bs->
+ opt[BLURFX_SCREEN_OPTION_BLUR_WINDOWS].value.b;
+ reflection_enabled &=
+ (mask & PAINT_WINDOW_DECORATION_MASK) ? bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_DECORATION].value.b : bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_WINDOWS].value.b;
+
+ if ((mask & PAINT_WINDOW_DECORATION_MASK) && w->input.top == 0
+ && w->input.bottom == 0 && w->input.left == 0 && w->input.right == 0)
+ {
+ if (!bw->isSwitcher)
+ {
+ blur_enabled = FALSE;
+ reflection_enabled = FALSE;
+ }
+ }
+
+ if (!(mask & PAINT_WINDOW_DECORATION_MASK))
+ {
+ blur_enabled &= !(bs->noBlurWMask & w->type);
+ reflection_enabled &= !(bs->noReflectionWMask & w->type);
+ blur_enabled &= w->alpha || attrib->opacity < OPAQUE;
+ reflection_enabled &= w->alpha || attrib->opacity < OPAQUE;
+ }
+
+ reflection_enabled &= bs->modTex.handle > 0;
+
+ if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_ON_TRANSFORMED_SCREEN].value.b)
+ blur_enabled &= !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
+ if (!bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_ON_TRANSFORMED_SCREEN].value.b)
+ reflection_enabled &=
+ !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK);
+
+ if (!bs->opt[BLURFX_SCREEN_OPTION_BLUR_TRANSFORMED_WINDOW].value.b)
+ blur_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
+ if (!bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_TRANSFORMED_WINDOW].value.b)
+ reflection_enabled &= !(mask & PAINT_WINDOW_TRANSFORMED_MASK);
+
+ for (i = 0;
+ i <
+ bs->opt[BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ blur_enabled &=
+ !screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_DISABLE_BLUR_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ for (i = 0;
+ i <
+ bs->
+ opt[BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
+ value.list.nValue; i++)
+ {
+ reflection_enabled &=
+ !screenGrabExist (s,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_DISABLE_REFLECTION_ON_SCREENGRAB_OF].
+ value.list.value[i].s, 0);
+ }
+
+ Bool splash = IPCS_GetBoolND (IPCS_OBJECT (s), "SPLASH_IS_ACTIVE", FALSE);
+
+ blur_enabled &= !DISABLE_FEATURE (s, bs->ipcs_disable_blur);
+ blur_enabled &= !DISABLE_FEATURE (w, bw->ipcs_disable_blur);
+ blur_enabled &= !splash;
+
+ reflection_enabled &= !DISABLE_FEATURE (s, bs->ipcs_disable_reflection);
+ reflection_enabled &= !DISABLE_FEATURE (w, bw->ipcs_disable_reflection);
+ reflection_enabled &= !splash;
+
+ // add window region to occlusion region
+ if (bs->mode == MODE_OCCLUSION)
+ {
+ if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ return;
+ if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
+ return;
+ if (mask & PAINT_WINDOW_DECORATION_MASK)
+ return;
+ if (mask & PAINT_WINDOW_TRANSLUCENT_MASK)
+ return;
+ if (WINDOW_INPUT_INVISIBLE (w))
+ return;
+ XUnionRegion (w->region, bs->occlusion, bs->occlusion);
+ return;
+ }
+ // draw normal window
+ if (bs->mode == MODE_NORMAL)
+ {
+ GLERR;
+ UNWRAP (bs, w->screen, drawWindowTexture);
+ (*w->screen->drawWindowTexture) (w, texture, attrib, mask);
+ WRAP (bs, w->screen, drawWindowTexture, blurfxDrawWindowTexture);
#ifdef GL_DEBUG
- glGetError();
+ glGetError ();
#endif
- bs->was_transformed |=
- (mask & PAINT_WINDOW_TRANSFORMED_MASK);
- return;
- }
-
- if (!(mask & PAINT_WINDOW_TRANSLUCENT_MASK)
- || bs->mode != MODE_BLURREFLECTION
- || (mask & PAINT_WINDOW_SHADOW_MASK))
- return;
-
- if (WINDOW_INPUT_INVISIBLE(w)
- && !(w->shaded && (mask & PAINT_WINDOW_DECORATION_MASK)))
- return;
-
- if (bs->paintingSwitcher && !bw->isSwitcher)
- return;
-
- int filter;
-
- Bool useFbo = bs->fboActive
- && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b;
-
- // select texture filter
- if (mask &
- (PAINT_WINDOW_TRANSFORMED_MASK |
- PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) && useFbo)
- filter = COMP_TEXTURE_FILTER_FAST;
- else
- filter = COMP_TEXTURE_FILTER_GOOD;
-
- // draw blur
- if (blur_enabled) {
- Bool enable_stencil = FALSE;
- Bool enable_scissor = FALSE;
- if (useFbo) {
- if (glIsEnabled(GL_STENCIL_TEST)) {
- glDisable(GL_STENCIL_TEST);
- enable_stencil = TRUE;
- }
- if (glIsEnabled(GL_SCISSOR_TEST)) {
- glDisable(GL_SCISSOR_TEST);
- enable_scissor = TRUE;
- }
-
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, 0);
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_STENCIL_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, 0);
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
- bs->downSample = 1.0;
- } else {
- bs->downSample =
- bs->
- opt
- [BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH].
- value.i;
- }
- if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].
- value.b) {
- // update blur cache texture
- bw->texUpdated = TRUE;
- updateBlurTextureSize(w, s, attrib, mask);
- GLERR;
- if (useFbo) {
- updateBlurTexture(w, s, attrib, mask,
- filter);
- GLERR;
- } else {
- updateBlurTextureNoFBO(w, s, attrib, mask);
- GLERR;
- }
- }
- if (useFbo) {
- updateBlur(w, s, attrib, mask, filter);
- GLERR;
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, bs->rb);
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT,
- bs->rb);
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_STENCIL_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT,
- bs->rb);
- if (enable_stencil)
- glEnable(GL_STENCIL_TEST);
- if (enable_scissor)
- glEnable(GL_SCISSOR_TEST);
- } else {
- updateBlurNoFBO(w, s, attrib, mask);
- GLERR;
- }
- drawBlur(w, s, texture, attrib, mask, filter);
- }
-
- // draw reflection
- if (reflection_enabled)
- drawReflection(w, s, texture, attrib, mask,
- COMP_TEXTURE_FILTER_GOOD);
+ bs->was_transformed |= (mask & PAINT_WINDOW_TRANSFORMED_MASK);
+ return;
+ }
+
+ if (!(mask & PAINT_WINDOW_TRANSLUCENT_MASK)
+ || bs->mode != MODE_BLURREFLECTION
+ || (mask & PAINT_WINDOW_SHADOW_MASK))
+ return;
+
+ if (WINDOW_INPUT_INVISIBLE (w)
+ && !(w->shaded && (mask & PAINT_WINDOW_DECORATION_MASK)))
+ return;
+
+ if (bs->paintingSwitcher && !bw->isSwitcher)
+ return;
+
+ int filter;
+
+ Bool useFbo = bs->fboActive
+ && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b;
+
+ // select texture filter
+ if (mask &
+ (PAINT_WINDOW_TRANSFORMED_MASK |
+ PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) && useFbo)
+ filter = COMP_TEXTURE_FILTER_FAST;
+ else
+ filter = COMP_TEXTURE_FILTER_GOOD;
+
+ // draw blur
+ if (blur_enabled)
+ {
+ Bool enable_stencil = FALSE;
+ Bool enable_scissor = FALSE;
+ if (useFbo)
+ {
+ if (glIsEnabled (GL_STENCIL_TEST))
+ {
+ glDisable (GL_STENCIL_TEST);
+ enable_stencil = TRUE;
+ }
+ if (glIsEnabled (GL_SCISSOR_TEST))
+ {
+ glDisable (GL_SCISSOR_TEST);
+ enable_scissor = TRUE;
+ }
+
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, 0);
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, 0);
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, 0);
+ bs->downSample = 1.0;
+ }
+ else
+ {
+ bs->downSample =
+ bs->opt[BLURFX_SCREEN_OPTION_NON_FBO_BLUR_STRENGTH].value.i;
+ }
+ if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].value.b)
+ {
+ // update blur cache texture
+ bw->texUpdated = TRUE;
+ updateBlurTextureSize (w, s, attrib, mask);
+ GLERR;
+ if (useFbo)
+ {
+ updateBlurTexture (w, s, attrib, mask, filter);
+ GLERR;
+ }
+ else
+ {
+ updateBlurTextureNoFBO (w, s, attrib, mask);
+ GLERR;
+ }
+ }
+ if (useFbo)
+ {
+ updateBlur (w, s, attrib, mask, filter);
+ GLERR;
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, bs->rb);
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, bs->rb);
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, bs->rb);
+ if (enable_stencil)
+ glEnable (GL_STENCIL_TEST);
+ if (enable_scissor)
+ glEnable (GL_SCISSOR_TEST);
+ }
+ else
+ {
+ updateBlurNoFBO (w, s, attrib, mask);
+ GLERR;
+ }
+ drawBlur (w, s, texture, attrib, mask, filter);
+ }
+
+ // draw reflection
+ if (reflection_enabled)
+ drawReflection (w, s, texture, attrib, mask,
+ COMP_TEXTURE_FILTER_GOOD);
}
static void
-blurfxAddWindowGeometry(CompWindow * w, CompMatrix * m, int nM,
- Region region, Region clip)
+blurfxAddWindowGeometry (CompWindow * w, CompMatrix * m, int nM,
+ Region region, Region clip)
{
- BLURFX_SCREEN(w->screen);
- BLURFX_WINDOW(w);
- REGION box;
-
- if (bs->mode == MODE_OCCLUSION)
- return;
-
-
- // try to detect decorations
- if (bs->mode == MODE_BLURREFLECTION && region->numRects == 1
- &&
- ((region->extents.x1 < w->attrib.x
- && region->extents.x2 <= w->attrib.x)
- || (region->extents.y1 < w->attrib.y
- && region->extents.y2 <= w->attrib.y)
- || (region->extents.x1 >= w->attrib.x + w->width
- && region->extents.x2 > w->attrib.x + w->width)
- || (region->extents.y1 >= w->attrib.y + w->height
- && region->extents.y2 > w->attrib.y + w->height))) {
- box.numRects = 1;
- // create vertex array without shadow
- box.rects = &box.extents;
- box.extents.x1 = MAX(region->extents.x1, WIN_XO(w));
- box.extents.y1 = MAX(region->extents.y1, WIN_YO(w));
- box.extents.x2 =
- MIN(region->extents.x2, WIN_XO(w) + WIN_WO(w));
- box.extents.y2 =
- MIN(region->extents.y2, WIN_YO(w) + WIN_HO(w));
- if (box.extents.x1 < box.extents.x2
- && box.extents.y1 < box.extents.y2) {
- CompWindow *cw = malloc(sizeof(CompWindow));
- memcpy(cw, w, sizeof(CompWindow));
- cw->vertexSize = bw->decoArray.vertexSize;
- cw->indexSize = bw->decoArray.indexSize;
- cw->vertices = bw->decoArray.vertices;
- cw->indices = bw->decoArray.indices;
- cw->vCount = bw->decoArray.vCount;
- cw->indexCount = bw->decoArray.indexCount;
- UNWRAP(bs, w->screen, addWindowGeometry);
- (*w->screen->addWindowGeometry) (cw, m, nM, &box,
- clip);
- WRAP(bs, w->screen, addWindowGeometry,
- blurfxAddWindowGeometry);
- bw->decoArray.vertexSize = cw->vertexSize;
- bw->decoArray.indexSize = cw->indexSize;
- bw->decoArray.vertices = cw->vertices;
- bw->decoArray.indices = cw->indices;
- bw->decoArray.vCount = cw->vCount;
- bw->decoArray.indexCount = cw->indexCount;
- free(cw);
- }
- }
-
- UNWRAP(bs, w->screen, addWindowGeometry);
- (*w->screen->addWindowGeometry) (w, m, nM, region, clip);
- WRAP(bs, w->screen, addWindowGeometry, blurfxAddWindowGeometry);
+ BLURFX_SCREEN (w->screen);
+ BLURFX_WINDOW (w);
+ REGION box;
+
+ if (bs->mode == MODE_OCCLUSION)
+ return;
+
+
+ // try to detect decorations
+ if (bs->mode == MODE_BLURREFLECTION && region->numRects == 1
+ &&
+ ((region->extents.x1 < w->attrib.x
+ && region->extents.x2 <= w->attrib.x)
+ || (region->extents.y1 < w->attrib.y
+ && region->extents.y2 <= w->attrib.y)
+ || (region->extents.x1 >= w->attrib.x + w->width
+ && region->extents.x2 > w->attrib.x + w->width)
+ || (region->extents.y1 >= w->attrib.y + w->height
+ && region->extents.y2 > w->attrib.y + w->height)))
+ {
+ box.numRects = 1;
+ // create vertex array without shadow
+ box.rects = &box.extents;
+ box.extents.x1 = MAX (region->extents.x1, WIN_XO (w));
+ box.extents.y1 = MAX (region->extents.y1, WIN_YO (w));
+ box.extents.x2 = MIN (region->extents.x2, WIN_XO (w) + WIN_WO (w));
+ box.extents.y2 = MIN (region->extents.y2, WIN_YO (w) + WIN_HO (w));
+ if (box.extents.x1 < box.extents.x2
+ && box.extents.y1 < box.extents.y2)
+ {
+ CompWindow *cw = malloc (sizeof (CompWindow));
+ memcpy (cw, w, sizeof (CompWindow));
+ cw->vertexSize = bw->decoArray.vertexSize;
+ cw->indexSize = bw->decoArray.indexSize;
+ cw->vertices = bw->decoArray.vertices;
+ cw->indices = bw->decoArray.indices;
+ cw->vCount = bw->decoArray.vCount;
+ cw->indexCount = bw->decoArray.indexCount;
+ UNWRAP (bs, w->screen, addWindowGeometry);
+ (*w->screen->addWindowGeometry) (cw, m, nM, &box, clip);
+ WRAP (bs, w->screen, addWindowGeometry, blurfxAddWindowGeometry);
+ bw->decoArray.vertexSize = cw->vertexSize;
+ bw->decoArray.indexSize = cw->indexSize;
+ bw->decoArray.vertices = cw->vertices;
+ bw->decoArray.indices = cw->indices;
+ bw->decoArray.vCount = cw->vCount;
+ bw->decoArray.indexCount = cw->indexCount;
+ free (cw);
+ }
+ }
+
+ UNWRAP (bs, w->screen, addWindowGeometry);
+ (*w->screen->addWindowGeometry) (w, m, nM, region, clip);
+ WRAP (bs, w->screen, addWindowGeometry, blurfxAddWindowGeometry);
}
static Bool
-blurfxDamageWindowRect(CompWindow * w, Bool initial, BoxPtr box)
+blurfxDamageWindowRect (CompWindow * w, Bool initial, BoxPtr box)
{
- Bool status;
+ Bool status;
- BLURFX_SCREEN(w->screen);
- BLURFX_WINDOW(w);
+ BLURFX_SCREEN (w->screen);
+ BLURFX_WINDOW (w);
- XRectangle rect;
+ XRectangle rect;
- // a bigger damage region is needed to have correct blur
- box->x1 -= 7;
- box->x2 += 7;
- box->y1 -= 7;
- box->y2 += 7;
+ // a bigger damage region is needed to have correct blur
+ box->x1 -= 7;
+ box->x2 += 7;
+ box->y1 -= 7;
+ box->y2 += 7;
- rect.x = w->serverX + box->x1;
- rect.y = w->serverY + box->y1;
- rect.width = box->x2 - box->x1;
- rect.height = box->y2 - box->y1;
+ rect.x = w->serverX + box->x1;
+ rect.y = w->serverY + box->y1;
+ rect.width = box->x2 - box->x1;
+ rect.height = box->y2 - box->y1;
- // store window damage
- if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].value.b)
- XUnionRectWithRegion(&rect, bw->damageRegion,
- bw->damageRegion);
+ // store window damage
+ if (bs->opt[BLURFX_SCREEN_OPTION_BLUR_CACHE_TEXTURES].value.b)
+ XUnionRectWithRegion (&rect, bw->damageRegion, bw->damageRegion);
- UNWRAP(bs, w->screen, damageWindowRect);
- status = (*w->screen->damageWindowRect) (w, initial, box);
- WRAP(bs, w->screen, damageWindowRect, blurfxDamageWindowRect);
+ UNWRAP (bs, w->screen, damageWindowRect);
+ status = (*w->screen->damageWindowRect) (w, initial, box);
+ WRAP (bs, w->screen, damageWindowRect, blurfxDamageWindowRect);
- return status;
+ return status;
}
static void
-updateBlurTexture(CompWindow * w, CompScreen * s,
- const WindowPaintAttrib * attrib, unsigned int mask,
- CompTextureFilter filter)
+updateBlurTexture (CompWindow * w, CompScreen * s,
+ const WindowPaintAttrib * attrib, unsigned int mask,
+ CompTextureFilter filter)
{
- Region reblurRegion;
- Region blurPaintRegion;
- int stride, count, stop, vCount, iCount;
- CompMatrix mat;
- GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1,
- by2;
- GLushort *indices;
- XRectangle rect;
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- if (bw->bc_x != s->x || bw->bc_y != s->y) {
- bw->texUpdated = FALSE;
- return;
- }
-
- if (bs->
- opt[BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN].
- value.b && mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) {
- bw->texUpdated = FALSE;
- return;
- }
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
- stride = (w->texUnits * w->texCoordSize) + 2;
-
- // get regions we need not to update
- reblurRegion = XCreateRegion();
- blurPaintRegion = XCreateRegion();
-
- count = 0;
- stop = (iCount) ? iCount : vCount;
-
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
-
- // generate region that needs blur
- while (count < stop) {
- if (iCount) {
- x1 = vertices[indices[count] * stride];
- y1 = vertices[(indices[count] * stride) + 1];
- count++;
- x2 = vertices[indices[count] * stride];
- y2 = vertices[(indices[count] * stride) + 1];
- count++;
- x3 = vertices[indices[count] * stride];
- y3 = vertices[(indices[count] * stride) + 1];
- count++;
- x4 = vertices[indices[count] * stride];
- y4 = vertices[(indices[count] * stride) + 1];
- count++;
-
- } else {
- x1 = vertices[0];
- y1 = vertices[1];
- vertices += stride;
- x2 = vertices[0];
- y2 = vertices[1];
- vertices += stride;
- x3 = vertices[0];
- y3 = vertices[1];
- vertices += stride;
- x4 = vertices[0];
- y4 = vertices[1];
- vertices += stride;
- count += 4;
- }
-
- if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
- }
-
- bx1 = MIN(bx1, x1);
- bx2 = MAX(bx2, x1);
- bx1 = MIN(bx1, x2);
- bx2 = MAX(bx2, x2);
- bx1 = MIN(bx1, x3);
- bx2 = MAX(bx2, x3);
- bx1 = MIN(bx1, x4);
- bx2 = MAX(bx2, x4);
-
- by1 = MIN(by1, y1);
- by2 = MAX(by2, y1);
- by1 = MIN(by1, y2);
- by2 = MAX(by2, y2);
- by1 = MIN(by1, y3);
- by2 = MAX(by2, y3);
- by1 = MIN(by1, y4);
- by2 = MAX(by2, y4);
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && !(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion,
- reblurRegion);
- }
- }
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && (mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion, reblurRegion);
- }
-
- XIntersectRegion(reblurRegion, bw->bTexRegion, blurPaintRegion);
-
- // get regions we need to update
- XIntersectRegion(reblurRegion, bw->paintRegion, reblurRegion);
- XIntersectRegion(reblurRegion, bw->texDamage, reblurRegion);
- XIntersectRegion(reblurRegion, bw->bTexRegion, reblurRegion);
-
- XIntersectRegion(reblurRegion, &s->outputDev[bs->output].region,
- reblurRegion);
-
- // subtract occluded region
- if (bs->od_active)
- XSubtractRegion(reblurRegion, bw->clip, reblurRegion);
-
-
- stride = 4 * sizeof(GLfloat);
-
- if (screenGrabExist(s, "switcher", 0) || bw->isSwitcher) {
- bw->texUpdated = FALSE;
- XDestroyRegion(reblurRegion);
- XDestroyRegion(blurPaintRegion);
- return;
- }
-
- if (reblurRegion->numRects) {
-
- if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK) {
-
- float bm[16] =
- { s->outputDev[bs->output].width / 2.0, 0, 0,
- 0,
- 0, s->outputDev[bs->output].height / 2.0,
- 0, 0,
- 0, 0, 1, 0,
- s->outputDev[bs->output].width / 2.0 +
- s->outputDev[bs->output].region.
- extents.x1,
- s->outputDev[bs->output].height / 2.0 +
- s->height -
- s->outputDev[bs->output].region.
- extents.y2, 1, 1
- };
- float bpm[16];
- float tm[16];
- if (!bw->mvm_updated) {
- bw->mvm_updated = TRUE;
- glGetFloatv(GL_MODELVIEW_MATRIX, bw->mvm);
- }
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, bw->mvm, tm);
-
- XRectangle rect, outputRect;
- XClipBox(reblurRegion, &rect);
-
- // check region for visibility
- float bbProj[4][2];
-
- bbProj[0][0] =
- rect.x * tm[0] + rect.y * tm[4] + tm[12];
- bbProj[0][0] /= rect.x * tm[3] + rect.y * tm[7] +
- tm[15];
- bbProj[0][1] =
- rect.x * tm[1] + rect.y * tm[5] + tm[13];
- bbProj[0][1] /= rect.x * tm[3] + rect.y * tm[7] +
- tm[15];
- bbProj[1][0] =
- (rect.x + rect.width) * tm[0] +
- rect.y * tm[4] + tm[12];
- bbProj[1][0] /= (rect.x + rect.width) * tm[3] +
- rect.y * tm[7] + tm[15];
- bbProj[1][1] =
- (rect.x + rect.width) * tm[1] +
- rect.y * tm[5] + tm[13];
- bbProj[1][1] /= (rect.x + rect.width) * tm[3] +
- rect.y * tm[7] + tm[15];
- bbProj[2][0] =
- rect.x * tm[0] + (rect.y +
- rect.height) * tm[4] +
- tm[12];
- bbProj[2][0] /= rect.x * tm[3] + (rect.y +
- rect.height) *
- tm[7] + tm[15];
- bbProj[2][1] =
- rect.x * tm[1] + (rect.y +
- rect.height) * tm[5] +
- tm[13];
- bbProj[2][1] /= rect.x * tm[3] + (rect.y +
- rect.height) *
- tm[7] + tm[15];
- bbProj[3][0] =
- (rect.x + rect.width) * tm[0] + (rect.y +
- rect.height) *
- tm[4] + tm[12];
- bbProj[3][0] /= (rect.x + rect.width) * tm[3] +
- (rect.y + rect.height) * tm[7] + tm[15];
- bbProj[3][1] =
- (rect.x + rect.width) * tm[1] + (rect.y +
- rect.height) *
- tm[5] + tm[13];
- bbProj[3][1] /= (rect.x + rect.width) * tm[3] +
- (rect.y + rect.height) * tm[7] + tm[15];
-
- screenGetOutputDevRect(s, bs->output + 1,
- &outputRect);
- int s_x1 = outputRect.x;
- int s_y1 = outputRect.y;
- int s_x2 = s_x1 + outputRect.width;
- int s_y2 = s_y1 + outputRect.height;
-
- if (bbProj[0][0] >= bbProj[1][0]
- || bbProj[2][0] >= bbProj[3][0]
- || bbProj[2][1] >= bbProj[0][1]
- || bbProj[3][1] >= bbProj[1][1]
- || bbProj[1][0] - bbProj[0][0] <
- rect.width * 0.5
- || bbProj[3][0] - bbProj[2][0] <
- rect.width * 0.5
- || bbProj[0][1] - bbProj[2][1] <
- rect.height * 0.5
- || bbProj[1][1] - bbProj[3][1] <
- rect.height * 0.5 || bbProj[0][0] < s_x1
- || bbProj[1][0] > s_x2 || bbProj[2][0] < s_x1
- || bbProj[3][0] > s_x2 || bbProj[0][1] < s_y1
- || bbProj[2][1] > s_y2 || bbProj[1][1] < s_y1
- || bbProj[3][1] > s_y2) {
- XDestroyRegion(reblurRegion);
- XDestroyRegion(blurPaintRegion);
-
- bw->texUpdated = FALSE;
- return;
- }
- // enable projective texture coordinate generation
- float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
- float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
- float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
- float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGenfv(GL_R, GL_OBJECT_PLANE, r_gen);
- glTexGenfv(GL_Q, GL_OBJECT_PLANE, q_gen);
-
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
- glTexGeni(GL_R, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
- glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
-
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glEnable(GL_TEXTURE_GEN_R);
- glEnable(GL_TEXTURE_GEN_Q);
- } else {
-
- // enable texture coordinate generation
- float s_gen[4] = { 1.0, 0.0, 0.0, 0.0 };
- float t_gen[4] = { 0.0, -1.0, 0.0, s->height };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,
- GL_OBJECT_LINEAR);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- }
-
- // draw vertically blured region into temprorary texture
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->blurTempTexV.handle, 0);
- GLERR;
-
- // bind vertival blur shader
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB,
- bs->blurShaderV);
-
- // bind unblurred background
- enableBlurfxTexture(&bs->backTex, filter);
-
- mat.xx = 1.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = -1.0;
- mat.x0 = 0.0;
- mat.y0 = bs->backTex.height;
-
- genGeometry(&bw->vertArray, mat, 7, reblurRegion);
- glVertexPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices + 2);
- glTexCoordPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices);
-
- glDrawArrays(GL_QUADS, 0, bw->vertArray.vCount);
-
- // draw vertically blured region into blur cache texture
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bw->blurTex.handle, 0);
- GLERR;
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glDepthRange(0, 1);
- glViewport(-1, -1, 2, 2);
- glRasterPos2f(0, 0);
- glViewport(0, 0, bw->blurTex.width, bw->blurTex.height);
-
- glTranslatef(-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
- glScalef(1.0f / bw->blurTex.width,
- -1.0f / bw->blurTex.height, 1.0f);
- glTranslatef(0.0f, -bw->blurTex.height, 0.0f);
-
-
- // bind horizontal blur shader
- (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB,
- bs->blurShaderH);
-
- // bind temprorary texture
- switchBlurfxTexture(&bs->backTex, &bs->blurTempTexV,
- filter);
-
- glTranslated(-bw->blurTex.x, -bw->blurTex.y, 0);
-
- genGeometry(&bw->vertArray, mat, 0, reblurRegion);
- glVertexPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices + 2);
- glTexCoordPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices);
-
- glDrawArrays(GL_QUADS, 0, bw->vertArray.vCount);
- GLERR;
-
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->backTex.handle, 0);
- GLERR;
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glDepthRange(0, 1);
- glViewport(-1, -1, 2, 2);
- glRasterPos2f(0, 0);
- s->rasterX = s->rasterY = 0;
- glViewport(s->outputDev[bs->output].region.extents.x1,
- s->height -
- s->outputDev[bs->output].region.extents.y2,
- s->outputDev[bs->output].width,
- s->outputDev[bs->output].height);
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
- disableBlurfxTexture(&bs->blurTempTexV);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_R);
- glDisable(GL_TEXTURE_GEN_Q);
-
- // remove reblurred regions from blur cache texture damage
- XSubtractRegion(bw->texDamage, reblurRegion,
- bw->texDamage);
-
- }
- // if the screen is transformed draw blur cache texture into temporary blur texture because there could be some regions we still need a blur for
- if (blurPaintRegion->numRects
- && (mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
-
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->blurTempTexH.handle, 0);
- GLERR;
-
- mat.xx = 1.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = -1.0;
- mat.x0 = -bw->blurTex.x;
- mat.y0 = bw->blurTex.height + bw->blurTex.y;
-
- genGeometry(&bw->vertArray, mat, 0, blurPaintRegion);
- glVertexPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices + 2);
- glTexCoordPointer(2, GL_FLOAT, stride,
- bw->vertArray.vertices);
-
- enableBlurfxTexture(&bw->blurTex, filter);
-
- glDrawArrays(GL_QUADS, 0, bw->vertArray.vCount);
- GLERR;
-
- disableBlurfxTexture(&bw->blurTex);
-
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->backTex.handle, 0);
- GLERR;
- }
- // cleanup
- XDestroyRegion(reblurRegion);
- XDestroyRegion(blurPaintRegion);
+ Region reblurRegion;
+ Region blurPaintRegion;
+ int stride, count, stop, vCount, iCount;
+ CompMatrix mat;
+ GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1, by2;
+ GLushort *indices;
+ XRectangle rect;
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ if (bw->bc_x != s->x || bw->bc_y != s->y)
+ {
+ bw->texUpdated = FALSE;
+ return;
+ }
+
+ if (bs->
+ opt[BLURFX_SCREEN_OPTION_NO_BLUR_CACHE_ON_TRANSFORMED_SCREEN].
+ value.b && mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)
+ {
+ bw->texUpdated = FALSE;
+ return;
+ }
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
+ {
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
+ }
+
+ if (vCount <= 0)
+ return;
+ stride = (w->texUnits * w->texCoordSize) + 2;
+
+ // get regions we need not to update
+ reblurRegion = XCreateRegion ();
+ blurPaintRegion = XCreateRegion ();
+
+ count = 0;
+ stop = (iCount) ? iCount : vCount;
+
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+
+ // generate region that needs blur
+ while (count < stop)
+ {
+ if (iCount)
+ {
+ x1 = vertices[indices[count] * stride];
+ y1 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x2 = vertices[indices[count] * stride];
+ y2 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x3 = vertices[indices[count] * stride];
+ y3 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x4 = vertices[indices[count] * stride];
+ y4 = vertices[(indices[count] * stride) + 1];
+ count++;
+
+ }
+ else
+ {
+ x1 = vertices[0];
+ y1 = vertices[1];
+ vertices += stride;
+ x2 = vertices[0];
+ y2 = vertices[1];
+ vertices += stride;
+ x3 = vertices[0];
+ y3 = vertices[1];
+ vertices += stride;
+ x4 = vertices[0];
+ y4 = vertices[1];
+ vertices += stride;
+ count += 4;
+ }
+
+ if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+ }
+
+ bx1 = MIN (bx1, x1);
+ bx2 = MAX (bx2, x1);
+ bx1 = MIN (bx1, x2);
+ bx2 = MAX (bx2, x2);
+ bx1 = MIN (bx1, x3);
+ bx2 = MAX (bx2, x3);
+ bx1 = MIN (bx1, x4);
+ bx2 = MAX (bx2, x4);
+
+ by1 = MIN (by1, y1);
+ by2 = MAX (by2, y1);
+ by1 = MIN (by1, y2);
+ by2 = MAX (by2, y2);
+ by1 = MIN (by1, y3);
+ by2 = MAX (by2, y3);
+ by1 = MIN (by1, y4);
+ by2 = MAX (by2, y4);
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && !(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+ }
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && (mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+
+ XIntersectRegion (reblurRegion, bw->bTexRegion, blurPaintRegion);
+
+ // get regions we need to update
+ XIntersectRegion (reblurRegion, bw->paintRegion, reblurRegion);
+ XIntersectRegion (reblurRegion, bw->texDamage, reblurRegion);
+ XIntersectRegion (reblurRegion, bw->bTexRegion, reblurRegion);
+
+ XIntersectRegion (reblurRegion, &s->outputDev[bs->output].region,
+ reblurRegion);
+
+ // subtract occluded region
+ if (bs->od_active)
+ XSubtractRegion (reblurRegion, bw->clip, reblurRegion);
+
+
+ stride = 4 * sizeof (GLfloat);
+
+ if (screenGrabExist (s, "switcher", 0) || bw->isSwitcher)
+ {
+ bw->texUpdated = FALSE;
+ XDestroyRegion (reblurRegion);
+ XDestroyRegion (blurPaintRegion);
+ return;
+ }
+
+ if (reblurRegion->numRects)
+ {
+
+ if (mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)
+ {
+
+ float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0,
+ 0,
+ 0, s->outputDev[bs->output].height / 2.0,
+ 0, 0,
+ 0, 0, 1, 0,
+ s->outputDev[bs->output].width / 2.0 +
+ s->outputDev[bs->output].region.extents.x1,
+ s->outputDev[bs->output].height / 2.0 +
+ s->height -
+ s->outputDev[bs->output].region.extents.y2, 1, 1
+ };
+ float bpm[16];
+ float tm[16];
+ if (!bw->mvm_updated)
+ {
+ bw->mvm_updated = TRUE;
+ glGetFloatv (GL_MODELVIEW_MATRIX, bw->mvm);
+ }
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, bw->mvm, tm);
+
+ XRectangle rect, outputRect;
+ XClipBox (reblurRegion, &rect);
+
+ // check region for visibility
+ float bbProj[4][2];
+
+ bbProj[0][0] = rect.x * tm[0] + rect.y * tm[4] + tm[12];
+ bbProj[0][0] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
+ bbProj[0][1] = rect.x * tm[1] + rect.y * tm[5] + tm[13];
+ bbProj[0][1] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
+ bbProj[1][0] =
+ (rect.x + rect.width) * tm[0] + rect.y * tm[4] + tm[12];
+ bbProj[1][0] /= (rect.x + rect.width) * tm[3] +
+ rect.y * tm[7] + tm[15];
+ bbProj[1][1] =
+ (rect.x + rect.width) * tm[1] + rect.y * tm[5] + tm[13];
+ bbProj[1][1] /= (rect.x + rect.width) * tm[3] +
+ rect.y * tm[7] + tm[15];
+ bbProj[2][0] =
+ rect.x * tm[0] + (rect.y + rect.height) * tm[4] + tm[12];
+ bbProj[2][0] /= rect.x * tm[3] + (rect.y +
+ rect.height) * tm[7] + tm[15];
+ bbProj[2][1] =
+ rect.x * tm[1] + (rect.y + rect.height) * tm[5] + tm[13];
+ bbProj[2][1] /= rect.x * tm[3] + (rect.y +
+ rect.height) * tm[7] + tm[15];
+ bbProj[3][0] =
+ (rect.x + rect.width) * tm[0] + (rect.y +
+ rect.height) *
+ tm[4] + tm[12];
+ bbProj[3][0] /= (rect.x + rect.width) * tm[3] +
+ (rect.y + rect.height) * tm[7] + tm[15];
+ bbProj[3][1] =
+ (rect.x + rect.width) * tm[1] + (rect.y +
+ rect.height) *
+ tm[5] + tm[13];
+ bbProj[3][1] /= (rect.x + rect.width) * tm[3] +
+ (rect.y + rect.height) * tm[7] + tm[15];
+
+ screenGetOutputDevRect (s, bs->output + 1, &outputRect);
+ int s_x1 = outputRect.x;
+ int s_y1 = outputRect.y;
+ int s_x2 = s_x1 + outputRect.width;
+ int s_y2 = s_y1 + outputRect.height;
+
+ if (bbProj[0][0] >= bbProj[1][0]
+ || bbProj[2][0] >= bbProj[3][0]
+ || bbProj[2][1] >= bbProj[0][1]
+ || bbProj[3][1] >= bbProj[1][1]
+ || bbProj[1][0] - bbProj[0][0] <
+ rect.width * 0.5
+ || bbProj[3][0] - bbProj[2][0] <
+ rect.width * 0.5
+ || bbProj[0][1] - bbProj[2][1] <
+ rect.height * 0.5
+ || bbProj[1][1] - bbProj[3][1] <
+ rect.height * 0.5 || bbProj[0][0] < s_x1
+ || bbProj[1][0] > s_x2 || bbProj[2][0] < s_x1
+ || bbProj[3][0] > s_x2 || bbProj[0][1] < s_y1
+ || bbProj[2][1] > s_y2 || bbProj[1][1] < s_y1
+ || bbProj[3][1] > s_y2)
+ {
+ XDestroyRegion (reblurRegion);
+ XDestroyRegion (blurPaintRegion);
+
+ bw->texUpdated = FALSE;
+ return;
+ }
+ // enable projective texture coordinate generation
+ float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
+ float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
+ float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
+ float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGenfv (GL_R, GL_OBJECT_PLANE, r_gen);
+ glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen);
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glEnable (GL_TEXTURE_GEN_R);
+ glEnable (GL_TEXTURE_GEN_Q);
+ }
+ else
+ {
+
+ // enable texture coordinate generation
+ float s_gen[4] = { 1.0, 0.0, 0.0, 0.0 };
+ float t_gen[4] = { 0.0, -1.0, 0.0, s->height };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ }
+
+ // draw vertically blured region into temprorary texture
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->blurTempTexV.handle, 0);
+ GLERR;
+
+ // bind vertival blur shader
+ glEnable (GL_FRAGMENT_PROGRAM_ARB);
+ (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderV);
+
+ // bind unblurred background
+ enableBlurfxTexture (&bs->backTex, filter);
+
+ mat.xx = 1.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = -1.0;
+ mat.x0 = 0.0;
+ mat.y0 = bs->backTex.height;
+
+ genGeometry (&bw->vertArray, mat, 7, reblurRegion);
+ glVertexPointer (2, GL_FLOAT, stride, bw->vertArray.vertices + 2);
+ glTexCoordPointer (2, GL_FLOAT, stride, bw->vertArray.vertices);
+
+ glDrawArrays (GL_QUADS, 0, bw->vertArray.vCount);
+
+ // draw vertically blured region into blur cache texture
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bw->blurTex.handle, 0);
+ GLERR;
+
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glLoadIdentity ();
+ glDepthRange (0, 1);
+ glViewport (-1, -1, 2, 2);
+ glRasterPos2f (0, 0);
+ glViewport (0, 0, bw->blurTex.width, bw->blurTex.height);
+
+ glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
+ glScalef (1.0f / bw->blurTex.width, -1.0f / bw->blurTex.height, 1.0f);
+ glTranslatef (0.0f, -bw->blurTex.height, 0.0f);
+
+
+ // bind horizontal blur shader
+ (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderH);
+
+ // bind temprorary texture
+ switchBlurfxTexture (&bs->backTex, &bs->blurTempTexV, filter);
+
+ glTranslated (-bw->blurTex.x, -bw->blurTex.y, 0);
+
+ genGeometry (&bw->vertArray, mat, 0, reblurRegion);
+ glVertexPointer (2, GL_FLOAT, stride, bw->vertArray.vertices + 2);
+ glTexCoordPointer (2, GL_FLOAT, stride, bw->vertArray.vertices);
+
+ glDrawArrays (GL_QUADS, 0, bw->vertArray.vCount);
+ GLERR;
+
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->backTex.handle, 0);
+ GLERR;
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glDepthRange (0, 1);
+ glViewport (-1, -1, 2, 2);
+ glRasterPos2f (0, 0);
+ s->rasterX = s->rasterY = 0;
+ glViewport (s->outputDev[bs->output].region.extents.x1,
+ s->height -
+ s->outputDev[bs->output].region.extents.y2,
+ s->outputDev[bs->output].width,
+ s->outputDev[bs->output].height);
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+
+ glDisable (GL_FRAGMENT_PROGRAM_ARB);
+ disableBlurfxTexture (&bs->blurTempTexV);
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_R);
+ glDisable (GL_TEXTURE_GEN_Q);
+
+ // remove reblurred regions from blur cache texture damage
+ XSubtractRegion (bw->texDamage, reblurRegion, bw->texDamage);
+
+ }
+ // if the screen is transformed draw blur cache texture into temporary blur texture because there could be some regions we still need a blur for
+ if (blurPaintRegion->numRects && (mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->blurTempTexH.handle, 0);
+ GLERR;
+
+ mat.xx = 1.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = -1.0;
+ mat.x0 = -bw->blurTex.x;
+ mat.y0 = bw->blurTex.height + bw->blurTex.y;
+
+ genGeometry (&bw->vertArray, mat, 0, blurPaintRegion);
+ glVertexPointer (2, GL_FLOAT, stride, bw->vertArray.vertices + 2);
+ glTexCoordPointer (2, GL_FLOAT, stride, bw->vertArray.vertices);
+
+ enableBlurfxTexture (&bw->blurTex, filter);
+
+ glDrawArrays (GL_QUADS, 0, bw->vertArray.vCount);
+ GLERR;
+
+ disableBlurfxTexture (&bw->blurTex);
+
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->backTex.handle, 0);
+ GLERR;
+ }
+ // cleanup
+ XDestroyRegion (reblurRegion);
+ XDestroyRegion (blurPaintRegion);
}
static void
-updateBlur(CompWindow * w, CompScreen * s,
- const WindowPaintAttrib * attrib, unsigned int mask,
- CompTextureFilter filter)
+updateBlur (CompWindow * w, CompScreen * s,
+ const WindowPaintAttrib * attrib, unsigned int mask,
+ CompTextureFilter filter)
{
- Region reblurRegion;
- int stride, count, stop, vCount, iCount;
- CompMatrix mat;
- GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1,
- by2;
- GLushort *indices;
- XRectangle rect;
-
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
-
- // get regions we need not to update
- reblurRegion = XCreateRegion();
-
- stride = (w->texUnits * w->texCoordSize) + 2;
-
- count = 0;
- stop = (iCount) ? iCount : vCount;
-
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
-
- // generate region that needs blur
- while (count < stop) {
- if (iCount) {
- x1 = vertices[indices[count] * stride];
- y1 = vertices[(indices[count] * stride) + 1];
- count++;
- x2 = vertices[indices[count] * stride];
- y2 = vertices[(indices[count] * stride) + 1];
- count++;
- x3 = vertices[indices[count] * stride];
- y3 = vertices[(indices[count] * stride) + 1];
- count++;
- x4 = vertices[indices[count] * stride];
- y4 = vertices[(indices[count] * stride) + 1];
- count++;
-
- } else {
- x1 = vertices[0];
- y1 = vertices[1];
- vertices += stride;
- x2 = vertices[0];
- y2 = vertices[1];
- vertices += stride;
- x3 = vertices[0];
- y3 = vertices[1];
- vertices += stride;
- x4 = vertices[0];
- y4 = vertices[1];
- vertices += stride;
- count += 4;
- }
-
-
- if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
- }
-
- bx1 = MIN(bx1, x1);
- bx2 = MAX(bx2, x1);
- bx1 = MIN(bx1, x2);
- bx2 = MAX(bx2, x2);
- bx1 = MIN(bx1, x3);
- bx2 = MAX(bx2, x3);
- bx1 = MIN(bx1, x4);
- bx2 = MAX(bx2, x4);
-
- by1 = MIN(by1, y1);
- by2 = MAX(by2, y1);
- by1 = MIN(by1, y2);
- by2 = MAX(by2, y2);
- by1 = MIN(by1, y3);
- by2 = MAX(by2, y3);
- by1 = MIN(by1, y4);
- by2 = MAX(by2, y4);
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && !(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = -attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- -attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion,
- reblurRegion);
- }
- }
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && (mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion, reblurRegion);
- }
-
- if (!(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK))
- XIntersectRegion(reblurRegion,
- &s->outputDev[bs->output].region,
- reblurRegion);
-
- XSubtractRegion(reblurRegion, bs->blurredRegion, reblurRegion);
-
- // subtract occluded region
- if (bs->od_active)
- XSubtractRegion(reblurRegion, bw->clip, reblurRegion);
-
- // subtract blur cache texture region
- if (bw->texUpdated)
- XSubtractRegion(reblurRegion, bw->bTexRegion,
- reblurRegion);
-
- if (!reblurRegion->numRects) {
- XDestroyRegion(reblurRegion);
- return;
- }
-
- XUnionRegion(reblurRegion, bs->blurredRegion, bs->blurredRegion);
-
- mat.xx = 1.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = -1.0;
- mat.x0 = 0.0;
- mat.y0 = bs->backTex.height;
-
- stride = 4 * sizeof(GLfloat);
-
- // draw vertically blured region into temprorary texture
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->blurTempTexV.handle, 0);
- GLERR;
-
- glPushMatrix();
-
- // enable projective texture cooridinate generation
- float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
- 0, s->outputDev[bs->output].height / 2.0, 0, 0,
- 0, 0, 1, 0,
- s->outputDev[bs->output].width / 2.0 +
- s->outputDev[bs->output].region.extents.x1,
- s->outputDev[bs->output].height / 2.0 + s->height -
- s->outputDev[bs->output].region.extents.y2, 1, 1
- };
- float bpm[16];
- float tm[16];
-
- bw->mvm_updated = FALSE;
- glGetFloatv(GL_MODELVIEW_MATRIX, bw->mvm);
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, bw->mvm, tm);
-
- float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
- float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
- float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
- float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGenfv(GL_R, GL_OBJECT_PLANE, r_gen);
- glTexGenfv(GL_Q, GL_OBJECT_PLANE, q_gen);
-
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glEnable(GL_TEXTURE_GEN_R);
- glEnable(GL_TEXTURE_GEN_Q);
-
- // bind vertival blur shader
- glEnable(GL_FRAGMENT_PROGRAM_ARB);
- GLERR;
- (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderV);
- GLERR;
-
-
- // bind unblurred background
- enableBlurfxTexture(&bs->backTex, filter);
-
- genGeometry(&bs->vertArray, mat, 0, reblurRegion);
- glVertexPointer(2, GL_FLOAT, stride, bs->vertArray.vertices + 2);
- GLERR;
- glTexCoordPointer(2, GL_FLOAT, stride, bs->vertArray.vertices);
- GLERR;
-
- glDrawArrays(GL_QUADS, 0, bs->vertArray.vCount);
- GLERR;
-
- // draw vertically blured region into temprorary texture
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->blurTempTexH.handle, 0);
- GLERR;
-
- // bind horizontal blur shader
- (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderH);
- GLERR;
-
- // bind temprorary texture
- switchBlurfxTexture(&bs->backTex, &bs->blurTempTexV, filter);
-
- glDrawArrays(GL_QUADS, 0, bs->vertArray.vCount);
- GLERR;
-
- glPopMatrix();
- GLERR;
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB,
- bs->backTex.handle, 0);
- GLERR;
-
- (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, 0);
- GLERR;
- glDisable(GL_FRAGMENT_PROGRAM_ARB);
-
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_R);
- glDisable(GL_TEXTURE_GEN_Q);
-
- disableBlurfxTexture(&bs->blurTempTexV);
-
- XDestroyRegion(reblurRegion);
+ Region reblurRegion;
+ int stride, count, stop, vCount, iCount;
+ CompMatrix mat;
+ GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1, by2;
+ GLushort *indices;
+ XRectangle rect;
+
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
+ {
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
+ }
+
+ if (vCount <= 0)
+ return;
+
+ // get regions we need not to update
+ reblurRegion = XCreateRegion ();
+
+ stride = (w->texUnits * w->texCoordSize) + 2;
+
+ count = 0;
+ stop = (iCount) ? iCount : vCount;
+
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+
+ // generate region that needs blur
+ while (count < stop)
+ {
+ if (iCount)
+ {
+ x1 = vertices[indices[count] * stride];
+ y1 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x2 = vertices[indices[count] * stride];
+ y2 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x3 = vertices[indices[count] * stride];
+ y3 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x4 = vertices[indices[count] * stride];
+ y4 = vertices[(indices[count] * stride) + 1];
+ count++;
+
+ }
+ else
+ {
+ x1 = vertices[0];
+ y1 = vertices[1];
+ vertices += stride;
+ x2 = vertices[0];
+ y2 = vertices[1];
+ vertices += stride;
+ x3 = vertices[0];
+ y3 = vertices[1];
+ vertices += stride;
+ x4 = vertices[0];
+ y4 = vertices[1];
+ vertices += stride;
+ count += 4;
+ }
+
+
+ if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+ }
+
+ bx1 = MIN (bx1, x1);
+ bx2 = MAX (bx2, x1);
+ bx1 = MIN (bx1, x2);
+ bx2 = MAX (bx2, x2);
+ bx1 = MIN (bx1, x3);
+ bx2 = MAX (bx2, x3);
+ bx1 = MIN (bx1, x4);
+ bx2 = MAX (bx2, x4);
+
+ by1 = MIN (by1, y1);
+ by2 = MAX (by2, y1);
+ by1 = MIN (by1, y2);
+ by2 = MAX (by2, y2);
+ by1 = MIN (by1, y3);
+ by2 = MAX (by2, y3);
+ by1 = MIN (by1, y4);
+ by2 = MAX (by2, y4);
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && !(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = -attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ -attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+ }
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && (mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+
+ if (!(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK))
+ XIntersectRegion (reblurRegion,
+ &s->outputDev[bs->output].region, reblurRegion);
+
+ XSubtractRegion (reblurRegion, bs->blurredRegion, reblurRegion);
+
+ // subtract occluded region
+ if (bs->od_active)
+ XSubtractRegion (reblurRegion, bw->clip, reblurRegion);
+
+ // subtract blur cache texture region
+ if (bw->texUpdated)
+ XSubtractRegion (reblurRegion, bw->bTexRegion, reblurRegion);
+
+ if (!reblurRegion->numRects)
+ {
+ XDestroyRegion (reblurRegion);
+ return;
+ }
+
+ XUnionRegion (reblurRegion, bs->blurredRegion, bs->blurredRegion);
+
+ mat.xx = 1.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = -1.0;
+ mat.x0 = 0.0;
+ mat.y0 = bs->backTex.height;
+
+ stride = 4 * sizeof (GLfloat);
+
+ // draw vertically blured region into temprorary texture
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->blurTempTexV.handle, 0);
+ GLERR;
+
+ glPushMatrix ();
+
+ // enable projective texture cooridinate generation
+ float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
+ 0, s->outputDev[bs->output].height / 2.0, 0, 0,
+ 0, 0, 1, 0,
+ s->outputDev[bs->output].width / 2.0 +
+ s->outputDev[bs->output].region.extents.x1,
+ s->outputDev[bs->output].height / 2.0 + s->height -
+ s->outputDev[bs->output].region.extents.y2, 1, 1
+ };
+ float bpm[16];
+ float tm[16];
+
+ bw->mvm_updated = FALSE;
+ glGetFloatv (GL_MODELVIEW_MATRIX, bw->mvm);
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, bw->mvm, tm);
+
+ float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
+ float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
+ float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
+ float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGenfv (GL_R, GL_OBJECT_PLANE, r_gen);
+ glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen);
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glEnable (GL_TEXTURE_GEN_R);
+ glEnable (GL_TEXTURE_GEN_Q);
+
+ // bind vertival blur shader
+ glEnable (GL_FRAGMENT_PROGRAM_ARB);
+ GLERR;
+ (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderV);
+ GLERR;
+
+
+ // bind unblurred background
+ enableBlurfxTexture (&bs->backTex, filter);
+
+ genGeometry (&bs->vertArray, mat, 0, reblurRegion);
+ glVertexPointer (2, GL_FLOAT, stride, bs->vertArray.vertices + 2);
+ GLERR;
+ glTexCoordPointer (2, GL_FLOAT, stride, bs->vertArray.vertices);
+ GLERR;
+
+ glDrawArrays (GL_QUADS, 0, bs->vertArray.vCount);
+ GLERR;
+
+ // draw vertically blured region into temprorary texture
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->blurTempTexH.handle, 0);
+ GLERR;
+
+ // bind horizontal blur shader
+ (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, bs->blurShaderH);
+ GLERR;
+
+ // bind temprorary texture
+ switchBlurfxTexture (&bs->backTex, &bs->blurTempTexV, filter);
+
+ glDrawArrays (GL_QUADS, 0, bs->vertArray.vCount);
+ GLERR;
+
+ glPopMatrix ();
+ GLERR;
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB,
+ bs->backTex.handle, 0);
+ GLERR;
+
+ (*s->bindProgram) (GL_FRAGMENT_PROGRAM_ARB, 0);
+ GLERR;
+ glDisable (GL_FRAGMENT_PROGRAM_ARB);
+
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_R);
+ glDisable (GL_TEXTURE_GEN_Q);
+
+ disableBlurfxTexture (&bs->blurTempTexV);
+
+ XDestroyRegion (reblurRegion);
}
static void
-updateBlurTextureSize(CompWindow * w, CompScreen * s,
- const WindowPaintAttrib * attrib, unsigned int mask)
+updateBlurTextureSize (CompWindow * w, CompScreen * s,
+ const WindowPaintAttrib * attrib, unsigned int mask)
{
- XRectangle box;
- int texCheck = 0;
- float div_w, div_h;
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- // if the window does not have a blur cache texture create it
- if (!bw->hasTexture && !WINDOW_INPUT_INVISIBLE(w)) {
- bw->hasTexture = TRUE;
-
- genBlurTexture(bs, &bw->blurTex,
- ceil((WIN_W(w) + 80) / bs->downSample),
- ceil((WIN_H(w) + 80) / bs->downSample), 0);
-
- bw->blurTex.x =
- floor((WIN_X(w) -
- 40) / bs->downSample) * bs->downSample;
- bw->blurTex.y =
- floor((WIN_Y(w) -
- 40) / bs->downSample) * bs->downSample;
- bw->blurTex.downSample = bs->downSample;
- box.x = bw->blurTex.x;
- box.y = bw->blurTex.y;
- box.width = bw->blurTex.width;
- box.height = bw->blurTex.height;
-
- bw->bc_x = s->x;
- bw->bc_y = s->y;
-
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->texDamage);
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->bTexRegion);
- XUnionRectWithRegion(&box, bw->texDamage, bw->texDamage);
- XUnionRectWithRegion(&box, bw->bTexRegion, bw->bTexRegion);
- }
- // if the window has moved out of his blur cache texture then update the blur cache texture
- if (bw->blurTex.x > WIN_X(w)
- || WIN_X(w) + WIN_W(w) > bw->blurTex.x + bw->blurTex.width)
- texCheck = 1;
- if (bw->blurTex.y > WIN_Y(w)
- || WIN_Y(w) + WIN_H(w) > bw->blurTex.y + bw->blurTex.height)
- texCheck = 1;
-
- // do not update if the window is still moving
- if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) && texCheck
- && !(w->attrib.x == bw->lastX && w->attrib.y == bw->lastY))
- texCheck = 0;
-
- // do we need to resize the blur cache texture
- if (bw->blurTex.width < WIN_W(w) || bw->blurTex.height < WIN_H(w))
- texCheck = 2;
- if (bw->blurTex.width - WIN_W(w) > 160
- || bw->blurTex.height - WIN_H(w) > 160)
- texCheck = 2;
-
- if ((bw->bc_x != s->x || bw->bc_y != s->y)
- && !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK)) {
- texCheck = 1;
- }
- // do not update blur cache texture size if window is transformed
- if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) && texCheck == 2)
- texCheck = 0;
-
- if (bw->blurTex.downSample != bs->downSample)
- texCheck = 2;
-
- if (texCheck && (!WINDOW_INPUT_INVISIBLE(w) || w->shaded)) {
- if (texCheck == 2) {
- // update blur cache texture size
- enableBlurfxTexture(&bw->blurTex,
- COMP_TEXTURE_FILTER_FAST);
- glTexImage2D(bw->blurTex.target, 0, 3,
- ceil((WIN_W(w) +
- 80) / bs->downSample),
- ceil((WIN_H(w) +
- 80) / bs->downSample), 0,
- GL_RGB, GL_UNSIGNED_BYTE, NULL);
- disableBlurfxTexture(&bw->blurTex);
- bw->blurTex.width = WIN_W(w) + 80;
- bw->blurTex.height = WIN_H(w) + 80;
- }
- // update blur cache texture position
- div_w = (bw->blurTex.width - WIN_W(w)) / 2;
- div_h = (bw->blurTex.height - WIN_H(w)) / 2;
-
- bw->blurTex.x =
- floor((WIN_X(w) -
- div_w) / bs->downSample) * bs->downSample;
- bw->blurTex.y =
- floor((WIN_Y(w) -
- div_h) / bs->downSample) * bs->downSample;
- bw->blurTex.downSample = bs->downSample;
- box.x = bw->blurTex.x;
- box.y = bw->blurTex.y;
- box.width = bw->blurTex.width;
- box.height = bw->blurTex.height;
-
- bw->bc_x = s->x;
- bw->bc_y = s->y;
-
- // update to new regions and add damage
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->texDamage);
- XUnionRegion(getEmptyRegion(), getEmptyRegion(),
- bw->bTexRegion);
- XUnionRectWithRegion(&box, bw->texDamage, bw->texDamage);
- XUnionRectWithRegion(&box, bw->bTexRegion, bw->bTexRegion);
- }
+ XRectangle box;
+ int texCheck = 0;
+ float div_w, div_h;
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ // if the window does not have a blur cache texture create it
+ if (!bw->hasTexture && !WINDOW_INPUT_INVISIBLE (w))
+ {
+ bw->hasTexture = TRUE;
+
+ genBlurTexture (bs, &bw->blurTex,
+ ceil ((WIN_W (w) + 80) / bs->downSample),
+ ceil ((WIN_H (w) + 80) / bs->downSample), 0);
+
+ bw->blurTex.x =
+ floor ((WIN_X (w) - 40) / bs->downSample) * bs->downSample;
+ bw->blurTex.y =
+ floor ((WIN_Y (w) - 40) / bs->downSample) * bs->downSample;
+ bw->blurTex.downSample = bs->downSample;
+ box.x = bw->blurTex.x;
+ box.y = bw->blurTex.y;
+ box.width = bw->blurTex.width;
+ box.height = bw->blurTex.height;
+
+ bw->bc_x = s->x;
+ bw->bc_y = s->y;
+
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->texDamage);
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->bTexRegion);
+ XUnionRectWithRegion (&box, bw->texDamage, bw->texDamage);
+ XUnionRectWithRegion (&box, bw->bTexRegion, bw->bTexRegion);
+ }
+ // if the window has moved out of his blur cache texture then update the blur cache texture
+ if (bw->blurTex.x > WIN_X (w)
+ || WIN_X (w) + WIN_W (w) > bw->blurTex.x + bw->blurTex.width)
+ texCheck = 1;
+ if (bw->blurTex.y > WIN_Y (w)
+ || WIN_Y (w) + WIN_H (w) > bw->blurTex.y + bw->blurTex.height)
+ texCheck = 1;
+
+ // do not update if the window is still moving
+ if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) && texCheck
+ && !(w->attrib.x == bw->lastX && w->attrib.y == bw->lastY))
+ texCheck = 0;
+
+ // do we need to resize the blur cache texture
+ if (bw->blurTex.width < WIN_W (w) || bw->blurTex.height < WIN_H (w))
+ texCheck = 2;
+ if (bw->blurTex.width - WIN_W (w) > 160
+ || bw->blurTex.height - WIN_H (w) > 160)
+ texCheck = 2;
+
+ if ((bw->bc_x != s->x || bw->bc_y != s->y)
+ && !(mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK))
+ {
+ texCheck = 1;
+ }
+ // do not update blur cache texture size if window is transformed
+ if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) && texCheck == 2)
+ texCheck = 0;
+
+ if (bw->blurTex.downSample != bs->downSample)
+ texCheck = 2;
+
+ if (texCheck && (!WINDOW_INPUT_INVISIBLE (w) || w->shaded))
+ {
+ if (texCheck == 2)
+ {
+ // update blur cache texture size
+ enableBlurfxTexture (&bw->blurTex, COMP_TEXTURE_FILTER_FAST);
+ glTexImage2D (bw->blurTex.target, 0, 3,
+ ceil ((WIN_W (w) +
+ 80) / bs->downSample),
+ ceil ((WIN_H (w) +
+ 80) / bs->downSample), 0,
+ GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ disableBlurfxTexture (&bw->blurTex);
+ bw->blurTex.width = WIN_W (w) + 80;
+ bw->blurTex.height = WIN_H (w) + 80;
+ }
+ // update blur cache texture position
+ div_w = (bw->blurTex.width - WIN_W (w)) / 2;
+ div_h = (bw->blurTex.height - WIN_H (w)) / 2;
+
+ bw->blurTex.x =
+ floor ((WIN_X (w) - div_w) / bs->downSample) * bs->downSample;
+ bw->blurTex.y =
+ floor ((WIN_Y (w) - div_h) / bs->downSample) * bs->downSample;
+ bw->blurTex.downSample = bs->downSample;
+ box.x = bw->blurTex.x;
+ box.y = bw->blurTex.y;
+ box.width = bw->blurTex.width;
+ box.height = bw->blurTex.height;
+
+ bw->bc_x = s->x;
+ bw->bc_y = s->y;
+
+ // update to new regions and add damage
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->texDamage);
+ XUnionRegion (getEmptyRegion (), getEmptyRegion (), bw->bTexRegion);
+ XUnionRectWithRegion (&box, bw->texDamage, bw->texDamage);
+ XUnionRectWithRegion (&box, bw->bTexRegion, bw->bTexRegion);
+ }
}
static void
-updateBlurTextureNoFBO(CompWindow * w, CompScreen * s,
- const WindowPaintAttrib * attrib, unsigned int mask)
+updateBlurTextureNoFBO (CompWindow * w, CompScreen * s,
+ const WindowPaintAttrib * attrib, unsigned int mask)
{
- Region reblurRegion;
- Region blurPaintRegion;
- int stride, count, stop, vCount, iCount;
- GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1,
- by2;
- GLushort *indices;
- XRectangle rect;
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- if (bw->bc_x != s->x || bw->bc_y != s->y) {
- bw->texUpdated = FALSE;
- return;
- }
-
- if (screenGrabExist(s, "switcher", 0)
- || mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK
- || mask & PAINT_WINDOW_TRANSFORMED_MASK || bw->isSwitcher) {
- bw->texUpdated = FALSE;
- return;
- }
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
- stride = (w->texUnits * w->texCoordSize) + 2;
-
- // get regions we need not to update
- reblurRegion = XCreateRegion();
- blurPaintRegion = XCreateRegion();
-
- count = 0;
- stop = (iCount) ? iCount : vCount;
-
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
-
- // generate region that needs blur
- while (count < stop) {
- if (iCount) {
- x1 = vertices[indices[count] * stride];
- y1 = vertices[(indices[count] * stride) + 1];
- count++;
- x2 = vertices[indices[count] * stride];
- y2 = vertices[(indices[count] * stride) + 1];
- count++;
- x3 = vertices[indices[count] * stride];
- y3 = vertices[(indices[count] * stride) + 1];
- count++;
- x4 = vertices[indices[count] * stride];
- y4 = vertices[(indices[count] * stride) + 1];
- count++;
-
- } else {
- x1 = vertices[0];
- y1 = vertices[1];
- vertices += stride;
- x2 = vertices[0];
- y2 = vertices[1];
- vertices += stride;
- x3 = vertices[0];
- y3 = vertices[1];
- vertices += stride;
- x4 = vertices[0];
- y4 = vertices[1];
- vertices += stride;
- count += 4;
- }
-
-
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
-
- bx1 = MIN(bx1, x1);
- bx2 = MAX(bx2, x1);
- bx1 = MIN(bx1, x2);
- bx2 = MAX(bx2, x2);
- bx1 = MIN(bx1, x3);
- bx2 = MAX(bx2, x3);
- bx1 = MIN(bx1, x4);
- bx2 = MAX(bx2, x4);
-
- by1 = MIN(by1, y1);
- by2 = MAX(by2, y1);
- by1 = MIN(by1, y2);
- by2 = MAX(by2, y2);
- by1 = MIN(by1, y3);
- by2 = MAX(by2, y3);
- by1 = MIN(by1, y4);
- by2 = MAX(by2, y4);
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion,
- reblurRegion);
- }
- }
-
- XIntersectRegion(reblurRegion, bw->bTexRegion, blurPaintRegion);
-
- // get regions we need to update
- XIntersectRegion(reblurRegion, bw->paintRegion, reblurRegion);
- XIntersectRegion(reblurRegion, bw->texDamage, reblurRegion);
- XIntersectRegion(reblurRegion, bw->bTexRegion, reblurRegion);
-
- XIntersectRegion(reblurRegion, &s->outputDev[bs->output].region,
- reblurRegion);
-
- // subtract occluded region
- if (bs->od_active)
- XSubtractRegion(reblurRegion, bw->clip, reblurRegion);
-
- if (reblurRegion->numRects) {
-
- // enable projective texture cooridinate generation
- float bm[16] =
- { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
- 0, s->outputDev[bs->output].height / -2.0, 0, 0,
- 0, 0, 1, 0,
- s->outputDev[bs->output].width / 2.0 +
- s->outputDev[bs->output].region.extents.x1,
- s->outputDev[bs->output].height / 2.0 +
- s->outputDev[bs->output].region.extents.y1, 1,
- 1
- };
- float bpm[16];
- float tm[16];
- if (!bw->mvm_updated) {
- bw->mvm_updated = TRUE;
- glGetFloatv(GL_MODELVIEW_MATRIX, bw->mvm);
- }
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, bw->mvm, tm);
-
- int i;
- XRectangle sRect, bRect;
- for (i = 0; i < reblurRegion->numRects; i++) {
-
- sRect.x =
- floor(reblurRegion->rects[i].x1 /
- bs->downSample);
- sRect.y =
- floor(reblurRegion->rects[i].y1 /
- bs->downSample);
- sRect.width =
- MAX(1.0,
- ceil(reblurRegion->rects[i].x2 /
- bs->downSample) - sRect.x);
- sRect.height =
- MAX(1.0,
- ceil(reblurRegion->rects[i].y2 /
- bs->downSample) - sRect.y);
-
- bRect.x = sRect.x * bs->downSample;
- bRect.y = sRect.y * bs->downSample;
- bRect.width = sRect.width * bs->downSample;
- bRect.height = sRect.height * bs->downSample;
-
- // copy background into temporary texture
- enableBlurfxTexture(&bs->blurTempTexV,
- COMP_TEXTURE_FILTER_GOOD);
- glCopyTexSubImage2D(bs->blurTempTexV.target, 0, 0,
- 0, bRect.x,
- s->height - bRect.y -
- bRect.height, bRect.width,
- bRect.height);
-
- // draw downsampled texture
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height);
- glVertex2f(bRect.x + sRect.width,
- bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-
- float shift = bs->downSample / 2.0;
-
- glColor4f(1.0, 1.0, 1.0, 0.5);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0 + shift, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0 + shift, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width + shift, bRect.height);
- glVertex2f(bRect.x + sRect.width,
- bRect.y + sRect.height);
- glTexCoord2f(bRect.width + shift, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.333);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0 - shift, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0 - shift, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width - shift, bRect.height);
- glVertex2f(bRect.x + sRect.width,
- bRect.y + sRect.height);
- glTexCoord2f(bRect.width - shift, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.25);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0 - shift);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height - shift);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height - shift);
- glVertex2f(bRect.x + sRect.width,
- bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0 - shift);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.2);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0 + shift);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height + shift);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height + shift);
- glVertex2f(bRect.x + sRect.width,
- bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0 + shift);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
-
- glDisable(GL_BLEND);
- // copy downsampled background into temporary texture
- switchBlurfxTexture(&bs->blurTempTexV,
- &bw->blurTex,
- COMP_TEXTURE_FILTER_GOOD);
- glCopyTexSubImage2D(bw->blurTex.target, 0,
- sRect.x -
- (bw->blurTex.x /
- bs->downSample),
- sRect.y -
- (bw->blurTex.y /
- bs->downSample), bRect.x,
- s->height - bRect.y -
- sRect.height, sRect.width,
- sRect.height);
-
- // copy normal background back to screen
- switchBlurfxTexture(&bw->blurTex,
- &bs->blurTempTexV,
- COMP_TEXTURE_FILTER_GOOD);
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, bRect.height);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, 0);
- glVertex2f(bRect.x, bRect.y + bRect.height);
- glTexCoord2f(bRect.width, 0);
- glVertex2f(bRect.x + bRect.width,
- bRect.y + bRect.height);
- glTexCoord2f(bRect.width, bRect.height);
- glVertex2f(bRect.x + bRect.width, bRect.y);
- glEnd();
-
- disableBlurfxTexture(&bs->blurTempTexV);
-
-
- }
-
- // remove reblurred regions from blur cache texture damage
- XSubtractRegion(bw->texDamage, reblurRegion,
- bw->texDamage);
-
- }
- // cleanup
- XDestroyRegion(reblurRegion);
- XDestroyRegion(blurPaintRegion);
+ Region reblurRegion;
+ Region blurPaintRegion;
+ int stride, count, stop, vCount, iCount;
+ GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1, by2;
+ GLushort *indices;
+ XRectangle rect;
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ if (bw->bc_x != s->x || bw->bc_y != s->y)
+ {
+ bw->texUpdated = FALSE;
+ return;
+ }
+
+ if (screenGrabExist (s, "switcher", 0)
+ || mask & PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK
+ || mask & PAINT_WINDOW_TRANSFORMED_MASK || bw->isSwitcher)
+ {
+ bw->texUpdated = FALSE;
+ return;
+ }
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
+ {
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
+ }
+
+ if (vCount <= 0)
+ return;
+ stride = (w->texUnits * w->texCoordSize) + 2;
+
+ // get regions we need not to update
+ reblurRegion = XCreateRegion ();
+ blurPaintRegion = XCreateRegion ();
+
+ count = 0;
+ stop = (iCount) ? iCount : vCount;
+
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+
+ // generate region that needs blur
+ while (count < stop)
+ {
+ if (iCount)
+ {
+ x1 = vertices[indices[count] * stride];
+ y1 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x2 = vertices[indices[count] * stride];
+ y2 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x3 = vertices[indices[count] * stride];
+ y3 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x4 = vertices[indices[count] * stride];
+ y4 = vertices[(indices[count] * stride) + 1];
+ count++;
+
+ }
+ else
+ {
+ x1 = vertices[0];
+ y1 = vertices[1];
+ vertices += stride;
+ x2 = vertices[0];
+ y2 = vertices[1];
+ vertices += stride;
+ x3 = vertices[0];
+ y3 = vertices[1];
+ vertices += stride;
+ x4 = vertices[0];
+ y4 = vertices[1];
+ vertices += stride;
+ count += 4;
+ }
+
+
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+
+ bx1 = MIN (bx1, x1);
+ bx2 = MAX (bx2, x1);
+ bx1 = MIN (bx1, x2);
+ bx2 = MAX (bx2, x2);
+ bx1 = MIN (bx1, x3);
+ bx2 = MAX (bx2, x3);
+ bx1 = MIN (bx1, x4);
+ bx2 = MAX (bx2, x4);
+
+ by1 = MIN (by1, y1);
+ by2 = MAX (by2, y1);
+ by1 = MIN (by1, y2);
+ by2 = MAX (by2, y2);
+ by1 = MIN (by1, y3);
+ by2 = MAX (by2, y3);
+ by1 = MIN (by1, y4);
+ by2 = MAX (by2, y4);
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0)
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+ }
+
+ XIntersectRegion (reblurRegion, bw->bTexRegion, blurPaintRegion);
+
+ // get regions we need to update
+ XIntersectRegion (reblurRegion, bw->paintRegion, reblurRegion);
+ XIntersectRegion (reblurRegion, bw->texDamage, reblurRegion);
+ XIntersectRegion (reblurRegion, bw->bTexRegion, reblurRegion);
+
+ XIntersectRegion (reblurRegion, &s->outputDev[bs->output].region,
+ reblurRegion);
+
+ // subtract occluded region
+ if (bs->od_active)
+ XSubtractRegion (reblurRegion, bw->clip, reblurRegion);
+
+ if (reblurRegion->numRects)
+ {
+
+ // enable projective texture cooridinate generation
+ float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
+ 0, s->outputDev[bs->output].height / -2.0, 0, 0,
+ 0, 0, 1, 0,
+ s->outputDev[bs->output].width / 2.0 +
+ s->outputDev[bs->output].region.extents.x1,
+ s->outputDev[bs->output].height / 2.0 +
+ s->outputDev[bs->output].region.extents.y1, 1,
+ 1
+ };
+ float bpm[16];
+ float tm[16];
+ if (!bw->mvm_updated)
+ {
+ bw->mvm_updated = TRUE;
+ glGetFloatv (GL_MODELVIEW_MATRIX, bw->mvm);
+ }
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, bw->mvm, tm);
+
+ int i;
+ XRectangle sRect, bRect;
+ for (i = 0; i < reblurRegion->numRects; i++)
+ {
+
+ sRect.x = floor (reblurRegion->rects[i].x1 / bs->downSample);
+ sRect.y = floor (reblurRegion->rects[i].y1 / bs->downSample);
+ sRect.width =
+ MAX (1.0,
+ ceil (reblurRegion->rects[i].x2 /
+ bs->downSample) - sRect.x);
+ sRect.height =
+ MAX (1.0,
+ ceil (reblurRegion->rects[i].y2 /
+ bs->downSample) - sRect.y);
+
+ bRect.x = sRect.x * bs->downSample;
+ bRect.y = sRect.y * bs->downSample;
+ bRect.width = sRect.width * bs->downSample;
+ bRect.height = sRect.height * bs->downSample;
+
+ // copy background into temporary texture
+ enableBlurfxTexture (&bs->blurTempTexV, COMP_TEXTURE_FILTER_GOOD);
+ glCopyTexSubImage2D (bs->blurTempTexV.target, 0, 0,
+ 0, bRect.x,
+ s->height - bRect.y -
+ bRect.height, bRect.width, bRect.height);
+
+ // draw downsampled texture
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+
+ float shift = bs->downSample / 2.0;
+
+ glColor4f (1.0, 1.0, 1.0, 0.5);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0 + shift, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0 + shift, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width + shift, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width + shift, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.333);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0 - shift, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0 - shift, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width - shift, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width - shift, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.25);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0 - shift);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height - shift);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height - shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0 - shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.2);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0 + shift);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height + shift);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height + shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0 + shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+
+ glDisable (GL_BLEND);
+ // copy downsampled background into temporary texture
+ switchBlurfxTexture (&bs->blurTempTexV,
+ &bw->blurTex, COMP_TEXTURE_FILTER_GOOD);
+ glCopyTexSubImage2D (bw->blurTex.target, 0,
+ sRect.x -
+ (bw->blurTex.x /
+ bs->downSample),
+ sRect.y -
+ (bw->blurTex.y /
+ bs->downSample), bRect.x,
+ s->height - bRect.y -
+ sRect.height, sRect.width, sRect.height);
+
+ // copy normal background back to screen
+ switchBlurfxTexture (&bw->blurTex,
+ &bs->blurTempTexV, COMP_TEXTURE_FILTER_GOOD);
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, bRect.height);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, 0);
+ glVertex2f (bRect.x, bRect.y + bRect.height);
+ glTexCoord2f (bRect.width, 0);
+ glVertex2f (bRect.x + bRect.width, bRect.y + bRect.height);
+ glTexCoord2f (bRect.width, bRect.height);
+ glVertex2f (bRect.x + bRect.width, bRect.y);
+ glEnd ();
+
+ disableBlurfxTexture (&bs->blurTempTexV);
+
+
+ }
+
+ // remove reblurred regions from blur cache texture damage
+ XSubtractRegion (bw->texDamage, reblurRegion, bw->texDamage);
+
+ }
+ // cleanup
+ XDestroyRegion (reblurRegion);
+ XDestroyRegion (blurPaintRegion);
}
static void
-updateBlurNoFBO(CompWindow * w, CompScreen * s,
- const WindowPaintAttrib * attrib, unsigned int mask)
+updateBlurNoFBO (CompWindow * w, CompScreen * s,
+ const WindowPaintAttrib * attrib, unsigned int mask)
{
- Region reblurRegion;
- int stride, count, stop, vCount, iCount;
- GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1,
- by2;
- GLushort *indices;
- XRectangle rect;
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
-
- // get regions we need not to update
- reblurRegion = XCreateRegion();
-
- stride = (w->texUnits * w->texCoordSize) + 2;
-
- count = 0;
- stop = (iCount) ? iCount : vCount;
-
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
-
- // generate region that needs blur
- while (count < stop) {
- if (iCount) {
- x1 = vertices[indices[count] * stride];
- y1 = vertices[(indices[count] * stride) + 1];
- count++;
- x2 = vertices[indices[count] * stride];
- y2 = vertices[(indices[count] * stride) + 1];
- count++;
- x3 = vertices[indices[count] * stride];
- y3 = vertices[(indices[count] * stride) + 1];
- count++;
- x4 = vertices[indices[count] * stride];
- y4 = vertices[(indices[count] * stride) + 1];
- count++;
-
- } else {
- x1 = vertices[0];
- y1 = vertices[1];
- vertices += stride;
- x2 = vertices[0];
- y2 = vertices[1];
- vertices += stride;
- x3 = vertices[0];
- y3 = vertices[1];
- vertices += stride;
- x4 = vertices[0];
- y4 = vertices[1];
- vertices += stride;
- count += 4;
- }
-
-
- if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- bx1 = 65535;
- bx2 = 0.0;
- by1 = 65535;
- by2 = 0.0;
- }
-
- bx1 = MIN(bx1, x1);
- bx2 = MAX(bx2, x1);
- bx1 = MIN(bx1, x2);
- bx2 = MAX(bx2, x2);
- bx1 = MIN(bx1, x3);
- bx2 = MAX(bx2, x3);
- bx1 = MIN(bx1, x4);
- bx2 = MAX(bx2, x4);
-
- by1 = MIN(by1, y1);
- by2 = MAX(by2, y1);
- by1 = MIN(by1, y2);
- by2 = MAX(by2, y2);
- by1 = MIN(by1, y3);
- by2 = MAX(by2, y3);
- by1 = MIN(by1, y4);
- by2 = MAX(by2, y4);
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && !(mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion,
- reblurRegion);
- }
- }
-
- if (bx2 - bx1 > 0 && by2 - by1 > 0
- && (mask & PAINT_WINDOW_TRANSFORMED_MASK)) {
- rect.x = attrib->xTranslate +
- (((bx1 - 7) - w->attrib.x) * attrib->xScale) +
- w->attrib.x;
- rect.y =
- attrib->yTranslate +
- (((by1 - 1) - w->attrib.y) * attrib->yScale) +
- w->attrib.y;
- rect.width = (bx2 - bx1 + 14) * attrib->xScale;
- rect.height = (by2 - by1 + 2) * attrib->yScale;
-
- XUnionRectWithRegion(&rect, reblurRegion, reblurRegion);
- }
-
- XIntersectRegion(reblurRegion, &s->region,
- reblurRegion);
-
- XSubtractRegion(reblurRegion, bs->blurredRegion, reblurRegion);
-
- // subtract occluded region
- if (bs->od_active)
- XSubtractRegion(reblurRegion, bw->clip, reblurRegion);
-
- // subtract blur cache texture region
- if (bw->texUpdated)
- XSubtractRegion(reblurRegion, bw->bTexRegion,
- reblurRegion);
-
- if (!reblurRegion->numRects) {
- XDestroyRegion(reblurRegion);
- return;
- }
-
- XUnionRegion(reblurRegion, bs->blurredRegion, bs->blurredRegion);
-
- glPushMatrix();
-
- // enable projective texture cooridinate generation
- float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
- 0, s->outputDev[bs->output].height / -2.0, 0, 0,
- 0, 0, 1, 0,
- s->outputDev[bs->output].width / 2.0 +
- s->outputDev[bs->output].region.extents.x1,
- s->outputDev[bs->output].height / 2.0 +
- s->outputDev[bs->output].region.extents.y1, 1, 1
- };
- float bpm[16];
- float tm[16];
-
- bw->mvm_updated = FALSE;
- glGetFloatv(GL_MODELVIEW_MATRIX, bw->mvm);
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, bw->mvm, tm);
-
- Bool enable_light = FALSE;
-
- if (glIsEnabled (GL_LIGHTING))
+ Region reblurRegion;
+ int stride, count, stop, vCount, iCount;
+ GLfloat *vertices, x1, x2, x3, x4, y1, y2, y3, y4, bx1, bx2, by1, by2;
+ GLushort *indices;
+ XRectangle rect;
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
{
- glDisable (GL_LIGHTING);
- enable_light = TRUE;
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
}
- Bool enable_stencil = FALSE;
+ if (vCount <= 0)
+ return;
- if (glIsEnabled (GL_STENCIL_TEST))
+ // get regions we need not to update
+ reblurRegion = XCreateRegion ();
+
+ stride = (w->texUnits * w->texCoordSize) + 2;
+
+ count = 0;
+ stop = (iCount) ? iCount : vCount;
+
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+
+ // generate region that needs blur
+ while (count < stop)
{
- glDisable (GL_STENCIL_TEST);
- enable_stencil = TRUE;
+ if (iCount)
+ {
+ x1 = vertices[indices[count] * stride];
+ y1 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x2 = vertices[indices[count] * stride];
+ y2 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x3 = vertices[indices[count] * stride];
+ y3 = vertices[(indices[count] * stride) + 1];
+ count++;
+ x4 = vertices[indices[count] * stride];
+ y4 = vertices[(indices[count] * stride) + 1];
+ count++;
+
+ }
+ else
+ {
+ x1 = vertices[0];
+ y1 = vertices[1];
+ vertices += stride;
+ x2 = vertices[0];
+ y2 = vertices[1];
+ vertices += stride;
+ x3 = vertices[0];
+ y3 = vertices[1];
+ vertices += stride;
+ x4 = vertices[0];
+ y4 = vertices[1];
+ vertices += stride;
+ count += 4;
+ }
+
+
+ if (!(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ bx1 = 65535;
+ bx2 = 0.0;
+ by1 = 65535;
+ by2 = 0.0;
+ }
+
+ bx1 = MIN (bx1, x1);
+ bx2 = MAX (bx2, x1);
+ bx1 = MIN (bx1, x2);
+ bx2 = MAX (bx2, x2);
+ bx1 = MIN (bx1, x3);
+ bx2 = MAX (bx2, x3);
+ bx1 = MIN (bx1, x4);
+ bx2 = MAX (bx2, x4);
+
+ by1 = MIN (by1, y1);
+ by2 = MAX (by2, y1);
+ by1 = MIN (by1, y2);
+ by2 = MAX (by2, y2);
+ by1 = MIN (by1, y3);
+ by2 = MAX (by2, y3);
+ by1 = MIN (by1, y4);
+ by2 = MAX (by2, y4);
+
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && !(mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
}
- int i;
- XRectangle sRect, bRect;
- for (i = 0; i < reblurRegion->numRects; i++) {
-
- rect.x = reblurRegion->rects[i].x1;
- rect.y = reblurRegion->rects[i].y1;
- rect.width = reblurRegion->rects[i].x2 - rect.x;
- rect.height = reblurRegion->rects[i].y2 - rect.y;
-
- // check region for visibility and project it to screen
- float bbProj[4][2];
- float bBox[4];
-
- bbProj[0][0] = rect.x * tm[0] + rect.y * tm[4] + tm[12];
- bbProj[0][0] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
- bbProj[0][1] = rect.x * tm[1] + rect.y * tm[5] + tm[13];
- bbProj[0][1] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
- bbProj[1][0] =
- (rect.x + rect.width) * tm[0] + rect.y * tm[4] +
- tm[12];
- bbProj[1][0] /= (rect.x + rect.width) * tm[3] +
- rect.y * tm[7] + tm[15];
- bbProj[1][1] =
- (rect.x + rect.width) * tm[1] + rect.y * tm[5] +
- tm[13];
- bbProj[1][1] /= (rect.x + rect.width) * tm[3] +
- rect.y * tm[7] + tm[15];
- bbProj[2][0] =
- rect.x * tm[0] + (rect.y + rect.height) * tm[4] +
- tm[12];
- bbProj[2][0] /= rect.x * tm[3] + (rect.y +
- rect.height) * tm[7] +
- tm[15];
- bbProj[2][1] =
- rect.x * tm[1] + (rect.y + rect.height) * tm[5] +
- tm[13];
- bbProj[2][1] /= rect.x * tm[3] + (rect.y +
- rect.height) * tm[7] +
- tm[15];
- bbProj[3][0] =
- (rect.x + rect.width) * tm[0] + (rect.y +
- rect.height) * tm[4] +
- tm[12];
- bbProj[3][0] /= (rect.x + rect.width) * tm[3] + (rect.y +
- rect.
- height) *
- tm[7] + tm[15];
- bbProj[3][1] =
- (rect.x + rect.width) * tm[1] + (rect.y +
- rect.height) * tm[5] +
- tm[13];
- bbProj[3][1] /= (rect.x + rect.width) * tm[3] + (rect.y +
- rect.
- height) *
- tm[7] + tm[15];
-
- // calculate a bounding box of the projected rectangle
- bBox[0] = MIN(s->outputDev[bs->output].region.extents.x2, bbProj[0][0]);
- bBox[0] = MIN(bBox[0], bbProj[1][0]);
- bBox[0] = MIN(bBox[0], bbProj[2][0]);
- bBox[0] = MIN(bBox[0], bbProj[3][0]);
- bBox[0] = MAX(bBox[0], s->outputDev[bs->output].region.extents.x1);
-
- bBox[1] = MIN(s->outputDev[bs->output].region.extents.y2, bbProj[0][1]);
- bBox[1] = MIN(bBox[1], bbProj[1][1]);
- bBox[1] = MIN(bBox[1], bbProj[2][1]);
- bBox[1] = MIN(bBox[1], bbProj[3][1]);
- bBox[1] = MAX(bBox[1], s->outputDev[bs->output].region.extents.y1);
-
- bBox[2] = MAX(s->outputDev[bs->output].region.extents.x1, bbProj[0][0]);
- bBox[2] = MAX(bBox[2], bbProj[1][0]);
- bBox[2] = MAX(bBox[2], bbProj[2][0]);
- bBox[2] = MAX(bBox[2], bbProj[3][0]);
- bBox[2] = MIN(bBox[2], s->outputDev[bs->output].region.extents.x2);
-
- bBox[3] = MAX(s->outputDev[bs->output].region.extents.y1, bbProj[0][1]);
- bBox[3] = MAX(bBox[3], bbProj[1][1]);
- bBox[3] = MAX(bBox[3], bbProj[2][1]);
- bBox[3] = MAX(bBox[3], bbProj[3][1]);
- bBox[3] = MIN(bBox[3], s->outputDev[bs->output].region.extents.y2);
-
- if (bBox[2] - bBox[0] <= 0 || bBox[3] - bBox[1] <= 0)
- continue;
-
- sRect.x = floor(bBox[0] / bs->downSample);
- sRect.y = floor(bBox[1] / bs->downSample);
- sRect.width =
- MAX(1.0, ceil(bBox[2] / bs->downSample) - sRect.x);
- sRect.height =
- MAX(1.0, ceil(bBox[3] / bs->downSample) - sRect.y);
-
-
- bRect.x = sRect.x * bs->downSample;
- bRect.y = sRect.y * bs->downSample;
- bRect.width = sRect.width * bs->downSample;
- bRect.height = sRect.height * bs->downSample;
-
- glLoadIdentity();
- prepareXCoords(s, bs->output, -DEFAULT_Z_CAMERA);
-
- // copy background into temporary texture
- enableBlurfxTexture(&bs->blurTempTexV,
- COMP_TEXTURE_FILTER_GOOD);
- glCopyTexSubImage2D(bs->blurTempTexV.target, 0, 0, 0,
- bRect.x,
- s->height - bRect.y - bRect.height,
- bRect.width, bRect.height);
-
- // draw downsampled texture
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height);
- glVertex2f(bRect.x + sRect.width, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-
- float shift = bs->downSample / 2.0;
-
-
- glColor4f(1.0, 1.0, 1.0, 0.5);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0 + shift, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0 + shift, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width + shift, bRect.height);
- glVertex2f(bRect.x + sRect.width, bRect.y + sRect.height);
- glTexCoord2f(bRect.width + shift, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.333);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0 - shift, 0);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0 - shift, bRect.height);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width - shift, bRect.height);
- glVertex2f(bRect.x + sRect.width, bRect.y + sRect.height);
- glTexCoord2f(bRect.width - shift, 0);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.25);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0 - shift);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height - shift);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height - shift);
- glVertex2f(bRect.x + sRect.width, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0 - shift);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
- glColor4f(1.0, 1.0, 1.0, 0.2);
-
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0 + shift);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, bRect.height + shift);
- glVertex2f(bRect.x, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, bRect.height + shift);
- glVertex2f(bRect.x + sRect.width, bRect.y + sRect.height);
- glTexCoord2f(bRect.width, 0 + shift);
- glVertex2f(bRect.x + sRect.width, bRect.y);
- glEnd();
-
-
- glDisable(GL_BLEND);
- // copy downsampled background into temporary texture
- switchBlurfxTexture(&bs->blurTempTexV, &bs->blurTempTexH,
- COMP_TEXTURE_FILTER_GOOD);
- glCopyTexSubImage2D(bs->blurTempTexV.target, 0, sRect.x,
- sRect.y +
- ((s->height -
- s->outputDev[bs->output].region.
- extents.y2) / bs->downSample),
- bRect.x,
- s->height - bRect.y - sRect.height,
- sRect.width, sRect.height);
-
- // copy normal background back to screen
- switchBlurfxTexture(&bs->blurTempTexH, &bs->blurTempTexV,
- COMP_TEXTURE_FILTER_GOOD);
-
- glBegin(GL_QUADS);
- glTexCoord2f(0, bRect.height);
- glVertex2f(bRect.x, bRect.y);
- glTexCoord2f(0, 0);
- glVertex2f(bRect.x, bRect.y + bRect.height);
- glTexCoord2f(bRect.width, 0);
- glVertex2f(bRect.x + bRect.width, bRect.y + bRect.height);
- glTexCoord2f(bRect.width, bRect.height);
- glVertex2f(bRect.x + bRect.width, bRect.y);
- glEnd();
-
- disableBlurfxTexture(&bs->blurTempTexV);
-
- }
-
- glPopMatrix();
-
- if (enable_light)
- glEnable(GL_LIGHTING);
-
- if (enable_stencil)
- glEnable(GL_STENCIL_TEST);
-
- XDestroyRegion(reblurRegion);
+ if (bx2 - bx1 > 0 && by2 - by1 > 0
+ && (mask & PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ rect.x = attrib->xTranslate +
+ (((bx1 - 7) - w->attrib.x) * attrib->xScale) + w->attrib.x;
+ rect.y =
+ attrib->yTranslate +
+ (((by1 - 1) - w->attrib.y) * attrib->yScale) + w->attrib.y;
+ rect.width = (bx2 - bx1 + 14) * attrib->xScale;
+ rect.height = (by2 - by1 + 2) * attrib->yScale;
+
+ XUnionRectWithRegion (&rect, reblurRegion, reblurRegion);
+ }
+
+ XIntersectRegion (reblurRegion, &s->region, reblurRegion);
+
+ XSubtractRegion (reblurRegion, bs->blurredRegion, reblurRegion);
+
+ // subtract occluded region
+ if (bs->od_active)
+ XSubtractRegion (reblurRegion, bw->clip, reblurRegion);
+
+ // subtract blur cache texture region
+ if (bw->texUpdated)
+ XSubtractRegion (reblurRegion, bw->bTexRegion, reblurRegion);
+
+ if (!reblurRegion->numRects)
+ {
+ XDestroyRegion (reblurRegion);
+ return;
+ }
+
+ XUnionRegion (reblurRegion, bs->blurredRegion, bs->blurredRegion);
+
+ glPushMatrix ();
+
+ // enable projective texture cooridinate generation
+ float bm[16] = { s->outputDev[bs->output].width / 2.0, 0, 0, 0,
+ 0, s->outputDev[bs->output].height / -2.0, 0, 0,
+ 0, 0, 1, 0,
+ s->outputDev[bs->output].width / 2.0 +
+ s->outputDev[bs->output].region.extents.x1,
+ s->outputDev[bs->output].height / 2.0 +
+ s->outputDev[bs->output].region.extents.y1, 1, 1
+ };
+ float bpm[16];
+ float tm[16];
+
+ bw->mvm_updated = FALSE;
+ glGetFloatv (GL_MODELVIEW_MATRIX, bw->mvm);
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, bw->mvm, tm);
+
+ Bool enable_light = FALSE;
+
+ if (glIsEnabled (GL_LIGHTING))
+ {
+ glDisable (GL_LIGHTING);
+ enable_light = TRUE;
+ }
+
+ Bool enable_stencil = FALSE;
+
+ if (glIsEnabled (GL_STENCIL_TEST))
+ {
+ glDisable (GL_STENCIL_TEST);
+ enable_stencil = TRUE;
+ }
+
+ int i;
+ XRectangle sRect, bRect;
+ for (i = 0; i < reblurRegion->numRects; i++)
+ {
+
+ rect.x = reblurRegion->rects[i].x1;
+ rect.y = reblurRegion->rects[i].y1;
+ rect.width = reblurRegion->rects[i].x2 - rect.x;
+ rect.height = reblurRegion->rects[i].y2 - rect.y;
+
+ // check region for visibility and project it to screen
+ float bbProj[4][2];
+ float bBox[4];
+
+ bbProj[0][0] = rect.x * tm[0] + rect.y * tm[4] + tm[12];
+ bbProj[0][0] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
+ bbProj[0][1] = rect.x * tm[1] + rect.y * tm[5] + tm[13];
+ bbProj[0][1] /= rect.x * tm[3] + rect.y * tm[7] + tm[15];
+ bbProj[1][0] =
+ (rect.x + rect.width) * tm[0] + rect.y * tm[4] + tm[12];
+ bbProj[1][0] /= (rect.x + rect.width) * tm[3] +
+ rect.y * tm[7] + tm[15];
+ bbProj[1][1] =
+ (rect.x + rect.width) * tm[1] + rect.y * tm[5] + tm[13];
+ bbProj[1][1] /= (rect.x + rect.width) * tm[3] +
+ rect.y * tm[7] + tm[15];
+ bbProj[2][0] =
+ rect.x * tm[0] + (rect.y + rect.height) * tm[4] + tm[12];
+ bbProj[2][0] /= rect.x * tm[3] + (rect.y +
+ rect.height) * tm[7] + tm[15];
+ bbProj[2][1] =
+ rect.x * tm[1] + (rect.y + rect.height) * tm[5] + tm[13];
+ bbProj[2][1] /= rect.x * tm[3] + (rect.y +
+ rect.height) * tm[7] + tm[15];
+ bbProj[3][0] =
+ (rect.x + rect.width) * tm[0] + (rect.y +
+ rect.height) * tm[4] + tm[12];
+ bbProj[3][0] /= (rect.x + rect.width) * tm[3] + (rect.y +
+ rect.
+ height) *
+ tm[7] + tm[15];
+ bbProj[3][1] =
+ (rect.x + rect.width) * tm[1] + (rect.y +
+ rect.height) * tm[5] + tm[13];
+ bbProj[3][1] /= (rect.x + rect.width) * tm[3] + (rect.y +
+ rect.
+ height) *
+ tm[7] + tm[15];
+
+ // calculate a bounding box of the projected rectangle
+ bBox[0] =
+ MIN (s->outputDev[bs->output].region.extents.x2, bbProj[0][0]);
+ bBox[0] = MIN (bBox[0], bbProj[1][0]);
+ bBox[0] = MIN (bBox[0], bbProj[2][0]);
+ bBox[0] = MIN (bBox[0], bbProj[3][0]);
+ bBox[0] = MAX (bBox[0], s->outputDev[bs->output].region.extents.x1);
+
+ bBox[1] =
+ MIN (s->outputDev[bs->output].region.extents.y2, bbProj[0][1]);
+ bBox[1] = MIN (bBox[1], bbProj[1][1]);
+ bBox[1] = MIN (bBox[1], bbProj[2][1]);
+ bBox[1] = MIN (bBox[1], bbProj[3][1]);
+ bBox[1] = MAX (bBox[1], s->outputDev[bs->output].region.extents.y1);
+
+ bBox[2] =
+ MAX (s->outputDev[bs->output].region.extents.x1, bbProj[0][0]);
+ bBox[2] = MAX (bBox[2], bbProj[1][0]);
+ bBox[2] = MAX (bBox[2], bbProj[2][0]);
+ bBox[2] = MAX (bBox[2], bbProj[3][0]);
+ bBox[2] = MIN (bBox[2], s->outputDev[bs->output].region.extents.x2);
+
+ bBox[3] =
+ MAX (s->outputDev[bs->output].region.extents.y1, bbProj[0][1]);
+ bBox[3] = MAX (bBox[3], bbProj[1][1]);
+ bBox[3] = MAX (bBox[3], bbProj[2][1]);
+ bBox[3] = MAX (bBox[3], bbProj[3][1]);
+ bBox[3] = MIN (bBox[3], s->outputDev[bs->output].region.extents.y2);
+
+ if (bBox[2] - bBox[0] <= 0 || bBox[3] - bBox[1] <= 0)
+ continue;
+
+ sRect.x = floor (bBox[0] / bs->downSample);
+ sRect.y = floor (bBox[1] / bs->downSample);
+ sRect.width = MAX (1.0, ceil (bBox[2] / bs->downSample) - sRect.x);
+ sRect.height = MAX (1.0, ceil (bBox[3] / bs->downSample) - sRect.y);
+
+
+ bRect.x = sRect.x * bs->downSample;
+ bRect.y = sRect.y * bs->downSample;
+ bRect.width = sRect.width * bs->downSample;
+ bRect.height = sRect.height * bs->downSample;
+
+ glLoadIdentity ();
+ prepareXCoords (s, bs->output, -DEFAULT_Z_CAMERA);
+
+ // copy background into temporary texture
+ enableBlurfxTexture (&bs->blurTempTexV, COMP_TEXTURE_FILTER_GOOD);
+ glCopyTexSubImage2D (bs->blurTempTexV.target, 0, 0, 0,
+ bRect.x,
+ s->height - bRect.y - bRect.height,
+ bRect.width, bRect.height);
+
+ // draw downsampled texture
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+
+ float shift = bs->downSample / 2.0;
+
+
+ glColor4f (1.0, 1.0, 1.0, 0.5);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0 + shift, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0 + shift, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width + shift, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width + shift, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.333);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0 - shift, 0);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0 - shift, bRect.height);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width - shift, bRect.height);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width - shift, 0);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.25);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0 - shift);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height - shift);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height - shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0 - shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+ glColor4f (1.0, 1.0, 1.0, 0.2);
+
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, 0 + shift);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, bRect.height + shift);
+ glVertex2f (bRect.x, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, bRect.height + shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y + sRect.height);
+ glTexCoord2f (bRect.width, 0 + shift);
+ glVertex2f (bRect.x + sRect.width, bRect.y);
+ glEnd ();
+
+
+ glDisable (GL_BLEND);
+ // copy downsampled background into temporary texture
+ switchBlurfxTexture (&bs->blurTempTexV, &bs->blurTempTexH,
+ COMP_TEXTURE_FILTER_GOOD);
+ glCopyTexSubImage2D (bs->blurTempTexV.target, 0, sRect.x,
+ sRect.y +
+ ((s->height -
+ s->outputDev[bs->output].region.
+ extents.y2) / bs->downSample),
+ bRect.x,
+ s->height - bRect.y - sRect.height,
+ sRect.width, sRect.height);
+
+ // copy normal background back to screen
+ switchBlurfxTexture (&bs->blurTempTexH, &bs->blurTempTexV,
+ COMP_TEXTURE_FILTER_GOOD);
+
+ glBegin (GL_QUADS);
+ glTexCoord2f (0, bRect.height);
+ glVertex2f (bRect.x, bRect.y);
+ glTexCoord2f (0, 0);
+ glVertex2f (bRect.x, bRect.y + bRect.height);
+ glTexCoord2f (bRect.width, 0);
+ glVertex2f (bRect.x + bRect.width, bRect.y + bRect.height);
+ glTexCoord2f (bRect.width, bRect.height);
+ glVertex2f (bRect.x + bRect.width, bRect.y);
+ glEnd ();
+
+ disableBlurfxTexture (&bs->blurTempTexV);
+
+ }
+
+ glPopMatrix ();
+
+ if (enable_light)
+ glEnable (GL_LIGHTING);
+
+ if (enable_stencil)
+ glEnable (GL_STENCIL_TEST);
+
+ XDestroyRegion (reblurRegion);
}
static void
-drawBlur(CompWindow * w, CompScreen * s, CompTexture * texture,
- const WindowPaintAttrib * attrib, int mask,
- CompTextureFilter filter)
+drawBlur (CompWindow * w, CompScreen * s, CompTexture * texture,
+ const WindowPaintAttrib * attrib, int mask,
+ CompTextureFilter filter)
{
- int i, count, vCount, iCount, stride;
- GLfloat *vertices;
- GLushort *indices;
- GLfloat constant[4];
-
- unsigned int actTex = 0;
-
- BLURFX_SCREEN(s);
- BLURFX_WINDOW(w);
-
- glPushMatrix();
-
- if (mask & PAINT_WINDOW_TRANSFORMED_MASK) {
- glTranslatef(w->attrib.x, w->attrib.y, 0.0f);
- glScalef(attrib->xScale, attrib->yScale, 0.0f);
- glTranslatef(attrib->xTranslate / attrib->xScale -
- w->attrib.x,
- attrib->yTranslate / attrib->yScale -
- w->attrib.y, 0.0f);
- }
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
-
- i = 0;
- count = 0;
- stride = (w->texUnits * w->texCoordSize + 2) * sizeof(GLfloat);
-
- // draw blur only for visible regions
- if (!(mask & PAINT_WINDOW_DECORATION_MASK) && !w->alpha
- && !(mask & PAINT_WINDOW_TRANSFORMED_MASK) && !w->shaded
- && bs->od_active) {
- Region drawBlurRegion = XCreateRegion();
-
- XIntersectRegion(w->region, bw->paintRegion,
- drawBlurRegion);
- if (bw->texUpdated)
- XIntersectRegion(drawBlurRegion, bw->bTexRegion,
- drawBlurRegion);
- XSubtractRegion(drawBlurRegion, bw->clip, drawBlurRegion);
-
- CompMatrix mat;
- mat.xx = 0.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = 0.0;
- mat.x0 = 0.0;
- mat.y0 = 0.0;
-
- genGeometry(&bs->vertArray, mat, 0, drawBlurRegion);
- stride = 4 * sizeof(GLfloat);
- vCount = bs->vertArray.vCount;
- iCount = 0;
- vertices = bs->vertArray.vertices + 2;
- XDestroyRegion(drawBlurRegion);
- }
-
- glVertexPointer(2, GL_FLOAT, stride, vertices);
- GLERR;
-
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- (*s->activeTexture) (GL_TEXTURE0_ARB);
-
- float tm[16];
-
- if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) || !bw->texUpdated) {
- // enable projective texture cooridinate generation
- float bm[16] =
- { s->outputDev[bs->output].width / (2.0 *
- bs->downSample), 0,
- 0, 0, 0,
- s->outputDev[bs->output].height / (2.0 *
- bs->downSample),
- 0, 0, 0, 0, 1, 0,
- s->outputDev[bs->output].width / (2.0 *
- bs->downSample) +
- (s->outputDev[bs->output].region.extents.x1 /
- bs->downSample),
- s->outputDev[bs->output].height / (2.0 *
- bs->
- downSample) +
- ((s->height -
- s->outputDev[bs->output].region.extents.y2) /
- bs->downSample), 1,
- 1
- };
- if (bs->downSample != 1.0)
- bm[5] *= -1;
- float bpm[16];
- //if (!bw->mvm_updated)
- {
- bw->mvm_updated = TRUE;
- glGetFloatv(GL_MODELVIEW_MATRIX, bw->mvm);
- }
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, bw->mvm, tm);
-
- float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
- float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
- float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
- float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGenfv(GL_R, GL_OBJECT_PLANE, r_gen);
- glTexGenfv(GL_Q, GL_OBJECT_PLANE, q_gen);
-
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glEnable(GL_TEXTURE_GEN_R);
- glEnable(GL_TEXTURE_GEN_Q);
- enableBlurfxTexture(&bs->blurTempTexH, filter);
-
- } else {
- // enable texture cooridinate generation
- float s_gen[4] = { 1.0 / bs->downSample, 0.0, 0.0,
- -bw->blurTex.x / bs->downSample
- };
-
- if (bs->downSample != 1.0) {
- float t_gen[4] = { 0.0, 1.0 / bs->downSample, 0.0,
- -bw->blurTex.y / bs->downSample
- };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- } else {
- float t_gen[4] =
- { 0.0, -1.0, 0.0,
- bw->blurTex.height + bw->blurTex.y };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- }
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- enableBlurfxTexture(&bw->blurTex, filter);
- }
-
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-
- // simple switcher detection hack
- Bool switcher = FALSE;
- if (w->resName == 0 && w->resClass == 0
- && (mask & PAINT_WINDOW_DECORATION_MASK)
- && screenGrabExist(s, "switcher", 0))
- switcher = TRUE;
-
- // we need alpha dependend blur if window has alpha channel
- if (((mask & PAINT_WINDOW_DECORATION_MASK)
- && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
- value.b) || switcher
- || (!(mask & PAINT_WINDOW_DECORATION_MASK)
- && w->alpha)) {
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
- actTex++;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_S);
- enableTexture(s, texture, filter);
- GLERR;
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 4.0);
-
- constant[3] = attrib->opacity / 65535.0f;
-
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
-
- (*s->clientActiveTexture) (GL_TEXTURE1_ARB);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, stride,
- vertices -
- (w->texUnits * w->texCoordSize));
- GLERR;
- } else {
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_CONSTANT);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- constant[3] = MIN(1.0, (attrib->opacity / 65535.0f) * 4.0);
-
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
-
- }
-
- if (s->canDoSlightlySaturated
- && bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f <
- 100.0) {
-
- actTex++;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
- enableBlurfxTexture(&bs->blurTempTexH, filter);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB,
- GL_PRIMARY_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB,
- GL_PRIMARY_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
-
- glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
-
- actTex++;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
- enableBlurfxTexture(&bs->blurTempTexH, filter);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ int i, count, vCount, iCount, stride;
+ GLfloat *vertices;
+ GLushort *indices;
+ GLfloat constant[4];
+
+ unsigned int actTex = 0;
+
+ BLURFX_SCREEN (s);
+ BLURFX_WINDOW (w);
+
+ glPushMatrix ();
+
+ if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
+ {
+ glTranslatef (w->attrib.x, w->attrib.y, 0.0f);
+ glScalef (attrib->xScale, attrib->yScale, 0.0f);
+ glTranslatef (attrib->xTranslate / attrib->xScale -
+ w->attrib.x,
+ attrib->yTranslate / attrib->yScale -
+ w->attrib.y, 0.0f);
+ }
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
+ {
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
+ }
+
+ if (vCount <= 0)
+ return;
- constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT;
- constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT;
- constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT;
- constant[3] = 1.0;
+ i = 0;
+ count = 0;
+ stride = (w->texUnits * w->texCoordSize + 2) * sizeof (GLfloat);
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
+ // draw blur only for visible regions
+ if (!(mask & PAINT_WINDOW_DECORATION_MASK) && !w->alpha
+ && !(mask & PAINT_WINDOW_TRANSFORMED_MASK) && !w->shaded
+ && bs->od_active)
+ {
+ Region drawBlurRegion = XCreateRegion ();
+
+ XIntersectRegion (w->region, bw->paintRegion, drawBlurRegion);
+ if (bw->texUpdated)
+ XIntersectRegion (drawBlurRegion, bw->bTexRegion, drawBlurRegion);
+ XSubtractRegion (drawBlurRegion, bw->clip, drawBlurRegion);
+
+ CompMatrix mat;
+ mat.xx = 0.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = 0.0;
+ mat.x0 = 0.0;
+ mat.y0 = 0.0;
+
+ genGeometry (&bs->vertArray, mat, 0, drawBlurRegion);
+ stride = 4 * sizeof (GLfloat);
+ vCount = bs->vertArray.vCount;
+ iCount = 0;
+ vertices = bs->vertArray.vertices + 2;
+ XDestroyRegion (drawBlurRegion);
+ }
+
+ glVertexPointer (2, GL_FLOAT, stride, vertices);
+ GLERR;
+
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ (*s->activeTexture) (GL_TEXTURE0_ARB);
+
+ float tm[16];
+
+ if ((mask & PAINT_WINDOW_TRANSFORMED_MASK) || !bw->texUpdated)
+ {
+ // enable projective texture cooridinate generation
+ float bm[16] =
+ { s->outputDev[bs->output].width / (2.0 * bs->downSample), 0,
+ 0, 0, 0,
+ s->outputDev[bs->output].height / (2.0 * bs->downSample),
+ 0, 0, 0, 0, 1, 0,
+ s->outputDev[bs->output].width / (2.0 *
+ bs->downSample) +
+ (s->outputDev[bs->output].region.extents.x1 / bs->downSample),
+ s->outputDev[bs->output].height / (2.0 *
+ bs->
+ downSample) +
+ ((s->height -
+ s->outputDev[bs->output].region.extents.y2) /
+ bs->downSample), 1,
+ 1
+ };
+ if (bs->downSample != 1.0)
+ bm[5] *= -1;
+ float bpm[16];
+ //if (!bw->mvm_updated)
+ {
+ bw->mvm_updated = TRUE;
+ glGetFloatv (GL_MODELVIEW_MATRIX, bw->mvm);
+ }
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, bw->mvm, tm);
+
+ float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
+ float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
+ float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
+ float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGenfv (GL_R, GL_OBJECT_PLANE, r_gen);
+ glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen);
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glEnable (GL_TEXTURE_GEN_R);
+ glEnable (GL_TEXTURE_GEN_Q);
+ enableBlurfxTexture (&bs->blurTempTexH, filter);
+
+ }
+ else
+ {
+ // enable texture cooridinate generation
+ float s_gen[4] = { 1.0 / bs->downSample, 0.0, 0.0,
+ -bw->blurTex.x / bs->downSample
+ };
+
+ if (bs->downSample != 1.0)
+ {
+ float t_gen[4] = { 0.0, 1.0 / bs->downSample, 0.0,
+ -bw->blurTex.y / bs->downSample
+ };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ }
+ else
+ {
+ float t_gen[4] = { 0.0, -1.0, 0.0,
+ bw->blurTex.height + bw->blurTex.y
+ };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ }
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ enableBlurfxTexture (&bw->blurTex, filter);
+ }
+
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ // simple switcher detection hack
+ Bool switcher = FALSE;
+ if (w->resName == 0 && w->resClass == 0
+ && (mask & PAINT_WINDOW_DECORATION_MASK)
+ && screenGrabExist (s, "switcher", 0))
+ switcher = TRUE;
+
+ // we need alpha dependend blur if window has alpha channel
+ if (((mask & PAINT_WINDOW_DECORATION_MASK)
+ && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
+ value.b) || switcher
+ || (!(mask & PAINT_WINDOW_DECORATION_MASK) && w->alpha))
+ {
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ actTex++;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_S);
+ enableTexture (s, texture, filter);
+ GLERR;
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_ALPHA_SCALE, 4.0);
+
+ constant[3] = attrib->opacity / 65535.0f;
+
+ glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
+
+ (*s->clientActiveTexture) (GL_TEXTURE1_ARB);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer (2, GL_FLOAT, stride,
+ vertices - (w->texUnits * w->texCoordSize));
+ GLERR;
+ }
+ else
+ {
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- actTex++;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
- enableBlurfxTexture(&bs->blurTempTexH, filter);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_CONSTANT);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ constant[3] = MIN (1.0, (attrib->opacity / 65535.0f) * 4.0);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
+ glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ }
- constant[3] =
- bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f /
- 100.0;
+ if (s->canDoSlightlySaturated
+ && bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f < 100.0)
+ {
- glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
- }
+ actTex++;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ enableBlurfxTexture (&bs->blurTempTexH, filter);
- // draw blur
- if (iCount) {
- glDrawElements(GL_QUADS, iCount, GL_UNSIGNED_SHORT,
- indices);
- GLERR;
- } else {
- glDrawArrays(GL_QUADS, 0, vCount);
- GLERR;
- }
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- // set all back to normal
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PRIMARY_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
- if (s->canDoSlightlySaturated
- && bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f <
- 100.0) {
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glColor4f (1.0f, 1.0f, 1.0f, 0.5f);
- disableBlurfxTexture(&bs->blurTempTexH);
- actTex--;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ actTex++;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ enableBlurfxTexture (&bs->blurTempTexH, filter);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_R);
- glDisable(GL_TEXTURE_GEN_Q);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
- disableBlurfxTexture(&bs->blurTempTexH);
- actTex--;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ constant[0] = 0.5f + 0.5f * RED_SATURATION_WEIGHT;
+ constant[1] = 0.5f + 0.5f * GREEN_SATURATION_WEIGHT;
+ constant[2] = 0.5f + 0.5f * BLUE_SATURATION_WEIGHT;
+ constant[3] = 1.0;
- disableBlurfxTexture(&bs->blurTempTexH);
- actTex--;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
- }
+ actTex++;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ enableBlurfxTexture (&bs->blurTempTexH, filter);
- if (((mask & PAINT_WINDOW_DECORATION_MASK)
- && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
- value.b) || switcher
- || (!(mask & PAINT_WINDOW_DECORATION_MASK)
- && w->alpha)) {
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- disableTexture(s, texture);
- GLERR;
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
+ constant[3] =
+ bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f / 100.0;
- glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0);
+ glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, constant);
+ }
- (*s->clientActiveTexture) (GL_TEXTURE0_ARB);
- actTex--;
- (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+ // draw blur
+ if (iCount)
+ {
+ glDrawElements (GL_QUADS, iCount, GL_UNSIGNED_SHORT, indices);
+ GLERR;
+ }
+ else
+ {
+ glDrawArrays (GL_QUADS, 0, vCount);
+ GLERR;
+ }
- }
+ // set all back to normal
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ if (s->canDoSlightlySaturated
+ && bs->opt[BLURFX_SCREEN_OPTION_BLUR_SATURATION].value.f < 100.0)
+ {
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
- glDisable(GL_TEXTURE_RECTANGLE_ARB);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_R);
- glDisable(GL_TEXTURE_GEN_Q);
- glDisable(GL_BLEND);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glPopMatrix();
- GLERR;
+ disableBlurfxTexture (&bs->blurTempTexH);
+ actTex--;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_R);
+ glDisable (GL_TEXTURE_GEN_Q);
+
+ disableBlurfxTexture (&bs->blurTempTexH);
+ actTex--;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ disableBlurfxTexture (&bs->blurTempTexH);
+ actTex--;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+
+ }
+
+ if (((mask & PAINT_WINDOW_DECORATION_MASK)
+ && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
+ value.b) || switcher
+ || (!(mask & PAINT_WINDOW_DECORATION_MASK) && w->alpha))
+ {
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+ disableTexture (s, texture);
+ GLERR;
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0);
+
+ (*s->clientActiveTexture) (GL_TEXTURE0_ARB);
+ actTex--;
+ (*s->activeTexture) (GL_TEXTURE0_ARB + actTex);
+
+ }
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
+ glDisable (GL_TEXTURE_RECTANGLE_ARB);
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_R);
+ glDisable (GL_TEXTURE_GEN_Q);
+ glDisable (GL_BLEND);
+
+ glPopMatrix ();
+ GLERR;
}
static void
-drawReflection(CompWindow * w, CompScreen * s, CompTexture * texture,
- const WindowPaintAttrib * attrib, int mask,
- CompTextureFilter filter)
+drawReflection (CompWindow * w, CompScreen * s, CompTexture * texture,
+ const WindowPaintAttrib * attrib, int mask,
+ CompTextureFilter filter)
{
- int vCount, iCount;
- GLfloat *vertices;
- GLushort *indices;
-
- float dx, dy;
-
- BLURFX_SCREEN(w->screen);
- BLURFX_WINDOW(w);
-
- glPushMatrix();
-
- if (mask & PAINT_WINDOW_TRANSFORMED_MASK) {
- glTranslatef(w->attrib.x, w->attrib.y, 0.0f);
- glScalef(attrib->xScale, attrib->yScale, 0.0f);
- glTranslatef(attrib->xTranslate / attrib->xScale -
- w->attrib.x,
- attrib->yTranslate / attrib->yScale -
- w->attrib.y, 0.0f);
-
- }
- // setup reflection texture scaling
- if (bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_SCALE].value.b) {
- if (bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL].
- value.b) {
-
- dx = 1.0 /
- (((s->width / bs->modTex.width) *
- bs->modTex.height >
- s->height) ? (s->height /
- bs->modTex.height) *
- bs->modTex.width : s->width);
- dy = 1.0 /
- (((s->width / bs->modTex.width) *
- bs->modTex.height >
- s->height) ? s->height : (s->width /
- bs->modTex.width) *
- bs->modTex.height);
- } else {
- dx = 1.0 / s->width;
- dy = 1.0 / s->height;
- }
- } else {
- dx = 1.0 / bs->modTex.width;
- dy = 1.0 / bs->modTex.height;
- }
-
-
- // Do we have an decoration vertex array thet does not contain shadows?
- if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount) {
- vertices =
- bw->decoArray.vertices +
- (w->texUnits * w->texCoordSize);
- indices = bw->decoArray.indices;
- vCount = bw->decoArray.vCount;
- iCount = bw->decoArray.indexCount;
- } else {
- vertices = w->vertices + (w->texUnits * w->texCoordSize);
- indices = w->indices;
- vCount = w->vCount;
- iCount = w->indexCount;
- }
-
- if (vCount <= 0)
- return;
-
- int stride = (w->texUnits * w->texCoordSize + 2) * sizeof(GLfloat);
-
- // draw reflection only for visible regions
- if (!(mask & PAINT_WINDOW_DECORATION_MASK) && !w->alpha
- && !(mask & PAINT_WINDOW_TRANSFORMED_MASK) && !w->shaded) {
- Region drawBlurRegion = XCreateRegion();
-
- XIntersectRegion(w->region, bw->paintRegion,
- drawBlurRegion);
- XSubtractRegion(drawBlurRegion, bw->clip, drawBlurRegion);
-
- CompMatrix mat;
- mat.xx = 0.0;
- mat.yx = 0.0;
- mat.xy = 0.0;
- mat.yy = 0.0;
- mat.x0 = 0.0;
- mat.y0 = 0.0;
-
- genGeometry(&bs->vertArray, mat, 0, drawBlurRegion);
- stride = 4 * sizeof(GLfloat);
- vCount = bs->vertArray.vCount;
- iCount = 0;
- vertices = bs->vertArray.vertices + 2;
- XDestroyRegion(drawBlurRegion);
- }
-
- glVertexPointer(2, GL_FLOAT, stride, vertices);
-
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-
- (*s->activeTexture) (GL_TEXTURE0_ARB);
- enableBlurfxTexture(&bs->modTex, filter);
-
- if (mask &
- (PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK |
- PAINT_WINDOW_TRANSFORMED_MASK)) {
- // enable projective texture cooridinate generation
- float bm[16] =
- { (s->width * dx) / 2.0, 0, 0, 0, 0,
- (s->height * dy) / -2.0, 0,
- 0, 0, 0, 1, 0, (s->width * dx) / 2.0,
- (s->height * dy) / 2.0, 1, 1
- };
- float bpm[16];
- float tm[16];
- float mvm[16];
- glPushMatrix();
- glLoadIdentity();
- glTranslatef(-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
- glScalef(1.0f / s->width, -1.0f / s->height, 1.0f);
- glTranslatef(0.0f, -s->height, 0.0f);
-
- if (mask & PAINT_WINDOW_TRANSFORMED_MASK) {
- glTranslatef(w->attrib.x, w->attrib.y, 0.0f);
- glScalef(attrib->xScale, attrib->yScale, 0.0f);
- glTranslatef(attrib->xTranslate / attrib->xScale -
- w->attrib.x,
- attrib->yTranslate / attrib->yScale -
- w->attrib.y, 0.0f);
- }
- glGetFloatv(GL_MODELVIEW_MATRIX, mvm);
- glPopMatrix();
-
- MULTM(bm, bs->pm, bpm);
- MULTM(bpm, mvm, tm);
-
- float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
- float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
- float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
- float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGenfv(GL_R, GL_OBJECT_PLANE, r_gen);
- glTexGenfv(GL_Q, GL_OBJECT_PLANE, q_gen);
-
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
-
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glEnable(GL_TEXTURE_GEN_R);
- glEnable(GL_TEXTURE_GEN_Q);
- } else {
- // enable texture cooridinate generation
- float s_gen[4] = { dx, 0.0, 0.0, 0.0 };
- float t_gen[4] = { 0.0, dy, 0.0, 0.0 };
- glTexGenfv(GL_T, GL_OBJECT_PLANE, t_gen);
- glTexGenfv(GL_S, GL_OBJECT_PLANE, s_gen);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- }
-
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-
- glColor4f(1.0, 1.0, 1.0, attrib->opacity / 65535.0f);
-
- // simple switcher detection hack
- Bool switcher = FALSE;
- if (w->resName == 0 && w->resClass == 0
- && (mask & PAINT_WINDOW_DECORATION_MASK)
- && screenGrabExist(s, "switcher", 0))
- switcher = TRUE;
-
- // we need alpha dependend reflection if window has alpha channel
- if (((mask & PAINT_WINDOW_DECORATION_MASK)
- && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
- value.b) || switcher
- || (!(mask & PAINT_WINDOW_DECORATION_MASK)
- && w->alpha)) {
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA,
- GL_PRIMARY_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
-
- (*s->activeTexture) (GL_TEXTURE1_ARB);
- enableTexture(s, texture, filter);
- GLERR;
-
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_S);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
-
- (*s->clientActiveTexture) (GL_TEXTURE1_ARB);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glTexCoordPointer(2, GL_FLOAT, stride,
- vertices -
- (w->texUnits * w->texCoordSize));
- } else {
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA,
- GL_PRIMARY_COLOR);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
- }
-
- // draw reflection
- if (iCount) {
- glDrawElements(GL_QUADS, iCount, GL_UNSIGNED_SHORT,
- indices);
- GLERR;
- } else {
- glDrawArrays(GL_QUADS, 0, vCount);
- GLERR;
- }
-
- // set all back to normal
- if (((mask & PAINT_WINDOW_DECORATION_MASK)
- && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
- value.b) || switcher
- || (!(mask & PAINT_WINDOW_DECORATION_MASK)
- && w->alpha)) {
- disableTexture(s, texture);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
-
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- (*s->clientActiveTexture) (GL_TEXTURE0_ARB);
- (*s->activeTexture) (GL_TEXTURE0_ARB);
- }
-
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
- glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
-
- disableBlurfxTexture(&bs->modTex);
-
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_TEXTURE_GEN_R);
- glDisable(GL_TEXTURE_GEN_Q);
-
- glPopMatrix();
-
- glDisable(GL_BLEND);
+ int vCount, iCount;
+ GLfloat *vertices;
+ GLushort *indices;
+
+ float dx, dy;
+
+ BLURFX_SCREEN (w->screen);
+ BLURFX_WINDOW (w);
+
+ glPushMatrix ();
+
+ if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
+ {
+ glTranslatef (w->attrib.x, w->attrib.y, 0.0f);
+ glScalef (attrib->xScale, attrib->yScale, 0.0f);
+ glTranslatef (attrib->xTranslate / attrib->xScale -
+ w->attrib.x,
+ attrib->yTranslate / attrib->yScale -
+ w->attrib.y, 0.0f);
+
+ }
+ // setup reflection texture scaling
+ if (bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_SCALE].value.b)
+ {
+ if (bs->opt[BLURFX_SCREEN_OPTION_REFLECTION_PROPORTIONAL].value.b)
+ {
+
+ dx = 1.0 /
+ (((s->width / bs->modTex.width) *
+ bs->modTex.height >
+ s->height) ? (s->height /
+ bs->modTex.height) *
+ bs->modTex.width : s->width);
+ dy = 1.0 /
+ (((s->width / bs->modTex.width) *
+ bs->modTex.height >
+ s->height) ? s->height : (s->width /
+ bs->modTex.width) *
+ bs->modTex.height);
+ }
+ else
+ {
+ dx = 1.0 / s->width;
+ dy = 1.0 / s->height;
+ }
+ }
+ else
+ {
+ dx = 1.0 / bs->modTex.width;
+ dy = 1.0 / bs->modTex.height;
+ }
+
+
+ // Do we have an decoration vertex array thet does not contain shadows?
+ if (mask & PAINT_WINDOW_DECORATION_MASK && bw->decoArray.vCount)
+ {
+ vertices = bw->decoArray.vertices + (w->texUnits * w->texCoordSize);
+ indices = bw->decoArray.indices;
+ vCount = bw->decoArray.vCount;
+ iCount = bw->decoArray.indexCount;
+ }
+ else
+ {
+ vertices = w->vertices + (w->texUnits * w->texCoordSize);
+ indices = w->indices;
+ vCount = w->vCount;
+ iCount = w->indexCount;
+ }
+
+ if (vCount <= 0)
+ return;
+
+ int stride = (w->texUnits * w->texCoordSize + 2) * sizeof (GLfloat);
+
+ // draw reflection only for visible regions
+ if (!(mask & PAINT_WINDOW_DECORATION_MASK) && !w->alpha
+ && !(mask & PAINT_WINDOW_TRANSFORMED_MASK) && !w->shaded)
+ {
+ Region drawBlurRegion = XCreateRegion ();
+
+ XIntersectRegion (w->region, bw->paintRegion, drawBlurRegion);
+ XSubtractRegion (drawBlurRegion, bw->clip, drawBlurRegion);
+
+ CompMatrix mat;
+ mat.xx = 0.0;
+ mat.yx = 0.0;
+ mat.xy = 0.0;
+ mat.yy = 0.0;
+ mat.x0 = 0.0;
+ mat.y0 = 0.0;
+
+ genGeometry (&bs->vertArray, mat, 0, drawBlurRegion);
+ stride = 4 * sizeof (GLfloat);
+ vCount = bs->vertArray.vCount;
+ iCount = 0;
+ vertices = bs->vertArray.vertices + 2;
+ XDestroyRegion (drawBlurRegion);
+ }
+
+ glVertexPointer (2, GL_FLOAT, stride, vertices);
+
+
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+
+ (*s->activeTexture) (GL_TEXTURE0_ARB);
+ enableBlurfxTexture (&bs->modTex, filter);
+
+ if (mask &
+ (PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK |
+ PAINT_WINDOW_TRANSFORMED_MASK))
+ {
+ // enable projective texture cooridinate generation
+ float bm[16] = { (s->width * dx) / 2.0, 0, 0, 0, 0,
+ (s->height * dy) / -2.0, 0,
+ 0, 0, 0, 1, 0, (s->width * dx) / 2.0,
+ (s->height * dy) / 2.0, 1, 1
+ };
+ float bpm[16];
+ float tm[16];
+ float mvm[16];
+ glPushMatrix ();
+ glLoadIdentity ();
+ glTranslatef (-0.5f, -0.5f, -DEFAULT_Z_CAMERA);
+ glScalef (1.0f / s->width, -1.0f / s->height, 1.0f);
+ glTranslatef (0.0f, -s->height, 0.0f);
+
+ if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
+ {
+ glTranslatef (w->attrib.x, w->attrib.y, 0.0f);
+ glScalef (attrib->xScale, attrib->yScale, 0.0f);
+ glTranslatef (attrib->xTranslate / attrib->xScale -
+ w->attrib.x,
+ attrib->yTranslate / attrib->yScale -
+ w->attrib.y, 0.0f);
+ }
+ glGetFloatv (GL_MODELVIEW_MATRIX, mvm);
+ glPopMatrix ();
+
+ MULTM (bm, bs->pm, bpm);
+ MULTM (bpm, mvm, tm);
+
+ float s_gen[4] = { tm[0], tm[4], tm[8], tm[12] };
+ float t_gen[4] = { tm[1], tm[5], tm[9], tm[13] };
+ float r_gen[4] = { tm[2], tm[6], tm[10], tm[14] };
+ float q_gen[4] = { tm[3], tm[7], tm[11], tm[15] };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGenfv (GL_R, GL_OBJECT_PLANE, r_gen);
+ glTexGenfv (GL_Q, GL_OBJECT_PLANE, q_gen);
+
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ glEnable (GL_TEXTURE_GEN_R);
+ glEnable (GL_TEXTURE_GEN_Q);
+ }
+ else
+ {
+ // enable texture cooridinate generation
+ float s_gen[4] = { dx, 0.0, 0.0, 0.0 };
+ float t_gen[4] = { 0.0, dy, 0.0, 0.0 };
+ glTexGenfv (GL_T, GL_OBJECT_PLANE, t_gen);
+ glTexGenfv (GL_S, GL_OBJECT_PLANE, s_gen);
+ glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glEnable (GL_TEXTURE_GEN_S);
+ glEnable (GL_TEXTURE_GEN_T);
+ }
+
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glColor4f (1.0, 1.0, 1.0, attrib->opacity / 65535.0f);
+
+ // simple switcher detection hack
+ Bool switcher = FALSE;
+ if (w->resName == 0 && w->resClass == 0
+ && (mask & PAINT_WINDOW_DECORATION_MASK)
+ && screenGrabExist (s, "switcher", 0))
+ switcher = TRUE;
+
+ // we need alpha dependend reflection if window has alpha channel
+ if (((mask & PAINT_WINDOW_DECORATION_MASK)
+ && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
+ value.b) || switcher
+ || (!(mask & PAINT_WINDOW_DECORATION_MASK) && w->alpha))
+ {
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+
+ (*s->activeTexture) (GL_TEXTURE1_ARB);
+ enableTexture (s, texture, filter);
+ GLERR;
+
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_S);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+
+ (*s->clientActiveTexture) (GL_TEXTURE1_ARB);
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer (2, GL_FLOAT, stride,
+ vertices - (w->texUnits * w->texCoordSize));
+ }
+ else
+ {
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+ }
+
+ // draw reflection
+ if (iCount)
+ {
+ glDrawElements (GL_QUADS, iCount, GL_UNSIGNED_SHORT, indices);
+ GLERR;
+ }
+ else
+ {
+ glDrawArrays (GL_QUADS, 0, vCount);
+ GLERR;
+ }
+
+ // set all back to normal
+ if (((mask & PAINT_WINDOW_DECORATION_MASK)
+ && !bs->opt[BLURFX_SCREEN_OPTION_DISABLE_DECORATION_ALPHADEP].
+ value.b) || switcher
+ || (!(mask & PAINT_WINDOW_DECORATION_MASK) && w->alpha))
+ {
+ disableTexture (s, texture);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
+
+ glDisableClientState (GL_TEXTURE_COORD_ARRAY);
+ (*s->clientActiveTexture) (GL_TEXTURE0_ARB);
+ (*s->activeTexture) (GL_TEXTURE0_ARB);
+ }
+
+ glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE);
+ glTexEnvf (GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS);
+
+ disableBlurfxTexture (&bs->modTex);
+
+ glDisable (GL_TEXTURE_GEN_S);
+ glDisable (GL_TEXTURE_GEN_T);
+ glDisable (GL_TEXTURE_GEN_R);
+ glDisable (GL_TEXTURE_GEN_Q);
+
+ glPopMatrix ();
+
+ glDisable (GL_BLEND);
}
// activate/deactivate motion blur
static Bool
-blurfxToggleMotionBlur(CompDisplay * d, CompAction * ac,
- CompActionState state, CompOption * option,
- int nOption)
+blurfxToggleMotionBlur (CompDisplay * d, CompAction * ac,
+ CompActionState state, CompOption * option,
+ int nOption)
{
- CompScreen *s;
-
- s = findScreenAtDisplay(d,
- getIntOptionNamed(option, nOption, "root",
- 0));
- if (s) {
- BLURFX_SCREEN(s);
- bs->mb_activated = !bs->mb_activated;
- bs->mb_activated &= bs->mblur_supported;
- }
- return FALSE;
+ CompScreen *s;
+
+ s = findScreenAtDisplay (d,
+ getIntOptionNamed (option, nOption, "root", 0));
+ if (s)
+ {
+ BLURFX_SCREEN (s);
+ bs->mb_activated = !bs->mb_activated;
+ bs->mb_activated &= bs->mblur_supported;
+ }
+ return FALSE;
}
// bind our fbo and bind the texture to it
-static Bool bindFbo(CompScreen * s, BlurTexture tex)
+static Bool
+bindFbo (CompScreen * s, BlurTexture tex)
{
- BLURFX_SCREEN(s);
-
- GLERR;
-
- (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, bs->fbo);
- (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_RECTANGLE_ARB, tex.handle,
- 0);
-
- if (bs->rb_supported) {
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, bs->rb);
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, bs->rb);
- s->framebufferRenderbuffer(GL_FRAMEBUFFER_EXT,
- GL_STENCIL_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, bs->rb);
- }
-
- if (!bs->fboStatus) {
- bs->fboStatus =
- (*s->checkFramebufferStatus) (GL_FRAMEBUFFER_EXT);
- if (bs->fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT) {
- (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0);
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
- printf("Framebuffer attach failed\n");
- bs->fboStatus = 0;
- bs->fboActive = FALSE;
- return FALSE;
- }
- }
- //Set the draw buffer
- glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
- glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- glDepthRange(0, 1);
- glViewport(-1, -1, 2, 2);
- glRasterPos2f(0, 0);
- glViewport(s->outputDev[bs->output].region.extents.x1,
- s->height - s->outputDev[bs->output].region.extents.y2,
- s->outputDev[bs->output].width,
- s->outputDev[bs->output].height);
-
- prepareXCoords(s, bs->output, -DEFAULT_Z_CAMERA);
-
- bs->fboActive = TRUE;
-
- GLERR;
-
- return TRUE;
+ BLURFX_SCREEN (s);
+
+ GLERR;
+
+ (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, bs->fbo);
+ (*s->framebufferTexture2D) (GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_TEXTURE_RECTANGLE_ARB, tex.handle, 0);
+
+ if (bs->rb_supported)
+ {
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, bs->rb);
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, bs->rb);
+ s->framebufferRenderbuffer (GL_FRAMEBUFFER_EXT,
+ GL_STENCIL_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, bs->rb);
+ }
+
+ if (!bs->fboStatus)
+ {
+ bs->fboStatus = (*s->checkFramebufferStatus) (GL_FRAMEBUFFER_EXT);
+ if (bs->fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT)
+ {
+ (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0);
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, 0);
+ printf ("Framebuffer attach failed\n");
+ bs->fboStatus = 0;
+ bs->fboActive = FALSE;
+ return FALSE;
+ }
+ }
+ //Set the draw buffer
+ glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);
+ glReadBuffer (GL_COLOR_ATTACHMENT0_EXT);
+
+ glMatrixMode (GL_PROJECTION);
+ glPushMatrix ();
+ glMatrixMode (GL_MODELVIEW);
+ glPushMatrix ();
+ glLoadIdentity ();
+ glDepthRange (0, 1);
+ glViewport (-1, -1, 2, 2);
+ glRasterPos2f (0, 0);
+ glViewport (s->outputDev[bs->output].region.extents.x1,
+ s->height - s->outputDev[bs->output].region.extents.y2,
+ s->outputDev[bs->output].width,
+ s->outputDev[bs->output].height);
+
+ prepareXCoords (s, bs->output, -DEFAULT_Z_CAMERA);
+
+ bs->fboActive = TRUE;
+
+ GLERR;
+
+ return TRUE;
}
// unbind the fbo and set everything back to normal
-static void unbindFbo(CompScreen * s)
+static void
+unbindFbo (CompScreen * s)
{
- BLURFX_SCREEN(s);
- GLERR;
- // unbind fbo
- (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0);
- if (bs->rb_supported) {
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
- }
- // set alles back to normal
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glDepthRange(0, 1);
- glViewport(-1, -1, 2, 2);
- glRasterPos2f(0, 0);
- s->rasterX = s->rasterY = 0;
- glViewport(s->outputDev[bs->output].region.extents.x1,
- s->height - s->outputDev[bs->output].region.extents.y2,
- s->outputDev[bs->output].width,
- s->outputDev[bs->output].height);
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
-
- glDrawBuffer(GL_BACK);
- glReadBuffer(GL_BACK);
-
- bs->fboActive = FALSE;
-
- GLERR;
+ BLURFX_SCREEN (s);
+ GLERR;
+ // unbind fbo
+ (*s->bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0);
+ if (bs->rb_supported)
+ {
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, 0);
+ }
+ // set alles back to normal
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glDepthRange (0, 1);
+ glViewport (-1, -1, 2, 2);
+ glRasterPos2f (0, 0);
+ s->rasterX = s->rasterY = 0;
+ glViewport (s->outputDev[bs->output].region.extents.x1,
+ s->height - s->outputDev[bs->output].region.extents.y2,
+ s->outputDev[bs->output].width,
+ s->outputDev[bs->output].height);
+
+ glMatrixMode (GL_PROJECTION);
+ glPopMatrix ();
+ glMatrixMode (GL_MODELVIEW);
+ glPopMatrix ();
+
+ glDrawBuffer (GL_BACK);
+ glReadBuffer (GL_BACK);
+
+ bs->fboActive = FALSE;
+
+ GLERR;
}
// generate a vertex and coordinate aray for the given region
static void
-genGeometry(BlurfxVertArray * vA, CompMatrix matrix, int xextend,
- Region region)
+genGeometry (BlurfxVertArray * vA, CompMatrix matrix, int xextend,
+ Region region)
{
- BoxPtr pBox;
- int nBox;
- int vSize;
- int n, x1, y1, x2, y2;
- GLfloat *d;
+ BoxPtr pBox;
+ int nBox;
+ int vSize;
+ int n, x1, y1, x2, y2;
+ GLfloat *d;
- pBox = region->rects;
- nBox = region->numRects;
+ pBox = region->rects;
+ nBox = region->numRects;
- vSize = 4;
+ vSize = 4;
- n = 0;
+ n = 0;
- if (nBox * vSize * 4 > vA->vertexSize) {
- if (!moreVertices(vA, nBox * vSize * 4))
- return;
- }
+ if (nBox * vSize * 4 > vA->vertexSize)
+ {
+ if (!moreVertices (vA, nBox * vSize * 4))
+ return;
+ }
- d = vA->vertices;
+ d = vA->vertices;
- while (nBox--) {
- x1 = pBox->x1 - xextend;
- y1 = pBox->y1;
- x2 = pBox->x2 + xextend;
- y2 = pBox->y2;
+ while (nBox--)
+ {
+ x1 = pBox->x1 - xextend;
+ y1 = pBox->y1;
+ x2 = pBox->x2 + xextend;
+ y2 = pBox->y2;
- pBox++;
+ pBox++;
- if (x1 < x2 && y1 < y2) {
- BFX_ADD_RECT(d, matrix, x1, y1, x2, y2);
- n++;
- }
- }
- vA->vCount = n * 4;
+ if (x1 < x2 && y1 < y2)
+ {
+ BFX_ADD_RECT (d, matrix, x1, y1, x2, y2);
+ n++;
+ }
+ }
+ vA->vCount = n * 4;
}
// helper function for genGeometry
-static Bool moreVertices(BlurfxVertArray * vA, int newSize)
+static Bool
+moreVertices (BlurfxVertArray * vA, int newSize)
{
- if (newSize > vA->vertexSize) {
- GLfloat *vertices;
- vertices =
- realloc(vA->vertices, sizeof(GLfloat) * newSize);
- if (!vertices)
- return FALSE;
-
- vA->vertices = vertices;
- vA->vertexSize = newSize;
- }
- return TRUE;
+ if (newSize > vA->vertexSize)
+ {
+ GLfloat *vertices;
+ vertices = realloc (vA->vertices, sizeof (GLfloat) * newSize);
+ if (!vertices)
+ return FALSE;
+
+ vA->vertices = vertices;
+ vA->vertexSize = newSize;
+ }
+ return TRUE;
}
// does opengl level iniliazation of the screen
static void
-initBlurfxScreen(BlurfxScreen * bs, int Screenwidth, int Screenheight,
- CompScreen * s)
+initBlurfxScreen (BlurfxScreen * bs, int Screenwidth, int Screenheight,
+ CompScreen * s)
{
- bs->blurShaderV = 0;
- bs->blurShaderH = 0;
-
- bs->backTex.handle = 0;
- bs->blurTempTexV.handle = 0;
- bs->blurTempTexH.handle = 0;
- bs->motionTex.handle = 0;
-
- bs->fbo = 0;
-
- if (bs->fboBlur_supported
- && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b) {
- // load shaders
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s, &bs->blurShaderV,
- blurShader[bs->blur_shader][0]);
- loadShader(GL_FRAGMENT_PROGRAM_ARB, s, &bs->blurShaderH,
- blurShader[bs->blur_shader][1]);
-
- bs->downSample = 1.0;
- }
-
- if (bs->blur_supported) {
- genBlurTexture(bs, &bs->blurTempTexV, Screenwidth,
- Screenheight, 0);
- genBlurTexture(bs, &bs->blurTempTexH, Screenwidth,
- Screenheight, 0);
- }
- //Generate a fbo
- if (s->fbo) {
- (*s->genFramebuffers) (1, &bs->fbo);
- GLERR;
- bs->fboStatus = 0;
-
- if (bs->rb_supported) {
- s->genRenderbuffers(1, &bs->rb);
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, bs->rb);
- s->renderbufferStorage(GL_RENDERBUFFER_EXT,
- 0x84F9
- /*GL_DEPTH_STENCIL_EXT */ ,
- s->width, s->height);
- s->bindRenderbuffer(GL_RENDERBUFFER_EXT, 0);
- }
- // generate textures
- genBlurTexture(bs, &bs->backTex, Screenwidth, Screenheight,
- 1);
- }
-
- if (bs->mblur_supported && bs->mb_mode != 1) {
- // generate morion blur texture
- genBlurTexture(bs, &bs->motionTex, Screenwidth,
- Screenheight, bs->mb_mode);
- }
-
- bs->modTex.handle = 0;
-
- if (bs->reflection_supported) {
- // load reflection map
- loadPngToTexture2D(s, bs, &bs->modTex,
- bs->
- opt
- [BLURFX_SCREEN_OPTION_REFLECTION_FILE].
- value.s);
- }
-
- bs->hasInit = 1;
+ bs->blurShaderV = 0;
+ bs->blurShaderH = 0;
+
+ bs->backTex.handle = 0;
+ bs->blurTempTexV.handle = 0;
+ bs->blurTempTexH.handle = 0;
+ bs->motionTex.handle = 0;
+
+ bs->fbo = 0;
+
+ if (bs->fboBlur_supported
+ && !bs->opt[BLURFX_SCREEN_OPTION_FORCE_NON_FBO_BLUR].value.b)
+ {
+ // load shaders
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s, &bs->blurShaderV,
+ blurShader[bs->blur_shader][0]);
+ loadShader (GL_FRAGMENT_PROGRAM_ARB, s, &bs->blurShaderH,
+ blurShader[bs->blur_shader][1]);
+
+ bs->downSample = 1.0;
+ }
+
+ if (bs->blur_supported)
+ {
+ genBlurTexture (bs, &bs->blurTempTexV, Screenwidth, Screenheight, 0);
+ genBlurTexture (bs, &bs->blurTempTexH, Screenwidth, Screenheight, 0);
+ }
+ //Generate a fbo
+ if (s->fbo)
+ {
+ (*s->genFramebuffers) (1, &bs->fbo);
+ GLERR;
+ bs->fboStatus = 0;
+
+ if (bs->rb_supported)
+ {
+ s->genRenderbuffers (1, &bs->rb);
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, bs->rb);
+ s->renderbufferStorage (GL_RENDERBUFFER_EXT, 0x84F9
+ /*GL_DEPTH_STENCIL_EXT */ ,
+ s->width, s->height);
+ s->bindRenderbuffer (GL_RENDERBUFFER_EXT, 0);
+ }
+ // generate textures
+ genBlurTexture (bs, &bs->backTex, Screenwidth, Screenheight, 1);
+ }
+
+ if (bs->mblur_supported && bs->mb_mode != 1)
+ {
+ // generate morion blur texture
+ genBlurTexture (bs, &bs->motionTex, Screenwidth,
+ Screenheight, bs->mb_mode);
+ }
+
+ bs->modTex.handle = 0;
+
+ if (bs->reflection_supported)
+ {
+ // load reflection map
+ loadPngToTexture2D (s, bs, &bs->modTex,
+ bs->
+ opt
+ [BLURFX_SCREEN_OPTION_REFLECTION_FILE].value.s);
+ }
+
+ bs->hasInit = 1;
}
// generate texture
static void
-genBlurTexture(BlurfxScreen * bs, BlurTexture * tex, int width, int height,
- int type)
+genBlurTexture (BlurfxScreen * bs, BlurTexture * tex, int width, int height,
+ int type)
{
- GLERR;
-
- //Enable texturing
- glEnable(GL_TEXTURE_RECTANGLE_ARB);
- //Generate the OpenGL textures
- if (!tex->handle)
- glGenTextures(1, &tex->handle);
- //Write important info into the structure
- tex->width = width;
- tex->height = height;
- //Bind the texture
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex->handle);
- //Load the parameters
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
- GL_LINEAR);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
- GL_LINEAR);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S,
- GL_CLAMP);
- glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T,
- GL_CLAMP);
-
- tex->target = GL_TEXTURE_RECTANGLE_ARB;
- tex->active_filter = GL_LINEAR;
-
- //Generate a large image
- switch (type) {
- case 1:
- glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, width,
- height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- break;
- case 2:
- glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB16F_ARB,
- width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- NULL);
- break;
- case 0:
- default:
- glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, width,
- height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- break;
- }
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
- glDisable(GL_TEXTURE_RECTANGLE_ARB);
-
- GLERR;
+ GLERR;
+
+ //Enable texturing
+ glEnable (GL_TEXTURE_RECTANGLE_ARB);
+ //Generate the OpenGL textures
+ if (!tex->handle)
+ glGenTextures (1, &tex->handle);
+ //Write important info into the structure
+ tex->width = width;
+ tex->height = height;
+ //Bind the texture
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex->handle);
+ //Load the parameters
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
+ GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+ tex->target = GL_TEXTURE_RECTANGLE_ARB;
+ tex->active_filter = GL_LINEAR;
+
+ //Generate a large image
+ switch (type)
+ {
+ case 1:
+ glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, width,
+ height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ break;
+ case 2:
+ glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB16F_ARB,
+ width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ break;
+ case 0:
+ default:
+ glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, width,
+ height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ break;
+ }
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
+ glDisable (GL_TEXTURE_RECTANGLE_ARB);
+
+ GLERR;
}
// load shader
static void
-loadShader(GLenum type, CompScreen * s, GLuint * shader, const char *prog)
+loadShader (GLenum type, CompScreen * s, GLuint * shader, const char *prog)
{
- //Switch a bunch of strings
- char buffer[4096];
- sprintf(buffer, prog);
- int errorPos, errorNum;
-
- glGetError();
-
- //Load the fragment program
- if (*shader == 0)
- (*s->genPrograms) (1, shader);
- (*s->bindProgram) (type, *shader);
-
- (*s->programString) (type, GL_PROGRAM_FORMAT_ASCII_ARB,
- strlen(buffer), buffer);
-
-
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
- errorNum = glGetError();
- if (errorNum != GL_NO_ERROR || errorPos != -1) {
- fprintf(stderr,
- "%s: (0x%X) error loading fragment program at line: %d\n",
- getProgramName(), errorNum, errorPos);
- fprintf(stderr, "%s\n",
- glGetString(GL_PROGRAM_ERROR_STRING_ARB));
- glGetIntegerv(GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &errorPos);
- if (*shader)
- (*s->deletePrograms) (1, shader);
- *shader = 0;
- }
- (*s->bindProgram) (type, 0);
+ //Switch a bunch of strings
+ char buffer[4096];
+ sprintf (buffer, prog);
+ int errorPos, errorNum;
+
+ glGetError ();
+
+ //Load the fragment program
+ if (*shader == 0)
+ (*s->genPrograms) (1, shader);
+ (*s->bindProgram) (type, *shader);
+
+ (*s->programString) (type, GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen (buffer), buffer);
+
+
+ glGetIntegerv (GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
+ errorNum = glGetError ();
+ if (errorNum != GL_NO_ERROR || errorPos != -1)
+ {
+ fprintf (stderr,
+ "%s: (0x%X) error loading fragment program at line: %d\n",
+ getProgramName (), errorNum, errorPos);
+ fprintf (stderr, "%s\n", glGetString (GL_PROGRAM_ERROR_STRING_ARB));
+ glGetIntegerv (GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &errorPos);
+ if (*shader)
+ (*s->deletePrograms) (1, shader);
+ *shader = 0;
+ }
+ (*s->bindProgram) (type, 0);
}
// load png
static void
-loadPngToTexture2D(CompScreen *s, BlurfxScreen * bs, BlurTexture * tex, char *filename)
+loadPngToTexture2D (CompScreen * s, BlurfxScreen * bs, BlurTexture * tex,
+ char *filename)
{
- int img_w = 0, img_h = 0, stride = 0;
- char *img_data;
- char *img_mod;
- struct stat fInfo;
+ int img_w = 0, img_h = 0, stride = 0;
+ char *img_data;
+ char *img_mod;
+ struct stat fInfo;
+
+ int i = 0;
+ float Y, R, G, B;
+ int pix;
- int i = 0;
- float Y, R, G, B;
- int pix;
+ if (strlen (filename) == 0)
+ return;
- if (strlen(filename) == 0)
- return;
+ GLERR;
- GLERR;
+ if (stat (filename, &fInfo) ||
+ !S_ISREG (fInfo.st_mode) ||
+ S_ISDIR (fInfo.st_mode) || access (filename, F_OK) != 0)
+ {
+ fprintf (stderr, "Unable to read image \"%s\" \n", filename);
+ return;
+ }
+ fprintf (stderr, "Loading image \"%s\" \n", filename);
- if (stat(filename, &fInfo) ||
- !S_ISREG(fInfo.st_mode) ||
- S_ISDIR(fInfo.st_mode) || access(filename, F_OK) != 0) {
- fprintf(stderr, "Unable to read image \"%s\" \n",
- filename);
- return;
- }
- fprintf(stderr, "Loading image \"%s\" \n", filename);
+ // Was: readPng(filename, &img_data, &img_w, &img_h);
+ if (!(*s->display->fileToImage)
+ (s->display, NULL, filename, &img_w, &img_h, &stride,
+ (void *)&img_data))
+ {
+ printf ("Unable to load image \"%s\" \n", filename);
+ return;
+ }
- // Was: readPng(filename, &img_data, &img_w, &img_h);
- if (!(*s->display->fileToImage)(s->display, NULL, filename, &img_w, &img_h, &stride, (void *)&img_data))
- {
- printf("Unable to load image \"%s\" \n", filename);
- return;
- }
-
- printf("%s loaded. w: %i; h: %i\n", filename, img_w, img_h);
-
- //Generate the OpenGL textures
- if (tex->handle == 0)
- glGenTextures(1, &tex->handle);
-
- glEnable(GL_TEXTURE_2D);
- //Bind the texture
- glBindTexture(GL_TEXTURE_2D, tex->handle);
-
- //Load the parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- tex->target = GL_TEXTURE_2D;
- tex->active_filter = GL_LINEAR;
- tex->width = img_w;
- tex->height = img_h;
-
- // merge all colors to an alpha texture if not disabled
- img_mod = malloc(img_w * img_h * 4);
- for (i = 0; i < img_w * img_h; i++) {
- R = img_data[(i * 4) + 2];
- G = img_data[(i * 4) + 1];
- B = img_data[i * 4];
- Y = (R * 0.299) + (G * 0.587) + (B * 0.114);
- pix = Y;
- img_mod[i * 4] =
- (bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
- value.b) ? img_data[(i * 4) + 2] : (char) pix;
- img_mod[(i * 4) + 1] =
- (bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
- value.b) ? img_data[(i * 4) + 1] : (char) pix;
- img_mod[(i * 4) + 2] =
- (bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
- value.b) ? img_data[i * 4] : (char) pix;
- img_mod[(i * 4) + 3] =
- (bs->
- opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA].
- value.b) ? img_data[(i * 4) + 3] : (char) pix;
- }
-
- glTexImage2D(GL_TEXTURE_2D, 0, 4, img_w, img_h, 0, GL_RGBA,
- GL_UNSIGNED_BYTE, img_mod);
- GLERR;
-
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
- free(img_mod);
- free(img_data);
+ printf ("%s loaded. w: %i; h: %i\n", filename, img_w, img_h);
+
+ //Generate the OpenGL textures
+ if (tex->handle == 0)
+ glGenTextures (1, &tex->handle);
+
+ glEnable (GL_TEXTURE_2D);
+ //Bind the texture
+ glBindTexture (GL_TEXTURE_2D, tex->handle);
+
+ //Load the parameters
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ tex->target = GL_TEXTURE_2D;
+ tex->active_filter = GL_LINEAR;
+ tex->width = img_w;
+ tex->height = img_h;
+
+ // merge all colors to an alpha texture if not disabled
+ img_mod = malloc (img_w * img_h * 4);
+ for (i = 0; i < img_w * img_h; i++)
+ {
+ R = img_data[(i * 4) + 2];
+ G = img_data[(i * 4) + 1];
+ B = img_data[i * 4];
+ Y = (R * 0.299) + (G * 0.587) + (B * 0.114);
+ pix = Y;
+ img_mod[i * 4] =
+ (bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
+ value.b) ? img_data[(i * 4) + 2] : (char)pix;
+ img_mod[(i * 4) + 1] =
+ (bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
+ value.b) ? img_data[(i * 4) + 1] : (char)pix;
+ img_mod[(i * 4) + 2] =
+ (bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_COLOR].
+ value.b) ? img_data[i * 4] : (char)pix;
+ img_mod[(i * 4) + 3] =
+ (bs->
+ opt[BLURFX_SCREEN_OPTION_REFLECTION_USE_IMAGE_ALPHA].
+ value.b) ? img_data[(i * 4) + 3] : (char)pix;
+ }
+
+ glTexImage2D (GL_TEXTURE_2D, 0, 4, img_w, img_h, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, img_mod);
+ GLERR;
+
+ glBindTexture (GL_TEXTURE_2D, 0);
+ glDisable (GL_TEXTURE_2D);
+ free (img_mod);
+ free (img_data);
}
// enable texture and set filter
static void
-enableBlurfxTexture(BlurTexture * tex, CompTextureFilter filter)
+enableBlurfxTexture (BlurTexture * tex, CompTextureFilter filter)
{
- glEnable(tex->target);
- glBindTexture(tex->target, tex->handle);
- GLERR;
- switch (filter) {
- case COMP_TEXTURE_FILTER_FAST:
- if (tex->active_filter != GL_NEAREST) {
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- tex->active_filter = GL_NEAREST;
- }
- break;
- case COMP_TEXTURE_FILTER_GOOD:
- default:
- if (tex->active_filter != GL_LINEAR) {
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- tex->active_filter = GL_LINEAR;
- }
- break;
- }
+ glEnable (tex->target);
+ glBindTexture (tex->target, tex->handle);
+ GLERR;
+ switch (filter)
+ {
+ case COMP_TEXTURE_FILTER_FAST:
+ if (tex->active_filter != GL_NEAREST)
+ {
+ glTexParameteri (GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ tex->active_filter = GL_NEAREST;
+ }
+ break;
+ case COMP_TEXTURE_FILTER_GOOD:
+ default:
+ if (tex->active_filter != GL_LINEAR)
+ {
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ tex->active_filter = GL_LINEAR;
+ }
+ break;
+ }
}
// disable texture
-static void disableBlurfxTexture(BlurTexture * tex)
+static void
+disableBlurfxTexture (BlurTexture * tex)
{
- glBindTexture(tex->target, 0);
- GLERR;
- glDisable(tex->target);
+ glBindTexture (tex->target, 0);
+ GLERR;
+ glDisable (tex->target);
}
// switch to another texture and set filter
static void
-switchBlurfxTexture(BlurTexture * from, BlurTexture * to,
- CompTextureFilter filter)
+switchBlurfxTexture (BlurTexture * from, BlurTexture * to,
+ CompTextureFilter filter)
{
- if (from->target != to->target) {
- disableBlurfxTexture(from);
- enableBlurfxTexture(to, filter);
- }
- glBindTexture(to->target, to->handle);
- GLERR;
- switch (filter) {
- case COMP_TEXTURE_FILTER_FAST:
- if (to->active_filter != GL_NEAREST) {
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- to->active_filter = GL_NEAREST;
- }
- break;
- case COMP_TEXTURE_FILTER_GOOD:
- default:
- if (to->active_filter != GL_LINEAR) {
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- to->active_filter = GL_LINEAR;
- }
- break;
- }
+ if (from->target != to->target)
+ {
+ disableBlurfxTexture (from);
+ enableBlurfxTexture (to, filter);
+ }
+ glBindTexture (to->target, to->handle);
+ GLERR;
+ switch (filter)
+ {
+ case COMP_TEXTURE_FILTER_FAST:
+ if (to->active_filter != GL_NEAREST)
+ {
+ glTexParameteri (GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ to->active_filter = GL_NEAREST;
+ }
+ break;
+ case COMP_TEXTURE_FILTER_GOOD:
+ default:
+ if (to->active_filter != GL_LINEAR)
+ {
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ to->active_filter = GL_LINEAR;
+ }
+ break;
+ }
}