@@ -15,19 +15,24 @@ ALLEGRO_DEBUG_CHANNEL("image")
15
15
16
16
static bool freeimage_initialized = false;
17
17
18
+ static void _fiio_al_error_handler (FREE_IMAGE_FORMAT fif , void * message ) {
19
+ ALLEGRO_ERROR ("FreeImage %s : %s\n" , (fif == FIF_UNKNOWN )? "UNKNOWN" : FreeImage_GetFormatFromFIF (fif ), message );
20
+ }
21
+
18
22
bool _al_init_fi (void )
19
23
{
20
- if (freeimage_initialized )
21
- return true;
24
+ if (freeimage_initialized )
25
+ return true;
22
26
FreeImage_Initialise (FALSE);
23
27
_al_add_exit_func (_al_shutdown_fi , "_al_shutdown_fi" );
28
+ FreeImage_SetOutputMessage (_fiio_al_error_handler );
24
29
return true;
25
30
}
26
31
27
32
void _al_shutdown_fi (void )
28
33
{
29
- if (!freeimage_initialized )
30
- return ;
34
+ if (!freeimage_initialized )
35
+ return ;
31
36
FreeImage_DeInitialise ();
32
37
freeimage_initialized = false;
33
38
}
@@ -38,16 +43,16 @@ static ALLEGRO_BITMAP *_al_fi_to_al_bitmap(FIBITMAP *fib) {
38
43
width = FreeImage_GetWidth (fib );
39
44
height = FreeImage_GetHeight (fib );
40
45
bitmap = al_create_bitmap (width , height );
41
- if (bitmap ) {
46
+ if (bitmap ) {
42
47
ALLEGRO_LOCKED_REGION * a_lock = al_lock_bitmap (bitmap ,
43
48
ALLEGRO_PIXEL_FORMAT_ARGB_8888 , ALLEGRO_LOCK_WRITEONLY );
44
49
if (a_lock ) {
45
50
unsigned char * out = (unsigned char * )a_lock -> data ;
46
51
int out_inc = a_lock -> pitch - (width * 4 );
47
- for (int j = height - 1 ; j > -1 ; -- j ) {
48
- for (int i = 0 ; i < width ; ++ i ) {
49
- RGBQUAD color ;
50
- if (FreeImage_GetPixelColor (fib , i , j , & color ) == FALSE) {
52
+ for (int j = height - 1 ; j > -1 ; -- j ) {
53
+ for (int i = 0 ; i < width ; ++ i ) {
54
+ RGBQUAD color = { 0.0 , 0.0 , 0.0 , 0.0 } ;
55
+ if (FreeImage_GetPixelColor (fib , i , j , & color ) == FALSE) {
51
56
ALLEGRO_ERROR ("Unable to get pixel data at %d,%d\n" , i , j );
52
57
}
53
58
* out ++ = (unsigned char ) color .rgbBlue ;
@@ -73,19 +78,21 @@ ALLEGRO_BITMAP *_al_load_fi_bitmap(const char *filename, int flags)
73
78
ASSERT (freeimage_initialized == true);
74
79
75
80
fif = FreeImage_GetFIFFromFilename (filename );
76
- if (fif == FIF_UNKNOWN )
81
+ if (fif == FIF_UNKNOWN )
77
82
fif = FreeImage_GetFileType (filename , 0 );
78
- if (fif == FIF_UNKNOWN )
79
- return bitmap ;
83
+ if (fif == FIF_UNKNOWN ) {
84
+ ALLEGRO_WARN ("Could not determine the file type for '%s'" , filename );
85
+ return NULL ;
86
+ }
80
87
81
88
{
82
89
FIBITMAP * fibRaw = FreeImage_Load (fif , filename , flags );
83
- if (!fibRaw )
84
- return bitmap ;
90
+ if (!fibRaw )
91
+ return NULL ;
85
92
fib = FreeImage_ConvertTo32Bits (fibRaw );
86
93
FreeImage_Unload (fibRaw );
87
- if (!fib )
88
- return bitmap ;
94
+ if (!fib )
95
+ return NULL ;
89
96
}
90
97
91
98
bitmap = _al_fi_to_al_bitmap (fib );
@@ -125,17 +132,19 @@ ALLEGRO_BITMAP *_al_load_fi_bitmap_f(ALLEGRO_FILE *f, int flags)
125
132
fio .tell_proc = _fiio_al_ftell ;
126
133
127
134
fif = FreeImage_GetFileTypeFromHandle (& fio , (fi_handle )f , 0 );
128
- if (fif == FIF_UNKNOWN )
129
- return bitmap ;
135
+ if (fif == FIF_UNKNOWN ) {
136
+ ALLEGRO_WARN ("Could not determine the file type for Allegro file." );
137
+ return NULL ;
138
+ }
130
139
131
140
{
132
141
FIBITMAP * fibRaw = FreeImage_LoadFromHandle (fif , & fio , (fi_handle )f , 0 );
133
- if (!fibRaw )
134
- return bitmap ;
142
+ if (!fibRaw )
143
+ return NULL ;
135
144
fib = FreeImage_ConvertTo32Bits (fibRaw );
136
145
FreeImage_Unload (fibRaw );
137
- if (!fib )
138
- return bitmap ;
146
+ if (!fib )
147
+ return NULL ;
139
148
}
140
149
141
150
bitmap = _al_fi_to_al_bitmap (fib );
@@ -158,8 +167,10 @@ bool _al_identify_fi(ALLEGRO_FILE *f)
158
167
fio .tell_proc = _fiio_al_ftell ;
159
168
160
169
fif = FreeImage_GetFileTypeFromHandle (& fio , (fi_handle )f , 0 );
161
- if (fif == FIF_UNKNOWN )
170
+ if (fif == FIF_UNKNOWN ) {
171
+ ALLEGRO_WARN ("Could not determine the file type for Allegro file." );
162
172
return false;
173
+ }
163
174
164
175
return true;
165
176
}
0 commit comments