mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-22 14:15:38 +00:00
Removed multithreaded image loader.
This commit is contained in:
parent
9c86241cf8
commit
2a0c338cdf
|
@ -21,77 +21,31 @@ GuiImage::GuiImage(int offsetX, int offsetY, std::string path, unsigned int maxW
|
|||
mMaxWidth = maxWidth;
|
||||
mMaxHeight = maxHeight;
|
||||
|
||||
mPathMutex = SDL_CreateMutex();
|
||||
mSurfaceMutex = SDL_CreateMutex();
|
||||
mDeleting = false;
|
||||
|
||||
mLoadThread = SDL_CreateThread(&startImageLoadThread, this);
|
||||
if(!mLoadThread)
|
||||
{
|
||||
std::cerr << "Error - could not create image load thread!\n";
|
||||
std::cerr << " " << SDL_GetError() << "\n";
|
||||
}
|
||||
|
||||
if(!path.empty())
|
||||
setImage(path);
|
||||
}
|
||||
|
||||
GuiImage::~GuiImage()
|
||||
{
|
||||
mDeleting = true;
|
||||
if(mLoadThread)
|
||||
SDL_WaitThread(mLoadThread, NULL);
|
||||
|
||||
if(mSurface)
|
||||
SDL_FreeSurface(mSurface);
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::string GuiImage::getPathThreadSafe()
|
||||
void GuiImage::loadImage(std::string path)
|
||||
{
|
||||
std::string ret;
|
||||
|
||||
SDL_mutexP(mPathMutex);
|
||||
ret = mPath;
|
||||
SDL_mutexV(mPathMutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void GuiImage::setPathThreadSafe(std::string path)
|
||||
{
|
||||
SDL_mutexP(mPathMutex);
|
||||
mPath = path;
|
||||
|
||||
if(mPath.empty())
|
||||
mLoadedPath = "";
|
||||
SDL_mutexV(mPathMutex);
|
||||
}
|
||||
|
||||
int GuiImage::runImageLoadThread()
|
||||
{
|
||||
while(!mDeleting)
|
||||
{
|
||||
std::string path = getPathThreadSafe();
|
||||
|
||||
if(path != mLoadedPath && path != "" && boost::filesystem::exists(path))
|
||||
if(boost::filesystem::exists(path))
|
||||
{
|
||||
//start loading the image
|
||||
SDL_Surface* newSurf = IMG_Load(path.c_str());
|
||||
|
||||
//if we started loading something else or failed to load, don't bother resizing
|
||||
if(path != getPathThreadSafe() || newSurf == NULL)
|
||||
if(newSurf == NULL)
|
||||
{
|
||||
if(newSurf)
|
||||
SDL_FreeSurface(newSurf);
|
||||
|
||||
continue;
|
||||
std::cerr << "Error loading image.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//std::cout << "Loading complete, checking for resize\n";
|
||||
|
||||
//resize it
|
||||
if(mMaxWidth && newSurf->w > mMaxWidth)
|
||||
{
|
||||
|
@ -111,17 +65,7 @@ int GuiImage::runImageLoadThread()
|
|||
newSurf = resSurf;
|
||||
}
|
||||
|
||||
//again, make sure we're still good to go
|
||||
if(path != getPathThreadSafe() || newSurf == NULL)
|
||||
{
|
||||
if(newSurf)
|
||||
SDL_FreeSurface(newSurf);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
//finally set the image and delete the old one
|
||||
SDL_mutexP(mSurfaceMutex);
|
||||
if(mSurface)
|
||||
SDL_FreeSurface(mSurface);
|
||||
|
||||
|
@ -132,48 +76,31 @@ int GuiImage::runImageLoadThread()
|
|||
mRect.y = mOffsetY;
|
||||
mRect.w = 0;
|
||||
mRect.h = 0;
|
||||
|
||||
mLoadedPath = path;
|
||||
SDL_mutexV(mSurfaceMutex);
|
||||
}else{
|
||||
std::cerr << "File \"" << path << "\" not found!\n";
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Finishing image loader thread.\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int startImageLoadThread(void* img)
|
||||
{
|
||||
return ((GuiImage*)img)->runImageLoadThread();
|
||||
}
|
||||
|
||||
void GuiImage::setImage(std::string path)
|
||||
{
|
||||
setPathThreadSafe(path);
|
||||
if(mPath == path)
|
||||
return;
|
||||
|
||||
mPath = path;
|
||||
|
||||
if(path.empty())
|
||||
{
|
||||
if(mSurface)
|
||||
{
|
||||
SDL_mutexP(mSurfaceMutex);
|
||||
SDL_FreeSurface(mSurface);
|
||||
mSurface = NULL;
|
||||
SDL_mutexV(mSurfaceMutex);
|
||||
}
|
||||
}
|
||||
|
||||
if(!path.empty())
|
||||
loadImage(path);
|
||||
|
||||
}
|
||||
|
||||
void GuiImage::onRender()
|
||||
{
|
||||
if(mSurface)
|
||||
{
|
||||
SDL_mutexP(mSurfaceMutex);
|
||||
SDL_BlitSurface(mSurface, NULL, Renderer::screen, &mRect);
|
||||
SDL_mutexV(mSurfaceMutex);
|
||||
}else if(!getPathThreadSafe().empty())
|
||||
{
|
||||
Renderer::drawCenteredText("Loading...", -(Renderer::getScreenWidth() - mOffsetX)/*-mOffsetX * 3*/, mOffsetY, 0x000000);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,26 +19,16 @@ public:
|
|||
|
||||
void onRender();
|
||||
|
||||
//this should really never be called by anything except setImage
|
||||
//but it was either make this function public or make mSurface public
|
||||
//so just don't use this, okay?
|
||||
int runImageLoadThread();
|
||||
|
||||
private:
|
||||
int mMaxWidth, mMaxHeight;
|
||||
|
||||
std::string mPath, mLoadedPath;
|
||||
void loadImage(std::string path);
|
||||
|
||||
std::string mPath;
|
||||
|
||||
SDL_Surface* mSurface;
|
||||
int mOffsetX, mOffsetY;
|
||||
SDL_Rect mRect;
|
||||
|
||||
SDL_Thread* mLoadThread;
|
||||
void setPathThreadSafe(std::string path);
|
||||
std::string getPathThreadSafe();
|
||||
SDL_mutex* mPathMutex;
|
||||
SDL_mutex* mSurfaceMutex;
|
||||
bool mDeleting;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue