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