00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <boost/scoped_array.hpp>
00026 #include <boost/scoped_ptr.hpp>
00027 #include <SDL.h>
00028 #include <SDL_image.h>
00029
00030
00031
00032
00033
00034 #include "util/base/exception.h"
00035 #include "util/resource/resource_location.h"
00036 #include "util/resource/resource.h"
00037 #include "vfs/raw/rawdata.h"
00038 #include "vfs/vfs.h"
00039 #include "video/renderbackend.h"
00040 #include "video/image_location.h"
00041
00042 #include "image_loader.h"
00043
00044 namespace FIFE {
00045 IResource* ImageLoader::loadResource(const ResourceLocation& location) {
00046 const ImageLocation* loc = dynamic_cast<const ImageLocation*>(&location);
00047
00048 const std::string& filename = location.getFilename();
00049 boost::scoped_ptr<RawData> data (m_vfs->open(filename));
00050 size_t datalen = data->getDataLength();
00051 boost::scoped_array<uint8_t> darray(new uint8_t[datalen]);
00052 data->readInto(darray.get(), datalen);
00053 SDL_RWops* rwops = SDL_RWFromConstMem(darray.get(), datalen);
00054 SDL_Surface* surface = IMG_Load_RW(rwops, false);
00055 SDL_FreeRW(rwops);
00056 if( !surface ) {
00057 return 0;
00058 }
00059
00060 Image* res = RenderBackend::instance()->createImage(surface);
00061 res->setResourceLocation(location);
00062 if (loc) {
00063 res->setXShift(loc->getXShift());
00064 res->setYShift(loc->getYShift());
00065 }
00066 res->setAlphaOptimizerEnabled(true);
00067 return res;
00068 };
00069 }