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

Proposed by Sam Spilsbury
Status: Superseded
Proposed branch: lp:~compiz-team/compiz-expo-plugin/oneiric.polish
Merge into: lp:~compiz-team/compiz-expo-plugin/oneiric
Diff against target: 823 lines (+720/-5)
6 files modified
expo.xml.in (+6/-5)
src/expo.cpp (+22/-0)
src/expo.h (+1/-0)
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.polish
Reviewer Review Type Date Requested Status
Compiz Maintainers Pending
Review via email: mp+73655@code.launchpad.net

This proposal has been superseded by 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.
153. By Sam Spilsbury

Add missing files

154. By Sam Spilsbury

Change defaults

155. By Sam Spilsbury

Fix offsets

156. By Sam Spilsbury

Added glow outline

157. By Sam Spilsbury

Opacity fix

158. By Sam Spilsbury

Require the imgpng plugin

159. By Sam Spilsbury

Use 0.005 as the default so that the glow is visible

160. By Sam Spilsbury

Load after imgpng

161. By Sam Spilsbury

Fix crash because viewportForGeometry can return a negative value (bug in core)

162. By Sam Spilsbury

Scale the texture by the viewport dimention size so that the size is consistent
across all resolutions

Unmerged revisions

162. By Sam Spilsbury

Scale the texture by the viewport dimention size so that the size is consistent
across all resolutions

161. By Sam Spilsbury

Fix crash because viewportForGeometry can return a negative value (bug in core)

160. By Sam Spilsbury

Load after imgpng

159. By Sam Spilsbury

Use 0.005 as the default so that the glow is visible

158. By Sam Spilsbury

Require the imgpng plugin

157. By Sam Spilsbury

Opacity fix

156. By Sam Spilsbury

Added glow outline

155. By Sam Spilsbury

Fix offsets

154. By Sam Spilsbury

Change defaults

153. By Sam Spilsbury

Add missing files

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'expo.xml.in'
2--- expo.xml.in 2011-08-30 16:50:58 +0000
3+++ expo.xml.in 2011-09-02 08:51:23 +0000
4@@ -17,6 +17,7 @@
5 <plugin>wobbly</plugin>
6 <plugin>animation</plugin>
7 <plugin>wallpaper</plugin>
8+ <plugin>imgpng</plugin>
9 </relation>
10 </deps>
11 <options>
12@@ -133,7 +134,7 @@
13 <_long> Left Side screen space of expo in pixels</_long>
14 <min>-1680</min>
15 <max>1680</max>
16- <default>36</default>
17+ <default>64</default>
18 </option>
19 <option name="y_offset" type="int">
20 <_short>Y Space</_short>
21@@ -145,7 +146,7 @@
22 <option name="distance" type="float">
23 <_short>Distance</_short>
24 <_long>Distance of the expo wall</_long>
25- <default>0.0</default>
26+ <default>0.005</default>
27 <min>0.0</min>
28 <max>1.0</max>
29 <precision>0.01</precision>
30@@ -204,7 +205,7 @@
31 <option name="vp_brightness" type="float">
32 <_short>Brightness</_short>
33 <_long>Inactive viewport brightness.</_long>
34- <default>80.0</default>
35+ <default>40.0</default>
36 <min>0.0</min>
37 <max>100.0</max>
38 <precision>0.1</precision>
39@@ -212,7 +213,7 @@
40 <option name="vp_saturation" type="float">
41 <_short>Saturation</_short>
42 <_long>Inactive viewport saturation.</_long>
43- <default>100.0</default>
44+ <default>40.0</default>
45 <min>0.0</min>
46 <max>100.0</max>
47 <precision>0.1</precision>
48@@ -224,7 +225,7 @@
49 <red>0xfbfb</red>
50 <green>0x8b8b</green>
51 <blue>0x0</blue>
52- <alpha>0x9f9f</alpha>
53+ <alpha>0xffff</alpha>
54 </default>
55 </option>
56 </subgroup>
57
58=== added file 'images/glow_outline.png'
59Binary files images/glow_outline.png 1970-01-01 00:00:00 +0000 and images/glow_outline.png 2011-09-02 08:51:23 +0000 differ
60=== modified file 'src/expo.cpp'
61--- src/expo.cpp 2011-09-01 11:56:54 +0000
62+++ src/expo.cpp 2011-09-02 08:51:23 +0000
63@@ -836,6 +836,15 @@
64 }
65 }
66 }
67+
68+ /* Calculate the current viewport size */
69+ int tl[2] = { 0, 0 };
70+ int br[2] = { screen->width (), screen->height () };
71+
72+ invertTransformedVertex (attrib, sTransform3, output, tl);
73+ invertTransformedVertex (attrib, sTransform3, output, br);
74+
75+ viewport_size = CompSize (br[0] - tl[0], br[1] - tl[1]);
76 }
77
78 void
79@@ -1037,6 +1046,13 @@
80 CompPoint vp;
81
82 screen->viewportForGeometry (dndWindow->geometry (), vp);
83+
84+ while (vp.x () < 0)
85+ vp.setX (screen->vpSize ().width () + vp.x ());
86+
87+ while (vp.y () < 0)
88+ vp.setY (screen->vpSize ().height () + vp.y ());
89+
90 paintViewport (attrib, sTransform, infiniteRegion, output, mask, vp, vpCamPos, reflection);
91 }
92
93@@ -1245,6 +1261,12 @@
94 * re-added later */
95 gWindow->geometry().reset();
96
97+ float xScale = screen->width () / (float) eScreen->viewport_size.width ();
98+ float yScale = screen->height () / (float) eScreen->viewport_size.height ();
99+
100+ mat.xx *= xScale;
101+ mat.yy *= yScale;
102+
103 /* Not sure what this does, but it is necessary
104 * (adjusts for scale?) */
105 mat.x0 -= mat.xx * reg.boundingRect().x1();
106
107=== modified file 'src/expo.h'
108--- src/expo.h 2011-09-01 11:56:54 +0000
109+++ src/expo.h 2011-09-02 08:51:23 +0000
110@@ -128,6 +128,7 @@
111
112 GLTexture::List polkadots_texture;
113 CompSize polkadots_texture_size;
114+ CompSize viewport_size;
115
116 GLTexture::List outline_texture;
117 CompSize outline_texture_size;
118
119=== added file 'src/glow.cpp'
120--- src/glow.cpp 1970-01-01 00:00:00 +0000
121+++ src/glow.cpp 2011-09-02 08:51:23 +0000
122@@ -0,0 +1,428 @@
123+/**
124+ *
125+ * Compiz group plugin
126+ *
127+ * glow.cpp
128+ *
129+ * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
130+ * Danny Baumann, Sam Spilsbury
131+ * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
132+ * Roi Cohen <roico.beryl@gmail.com>
133+ * Danny Baumann <maniac@opencompositing.org>
134+ * Sam Spilsbury <smspillaz@gmail.com>
135+ *
136+ *
137+ * This program is free software; you can redistribute it and/or
138+ * modify it under the terms of the GNU General Public License
139+ * as published by the Free Software Foundation; either version 2
140+ * of the License, or (at your option) any later version.
141+ *
142+ * This program is distributed in the hope that it will be useful,
143+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
144+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
145+ * GNU General Public License for more details.
146+ *
147+ **/
148+
149+#include "expo.h"
150+#include "group_glow.h"
151+
152+const GlowTextureProperties glowTextureProperties = {
153+ /* GlowTextureRectangular */
154+ glowTexRect, 32, 21
155+};
156+
157+/*
158+ * GroupWindow::paintGlow
159+ *
160+ * Takes our glow texture, stretches the appropriate positions in the glow texture,
161+ * adds those geometries (so plugins like wobby and deform this texture correctly)
162+ * and then draws the glow texture with this geometry (plugins like wobbly and friends
163+ * will automatically deform the texture based on our set geometry)
164+ */
165+
166+void
167+ExpoWindow::paintGlow (GLFragment::Attrib &attrib,
168+ const CompRegion &paintRegion,
169+ unsigned int mask)
170+{
171+ CompRegion reg;
172+ int i;
173+
174+ /* There are 8 glow parts of the glow texture which we wish to paint
175+ * separately with different transformations
176+ */
177+ for (i = 0; i < NUM_GLOWQUADS; i++)
178+ {
179+ /* Using precalculated quads here */
180+ reg = CompRegion (mGlowQuads[i].mBox);
181+
182+ if (reg.boundingRect ().x1 () < reg.boundingRect ().x2 () &&
183+ reg.boundingRect ().y1 () < reg.boundingRect ().y2 ())
184+ {
185+ GLTexture::MatrixList matl;
186+ reg = CompRegion (reg.boundingRect ().x1 (),
187+ reg.boundingRect ().y1 (),
188+ reg.boundingRect ().width (),
189+ reg.boundingRect ().height ());
190+
191+ matl.push_back (mGlowQuads[i].mMatrix);
192+ gWindow->glAddGeometry (matl, reg, paintRegion);
193+ }
194+ }
195+
196+ /* If the geometry add succeeded */
197+ if (gWindow->geometry ().vertices)
198+ {
199+ GLFragment::Attrib fAttrib (attrib);
200+ GLushort average;
201+ GLushort color[3] = {MAXSHORT,
202+ MAXSHORT,
203+ MAXSHORT};
204+
205+ float alpha = (float) ExpoScreen::get (screen)->optionGetSelectedColorAlpha () / 65535.0f;
206+
207+ GLScreen::get (screen)->setTexEnvMode (GL_MODULATE);
208+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
209+ glColor4f (((float) ExpoScreen::get (screen)->optionGetSelectedColorRed () / 65535.0f) * alpha,
210+ ((float) ExpoScreen::get (screen)->optionGetSelectedColorGreen () / 65535.0f) * alpha,
211+ ((float) ExpoScreen::get (screen)->optionGetSelectedColorBlue () / 65535.0f) * alpha,
212+ alpha);
213+
214+ /* we use PAINT_WINDOW_TRANSFORMED_MASK here to force
215+ the usage of a good texture filter */
216+ foreach (GLTexture *tex, ExpoScreen::get (screen)->outline_texture)
217+ {
218+ gWindow->glDrawTexture (tex, fAttrib, mask |
219+ PAINT_WINDOW_BLEND_MASK |
220+ PAINT_WINDOW_TRANSLUCENT_MASK |
221+ PAINT_WINDOW_TRANSFORMED_MASK);
222+ }
223+
224+ glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
225+ GLScreen::get (screen)->setTexEnvMode (GL_REPLACE);
226+ glColor4usv (defaultColor);
227+ }
228+}
229+
230+/*
231+ * ExpoWindow::computeGlowQuads
232+ *
233+ * This function computures the matrix transformation required for each
234+ * part of the glow texture which we wish to stretch to some rectangular
235+ * dimentions
236+ *
237+ * There are eight quads different parts of the texture which we wish to
238+ * paint here, the 4 sides and four corners, eg:
239+ *
240+ * ------------------
241+ * | 1 | 4 | 6 |
242+ * ------------- ------------------
243+ * | 1 | 4 | 6 | | | | |
244+ * ------------- | | | |
245+ * | 2 | n | 7 | -> | 2 | n | 7 |
246+ * ------------- | | | |
247+ * | 3 | 5 | 8 | | | | |
248+ * ------------- ------------------
249+ * | 3 | 5 | 8 |
250+ * ------------------
251+ *
252+ * In this example here, 2, 4, 5 and 7 are stretched, and the matrices for
253+ * each quad rect adjusted accordingly for it's size compared to the original
254+ * texture size.
255+ *
256+ * When we are adjusting the matrices here, the initial size of each corner has
257+ * a size of of "1.0f", so according to 2x2 matrix rules,
258+ * the scale factor is the inverse of the size of the glow (which explains
259+ * while you will see here that matrix->xx is (1 / glowSize)
260+ * where glowSize is the size the user specifies they want their glow to extend.
261+ * (likewise, matrix->yy is adjusted similarly for corners and for top/bottom)
262+ *
263+ * matrix->x0 and matrix->y0 here are set to be the top left edge of the rect
264+ * adjusted by the matrix scale factor (matrix->xx and matrix->yy)
265+ *
266+ */
267+void
268+ExpoWindow::computeGlowQuads (GLTexture::Matrix *matrix)
269+{
270+ CompRect *box;
271+ int x1, x2, y1, y2;
272+ GLTexture::Matrix *quadMatrix;
273+ int glowSize, glowOffset;
274+ CompWindow *w = window;
275+
276+ /* Passing NULL to this function frees the glow quads
277+ * (so the window is not painted with glow) */
278+
279+ if (matrix)
280+ {
281+ if (!mGlowQuads)
282+ mGlowQuads = new GlowQuad[NUM_GLOWQUADS];
283+ if (!mGlowQuads)
284+ return;
285+ }
286+ else
287+ {
288+ if (mGlowQuads)
289+ {
290+ delete[] mGlowQuads;
291+ mGlowQuads = NULL;
292+ }
293+ return;
294+ }
295+
296+ glowSize = 48;
297+ glowOffset = (glowSize * ExpoScreen::get (screen)->mGlowTextureProperties->glowOffset /
298+ ExpoScreen::get (screen)->mGlowTextureProperties->textureSize) + 1;
299+
300+ /* Top left corner */
301+ box = &mGlowQuads[GLOWQUAD_TOPLEFT].mBox;
302+ mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix = *matrix;
303+ quadMatrix = &mGlowQuads[GLOWQUAD_TOPLEFT].mMatrix;
304+
305+ /* Set the desired rect dimentions
306+ * for the part of the glow we are painting */
307+
308+ x1 = WIN_REAL_X (w) - glowSize + glowOffset;
309+ y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
310+
311+ /* 2x2 Matrix here, adjust both x and y scale factors
312+ * and the x and y position
313+ *
314+ * Scaling both parts of the texture in a positive direction
315+ * here (left to right top to bottom)
316+ *
317+ * The base position (x0 and y0) here requires us to move backwards
318+ * on the x and y dimentions by the calculated rect dimentions
319+ * multiplied by the scale factors
320+ */
321+
322+ quadMatrix->xx = 1.0f / glowSize;
323+ quadMatrix->yy = 1.0f / (glowSize);
324+ quadMatrix->x0 = -(x1 * quadMatrix->xx);
325+ quadMatrix->y0 = -(y1 * quadMatrix->yy);
326+
327+ x2 = MIN (WIN_REAL_X (w) + glowOffset,
328+ WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
329+ y2 = MIN (WIN_REAL_Y (w) + glowOffset,
330+ WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
331+
332+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
333+
334+ /* Top right corner */
335+ box = &mGlowQuads[GLOWQUAD_TOPRIGHT].mBox;
336+ mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix = *matrix;
337+ quadMatrix = &mGlowQuads[GLOWQUAD_TOPRIGHT].mMatrix;
338+
339+ /* Set the desired rect dimentions
340+ * for the part of the glow we are painting */
341+
342+ x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
343+ y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
344+ x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
345+
346+ /* 2x2 Matrix here, adjust both x and y scale factors
347+ * and the x and y position
348+ *
349+ * Scaling the y part of the texture in a positive direction
350+ * and the x part in a negative direction here
351+ * (right to left top to bottom)
352+ *
353+ * The base position (x0 and y0) here requires us to move backwards
354+ * on the y dimention and forwards on x by the calculated rect dimentions
355+ * multiplied by the scale factors (since we are moving forward on x we
356+ * need the inverse of that which is 1 - x1 * xx
357+ */
358+
359+ quadMatrix->xx = -1.0f / glowSize;
360+ quadMatrix->yy = 1.0f / glowSize;
361+ quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
362+ quadMatrix->y0 = -(y1 * quadMatrix->yy);
363+
364+ x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset,
365+ WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
366+ y2 = MIN (WIN_REAL_Y (w) + glowOffset,
367+ WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
368+
369+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
370+
371+ /* Bottom left corner */
372+ box = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mBox;
373+ mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix = *matrix;
374+ quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMLEFT].mMatrix;
375+
376+ x1 = WIN_REAL_X (w) - glowSize + glowOffset;
377+ y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
378+ x2 = WIN_REAL_X (w) + glowOffset;
379+ y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
380+
381+ /* 2x2 Matrix here, adjust both x and y scale factors
382+ * and the x and y position
383+ *
384+ * Scaling the x part of the texture in a positive direction
385+ * and the y part in a negative direction here
386+ * (left to right bottom to top)
387+ *
388+ * The base position (x0 and y0) here requires us to move backwards
389+ * on the x dimention and forwards on y by the calculated rect dimentions
390+ * multiplied by the scale factors (since we are moving forward on x we
391+ * need the inverse of that which is 1 - y1 * yy
392+ */
393+
394+ quadMatrix->xx = 1.0f / glowSize;
395+ quadMatrix->yy = -1.0f / glowSize;
396+ quadMatrix->x0 = -(x1 * quadMatrix->xx);
397+ quadMatrix->y0 = 1.0f - (y1 * quadMatrix->yy);
398+
399+ y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset,
400+ WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
401+ x2 = MIN (WIN_REAL_X (w) + glowOffset,
402+ WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
403+
404+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
405+
406+ /* Bottom right corner */
407+ box = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mBox;
408+ mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix = *matrix;
409+ quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOMRIGHT].mMatrix;
410+
411+ x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
412+ y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
413+ x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
414+ y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
415+
416+ /* 2x2 Matrix here, adjust both x and y scale factors
417+ * and the x and y position
418+ *
419+ * Scaling the both parts of the texture in a negative direction
420+ * (right to left bottom to top)
421+ *
422+ * The base position (x0 and y0) here requires us to move forwards
423+ * on both dimentions by the calculated rect dimentions
424+ * multiplied by the scale factors
425+ */
426+
427+ quadMatrix->xx = -1.0f / glowSize;
428+ quadMatrix->yy = -1.0f / glowSize;
429+ quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
430+ quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy);
431+
432+ x1 = MAX (WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset,
433+ WIN_REAL_X (w) + (WIN_REAL_WIDTH (w) / 2));
434+ y1 = MAX (WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset,
435+ WIN_REAL_Y (w) + (WIN_REAL_HEIGHT (w) / 2));
436+
437+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
438+
439+ /* Top edge */
440+ box = &mGlowQuads[GLOWQUAD_TOP].mBox;
441+ mGlowQuads[GLOWQUAD_TOP].mMatrix = *matrix;
442+ quadMatrix = &mGlowQuads[GLOWQUAD_TOP].mMatrix;
443+
444+ x1 = WIN_REAL_X (w) + glowOffset;
445+ y1 = WIN_REAL_Y (w) - glowSize + glowOffset;
446+ x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
447+ y2 = WIN_REAL_Y (w) + glowOffset;
448+
449+ /* 2x2 Matrix here, adjust both x and y scale factors
450+ * and the x and y position
451+ *
452+ * No need to scale the x part of the texture here, but we
453+ * are scaling on the y part in a positive direciton
454+ *
455+ * The base position (y0) here requires us to move backwards
456+ * on the x dimention and forwards on y by the calculated rect dimentions
457+ * multiplied by the scale factors
458+ */
459+
460+ quadMatrix->xx = 0.0f;
461+ quadMatrix->yy = 1.0f / glowSize;
462+ quadMatrix->x0 = 1.0;
463+ quadMatrix->y0 = -(y1 * quadMatrix->yy);
464+
465+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
466+
467+ /* Bottom edge */
468+ box = &mGlowQuads[GLOWQUAD_BOTTOM].mBox;
469+ mGlowQuads[GLOWQUAD_BOTTOM].mMatrix = *matrix;
470+ quadMatrix = &mGlowQuads[GLOWQUAD_BOTTOM].mMatrix;
471+
472+ x1 = WIN_REAL_X (w) + glowOffset;
473+ y1 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
474+ x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
475+ y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) + glowSize - glowOffset;
476+
477+ /* 2x2 Matrix here, adjust both x and y scale factors
478+ * and the x and y position
479+ *
480+ * No need to scale the x part of the texture here, but we
481+ * are scaling on the y part in a negative direciton
482+ *
483+ * The base position (y0) here requires us to move forwards
484+ * on y by the calculated rect dimentions
485+ * multiplied by the scale factors
486+ */
487+
488+ quadMatrix->xx = 0.0f;
489+ quadMatrix->yy = -1.0f / glowSize;
490+ quadMatrix->x0 = 1.0;
491+ quadMatrix->y0 = 1.0 - (y1 * quadMatrix->yy);
492+
493+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
494+
495+ /* Left edge */
496+ box = &mGlowQuads[GLOWQUAD_LEFT].mBox;
497+ mGlowQuads[GLOWQUAD_LEFT].mMatrix = *matrix;
498+ quadMatrix = &mGlowQuads[GLOWQUAD_LEFT].mMatrix;
499+
500+ x1 = WIN_REAL_X (w) - glowSize + glowOffset;
501+ y1 = WIN_REAL_Y (w) + glowOffset;
502+ x2 = WIN_REAL_X (w) + glowOffset;
503+ y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
504+
505+ /* 2x2 Matrix here, adjust both x and y scale factors
506+ * and the x and y position
507+ *
508+ * No need to scale the y part of the texture here, but we
509+ * are scaling on the x part in a positive direciton
510+ *
511+ * The base position (x0) here requires us to move backwards
512+ * on x by the calculated rect dimentions
513+ * multiplied by the scale factors
514+ */
515+
516+ quadMatrix->xx = 1.0f / glowSize;
517+ quadMatrix->yy = 0.0f;
518+ quadMatrix->x0 = -(x1 * quadMatrix->xx);
519+ quadMatrix->y0 = 1.0;
520+
521+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
522+
523+ /* Right edge */
524+ box = &mGlowQuads[GLOWQUAD_RIGHT].mBox;
525+ mGlowQuads[GLOWQUAD_RIGHT].mMatrix = *matrix;
526+ quadMatrix = &mGlowQuads[GLOWQUAD_RIGHT].mMatrix;
527+
528+ x1 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) - glowOffset;
529+ y1 = WIN_REAL_Y (w) + glowOffset;
530+ x2 = WIN_REAL_X (w) + WIN_REAL_WIDTH (w) + glowSize - glowOffset;
531+ y2 = WIN_REAL_Y (w) + WIN_REAL_HEIGHT (w) - glowOffset;
532+
533+ /* 2x2 Matrix here, adjust both x and y scale factors
534+ * and the x and y position
535+ *
536+ * No need to scale the y part of the texture here, but we
537+ * are scaling on the x part in a negative direciton
538+ *
539+ * The base position (x0) here requires us to move forwards
540+ * on x by the calculated rect dimentions
541+ * multiplied by the scale factors
542+ */
543+
544+ quadMatrix->xx = -1.0f / glowSize;
545+ quadMatrix->yy = 0.0f;
546+ quadMatrix->x0 = 1.0 - (x1 * quadMatrix->xx);
547+ quadMatrix->y0 = 1.0;
548+
549+ *box = CompRect (x1, y1, x2 - x1, y2 - y1);
550+}
551
552=== added file 'src/glow.h'
553--- src/glow.h 1970-01-01 00:00:00 +0000
554+++ src/glow.h 2011-09-02 08:51:23 +0000
555@@ -0,0 +1,66 @@
556+/**
557+ *
558+ * Compiz group plugin
559+ *
560+ * glow.h
561+ *
562+ * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
563+ * Danny Baumann, Sam Spilsbury
564+ * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
565+ * Roi Cohen <roico.beryl@gmail.com>
566+ * Danny Baumann <maniac@opencompositing.org>
567+ * Sam Spilsbury <smspillaz@gmail.com>
568+ *
569+ *
570+ * This program is free software; you can redistribute it and/or
571+ * modify it under the terms of the GNU General Public License
572+ * as published by the Free Software Foundation; either version 2
573+ * of the License, or (at your option) any later version.
574+ *
575+ * This program is distributed in the hope that it will be useful,
576+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
577+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
578+ * GNU General Public License for more details.
579+ *
580+ **/
581+
582+#ifndef _EXPO_GLOW_H
583+#define _EXPO_GLOW_H
584+
585+#define GLOWQUAD_TOPLEFT 0
586+#define GLOWQUAD_TOPRIGHT 1
587+#define GLOWQUAD_BOTTOMLEFT 2
588+#define GLOWQUAD_BOTTOMRIGHT 3
589+#define GLOWQUAD_TOP 4
590+#define GLOWQUAD_BOTTOM 5
591+#define GLOWQUAD_LEFT 6
592+#define GLOWQUAD_RIGHT 7
593+#define NUM_GLOWQUADS 8
594+
595+/* Represents a particular glow texture, so here
596+ * we have hardcoded in the texture data, the offset
597+ * and the size of the texture
598+ */
599+
600+typedef struct _GlowTextureProperties {
601+ char *textureData;
602+ int textureSize;
603+ int glowOffset;
604+} GlowTextureProperties;
605+
606+/* Each glow quad contains a 2x2 scale + positional matrix
607+ * (the 3rd column is not used since that is for matrix skew
608+ * operations which we do not care about)
609+ * and also a CompRect which describes the size and position of
610+ * the quad on the glow
611+ */
612+
613+class GlowQuad {
614+ public:
615+ CompRect mBox;
616+ GLTexture::Matrix mMatrix;
617+};
618+
619+extern const GlowTextureProperties glowTextureProperties;
620+
621+#endif
622
623=== added file 'src/group_glow.h'
624--- src/group_glow.h 1970-01-01 00:00:00 +0000
625+++ src/group_glow.h 2011-09-02 08:51:23 +0000
626@@ -0,0 +1,197 @@
627+#ifndef _GROUP_GLOWTEX_H
628+#define _GROUP_GLOWTEX_H
629+
630+/**
631+ *
632+ * Compiz group plugin
633+ *
634+ * group_glow.h
635+ *
636+ * Copyright : (C) 2006-2010 by Patrick Niklaus, Roi Cohen,
637+ * Danny Baumann, Sam Spilsbury
638+ * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
639+ * Roi Cohen <roico.beryl@gmail.com>
640+ * Danny Baumann <maniac@opencompositing.org>
641+ * Sam Spilsbury <smspillaz@gmail.com>
642+ *
643+ *
644+ * This program is free software; you can redistribute it and/or
645+ * modify it under the terms of the GNU General Public License
646+ * as published by the Free Software Foundation; either version 2
647+ * of the License, or (at your option) any later version.
648+ *
649+ * This program is distributed in the hope that it will be useful,
650+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
651+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
652+ * GNU General Public License for more details.
653+ *
654+ **/
655+
656+/*
657+ * glowTex
658+ */
659+
660+static char glowTexRect[4097] = {
661+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
662+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
663+ "\0\0\0\0\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"
664+ "\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377"
665+ "\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"
666+ "\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"
667+ "\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377"
668+ "\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\6"
669+ "\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377\14\377\377\377"
670+ "\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"
671+ "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\6\377\377\377\14"
672+ "\377\377\377\14\377\377\377\22\377\377\377\22\377\377\377\22\377\377\377"
673+ "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377"
674+ "\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377\27\377\377\377"
675+ "\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377\35\377\377\377"
676+ "\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"
677+ "\377\6\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377\27\377\377"
678+ "\377\27\377\377\377\35\377\377\377#\377\377\377'\377\377\377'\377\377\377"
679+ "+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377\377+\377\377"
680+ "\377+\377\377\377+\377\377\377+\377\377\3771\377\377\3771\377\377\3771\377"
681+ "\377\3771\377\377\3771\377\377\3771\377\377\3771\0\0\0\0\0\0\0\0\0\0\0\0"
682+ "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377\377"
683+ "\27\377\377\377\35\377\377\377#\377\377\377+\377\377\3771\377\377\3776\377"
684+ "\377\377<\377\377\377>\377\377\377C\377\377\377I\377\377\377I\377\377\377"
685+ "I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377\377I\377\377"
686+ "\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377\377\377L\377"
687+ "\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"
688+ "\377\377\22\377\377\377\27\377\377\377#\377\377\377+\377\377\3776\377\377"
689+ "\377C\377\377\377L\377\377\377U\377\377\377]\377\377\377`\377\377\377d\377"
690+ "\377\377h\377\377\377k\377\377\377k\377\377\377k\377\377\377k\377\377\377"
691+ "k\377\377\377k\377\377\377k\377\377\377p\377\377\377p\377\377\377p\377\377"
692+ "\377p\377\377\377p\377\377\377p\377\377\377p\0\0\0\0\0\0\0\0\0\0\0\0\377"
693+ "\377\377\6\377\377\377\14\377\377\377\22\314\314\314\35\377\377\377'\377"
694+ "\377\3771\377\377\377>\357\357\357P\377\377\377]\363\363\363k\365\365\365"
695+ "v\365\365\365|\377\377\377\202\367\367\367\210\367\367\367\214\367\367\367"
696+ "\216\367\367\367\221\367\367\367\221\367\367\367\221\367\367\367\221\367"
697+ "\367\367\221\367\367\367\221\367\367\367\224\367\367\367\224\367\367\367"
698+ "\224\367\367\367\224\367\367\367\224\367\367\367\224\367\367\367\224\0\0"
699+ "\0\0\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\27\377"
700+ "\377\377'\377\377\3776\377\377\377I\377\377\377Y\377\377\377k\376\376\376"
701+ "y\377\377\377\210\377\377\377\224\377\377\377\235\377\377\377\245\377\377"
702+ "\377\253\377\377\377\255\377\377\377\262\377\377\377\262\377\377\377\263"
703+ "\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\263\377\377"
704+ "\377\266\377\377\377\266\377\377\377\266\377\377\377\266\377\377\377\266"
705+ "\377\377\377\266\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377"
706+ "\14\377\377\377\27\377\377\377#\377\377\3771\377\377\377I\377\377\377]\377"
707+ "\377\377r\377\377\377\205\377\377\377\231\377\377\377\247\377\377\377\263"
708+ "\377\377\377\275\377\377\377\304\377\377\377\310\377\377\377\313\377\377"
709+ "\377\316\377\377\377\320\377\377\377\320\377\377\377\320\377\377\377\320"
710+ "\377\377\377\320\377\377\377\320\377\377\377\322\377\377\377\322\377\377"
711+ "\377\322\377\377\377\322\377\377\377\322\377\377\377\322\377\377\377\322"
712+ "\0\0\0\0\377\377\377\6\377\377\377\6\377\377\377\22\377\377\377\35\377\377"
713+ "\377+\377\377\377>\377\377\377Y\377\377\377r\377\377\377\210\376\376\376"
714+ "\237\377\377\377\262\377\377\377\302\377\377\377\313\377\377\377\324\377"
715+ "\377\377\332\376\376\376\336\377\377\377\341\377\377\377\342\377\377\377"
716+ "\344\377\377\377\344\377\377\377\344\377\377\377\344\377\377\377\344\377"
717+ "\377\377\344\377\377\377\345\377\377\377\345\377\377\377\345\377\377\377"
718+ "\345\377\377\377\345\377\377\377\345\377\377\377\345\0\0\0\0\377\377\377"
719+ "\6\377\377\377\14\377\377\377\27\377\377\377#\377\377\3776\377\377\377P\377"
720+ "\377\377k\377\377\377\205\376\376\376\237\372\372\372\266\377\377\377\307"
721+ "\373\373\373\325\373\373\373\337\374\374\374\345\374\374\374\352\374\374"
722+ "\374\355\374\374\374\357\374\374\374\360\374\374\374\361\374\374\374\361"
723+ "\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374"
724+ "\374\362\374\374\374\362\374\374\374\362\374\374\374\362\374\374\374\362"
725+ "\374\374\374\362\374\374\374\362\0\0\0\0\377\377\377\6\377\377\377\14\377"
726+ "\377\377\35\377\377\377+\377\377\377C\377\377\377]\377\377\377|\377\377\377"
727+ "\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"
728+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
729+ "\0\0\0\0\0\0\0\0\0\0\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"
730+ "\377\377\6\377\377\377\22\324\324\324#\377\377\3771\377\377\377L\363\363"
731+ "\363k\377\377\377\210\377\377\377\247\377\377\377\302\377\377\377\325\0\0"
732+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
733+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
734+ "\0\0\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\22\377\377"
735+ "\377#\377\377\377<\377\377\377U\377\377\377v\377\377\377\226\377\377\377"
736+ "\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"
737+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
738+ "\0\0\0\0\0\0\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"
739+ "\6\377\377\377\14\377\377\377\27\377\377\377'\377\377\377>\377\377\377]\377"
740+ "\377\377|\370\370\370\237\377\377\377\275\373\373\373\325\377\377\377\345"
741+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
742+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
743+ "\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"
744+ "\377\377+\377\377\377C\377\377\377`\377\377\377\202\377\377\377\247\377\377"
745+ "\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"
746+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
747+ "\0\0\0\0\0\0\0\0\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"
748+ "\377\6\377\377\377\14\377\377\377\27\377\377\377+\377\377\377C\377\377\377"
749+ "d\377\377\377\210\377\377\377\253\377\377\377\310\376\376\376\336\374\374"
750+ "\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"
751+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
752+ "\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"
753+ "\35\377\377\377+\377\377\377I\377\377\377h\377\377\377\214\377\377\377\260"
754+ "\377\377\377\313\374\374\374\342\374\374\374\357\0\0\0\0\0\0\0\0\0\0\0\0"
755+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
756+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
757+ "\377\377\377\6\377\377\377\14\377\377\377\35\342\342\3421\377\377\377I\377"
758+ "\377\377k\377\377\377\216\377\377\377\262\377\377\377\316\374\374\374\344"
759+ "\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"
760+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
761+ "\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"
762+ "\377\377\35\377\377\3771\377\377\377L\377\377\377k\377\377\377\221\377\377"
763+ "\377\263\377\377\377\320\377\377\377\344\377\377\377\361\0\0\0\0\0\0\0\0"
764+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
765+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
766+ "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377"
767+ "\377L\377\377\377k\377\377\377\221\377\377\377\263\377\377\377\320\377\377"
768+ "\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"
769+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
770+ "\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"
771+ "\14\377\377\377\35\377\377\3771\377\377\377L\364\364\364p\377\377\377\221"
772+ "\372\372\372\266\377\377\377\320\374\374\374\345\377\377\377\362\0\0\0\0"
773+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
774+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
775+ "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377"
776+ "1\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373\373\322"
777+ "\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"
778+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
779+ "\0\0\0\0\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"
780+ "\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\377\377"
781+ "\377\221\377\377\377\266\373\373\373\322\377\377\377\345\377\377\377\362"
782+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
783+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
784+ "\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"
785+ "\377\3771\377\377\377L\377\377\377p\377\377\377\221\377\377\377\266\373\373"
786+ "\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"
787+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
788+ "\0\0\0\0\0\0\0\0\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"
789+ "\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377"
790+ "p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345\374\374"
791+ "\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"
792+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
793+ "\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"
794+ "\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266"
795+ "\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0\0\0\0\0"
796+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
797+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
798+ "\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377\377L\377"
799+ "\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377\377\345"
800+ "\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"
801+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
802+ "\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"
803+ "\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224\377\377"
804+ "\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0\0\0\0\0"
805+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
806+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
807+ "\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\3771\377\377"
808+ "\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322\377\377"
809+ "\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"
810+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
811+ "\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"
812+ "\14\377\377\377\35\377\377\3771\377\377\377L\377\377\377p\367\367\367\224"
813+ "\377\377\377\266\377\377\377\322\377\377\377\345\374\374\374\362\0\0\0\0"
814+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
815+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
816+ "\0\0\0\0\0\0\0\0\377\377\377\6\377\377\377\14\377\377\377\35\377\377\377"
817+ "1\377\377\377L\377\377\377p\367\367\367\224\377\377\377\266\377\377\377\322"
818+ "\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"
819+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
820+ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
821+};
822+
823+#endif

Subscribers

People subscribed via source and target branches

to all changes: