Add theme support for drawing rectangles in the background.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 19 Feb 2012 17:41:33 +0000 (18:41 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 19 Feb 2012 17:41:33 +0000 (18:41 +0100)
bigscreen/theme.config
bigscreen/theme.cpp

index fc03f3a..2c65bd9 100644 (file)
@@ -48,3 +48,12 @@ divider.blue=127
 
 # available elements: background.groupscreen, background.top5chosenscreen, background.top10scorescreen, mainheading, (fresh)columnheading, randomsongname, nextsonginfo, need, divider
 # available elements that also have .odd and .even: rowheading, (fresh)score, (fresh)chosensongname, (fresh)totalscore, (fresh)rank
+
+## How to draw rectangles in the background (up to ten, numbered 0-9):
+# background.groupscreen.rect1.x0=0
+# background.groupscreen.rect1.y0=80
+# background.groupscreen.rect1.x1=800
+# background.groupscreen.rect1.y1=110
+# background.groupscreen.rect1.red=63
+# background.groupscreen.rect1.green=63
+# background.groupscreen.rect1.blue=63
index fb6f770..0b51fe2 100644 (file)
@@ -5,6 +5,8 @@
 #include <string>
 #include <stdexcept>
 
+#include "theme.h"
+
 std::map<std::string, std::string> config;
 
 void read_config(const char *filename)
@@ -92,4 +94,30 @@ void fill_background(unsigned char *buf, const std::string &screen_name, unsigne
                *ptr++ = bg_r;
                *ptr++ = 0;
        }
+
+       for (unsigned i = 0; i < 10; ++i) {
+               char rectkey[1024];
+               snprintf(rectkey, sizeof(rectkey), "background.%s.rect%u", screen_name.c_str(), i);
+               if (get_theme_config(rectkey, "x0").empty()) {
+                       continue;
+               }
+
+               int x0 = std::max<int>(atoi(get_theme_config(rectkey, "x0").c_str()) * width / LOGICAL_SCREEN_WIDTH, 0);
+               int y0 = std::max<int>(atoi(get_theme_config(rectkey, "y0").c_str()) * height / LOGICAL_SCREEN_HEIGHT, 0);
+               int x1 = std::min<int>(atoi(get_theme_config(rectkey, "x1").c_str()) * width / LOGICAL_SCREEN_WIDTH, width);
+               int y1 = std::min<int>(atoi(get_theme_config(rectkey, "y1").c_str()) * height / LOGICAL_SCREEN_HEIGHT, height);
+               int r = atoi(get_theme_config(rectkey, "red").c_str());
+               int g = atoi(get_theme_config(rectkey, "green").c_str());
+               int b = atoi(get_theme_config(rectkey, "blue").c_str());
+
+               for (int y = y0; y < y1; ++y) {
+                       unsigned char *ptr = buf + (y * width + x0) * 4;
+                       for (int x = x0; x < x1; ++x) {
+                               *ptr++ = b;
+                               *ptr++ = g;
+                               *ptr++ = r;
+                               *ptr++ = 0;
+                       }
+               }
+       }
 }