-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathimage.cpp
More file actions
73 lines (61 loc) · 1.81 KB
/
image.cpp
File metadata and controls
73 lines (61 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "drawable.h"
#include "image.h"
#include "ioMod.h"
#include "viewport.h"
#include "renderContext.h"
Image::Image( SDL_Surface* surf) :
renderer(RenderContext::getInstance()->getRenderer()),
surface( surf ),
texture( nullptr ),
view{0,0,surf->w,surf->h}
{
regenerateTexture();
}
Image::Image( const Image& image ) :
renderer(image.renderer),
surface(image.surface),
texture(image.texture),
view(image.view)
{ }
Image& Image::operator=(const Image& rhs) {
renderer = rhs.renderer;
texture = rhs.texture;
view = rhs.view;
return *this;
}
void Image::regenerateTexture(){
if(texture != nullptr) SDL_DestroyTexture(texture);
RenderContext* renderContext = RenderContext::getInstance();
texture = SDL_CreateTextureFromSurface(renderContext->getRenderer(), surface);
}
void Image::draw(int x, int y) const {
draw(x,y,1.0f);
}
void Image::draw(int x, int y, float scale) const {
x -= Viewport::getInstance().getX();
y -= Viewport::getInstance().getY();
int tempHeight = scale*view.h;
int tempWidth = scale*view.w;
SDL_Rect dest = {x, y, tempWidth, tempHeight};
SDL_RenderCopy(renderer, texture, &view, &dest);
}
void Image::draw(int sx, int sy, int dx, int dy) const {
SDL_Rect src = { sx, sy, view.w, view.h };
SDL_Rect dst = { dx, dy, getWidth(), getHeight() };
SDL_RenderCopy(renderer, texture, &src, &dst);
}
Image* Image::crop(SDL_Rect sub)const{
if(sub.x+sub.w > view.w
|| sub.y+sub.h > view.h){
std::cerr << "Attempted to crop image with invalid geometry."
<< std::endl
<< "(0,0 + "<<view.w << "x"<<view.h<<")"
<< " --> "
<< "("<<sub.x<<","<<sub.y<<" + "<<sub.w << "x"<<sub.h<<")"
<< std::endl;
return nullptr;
}
Image* cloned = new Image(*this);
cloned->view = sub;
return cloned;
}