aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/comp
diff options
context:
space:
mode:
authorCarsten Haitzler <raster@rasterman.com>2010-01-11 03:28:20 +0000
committerCarsten Haitzler <raster@rasterman.com>2010-01-11 03:28:20 +0000
commit4fa952a6a06bea2d0b52e5504832ffffa04cb520 (patch)
treed255f77a115c96a705550ae1ab0947195c53e7e5 /src/modules/comp
parentaa7d521571ed466ecca8a67be9d3ade8f10e5f7f (diff)
downloadenlightenment-4fa952a6a06bea2d0b52e5504832ffffa04cb520.tar.gz
enlightenment-4fa952a6a06bea2d0b52e5504832ffffa04cb520.tar.xz
enlightenment-4fa952a6a06bea2d0b52e5504832ffffa04cb520.zip
move update off to its own file - its pretty much stand-alone. need to fix
the optimisation for sw engine there though. SVN revision: 45032
Diffstat (limited to 'src/modules/comp')
-rw-r--r--src/modules/comp/Makefile.am4
-rw-r--r--src/modules/comp/e_mod_comp.c196
-rw-r--r--src/modules/comp/e_mod_comp_update.c187
-rw-r--r--src/modules/comp/e_mod_comp_update.h22
4 files changed, 216 insertions, 193 deletions
diff --git a/src/modules/comp/Makefile.am b/src/modules/comp/Makefile.am
index 1d2f1bcfe..b78210b05 100644
--- a/src/modules/comp/Makefile.am
+++ b/src/modules/comp/Makefile.am
@@ -23,7 +23,9 @@ module_la_SOURCES = e_mod_main.c \
e_mod_config.c \
e_mod_config.h \
e_mod_comp.c \
- e_mod_comp.h
+ e_mod_comp.h \
+ e_mod_comp_update.c \
+ e_mod_comp_update.h
module_la_LIBADD = @e_libs@ @dlopen_libs@
module_la_LDFLAGS = -module -avoid-version
diff --git a/src/modules/comp/e_mod_comp.c b/src/modules/comp/e_mod_comp.c
index fde6fdcd4..137b1a31f 100644
--- a/src/modules/comp/e_mod_comp.c
+++ b/src/modules/comp/e_mod_comp.c
@@ -1,6 +1,7 @@
#include "e.h"
#include "e_mod_main.h"
#include "e_mod_comp.h"
+#include "e_mod_comp_update.h"
#include "config.h"
// TODO (no specific order):
@@ -16,25 +17,9 @@
// 6. other engine fast-paths (gl specifically)!
// 7. check depth is 32bpp- cant do 16bpp compositing.
// 8. transparenty property
-// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper, efm - hell even menus and anything else in e
-
-typedef struct _Update Update;
-typedef struct _Update_Rect Update_Rect;
-
-struct _Update
-{
- int w, h;
- int tw, th;
- int tsw, tsh;
- unsigned char *tiles;
-};
-
-struct _Update_Rect
-{
- EINA_INLIST;
- int x, y, w, h;
-};
-
+// 9. shortcut lots of stuff to draw inside the compositor - shelf, wallpaper,
+// efm - hell even menus and anything else in e (this is what e18 was
+// mostly about)
typedef struct _Comp Comp;
typedef struct _Comp_Win Comp_Win;
@@ -91,179 +76,6 @@ static Eina_Hash *damages = NULL;
#define DBG(f, x...)
#endif
-static Update *
-_e_mod_comp_update_new(void)
-{
- Update *up;
-
- up = calloc(1, sizeof(Update));
- up->tsw = 32;
- up->tsh = 32;
- return up;
-}
-
-static void
-_e_mod_comp_update_free(Update *up)
-{
- if (up->tiles) free(up->tiles);
- free(up);
-}
-
-static void
-_e_mod_comp_update_resize(Update *up, int w, int h)
-{
- if ((up->w == w) && (up->h == h)) return;
- up->w = w;
- up->h = h;
- up->tw = (up->w + up->tsw - 1) / up->tsw;
- up->th = (up->h + up->tsh - 1) / up->tsh;
- if (up->tiles)
- {
- free(up->tiles);
- up->tiles = NULL;
- }
-}
-
-static void
-_e_mod_comp_tiles_alloc(Update *up)
-{
- if (up->tiles) return;
- up->tiles = calloc(up->tw * up->th, sizeof(unsigned char));
-}
-
-static void
-_e_mod_comp_update_add(Update *up, int x, int y, int w, int h)
-{
- int tx, ty, txx, tyy, xx, yy;
- unsigned char *t, *t2;
-
- if ((w <= 0) || (h <= 0)) return;
- if ((up->tw <= 0) || (up->th <= 0)) return;
-
- _e_mod_comp_tiles_alloc(up);
-
- E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, up->w, up->h);
- if ((w <= 0) || (h <= 0)) return;
-
- // fixme: adjust to allow for optimizations in grabbing of ximages
- if (1)
- {
- if (w > (up->w / 2))
- {
- x = 0;
- w = up->w;
- }
- }
-
- tx = x / up->tsw;
- ty = y / up->tsh;
- txx = (x + w - 1) / up->tsw;
- tyy = (y + h - 1) / up->tsh;
- t = up->tiles + (ty * up->tw) + tx;
- for (yy = ty; yy <= tyy; yy++)
- {
- t2 = t;
- for (xx = tx; xx <= txx; xx++)
- {
- *t2 = 1;
- t2++;
- }
- t += up->tw;
- }
-}
-
-static Update_Rect *
-_e_mod_comp_update_rects_get(Update *up)
-{
- Update_Rect *r;
- int ri = 0;
- int x, y;
- unsigned char *t, *t2, *t3;
-
- if (!up->tiles) return NULL;
- r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect));
- if (!r) return NULL;
- t = up->tiles;
- for (y = 0; y < up->th; y++)
- {
- for (x = 0; x < up->tw; x++)
- {
- if (*t)
- {
- int can_expand_x = 1, can_expand_y = 1;
- int xx = 0, yy = 0;
-
- t2 = t + 1;
- while (can_expand_x)
- {
- xx++;
- if ((x + xx) >= up->tw) can_expand_x = 0;
- else if (!*t2) can_expand_x = 0;
- if (can_expand_x) *t2 = 0;
- t2++;
- }
- t3 = t;
- while (can_expand_y)
- {
- int i;
-
- yy++;
- t3 += up->tw;
- if ((y + yy) >= up->th) can_expand_y = 0;
- if (can_expand_y)
- {
- t2 = t3;
- for (i = 0; i < xx; i++)
- {
- if (!*t2)
- {
- can_expand_y = 0;
- break;
- }
- t2++;
- }
- }
- if (can_expand_y)
- {
- t2 = t3;
- for (i = 0; i < xx; i++)
- {
- *t2 = 0;
- t2++;
- }
- }
- }
- *t = 0;
- r[ri].x = x * up->tsw;
- r[ri].y = y * up->tsh;
- r[ri].w = xx * up->tsw;
- r[ri].h = yy * up->tsh;
- if ((r[ri].x + r[ri].w) > up->w) r[ri].w = up->w - r[ri].x;
- if ((r[ri].y + r[ri].h) > up->h) r[ri].h = up->h - r[ri].y;
- if ((r[ri].w <= 0) || (r[ri].h <= 0)) r[ri].w = 0;
- else ri++;
- x += xx - 1;
- t += xx - 1;
- }
- t++;
- }
- }
- return r;
-}
-
-static void
-_e_mod_comp_update_clear(Update *up)
-{
- if (up->tiles)
- {
- free(up->tiles);
- up->tiles = NULL;
- }
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-
static void _e_mod_comp_render_queue(Comp *c);
static void _e_mod_comp_win_damage(Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg);
diff --git a/src/modules/comp/e_mod_comp_update.c b/src/modules/comp/e_mod_comp_update.c
new file mode 100644
index 000000000..3583a3904
--- /dev/null
+++ b/src/modules/comp/e_mod_comp_update.c
@@ -0,0 +1,187 @@
+#include "e.h"
+#include "e_mod_main.h"
+#include "e_mod_comp_update.h"
+#include "config.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+struct _Update
+{
+ int w, h;
+ int tw, th;
+ int tsw, tsh;
+ unsigned char *tiles;
+};
+
+static void
+_e_mod_comp_tiles_alloc(Update *up)
+{
+ if (up->tiles) return;
+ up->tiles = calloc(up->tw * up->th, sizeof(unsigned char));
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+Update *
+e_mod_comp_update_new(void)
+{
+ Update *up;
+
+ up = calloc(1, sizeof(Update));
+ up->tsw = 32;
+ up->tsh = 32;
+ return up;
+}
+
+void
+e_mod_comp_update_free(Update *up)
+{
+ if (up->tiles) free(up->tiles);
+ free(up);
+}
+
+void
+e_mod_comp_update_resize(Update *up, int w, int h)
+{
+ if ((up->w == w) && (up->h == h)) return;
+ up->w = w;
+ up->h = h;
+ up->tw = (up->w + up->tsw - 1) / up->tsw;
+ up->th = (up->h + up->tsh - 1) / up->tsh;
+ if (up->tiles)
+ {
+ free(up->tiles);
+ up->tiles = NULL;
+ }
+}
+
+void
+e_mod_comp_update_add(Update *up, int x, int y, int w, int h)
+{
+ int tx, ty, txx, tyy, xx, yy;
+ unsigned char *t, *t2;
+
+ if ((w <= 0) || (h <= 0)) return;
+ if ((up->tw <= 0) || (up->th <= 0)) return;
+
+ _e_mod_comp_tiles_alloc(up);
+
+ E_RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, up->w, up->h);
+ if ((w <= 0) || (h <= 0)) return;
+
+ /* fixme: optimisation specific to the software enigine - abstract */
+ if (1)
+ {
+ if (w > (up->w / 2))
+ {
+ x = 0;
+ w = up->w;
+ }
+ }
+
+ tx = x / up->tsw;
+ ty = y / up->tsh;
+ txx = (x + w - 1) / up->tsw;
+ tyy = (y + h - 1) / up->tsh;
+ t = up->tiles + (ty * up->tw) + tx;
+ for (yy = ty; yy <= tyy; yy++)
+ {
+ t2 = t;
+ for (xx = tx; xx <= txx; xx++)
+ {
+ *t2 = 1;
+ t2++;
+ }
+ t += up->tw;
+ }
+}
+
+Update_Rect *
+e_mod_comp_update_rects_get(Update *up)
+{
+ Update_Rect *r;
+ int ri = 0;
+ int x, y;
+ unsigned char *t, *t2, *t3;
+
+ if (!up->tiles) return NULL;
+ r = calloc((up->tw * up->th) + 1, sizeof(Update_Rect));
+ if (!r) return NULL;
+ t = up->tiles;
+ for (y = 0; y < up->th; y++)
+ {
+ for (x = 0; x < up->tw; x++)
+ {
+ if (*t)
+ {
+ int can_expand_x = 1, can_expand_y = 1;
+ int xx = 0, yy = 0;
+
+ t2 = t + 1;
+ while (can_expand_x)
+ {
+ xx++;
+ if ((x + xx) >= up->tw) can_expand_x = 0;
+ else if (!*t2) can_expand_x = 0;
+ if (can_expand_x) *t2 = 0;
+ t2++;
+ }
+ t3 = t;
+ while (can_expand_y)
+ {
+ int i;
+
+ yy++;
+ t3 += up->tw;
+ if ((y + yy) >= up->th) can_expand_y = 0;
+ if (can_expand_y)
+ {
+ t2 = t3;
+ for (i = 0; i < xx; i++)
+ {
+ if (!*t2)
+ {
+ can_expand_y = 0;
+ break;
+ }
+ t2++;
+ }
+ }
+ if (can_expand_y)
+ {
+ t2 = t3;
+ for (i = 0; i < xx; i++)
+ {
+ *t2 = 0;
+ t2++;
+ }
+ }
+ }
+ *t = 0;
+ r[ri].x = x * up->tsw;
+ r[ri].y = y * up->tsh;
+ r[ri].w = xx * up->tsw;
+ r[ri].h = yy * up->tsh;
+ if ((r[ri].x + r[ri].w) > up->w) r[ri].w = up->w - r[ri].x;
+ if ((r[ri].y + r[ri].h) > up->h) r[ri].h = up->h - r[ri].y;
+ if ((r[ri].w <= 0) || (r[ri].h <= 0)) r[ri].w = 0;
+ else ri++;
+ x += xx - 1;
+ t += xx - 1;
+ }
+ t++;
+ }
+ }
+ return r;
+}
+
+void
+e_mod_comp_update_clear(Update *up)
+{
+ if (up->tiles)
+ {
+ free(up->tiles);
+ up->tiles = NULL;
+ }
+}
+
diff --git a/src/modules/comp/e_mod_comp_update.h b/src/modules/comp/e_mod_comp_update.h
new file mode 100644
index 000000000..d8e4d7ff4
--- /dev/null
+++ b/src/modules/comp/e_mod_comp_update.h
@@ -0,0 +1,22 @@
+#ifdef E_TYPEDEFS
+#else
+#ifndef E_MOD_COMP_UPDATE_H
+#define E_MOD_COMP_UPDATE_H
+
+typedef struct _Update Update;
+typedef struct _Update_Rect Update_Rect;
+
+struct _Update_Rect
+{
+ int x, y, w, h;
+};
+
+Update *e_mod_comp_update_new(void);
+void e_mod_comp_update_free(Update *up);
+void e_mod_comp_update_resize(Update *up, int w, int h);
+void e_mod_comp_update_add(Update *up, int x, int y, int w, int h);
+Update_Rect *e_mod_comp_update_rects_get(Update *up);
+void e_mod_comp_update_clear(Update *up);
+
+#endif
+#endif