summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-04-03 16:08:56 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-04-03 16:08:56 (GMT)
commit838a612026c821c03e663c818d4bc9fe740febd8 (patch)
tree4b467bec3336452d8f65793b1cee31f0ffb05d2e /src
parent73c5082cbcdd3a986765723bd4182e45386ce766 (diff)
downloadpowder-838a612026c821c03e663c818d4bc9fe740febd8.zip
powder-838a612026c821c03e663c818d4bc9fe740febd8.tar.gz
Use a single instance of a background simulation for thumbnail rendering
Diffstat (limited to 'src')
-rw-r--r--src/client/Client.cpp14
-rw-r--r--src/game/GameView.cpp5
-rw-r--r--src/interface/SaveButton.cpp3
-rw-r--r--src/search/Thumbnail.cpp44
-rw-r--r--src/search/Thumbnail.h3
-rw-r--r--src/simulation/SaveRenderer.cpp59
-rw-r--r--src/simulation/SaveRenderer.h27
7 files changed, 109 insertions, 46 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp
index b472518..4b7ef95 100644
--- a/src/client/Client.cpp
+++ b/src/client/Client.cpp
@@ -530,10 +530,13 @@ Thumbnail * Client::GetPreview(int saveID, int saveDate)
if(thumbData)
{
return new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh));
+ free(thumbData);
}
else
{
- return new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128));
+ thumbData = (pixel *)malloc((128*128) * PIXELSIZE);
+ return new Thumbnail(saveID, saveDate, thumbData, ui::Point(128, 128));
+ free(thumbData);
}
}
else
@@ -747,10 +750,13 @@ Thumbnail * Client::GetThumbnail(int saveID, int saveDate)
if(thumbData)
{
thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh));
+ free(thumbData);
}
else
{
- thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128));
+ thumbData = (pixel *)malloc((128*128) * PIXELSIZE);
+ thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(128, 128));
+ free(thumbData);
}
return thumbnailCache[thumbnailCacheNextID++];
}
@@ -765,7 +771,9 @@ Thumbnail * Client::GetThumbnail(int saveID, int saveDate)
{
delete thumbnailCache[thumbnailCacheNextID];
}
- thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128));
+ thumbData = (pixel *)malloc((128*128) * PIXELSIZE);
+ thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(128, 128));
+ free(thumbData);
return thumbnailCache[thumbnailCacheNextID++];
}
}
diff --git a/src/game/GameView.cpp b/src/game/GameView.cpp
index 532bcea..c7dc063 100644
--- a/src/game/GameView.cpp
+++ b/src/game/GameView.cpp
@@ -9,6 +9,7 @@
#include "interface/Keys.h"
#include "interface/Slider.h"
#include "search/Thumbnail.h"
+#include "simulation/SaveRenderer.h"
GameView::GameView():
ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)),
@@ -747,7 +748,7 @@ void GameView::NotifyClipboardChanged(GameModel * sender)
delete clipboardThumb;
if(sender->GetClipboard())
{
- clipboardThumb = new Thumbnail(sender->GetClipboard());//new Thumbnail(0, 0, (pixel*)malloc((256*256)*PIXELSIZE), ui::Point(256, 256));
+ clipboardThumb = SaveRenderer::Ref().Render(sender->GetClipboard()->GetData(), sender->GetClipboard()->GetDataLength());
}
else
clipboardThumb = NULL;
@@ -760,7 +761,7 @@ void GameView::NotifyStampChanged(GameModel * sender)
delete stampThumb;
if(sender->GetStamp())
{
- stampThumb = new Thumbnail(sender->GetStamp());//new Thumbnail(0, 0, (pixel*)malloc((256*256)*PIXELSIZE), ui::Point(256, 256));
+ stampThumb = SaveRenderer::Ref().Render(sender->GetStamp()->GetData(), sender->GetStamp()->GetDataLength());
}
else
stampThumb = NULL;
diff --git a/src/interface/SaveButton.cpp b/src/interface/SaveButton.cpp
index 6b0e9cf..d044ef6 100644
--- a/src/interface/SaveButton.cpp
+++ b/src/interface/SaveButton.cpp
@@ -6,6 +6,7 @@
#include "Global.h"
#include "Engine.h"
#include "client/Client.h"
+#include "simulation/SaveRenderer.h"
namespace ui {
@@ -61,7 +62,7 @@ void SaveButton::Tick(float dt)
}
else
{
- thumbnail = new Thumbnail(save);
+ thumbnail = SaveRenderer::Ref().Render(save->GetData(), save->GetDataLength());
}
if(thumbnail && thumbnail->Data)
{
diff --git a/src/search/Thumbnail.cpp b/src/search/Thumbnail.cpp
index 2fcd34a..6a97a08 100644
--- a/src/search/Thumbnail.cpp
+++ b/src/search/Thumbnail.cpp
@@ -6,9 +6,6 @@
*/
#include "Thumbnail.h"
-#include "simulation/Simulation.h"
-#include "simulation/SaveLoader.h"
-#include "Renderer.h"
Thumbnail::Thumbnail(const Thumbnail & thumb):
ID(thumb.ID),
@@ -34,42 +31,15 @@ Thumbnail::Thumbnail(int _id, int _datestamp, pixel * _data, ui::Point _size):
Data(_data),
Size(_size)
{
-}
-
-Thumbnail::Thumbnail(Save * save):
- ID(0),
- Datestamp(0),
- Data(NULL),
- Size(XRES+BARSIZE, YRES+MENUSIZE)
-{
- Graphics * g = new Graphics();
- Simulation * sim = new Simulation();
- Renderer * ren = new Renderer(g, sim);
- sim->Load(save->GetData(), save->GetDataLength());
- ren->render_parts();
-
- int width, height;
-
- pixel * dst;
- pixel * src = g->vid;
-
- if(SaveLoader::Info(save->GetData(), save->GetDataLength(), width, height))
- goto fail;
-
- dst = Data = (pixel *)malloc(PIXELSIZE * ((width*CELL)*(height*CELL)));
-
- for(int i = 0; i < height*CELL; i++)
+ if(_data)
{
- memcpy(dst, src, (width*CELL)*PIXELSIZE);
- dst+=(width*CELL);///PIXELSIZE;
- src+=XRES+BARSIZE;
+ Data = (pixel *)malloc((_size.X*_size.Y) * PIXELSIZE);
+ memcpy(Data, _data, (_size.X*_size.Y) * PIXELSIZE);
+ }
+ else
+ {
+ Data = NULL;
}
-
- Size = ui::Point(width*CELL, height*CELL);
-fail:
- delete ren;
- delete sim;
- delete g;
}
Thumbnail::~Thumbnail()
diff --git a/src/search/Thumbnail.h b/src/search/Thumbnail.h
index 3ed9dd2..25c0985 100644
--- a/src/search/Thumbnail.h
+++ b/src/search/Thumbnail.h
@@ -4,7 +4,6 @@
#include <iostream>
#include "Graphics.h"
#include "interface/Point.h"
-#include "Save.h"
class Thumbnail
{
@@ -13,8 +12,6 @@ public:
Thumbnail(int _id, int _datestamp, pixel * _data, ui::Point _size);
- Thumbnail(Save * save);
-
~Thumbnail();
int ID, Datestamp;
diff --git a/src/simulation/SaveRenderer.cpp b/src/simulation/SaveRenderer.cpp
new file mode 100644
index 0000000..7a5f5c2
--- /dev/null
+++ b/src/simulation/SaveRenderer.cpp
@@ -0,0 +1,59 @@
+/*
+ * SaveRenderer.cpp
+ *
+ * Created on: Apr 3, 2012
+ * Author: Simon
+ */
+
+#include "SaveRenderer.h"
+#include "Graphics.h"
+#include "Simulation.h"
+#include "Renderer.h"
+#include "SaveLoader.h"
+
+
+SaveRenderer::SaveRenderer(){
+ g = new Graphics();
+ sim = new Simulation();
+ ren = new Renderer(g, sim);
+}
+
+Thumbnail * SaveRenderer::Render(unsigned char * data, int dataLength)
+{
+ Thumbnail * tempThumb = NULL;
+ int width, height;
+ pixel * pData = NULL;
+ pixel * dst;
+ pixel * src = g->vid;
+
+ g->Clear();
+ sim->clear_sim();
+ if(sim->Load(data, dataLength))
+ goto finish;
+
+ if(SaveLoader::Info(data, dataLength, width, height))
+ goto finish;
+
+ ren->render_parts();
+
+ dst = pData = (pixel *)malloc(PIXELSIZE * ((width*CELL)*(height*CELL)));
+
+ for(int i = 0; i < height*CELL; i++)
+ {
+ memcpy(dst, src, (width*CELL)*PIXELSIZE);
+ dst+=(width*CELL);///PIXELSIZE;
+ src+=XRES+BARSIZE;
+ }
+
+ tempThumb = new Thumbnail(0, 0, pData, ui::Point(width*CELL, height*CELL));
+
+finish:
+ if(pData)
+ free(pData);
+ return tempThumb;
+}
+
+SaveRenderer::~SaveRenderer() {
+ // TODO Auto-generated destructor stub
+}
+
diff --git a/src/simulation/SaveRenderer.h b/src/simulation/SaveRenderer.h
new file mode 100644
index 0000000..a43f100
--- /dev/null
+++ b/src/simulation/SaveRenderer.h
@@ -0,0 +1,27 @@
+/*
+ * SaveRenderer.h
+ *
+ * Created on: Apr 3, 2012
+ * Author: Simon
+ */
+
+#ifndef SAVERENDERER_H_
+#define SAVERENDERER_H_
+
+#include "Singleton.h"
+#include "search/Thumbnail.h"
+
+class Graphics;
+class Simulation;
+class Renderer;
+class SaveRenderer: public Singleton<SaveRenderer> {
+ Graphics * g;
+ Simulation * sim;
+ Renderer * ren;
+public:
+ SaveRenderer();
+ Thumbnail * Render(unsigned char * data, int dataLength);
+ virtual ~SaveRenderer();
+};
+
+#endif /* SAVERENDERER_H_ */