Author: esr
Date: Sun Jun 24 05:40:04 2007
New Revision: 18425

URL: http://svn.gna.org/viewcvs/wesnoth?rev=18425&view=rev
Log:
More lifting of code from display into map_display.

Modified:
    trunk/src/display.cpp
    trunk/src/display.hpp

Modified: trunk/src/display.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/display.cpp?rev=18425&r1=18424&r2=18425&view=diff
==============================================================================
--- trunk/src/display.cpp (original)
+++ trunk/src/display.cpp Sun Jun 24 05:40:04 2007
@@ -67,7 +67,8 @@
        screen_(video), map_(map), xpos_(0), ypos_(0),
        theme_(theme_cfg,screen_area()), zoom_(DefaultZoom),
        builder_(cfg, level, map),
-       minimap_(NULL), redrawMinimap_(false), redraw_background_(true)
+       minimap_(NULL), redrawMinimap_(false), redraw_background_(true),
+       fps_handle_(0)
 {
        if(non_interactive()) {
                screen_.lock_updates(true);
@@ -544,6 +545,179 @@
        }
 }
 
+void map_display::sunset(const size_t delay) {
+       // this allow both parametric and toggle use
+       sunset_delay = (sunset_delay == 0 && delay == 0) ? 5 : delay;
+}
+
+void map_display::flip()
+{
+       if(video().faked()) {
+               return;
+       }
+
+       const surface frameBuffer = get_video_surface();
+
+       // this is just the debug function "sunset" to progressively darken the 
map area
+       if (sunset_delay && ++sunset_timer > sunset_delay) {
+               sunset_timer = 0;
+               SDL_Rect r = map_area(); //use frameBuffer to also test the UI
+               const Uint32 color =  
SDL_MapRGBA(video().getSurface()->format,0,0,0,255);
+               // adjust the alpha if you want to balance cpu-cost / smooth 
sunset
+               fill_rect_alpha(r, color, 1, frameBuffer);
+               update_rect(r);
+       }
+
+       font::draw_floating_labels(frameBuffer);
+       events::raise_volatile_draw_event();
+       cursor::draw(frameBuffer);
+
+       video().flip();
+
+       cursor::undraw(frameBuffer);
+       events::raise_volatile_undraw_event();
+       font::undraw_floating_labels(frameBuffer);
+}
+
+void map_display::update_display()
+{
+       if(screen_.update_locked()) {
+               return;
+       }
+
+       if(preferences::show_fps()) {
+               static int last_sample = SDL_GetTicks();
+               static int frames = 0;
+               ++frames;
+
+               if(frames == 10) {
+                       const int this_sample = SDL_GetTicks();
+
+                       const int fps = (frames*1000)/(this_sample - 
last_sample);
+                       last_sample = this_sample;
+                       frames = 0;
+
+                       if(fps_handle_ != 0) {
+                               font::remove_floating_label(fps_handle_);
+                               fps_handle_ = 0;
+                       }
+                       std::ostringstream stream;
+                       stream << fps << "fps";
+                       fps_handle_ = 
font::add_floating_label(stream.str(),12,font::NORMAL_COLOUR,10,100,0,0,-1,screen_area(),font::LEFT_ALIGN);
+               }
+       } else if(fps_handle_ != 0) {
+               font::remove_floating_label(fps_handle_);
+               fps_handle_ = 0;
+       }
+
+       flip();
+}
+
+static void draw_panel(CVideo& video, const theme::panel& panel, 
std::vector<gui::button>& buttons)
+{
+       //log_scope("draw panel");
+       surface surf(image::get_image(panel.image(),image::UNSCALED));
+
+       const SDL_Rect screen = screen_area();
+       SDL_Rect& loc = panel.location(screen);
+       if(!surf.null()) {
+               if(surf->w != loc.w || surf->h != loc.h) {
+                       surf.assign(scale_surface(surf,loc.w,loc.h));
+               }
+
+               video.blit_surface(loc.x,loc.y,surf);
+               update_rect(loc);
+       }
+
+       static bool first_time = true;
+       for(std::vector<gui::button>::iterator b = buttons.begin(); b != 
buttons.end(); ++b) {
+               if(rects_overlap(b->location(),loc)) {
+                       b->set_dirty(true);
+                       if (first_time){
+                               //FixMe
+                               //YogiHH: This is only made to have the buttons 
store their background information,
+                               //otherwise the background will appear 
completely black. It would more
+                               //straightforward to call bg_update, but that 
is not public and there seems to be
+                               //no other way atm to call it. I will check if 
bg_update can be made public.
+                               b->hide(true);
+                               b->hide(false);
+                       }
+               }
+       }
+}
+
+static void draw_label(CVideo& video, surface target, const theme::label& 
label)
+{
+       //log_scope("draw label");
+
+        std::stringstream temp;
+       Uint32 RGB=label.font_rgb();
+        int red = (RGB & 0x00FF0000)>>16;
+        int green = (RGB & 0x0000FF00)>>8;
+        int blue = (RGB & 0x000000FF);
+
+        std::string c_start="<";
+        std::string c_sep=",";
+        std::string c_end=">";
+        std::stringstream color;
+        color<< c_start << red << c_sep << green << c_sep << blue << c_end;
+        std::string text = label.text();
+
+        if(label.font_rgb_set()) {
+               color<<text;
+               text = color.str();
+        }
+       const std::string& icon = label.icon();
+       SDL_Rect& loc = label.location(screen_area());
+
+       if(icon.empty() == false) {
+               surface surf(image::get_image(icon,image::UNSCALED));
+               if(!surf.null()) {
+                       if(surf->w > loc.w || surf->h > loc.h) {
+                               surf.assign(scale_surface(surf,loc.w,loc.h));
+                       }
+
+                       SDL_BlitSurface(surf,NULL,target,&loc);
+               }
+
+               if(text.empty() == false) {
+                       tooltips::add_tooltip(loc,text);
+               }
+       } else if(text.empty() == false) {
+               
font::draw_text(&video,loc,label.font_size(),font::NORMAL_COLOUR,text,loc.x,loc.y);
+       }
+
+       update_rect(loc);
+}
+
+/**
+ * Proof-of-concept of the new background still has some flaws
+ * * upon scrolling the background static (so maps scrolls over wood)
+ * * _off^usr has redraw glitches since background is only updated every now 
and then
+ * * the alpha at the border tends to "build up"
+ * * we impose a huge performance hit
+ *
+ * needs quite some work to become fully working, but first evaluate whether
+ * the new way is really wanted.
+ */
+static void draw_background(surface screen, const SDL_Rect& area)
+{
+       static const surface 
wood(image::get_image("terrain/off-map/wood.png",image::UNSCALED));
+       static const unsigned int width = wood->w;
+       static const unsigned int height = wood->h;
+       wassert(!wood.null());
+
+       const unsigned int w_count = 
static_cast<int>(ceil(static_cast<double>(area.w) / 
static_cast<double>(width)));
+       const unsigned int h_count = 
static_cast<int>(ceil(static_cast<double>(area.h) / 
static_cast<double>(height)));
+
+       for(unsigned int w = 0, w_off = area.x; w < w_count; ++w, w_off += 
width) {
+               for(unsigned int h = 0, h_off = area.y; h < h_count; ++h, h_off 
+= height) {
+                       SDL_Rect clip = {w_off, h_off, 0, 0};
+                       SDL_BlitSurface(wood, NULL, screen, &clip);
+               }
+       }
+}
+
 // Methods for superclass aware of units go here
 
 std::map<gamemap::location,fixed_t> display::debugHighlights_;
@@ -563,7 +737,7 @@
        turbo_speed_(2), turbo_(false), grid_(false), sidebarScaling_(1.0),
        first_turn_(true), in_game_(false), map_labels_(*this,map, 0),
        tod_hex_mask1(NULL), tod_hex_mask2(NULL), reach_map_changed_(true),
-       diagnostic_label_(0), fps_handle_(0)
+       diagnostic_label_(0)
 {
        singleton_ = this;
        std::fill(reportRects_,reportRects_+reports::NUM_REPORTS,empty_rect);
@@ -1024,146 +1198,6 @@
        draw(true,true);
 }
 
-void display::sunset(const size_t delay) {
-       // this allow both parametric and toggle use
-       sunset_delay = (sunset_delay == 0 && delay == 0) ? 5 : delay;
-}
-
-void display::flip()
-{
-       if(video().faked()) {
-               return;
-       }
-
-       const surface frameBuffer = get_video_surface();
-
-       // this is just the debug function "sunset" to progressively darken the 
map area
-       if (sunset_delay && ++sunset_timer > sunset_delay) {
-               sunset_timer = 0;
-               SDL_Rect r = map_area(); //use frameBuffer to also test the UI
-               const Uint32 color =  
SDL_MapRGBA(video().getSurface()->format,0,0,0,255);
-               // adjust the alpha if you want to balance cpu-cost / smooth 
sunset
-               fill_rect_alpha(r, color, 1, frameBuffer);
-               update_rect(r);
-       }
-
-       font::draw_floating_labels(frameBuffer);
-       events::raise_volatile_draw_event();
-       cursor::draw(frameBuffer);
-
-       video().flip();
-
-       cursor::undraw(frameBuffer);
-       events::raise_volatile_undraw_event();
-       font::undraw_floating_labels(frameBuffer);
-}
-
-static void draw_panel(CVideo& video, const theme::panel& panel, 
std::vector<gui::button>& buttons)
-{
-       //log_scope("draw panel");
-       surface surf(image::get_image(panel.image(),image::UNSCALED));
-
-       const SDL_Rect screen = screen_area();
-       SDL_Rect& loc = panel.location(screen);
-       if(!surf.null()) {
-               if(surf->w != loc.w || surf->h != loc.h) {
-                       surf.assign(scale_surface(surf,loc.w,loc.h));
-               }
-
-               video.blit_surface(loc.x,loc.y,surf);
-               update_rect(loc);
-       }
-
-       static bool first_time = true;
-       for(std::vector<gui::button>::iterator b = buttons.begin(); b != 
buttons.end(); ++b) {
-               if(rects_overlap(b->location(),loc)) {
-                       b->set_dirty(true);
-                       if (first_time){
-                               //FixMe
-                               //YogiHH: This is only made to have the buttons 
store their background information,
-                               //otherwise the background will appear 
completely black. It would more
-                               //straightforward to call bg_update, but that 
is not public and there seems to be
-                               //no other way atm to call it. I will check if 
bg_update can be made public.
-                               b->hide(true);
-                               b->hide(false);
-                       }
-               }
-       }
-}
-
-static void draw_label(CVideo& video, surface target, const theme::label& 
label)
-{
-       //log_scope("draw label");
-
-        std::stringstream temp;
-       Uint32 RGB=label.font_rgb();
-        int red = (RGB & 0x00FF0000)>>16;
-        int green = (RGB & 0x0000FF00)>>8;
-        int blue = (RGB & 0x000000FF);
-
-        std::string c_start="<";
-        std::string c_sep=",";
-        std::string c_end=">";
-        std::stringstream color;
-        color<< c_start << red << c_sep << green << c_sep << blue << c_end;
-        std::string text = label.text();
-
-        if(label.font_rgb_set()) {
-               color<<text;
-               text = color.str();
-        }
-       const std::string& icon = label.icon();
-       SDL_Rect& loc = label.location(screen_area());
-
-       if(icon.empty() == false) {
-               surface surf(image::get_image(icon,image::UNSCALED));
-               if(!surf.null()) {
-                       if(surf->w > loc.w || surf->h > loc.h) {
-                               surf.assign(scale_surface(surf,loc.w,loc.h));
-                       }
-
-                       SDL_BlitSurface(surf,NULL,target,&loc);
-               }
-
-               if(text.empty() == false) {
-                       tooltips::add_tooltip(loc,text);
-               }
-       } else if(text.empty() == false) {
-               
font::draw_text(&video,loc,label.font_size(),font::NORMAL_COLOUR,text,loc.x,loc.y);
-       }
-
-
-       update_rect(loc);
-}
-
-/**
- * Proof-of-concept of the new background still has some flaws
- * * upon scrolling the background static (so maps scrolls over wood)
- * * _off^usr has redraw glitches since background is only updated every now 
and then
- * * the alpha at the border tends to "build up"
- * * we impose a huge performance hit
- *
- * needs quite some work to become fully working, but first evaluate whether
- * the new way is really wanted.
- */
-static void draw_background(surface screen, const SDL_Rect& area)
-{
-       static const surface 
wood(image::get_image("terrain/off-map/wood.png",image::UNSCALED));
-       static const unsigned int width = wood->w;
-       static const unsigned int height = wood->h;
-       wassert(!wood.null());
-
-       const unsigned int w_count = 
static_cast<int>(ceil(static_cast<double>(area.w) / 
static_cast<double>(width)));
-       const unsigned int h_count = 
static_cast<int>(ceil(static_cast<double>(area.h) / 
static_cast<double>(height)));
-
-       for(unsigned int w = 0, w_off = area.x; w < w_count; ++w, w_off += 
width) {
-               for(unsigned int h = 0, h_off = area.y; h < h_count; ++h, h_off 
+= height) {
-                       SDL_Rect clip = {w_off, h_off, 0, 0};
-                       SDL_BlitSurface(wood, NULL, screen, &clip);
-               }
-       }
-}
-
 void display::draw(bool update,bool force)
 {
        bool changed = false;
@@ -1308,40 +1342,6 @@
                // opposite effect.
                nextDraw_ = maximum<int>(nextDraw_, SDL_GetTicks());
        }
