git repos / blockattack-game

blame: source/code/CppSdlImageHolder.cpp

normal view · raw

c53e6443 sago007 2012-04-17 11:04 1
/*
3db6ed5d sago007 2010-12-07 17:19 2
 * File:   CppSdlImageHolder.cpp
3db6ed5d sago007 2010-12-07 17:19 3
 * Author: poul
c53e6443 sago007 2012-04-17 11:04 4
 *
3db6ed5d sago007 2010-12-07 17:19 5
 * Created on 29. september 2010, 19:46
3db6ed5d sago007 2010-12-07 17:19 6
 */
3db6ed5d sago007 2010-12-07 17:19 7
3db6ed5d sago007 2010-12-07 17:19 8
#include "CppSdlImageHolder.hpp"
3db6ed5d sago007 2010-12-07 17:19 9
#include "SDL_image.h"
3db6ed5d sago007 2010-12-07 17:19 10
c53e6443 sago007 2012-04-17 11:04 11
namespace CppSdl
c53e6443 sago007 2012-04-17 11:04 12
{
c53e6443 sago007 2012-04-17 11:04 13
c53e6443 sago007 2012-04-17 11:04 14
CppSdlImageHolder::CppSdlImageHolder()
c53e6443 sago007 2012-04-17 11:04 15
{
c53e6443 sago007 2012-04-17 11:04 16
	data = NULL;
c53e6443 sago007 2012-04-17 11:04 17
	counter = new int;
c53e6443 sago007 2012-04-17 11:04 18
	(*counter)=1;
c53e6443 sago007 2012-04-17 11:04 19
}
c53e6443 sago007 2012-04-17 11:04 20
c53e6443 sago007 2012-04-17 11:04 21
CppSdlImageHolder::CppSdlImageHolder(std::string filename)
c53e6443 sago007 2012-04-17 11:04 22
{
c53e6443 sago007 2012-04-17 11:04 23
	data = IMG_Load(filename.c_str());
c53e6443 sago007 2012-04-17 11:04 24
	if(!data)
c53e6443 sago007 2012-04-17 11:04 25
	{
c53e6443 sago007 2012-04-17 11:04 26
		//Here we should throw an exception
c53e6443 sago007 2012-04-17 11:04 27
		CppSdlException e(IMAGE,CPPSDL_ERROR_MISSINGFILE,"Could not read file \""+filename+"\"");
c53e6443 sago007 2012-04-17 11:04 28
		throw e;
c53e6443 sago007 2012-04-17 11:04 29
	}
c53e6443 sago007 2012-04-17 11:04 30
	SDL_GetClipRect(data,&area);
c53e6443 sago007 2012-04-17 11:04 31
	OptimizeForBlit();
c53e6443 sago007 2012-04-17 11:04 32
	counter = new int;
c53e6443 sago007 2012-04-17 11:04 33
	*counter=1;
c53e6443 sago007 2012-04-17 11:04 34
}
c53e6443 sago007 2012-04-17 11:04 35
c53e6443 sago007 2012-04-17 11:04 36
CppSdlImageHolder::CppSdlImageHolder(const CppSdlImageHolder& orig)
c53e6443 sago007 2012-04-17 11:04 37
{
c53e6443 sago007 2012-04-17 11:04 38
	//Just take the data from the original. This is technically wrong but adds a little performance.
c53e6443 sago007 2012-04-17 11:04 39
	data = orig.data;
c53e6443 sago007 2012-04-17 11:04 40
	area = orig.area;
c53e6443 sago007 2012-04-17 11:04 41
	if(orig.counter)
c53e6443 sago007 2012-04-17 11:04 42
	{
c53e6443 sago007 2012-04-17 11:04 43
		counter = orig.counter;
c53e6443 sago007 2012-04-17 11:04 44
		(*counter)++;
c53e6443 sago007 2012-04-17 11:04 45
	}
c53e6443 sago007 2012-04-17 11:04 46
}
c53e6443 sago007 2012-04-17 11:04 47
c53e6443 sago007 2012-04-17 11:04 48
CppSdlImageHolder& CppSdlImageHolder::operator =(const CppSdlImageHolder& rhs)
c53e6443 sago007 2012-04-17 11:04 49
{
c53e6443 sago007 2012-04-17 11:04 50
	// Check for self-assignment!
c53e6443 sago007 2012-04-17 11:04 51
	if (this == &rhs)      // Same object?
c53e6443 sago007 2012-04-17 11:04 52
		return *this;        // Yes, so skip assignment, and just return *this.
c53e6443 sago007 2012-04-17 11:04 53
	MakeNull();
c53e6443 sago007 2012-04-17 11:04 54
	data = rhs.data;
c53e6443 sago007 2012-04-17 11:04 55
	area = rhs.area;
c53e6443 sago007 2012-04-17 11:04 56
	if(rhs.counter)
c53e6443 sago007 2012-04-17 11:04 57
	{
c53e6443 sago007 2012-04-17 11:04 58
		counter = rhs.counter;
c53e6443 sago007 2012-04-17 11:04 59
		(*counter)++;
c53e6443 sago007 2012-04-17 11:04 60
	}
c53e6443 sago007 2012-04-17 11:04 61
	return *this;
c53e6443 sago007 2012-04-17 11:04 62
}
c53e6443 sago007 2012-04-17 11:04 63
c53e6443 sago007 2012-04-17 11:04 64
CppSdlImageHolder::CppSdlImageHolder(char* rawdata, int datasize)
c53e6443 sago007 2012-04-17 11:04 65
{
c53e6443 sago007 2012-04-17 11:04 66
	SDL_RWops *rw = SDL_RWFromMem (rawdata, datasize);
c53e6443 sago007 2012-04-17 11:04 67
c53e6443 sago007 2012-04-17 11:04 68
	//The above might fail and return null.
c53e6443 sago007 2012-04-17 11:04 69
	if(!rw)
c53e6443 sago007 2012-04-17 11:04 70
	{
c53e6443 sago007 2012-04-17 11:04 71
		CppSdlException e(IMAGE,CPPSDL_ERROR_NULLPOINTER, "Could not read raw data");
c53e6443 sago007 2012-04-17 11:04 72
		throw e;
c53e6443 sago007 2012-04-17 11:04 73
	}
c53e6443 sago007 2012-04-17 11:04 74
c53e6443 sago007 2012-04-17 11:04 75
	data = IMG_Load_RW(rw,true); //the second argument tells the function to free RWops
c53e6443 sago007 2012-04-17 11:04 76
c53e6443 sago007 2012-04-17 11:04 77
	if(!data)
c53e6443 sago007 2012-04-17 11:04 78
	{
c53e6443 sago007 2012-04-17 11:04 79
		CppSdlException e(IMAGE,CPPSDL_ERROR_DATA,"Could not convert raw data to image");
c53e6443 sago007 2012-04-17 11:04 80
		throw e;
c53e6443 sago007 2012-04-17 11:04 81
	}
c53e6443 sago007 2012-04-17 11:04 82
c53e6443 sago007 2012-04-17 11:04 83
	SDL_GetClipRect(data,&area);
c53e6443 sago007 2012-04-17 11:04 84
	OptimizeForBlit();
c53e6443 sago007 2012-04-17 11:04 85
	counter = new int;
c53e6443 sago007 2012-04-17 11:04 86
	*counter = 1;
c53e6443 sago007 2012-04-17 11:04 87
}
c53e6443 sago007 2012-04-17 11:04 88
c53e6443 sago007 2012-04-17 11:04 89
CppSdlImageHolder::~CppSdlImageHolder()
c53e6443 sago007 2012-04-17 11:04 90
{
c53e6443 sago007 2012-04-17 11:04 91
	if(!counter)
c53e6443 sago007 2012-04-17 11:04 92
		return; //There are no counter, so already freed
c53e6443 sago007 2012-04-17 11:04 93
	MakeNull();
c53e6443 sago007 2012-04-17 11:04 94
	if(*counter == 0)
c53e6443 sago007 2012-04-17 11:04 95
	{
c53e6443 sago007 2012-04-17 11:04 96
		delete counter;
c53e6443 sago007 2012-04-17 11:04 97
		counter = NULL;
c53e6443 sago007 2012-04-17 11:04 98
	}
3db6ed5d sago007 2010-12-07 17:19 99
}
3db6ed5d sago007 2010-12-07 17:19 100
3db6ed5d sago007 2010-12-07 17:19 101
SDL_Surface* CppSdlImageHolder::GetRawDataInsecure()
3db6ed5d sago007 2010-12-07 17:19 102
{
c53e6443 sago007 2012-04-17 11:04 103
	Initialized();
c53e6443 sago007 2012-04-17 11:04 104
	return data;
3db6ed5d sago007 2010-12-07 17:19 105
}
3db6ed5d sago007 2010-12-07 17:19 106
3db6ed5d sago007 2010-12-07 17:19 107
Uint32 CppSdlImageHolder::GetWidth()
3db6ed5d sago007 2010-12-07 17:19 108
{
c53e6443 sago007 2012-04-17 11:04 109
	if(IsNull())
c53e6443 sago007 2012-04-17 11:04 110
		return 0;
c53e6443 sago007 2012-04-17 11:04 111
	return area.w;
3db6ed5d sago007 2010-12-07 17:19 112
}
3db6ed5d sago007 2010-12-07 17:19 113
3db6ed5d sago007 2010-12-07 17:19 114
Uint32 CppSdlImageHolder::GetHeight()
3db6ed5d sago007 2010-12-07 17:19 115
{
c53e6443 sago007 2012-04-17 11:04 116
	if(IsNull())
c53e6443 sago007 2012-04-17 11:04 117
		return 0;
c53e6443 sago007 2012-04-17 11:04 118
	return area.h;
3db6ed5d sago007 2010-12-07 17:19 119
}
3db6ed5d sago007 2010-12-07 17:19 120
3db6ed5d sago007 2010-12-07 17:19 121
void CppSdlImageHolder::Cut(Uint32 x, Uint32 y, Sint32 w = -1, Sint32 h = -1)
3db6ed5d sago007 2010-12-07 17:19 122
{
c53e6443 sago007 2012-04-17 11:04 123
	Initialized();
c53e6443 sago007 2012-04-17 11:04 124
	if(w<0)
c53e6443 sago007 2012-04-17 11:04 125
	{
c53e6443 sago007 2012-04-17 11:04 126
		w = GetWidth() - x;
c53e6443 sago007 2012-04-17 11:04 127
	}
c53e6443 sago007 2012-04-17 11:04 128
	if(h<0)
c53e6443 sago007 2012-04-17 11:04 129
	{
c53e6443 sago007 2012-04-17 11:04 130
		h = GetHeight() - y;
c53e6443 sago007 2012-04-17 11:04 131
	}
c53e6443 sago007 2012-04-17 11:04 132
	if(x+w>GetWidth())
c53e6443 sago007 2012-04-17 11:04 133
	{
c53e6443 sago007 2012-04-17 11:04 134
		//throw exception
c53e6443 sago007 2012-04-17 11:04 135
	}
c53e6443 sago007 2012-04-17 11:04 136
	if(y+h>GetHeight())
c53e6443 sago007 2012-04-17 11:04 137
	{
c53e6443 sago007 2012-04-17 11:04 138
		//throw exception
c53e6443 sago007 2012-04-17 11:04 139
	}
c53e6443 sago007 2012-04-17 11:04 140
	if(x<0 || x>GetWidth())
c53e6443 sago007 2012-04-17 11:04 141
	{
c53e6443 sago007 2012-04-17 11:04 142
		//throw exception
c53e6443 sago007 2012-04-17 11:04 143
	}
c53e6443 sago007 2012-04-17 11:04 144
	if(y<0 || y>GetHeight())
c53e6443 sago007 2012-04-17 11:04 145
	{
c53e6443 sago007 2012-04-17 11:04 146
		//throw exception
c53e6443 sago007 2012-04-17 11:04 147
	}
c53e6443 sago007 2012-04-17 11:04 148
	area.x += x;
c53e6443 sago007 2012-04-17 11:04 149
	area.y += y;
c53e6443 sago007 2012-04-17 11:04 150
	area.w = w;
c53e6443 sago007 2012-04-17 11:04 151
	area.h = h;
c53e6443 sago007 2012-04-17 11:04 152
}
c53e6443 sago007 2012-04-17 11:04 153
c53e6443 sago007 2012-04-17 11:04 154
void CppSdlImageHolder::PaintTo(SDL_Surface* target, int x, int y)
c53e6443 sago007 2012-04-17 11:04 155
{
c53e6443 sago007 2012-04-17 11:04 156
	static SDL_Rect dest; //static for reuse
c53e6443 sago007 2012-04-17 11:04 157
	if(IsNull())
c53e6443 sago007 2012-04-17 11:04 158
		return;
c53e6443 sago007 2012-04-17 11:04 159
	dest.x = x;
c53e6443 sago007 2012-04-17 11:04 160
	dest.y = y;
c53e6443 sago007 2012-04-17 11:04 161
	SDL_BlitSurface(data,&area, target,&dest);
c53e6443 sago007 2012-04-17 11:04 162
}
c53e6443 sago007 2012-04-17 11:04 163
c53e6443 sago007 2012-04-17 11:04 164
void CppSdlImageHolder::OptimizeForBlit(bool allowAlpha)
c53e6443 sago007 2012-04-17 11:04 165
{
c53e6443 sago007 2012-04-17 11:04 166
	static SDL_Surface *tmp;
c53e6443 sago007 2012-04-17 11:04 167
	Initialized();
c53e6443 sago007 2012-04-17 11:04 168
	if(allowAlpha)
c53e6443 sago007 2012-04-17 11:04 169
		tmp = SDL_DisplayFormatAlpha(data);
c53e6443 sago007 2012-04-17 11:04 170
	else
c53e6443 sago007 2012-04-17 11:04 171
		tmp = SDL_DisplayFormat(data);
c53e6443 sago007 2012-04-17 11:04 172
	SDL_FreeSurface(data);
c53e6443 sago007 2012-04-17 11:04 173
	data = tmp;
c53e6443 sago007 2012-04-17 11:04 174
}
c53e6443 sago007 2012-04-17 11:04 175
c53e6443 sago007 2012-04-17 11:04 176
void CppSdlImageHolder::Initialized()
c53e6443 sago007 2012-04-17 11:04 177
{
c53e6443 sago007 2012-04-17 11:04 178
	if(data == NULL)
c53e6443 sago007 2012-04-17 11:04 179
		throw(CppSdlException(IMAGE,CPPSDL_ERROR_NULLPOINTER,"ImageHolder used uninitialized!"));
c53e6443 sago007 2012-04-17 11:04 180
}
c53e6443 sago007 2012-04-17 11:04 181
c53e6443 sago007 2012-04-17 11:04 182
bool CppSdlImageHolder::IsNull()
c53e6443 sago007 2012-04-17 11:04 183
{
c53e6443 sago007 2012-04-17 11:04 184
	if(data == NULL || counter == NULL)
c53e6443 sago007 2012-04-17 11:04 185
		return true;
c53e6443 sago007 2012-04-17 11:04 186
	else
c53e6443 sago007 2012-04-17 11:04 187
		return false;
c53e6443 sago007 2012-04-17 11:04 188
}
c53e6443 sago007 2012-04-17 11:04 189
c53e6443 sago007 2012-04-17 11:04 190
void CppSdlImageHolder::MakeNull()
c53e6443 sago007 2012-04-17 11:04 191
{
c53e6443 sago007 2012-04-17 11:04 192
	if(IsNull())
c53e6443 sago007 2012-04-17 11:04 193
		return;
c53e6443 sago007 2012-04-17 11:04 194
	(*counter)--;
c53e6443 sago007 2012-04-17 11:04 195
	if(*counter == 0 && data != NULL)
c53e6443 sago007 2012-04-17 11:04 196
	{
c53e6443 sago007 2012-04-17 11:04 197
		SDL_FreeSurface(data);
c53e6443 sago007 2012-04-17 11:04 198
		data = NULL;
c53e6443 sago007 2012-04-17 11:04 199
	}
8d488d32 sago007 2011-04-17 13:02 200
}
8d488d32 sago007 2011-04-17 13:02 201
8d488d32 sago007 2011-04-17 13:02 202
}
1970-01-01 00:00 203