aboutsummaryrefslogtreecommitdiff
path: root/layer.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-21 18:24:57 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-21 18:24:57 +0200
commit75667b81215bdb3896599ec477a256c41fc90436 (patch)
tree44eb5919b596666997b972fc75fe5fdea60a633b /layer.cpp
parent0e81cd9a89de9bdd6824bbe7265f91f3835dae97 (diff)
downloadosc-graphics-75667b81215bdb3896599ec477a256c41fc90436.tar.gz
split program into multiple files; switched to C++
Diffstat (limited to 'layer.cpp')
-rw-r--r--layer.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/layer.cpp b/layer.cpp
new file mode 100644
index 0000000..89f437f
--- /dev/null
+++ b/layer.cpp
@@ -0,0 +1,70 @@
+#include <string.h>
+
+#include <SDL.h>
+
+#include "osc_graphics.h"
+#include "layer.h"
+
+#define FOREACH_LAYER(VAR) \
+ for (Layer *VAR = head; VAR; VAR = VAR->next)
+
+void
+LayerList::insert(int pos, Layer *layer)
+{
+ Layer *cur, *prev = NULL;
+
+ lock();
+
+ for (cur = head; cur && pos; prev = cur, cur = cur->next, pos--);
+
+ layer->next = cur;
+ if (prev)
+ prev->next = layer;
+ else
+ head = layer;
+
+ unlock();
+}
+
+bool
+LayerList::delete_by_name(const char *name)
+{
+ Layer *prev = NULL;
+
+ lock();
+
+ FOREACH_LAYER(cur) {
+ if (!strcmp(cur->name, name)) {
+ if (prev)
+ prev->next = cur->next;
+ else
+ head = cur->next;
+ delete cur;
+
+ unlock();
+ return false;
+ }
+
+ prev = cur;
+ }
+
+ unlock();
+
+ return true;
+}
+
+void
+LayerList::render(SDL_Surface *target)
+{
+ SDL_FillRect(target, NULL, SDL_MapRGB(target->format, 0, 0, 0));
+
+ lock();
+
+ FOREACH_LAYER(cur) {
+ cur->lock();
+ cur->frame(target);
+ cur->unlock();
+ }
+
+ unlock();
+}