Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module playground.ImageManager;
- import std.stdio;
- import std.string;
- import derelict.sdl2.sdl;
- struct ImageInfo
- {
- SDL_Surface *image;
- string friendlyName;
- string fileName;
- }
- /**
- * Manages loading and caching of image resources.
- *
- */
- class ImageManager
- {
- ImageInfo[string] images;
- this()
- {
- }
- ~this()
- {
- foreach(string name, ImageInfo iInfo; images)
- {
- debug writeln("Freeing image ", name);
- SDL_FreeSurface(iInfo.image);
- }
- }
- /**
- * Determines if a specific image has been loaded
- */
- private bool HasImage(string friendlyName)
- {
- ImageInfo tmp;
- return images.get(friendlyName, tmp) != tmp;
- }
- /**
- * Frees the underlying image, as well as removes the ImageInfo from the cache.
- * @param friendlyName The 'friendly' name of the image (i.e. 'HelloWorld')
- */
- private void FreeImage(string friendlyName)
- {
- if(!HasImage(friendlyName))
- return;
- debug writeln("Freeing image ", friendlyName);
- SDL_FreeSurface(images[friendlyName].image);
- debug writeln("Removing ", friendlyName);
- images.remove(friendlyName);
- }
- /**
- * Loads and caches the specified image.
- * @param friendlyName The 'friendly' name of the image (i.e. 'HelloWorld')
- * @param fileName The filename of the image to load.
- * @return True if successful, otherwise false.
- */
- public bool CacheImage(string friendlyName, string fileName)
- {
- if(HasImage(friendlyName))
- {
- if(images[friendlyName].fileName == fileName)
- {
- debug writeln("Ignoring cache request for ",friendlyName);
- return true;
- } else {
- debug writefln("CacheImage: Filepaths differ for [%s]. Reloading.", friendlyName);
- FreeImage(friendlyName);
- }
- }
- SDL_Surface *loadedImage;
- loadedImage = SDL_LoadBMP(toStringz(fileName));
- if(loadedImage != null)
- {
- debug writeln("Caching image ", friendlyName);
- ImageInfo iInfo;
- iInfo.image = loadedImage;
- iInfo.fileName = fileName;
- iInfo.friendlyName = friendlyName;
- images[friendlyName] = iInfo;
- return true;
- }
- debug writefln("Failed to cache image [%s] @ [%s] with error: %s.", friendlyName, fileName, SDL_GetError());
- return false;
- }
- public SDL_Surface* LoadImage(string friendlyName, string filename)
- {
- SDL_Surface *loadedImage;
- loadedImage = SDL_LoadBMP(toStringz(filename));
- if(loadedImage != null)
- {
- debug writeln("Loading image ", friendlyName);
- ImageInfo iInfo;
- iInfo.image = loadedImage;
- iInfo.fileName = filename;
- iInfo.friendlyName = friendlyName;
- images[friendlyName] = iInfo;
- return loadedImage;
- }
- return null;
- }
- public SDL_Surface* GetImage(string friendlyName)
- {
- if(HasImage(friendlyName))
- {
- images[friendlyName].image.refcount++;
- return images[friendlyName].image;
- }
- debug writefln("Error: Failed to retrieve image [%s].", friendlyName);
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement