Mercurial > love-experiments
diff src/modules/image/devil/ImageData.cpp @ 1096:86a44f2bc38f
CRLF to LF
| author | Bart van Strien <bart.bes+projects@gmail.com> |
|---|---|
| date | Wed, 04 Jul 2012 14:40:24 +0200 |
| parents | 73f4863ee5b7 |
| children | a74672ba1320 b7f097053d74 |
line wrap: on
line diff
--- a/src/modules/image/devil/ImageData.cpp Wed Jul 04 13:54:15 2012 +0200 +++ b/src/modules/image/devil/ImageData.cpp Wed Jul 04 14:40:24 2012 +0200 @@ -1,227 +1,227 @@ -/** - * Copyright (c) 2006-2012 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 <cstring> -#include <iostream> - -// LOVE -#include "common/Exception.h" -#include "common/math.h" -#include "filesystem/File.h" - -using love::thread::Lock; - -static Mutex devilMutex; - -namespace love -{ -namespace image -{ -namespace devil -{ - -static inline void ilxClearErrors() -{ - while (ilGetError() != IL_NO_ERROR); -} - -ImageData::ImageData(Data *data) -{ - load(data); -} - -ImageData::ImageData(filesystem::File *file) -{ - Data *data = file->read(); - load(data); - data->release(); -} - -ImageData::ImageData(int width, int height) -{ - this->width = width; - this->height = height; - create(width, height); - - // Set to black. - memset(data, 0, width*height*4); -} - -ImageData::ImageData(int width, int height, void *data) -{ - this->width = width; - this->height = height; - create(width, height, data); -} - -ImageData::~ImageData() -{ - delete[] data; -} - -void ImageData::create(int width, int height, void *data) -{ - try - { - this->data = new unsigned char[width*height*sizeof(pixel)]; - } - catch(std::bad_alloc &) - { - throw love::Exception("Out of memory"); - } - - if (data) - memcpy(this->data, data, width*height*sizeof(pixel)); -} - -void ImageData::load(Data *data) -{ - Lock lock(devilMutex); - ILuint image; - ilGenImages(1, &image); - ilBindImage(image); - - try - { - bool success = IL_TRUE == ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), data->getSize()); - - if (!success) - throw love::Exception("Could not decode image!"); - - width = ilGetInteger(IL_IMAGE_WIDTH); - height = ilGetInteger(IL_IMAGE_HEIGHT); - - // Make sure the image is in RGBA format. - ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); - - // This should always be four. - int bpp = ilGetInteger(IL_IMAGE_BPP); - if (bpp != sizeof(pixel)) - throw love::Exception("Could not convert image!"); - - create(width, height, ilGetData()); - } - catch(std::exception &) - { - ilDeleteImages(1, &image); - throw; - } - - ilDeleteImages(1, &image); -} - -void ImageData::encode(love::filesystem::File *f, ImageData::Format format) -{ - Lock lock1(devilMutex); - Lock lock2(mutex); - - ILuint tempimage; - ilGenImages(1, &tempimage); - ilBindImage(tempimage); - ilxClearErrors(); - - ILubyte *encoded_data = NULL; - - try - { - bool success = IL_TRUE == ilTexImage(width, height, 1, sizeof(pixel), IL_RGBA, IL_UNSIGNED_BYTE, this->data); - - ILenum err = ilGetError(); - ilxClearErrors(); - - if (!success) - { - if (err != IL_NO_ERROR) - { - switch (err) - { - case IL_ILLEGAL_OPERATION: - throw love::Exception("Illegal operation"); - case IL_INVALID_PARAM: - throw love::Exception("Invalid parameters"); - case IL_OUT_OF_MEMORY: - throw love::Exception("Out of memory"); - default: - throw love::Exception("Unknown error (%d)", (int) err); - } - } - - throw love::Exception("Could not create image for the encoding!"); - } - - ilRegisterOrigin(IL_ORIGIN_UPPER_LEFT); - - ILuint ilFormat; - switch (format) - { - case ImageData::FORMAT_BMP: - ilFormat = IL_BMP; - break; - case ImageData::FORMAT_TGA: - ilFormat = IL_TGA; - break; - case ImageData::FORMAT_GIF: - ilFormat = IL_GIF; - break; - case ImageData::FORMAT_JPG: - ilFormat = IL_JPG; - break; - case ImageData::FORMAT_PNG: - default: // PNG is the default format - ilFormat = IL_PNG; - break; - } - - ILuint size = ilSaveL(ilFormat, NULL, 0); - if (!size) - throw love::Exception("Could not encode image!"); - - try - { - encoded_data = new ILubyte[size]; - } - catch(std::bad_alloc &) - { - throw love::Exception("Out of memory"); - } - - ilSaveL(ilFormat, encoded_data, size); - - f->open(love::filesystem::File::WRITE); - f->write(encoded_data, size); - f->close(); - } - catch(std::exception &) - { - ilDeleteImages(1, &tempimage); - delete[] encoded_data; - throw; - } - - ilDeleteImages(1, &tempimage); - delete[] encoded_data; -} - -} // devil -} // image -} // love +/** + * Copyright (c) 2006-2012 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 <cstring> +#include <iostream> + +// LOVE +#include "common/Exception.h" +#include "common/math.h" +#include "filesystem/File.h" + +using love::thread::Lock; + +static Mutex devilMutex; + +namespace love +{ +namespace image +{ +namespace devil +{ + +static inline void ilxClearErrors() +{ + while (ilGetError() != IL_NO_ERROR); +} + +ImageData::ImageData(Data *data) +{ + load(data); +} + +ImageData::ImageData(filesystem::File *file) +{ + Data *data = file->read(); + load(data); + data->release(); +} + +ImageData::ImageData(int width, int height) +{ + this->width = width; + this->height = height; + create(width, height); + + // Set to black. + memset(data, 0, width*height*4); +} + +ImageData::ImageData(int width, int height, void *data) +{ + this->width = width; + this->height = height; + create(width, height, data); +} + +ImageData::~ImageData() +{ + delete[] data; +} + +void ImageData::create(int width, int height, void *data) +{ + try + { + this->data = new unsigned char[width*height*sizeof(pixel)]; + } + catch(std::bad_alloc &) + { + throw love::Exception("Out of memory"); + } + + if (data) + memcpy(this->data, data, width*height*sizeof(pixel)); +} + +void ImageData::load(Data *data) +{ + Lock lock(devilMutex); + ILuint image; + ilGenImages(1, &image); + ilBindImage(image); + + try + { + bool success = IL_TRUE == ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), data->getSize()); + + if (!success) + throw love::Exception("Could not decode image!"); + + width = ilGetInteger(IL_IMAGE_WIDTH); + height = ilGetInteger(IL_IMAGE_HEIGHT); + + // Make sure the image is in RGBA format. + ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); + + // This should always be four. + int bpp = ilGetInteger(IL_IMAGE_BPP); + if (bpp != sizeof(pixel)) + throw love::Exception("Could not convert image!"); + + create(width, height, ilGetData()); + } + catch(std::exception &) + { + ilDeleteImages(1, &image); + throw; + } + + ilDeleteImages(1, &image); +} + +void ImageData::encode(love::filesystem::File *f, ImageData::Format format) +{ + Lock lock1(devilMutex); + Lock lock2(mutex); + + ILuint tempimage; + ilGenImages(1, &tempimage); + ilBindImage(tempimage); + ilxClearErrors(); + + ILubyte *encoded_data = NULL; + + try + { + bool success = IL_TRUE == ilTexImage(width, height, 1, sizeof(pixel), IL_RGBA, IL_UNSIGNED_BYTE, this->data); + + ILenum err = ilGetError(); + ilxClearErrors(); + + if (!success) + { + if (err != IL_NO_ERROR) + { + switch (err) + { + case IL_ILLEGAL_OPERATION: + throw love::Exception("Illegal operation"); + case IL_INVALID_PARAM: + throw love::Exception("Invalid parameters"); + case IL_OUT_OF_MEMORY: + throw love::Exception("Out of memory"); + default: + throw love::Exception("Unknown error (%d)", (int) err); + } + } + + throw love::Exception("Could not create image for the encoding!"); + } + + ilRegisterOrigin(IL_ORIGIN_UPPER_LEFT); + + ILuint ilFormat; + switch (format) + { + case ImageData::FORMAT_BMP: + ilFormat = IL_BMP; + break; + case ImageData::FORMAT_TGA: + ilFormat = IL_TGA; + break; + case ImageData::FORMAT_GIF: + ilFormat = IL_GIF; + break; + case ImageData::FORMAT_JPG: + ilFormat = IL_JPG; + break; + case ImageData::FORMAT_PNG: + default: // PNG is the default format + ilFormat = IL_PNG; + break; + } + + ILuint size = ilSaveL(ilFormat, NULL, 0); + if (!size) + throw love::Exception("Could not encode image!"); + + try + { + encoded_data = new ILubyte[size]; + } + catch(std::bad_alloc &) + { + throw love::Exception("Out of memory"); + } + + ilSaveL(ilFormat, encoded_data, size); + + f->open(love::filesystem::File::WRITE); + f->write(encoded_data, size); + f->close(); + } + catch(std::exception &) + { + ilDeleteImages(1, &tempimage); + delete[] encoded_data; + throw; + } + + ilDeleteImages(1, &tempimage); + delete[] encoded_data; +} + +} // devil +} // image +} // love