-}
-
-void display::update_display()
-{
-       if(screen_.update_locked()) {
-               return;
-       }
-
-       if(preferences::show_fps()) {
-               static int last_sample = SDL_GetTicks();
-               static int frames = 0;
-               ++frames;
-
-               if(frames == 10) {
-                       const int this_sample = SDL_GetTicks();
-
-                       const int fps = (frames*1000)/(this_sample - 
last_sample);
-                       last_sample = this_sample;
-                       frames = 0;
-
-                       if(fps_handle_ != 0) {
-                               font::remove_floating_label(fps_handle_);
-                               fps_handle_ = 0;
-                       }
-                       std::ostringstream stream;
-                       stream << fps << "fps";
-                       fps_handle_ = 
font::add_floating_label(stream.str(),12,font::NORMAL_COLOUR,10,100,0,0,-1,screen_area(),font::LEFT_ALIGN);
-               }
-       } else if(fps_handle_ != 0) {
-               font::remove_floating_label(fps_handle_);
-               fps_handle_ = 0;
-       }
-
-       flip();
 }
 
 void display::draw_sidebar()

Modified: trunk/src/display.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/display.hpp?rev=18425&r1=18424&r2=18425&view=diff
==============================================================================
--- trunk/src/display.hpp (original)
+++ trunk/src/display.hpp Sun Jun 24 05:40:04 2007
@@ -60,6 +60,9 @@
        static Uint32 rgb(Uint8 red, Uint8 green, Uint8 blue)
                { return 0xFF000000 | (red << 16) | (green << 8) | blue; }
 
+       //gets the underlying screen object.
+       CVideo& video() { return screen_; }
+
        //the dimensions of the display. x and y are
        //width/height. mapx is the width of the portion of the
        //display which shows the game area. Between mapx and x is the
@@ -145,6 +148,17 @@
        // Will be overridden in the display subclass
        bool fogged(const gamemap::location& loc UNUSED) const {return false;};
        bool shrouded(const gamemap::location& loc UNUSED) const {return 
false;};
+
+       //debug function to toggle the "sunset" mode the map area
+       //become progressively darker except where hexes are refreshed
+       //delay it's the number of frames between each darkening (0 to
+       //toggle)
+       void sunset(const size_t delay = 0);
+
+       void flip();
+
+       //function which copies the backbuffer to the framebuffer.
+       void update_display();
 
 protected:
        enum ADJACENT_TERRAIN_TYPE { ADJACENT_BACKGROUND, ADJACENT_FOREGROUND, 
ADJACENT_FOGSHROUD };
@@ -174,6 +188,9 @@
                                  const time_of_day& tod,
                                  image::TYPE image_type, 
                                  ADJACENT_TERRAIN_TYPE type);
+private:
+       //the handle for the label which displays frames per second
+       int fps_handle_;
 };
 
 class display : public map_display
@@ -226,14 +243,6 @@
 
        //invalidates entire screen, including all tiles and sidebar.
        void redraw_everything();
-
-       //debug function to toggle the "sunset" mode the map area
-       //become progressively darker except where hexes are refreshed
-       //delay it's the number of frames between each darkening (0 to
-       //toggle)
-       void sunset(const size_t delay = 0);
-
-       void flip();
 
        //draws invalidated items. If update is true, will also copy the
        //display to the frame buffer. If force is true, will not skip frames,
@@ -317,9 +326,6 @@
        //draws the movement info (turns available) for a given location
        void draw_movement_info(const gamemap::location& loc);
 
-       //gets the underlying screen object.
-       CVideo& video() { return screen_; }
-
        //function to invalidate all tiles.
        void invalidate_all();
 
@@ -363,9 +369,6 @@
        //function to serialize overlay data
        void write_overlays(config& cfg) const;
 
-
-       //function which copies the backbuffer to the framebuffer.
-       void update_display();
 
        //functions used in the editor.
        //void draw_terrain_palette(int x, int y, terrain_type::TERRAIN 
selected);
@@ -598,8 +601,6 @@
        //
        std::vector<animated<image::locator> > flags_;
 
-       //the handle for the label which displays frames per second
-       int fps_handle_;
        static display * singleton_;
 };
 


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

Reply via email to