#include <string>
#include <stdexcept>
+#include "theme.h"
+
std::map<std::string, std::string> config;
void read_config(const char *filename)
return config["default." + subkey];
}
-void fill_background(unsigned char *buf, unsigned width, unsigned height)
+void fill_background(unsigned char *buf, const std::string &screen_name, unsigned width, unsigned height)
{
- int bg_r = atoi(get_theme_config("background", "red").c_str());
- int bg_g = atoi(get_theme_config("background", "green").c_str());
- int bg_b = atoi(get_theme_config("background", "blue").c_str());
+ std::string key = "background." + screen_name;
+ int bg_r = atoi(get_theme_config(key, "red").c_str());
+ int bg_g = atoi(get_theme_config(key, "green").c_str());
+ int bg_b = atoi(get_theme_config(key, "blue").c_str());
unsigned char *ptr = buf;
for (unsigned i = 0; i < width * height; ++i) {
*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;
+ }
+ }
+ }
}