@@ -32,24 +32,6 @@ THE SOFTWARE.
32
32
using namespace std ;
33
33
namespace cocos2d {
34
34
35
- #ifdef _TRANZDA_VM_
36
- #define CCX_RGB (vr,vg,vb ) \
37
- (ColorRefType)(((UInt32 )(UInt8 )(vb) << 16 ) | ((UInt32 )(UInt8 )(vg) << 8 ) | (UInt32 )(UInt8 )(vr) | ((UInt32 )0xffL << 24 ))
38
-
39
- #define CCX_RGB_APLHA (vr, vg, vb, va ) \
40
- (ColorRefType)(((UInt32 )((UInt8 )(vr) * ((UInt8 )(va) + 1 )) >> 8 ) | \
41
- ((UInt32 )((UInt8 )(vg) * ((UInt8 )(va) + 1 ) >> 8 ) << 8 ) | \
42
- ((UInt32 )((UInt8 )(vb) * ((UInt8 )(va) + 1 ) >> 8 ) << 16 ) | \
43
- ((UInt32 )(UInt8 )(va) << 24 ))
44
-
45
- #define CCX_RGBA (vr,vg,vb,va ) \
46
- (((va) == 0xff )?CCX_RGB((vr), (vg), (vb)):CCX_RGB_APLHA((vr), (vg), (vb), (va)))
47
-
48
- #else
49
- #define CCX_RGB RGB
50
- #define CCX_RGBA RGBA
51
- #endif // _TRANZDA_VM_
52
-
53
35
typedef struct
54
36
{
55
37
unsigned char * data;
@@ -74,43 +56,6 @@ static void pngReadCallback(png_structp png_ptr, png_bytep data, png_size_t leng
74
56
}
75
57
}
76
58
77
- static void copyImageData (tImageInfo &imageInfo, png_bytep* rowPointers)
78
- {
79
- // allocate memory
80
- imageInfo.data = new unsigned char [imageInfo.height * imageInfo.width * 4 ];
81
- if (! imageInfo.data )
82
- {
83
- return ;
84
- }
85
-
86
- // copy data
87
- if (imageInfo.hasAlpha ) {
88
- unsigned int bytesPerRow = imageInfo.width * 4 ;
89
- unsigned int *tmp = (unsigned int *)imageInfo.data ;
90
- for (unsigned int i = 0 ; i < imageInfo.height ; i++)
91
- {
92
- for (unsigned int j = 0 ; j < bytesPerRow; j += 4 )
93
- {
94
- *tmp++ = CCX_RGBA ( rowPointers[i][j], rowPointers[i][j + 1 ],
95
- rowPointers[i][j + 2 ], rowPointers[i][j + 3 ] );
96
- }
97
- }
98
- }
99
- else
100
- {
101
- unsigned int bytesPerRow = imageInfo.width * 3 ;
102
- unsigned int *tmp = (unsigned int *)imageInfo.data ;
103
- for (unsigned int i = 0 ; i < imageInfo.height ; i++)
104
- {
105
- for (unsigned int j = 0 ; j < bytesPerRow; j += 3 )
106
- {
107
- *tmp++ = CCX_RGB ( rowPointers[i][j], rowPointers[i][j + 1 ],
108
- rowPointers[i][j + 2 ] );
109
- }
110
- }
111
- }
112
- }
113
-
114
59
UIImage::UIImage (void )
115
60
{
116
61
m_pBitmap = NULL ;
@@ -267,12 +212,8 @@ bool UIImage::loadPngFromStream(unsigned char *data, int nLength)
267
212
png_structp png_ptr;
268
213
png_infop info_ptr;
269
214
Int32 pos;
270
- Int32 bitDepth;
271
- png_uint_32 width;
272
- png_uint_32 height;
273
215
Int32 interlaceType;
274
216
png_bytep * rowPointers;
275
- Int32 colorType;
276
217
tImageSource imageSource;
277
218
278
219
pos = 0 ;
@@ -316,35 +257,67 @@ bool UIImage::loadPngFromStream(unsigned char *data, int nLength)
316
257
imageSource.offset = 0 ;
317
258
png_set_read_fn (png_ptr, &imageSource, pngReadCallback);
318
259
319
-
320
- // read the data of the file
321
- png_read_png (png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB, 0 );
322
-
323
- png_get_IHDR (png_ptr, info_ptr, &width, &height, &bitDepth, &colorType,
324
- &interlaceType, NULL , NULL );
325
-
326
- if (setjmp (png_jmpbuf (png_ptr)))
327
- {
328
- png_destroy_read_struct (&png_ptr, NULL , NULL );
329
- png_destroy_info_struct (png_ptr, &info_ptr);
330
- return false ;
331
- }
332
-
333
- // get the image file data
334
- rowPointers = png_get_rows (png_ptr, info_ptr);
260
+ // read png info
261
+ png_read_info (png_ptr, info_ptr);
335
262
336
263
// init image info
337
- m_imageInfo.height = height;
338
- m_imageInfo.width = width;
339
- m_imageInfo.hasAlpha = info_ptr->color_type & PNG_COLOR_MASK_ALPHA;
264
+ m_imageInfo.height = info_ptr->height ;
265
+ m_imageInfo.width = info_ptr->width ;
340
266
m_imageInfo.isPremultipliedAlpha = false ;
341
- copyImageData (m_imageInfo, rowPointers);
342
267
// we use CCX_RGA or CCX_RGB to save data
343
268
// so the bitsPerComponet is 32, and it also
344
269
// has the alpha data
345
270
m_imageInfo.bitsPerComponent = 32 ;
346
271
m_imageInfo.hasAlpha = true ;
347
272
273
+ // convert to appropriate format, we now only support RGBA8888
274
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
275
+ {
276
+ png_set_packing (png_ptr);
277
+ png_set_palette_to_rgb (png_ptr);
278
+ }
279
+ if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY && info_ptr->bit_depth < 8 )
280
+ {
281
+ png_set_expand_gray_1_2_4_to_8 (png_ptr);
282
+ }
283
+ if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
284
+ {
285
+ png_set_gray_to_rgb (png_ptr);
286
+ }
287
+ if (info_ptr->bit_depth == 16 )
288
+ {
289
+ png_set_strip_16 (png_ptr);
290
+ }
291
+
292
+ // expand paletted or RGB images with transparency to full alpha channels so the data will be
293
+ // available as RGBA quatets
294
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
295
+ {
296
+ png_set_tRNS_to_alpha (png_ptr);
297
+ }
298
+
299
+ // add the alpha channel if it has not
300
+ if (info_ptr->color_type == PNG_COLOR_TYPE_RGB || info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
301
+ {
302
+ png_set_add_alpha (png_ptr, 255 , PNG_FILLER_AFTER);
303
+ }
304
+
305
+ // allocate memory and read data
306
+ m_imageInfo.data = new unsigned char [m_imageInfo.height * m_imageInfo.width * 4 ];
307
+ rowPointers = (png_bytep*)png_mem_alloc (sizeof (png_bytep) * m_imageInfo.height );
308
+ for (int i = 0 ; i < m_imageInfo.height ; ++i)
309
+ {
310
+ rowPointers[i] = (png_bytep)png_mem_alloc (m_imageInfo.width * 4 );
311
+ }
312
+ png_read_image (png_ptr, rowPointers);
313
+
314
+ // copy data to image info
315
+ int bytesPerRow = m_imageInfo.width * 4 ;
316
+ for (int j = 0 ; j < m_imageInfo.height ; ++j)
317
+ {
318
+ memcpy (m_imageInfo.data + j * bytesPerRow, rowPointers[j], bytesPerRow);
319
+ }
320
+
348
321
// release
349
322
png_destroy_read_struct (&png_ptr, NULL , NULL );
350
323
png_destroy_info_struct (png_ptr, &info_ptr);
0 commit comments