46 #define GetColourIndex(r, g, b, a) \ 47 OSD_FindNearestColourIndex((a << 24) | (r << 16) | (g << 8) | b ) 74 static void ErrorFunction(png_structp png_ptr,
75 png_const_charp error_msg);
76 static void WarningFunction(png_structp png_ptr,
77 png_const_charp warning_msg);
85 static void PNG_ReadDataFunc(png_structp png_ptr, png_bytep
data,
89 if (length > (png_size_t)(buffer->
len - buffer->
offset))
91 length = (png_size_t)(buffer->
len - buffer->
offset);
95 memcpy(data, (
char *)buffer->
data + buffer->
offset, length);
105 static png_voidp PNG_AllocFunc(png_structp png_ptr, png_size_t size)
118 static void PNG_FreeFunc(png_structp png_ptr, png_voidp ptr)
131 static void ReadGrayFunc(png_structp png_ptr, png_row_infop row_info,
138 for (i = 0; i < row_info->rowbytes; ++i)
153 static void ReadPaletteFunc(png_structp png_ptr, png_row_infop row_info,
156 S_INFO *
info = png_get_user_transform_ptr(png_ptr);
165 for (i = 0; i < row_info->rowbytes; ++i)
183 for (i = 0; i < row_info->rowbytes; ++i)
200 static void ReadRGBFunc(png_structp png_ptr, png_row_infop row_info,
205 for (i = 0, j = 0; j != row_info->rowbytes; j += 3, ++i)
207 data[i] =
GetColourIndex(data[j], data[j + 1], data[j + 2], 0xff);
218 static void ReadRGBAlphaFunc(png_structp png_ptr, png_row_infop row_info,
223 for (i = 0, j = 0; j < row_info->rowbytes; j += 4, ++i)
225 data[i] =
GetColourIndex(data[j], data[j + 1], data[j + 2], data[j + 3]);
236 static void ReadGrayAlphaFunc(png_structp png_ptr, png_row_infop row_info,
241 for (i = 0, j = 0; j < row_info->rowbytes; j += 2, ++i)
254 static void SetTransformations(png_structp png_ptr, png_infop info_ptr,
257 png_byte color_type = png_get_color_type(png_ptr, info_ptr);
258 png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr);
260 memset( info, 0,
sizeof(
S_INFO));
262 if (png_get_PLTE(png_ptr, info_ptr,
269 if (png_get_tRNS(png_ptr, info_ptr, &info->
trans,
275 png_set_strip_16(png_ptr);
278 case PNG_COLOR_TYPE_GRAY:
279 png_set_expand(png_ptr);
282 png_set_read_user_transform_fn(png_ptr, ReadGrayAlphaFunc);
286 png_set_read_user_transform_fn(png_ptr, ReadGrayFunc);
289 case PNG_COLOR_TYPE_PALETTE:
292 png_set_packing(png_ptr);
294 png_set_read_user_transform_fn(png_ptr, ReadPaletteFunc);
296 case PNG_COLOR_TYPE_RGB:
299 png_set_expand(png_ptr);
300 png_set_read_user_transform_fn(png_ptr, ReadRGBAlphaFunc);
304 png_set_read_user_transform_fn(png_ptr, ReadRGBFunc);
307 case PNG_COLOR_TYPE_RGB_ALPHA:
308 png_set_read_user_transform_fn(png_ptr, ReadRGBAlphaFunc);
310 case PNG_COLOR_TYPE_GRAY_ALPHA:
311 png_set_expand(png_ptr);
312 png_set_read_user_transform_fn(png_ptr, ReadGrayAlphaFunc);
315 png_set_user_transform_info( png_ptr, info, 8, 1 );
341 #ifndef PNG_VERSION_12 342 U8BIT **row_pointers;
347 #if defined(OSD_16_BIT) || defined(OSD_31_BIT) || defined(OSD_32_BIT) 351 TRACE(TGRAPHICS, (
"data=%p len=%d", data, len))
362 #ifdef PNG_VERSION_12 365 if (png_sig_cmp(data, 0, (MAX_HEADER > len ? len : MAX_HEADER)) != 0)
371 png_ptr = png_create_read_struct_2(PNG_LIBPNG_VER_STRING,
372 NULL, NULL, NULL, NULL,
373 PNG_AllocFunc, PNG_FreeFunc);
379 info_ptr = png_create_info_struct(png_ptr);
380 if (info_ptr == NULL)
382 png_destroy_read_struct(&png_ptr, (png_infopp)NULL,
387 end_info = png_create_info_struct(png_ptr);
388 if (end_info == NULL)
390 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
393 png_set_error_fn(png_ptr, NULL, ErrorFunction, WarningFunction);
394 if (setjmp(png_jmpbuf(png_ptr)))
396 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
400 png_set_read_fn(png_ptr, &buffer, PNG_ReadDataFunc);
403 png_read_info(png_ptr, info_ptr);
405 #ifdef PNG_VERSION_12 406 TRACE(TGRAPHICS, (
"col_typ=%d vld=%d", info_ptr->color_type, info_ptr->valid))
412 SetTransformations(png_ptr, info_ptr, &info);
413 pass = png_set_interlace_handling(png_ptr);
415 png_read_update_info(png_ptr, info_ptr);
420 #ifdef PNG_VERSION_12 421 assert((info_ptr->rowbytes % info_ptr->width) == 0 );
423 row_ptr =
OSD_MemAlloc( info_ptr->width * info_ptr->height );
425 assert((png_get_rowbytes(png_ptr, info_ptr) % png_get_image_width(png_ptr, info_ptr)) == 0 );
427 row_ptr =
OSD_MemAlloc(png_get_image_width(png_ptr, info_ptr) *
428 png_get_image_height(png_ptr, info_ptr));
438 #ifdef PNG_VERSION_12 442 p_bmp->
width = (
U16BIT)png_get_image_width(png_ptr, info_ptr);
443 p_bmp->
height = (
U16BIT)png_get_image_height(png_ptr, info_ptr);
446 #ifdef PNG_VERSION_12 447 if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) || (info.
has_trans))
449 if ((png_get_color_type(png_ptr, info_ptr) & PNG_COLOR_MASK_ALPHA) || (info.
has_trans))
460 #ifdef PNG_VERSION_12 461 png_ptr->num_rows = p_bmp->
height;
464 for (row = 0; row != p_bmp->
height; row++)
466 png_read_row(png_ptr, row_ptr, png_bytep_NULL);
467 row_ptr += p_bmp->
width;
474 if (row_pointers != NULL)
476 for (row = 0; row != p_bmp->
height; row++)
478 row_pointers[row] = row_ptr + (row * p_bmp->
width);
481 png_read_image(png_ptr, row_pointers);
492 for (num = 0; num != p_bmp->
width; ++num)
494 if (!OSD_IsColourOpaque(*row_ptr))
511 #if defined(OSD_16_BIT) || defined(OSD_31_BIT) || defined(OSD_32_BIT) 512 png_set_strip_16(png_ptr);
513 #ifdef PNG_VERSION_12 514 switch (info_ptr->color_type)
516 switch (png_get_color_type(png_ptr, info_ptr))
519 case PNG_COLOR_TYPE_GRAY_ALPHA:
520 case PNG_COLOR_TYPE_GRAY:
521 png_set_expand(png_ptr);
522 png_set_gray_to_rgb(png_ptr);
524 case PNG_COLOR_TYPE_PALETTE:
528 png_set_expand(png_ptr);
531 case PNG_COLOR_TYPE_RGB:
532 #ifdef PNG_VERSION_12 533 if (info_ptr->valid & PNG_INFO_tRNS)
535 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) != 0)
538 png_set_expand(png_ptr);
540 case PNG_COLOR_TYPE_RGB_ALPHA:
543 pass = png_set_interlace_handling(png_ptr);
545 png_read_update_info(png_ptr, info_ptr);
549 #ifdef PNG_VERSION_12 550 if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
552 if (png_get_color_type(png_ptr, info_ptr) & PNG_COLOR_MASK_ALPHA)
555 png_set_swap_alpha(png_ptr);
562 #ifdef PNG_VERSION_12 563 row_ptr =
OSD_MemAlloc((info_ptr->width * info_ptr->height * num));
565 row_ptr =
OSD_MemAlloc( png_get_image_width(png_ptr, info_ptr) *
566 png_get_image_height(png_ptr, info_ptr) * num );
573 #ifdef PNG_VERSION_12 577 p_bmp->
width = (
U16BIT)png_get_image_width(png_ptr, info_ptr);
578 p_bmp->
height = (
U16BIT)png_get_image_height(png_ptr, info_ptr);
583 #ifdef PNG_VERSION_12 586 png_ptr->num_rows = p_bmp->
height;
589 for (row = 0; row != p_bmp->
height; row++)
591 png_read_row(png_ptr, row_ptr, png_bytep_NULL);
599 if (row_pointers != NULL)
603 for (row = 0; row != p_bmp->
height; row++)
605 row_pointers[row] = row_ptr + (row * num);
608 png_read_image(png_ptr, row_pointers);
627 png_read_end(png_ptr, end_info);
630 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
643 static void ErrorFunction(png_structp png_ptr,
644 png_const_charp error_msg)
649 static void WarningFunction(png_structp png_ptr,
650 png_const_charp warning_msg)
#define FUNCTION_FINISH(name)
S_IMAGE * DEC_DecodePng(U8BIT *data, U32BIT len)
Allocate memory for png and decode bitmap.
png_color_16p trans_values
#define GetColourIndex(r, g, b, a)
void DEC_FreePng(S_IMAGE *data)
Free memory allocated for PNG bitmap.
The functions in this file are OPTIONALLY provided by Receiver Platform *.
#define COLOUR_FORMAT_PALETTE
#define USE_UNWANTED_PARAM(param)
#define FUNCTION_START(name)
#define COMPLETELY_OPAQUE