git repos / blockattack-game

blame: source/code/CppSdl/CppSdlImageHolder.cpp

normal view · raw

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
}