Mercurial > love-experiments
diff src/modules/image/devil/ImageData.cpp @ 1086:73f4863ee5b7
Applied the new style guidelines.
Well, sort of. Lot's more to be done, but this is a start.
| author | rude |
|---|---|
| date | Thu, 28 Jun 2012 23:52:33 +0200 |
| parents | cfb46ab478a0 |
| children | 86a44f2bc38f |
line wrap: on
line diff
--- a/src/modules/image/devil/ImageData.cpp Mon Jun 11 17:06:57 2012 +0200 +++ b/src/modules/image/devil/ImageData.cpp Thu Jun 28 23:52:33 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
