Mercurial > hg > dmlib
annotate dmimage.c @ 757:dd59a650a318
Fix 24-bit surface conversions in image loader.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 08 May 2013 02:02:01 +0300 |
parents | 32250b436bca |
children |
rev | line source |
---|---|
0 | 1 /* |
2 * DMLib | |
3 * -- Bitmap image conversion and loading | |
4 * Programmed and designed by Matti 'ccr' Hamalainen | |
5 * (C) Copyright 2012 Tecnic Software productions (TNSP) | |
6 */ | |
7 #include "dmimage.h" | |
8 | |
9 | |
10 #define STBI_FAILURE_USERMSG 1 | |
11 #define STBI_NO_STDIO 1 | |
12 #define STBI_NO_HDR 1 | |
13 #include "stb_image.c" | |
14 | |
15 | |
16 SDL_Surface *dmCreateRGBSurfaceFrom(void *data, const int width, const int height, const int depth, const int pitch, const int rmask, const int gmask, const int bmask, const int amask) | |
17 { | |
757
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
18 // Create source surface from given data |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
19 SDL_Surface *tmp = SDL_CreateRGBSurfaceFrom(data, width, height, depth, pitch, bmask, gmask, rmask, amask); |
0 | 20 |
757
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
21 // Result surface component orders as masks |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
22 #if SDL_BYTEORDER == SDL_BIG_ENDIAN |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
23 Uint32 |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
24 Xrmask = 0xff000000, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
25 Xgmask = 0x00ff0000, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
26 Xbmask = 0x0000ff00, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
27 Xamask = 0x000000ff; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
28 #else |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
29 Uint32 |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
30 Xrmask = 0x000000ff, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
31 Xgmask = 0x0000ff00, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
32 Xbmask = 0x00ff0000, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
33 Xamask = 0xff000000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
34 #endif |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
35 |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
36 // Create result conversion surface |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
37 SDL_Surface |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
38 *result = NULL, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
39 *pixtmp = SDL_CreateRGBSurface( |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
40 SDL_SWSURFACE | SDL_SRCALPHA, 16, 16, 32, Xrmask, Xgmask, Xbmask, Xamask); |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
41 |
0 | 42 if (tmp != NULL && pixtmp != NULL) |
43 { | |
757
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
44 // Convert surface |
0 | 45 result = SDL_ConvertSurface(tmp, pixtmp->format, SDL_SWSURFACE | SDL_SRCALPHA); |
46 SDL_FreeSurface(tmp); | |
47 } | |
48 if (pixtmp != NULL) | |
49 SDL_FreeSurface(pixtmp); | |
50 | |
51 return result; | |
52 } | |
53 | |
54 | |
55 SDL_Surface *dmCreatePaletteSurfaceFrom(void *data, const int width, const int height, const int pitch) | |
56 { | |
57 int yc; | |
58 Uint8 *dst, *src; | |
59 SDL_Surface *result; | |
60 result = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8, 0,0,0,0); | |
61 if (result == NULL) | |
62 return NULL; | |
63 | |
64 dst = result->pixels; | |
65 src = data; | |
66 for (yc = 0; yc < height; yc++) | |
67 { | |
68 memcpy(dst, src, width * sizeof(Uint8)); | |
69 dst += result->pitch; | |
70 src += pitch; | |
71 } | |
72 | |
73 return result; | |
74 } | |
75 | |
76 | |
77 | |
78 static int dmSTBIread(void *user, char *data, int size) | |
79 { | |
80 return dmfread(data, 1, size, (DMResource *) user); | |
81 } | |
82 | |
83 | |
84 static void dmSTBIskip(void *user, unsigned int n) | |
85 { | |
86 dmfseek((DMResource *) user, n, SEEK_CUR); | |
87 } | |
88 | |
89 | |
90 static int dmSTBIeof(void *user) | |
91 { | |
92 return dmfeof((DMResource *) user); | |
93 } | |
94 | |
95 | |
96 static const stbi_io_callbacks dmSTBICallbacks = | |
97 { | |
98 dmSTBIread, | |
99 dmSTBIskip, | |
100 dmSTBIeof, | |
101 }; | |
102 | |
103 | |
104 SDL_Surface *dmLoadImage(DMResource *file) | |
105 { | |
106 Uint32 rmask, gmask, bmask, amask; | |
107 SDL_Surface *result = NULL; | |
108 int width, height, comp; | |
109 Uint8 *data; | |
110 | |
111 data = stbi_load_from_callbacks(&dmSTBICallbacks, file, &width, &height, &comp, 0); | |
112 | |
113 if (data == NULL) | |
114 { | |
115 dmError("Error decoding image resource %p '%s' [%d, %d, %d]: %s\n", | |
116 file, file->filename, width, height, comp, stbi_failure_reason()); | |
117 return NULL; | |
118 } | |
119 | |
120 | |
121 switch (comp) | |
122 { | |
123 case 4: | |
757
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
124 #if SDL_BYTEORDER == SDL_BIG_ENDIAN |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
125 rmask = 0xff000000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
126 gmask = 0x00ff0000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
127 bmask = 0x0000ff00; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
128 amask = 0x000000ff; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
129 #else |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
130 rmask = 0x000000ff; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
131 gmask = 0x0000ff00; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
132 bmask = 0x00ff0000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
133 amask = 0xff000000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
134 #endif |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
135 result = dmCreateRGBSurfaceFrom(data, width, height, comp * 8, |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
136 width * comp, rmask, gmask, bmask, amask); |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
137 break; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
138 |
0 | 139 case 3: |
757
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
140 #if SDL_BYTEORDER == SDL_BIG_ENDIAN |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
141 rmask = 0x00ff0000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
142 gmask = 0x0000ff00; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
143 bmask = 0x000000ff; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
144 amask = 0x00000000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
145 #else |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
146 rmask = 0x000000ff; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
147 gmask = 0x0000ff00; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
148 bmask = 0x00ff0000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
149 amask = 0x00000000; |
dd59a650a318
Fix 24-bit surface conversions in image loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
150 #endif |
0 | 151 result = dmCreateRGBSurfaceFrom(data, width, height, comp * 8, |
152 width * comp, rmask, gmask, bmask, amask); | |
153 break; | |
154 | |
155 case 1: | |
156 result = dmCreatePaletteSurfaceFrom(data, width, height, width * comp); | |
157 break; | |
158 } | |
159 | |
160 stbi_image_free(data); | |
161 | |
162 if (result == NULL) | |
163 { | |
164 dmError("Format conversion failed for image resource %p '%s' [%d, %d, %d].\n", | |
165 file, file->filename, width, height, comp); | |
166 } | |
167 | |
168 return result; | |
169 } |