rendered paste bodydiff --git a/include/compiz.h b/include/compiz.h
index 62544fc..9650285 100644
--- a/include/compiz.h
+++ b/include/compiz.h
@@ -26,7 +26,7 @@
#ifndef _COMPIZ_H
#define _COMPIZ_H
-#define ABIVERSION 20070407
+#define ABIVERSION 20070412
#include <stdio.h>
#include <sys/time.h>
@@ -1269,6 +1269,11 @@ typedef void (*PaintBackgroundProc) (CompScreen *screen,
Region region,
unsigned int mask);
+typedef void (*SetClipPlanesProc) (CompScreen *screen,
+ Region region,
+ int output);
+
+
void
preparePaintScreen (CompScreen *screen,
int msSinceLastPaint);
@@ -1356,6 +1361,9 @@ void
paintBackground (CompScreen *screen,
Region region,
unsigned int mask);
+void setClipPlanes (CompScreen *screen,
+ Region region,
+ int output);
/* texture.c */
@@ -1939,6 +1947,7 @@ struct _CompScreen {
GetOutputExtentsForWindowProc getOutputExtentsForWindow;
GetAllowedActionsForWindowProc getAllowedActionsForWindow;
FocusWindowProc focusWindow;
+ SetClipPlanesProc setClipPlanes;
PaintCursorProc paintCursor;
DamageCursorRectProc damageCursorRect;
diff --git a/plugins/cube.c b/plugins/cube.c
index 6784a45..57ebbcc 100644
--- a/plugins/cube.c
+++ b/plugins/cube.c
@@ -133,6 +133,7 @@ typedef struct _CubeScreen {
ApplyScreenTransformProc applyScreenTransform;
SetScreenOptionProc setScreenOption;
OutputChangeNotifyProc outputChangeNotify;
+ SetClipPlanesProc setClipPlanes;
CompOption opt[CUBE_SCREEN_OPTION_NUM];
@@ -1563,6 +1564,41 @@ cubePaintTransformedScreen (CompScreen *s,
WRAP (cs, s, paintTransformedScreen, cubePaintTransformedScreen);
}
+static void cubeSetClipPlanes (CompScreen *s, Region region, int output)
+{
+ CUBE_SCREEN(s);
+
+ glTranslatef(cs->outputXOffset, -cs->outputYOffset, 0.0f);
+ glScalef( cs->outputXScale, cs->outputYScale, 1.0f);
+
+ UNWRAP(cs, s, setClipPlanes);
+ (*s->setClipPlanes) (s, region, output);
+ WRAP(cs, s, setClipPlanes, cubeSetClipPlanes);
+
+ if (cs->invert == 1)
+ {
+ GLdouble clipPlane0[] = { 1.0, 0.0, 0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane1[] = { -1.0, 0.0, 0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane2[] = { 0.0, -1.0, 0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane3[] = { 0.0, 1.0, 0.5 / cs->distance, 0.0 };
+ glClipPlane (GL_CLIP_PLANE0, clipPlane0);
+ glClipPlane (GL_CLIP_PLANE1, clipPlane1);
+ glClipPlane (GL_CLIP_PLANE2, clipPlane2);
+ glClipPlane (GL_CLIP_PLANE3, clipPlane3);
+ }
+ else
+ {
+ GLdouble clipPlane0[] = { -1.0, 0.0, -0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane1[] = { 1.0, 0.0, -0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane2[] = { 0.0, 1.0, -0.5 / cs->distance, 0.0 };
+ GLdouble clipPlane3[] = { 0.0, -1.0, -0.5 / cs->distance, 0.0 };
+ glClipPlane (GL_CLIP_PLANE0, clipPlane0);
+ glClipPlane (GL_CLIP_PLANE1, clipPlane1);
+ glClipPlane (GL_CLIP_PLANE2, clipPlane2);
+ glClipPlane (GL_CLIP_PLANE3, clipPlane3);
+ }
+}
+
static void
cubeApplyScreenTransform (CompScreen *s,
const ScreenPaintAttrib *sAttrib,
@@ -1958,6 +1994,7 @@ cubeInitScreen (CompPlugin *p,
WRAP (cs, s, applyScreenTransform, cubeApplyScreenTransform);
WRAP (cs, s, setScreenOption, cubeSetGlobalScreenOption);
WRAP (cs, s, outputChangeNotify, cubeOutputChangeNotify);
+ WRAP (cs, s, setClipPlanes, cubeSetClipPlanes);
cubeUpdateOutputs (s);
@@ -1992,6 +2029,7 @@ cubeFiniScreen (CompPlugin *p,
UNWRAP (cs, s, applyScreenTransform);
UNWRAP (cs, s, setScreenOption);
UNWRAP (cs, s, outputChangeNotify);
+ UNWRAP (cs, s, setClipPlanes);
finiTexture (s, &cs->texture);
finiTexture (s, &cs->sky);
diff --git a/src/paint.c b/src/paint.c
index c9e540d..3080c44 100644
--- a/src/paint.c
+++ b/src/paint.c
@@ -298,29 +298,10 @@ paintTransformedScreen (CompScreen *screen,
if ((mask & CLIP_PLANE_MASK) == CLIP_PLANE_MASK)
{
- GLdouble h = screen->height;
-
- GLdouble p1[2] = { region->extents.x1, h - region->extents.y2 };
- GLdouble p2[2] = { region->extents.x2, h - region->extents.y1 };
-
- GLdouble halfW = screen->outputDev[output].width / 2.0;
- GLdouble halfH = screen->outputDev[output].height / 2.0;
-
- GLdouble cx = screen->outputDev[output].region.extents.x1 + halfW;
- GLdouble cy = (h - screen->outputDev[output].region.extents.y2) + halfH;
-
- GLdouble top[4] = { 0.0, halfH / (cy - p1[1]), 0.0, 0.5 };
- GLdouble bottom[4] = { 0.0, halfH / (cy - p2[1]), 0.0, 0.5 };
- GLdouble left[4] = { halfW / (cx - p1[0]), 0.0, 0.0, 0.5 };
- GLdouble right[4] = { halfW / (cx - p2[0]), 0.0, 0.0, 0.5 };
-
glPushMatrix ();
glLoadMatrixf (sTransform.m);
- glClipPlane (GL_CLIP_PLANE0, top);
- glClipPlane (GL_CLIP_PLANE1, bottom);
- glClipPlane (GL_CLIP_PLANE2, left);
- glClipPlane (GL_CLIP_PLANE3, right);
+ (*screen->setClipPlanes) (screen, region, output);
glEnable (GL_CLIP_PLANE0);
glEnable (GL_CLIP_PLANE1);
@@ -1193,3 +1174,27 @@ paintBackground (CompScreen *s,
free (data);
}
+
+void setClipPlanes (CompScreen *screen, Region region, int output)
+{
+ GLdouble h = screen->height;
+
+ GLdouble p1[2] = { region->extents.x1, h - region->extents.y2 };
+ GLdouble p2[2] = { region->extents.x2, h - region->extents.y1 };
+
+ GLdouble halfW = screen->outputDev[output].width / 2.0;
+ GLdouble halfH = screen->outputDev[output].height / 2.0;
+
+ GLdouble cx = screen->outputDev[output].region.extents.x1 + halfW;
+ GLdouble cy = (h - screen->outputDev[output].region.extents.y2) + halfH;
+
+ GLdouble top[4] = { 0.0, halfH / (cy - p1[1]), 0.0, 0.5 };
+ GLdouble bottom[4] = { 0.0, halfH / (cy - p2[1]), 0.0, 0.5 };
+ GLdouble left[4] = { halfW / (cx - p1[0]), 0.0, 0.0, 0.5 };
+ GLdouble right[4] = { halfW / (cx - p2[0]), 0.0, 0.0, 0.5 };
+
+ glClipPlane (GL_CLIP_PLANE0, top);
+ glClipPlane (GL_CLIP_PLANE1, bottom);
+ glClipPlane (GL_CLIP_PLANE2, left);
+ glClipPlane (GL_CLIP_PLANE3, right);
+}
diff --git a/src/screen.c b/src/screen.c
index cd2e1ae..eb054ed 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -1684,6 +1684,7 @@ addScreen (CompDisplay *display,
s->getOutputExtentsForWindow = getOutputExtentsForWindow;
s->getAllowedActionsForWindow = getAllowedActionsForWindow;
s->focusWindow = focusWindow;
+ s->setClipPlanes = setClipPlanes;
s->paintCursor = paintCursor;
s->damageCursorRect = damageCursorRect;