Mercurial > love-experiments
diff src/modules/image/devil/ImageData.cpp @ 0:d362ae6ab7f5
Initial Mercurial commit.
| author | rude |
|---|---|
| date | Sun, 26 Jul 2009 15:46:49 +0200 |
| parents | |
| children | 2e9c5a26c760 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/modules/image/devil/ImageData.cpp Sun Jul 26 15:46:49 2009 +0200 @@ -0,0 +1,129 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#include "ImageData.h" + +// STD +#include <iostream> + +namespace love +{ +namespace image +{ +namespace devil +{ + ImageData::ImageData(filesystem::File * file) + { + // Read the data. + Data * data = file->read(); + + // Generate DevIL image. + ilGenImages(1, &image); + + // Bind the image. + ilBindImage(image); + + // Try to load the image. + ILboolean success = ilLoadL(IL_TYPE_UNKNOWN, (void*)data->getData(), data->getSize()); + + // Free local image data. + data->release(); + + // Check for errors + if(!success) + { + std::cerr << "Could not decode image." << std::endl; + return; + } + + width = ilGetInteger(IL_IMAGE_WIDTH); + height = ilGetInteger(IL_IMAGE_HEIGHT); + origin = ilGetInteger(IL_IMAGE_ORIGIN); + + // Make sure the image is in RGBA format. + ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); + + // This should always be four. + bpp = ilGetInteger(IL_IMAGE_BPP); + + if(bpp != 4) + { + std::cerr << "Bits per pixel != 4" << std::endl; + return; + } + } + + ImageData::ImageData(int width, int height) + : width(width), height(height), origin(IL_ORIGIN_UPPER_LEFT), bpp(4) + { + // Generate DevIL image. + ilGenImages(1, &image); + + // Bind the image. + ilBindImage(image); + + ilTexImage(width, height, 0, bpp, IL_RGBA, IL_UNSIGNED_BYTE, 0); + } + + ImageData::~ImageData() + { + ilDeleteImages(1, &image); + } + + int ImageData::getWidth() const + { + return width; + } + + int ImageData::getHeight() const + { + return height; + } + + void * ImageData::getData() const + { + ilBindImage(image); + return ilGetData(); + } + + int ImageData::getSize() const + { + return width*height*bpp; + } + + void ImageData::setPixel(int x, int y, pixel c) + { + int tx = x > width-1 ? width-1 : x; + int ty = y > height-1 ? height-1 : y; + pixel * pixels = (pixel *)getData(); + pixels[y*width+x] = c; + } + + pixel ImageData::getPixel(int x, int y) const + { + int tx = x > width-1 ? width-1 : x; + int ty = y > height-1 ? height-1 : y; + pixel * pixels = (pixel *)getData(); + return pixels[y*width+x]; + } + +} // devil +} // image +} // love
