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