diff options
Diffstat (limited to 'DevIL/src-ILUT/src/ilut_allegro.cpp')
-rw-r--r-- | DevIL/src-ILUT/src/ilut_allegro.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/DevIL/src-ILUT/src/ilut_allegro.cpp b/DevIL/src-ILUT/src/ilut_allegro.cpp new file mode 100644 index 00000000..97e1dd1c --- /dev/null +++ b/DevIL/src-ILUT/src/ilut_allegro.cpp @@ -0,0 +1,127 @@ +//----------------------------------------------------------------------------- +// +// ImageLib Sources +// Copyright (C) 2000 by Denton Woods +// Last modified: 11/23/2000 <--Y2K Compliant! =] +// +// Filename: openilut/allegro.c +// +// Description: Allegro functions for images +// +//----------------------------------------------------------------------------- + +#ifdef ILUT_USE_ALLEGRO +#include "ilut_allegro.h" +#endif + +#include "ilut_internal.h" + +#ifdef ILUT_USE_ALLEGRO + +ILboolean ilConvertPal(ILenum DestFormat); + +// Does not account for converting luminance... +BITMAP* ILAPIENTRY ilutConvertToAlleg(PALETTE Pal) +{ + BITMAP *Bitmap; + ILimage *TempImage; + ILuint i = 0, j = 0; + + ilutCurImage = ilGetCurImage(); + + if (ilutCurImage == NULL) { + ilSetError(ILUT_ILLEGAL_OPERATION); + return NULL; + } + + // Should be IL_BGR(A), but Djgpp screws up somewhere along the line. + if (ilutCurImage->Format == IL_RGB || ilutCurImage->Format == IL_RGBA) { + iluSwapColours(); + } + + if (ilutCurImage->Origin == IL_ORIGIN_LOWER_LEFT) + iluFlipImage(); + if (ilutCurImage->Type > IL_UNSIGNED_BYTE) {} // Can't do anything about this right now... + if (ilutCurImage->Type == IL_BYTE) {} // Can't do anything about this right now... + + Bitmap = create_bitmap_ex(ilutCurImage->Bpp * 8, ilutCurImage->Width, ilutCurImage->Height); + if (Bitmap == NULL) { + return IL_FALSE; + } + memcpy(Bitmap->dat, ilutCurImage->Data, ilutCurImage->SizeOfData); + + // Should we make this toggleable? + if (ilutCurImage->Bpp == 8 && ilutCurImage->Pal.PalType != IL_PAL_NONE) { + // Use the image's palette if there is one + + // ilConvertPal is destructive to the original image + // @TODO: Use new ilCopyPal!!! + TempImage = ilNewImage(ilutCurImage->Width, ilutCurImage->Height, ilutCurImage->Depth, ilutCurImage->Bpp, 1); + ilCopyImageAttr(TempImage, ilutCurImage); + ilSetCurImage(TempImage); + + if (!ilConvertPal(IL_PAL_RGB24)) { + destroy_bitmap(Bitmap); + ilSetError(ILUT_ILLEGAL_OPERATION); + return NULL; + } + + for (; i < ilutCurImage->Pal.PalSize && i < 768; i += 3, j++) { + Pal[j].r = TempImage->Pal.Palette[i+0]; + Pal[j].g = TempImage->Pal.Palette[i+1]; + Pal[j].b = TempImage->Pal.Palette[i+2]; + Pal[j].filler = 255; + } + + ilCloseImage(TempImage); + ilSetCurImage(ilutCurImage); + } + + return Bitmap; +} + + +#ifndef _WIN32_WCE +BITMAP* ILAPIENTRY ilutAllegLoadImage(ILstring FileName) +{ + ILuint ImgId; + PALETTE Pal; + + ilGenImages(1, &ImgId); + ilBindImage(ImgId); + if (!ilLoadImage(FileName)) { + ilDeleteImages(1, &ImgId); + return 0; + } + + ilDeleteImages(1, &ImgId); + + return ilutConvertToAlleg(Pal); +} +#endif//_WIN32_WCE + + +// Unfinished +ILboolean ILAPIENTRY ilutAllegFromBitmap(BITMAP *Bitmap) +{ + ilutCurImage = ilGetCurImage(); + if (ilutCurImage == NULL) { + ilSetError(ILUT_ILLEGAL_OPERATION); + return IL_FALSE; + } + + if (Bitmap == NULL || Bitmap->w == 0 || Bitmap->h == 0) { + ilSetError(ILUT_INVALID_PARAM); + return IL_FALSE; + } + + if (!ilTexImage(Bitmap->w, Bitmap->h, 1, 3, IL_RGB, IL_UNSIGNED_BYTE, NULL)) + return IL_FALSE; + + ilutCurImage->Origin = IL_ORIGIN_LOWER_LEFT; // I have no idea. + + return IL_TRUE; +} + +#endif//ILUT_USE_ALLEGRO + |