summaryrefslogtreecommitdiff
path: root/src/client/layer.c
diff options
context:
space:
mode:
authorPetr Sykora <petr.sykora@gmail.com>2008-10-27 15:10:47 +0100
committerPetr Sykora <petr.sykora@gmail.com>2008-10-27 15:10:47 +0100
commit7eab9e3fe59e9b6893bc1404880073e42d3511ed (patch)
tree289b2f1c9eb0ce7c34380e6c005d088755cbbaec /src/client/layer.c
parentffe650b3bfd258d20a91f25f7e39b866611b2f11 (diff)
new addLayer, fixed behavior
Diffstat (limited to 'src/client/layer.c')
-rw-r--r--src/client/layer.c67
1 files changed, 46 insertions, 21 deletions
diff --git a/src/client/layer.c b/src/client/layer.c
index d06c92a..8807c35 100644
--- a/src/client/layer.c
+++ b/src/client/layer.c
@@ -31,17 +31,19 @@ void initLayer()
}
/*
- * Prida novu polozku do zoznamu vrstiev
- * *img - obrazok, ktory obsahuje polozka
- * x y w h - suradnca kam sa obrazok vykresli a jeho rozmery
- * px py pw ph - suradnica casti obrazka *img ktora sa ma zobrazit
- * layer - vrstva na ktorej sa zobrazi obrazok
+ * Add image to queue for rendering
+ * *img - image to be rendered
+ * x,y - coordinates where to draw the image
+ * w,h - width and height of rendered part of image
+ * px,py - coordinates of upper left corner of rendered part of image
+ * layer - on which layer to draw
+ * (0 - under tuxanci | 1 - same as tuxanci | 2 - over tuxancami)
*/
void
addLayer(image_t * img, int x, int y, int px, int py, int w, int h, int player)
{
layer_t *new;
- layer_t *this;
+ layer_t *actual;
int i, j;
assert(img != NULL);
@@ -56,21 +58,44 @@ addLayer(image_t * img, int x, int y, int px, int py, int w, int h, int player)
new->layer = player;
new->image = img;
- for (i = 0; i < listLayer->count; i++) {
- this = (layer_t *) listLayer->list[i];
-
- if (this->layer == new->layer) {
- for (j = i; j < listLayer->count; j++) {
- this = (layer_t *) listLayer->list[j];
-
- if (this->y + this->h > new->y + new->h) {
- insList(listLayer, j, new);
- return;
- }
- }
- }
- }
-
+ //first, we check if we should insert our image at the begining of the queue
+ if (listLayer->count == 0) {
+ addList(listLayer, new);
+ return;
+ };
+
+ if (((layer_t *)listLayer->list[0])->layer > new->layer) {
+ insList(listLayer, 0, new);
+ return;
+ };
+
+ //here we are sure, that we want to insert it somewhere else than the begining
+ for (i = 0; i < listLayer->count; i ++) {
+ actual = getList(listLayer, i);
+ //if we are at the same layer, we apply insert sort in (y+h/2)
+ while ((actual->layer == new->layer)) {
+ if ((new->y + new->h / 2) < (actual->y + actual->h/2)) {
+ insList(listLayer, i, new);
+ return;
+ };
+
+ i ++;
+ if (i >= listLayer->count) break;
+ actual = getList(listLayer, i);
+
+ if (actual->layer > new->layer) {
+ insList(listLayer, i, new);
+ return;
+ };
+ };
+ if (i >= listLayer->count) break;
+
+ //we check if we are on layer, that is not present yet
+ if (actual->layer > new->layer) {
+ insList(listLayer, i, new);
+ return;
+ };
+ };
addList(listLayer, new);
}