// CSurface.h
//------------
#ifndef C_SURFACE
#define C_SURFACE
#include <SDL.h>
#include <iostream>
#include <string>
#include <map>
#include "../Main.h"
using namespace std;
extern GlobalState g_applicationState;
class CSurface
{
public:
CSurface(void);
static bool LoadImage(string name, string file);
static void FreeImage(string name);
static void Unload();
static bool DrawImage(string name, int x, int y);
static bool DrawImage(string name, int x, int y, int x2, int y2, int w, int h);
private:
static bool Draw(SDL_Surface* dest, SDL_Surface* src, int x, int y, SDL_Rect* rect);
static map<string, SDL_Surface*> loadedSurfaces;
};
#endif
// --------------------
// CSurface.cpp
//---------------------
#include <SDL_image.h>
#include "CSurface.h"
CSurface::CSurface()
{
}
bool CSurface::LoadImage(string name, string file) {
if(loadedSurfaces.find(name) == loadedSurfaces.end())
{
fprintf(stderr, "Attempt to load resource '%s' but is already in resources (file '%s')", name, file);
return false;
}
SDL_Surface* temp = NULL;
SDL_Surface* result = NULL;
temp = IMG_Load(file.c_str());
if(temp == NULL)
{
fprintf(stderr, "There was an error loading the temp surface for %s\n", file);
return false;
}
result = SDL_DisplayFormatAlpha(temp);
SDL_FreeSurface(temp);
fprintf(stdout, "Loaded Image '%s' as '%s'\n", file, name);
loadedSurfaces[name] = result;
return true;
}
void CSurface::FreeImage(string name)
{
if(loadedSurfaces.find(name) == loadedSurfaces.end())
{
fprintf(stderr, "Cannot find '%s' to free it", name);
return;
}
SDL_Surface* surf = loadedSurfaces[name];
SDL_FreeSurface(surf);
loadedSurfaces.erase(name);
fprintf(stdout, "Unloaded Image '%s'\n", name);
}
void CSurface::Unload()
{
if(loadedSurfaces.size() == 0)
return;
for(map<string, SDL_Surface*>::iterator ii = loadedSurfaces.begin(); ii != loadedSurfaces.end(); ii++)
{
FreeImage(ii->first);
}
}
bool CSurface::DrawImage(string name, int x, int y) {
return Draw(g_applicationState.screen, loadedSurfaces[name], x, y, NULL);
}
bool CSurface::DrawImage(string name, int x, int y, int x2, int y2, int w, int h)
{
SDL_Rect sourceRect;
sourceRect.x = x2;
sourceRect.y = y2;
sourceRect.w = w;
sourceRect.h = h;
return Draw(g_applicationState.screen, loadedSurfaces[name], x, y, &sourceRect);
}
bool CSurface::Draw(SDL_Surface* dest, SDL_Surface* src, int x, int y, SDL_Rect* rect)
{
if(dest == NULL || src == NULL) {
return false;
}
SDL_Rect destinationRect;
destinationRect.x = x;
destinationRect.y = y;
SDL_BlitSurface(src, rect, dest, &destinationRect);
return true;
}
Ly8gQ1N1cmZhY2UuaAovLy0tLS0tLS0tLS0tLQoKI2lmbmRlZiBDX1NVUkZBQ0UKI2RlZmluZSBDX1NVUkZBQ0UKCiNpbmNsdWRlIDxTREwuaD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSAiLi4vTWFpbi5oIgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmV4dGVybiBHbG9iYWxTdGF0ZSBnX2FwcGxpY2F0aW9uU3RhdGU7CgpjbGFzcyBDU3VyZmFjZQp7CnB1YmxpYzoKCUNTdXJmYWNlKHZvaWQpOwoKCXN0YXRpYyBib29sIExvYWRJbWFnZShzdHJpbmcgbmFtZSwgc3RyaW5nIGZpbGUpOwoJc3RhdGljIHZvaWQgRnJlZUltYWdlKHN0cmluZyBuYW1lKTsKCXN0YXRpYyB2b2lkIFVubG9hZCgpOwoKCXN0YXRpYyBib29sIERyYXdJbWFnZShzdHJpbmcgbmFtZSwgaW50IHgsIGludCB5KTsKCXN0YXRpYyBib29sIERyYXdJbWFnZShzdHJpbmcgbmFtZSwgaW50IHgsIGludCB5LCBpbnQgeDIsIGludCB5MiwgaW50IHcsIGludCBoKTsKCnByaXZhdGU6CglzdGF0aWMgYm9vbCBEcmF3KFNETF9TdXJmYWNlKiBkZXN0LCBTRExfU3VyZmFjZSogc3JjLCBpbnQgeCwgaW50IHksIFNETF9SZWN0KiByZWN0KTsKCXN0YXRpYyBtYXA8c3RyaW5nLCBTRExfU3VyZmFjZSo+IGxvYWRlZFN1cmZhY2VzOwp9OwoKI2VuZGlmCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBDU3VyZmFjZS5jcHAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlIDxTRExfaW1hZ2UuaD4KI2luY2x1ZGUgIkNTdXJmYWNlLmgiCgpDU3VyZmFjZTo6Q1N1cmZhY2UoKQp7Cgp9Cgpib29sIENTdXJmYWNlOjpMb2FkSW1hZ2Uoc3RyaW5nIG5hbWUsIHN0cmluZyBmaWxlKSB7CgoJaWYobG9hZGVkU3VyZmFjZXMuZmluZChuYW1lKSA9PSBsb2FkZWRTdXJmYWNlcy5lbmQoKSkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkF0dGVtcHQgdG8gbG9hZCByZXNvdXJjZSAnJXMnIGJ1dCBpcyBhbHJlYWR5IGluIHJlc291cmNlcyAoZmlsZSAnJXMnKSIsIG5hbWUsIGZpbGUpOwoJCXJldHVybiBmYWxzZTsKCX0KCglTRExfU3VyZmFjZSogdGVtcCA9IE5VTEw7CglTRExfU3VyZmFjZSogcmVzdWx0ID0gTlVMTDsKCgl0ZW1wID0gSU1HX0xvYWQoZmlsZS5jX3N0cigpKTsKCWlmKHRlbXAgPT0gTlVMTCkKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHRoZSB0ZW1wIHN1cmZhY2UgZm9yICVzXG4iLCBmaWxlKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcmVzdWx0ID0gU0RMX0Rpc3BsYXlGb3JtYXRBbHBoYSh0ZW1wKTsKCVNETF9GcmVlU3VyZmFjZSh0ZW1wKTsKCglmcHJpbnRmKHN0ZG91dCwgIkxvYWRlZCBJbWFnZSAnJXMnIGFzICclcydcbiIsIGZpbGUsIG5hbWUpOwoKCWxvYWRlZFN1cmZhY2VzW25hbWVdID0gcmVzdWx0OwoKCXJldHVybiB0cnVlOwp9Cgp2b2lkIENTdXJmYWNlOjpGcmVlSW1hZ2Uoc3RyaW5nIG5hbWUpCnsKCWlmKGxvYWRlZFN1cmZhY2VzLmZpbmQobmFtZSkgPT0gbG9hZGVkU3VyZmFjZXMuZW5kKCkpCgl7CgkJZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCAnJXMnIHRvIGZyZWUgaXQiLCBuYW1lKTsKCQlyZXR1cm47Cgl9CgoJU0RMX1N1cmZhY2UqIHN1cmYgPSBsb2FkZWRTdXJmYWNlc1tuYW1lXTsKCVNETF9GcmVlU3VyZmFjZShzdXJmKTsKCWxvYWRlZFN1cmZhY2VzLmVyYXNlKG5hbWUpOwoJZnByaW50ZihzdGRvdXQsICJVbmxvYWRlZCBJbWFnZSAnJXMnXG4iLCBuYW1lKTsKfQoKdm9pZCBDU3VyZmFjZTo6VW5sb2FkKCkKewoJaWYobG9hZGVkU3VyZmFjZXMuc2l6ZSgpID09IDApCgkJcmV0dXJuOwoKCWZvcihtYXA8c3RyaW5nLCBTRExfU3VyZmFjZSo+OjppdGVyYXRvciBpaSA9IGxvYWRlZFN1cmZhY2VzLmJlZ2luKCk7IGlpICE9IGxvYWRlZFN1cmZhY2VzLmVuZCgpOyBpaSsrKQoJewoJCUZyZWVJbWFnZShpaS0+Zmlyc3QpOwoJfQp9Cgpib29sIENTdXJmYWNlOjpEcmF3SW1hZ2Uoc3RyaW5nIG5hbWUsIGludCB4LCBpbnQgeSkgewoKCXJldHVybiBEcmF3KGdfYXBwbGljYXRpb25TdGF0ZS5zY3JlZW4sIGxvYWRlZFN1cmZhY2VzW25hbWVdLCB4LCB5LCBOVUxMKTsKfQoKYm9vbCBDU3VyZmFjZTo6RHJhd0ltYWdlKHN0cmluZyBuYW1lLCBpbnQgeCwgaW50IHksIGludCB4MiwgaW50IHkyLCBpbnQgdywgaW50IGgpCnsKCVNETF9SZWN0IHNvdXJjZVJlY3Q7CgoJc291cmNlUmVjdC54ID0geDI7Cglzb3VyY2VSZWN0LnkgPSB5MjsKCXNvdXJjZVJlY3QudyA9IHc7Cglzb3VyY2VSZWN0LmggPSBoOwoKCXJldHVybiBEcmF3KGdfYXBwbGljYXRpb25TdGF0ZS5zY3JlZW4sIGxvYWRlZFN1cmZhY2VzW25hbWVdLCB4LCB5LCAmc291cmNlUmVjdCk7Cn0KCmJvb2wgQ1N1cmZhY2U6OkRyYXcoU0RMX1N1cmZhY2UqIGRlc3QsIFNETF9TdXJmYWNlKiBzcmMsIGludCB4LCBpbnQgeSwgU0RMX1JlY3QqIHJlY3QpCnsKCWlmKGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglTRExfUmVjdCBkZXN0aW5hdGlvblJlY3Q7CgoJZGVzdGluYXRpb25SZWN0LnggPSB4OwoJZGVzdGluYXRpb25SZWN0LnkgPSB5OwoKCVNETF9CbGl0U3VyZmFjZShzcmMsIHJlY3QsIGRlc3QsICZkZXN0aW5hdGlvblJlY3QpOwoKCXJldHVybiB0cnVlOwp9Cg==