Use a single instance of a background simulation for thumbnail rendering

This commit is contained in:
Simon Robertshaw 2012-04-03 17:08:56 +01:00
parent 73c5082cbc
commit 838a612026
7 changed files with 109 additions and 46 deletions

View File

@ -530,10 +530,13 @@ Thumbnail * Client::GetPreview(int saveID, int saveDate)
if(thumbData) if(thumbData)
{ {
return new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh)); return new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh));
free(thumbData);
} }
else 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 else
@ -747,10 +750,13 @@ Thumbnail * Client::GetThumbnail(int saveID, int saveDate)
if(thumbData) if(thumbData)
{ {
thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh)); thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh));
free(thumbData);
} }
else 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++]; return thumbnailCache[thumbnailCacheNextID++];
} }
@ -765,7 +771,9 @@ Thumbnail * Client::GetThumbnail(int saveID, int saveDate)
{ {
delete thumbnailCache[thumbnailCacheNextID]; 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++]; return thumbnailCache[thumbnailCacheNextID++];
} }
} }

View File

@ -9,6 +9,7 @@
#include "interface/Keys.h" #include "interface/Keys.h"
#include "interface/Slider.h" #include "interface/Slider.h"
#include "search/Thumbnail.h" #include "search/Thumbnail.h"
#include "simulation/SaveRenderer.h"
GameView::GameView(): GameView::GameView():
ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)), ui::Window(ui::Point(0, 0), ui::Point(XRES+BARSIZE, YRES+MENUSIZE)),
@ -747,7 +748,7 @@ void GameView::NotifyClipboardChanged(GameModel * sender)
delete clipboardThumb; delete clipboardThumb;
if(sender->GetClipboard()) 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 else
clipboardThumb = NULL; clipboardThumb = NULL;
@ -760,7 +761,7 @@ void GameView::NotifyStampChanged(GameModel * sender)
delete stampThumb; delete stampThumb;
if(sender->GetStamp()) 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 else
stampThumb = NULL; stampThumb = NULL;

View File

@ -6,6 +6,7 @@
#include "Global.h" #include "Global.h"
#include "Engine.h" #include "Engine.h"
#include "client/Client.h" #include "client/Client.h"
#include "simulation/SaveRenderer.h"
namespace ui { namespace ui {
@ -61,7 +62,7 @@ void SaveButton::Tick(float dt)
} }
else else
{ {
thumbnail = new Thumbnail(save); thumbnail = SaveRenderer::Ref().Render(save->GetData(), save->GetDataLength());
} }
if(thumbnail && thumbnail->Data) if(thumbnail && thumbnail->Data)
{ {

View File

@ -6,9 +6,6 @@
*/ */
#include "Thumbnail.h" #include "Thumbnail.h"
#include "simulation/Simulation.h"
#include "simulation/SaveLoader.h"
#include "Renderer.h"
Thumbnail::Thumbnail(const Thumbnail & thumb): Thumbnail::Thumbnail(const Thumbnail & thumb):
ID(thumb.ID), ID(thumb.ID),
@ -34,42 +31,15 @@ Thumbnail::Thumbnail(int _id, int _datestamp, pixel * _data, ui::Point _size):
Data(_data), Data(_data),
Size(_size) Size(_size)
{ {
} if(_data)
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++)
{ {
memcpy(dst, src, (width*CELL)*PIXELSIZE); Data = (pixel *)malloc((_size.X*_size.Y) * PIXELSIZE);
dst+=(width*CELL);///PIXELSIZE; memcpy(Data, _data, (_size.X*_size.Y) * PIXELSIZE);
src+=XRES+BARSIZE; }
else
{
Data = NULL;
} }
Size = ui::Point(width*CELL, height*CELL);
fail:
delete ren;
delete sim;
delete g;
} }
Thumbnail::~Thumbnail() Thumbnail::~Thumbnail()

View File

@ -4,7 +4,6 @@
#include <iostream> #include <iostream>
#include "Graphics.h" #include "Graphics.h"
#include "interface/Point.h" #include "interface/Point.h"
#include "Save.h"
class Thumbnail class Thumbnail
{ {
@ -13,8 +12,6 @@ public:
Thumbnail(int _id, int _datestamp, pixel * _data, ui::Point _size); Thumbnail(int _id, int _datestamp, pixel * _data, ui::Point _size);
Thumbnail(Save * save);
~Thumbnail(); ~Thumbnail();
int ID, Datestamp; int ID, Datestamp;

View File

@ -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
}

View File

@ -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_ */