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
00026
00027
00028
00029
00030 #include "video/image.h"
00031 #include "video/imagemanager.h"
00032 #include "video/atlasbook.h"
00033 #include "video/renderbackend.h"
00034
00035 #include "gui_imageloader.h"
00036
00037 static const uint32_t ATLAS_SIZE = 512;
00038
00039 namespace FIFE {
00040 GuiImageLoader::GuiImageLoader() {
00041 m_atlasbook = new AtlasBook(ATLAS_SIZE, ATLAS_SIZE);
00042 }
00043
00044 GuiImageLoader::~GuiImageLoader() {
00045 delete m_atlasbook;
00046 }
00047
00048 gcn::Image* GuiImageLoader::load(const std::string& filename, bool convertToDisplayFormat) {
00049 ImageManager* imgManager = ImageManager::instance();
00050
00051 if(imgManager->exists(filename)) {
00052 return new GuiImage(imgManager->get(filename));
00053 }
00054
00055 ImagePtr tmpimg = imgManager->load(filename);
00056 if(tmpimg->getWidth() >= ATLAS_SIZE || tmpimg->getHeight() >= ATLAS_SIZE) {
00057 return new GuiImage(tmpimg);
00058 }
00059
00060 AtlasBlock* block = m_atlasbook->getBlock(tmpimg->getWidth(), tmpimg->getHeight());
00061
00062
00063 if(block->page >= m_atlases.size()) {
00064 m_atlases.push_back(imgManager->loadBlank(ATLAS_SIZE, ATLAS_SIZE));
00065
00066
00067
00068 RenderBackend* rb = RenderBackend::instance();
00069 bool prev = rb->isImageCompressingEnabled();
00070 rb->setImageCompressingEnabled(false);
00071 m_atlases[block->page]->forceLoadInternal();
00072 rb->setImageCompressingEnabled(prev);
00073 }
00074
00075
00076 m_atlases[block->page]->copySubimage(block->left, block->top, tmpimg);
00077
00078
00079 tmpimg->free();
00080 imgManager->remove(tmpimg);
00081
00082
00083 ImagePtr img = imgManager->create(filename);
00084 Rect region(block->left, block->top, block->getWidth(), block->getHeight());
00085 img->useSharedImage(m_atlases[block->page], region);
00086
00087 return new GuiImage(img);
00088 }
00089 }