Merge lp:~compiz-team/compiz-expo-plugin/oneiric.actual_polish into lp:~compiz-team/compiz-expo-plugin/oneiric

Proposed by Sam Spilsbury
Status: Merged
Merged at revision: 154
Proposed branch: lp:~compiz-team/compiz-expo-plugin/oneiric.actual_polish
Merge into: lp:~compiz-team/compiz-expo-plugin/oneiric
Diff against target: 1748 lines (+1233/-160)
6 files modified
expo.xml.in (+15/-4)
src/expo.cpp (+471/-155)
src/expo.h (+56/-1)
src/glow.cpp (+428/-0)
src/glow.h (+66/-0)
src/group_glow.h (+197/-0)
To merge this branch: bzr merge lp:~compiz-team/compiz-expo-plugin/oneiric.actual_polish
Reviewer Review Type Date Requested Status
Jason Smith (community) Approve
Robert Carr Pending
Review via email: mp+75526@code.launchpad.net

This proposal supersedes a proposal from 2011-09-02.

Description of the change

Center the spread as per design

Bug 837545

To post a comment you must log in.
Revision history for this message
Robert Carr (robertcarr) wrote : Posted in a previous version of this proposal

+1. Looks like there might be something wrong with...merging the group plugin though ?!?!

review: Approve
Revision history for this message
Jason Smith (jassmith) wrote :

