30 #include "video/image.h"
31 #include "video/imagemanager.h"
32 #include "video/atlasbook.h"
33 #include "video/renderbackend.h"
35 #include "gui_imageloader.h"
37 static const uint32_t ATLAS_SIZE = 512;
40 GuiImageLoader::GuiImageLoader() {
41 m_atlasbook =
new AtlasBook(ATLAS_SIZE, ATLAS_SIZE);
44 GuiImageLoader::~GuiImageLoader() {
48 gcn::Image* GuiImageLoader::load(
const std::string& filename,
bool convertToDisplayFormat) {
49 ImageManager* imgManager = ImageManager::instance();
51 if(imgManager->exists(filename)) {
52 return new GuiImage(imgManager->get(filename));
55 ImagePtr tmpimg = imgManager->load(filename);
56 if(tmpimg->getWidth() >= ATLAS_SIZE || tmpimg->getHeight() >= ATLAS_SIZE) {
57 return new GuiImage(tmpimg);
60 AtlasBlock* block = m_atlasbook->getBlock(tmpimg->getWidth(), tmpimg->getHeight());
63 if(block->page >= m_atlases.size()) {
64 m_atlases.push_back(imgManager->loadBlank(ATLAS_SIZE, ATLAS_SIZE));
68 RenderBackend* rb = RenderBackend::instance();
69 bool prev = rb->isImageCompressingEnabled();
70 rb->setImageCompressingEnabled(
false);
71 m_atlases[block->page]->forceLoadInternal();
72 rb->setImageCompressingEnabled(prev);
76 m_atlases[block->page]->copySubimage(block->left, block->top, tmpimg);
80 imgManager->remove(tmpimg);
83 ImagePtr img = imgManager->create(filename);
84 Rect region(block->left, block->top, block->getWidth(), block->getHeight());
85 img->useSharedImage(m_atlases[block->page], region);
87 return new GuiImage(img);
credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the qua...