git repos / blockattack-game

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