Description of the XCF image file format
Features:
- Supports multiple layers
- RGB, Grayscale, and Indexed mode with or without alpha channel
Usage is very simple:
Code: Select all
#include "CImageLoaderXCF.h"
#include <irrlicht.h>
int main()
{
//setup as usual
irr::IrrlichtDevice* device = irr::createDevice(irr::video::EDT_OPENGL);
irr::scene::ISceneManager* smgr = device->getSceneManager();
irr::video::IVideoDriver* driver = device->getVideoDriver();
//tell Irrlicht there's a new image loader for xcf images
irr::video::CImageLoaderXCF* xcf_loader = new irr::video::CImageLoaderXCF(device);
driver->addExternalImageLoader(xcf_loader);
xcf_loader->drop();
//path to xcf image
irr::io::path path("test.xcf");
//irrlicht can now directly load xcf images
irr::video::ITexture* texture = driver->getTexture(path);
//display it on a cube
irr::scene::IMeshSceneNode* cube = smgr->addCubeSceneNode(10.0f);
if (texture)
{
cube->setMaterialType(irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL); //xcf images support alpha channels
cube->setMaterialTexture(0, texture);
cube->setMaterialFlag(irr::video::EMF_LIGHTING, false);
}
//if you want more control over the image:
//create an XCFImage object. (must be dropped after usage)
irr::video::XCFImage* xcf_image = xcf_loader->createImage(path);
//this is the method to get the full image with all the layers
irr::video::IImage* img = xcf_image->createIrrlichtImageFull();
img->drop();
//you can access all layers of the image and get an IImage out of them
irr::u32 numLayers = xcf_image->getNumLayers();
for (irr::u32 i = 0; i < numLayers; ++i)
{
irr::video::XCFImage::Layer* layer = xcf_image->getLayer(i);
irr::video::IImage* img = xcf_image->createIrrlichtImageFromLayer(layer);
irr::scene::IMeshSceneNode* cube = smgr->addCubeSceneNode(10.0f);
cube->setPosition(irr::core::vector3df(i*10 + 10, 0, 0));
cube->setMaterialType(irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);
cube->setMaterialTexture(0, driver->addTexture(layer->name, img));
cube->setMaterialFlag(irr::video::EMF_LIGHTING, false);
img->drop();
}
irr::scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 40,0.05);
camera->setPosition(irr::core::vector3df(0,0, -15.0f));
while (device->run())
{
driver->beginScene(true, true, irr::video::SColor(255, 128, 128, 128));
smgr->drawAll();
driver->endScene();
}
delete xcf_image;
device->drop();
return 0;
}
Known issues:
- Layers must have same size
- Layer modes other than Normal are not supported
- Flattening process of layers is very slow and unoptimized. If you have a better algorithm, please tell me!
- Ignoring channels and masks for now
Download: xfc_reader.zip (Test image included)
Screenshot:
