struct RrSurface *p;
int ok;
int surx, sury;
+ GSList *it;
inst = RrSurfaceInstance(sur);
if (!(x + w <= RrSurfaceWidth(sur) && y + h <= RrSurfaceHeight(sur)))
return;
- /* XXX recurse and paint children */
+ /* recurse and paint children */
+ for (it = RrSurfaceChildren(sur); it; it = g_slist_next(it)) {
+ struct RrSurface *child = it->data;
+ /* in the area to repaint? */
+ if (RrSurfaceX(child) < x+w &&
+ RrSurfaceX(child) + RrSurfaceWidth(child) > x &&
+ RrSurfaceY(child) < y+h &&
+ RrSurfaceY(child) + RrSurfaceHeight(child))
+ RrPaintArea(child,
+ MAX(0, x-RrSurfaceX(child)),
+ MAX(0, y-RrSurfaceY(child)),
+ MIN(RrSurfaceWidth(child), w-(x-RrSurfaceX(child))),
+ MIN(RrSurfaceHeight(child), h-(y-RrSurfaceY(child))));
+ }
if (!RrSurfaceVisible(sur)) return;
sur->w = 1;
sur->h = 1;
sur->visible = 0;
+ sur->children = NULL;
return sur;
}
sur->parent = parent;
RrSurfaceShow(sur);
+ parent->children = g_slist_append(parent->children, sur);
+
RrInstaceAddSurface(sur);
return sur;
}
sur->parent = parent;
RrSurfaceShow(sur);
+ parent->children = g_slist_append(parent->children, sur);
+
RrInstaceAddSurface(sur);
return sur;
}
{
int i;
if (sur) {
+ if (sur->parent)
+ sur->parent->children = g_slist_remove(sur->parent->children, sur);
+
RrInstaceRemoveSurface(sur);
for (i = 0; i < sur->ntextures; ++i)
RrTextureFreeContents(&sur->texture[i]);
#include "render.h"
#include "texture.h"
#include "planar.h"
+#include <glib.h>
struct RrNonPlanarSurface {
int foo;
int h;
int visible : 1;
+
+ GSList *children;
};
struct RrTexture *RrSurfaceTexture(struct RrSurface *sur, int texnum);
#define RrSurfaceWidth(sur) ((sur)->w)
#define RrSurfaceHeight(sur) ((sur)->h)
+#define RrSurfaceChildren(sur) ((sur)->children)
+
#endif