wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src theme.cpp


From: Yann Dirson
Subject: [Wesnoth-cvs-commits] wesnoth/src theme.cpp
Date: Mon, 29 Nov 2004 19:17:29 -0500

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     Yann Dirson <address@hidden>    04/11/30 00:11:24

Modified files:
        src            : theme.cpp 

Log message:
        ensure theme rect= values are computed in file order

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/theme.cpp.diff?tr1=1.21&tr2=1.22&r1=text&r2=text

Patches:
Index: wesnoth/src/theme.cpp
diff -u wesnoth/src/theme.cpp:1.21 wesnoth/src/theme.cpp:1.22
--- wesnoth/src/theme.cpp:1.21  Fri Nov 26 07:14:53 2004
+++ wesnoth/src/theme.cpp       Tue Nov 30 00:11:23 2004
@@ -8,6 +8,7 @@
 #include "util.hpp"
 
 #include <cstdlib>
+#include <sstream>
 
 #define LOG_DP lg::info(lg::display)
 
@@ -32,23 +33,69 @@
 
        SDL_Rect read_rect(const config& cfg) {
                SDL_Rect rect;
-               static SDL_Rect ref_rect = empty_rect;
                const std::vector<std::string> items = 
config::split(cfg["rect"].c_str());
                if(items.size() >= 1)
-                       rect.x = compute(items[0], ref_rect.x, 
ref_rect.x+ref_rect.w);
+                       rect.x = atoi(items[0].c_str());
 
                if(items.size() >= 2)
-                       rect.y = compute(items[1], ref_rect.y, 
ref_rect.y+ref_rect.h);
+                       rect.y = atoi(items[1].c_str());
 
                if(items.size() >= 3)
-                       rect.w = compute(items[2], ref_rect.x+ref_rect.w, 
rect.x) - rect.x;
+                       rect.w = atoi(items[2].c_str()) - rect.x;
 
                if(items.size() >= 4)
-                       rect.h = compute(items[3], ref_rect.y+ref_rect.h, 
rect.y) - rect.y;
+                       rect.h = atoi(items[3].c_str()) - rect.y;
 
-               ref_rect = rect;
                return rect;
        }
+
+       std::string resolve_rect(const std::string& rect_str) {
+               typedef struct { size_t x1,y1,x2,y2; } _rect;
+               static _rect ref_rect = { 0, 0, 0, 0 };
+               _rect rect;
+               std::stringstream resolved;
+               const std::vector<std::string> items = 
config::split(rect_str.c_str());
+               if(items.size() >= 1) {
+                       rect.x1 = compute(items[0], ref_rect.x1, ref_rect.x2);
+                       resolved << rect.x1;
+               }
+               if(items.size() >= 2) {
+                       rect.y1 = compute(items[1], ref_rect.y1, ref_rect.y2);
+                       resolved << "," << rect.y1;
+               }
+               if(items.size() >= 3) {
+                       rect.x2 = compute(items[2], ref_rect.x2, rect.x1);
+                       resolved << "," << rect.x2;
+               }
+               if(items.size() >= 4) {
+                       rect.y2 = compute(items[3], ref_rect.y2, rect.y1);
+                       resolved << "," << rect.y2;
+               }
+
+               // std::cerr << "Rect " << rect_str << "\t: " << resolved.str() 
<< "\n";
+
+               ref_rect = rect;
+               return resolved.str();
+       }
+
+       config& resolve_rects(const config& cfg) {
+               config* newcfg = new config();
+               for(config::all_children_iterator i = cfg.ordered_begin(); i != 
cfg.ordered_end(); ++i) {
+                       const std::pair<const std::string*,const config*>& 
value = *i;
+                       
newcfg->add_child(*value.first,resolve_rects(*value.second));
+               }
+
+               for(string_map::const_iterator j = cfg.values.begin(); j != 
cfg.values.end(); ++j) {
+                       newcfg->values[j->first] = j->second;
+               }
+
+               if (cfg["rect"] != "") {
+                       newcfg->values["rect"] = resolve_rect(cfg["rect"]);
+               }
+
+               return *newcfg;
+       }
+
 }
 
 theme::object::object() : loc_(empty_rect), relative_loc_(empty_rect),
@@ -225,7 +272,7 @@
 
 const std::vector<std::string>& theme::menu::items() const { return items_; }
 
-theme::theme(const config& cfg, const SDL_Rect& screen) : cfg_(cfg)
+theme::theme(const config& cfg, const SDL_Rect& screen) : 
cfg_(resolve_rects(cfg))
 {
        set_resolution(screen);
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]