| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
1 |
/* |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
2 |
* File: CppSdlImageHolder.cpp |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
3 |
* Author: poul |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
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 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
11 |
namespace CppSdl { |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
12 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
13 |
CppSdlImageHolder::CppSdlImageHolder(std::string filename) { |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
14 |
data = IMG_Load(filename.c_str()); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
15 |
if(!data) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
16 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
17 |
//Here we should throw an exception |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
18 |
CppSdlException e("Could not read file \""+filename+"\""); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
19 |
throw e; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
20 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
21 |
SDL_GetClipRect(data,&area); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
22 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
23 |
counter=1; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
24 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
25 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
26 |
CppSdlImageHolder::CppSdlImageHolder(const CppSdlImageHolder& orig) { |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
27 |
//Just take the data from the original. This is technically wrong but adds a little performance. |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
28 |
data = orig.data; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
29 |
area = orig.area; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
30 |
counter++; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
31 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
32 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
33 |
CppSdlImageHolder::CppSdlImageHolder(char* rawdata, int datasize) { |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
34 |
SDL_RWops *rw = SDL_RWFromMem (rawdata, datasize); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
35 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
36 |
//The above might fail an return null. |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
37 |
if(!rw) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
38 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
39 |
CppSdlException e("Could not read raw data"); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
40 |
throw e; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
41 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
42 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
43 |
SDL_Surface* data = IMG_Load_RW(rw,false); //the second argument tells the function to three RWops |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
44 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
45 |
if(!data) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
46 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
47 |
CppSdlException e("Could not read raw data"); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
48 |
throw e; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
49 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
50 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
51 |
SDL_GetClipRect(data,&area); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
52 |
counter = 1; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
53 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
54 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
55 |
CppSdlImageHolder::~CppSdlImageHolder() { |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
56 |
counter--; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
57 |
if(counter == 0) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
58 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
59 |
SDL_FreeSurface(data); |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
60 |
data = NULL; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
61 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
62 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
63 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
64 |
SDL_Surface* CppSdlImageHolder::GetRawDataInsecure() |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
65 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
66 |
return data; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
67 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
68 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
69 |
Uint32 CppSdlImageHolder::GetWidth() |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
70 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
71 |
return area.w; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
72 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
73 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
74 |
Uint32 CppSdlImageHolder::GetHeight() |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
75 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
76 |
return area.h; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
77 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
78 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
79 |
void CppSdlImageHolder::Cut(Uint32 x, Uint32 y, Sint32 w = -1, Sint32 h = -1) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
80 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
81 |
if(w<0) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
82 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
83 |
w = GetWidth() - x; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
84 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
85 |
if(h<0) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
86 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
87 |
h = GetHeight() - y; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
88 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
89 |
if(x+w>GetWidth()) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
90 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
91 |
//throw exception |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
92 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
93 |
if(y+h>GetHeight()) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
94 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
95 |
//throw exception |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
96 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
97 |
if(x<0 || x>GetWidth()) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
98 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
99 |
//throw exception |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
100 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
101 |
if(y<0 || y>GetHeight()) |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
102 |
{ |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
103 |
//throw exception |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
104 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
105 |
area.x += x; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
106 |
area.y += y; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
107 |
area.w = w; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
108 |
area.h = h; |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
109 |
} |
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
110 |
|
| 3db6ed5d |
sago007 |
2010-12-07 17:19 |
111 |
} |