From 3a283d4f3c571dc8a891f2cdc348c204f7f9300b Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sat, 21 Jan 2012 23:29:40 +0000 Subject: [PATCH] Nice graphics for Showing windows --- src/PowderToy.cpp | 2 +- src/interface/Engine.cpp | 32 ++++++++++++++++++++++++++++++-- src/interface/Engine.h | 2 ++ src/preview/PreviewView.cpp | 1 + 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/PowderToy.cpp b/src/PowderToy.cpp index a13a817ff..2918a0594 100644 --- a/src/PowderToy.cpp +++ b/src/PowderToy.cpp @@ -67,7 +67,7 @@ int main(int argc, char * argv[]) ui::Engine::Ref().g->AttachSDLSurface(SDLOpen()); ui::Engine * engine = &ui::Engine::Ref(); - engine->Begin(XRES, YRES); + engine->Begin(XRES+BARSIZE, YRES+MENUSIZE); GameController * gameController = new GameController(); engine->ShowWindow(gameController->GetView()); diff --git a/src/interface/Engine.cpp b/src/interface/Engine.cpp index 19da36e7e..85a62932f 100644 --- a/src/interface/Engine.cpp +++ b/src/interface/Engine.cpp @@ -19,7 +19,9 @@ Engine::Engine(): mousexp_(0), mouseyp_(0), FpsLimit(60.0f), - windows(stack()) + windows(stack()), + lastBuffer(NULL), + prevBuffers(stack()) { } @@ -61,15 +63,34 @@ void Engine::ShowWindow(Window * window) } if(state_) { + if(lastBuffer) + { + prevBuffers.push(lastBuffer); + } + lastBuffer = (pixel*)malloc((width_ * height_) * PIXELSIZE); + g->fillrect(0, 0, width_, height_, 0, 0, 0, 100); + memcpy(lastBuffer, g->vid, (width_ * height_) * PIXELSIZE); + windows.push(state_); } state_ = window; + } void Engine::CloseWindow() { if(!windows.empty()) { + if(!prevBuffers.empty()) + { + lastBuffer = prevBuffers.top(); + prevBuffers.pop(); + } + else + { + free(lastBuffer); + lastBuffer = NULL; + } state_ = windows.top(); windows.pop(); } @@ -120,10 +141,17 @@ void Engine::Tick(float dt) void Engine::Draw() { + if(lastBuffer && !(state_->Position.X == 0 && state_->Position.Y == 0 && state_->Size.X == width_ && state_->Size.Y == height_)) + { + memcpy(g->vid, lastBuffer, (width_ * height_) * PIXELSIZE); + } + else + { + g->Clear(); + } if(state_) state_->DoDraw(); g->Blit(); - g->Clear(); } void Engine::onKeyPress(int key, bool shift, bool ctrl, bool alt) diff --git a/src/interface/Engine.h b/src/interface/Engine.h index 7bf78f9d6..a6481194e 100644 --- a/src/interface/Engine.h +++ b/src/interface/Engine.h @@ -54,6 +54,8 @@ namespace ui float FpsLimit; Graphics * g; private: + pixel * lastBuffer; + std::stack prevBuffers; std::stack windows; //Window* statequeued_; Window* state_; diff --git a/src/preview/PreviewView.cpp b/src/preview/PreviewView.cpp index c5dbfacc4..886dd674c 100644 --- a/src/preview/PreviewView.cpp +++ b/src/preview/PreviewView.cpp @@ -19,6 +19,7 @@ PreviewView::PreviewView(): void PreviewView::OnDraw() { Graphics * g = ui::Engine::Ref().g; + g->clearrect(Position.X-2, Position.Y-2, Size.X+4, Size.Y+4); g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255); }