34
34
35
35
#ifdef LOAD_BMP
36
36
37
+ #define ICON_TYPE_ICO 1
38
+ #define ICON_TYPE_CUR 2
39
+
37
40
/* See if an image is contained in a data source */
38
41
bool IMG_isBMP (SDL_IOStream * src )
39
42
{
@@ -85,12 +88,12 @@ static bool IMG_isICOCUR(SDL_IOStream *src, int type)
85
88
86
89
bool IMG_isICO (SDL_IOStream * src )
87
90
{
88
- return IMG_isICOCUR (src , 1 );
91
+ return IMG_isICOCUR (src , ICON_TYPE_ICO );
89
92
}
90
93
91
94
bool IMG_isCUR (SDL_IOStream * src )
92
95
{
93
- return IMG_isICOCUR (src , 2 );
96
+ return IMG_isICOCUR (src , ICON_TYPE_CUR );
94
97
}
95
98
96
99
#include <SDL3/SDL_error.h>
@@ -105,13 +108,12 @@ bool IMG_isCUR(SDL_IOStream *src)
105
108
#define BI_BITFIELDS 3
106
109
#endif
107
110
108
- static SDL_Surface * LoadBMP_IO (SDL_IOStream * src , bool closeio )
111
+ static SDL_Surface * LoadBMP_IO (SDL_IOStream * src , bool closeio )
109
112
{
110
113
return SDL_LoadBMP_IO (src , closeio );
111
114
}
112
115
113
- static SDL_Surface *
114
- LoadICOCUR_IO (SDL_IOStream * src , int type , bool closeio )
116
+ static SDL_Surface * LoadICOCUR_IO (SDL_IOStream * src , int type , bool closeio )
115
117
{
116
118
bool was_error = true;
117
119
Sint64 fp_offset = 0 ;
@@ -127,6 +129,8 @@ LoadICOCUR_IO(SDL_IOStream * src, int type, bool closeio)
127
129
int ExpandBMP ;
128
130
Uint8 maxCol = 0 ;
129
131
Uint32 icoOfs = 0 ;
132
+ int nHotX = 0 ;
133
+ int nHotY = 0 ;
130
134
Uint32 palette [256 ];
131
135
132
136
/* The Win32 ICO file header (14 bytes) */
@@ -171,22 +175,20 @@ LoadICOCUR_IO(SDL_IOStream * src, int type, bool closeio)
171
175
Uint8 bWidth ; /* Uint8, but 0 = 256 ! */
172
176
Uint8 bHeight ; /* Uint8, but 0 = 256 ! */
173
177
Uint8 bColorCount ; /* Uint8, but 0 = 256 ! */
174
- /*
175
178
Uint8 bReserved ;
176
179
Uint16 wPlanes ;
177
180
Uint16 wBitCount ;
178
181
Uint32 dwBytesInRes ;
179
- */
180
182
Uint32 dwImageOffset ;
181
183
int nWidth , nHeight , nColorCount ;
182
184
183
185
if (!SDL_ReadU8 (src , & bWidth ) ||
184
186
!SDL_ReadU8 (src , & bHeight ) ||
185
187
!SDL_ReadU8 (src , & bColorCount ) ||
186
- !SDL_ReadU8 (src , NULL /* bReserved */ ) ||
187
- !SDL_ReadU16LE (src , NULL /* wPlanes */ ) ||
188
- !SDL_ReadU16LE (src , NULL /* wBitCount */ ) ||
189
- !SDL_ReadU32LE (src , NULL /* dwBytesInRes */ ) ||
188
+ !SDL_ReadU8 (src , & bReserved ) ||
189
+ !SDL_ReadU16LE (src , & wPlanes ) ||
190
+ !SDL_ReadU16LE (src , & wBitCount ) ||
191
+ !SDL_ReadU32LE (src , & dwBytesInRes ) ||
190
192
!SDL_ReadU32LE (src , & dwImageOffset )) {
191
193
goto done ;
192
194
}
@@ -207,6 +209,11 @@ LoadICOCUR_IO(SDL_IOStream * src, int type, bool closeio)
207
209
nColorCount = 256 ;
208
210
}
209
211
212
+ if (type == ICON_TYPE_CUR ) {
213
+ nHotX = wPlanes ;
214
+ nHotY = wBitCount ;
215
+ }
216
+
210
217
//SDL_Log("%dx%d@%d - %08x\n", nWidth, nHeight, nColorCount, dwImageOffset);
211
218
(void )nWidth ;
212
219
(void )nHeight ;
@@ -417,6 +424,12 @@ LoadICOCUR_IO(SDL_IOStream * src, int type, bool closeio)
417
424
}
418
425
}
419
426
427
+ if (type == ICON_TYPE_CUR ) {
428
+ SDL_PropertiesID props = SDL_GetSurfaceProperties (surface );
429
+ SDL_SetNumberProperty (props , SDL_PROP_SURFACE_HOTSPOT_X_NUMBER , nHotX );
430
+ SDL_SetNumberProperty (props , SDL_PROP_SURFACE_HOTSPOT_Y_NUMBER , nHotY );
431
+ }
432
+
420
433
was_error = false;
421
434
422
435
done :
@@ -444,13 +457,13 @@ SDL_Surface *IMG_LoadBMP_IO(SDL_IOStream *src)
444
457
/* Load a ICO type image from an SDL datasource */
445
458
SDL_Surface * IMG_LoadICO_IO (SDL_IOStream * src )
446
459
{
447
- return LoadICOCUR_IO (src , 1 , false);
460
+ return LoadICOCUR_IO (src , ICON_TYPE_ICO , false);
448
461
}
449
462
450
463
/* Load a CUR type image from an SDL datasource */
451
464
SDL_Surface * IMG_LoadCUR_IO (SDL_IOStream * src )
452
465
{
453
- return LoadICOCUR_IO (src , 2 , false);
466
+ return LoadICOCUR_IO (src , ICON_TYPE_CUR , false);
454
467
}
455
468
456
469
#else
0 commit comments