1 //-----------------------------------------------------------------------------
2 //
3 // ImageLib Sources
4 // Copyright (C) 2000 by Denton Woods
5 // Last modified: 11/23/2000 <--Y2K Compliant! =]
6 //
7 // Filename: openilut/allegro.c
8 //
9 // Description: Allegro functions for images
10 //
11 //-----------------------------------------------------------------------------
12
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #endif //HAVE_CONFIG_H
16
17 #ifdef ILUT_USE_ALLEGRO
18 #include "ilut_allegro.h"
19 #endif
20
21 #include "ilut_internal.h"
22
23 #ifdef ILUT_USE_ALLEGRO
24
25 ILboolean ilConvertPal(ILenum DestFormat);
26
27 // Does not account for converting luminance...
ilutConvertToAlleg(PALETTE Pal)28 BITMAP* ILAPIENTRY ilutConvertToAlleg(PALETTE Pal)
29 {
30 BITMAP *Bitmap;
31 ILimage *TempImage;
32 ILuint i = 0, j = 0;
33
34 ilutCurImage = ilGetCurImage();
35
36 if (ilutCurImage == NULL) {
37 ilSetError(ILUT_ILLEGAL_OPERATION);
38 return NULL;
39 }
40
41 // Should be IL_BGR(A), but Djgpp screws up somewhere along the line.
42 if (ilutCurImage->Format == IL_RGB || ilutCurImage->Format == IL_RGBA) {
43 iluSwapColours();
44 }
45
46 if (ilutCurImage->Origin == IL_ORIGIN_LOWER_LEFT)
47 iluFlipImage();
48 if (ilutCurImage->Type > IL_UNSIGNED_BYTE) {} // Can't do anything about this right now...
49 if (ilutCurImage->Type == IL_BYTE) {} // Can't do anything about this right now...
50
51 Bitmap = create_bitmap_ex(ilutCurImage->Bpp * 8, ilutCurImage->Width, ilutCurImage->Height);
52 if (Bitmap == NULL) {
53 return IL_FALSE;
54 }
55 memcpy(Bitmap->dat, ilutCurImage->Data, ilutCurImage->SizeOfData);
56
57 // Should we make this toggleable?
58 if (ilutCurImage->Bpp == 8 && ilutCurImage->Pal.PalType != IL_PAL_NONE) {
59 // Use the image's palette if there is one
60
61 // ilConvertPal is destructive to the original image
62 // @TODO: Use new ilCopyPal!!!
63 TempImage = ilNewImage(ilutCurImage->Width, ilutCurImage->Height, ilutCurImage->Depth, ilutCurImage->Bpp, 1);
64 ilCopyImageAttr(TempImage, ilutCurImage);
65 ilSetCurImage(TempImage);
66
67 if (!ilConvertPal(IL_PAL_RGB24)) {
68 destroy_bitmap(Bitmap);
69 ilSetError(ILUT_ILLEGAL_OPERATION);
70 return NULL;
71 }
72
73 for (; i < ilutCurImage->Pal.PalSize && i < 768; i += 3, j++) {
74 Pal[j].r = TempImage->Pal.Palette[i+0];
75 Pal[j].g = TempImage->Pal.Palette[i+1];
76 Pal[j].b = TempImage->Pal.Palette[i+2];
77 Pal[j].filler = 255;
78 }
79
80 ilCloseImage(TempImage);
81 ilSetCurImage(ilutCurImage);
82 }
83
84 return Bitmap;
85 }
86
87
88 #ifndef _WIN32_WCE
ilutAllegLoadImage(ILstring FileName)89 BITMAP* ILAPIENTRY ilutAllegLoadImage(ILstring FileName)
90 {
91 ILuint ImgId;
92 PALETTE Pal;
93
94 ilGenImages(1, &ImgId);
95 ilBindImage(ImgId);
96 if (!ilLoadImage(FileName)) {
97 ilDeleteImages(1, &ImgId);
98 return 0;
99 }
100
101 ilDeleteImages(1, &ImgId);
102
103 return ilutConvertToAlleg(Pal);
104 }
105 #endif//_WIN32_WCE
106
107
108 // Unfinished
ilutAllegFromBitmap(BITMAP * Bitmap)109 ILboolean ILAPIENTRY ilutAllegFromBitmap(BITMAP *Bitmap)
110 {
111 ilutCurImage = ilGetCurImage();
112 if (ilutCurImage == NULL) {
113 ilSetError(ILUT_ILLEGAL_OPERATION);
114 return IL_FALSE;
115 }
116
117 if (Bitmap == NULL || Bitmap->w == 0 || Bitmap->h == 0) {
118 ilSetError(ILUT_INVALID_PARAM);
119 return IL_FALSE;
120 }
121
122 if (!ilTexImage(Bitmap->w, Bitmap->h, 1, 3, IL_RGB, IL_UNSIGNED_BYTE, NULL))
123 return IL_FALSE;
124
125 ilutCurImage->Origin = IL_ORIGIN_LOWER_LEFT; // I have no idea.
126
127 return IL_TRUE;
128 }
129
130 #endif//ILUT_USE_ALLEGRO
131
132