Looks fine, dupes some code but we dont care since we dont use the group plugin.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'expo.xml.in'
--- expo.xml.in 2011-09-01 14:33:30 +0000
+++ expo.xml.in 2011-09-15 12:36:24 +0000
@@ -17,6 +17,7 @@
17 <plugin>wobbly</plugin>17 <plugin>wobbly</plugin>
18 <plugin>animation</plugin>18 <plugin>animation</plugin>
19 <plugin>wallpaper</plugin>19 <plugin>wallpaper</plugin>
20 <plugin>imgpng</plugin>
20 </relation>21 </relation>
21 </deps>22 </deps>
22 <options>23 <options>
@@ -133,7 +134,7 @@
133 <_long> Left Side screen space of expo in pixels</_long>134 <_long> Left Side screen space of expo in pixels</_long>
134 <min>-1680</min>135 <min>-1680</min>
135 <max>1680</max>136 <max>1680</max>
136 <default>36</default>137 <default>64</default>
137 </option>138 </option>
138 <option name="y_offset" type="int">139 <option name="y_offset" type="int">
139 <_short>Y Space</_short>140 <_short>Y Space</_short>
@@ -145,7 +146,7 @@
145 <option name="distance" type="float">146 <option name="distance" type="float">
146 <_short>Distance</_short>147 <_short>Distance</_short>
147 <_long>Distance of the expo wall</_long>148 <_long>Distance of the expo wall</_long>
148 <default>0.0</default>149 <default>0.005</default>
149 <min>0.0</min>150 <min>0.0</min>
150 <max>1.0</max>151 <max>1.0</max>
151 <precision>0.01</precision>152 <precision>0.01</precision>
@@ -204,7 +205,7 @@
204 <option name="vp_brightness" type="float">205 <option name="vp_brightness" type="float">
205 <_short>Brightness</_short>206 <_short>Brightness</_short>
206 <_long>Inactive viewport brightness.</_long>207 <_long>Inactive viewport brightness.</_long>
207 <default>80.0</default>208 <default>40.0</default>
208 <min>0.0</min>209 <min>0.0</min>
209 <max>100.0</max>210 <max>100.0</max>
210 <precision>0.1</precision>211 <precision>0.1</precision>
@@ -212,11 +213,21 @@
212 <option name="vp_saturation" type="float">213 <option name="vp_saturation" type="float">
213 <_short>Saturation</_short>214 <_short>Saturation</_short>
214 <_long>Inactive viewport saturation.</_long>215 <_long>Inactive viewport saturation.</_long>
215 <default>100.0</default>216 <default>40.0</default>
216 <min>0.0</min>217 <min>0.0</min>
217 <max>100.0</max>218 <max>100.0</max>
218 <precision>0.1</precision>219 <precision>0.1</precision>
219 </option>220 </option>
221 <option name="selected_color" type="color">
222 <_short>Selected Color</_short>
223 <_long>Color to use when highlighting the selected viewport</_long>
224 <default>
225 <red>0xfbfb</red>
226 <green>0x8b8b</green>
227 <blue>0x0</blue>
228 <alpha>0xffff</alpha>
229 </default>
230 </option>
220 </subgroup>231 </subgroup>
221 <subgroup>232 <subgroup>
222 <short>Reflection</short>233 <short>Reflection</short>
223234
=== added directory 'images'
=== added file 'images/glow_outline.png'
224Binary files images/glow_outline.png 1970-01-01 00:00:00 +0000 and images/glow_outline.png 2011-09-15 12:36:24 +0000 differ235Binary files images/glow_outline.png 1970-01-01 00:00:00 +0000 and images/glow_outline.png 2011-09-15 12:36:24 +0000 differ
=== added file 'images/texture_tile.png'
225Binary files images/texture_tile.png 1970-01-01 00:00:00 +0000 and images/texture_tile.png 2011-09-15 12:36:24 +0000 differ236Binary files images/texture_tile.png 1970-01-01 00:00:00 +0000 and images/texture_tile.png 2011-09-15 12:36:24 +0000 differ
=== modified file 'src/expo.cpp'
--- src/expo.cpp 2011-09-01 14:33:30 +0000
+++ src/expo.cpp 2011-09-15 12:36:24 +0000
@@ -26,6 +26,7 @@
26#include "expo.h"26#include "expo.h"
27#include <math.h>27#include <math.h>
28#include <GL/glu.h>28#include <GL/glu.h>
29#include <X11/cursorfont.h>
2930
30COMPIZ_PLUGIN_20090315 (expo, ExpoPluginVTable);31COMPIZ_PLUGIN_20090315 (expo, ExpoPluginVTable);
3132
@@ -67,11 +68,10 @@
6768
68 if (dndState == DnDDuring || dndState == DnDStart)69 if (dndState == DnDDuring || dndState == DnDStart)
69 {70 {
70 if (dndWindow)71 if (dndWindows.size ())
71 finishWindowMovement ();72 finishWindowMovement ();
7273
73 dndState = DnDNone;74 dndState = DnDNone;
74 dndWindow = NULL;
7575
76 action->setState (action->state () & CompAction::StateInitButton);76 action->setState (action->state () & CompAction::StateInitButton);
77 cScreen->damageScreen ();77 cScreen->damageScreen ();
@@ -107,7 +107,6 @@
107 clickTime = 0;107 clickTime = 0;
108108
109 dndState = DnDNone;109 dndState = DnDNone;
110 dndWindow = NULL;
111110
112 selectedVp = screen->vp ();111 selectedVp = screen->vp ();
113 origVp = screen->vp ();112 origVp = screen->vp ();
@@ -150,7 +149,6 @@
150 vpUpdateMode = VPUpdateMouseOver;149 vpUpdateMode = VPUpdateMouseOver;
151150
152 dndState = DnDNone;151 dndState = DnDNone;
153 dndWindow = NULL;
154152
155 screen->removeAction (&optionGetDndButton ());153 screen->removeAction (&optionGetDndButton ());
156 screen->removeAction (&optionGetExitButton ());154 screen->removeAction (&optionGetExitButton ());
@@ -263,53 +261,39 @@
263void261void
264ExpoScreen::finishWindowMovement ()262ExpoScreen::finishWindowMovement ()
265{263{
266 dndWindow->syncPosition ();264 foreach (CompWindow *dndWindow, dndWindows)
267 dndWindow->ungrabNotify ();265 {
268266 if (dndWindow->grabbed ())
269 screen->moveViewport (screen->vp ().x () - selectedVp.x (),267 {
270 screen->vp ().y () - selectedVp.y (), true);268 dndWindow->syncPosition ();
271269 dndWindow->ungrabNotify ();
272 /* update saved window attributes in case we moved the270
273 window to a new viewport */271 screen->updateGrab (grabIndex, None);
274 if (dndWindow->saveMask () & CWX)272
275 {273 screen->moveViewport (screen->vp ().x () - selectedVp.x (),
276 dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width ();274 screen->vp ().y () - selectedVp.y (), true);
277 if (dndWindow->saveWc ().x < 0)275
278 dndWindow->saveWc ().x += screen->width ();276 /* update saved window attributes in case we moved the
279 }277 window to a new viewport */
280 if (dndWindow->saveMask () & CWY)278 if (dndWindow->saveMask () & CWX)
281 {279 {
282 dndWindow->saveWc ().y = dndWindow->saveWc ().y % screen->height ();280 dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width ();
283 if (dndWindow->saveWc ().y < 0)281 if (dndWindow->saveWc ().x < 0)
284 dndWindow->saveWc ().y += screen->height ();282 dndWindow->saveWc ().x += screen->width ();
285 }283 }
286284 if (dndWindow->saveMask () & CWY)
287 /* update window attibutes to make sure a moved maximized window285 {
288 is properly snapped to the work area */286 dndWindow->saveWc ().y = dndWindow->saveWc ().y % screen->height ();
289 if (dndWindow->state () & MAXIMIZE_STATE)287 if (dndWindow->saveWc ().y < 0)
290 dndWindow->updateAttributes (CompStackingUpdateModeNone);288 dndWindow->saveWc ().y += screen->height ();
291289 }
292#if 0 /* FIXME: obsolete in the meantime? */290
293 {291 /* update window attibutes to make sure a moved maximized window
294 int lastOutput;292 is properly snapped to the work area */
295 int centerX, centerY;293 if (dndWindow->state () & MAXIMIZE_STATE)
296294 dndWindow->updateAttributes (CompStackingUpdateModeNone);
297 /* make sure we snap to the correct output */295 }
298 lastOutput = s->currentOutputDev;296 }
299 centerX = (WIN_X (w) + WIN_W (w) / 2) % s->width;
300 if (centerX < 0)
301 centerX += s->width;
302 centerY = (WIN_Y (w) + WIN_H (w) / 2) % s->height;
303 if (centerY < 0)
304 centerY += s->height;
305
306 s->currentOutputDev = outputDeviceForPoint (s, centerX, centerY);
307
308 updateWindowAttributes (w, CompStackingUpdateModeNone);
309
310 s->currentOutputDev = lastOutput;
311 }
312#endif
313}297}
314298
315void299void
@@ -380,6 +364,26 @@
380 screen->handleEvent (event);364 screen->handleEvent (event);
381}365}
382366
367bool
368ExpoScreen::windowsOnVp (CompPoint &p)
369{
370 foreach (CompWindow *w, screen->clientList (true))
371 {
372 CompPoint viewport;
373
374 screen->viewportForGeometry (w->geometry (), viewport);
375
376 if (viewport == p&&
377 w->type () != CompWindowTypeDesktopMask &&
378 w->type () != CompWindowTypeDockMask)
379 {
380 return true;
381 }
382 }
383
384 return false;
385}
386
383void387void
384ExpoScreen::preparePaint (int msSinceLastPaint)388ExpoScreen::preparePaint (int msSinceLastPaint)
385{389{
@@ -390,6 +394,29 @@
390 else394 else
391 expoCam = MAX (0.0, expoCam - val);395 expoCam = MAX (0.0, expoCam - val);
392396
397 if (dndState == DnDDuring)
398 {
399 foreach (CompWindow *w, dndWindows)
400 ExpoWindow::get (w)->dndOpacity = MIN (1.0, ExpoWindow::get (w)->dndOpacity + val);
401 }
402 else if (dndState == DnDNone)
403 {
404 CompWindowList::iterator it = dndWindows.begin ();
405
406 while (it != dndWindows.end ())
407 {
408 ExpoWindow::get ((*it))->dndOpacity = MAX (0.0, ExpoWindow::get ((*it))->dndOpacity - val);
409
410 if (ExpoWindow::get ((*it))->dndOpacity <= 0.0f)
411 {
412 dndWindows.erase (it);
413 it = dndWindows.begin ();
414 }
415 else
416 it++;
417 }
418 }
419
393 if (expoCam)420 if (expoCam)
394 {421 {
395 unsigned int i, j, vp;422 unsigned int i, j, vp;
@@ -408,8 +435,9 @@
408 for (j = 0; j < (unsigned int) screen->vpSize ().height (); j++)435 for (j = 0; j < (unsigned int) screen->vpSize ().height (); j++)
409 {436 {
410 vp = (j * screen->vpSize ().width ()) + i;437 vp = (j * screen->vpSize ().width ()) + i;
438 CompPoint vpPos = CompPoint (i, j);
411439
412 if (CompPoint (i, j) == selectedVp)440 if (windowsOnVp (vpPos))
413 vpActivity[vp] = MIN (1.0, vpActivity[vp] + val);441 vpActivity[vp] = MIN (1.0, vpActivity[vp] + val);
414 else442 else
415 vpActivity[vp] = MAX (0.0, vpActivity[vp] - val);443 vpActivity[vp] = MAX (0.0, vpActivity[vp] - val);
@@ -437,6 +465,7 @@
437 screen->handleEventSetEnabled (this, enable);465 screen->handleEventSetEnabled (this, enable);
438 cScreen->preparePaintSetEnabled (this, enable);466 cScreen->preparePaintSetEnabled (this, enable);
439 cScreen->paintSetEnabled (this, enable);467 cScreen->paintSetEnabled (this, enable);
468 cScreen->getWindowPaintListSetEnabled (this, false);
440 cScreen->donePaintSetEnabled (this, enable);469 cScreen->donePaintSetEnabled (this, enable);
441 gScreen->glPaintOutputSetEnabled (this, enable);470 gScreen->glPaintOutputSetEnabled (this, enable);
442 gScreen->glPaintTransformedOutputSetEnabled (this, enable);471 gScreen->glPaintTransformedOutputSetEnabled (this, enable);
@@ -516,6 +545,11 @@
516 foreach (float& vp, vpActivity)545 foreach (float& vp, vpActivity)
517 if (vp != 0.0 && vp != 1.0)546 if (vp != 0.0 && vp != 1.0)
518 cScreen->damageScreen ();547 cScreen->damageScreen ();
548
549 foreach (CompWindow *w, dndWindows)
550 if (ExpoWindow::get (w)->dndOpacity != 0.0f &&
551 ExpoWindow::get (w)->dndOpacity != 1.0f)
552 cScreen->damageScreen ();
519 }553 }
520554
521 if (grabIndex && expoCam <= 0.0f && !expoMode)555 if (grabIndex && expoCam <= 0.0f && !expoMode)
@@ -530,10 +564,18 @@
530 switch (dndState) {564 switch (dndState) {
531 case DnDDuring:565 case DnDDuring:
532 {566 {
533 if (dndWindow)567 if (dndWindows.size ())
534 dndWindow->move (newCursor.x () - prevCursor.x (),568 {
535 newCursor.y () - prevCursor.y (),569 foreach (CompWindow *dndWindow, dndWindows)
536 optionGetExpoImmediateMove ());570 {
571 if (dndWindow->grabbed ())
572 {
573 dndWindow->move (newCursor.x () - prevCursor.x (),
574 newCursor.y () - prevCursor.y (),
575 optionGetExpoImmediateMove ());
576 }
577 }
578 }
537579
538 prevCursor = newCursor;580 prevCursor = newCursor;
539 cScreen->damageScreen ();581 cScreen->damageScreen ();
@@ -598,12 +640,14 @@
598 break;640 break;
599641
600 dndState = DnDDuring;642 dndState = DnDDuring;
601 dndWindow = w;643 dndWindows.push_back (w);
602644
603 w->grabNotify (nx, ny, 0,645 w->grabNotify (nx, ny, 0,
604 CompWindowGrabMoveMask |646 CompWindowGrabMoveMask |
605 CompWindowGrabButtonMask);647 CompWindowGrabButtonMask);
606648
649 screen->updateGrab (grabIndex, mMoveCursor);
650
607 w->raise ();651 w->raise ();
608 w->moveInputFocusTo ();652 w->moveInputFocusTo ();
609 break;653 break;
@@ -689,6 +733,121 @@
689}733}
690734
691void735void
736ExpoScreen::paintViewport (const GLScreenPaintAttrib& attrib,
737 const GLMatrix& transform,
738 const CompRegion& region,
739 CompOutput *output,
740 unsigned int mask,
741 CompPoint vpPos,
742 GLVector &vpCamPos,
743 bool reflection)
744{
745 GLMatrix sTransform (transform);
746 GLMatrix sTransform2, sTransform3;
747 float sx = (float) screen->width () / output->width ();
748 float sy = (float) screen->height () / output->height ();
749 float vpp;
750 float progress = sigmoidProgress (expoCam);
751 unsigned int vp;
752 CompPoint vpSize (screen->vpSize ().width (), screen->vpSize ().height ());
753
754 const float gapY = optionGetVpDistance () * 0.1f * expoCam;
755 const float gapX = optionGetVpDistance () * 0.1f * screen->height () /
756 screen->width () * expoCam;
757
758 /* not sure this will work with different resolutions */
759 sTransform.translate (0.0, MAX (0, vpPos.y ()) * -(sy + gapY), 0.0f);
760
761 sTransform2 = sTransform;
762
763 /* not sure this will work with different resolutions */
764 if (optionGetDeform () != DeformCurve)
765 sTransform2.translate (MAX (0, vpPos.x ()) * (sx + gapX), 0.0f, 0.0);
766
767
768 if (optionGetExpoAnimation () == ExpoAnimationVortex)
769 sTransform2.rotate (360 * expoCam,
770 0.0f, 1.0f, 2.0f * expoCam);
771
772 sTransform3 = sTransform2;
773
774 sTransform3.translate (output->x () / output->width (),
775 -output->y () / output->height (), 0.0);
776
777 cScreen->setWindowPaintOffset ((screen->vp ().x () - vpPos.x ()) *
778 screen->width (),
779 (screen->vp ().y () - vpPos.y ()) *
780 screen->height ());
781
782 vp = (vpPos.y () * vpSize.x ()) + vpPos.x ();
783
784 vpp = (expoCam * vpActivity[vp]) + (1 - expoCam);
785 vpp = sigmoidProgress (vpp);
786
787 vpBrightness = vpp + ((1.0 - vpp) *
788 optionGetVpBrightness () / 100.0);
789 vpSaturation = vpp + ((1.0 - vpp) *
790 optionGetVpSaturation () / 100.0);
791
792 paintingVp = vpPos;
793
794 if (optionGetDeform () == DeformCurve)
795 {
796 float rotateX;
797
798 sTransform3.translate (-vpCamPos[GLVector::x], 0.0f,
799 curveDistance - DEFAULT_Z_CAMERA);
800
801 rotateX = -vpPos.x () + interpolate (((float) vpSize.x () / 2.0) - 0.5,
802 screen->vp ().x (), progress);
803
804 sTransform3.rotate (curveAngle * rotateX, 0.0, 1.0, 0.0);
805
806 sTransform3.translate (vpCamPos[GLVector::x], 0.0f,
807 DEFAULT_Z_CAMERA - curveDistance);
808 }
809
810 cScreen->getWindowPaintListSetEnabled (this, paintingDndWindow);
811
812 gScreen->glPaintTransformedOutput (attrib, sTransform3,
813 screen->region (), output,
814 mask);
815
816 cScreen->getWindowPaintListSetEnabled (this, !paintingDndWindow);
817
818 if (!reflection && !paintingDndWindow)
819 {
820 int cursor[2] = { pointerX, pointerY };
821
822 invertTransformedVertex (attrib, sTransform3,
823 output, cursor);
824
825 if ((cursor[0] > 0) && (cursor[0] < (int) screen->width ()) &&
826 (cursor[1] > 0) && (cursor[1] < (int) screen->height ()))
827 {
828 newCursor.setX (vpPos.x () * screen->width () + cursor[0]);
829 newCursor.setY (vpPos.y () * screen->height () + cursor[1]);
830
831 if (anyClick || dndState != DnDNone)
832 {
833 /* Used to save last viewport interaction was in */
834 selectedVp = vpPos;
835 anyClick = false;
836 }
837 }
838 }
839
840 /* Calculate the current viewport size */
841 int tl[2] = { 0, 0 };
842 int br[2] = { screen->width (), screen->height () };
843
844 invertTransformedVertex (attrib, sTransform3, output, tl);
845 invertTransformedVertex (attrib, sTransform3, output, br);
846
847 viewport_size = CompSize (br[0] - tl[0], br[1] - tl[1]);
848}
849
850void
692ExpoScreen::paintWall (const GLScreenPaintAttrib& attrib,851ExpoScreen::paintWall (const GLScreenPaintAttrib& attrib,
693 const GLMatrix& transform,852 const GLMatrix& transform,
694 const CompRegion& region,853 const CompRegion& region,
@@ -697,13 +856,11 @@
697 bool reflection)856 bool reflection)
698{857{
699 GLMatrix sTransformW, sTransform (transform);858 GLMatrix sTransformW, sTransform (transform);
700 int i, j, vp;
701 GLenum oldFilter = gScreen->textureFilter ();859 GLenum oldFilter = gScreen->textureFilter ();
702860 float sx = (float) screen->width () / output->width ();
703 float sx = (float) screen->width () / output->width ();861 float sy = (float) screen->height () / output->height ();
704 float sy = (float) screen->height () / output->height ();
705 float biasZ;862 float biasZ;
706 float oScale, rotation = 0.0f, progress, vpp;863 float oScale, rotation = 0.0f, progress;
707 float aspectX = 1.0f, aspectY = 1.0f;864 float aspectX = 1.0f, aspectY = 1.0f;
708 GLVector cam;865 GLVector cam;
709 CompPoint vpSize (screen->vpSize ().width (), screen->vpSize ().height ());866 CompPoint vpSize (screen->vpSize ().width (), screen->vpSize ().height ());
@@ -833,10 +990,23 @@
833 sTransform.rotate (rotation, 0.0f, 1.0f, 0.0f);990 sTransform.rotate (rotation, 0.0f, 1.0f, 0.0f);
834 sTransform.scale (aspectX, aspectY, 1.0);991 sTransform.scale (aspectX, aspectY, 1.0);
835992
836 float xoffset = ((vpSize.x () * sx) / ((float) screen->width ()) * optionGetXOffset ()) * sigmoidProgress (expoCam);993 float xoffset = 0.0;
837 float yoffset = ((vpSize.y () * sy) / ((float) screen->height ()) * optionGetYOffset ()) * sigmoidProgress (expoCam);994 float yoffset = 0.0;
838 float xadjs = 1.0f - ((float) optionGetXOffset () / (float) screen->width ()) * sigmoidProgress (expoCam);995 float xadjs = 1.0f;
839 float yadjs = 1.0f - ((float) optionGetYOffset () / (float) screen->height ()) * sigmoidProgress (expoCam);996 float yadjs = 1.0f;
997
998 if (output->left () == 0)
999 {
1000 xoffset = ((vpSize.x () * sx) / ((float) output->width ()) * (optionGetXOffset ()) * sigmoidProgress (expoCam));
1001 xadjs = 1.0f - ((float) (optionGetXOffset ()) / (float) (output->width ())) * sigmoidProgress (expoCam);
1002 }
1003
1004 if (output->top () == 0)
1005 {
1006 yoffset = ((vpSize.y () * sy) / ((float) output->height ()) * (optionGetYOffset ()) * sigmoidProgress (expoCam));
1007
1008 yadjs = 1.0f - ((float) (optionGetYOffset ()) / (float) output->height ()) * sigmoidProgress (expoCam);
1009 }
8401010
841 /* translate expo to center */1011 /* translate expo to center */
842 sTransform.translate (vpSize.x () * sx * -0.5 + xoffset,1012 sTransform.translate (vpSize.x () * sx * -0.5 + xoffset,
@@ -865,89 +1035,29 @@
8651035
866 expoActive = true;1036 expoActive = true;
8671037
868 for (j = 0; j < vpSize.y (); j++)1038 for (int j = 0; j < screen->vpSize ().height (); j++)
1039 for (int i = 0; i < screen->vpSize().width (); i++)
1040 paintViewport (attrib, sTransform, region, output, mask, CompPoint (i, j), vpCamPos, reflection);
1041
1042 paintingDndWindow = true;
1043
1044 foreach (CompWindow *dndWindow, dndWindows)
869 {1045 {
870 GLMatrix sTransform2 (sTransform), sTransform3;1046 CompPoint vp;
8711047
872 for (i = 0; i < vpSize.x (); i++)1048 screen->viewportForGeometry (dndWindow->geometry (), vp);
873 {1049
874 if (optionGetExpoAnimation () == ExpoAnimationVortex)1050 while (vp.x () < 0)
875 sTransform2.rotate (360 * expoCam,1051 vp.setX (screen->vpSize ().width () + vp.x ());
876 0.0f, 1.0f, 2.0f * expoCam);1052
8771053 while (vp.y () < 0)
878 sTransform3 = sTransform2;1054 vp.setY (screen->vpSize ().height () + vp.y ());
8791055
880 sTransform3.translate (output->x () / output->width (),1056 paintViewport (attrib, sTransform, infiniteRegion, output, mask, vp, vpCamPos, reflection);
881 -output->y () / output->height (), 0.0);
882
883 cScreen->setWindowPaintOffset ((screen->vp ().x () - i) *
884 screen->width (),
885 (screen->vp ().y () - j) *
886 screen->height ());
887
888 vp = (j * vpSize.x ()) + i;
889
890 vpp = (expoCam * vpActivity[vp]) + (1 - expoCam);
891 vpp = sigmoidProgress (vpp);
892
893 vpBrightness = vpp + ((1.0 - vpp) *
894 optionGetVpBrightness () / 100.0);
895 vpSaturation = vpp + ((1.0 - vpp) *
896 optionGetVpSaturation () / 100.0);
897
898 paintingVp.set (i, j);
899
900 if (optionGetDeform () == DeformCurve)
901 {
902 float rotateX;
903
904 sTransform3.translate (-vpCamPos[GLVector::x], 0.0f,
905 curveDistance - DEFAULT_Z_CAMERA);
906
907 rotateX = -i + interpolate (((float) vpSize.x () / 2.0) - 0.5,
908 screen->vp ().x (), progress);
909
910 sTransform3.rotate (curveAngle * rotateX, 0.0, 1.0, 0.0);
911
912 sTransform3.translate (vpCamPos[GLVector::x], 0.0f,
913 DEFAULT_Z_CAMERA - curveDistance);
914 }
915
916 gScreen->glPaintTransformedOutput (attrib, sTransform3,
917 screen->region (), output,
918 mask);
919
920 if (!reflection)
921 {
922 int cursor[2] = { pointerX, pointerY };
923
924 invertTransformedVertex (attrib, sTransform3,
925 output, cursor);
926
927 if ((cursor[0] > 0) && (cursor[0] < (int) screen->width ()) &&
928 (cursor[1] > 0) && (cursor[1] < (int) screen->height ()))
929 {
930 newCursor.setX (i * screen->width () + cursor[0]);
931 newCursor.setY (j * screen->height () + cursor[1]);
932
933 if (anyClick || dndState != DnDNone)
934 {
935 /* Used to save last viewport interaction was in */
936 selectedVp.set (i, j);
937 anyClick = false;
938 }
939 }
940 }
941
942 /* not sure this will work with different resolutions */
943 if (optionGetDeform () != DeformCurve)
944 sTransform2.translate (sx + gapX, 0.0f, 0.0);
945 }
946
947 /* not sure this will work with different resolutions */
948 sTransform.translate (0.0, -(sy + gapY), 0.0f);
949 }1057 }
9501058
1059 paintingDndWindow = false;
1060
951 glNormal3f (0.0, 0.0, -1.0);1061 glNormal3f (0.0, 0.0, -1.0);
9521062
953 if (reflection)1063 if (reflection)
@@ -1025,6 +1135,12 @@
1025 gScreen->setTextureFilter (oldFilter);1135 gScreen->setTextureFilter (oldFilter);
1026}1136}
10271137
1138const CompWindowList &
1139ExpoScreen::getWindowPaintList ()
1140{
1141 return dndWindows;
1142}
1143
1028bool1144bool
1029ExpoScreen::glPaintOutput (const GLScreenPaintAttrib& attrib,1145ExpoScreen::glPaintOutput (const GLScreenPaintAttrib& attrib,
1030 const GLMatrix& transform,1146 const GLMatrix& transform,
@@ -1079,6 +1195,11 @@
1079 const CompRegion& region,1195 const CompRegion& region,
1080 unsigned int mask)1196 unsigned int mask)
1081{1197{
1198 GLMatrix wTransform (transform);
1199 CompPoint vp;
1200
1201 screen->viewportForGeometry (window->geometry (), vp);
1202
1082 if (eScreen->expoCam == 0.0f)1203 if (eScreen->expoCam == 0.0f)
1083 return gWindow->glDraw (transform, fragment, region, mask);1204 return gWindow->glDraw (transform, fragment, region, mask);
10841205
@@ -1107,8 +1228,11 @@
1107 }1228 }
1108 }1229 }
11091230
1110 fA.setBrightness (fragment.getBrightness () * eScreen->vpBrightness);1231 if (vp == eScreen->paintingVp || window->onAllViewports ())
1111 fA.setSaturation (fragment.getSaturation () * eScreen->vpSaturation);1232 {
1233 fA.setBrightness (fragment.getBrightness () * eScreen->vpBrightness);
1234 fA.setSaturation (fragment.getSaturation () * eScreen->vpSaturation);
1235 }
1112 }1236 }
1113 else1237 else
1114 {1238 {
@@ -1119,7 +1243,82 @@
1119 (1 - sigmoidProgress (eScreen->expoCam)));1243 (1 - sigmoidProgress (eScreen->expoCam)));
1120 }1244 }
11211245
1122 return gWindow->glDraw (transform, fA, region, mask);1246 bool status = gWindow->glDraw (wTransform, fA, region, mask);
1247
1248 if (window->type () & CompWindowTypeDesktopMask)
1249 {
1250 /* We want to set the geometry of the polka dots to the window
1251 * region */
1252 CompRegion reg = CompRegion (0, 0, window->width (), window->height ());
1253
1254 foreach(GLTexture * tex, eScreen->polkadots_texture)
1255 {
1256 GLTexture::MatrixList matl;
1257 GLTexture::Matrix mat = tex->matrix();
1258 CompRegion paintRegion(region);
1259
1260 /* We can reset the window geometry since it will be
1261 * re-added later */
1262 gWindow->geometry().reset();
1263
1264 float xScale = screen->width () / (float) eScreen->viewport_size.width ();
1265 float yScale = screen->height () / (float) eScreen->viewport_size.height ();
1266
1267 mat.xx *= xScale;
1268 mat.yy *= yScale;
1269
1270 /* Not sure what this does, but it is necessary
1271 * (adjusts for scale?) */
1272 mat.x0 -= mat.xx * reg.boundingRect().x1();
1273 mat.y0 -= mat.yy * reg.boundingRect().y1();
1274
1275 matl.push_back(mat);
1276
1277 if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
1278 paintRegion = infiniteRegion;
1279
1280 /* Now allow plugins to mess with the geometry of our
1281 * dim (so we get a nice render for things like
1282 * wobbly etc etc */
1283 gWindow->glAddGeometry(matl, reg, paintRegion);
1284
1285 /* Did it succeed? */
1286 if (gWindow->geometry().vertices)
1287 {
1288 unsigned int glDrawTextureIndex = gWindow->glDrawTextureGetCurrentIndex();
1289 fA.setOpacity (fragment.getOpacity () * (((1.0 - eScreen->vpBrightness) + (1.0 - eScreen->vpSaturation) / 2.0)));
1290 /* Texture rendering set-up */
1291 eScreen->gScreen->setTexEnvMode(GL_MODULATE);
1292 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1293 /* Draw the dim texture with all of it's modified
1294 * geometry glory */
1295 gWindow->glDrawTextureSetCurrentIndex(MAXSHORT);
1296 gWindow->glDrawTexture(tex, fA, mask | PAINT_WINDOW_BLEND_MASK
1297 | PAINT_WINDOW_TRANSLUCENT_MASK |
1298 PAINT_WINDOW_TRANSFORMED_MASK);
1299 gWindow->glDrawTextureSetCurrentIndex(glDrawTextureIndex);
1300 /* Texture rendering tear-down */
1301 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1302 eScreen->gScreen->setTexEnvMode(GL_REPLACE);
1303 }
1304 }
1305
1306 /* Paint the outline */
1307 if (mGlowQuads && eScreen->paintingVp == eScreen->selectedVp)
1308 {
1309 if (region.numRects ())
1310 {
1311 /* reset geometry and paint */
1312 gWindow->geometry ().reset ();
1313
1314 paintGlow (fragment, infiniteRegion, mask);
1315 }
1316 }
1317
1318 }
1319
1320 return status;
1321
1123}1322}
11241323
1125#define EXPO_GRID_SIZE 1001324#define EXPO_GRID_SIZE 100
@@ -1261,6 +1460,12 @@
1261 const CompRegion& region,1460 const CompRegion& region,
1262 unsigned int mask)1461 unsigned int mask)
1263{1462{
1463 GLMatrix wTransform (transform);
1464 GLWindowPaintAttrib wAttrib (attrib);
1465 CompPoint vp;
1466
1467 screen->viewportForGeometry (window->geometry (), vp);
1468
1264 if (eScreen->expoActive)1469 if (eScreen->expoActive)
1265 {1470 {
1266 float opacity = 1.0;1471 float opacity = 1.0;
@@ -1294,9 +1499,52 @@
12941499
1295 if (opacity <= 0)1500 if (opacity <= 0)
1296 mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;1501 mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
1297 }1502 else
12981503 wAttrib.opacity = wAttrib.opacity * opacity;
1299 return gWindow->glPaint (attrib, transform, region, mask);1504 }
1505
1506 /* Stretch maximized windows a little so that you don't
1507 * have an awkward gap */
1508 if (window->state () & MAXIMIZE_STATE)
1509 {
1510 CompOutput *o = &screen->outputDevs ()[screen->outputDeviceForGeometry(window->geometry())];
1511 float yS = 1.0 + ((o->height () / (float) window->height ()) - 1.0f) * sigmoidProgress (eScreen->expoCam);
1512 wTransform.translate (window->x () + window->width () / 2,
1513 window->y () + window->height (),
1514 0.0f);
1515 wTransform.scale (1.0f, yS, 1.0f);
1516 wTransform.translate (-(window->x () + window->width () / 2),
1517 -(window->y () + window->height ()),
1518 0.0f);
1519
1520 if (eScreen->paintingVp != vp)
1521 mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
1522
1523 mask |= PAINT_WINDOW_TRANSFORMED_MASK;
1524 }
1525
1526 if (std::find (eScreen->dndWindows.begin(), eScreen->dndWindows.end (), window) != eScreen->dndWindows.end ())
1527 {
1528 if (!eScreen->paintingDndWindow)
1529 {
1530 if ((1.0f - dndOpacity) <= 0.0f || (eScreen->paintingVp == vp &&
1531 eScreen->dndState != ExpoScreen::DnDNone))
1532 mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
1533 else if (!window->region ().subtracted (screen->region ()).isEmpty () &&
1534 eScreen->paintingVp != vp)
1535 wAttrib.opacity = wAttrib.opacity * (1.0f - dndOpacity);
1536 }
1537 else
1538 {
1539 mask |= PAINT_WINDOW_TRANSFORMED_MASK;
1540 if (!window->region ().subtracted (screen->region ()).isEmpty ())
1541 wAttrib.opacity = wAttrib.opacity * dndOpacity;
1542 }
1543 }
1544
1545 bool status = gWindow->glPaint (wAttrib, wTransform, region, mask);
1546
1547 return status;
1300}1548}
13011549
1302bool1550bool
@@ -1325,20 +1573,29 @@
1325 expoActive (false),1573 expoActive (false),
1326 expoMode (false),1574 expoMode (false),
1327 dndState (DnDNone),1575 dndState (DnDNone),
1328 dndWindow (NULL),1576 dndWindows (0),
1329 origVp (s->vp ()),1577 origVp (s->vp ()),
1330 selectedVp (s->vp ()),1578 selectedVp (s->vp ()),
1331 vpUpdateMode (VPUpdateNone),1579 vpUpdateMode (VPUpdateNone),
1332 clickTime (0),1580 clickTime (0),
1333 doubleClick (false),1581 doubleClick (false),
1334 vpNormals (360 * 3),1582 vpNormals (360 * 3),
1335 grabIndex (0)1583 grabIndex (0),
1584 paintingDndWindow (false),
1585 mGlowTextureProperties (&glowTextureProperties)
1336{1586{
1587 CompString fname;
1588 CompString pname = "expo";
1589 CompSize size;
1590
1591
1337 leftKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Left"));1592 leftKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Left"));
1338 rightKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Right"));1593 rightKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Right"));
1339 upKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Up"));1594 upKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Up"));
1340 downKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Down"));1595 downKey = XKeysymToKeycode (s->dpy (), XStringToKeysym ("Down"));
13411596
1597 mMoveCursor = XCreateFontCursor (screen->dpy (), XC_fleur);
1598
1342 EXPOINITBIND (ExpoKey, doExpo);1599 EXPOINITBIND (ExpoKey, doExpo);
1343 EXPOTERMBIND (ExpoKey, termExpo);1600 EXPOTERMBIND (ExpoKey, termExpo);
1344 EXPOINITBIND (ExpoButton, doExpo);1601 EXPOINITBIND (ExpoButton, doExpo);
@@ -1355,6 +1612,47 @@
1355 ScreenInterface::setHandler (screen, false);1612 ScreenInterface::setHandler (screen, false);
1356 CompositeScreenInterface::setHandler (cScreen, false);1613 CompositeScreenInterface::setHandler (cScreen, false);
1357 GLScreenInterface::setHandler (gScreen, false);1614 GLScreenInterface::setHandler (gScreen, false);
1615
1616 outline_texture = GLTexture::imageDataToTexture (mGlowTextureProperties->textureData,
1617 CompSize (mGlowTextureProperties->textureSize,
1618 mGlowTextureProperties->textureSize),
1619 GL_RGBA, GL_UNSIGNED_BYTE);
1620 fname = "texture_tile.png";
1621 polkadots_texture = GLTexture::readImageToTexture (fname, pname, polkadots_texture_size);
1622
1623 if (polkadots_texture.empty ())
1624 compLogMessage ("expo", CompLogLevelWarn, "failed to bind image to texture");
1625 else
1626 {
1627 foreach (GLTexture *tex, polkadots_texture)
1628 {
1629 tex->enable (GLTexture::Good);
1630 glTexParameteri (tex->target (), GL_TEXTURE_WRAP_S, GL_REPEAT);
1631 glTexParameteri (tex->target (), GL_TEXTURE_WRAP_T, GL_REPEAT);
1632 tex->disable ();
1633 }
1634 }
1635}
1636
1637ExpoScreen::~ExpoScreen ()
1638{
1639 if (mMoveCursor)
1640 XFreeCursor (screen->dpy (), mMoveCursor);
1641}
1642
1643void
1644ExpoWindow::resizeNotify(int dx, int dy, int dw, int dh)
1645{
1646 window->resizeNotify (dx, dy, dw, dh);
1647
1648 /* mGlowQuads contains positional info, so we need to recalc that */
1649 if (mGlowQuads)
1650 {
1651 /* FIXME: we need to find a more multitexture friendly way
1652 * of doing this */
1653 GLTexture::Matrix tMat = eScreen->outline_texture.at (0)->matrix ();
1654 computeGlowQuads (&tMat);
1655 }
1358}1656}
13591657
1360ExpoWindow::ExpoWindow (CompWindow *w) :1658ExpoWindow::ExpoWindow (CompWindow *w) :
@@ -1362,10 +1660,28 @@
1362 window (w),1660 window (w),
1363 cWindow (CompositeWindow::get (w)),1661 cWindow (CompositeWindow::get (w)),
1364 gWindow (GLWindow::get (w)),1662 gWindow (GLWindow::get (w)),
1365 eScreen (ExpoScreen::get (screen))1663 eScreen (ExpoScreen::get (screen)),
1664 dndOpacity (0.0f),
1665 mGlowQuads (NULL)
1366{1666{
1367 CompositeWindowInterface::setHandler (cWindow, false);1667 CompositeWindowInterface::setHandler (cWindow, false);
1368 GLWindowInterface::setHandler (gWindow, false);1668 GLWindowInterface::setHandler (gWindow, false);
1669 WindowInterface::setHandler (window, true);
1670
1671 if (window->type () & CompWindowTypeDesktopMask)
1672 {
1673 foreach (GLTexture *tex, eScreen->outline_texture)
1674 {
1675 GLTexture::Matrix mat = tex->matrix ();
1676 computeGlowQuads (&mat);
1677 }
1678 }
1679}
1680
1681ExpoWindow::~ExpoWindow ()
1682{
1683 eScreen->dndWindows.remove (window);
1684 computeGlowQuads (NULL);
1369}1685}
13701686
1371bool1687bool
13721688
=== modified file 'src/expo.h'
--- src/expo.h 2011-09-01 14:33:30 +0000
+++ src/expo.h 2011-09-15 12:36:24 +0000
@@ -25,11 +25,21 @@
2525
26#include <core/core.h>26#include <core/core.h>
27#include <core/pluginclasshandler.h>27#include <core/pluginclasshandler.h>
28#include <cairo.h>
29#include <cairo-xlib-xrender.h>
2830
29#include <composite/composite.h>31#include <composite/composite.h>
30#include <opengl/opengl.h>32#include <opengl/opengl.h>
3133
32#include "expo_options.h"34#include "expo_options.h"
35#include "glow.h"
36
37#define WIN_REAL_X(w) (w->x () - w->border ().left)
38#define WIN_REAL_Y(w) (w->y () - w->border ().top)
39#define WIN_REAL_WIDTH(w) (w->width () + 2 * w->geometry ().border () + \
40 w->border ().left + w->border ().right)
41#define WIN_REAL_HEIGHT(w) (w->height () + 2 * w->geometry ().border () + \
42 w->border ().top + w->border ().bottom)
3343
34class ExpoScreen :44class ExpoScreen :
35 public ScreenInterface,45 public ScreenInterface,
@@ -40,6 +50,7 @@
40{50{
41 public:51 public:
42 ExpoScreen (CompScreen *);52 ExpoScreen (CompScreen *);
53 ~ExpoScreen ();
4354
44 void handleEvent (XEvent *);55 void handleEvent (XEvent *);
4556
@@ -53,6 +64,8 @@
53 const GLMatrix&, const CompRegion&,64 const GLMatrix&, const CompRegion&,
54 CompOutput *, unsigned int);65 CompOutput *, unsigned int);
5566
67 const CompWindowList & getWindowPaintList ();
68
56 bool dndInit (CompAction *, CompAction::State, CompOption::Vector&);69 bool dndInit (CompAction *, CompAction::State, CompOption::Vector&);
57 bool dndFini (CompAction *, CompAction::State, CompOption::Vector&);70 bool dndFini (CompAction *, CompAction::State, CompOption::Vector&);
58 bool doExpo (CompAction *, CompAction::State, CompOption::Vector&);71 bool doExpo (CompAction *, CompAction::State, CompOption::Vector&);
@@ -61,6 +74,8 @@
61 bool nextVp (CompAction *, CompAction::State, CompOption::Vector&);74 bool nextVp (CompAction *, CompAction::State, CompOption::Vector&);
62 bool prevVp (CompAction *, CompAction::State, CompOption::Vector&);75 bool prevVp (CompAction *, CompAction::State, CompOption::Vector&);
6376
77 CompPoint currentViewport ();
78
64 typedef enum {79 typedef enum {
65 DnDNone,80 DnDNone,
66 DnDDuring,81 DnDDuring,
@@ -81,7 +96,7 @@
81 bool expoMode;96 bool expoMode;
8297
83 DnDState dndState;98 DnDState dndState;
84 CompWindow *dndWindow;99 CompWindowList dndWindows;
85100
86 CompPoint prevCursor;101 CompPoint prevCursor;
87 CompPoint newCursor;102 CompPoint newCursor;
@@ -111,6 +126,17 @@
111126
112 CompScreen::GrabHandle grabIndex;127 CompScreen::GrabHandle grabIndex;
113128
129 GLTexture::List polkadots_texture;
130 CompSize polkadots_texture_size;
131 CompSize viewport_size;
132
133 GLTexture::List outline_texture;
134 CompSize outline_texture_size;
135
136 bool paintingDndWindow;
137
138 const GlowTextureProperties *mGlowTextureProperties;
139
114 private:140 private:
115 void moveFocusViewport (int, int);141 void moveFocusViewport (int, int);
116 void finishWindowMovement ();142 void finishWindowMovement ();
@@ -121,22 +147,39 @@
121 void paintWall (const GLScreenPaintAttrib&, const GLMatrix&,147 void paintWall (const GLScreenPaintAttrib&, const GLMatrix&,
122 const CompRegion&, CompOutput *, unsigned int, bool);148 const CompRegion&, CompOutput *, unsigned int, bool);
123149
150 void paintViewport (const GLScreenPaintAttrib& attrib,
151 const GLMatrix& transform,
152 const CompRegion& region,
153 CompOutput *output,
154 unsigned int mask,
155 CompPoint vpPos,
156 GLVector &vpCamPos,
157 bool reflection);
158
159 bool windowsOnVp (CompPoint &p);
160
124 KeyCode leftKey;161 KeyCode leftKey;
125 KeyCode rightKey;162 KeyCode rightKey;
126 KeyCode upKey;163 KeyCode upKey;
127 KeyCode downKey;164 KeyCode downKey;
165
166 Cursor mMoveCursor;
128};167};
129168
130class ExpoWindow :169class ExpoWindow :
131 public CompositeWindowInterface,170 public CompositeWindowInterface,
132 public GLWindowInterface,171 public GLWindowInterface,
172 public WindowInterface,
133 public PluginClassHandler<ExpoWindow, CompWindow>173 public PluginClassHandler<ExpoWindow, CompWindow>
134{174{
135 public:175 public:
136 ExpoWindow (CompWindow *);176 ExpoWindow (CompWindow *);
177 ~ExpoWindow ();
137178
138 bool damageRect (bool, const CompRect&);179 bool damageRect (bool, const CompRect&);
139180
181 void resizeNotify (int dx, int dy, int dw, int dh);
182
140 bool glDraw (const GLMatrix&, GLFragment::Attrib&,183 bool glDraw (const GLMatrix&, GLFragment::Attrib&,
141 const CompRegion&, unsigned int);184 const CompRegion&, unsigned int);
142 bool glPaint (const GLWindowPaintAttrib&, const GLMatrix&,185 bool glPaint (const GLWindowPaintAttrib&, const GLMatrix&,
@@ -147,10 +190,22 @@
147 void glDrawTexture (GLTexture *, GLFragment::Attrib& attrib,190 void glDrawTexture (GLTexture *, GLFragment::Attrib& attrib,
148 unsigned int);191 unsigned int);
149192
193 void
194 paintGlow (GLFragment::Attrib &attrib,
195 const CompRegion &paintRegion,
196 unsigned int mask);
197
198 void
199 computeGlowQuads (GLTexture::Matrix *matrix);
200
150 CompWindow *window;201 CompWindow *window;
151 CompositeWindow *cWindow;202 CompositeWindow *cWindow;
152 GLWindow *gWindow;203 GLWindow *gWindow;
153 ExpoScreen *eScreen;204 ExpoScreen *eScreen;
205
206 float dndOpacity;
207
208 GlowQuad *mGlowQuads;
154};209};
155210
156class ExpoPluginVTable :211class ExpoPluginVTable :
157212
=== added file 'src/glow.cpp'
--- src/glow.cpp 1970-01-01 00:00:00 +0000
+++ src/glow.cpp 2011-09-15 12:36:24 +0000
@@ -0,0 +1,428 @@
1/**
2 *
3 * Compiz group plugin
4 *
5 * glow.cpp
6 *
7 * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
8 * Danny Baumann, Sam Spilsbury
9 * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
10 * Roi Cohen <roico.beryl@gmail.com>
11 * Danny Baumann <maniac@opencompositing.org>
12 * Sam Spilsbury <smspillaz@gmail.com>
13 *
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 **/
26
27#include "expo.h"
28#include "group_glow.h"
29
30const GlowTextureProperties glowTextureProperties = {
31 /* GlowTextureRectangular */
32 glowTexRect, 32, 21
33};
34
35/*
36 * GroupWindow::paintGlow
37 *
38 * Takes our glow texture, stretches the appropriate positions in the glow texture,
39 * adds those geometries (so plugins like wobby and deform this texture correctly)
40 * and then draws the glow texture with this geometry (plugins like wobbly and friends
41 * will automatically deform the texture based on our set geometry)
42 */
43
44void
45ExpoWindow::paintGlow (GLFragment::Attrib &attrib,
46 const CompRegion &paintRegion,
47 unsigned int mask)
48{
49 CompRegion reg;
50 int i;
51
52 /* There are 8 glow parts of the glow texture which we wish to paint
53 * separately with different transformations
54 */
55 for (i = 0; i < NUM_GLOWQUADS; i++)
56 {
57 /* Using precalculated quads here */
58 reg = CompRegion (mGlowQuads[i].mBox);
59
60 if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () &&
61 reg.boundingRect ().y1 () < reg.boundingRect ().y2 ())
62 {
63 GLTexture::MatrixList matl;
64 reg = CompRegion (reg.boundingRect ().x1 (),
65 reg.boundingRect ().y1 (),
66 reg.boundingRect ().width (),
67 reg.boundingRect ().height ());
68
69 matl.push_back (mGlowQuads[i].mMatrix);
70 gWindow->glAddGeometry (matl, reg, paintRegion);
71 }
72 }
73
74 /* If the geometry add succeeded */
75 if (gWindow->geometry ().vertices)
76 {
77 GLFragment::Attrib fAttrib (attrib);
78 GLushort average;
79 GLushort color[3] = {MAXSHORT,
80 MAXSHORT,
81 MAXSHORT};
82
83 float alpha = (float) ExpoScreen::get (screen)->optionGetSelectedColorAlpha () / 65535.0f;
84
85 GLScreen::get (screen)->setTexEnvMode (GL_MODULATE);
86 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
87 glColor4f (((float) ExpoScreen::get (screen)->optionGetSelectedColorRed () / 65535.0f) * alpha,
88 ((float) ExpoScreen::get (screen)->optionGetSelectedColorGreen () / 65535.0f) * alpha,
89 ((float) ExpoScreen::get (screen)->optionGetSelectedColorBlue () / 65535.0f) * alpha,
90 alpha);
91
92 /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force
93 the usage of a good texture filter */
94 foreach (GLTexture *tex, ExpoScreen::get (screen)->outline_texture)
95 {
96 gWindow->glDrawTexture (tex, fAttrib, mask |
97 PAINT_WINDOW_BLEND_MASK |
98 PAINT_WINDOW_TRANSLUCENT_MASK |
99 PAINT_WINDOW_TRANSFORMED_MASK);
100 }
101
102 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
103 GLScreen::get (screen)->setTexEnvMode (GL_REPLACE);
104 glColor4usv (defaultColor);
105 }
106}
107
108/*
109 * ExpoWindow::computeGlowQuads
110 *
111 * This function computures the matrix transformation required for each
112 * part of the glow texture which we wish to stretch to some rectangular
113 * dimentions
114 *
115 * There are eight quads different parts of the texture which we wish to
116 * paint here, the 4 sides and four corners, eg:
117 *
118 * ------------------
119 * | 1 | 4 | 6 |
120 * ------------- ------------------
121 * | 1 | 4 | 6 | | | | |
122 * ------------- | | | |
123 * | 2 | n | 7 | -> | 2 | n | 7 |
124 * ------------- | | | |
125 * | 3 | 5 | 8 | | | | |
126 * ------------- ------------------
127 * | 3 | 5 | 8 |
128 * ------------------
129 *
130 * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for
131 * each quad rect adjusted accordingly for it's size compared to the original
132 * texture size.
133 *
134 * When we are adjusting the matrices here, the initial size of each corner has
135 * a size of of "1.0f", so according to 2x2 matrix rules,
136 * the scale factor is the inverse of the size of the glow (which explains
137 * while you will see here that matrix->xx is (1 / glowSize)
138 * where glowSize is the size the user specifies they want their glow to extend.
139 * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom)
140 *
141 * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect
142 * adjusted by the matrix scale factor (matrix->xx and matrix->yy)
143 *
144 */
145void
146ExpoWindow::computeGlowQuads (GLTexture::Matrix *matrix)
147{
148 CompRect *box;
149 int x1, x2, y1, y2;
150 GLTexture::Matrix *quadMatrix;
151 int glowSize, glowOffset;
152 CompWindow *w = window;
153
154 /* Passing NULL to this function frees the glow quads
155 * (so the window is not painted with glow) */
156
157 if (matrix)
158 {
159 if (!mGlowQuads)
160 mGlowQuads = new GlowQuad[NUM_GLOWQUADS];
161 if (!mGlowQuads)
162 return;
163 }
164 else
165 {
166 if (mGlowQuads)
167 {
168 delete[] mGlowQuads;
169 mGlowQuads = NULL;
170 }
171 return;
172 }
173
174 glowSize = 48;
175 glowOffset = (glowSize * ExpoScreen::get (screen)->mGlowTextureProperties->glowOffset /
176 ExpoScreen::get (screen)->mGlowTextureProperties->textureSize) + 1;
177
178 /* Top left corner */
179 box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox;
180 mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix;
181 quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix;
182
183 /* Set the desired rect dimentions
184 * for the part of the glow we are painting */
185
186 x1 = WIN_REAL_X (w) - glowSize + glowOffset;
187 y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
188
189 /* 2x2 Matrix here, adjust both x and y scale factors
190 * and the x and y position
191 *
192 * Scaling both parts of the texture in a positive direction
193 * here (left to right top to bottom)
194 *
195 * The base position (x0 and y0) here requires us to move backwards
196 * on the x and y dimentions by the calculated rect dimentions
197 * multiplied by the scale factors
198 */
199
200 quadMatrix->xx = 1.0f / glowSize;
201 quadMatrix->yy = 1.0f / (glowSize);
202 quadMatrix->x0 = -(x1 * quadMatrix->xx);
203 quadMatrix->y0 = -(y1 * quadMatrix->yy);
204
205 x2 = MIN (WIN_REAL_X (w) + glowOffset,
206 WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
207 y2 = MIN (WIN_REAL_Y (w) + glowOffset,
208 WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
209
210 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
211
212 /* Top right corner */
213 box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox;
214 mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix;
215 quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix;
216
217 /* Set the desired rect dimentions
218 * for the part of the glow we are painting */
219
220 x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
221 y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
222 x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
223
224 /* 2x2 Matrix here, adjust both x and y scale factors
225 * and the x and y position
226 *
227 * Scaling the y part of the texture in a positive direction
228 * and the x part in a negative direction here
229 * (right to left top to bottom)
230 *
231 * The base position (x0 and y0) here requires us to move backwards
232 * on the y dimention and forwards on x by the calculated rect dimentions
233 * multiplied by the scale factors (since we are moving forward on x we
234 * need the inverse of that which is 1 - x1 * xx
235 */
236
237 quadMatrix->xx = -1.0f / glowSize;
238 quadMatrix->yy = 1.0f / glowSize;
239 quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
240 quadMatrix->y0 = -(y1 * quadMatrix->yy);
241
242 x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset,
243 WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
244 y2 = MIN (WIN_REAL_Y (w) + glowOffset,
245 WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
246
247 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
248
249 /* Bottom left corner */
250 box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox;
251 mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix;
252 quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix;
253
254 x1 = WIN_REAL_X (w) - glowSize + glowOffset;
255 y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
256 x2 = WIN_REAL_X (w) + glowOffset;
257 y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
258
259 /* 2x2 Matrix here, adjust both x and y scale factors
260 * and the x and y position
261 *
262 * Scaling the x part of the texture in a positive direction
263 * and the y part in a negative direction here
264 * (left to right bottom to top)
265 *
266 * The base position (x0 and y0) here requires us to move backwards
267 * on the x dimention and forwards on y by the calculated rect dimentions
268 * multiplied by the scale factors (since we are moving forward on x we
269 * need the inverse of that which is 1 - y1 * yy
270 */
271
272 quadMatrix->xx = 1.0f / glowSize;
273 quadMatrix->yy = -1.0f / glowSize;
274 quadMatrix->x0 = -(x1 * quadMatrix->xx);
275 quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy);
276
277 y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset,
278 WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
279 x2 = MIN (WIN_REAL_X (w) + glowOffset,
280 WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
281
282 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
283
284 /* Bottom right corner */
285 box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox;
286 mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix;
287 quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix;
288
289 x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
290 y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
291 x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
292 y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
293
294 /* 2x2 Matrix here, adjust both x and y scale factors
295 * and the x and y position
296 *
297 * Scaling the both parts of the texture in a negative direction
298 * (right to left bottom to top)
299 *
300 * The base position (x0 and y0) here requires us to move forwards
301 * on both dimentions by the calculated rect dimentions
302 * multiplied by the scale factors
303 */
304
305 quadMatrix->xx = -1.0f / glowSize;
306 quadMatrix->yy = -1.0f / glowSize;
307 quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
308 quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy);
309
310 x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset,
311 WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
312 y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset,
313 WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
314
315 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
316
317 /* Top edge */
318 box = &mGlowQuads[GLOWQUAD_TOP].mBox;
319 mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix;
320 quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix;
321
322 x1 = WIN_REAL_X (w) + glowOffset;
323 y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
324 x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
325 y2 = WIN_REAL_Y (w) + glowOffset;
326
327 /* 2x2 Matrix here, adjust both x and y scale factors
328 * and the x and y position
329 *
330 * No need to scale the x part of the texture here, but we
331 * are scaling on the y part in a positive direciton
332 *
333 * The base position (y0) here requires us to move backwards
334 * on the x dimention and forwards on y by the calculated rect dimentions
335 * multiplied by the scale factors
336 */
337
338 quadMatrix->xx = 0.0f;
339 quadMatrix->yy = 1.0f / glowSize;
340 quadMatrix->x0 = 1.0;
341 quadMatrix->y0 = -(y1 * quadMatrix->yy);
342
343 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
344
345 /* Bottom edge */
346 box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox;
347 mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix;
348 quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix;
349
350 x1 = WIN_REAL_X (w) + glowOffset;
351 y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
352 x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
353 y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
354
355 /* 2x2 Matrix here, adjust both x and y scale factors
356 * and the x and y position
357 *
358 * No need to scale the x part of the texture here, but we
359 * are scaling on the y part in a negative direciton
360 *
361 * The base position (y0) here requires us to move forwards
362 * on y by the calculated rect dimentions
363 * multiplied by the scale factors
364 */
365
366 quadMatrix->xx = 0.0f;
367 quadMatrix->yy = -1.0f / glowSize;
368 quadMatrix->x0 = 1.0;
369 quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy);
370
371 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
372
373 /* Left edge */
374 box = &mGlowQuads[GLOWQUAD_LEFT].mBox;
375 mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix;
376 quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix;
377
378 x1 = WIN_REAL_X (w) - glowSize + glowOffset;
379 y1 = WIN_REAL_Y (w) + glowOffset;
380 x2 = WIN_REAL_X (w) + glowOffset;
381 y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
382
383 /* 2x2 Matrix here, adjust both x and y scale factors
384 * and the x and y position
385 *
386 * No need to scale the y part of the texture here, but we
387 * are scaling on the x part in a positive direciton
388 *
389 * The base position (x0) here requires us to move backwards
390 * on x by the calculated rect dimentions
391 * multiplied by the scale factors
392 */
393
394 quadMatrix->xx = 1.0f / glowSize;
395 quadMatrix->yy = 0.0f;
396 quadMatrix->x0 = -(x1 * quadMatrix->xx);
397 quadMatrix->y0 = 1.0;
398
399 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
400
401 /* Right edge */
402 box = &mGlowQuads[GLOWQUAD_RIGHT].mBox;
403 mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix;
404 quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix;
405
406 x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
407 y1 = WIN_REAL_Y (w) + glowOffset;
408 x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
409 y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
410
411 /* 2x2 Matrix here, adjust both x and y scale factors
412 * and the x and y position
413 *
414 * No need to scale the y part of the texture here, but we
415 * are scaling on the x part in a negative direciton
416 *
417 * The base position (x0) here requires us to move forwards
418 * on x by the calculated rect dimentions
419 * multiplied by the scale factors
420 */
421
422 quadMatrix->xx = -1.0f / glowSize;
423 quadMatrix->yy = 0.0f;
424 quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
425 quadMatrix->y0 = 1.0;
426
427 *box = CompRect (x1, y1, x2 - x1, y2 - y1);
428}
0429
=== added file 'src/glow.h'
--- src/glow.h 1970-01-01 00:00:00 +0000
+++ src/glow.h 2011-09-15 12:36:24 +0000
@@ -0,0 +1,66 @@
1/**
2 *
3 * Compiz group plugin
4 *
5 * glow.h
6 *
7 * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
8 * Danny Baumann, Sam Spilsbury
9 * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
10 * Roi Cohen <roico.beryl@gmail.com>
11 * Danny Baumann <maniac@opencompositing.org>
12 * Sam Spilsbury <smspillaz@gmail.com>
13 *
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 **/
26
27#ifndef _EXPO_GLOW_H
28#define _EXPO_GLOW_H
29
30#define GLOWQUAD_TOPLEFT 0
31#define GLOWQUAD_TOPRIGHT 1
32#define GLOWQUAD_BOTTOMLEFT 2
33#define GLOWQUAD_BOTTOMRIGHT 3
34#define GLOWQUAD_TOP 4
35#define GLOWQUAD_BOTTOM 5
36#define GLOWQUAD_LEFT 6
37#define GLOWQUAD_RIGHT 7
38#define NUM_GLOWQUADS 8
39
40/* Represents a particular glow texture, so here
41 * we have hardcoded in the texture data, the offset
42 * and the size of the texture
43 */
44
45typedef struct _GlowTextureProperties {
46 char *textureData;
47 int textureSize;
48 int glowOffset;
49} GlowTextureProperties;
50
51/* Each glow quad contains a 2x2 scale + positional matrix
52 * (the 3rd column is not used since that is for matrix skew
53 * operations which we do not care about)
54 * and also a CompRect which describes the size and position of
55 * the quad on the glow
56 */
57
58class GlowQuad {
59 public:
60 CompRect mBox;
61 GLTexture::Matrix mMatrix;
62};
63
64extern const GlowTextureProperties glowTextureProperties;
65
66#endif
067
=== added file 'src/group_glow.h'
--- src/group_glow.h 1970-01-01 00:00:00 +0000
+++ src/group_glow.h 2011-09-15 12:36:24 +0000
@@ -0,0 +1,197 @@
1#ifndef _GROUP_GLOWTEX_H
2#define _GROUP_GLOWTEX_H
3
4/**
5 *
6 * Compiz group plugin
7 *
8 * group_glow.h
9 *
10 * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
11 * Danny Baumann, Sam Spilsbury
12 * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
13 * Roi Cohen <roico.beryl@gmail.com>
14 * Danny Baumann <maniac@opencompositing.org>
15 * Sam Spilsbury <smspillaz@gmail.com>
16 *
17 *
18 * This program is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU General Public License
20 * as published by the Free Software Foundation; either version 2
21 * of the License, or (at your option) any later version.
22 *
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
27 *
28 **/
29
30/*
31 * glowTex
32 */
33
34static char glowTexRect[4097] = {
35 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
36 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
37 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377"
38 "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377"
39 "\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
40 "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377"
41 "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377"
42 "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6"
43 "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377"
44 "\14\377\377\377\14\377\377\377\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
45 "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14"
46 "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377"
47 "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377"
48 "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377"
49 "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377"
50 "\35\377\377\377\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377"
51 "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377"
52 "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377"
53 "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377"
54 "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377"
55 "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0"
56 "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377"
57 "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377"
58 "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377"
59 "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377"
60 "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377"
61 "\377\377L\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377"
62 "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377"
63 "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377"
64 "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377"
65 "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377"
66 "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377"
67 "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377"
68 "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365"
69 "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367"
70 "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367"
71 "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367"
72 "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0"
73 "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377"
74 "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376"
75 "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377"
76 "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263"
77 "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377"
78 "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266"
79 "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377"
80 "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377"
81 "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263"
82 "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377"
83 "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320"
84 "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377"
85 "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322"
86 "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377"
87 "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376"
88 "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377"
89 "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377"
90 "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377"
91 "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377"
92 "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377"
93 "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377"
94 "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307"
95 "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374"
96 "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361"
97 "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374"
98 "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362"
99 "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377"
100 "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377"
101 "\231\377\377\377\263\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
102 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
103 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
104 "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363"
105 "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0"
106 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
107 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
108 "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377"
109 "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377"
110 "\263\377\377\377\315\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
111 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
112 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377"
113 "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377"
114 "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345"
115 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
116 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
117 "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\27\377"
118 "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377"
119 "\377\304\377\377\377\332\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
120 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
121 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377"
122 "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377"
123 "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374"
124 "\374\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
125 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
126 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377"
127 "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260"
128 "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0"
129 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
130 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
131 "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377"
132 "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344"
133 "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
134 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
135 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377"
136 "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377"
137 "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0"
138 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
139 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
140 "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377"
141 "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377"
142 "\377\344\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
143 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
144 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377"
145 "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221"
146 "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0"
147 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
148 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
149 "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377"
150 "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322"
151 "\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
152 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
153 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377"
154 "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377"
155 "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362"
156 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
157 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
158 "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377"
159 "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373"
160 "\373\322\377\377\377\345\377\377\377\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
161 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
162 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377"
163 "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377"
164 "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374"
165 "\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
166 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
167 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377"
168 "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266"
169 "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0"
170 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
171 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
172 "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377"
173 "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345"
174 "\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
175 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
176 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377"
177 "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377"
178 "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0"
179 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
180 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
181 "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377"
182 "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377"
183 "\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
184 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
185 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377"
186 "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224"
187 "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0"
188 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
189 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
190 "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377"
191 "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322"
192 "\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
193 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
194 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
195};
196
197#endif

Subscribers

People subscribed via source and target branches

to all changes: