Author: shadowmaster
Date: Tue Apr 28 03:33:23 2009
New Revision: 35285

URL: http://svn.gna.org/viewcvs/wesnoth?rev=35285&view=rev
Log:
Implemented simple storyscreen caching for non-LOW_MEM builds, and
switched some code that was using pure memory pointers to using
shared_ptrs for safety and cleanness.

(I was using pointers just to avoid copy-constructor calls on the part
and part_ui objects- now we copy-construct shared_ptrs, which has no
important effects on runtime performance. It was becoming a huge hassle
to keep track of the pure pointers.)

Modified:
    trunk/src/storyscreen/controller.cpp
    trunk/src/storyscreen/controller.hpp
    trunk/src/storyscreen/interface.cpp

Modified: trunk/src/storyscreen/controller.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/controller.cpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/controller.cpp (original)
+++ trunk/src/storyscreen/controller.cpp Tue Apr 28 03:33:23 2009
@@ -57,11 +57,6 @@
        build_parts();
 }
 
-controller::~controller()
-{
-       clear_parts();
-}
-
 void controller::resolve_wml(const vconfig& cfg)
 {
        for(vconfig::all_children_iterator i = cfg.ordered_begin(); i != 
cfg.ordered_end(); i++)
@@ -71,7 +66,7 @@
                const vconfig node = i->second;
 
                if(key == "part" && !node.empty()) {
-                       part* const story_part = new part(*gamestate_, node);
+                       part_pointer_type const story_part(new 
part(*gamestate_, node));
                        // Use scenario name as part title if the WML doesn't 
supply a custom one.
                        if((*story_part).show_title() && 
(*story_part).title().empty()) {
                                (*story_part).set_title( scenario_name_ );
@@ -126,55 +121,56 @@
        }
 }
 
-void controller::clear_parts()
-{
-       foreach(part* p, parts_) {
-               delete p;
-       }
-       parts_.clear();
-}
-
-void controller::show_all_parts()
+void controller::show()
 {
        if(parts_.empty()) {
                LOG_NG << "no storyscreen parts to show\n";
+               return;
        }
 
-       size_t part_n = 0, parts_c = parts_.size();
-       while((part_n = show_part(part_n)) < parts_c)
-               ;
-}
-
-size_t controller::show_part(size_t part_num)
-{
-       if(part_num >= parts_.size()) {
-               ERR_NG << "attempted to display inexistant storyscreen part: " 
<< part_num+1 << " (of " << parts_.size() << ")\n";
-               return parts_.size();
-       }
-
-       LOG_NG << "displaying storyscreen part " << part_num+1 << " of " << 
parts_.size() << '\n';
-
-       part* const p = parts_[part_num];
-       ASSERT_LOG( p != NULL, "Ouch: hit NULL storyscreen part in collection" 
);
-
+       gui::button next_button(disp_.video(),_("Next") + std::string(" >"));
+       gui::button skip_button(disp_.video(),_("Skip"));
        // TODO:
        //  gui::button back_button(disp_.video(),std::string("< ")+_("Next"));
-       gui::button next_button(disp_.video(),_("Next") + std::string(" >"));
-       gui::button skip_button(disp_.video(),_("Skip"));
 
-       part_ui ui(*p, disp_, next_button, skip_button);
-       switch(ui.show()) {
-       case part_ui::NEXT:
-               return part_num+1;
-       case part_ui::BACK:
-               return(part_num > 0 ? part_num-1 : part_num);
-       case part_ui::SKIP:
-               return parts_.size();
-       default:
-               throw quit();
+       // Build renderer cache unless built for a low-memory environment;
+       // caching the scaled backgrounds can take over a decent amount of 
memory.
+#ifndef LOW_MEM
+       std::vector< render_pointer_type > uis_;
+       foreach(part_pointer_type p, parts_) {
+               ASSERT_LOG( p != NULL, "Ouch: hit NULL storyscreen part in 
collection" );
+               render_pointer_type const rpt(new part_ui(*p, disp_, 
next_button, skip_button));
+               uis_.push_back(rpt);
        }
+#endif
 
-       return 0;
+       size_t k = 0;
+
+       while(k < parts_.size()) {
+#ifndef LOW_MEM
+               render_reference_type render_interface = *uis_[k];
+#else
+               render_value_type render_interface(parts_[k], disp_, 
next_button, skip_button);
+#endif
+
+               LOG_NG << "displaying storyscreen part " << k+1 << " of " << 
parts_.size() << '\n';
+
+               switch(render_interface.show()) {
+               case part_ui::NEXT:
+                       ++k;
+                       break;
+               case part_ui::BACK:
+                       // If we are at the first page we can't go back.
+                       if(k > 0) {
+                               --k;
+                       }
+                       break;
+               case part_ui::SKIP:
+                       k = parts_.size();
+               default:
+                       throw quit();
+               }
+       }
 }
 
 } // end namespace storyscreen

Modified: trunk/src/storyscreen/controller.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/controller.hpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/controller.hpp (original)
+++ trunk/src/storyscreen/controller.hpp Tue Apr 28 03:33:23 2009
@@ -24,6 +24,8 @@
 #include "variable.hpp"
 #include "video.hpp"
 
+#include <boost/shared_ptr.hpp>
+
 class display;
 class game_state;
 // class vconfig;
@@ -31,25 +33,25 @@
 namespace storyscreen {
 
 class part;
+class part_ui;
 class floating_image;
 
 class controller
 {
 public:
        controller(display& disp, const vconfig& data, const std::string& 
scenario_name);
-       ~controller();
 
        /**
         * Display all story screen parts in a first..last sequence.
         */
-       void show_all_parts();
-       /**
-        * Display a single story screen part.
-        * @return Next part requested by the user interface.
-        */
-       size_t show_part(size_t part_num);
+       void show();
 
 private:
+       typedef boost::shared_ptr< part    > part_pointer_type;
+       typedef boost::shared_ptr< part_ui > render_pointer_type;
+       typedef part_ui                      render_value_type;
+       typedef part_ui&                     render_reference_type;
+
        // Executes WML flow instructions and inserts parts.
        void resolve_wml(const vconfig& cfg);
        // Used by ctor.
@@ -67,7 +69,7 @@
        std::string scenario_name_;
 
        // The part cache.
-       std::vector<part*> parts_;
+       std::vector< part_pointer_type > parts_;
 
        // The state of the world.
        game_state* gamestate_;

Modified: trunk/src/storyscreen/interface.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/interface.cpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/interface.cpp (original)
+++ trunk/src/storyscreen/interface.cpp Tue Apr 28 03:33:23 2009
@@ -55,7 +55,7 @@
        storyscreen::controller ctl(disp, story_cfg, scenario_name);
 
        try {
-               ctl.show_all_parts();
+               ctl.show();
        } catch(storyscreen::controller::quit const&) {
                LOG_NG << "leaving storyscreen for titlescreen...\n";
                STUB();


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to