46 #define GetColourIndex(r, g, b, a) \ 47 OSD_FindNearestColourIndex((a << 24) | (r << 16) | (g << 8) | b ) 70 png_color_16p trans_values;
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);
96 buffer->offset += length;
105 static png_voidp PNG_AllocFunc(png_structp png_ptr, png_size_t size)
107 return OSD_MemAlloc(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,
136 FUNCTION_START(ReadGrayFunc);
138 for (i = 0; i < row_info->rowbytes; ++i)
140 data[i] = GetColourIndex(data[i], data[i], data[i], 0xff);
143 FUNCTION_FINISH(ReadGrayFunc);
153 static void ReadPaletteFunc(png_structp png_ptr, png_row_infop row_info,
156 S_INFO *
info = png_get_user_transform_ptr(png_ptr);
159 FUNCTION_START(ReadPaletteFunc);
165 for (i = 0; i < row_info->rowbytes; ++i)
168 col = &info->palette[idx];
169 if (idx >= info->num_trans)
171 data[i] = GetColourIndex(col->red, col->green, col->blue, 0xff);
175 data[i] = GetColourIndex(col->red, col->green, col->blue,
183 for (i = 0; i < row_info->rowbytes; ++i)
185 col = &info->palette[data[i]];
186 data[i] = GetColourIndex(col->red, col->green, col->blue, 0xff);
190 FUNCTION_FINISH(ReadPaletteFunc);
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)
243 data[i] = GetColourIndex(data[j], data[j], data[j], data[j + 1]);
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,
263 &info->palette, &info->num_palette) == PNG_INFO_PLTE)
265 info->has_palette = TRUE;
269 if (png_get_tRNS(png_ptr, info_ptr, &info->trans,
270 &info->num_trans, &info->trans_values) == PNG_INFO_tRNS)
272 info->has_trans = TRUE;
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 );
339 U16BIT row, pass, num;
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 363 if (!png_check_sig(data, MAX_HEADER > len ? len : MAX_HEADER))
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))
409 IF_COL_DEPTH( COLOUR_FORMAT_PALETTE )
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));
432 OSD_MemFree( p_bmp );
437 p_bmp->col_buff = row_ptr;
438 #ifdef PNG_VERSION_12 439 p_bmp->width = (U16BIT)info_ptr->width;
440 p_bmp->height = (U16BIT)info_ptr->height;
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);
445 p_bmp->pix_bytes = 1;
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))
452 p_bmp->opaque = HAS_TRANSPARENCY;
456 p_bmp->opaque = COMPLETELY_OPAQUE;
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;
469 row_ptr = p_bmp->col_buff;
473 row_pointers = OSD_MemAlloc(p_bmp->height *
sizeof(U8BIT *));
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);
483 OSD_MemFree(row_pointers);
485 USE_UNWANTED_PARAM(pass);
488 if (p_bmp->opaque == COMPLETELY_OPAQUE)
490 for (row = 0; (p_bmp->opaque == COMPLETELY_OPAQUE) && row != p_bmp->height; ++row)
492 for (num = 0; num != p_bmp->width; ++num)
494 if (!OSD_IsColourOpaque(*row_ptr))
496 p_bmp->opaque = HAS_TRANSPARENCY;
503 TRACE(TGRAPHICS, (
"w=%d h=%d", p_bmp->width, p_bmp->height))
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);
548 opaque = COMPLETELY_OPAQUE;
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);
556 opaque = HAS_TRANSPARENCY;
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 );
570 p_bmp->col_buff = row_ptr;
571 p_bmp->pix_bytes = (U8BIT)num;
572 p_bmp->opaque = opaque;
573 #ifdef PNG_VERSION_12 574 p_bmp->width = (U16BIT)info_ptr->width;
575 p_bmp->height = (U16BIT)info_ptr->height;
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);
580 p_bmp->y_resolution = (U16BIT)png_get_y_pixels_per_meter( 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);
594 row_ptr = p_bmp->col_buff;
598 row_pointers = OSD_MemAlloc(p_bmp->height *
sizeof(U8BIT *));
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);
610 OSD_MemFree(row_pointers);
612 USE_UNWANTED_PARAM(pass);
614 TRACE(TGRAPHICS, (
"w=%d h=%d", p_bmp->width, p_bmp->height))
619 OSD_MemFree( p_bmp );
627 png_read_end(png_ptr, end_info);
630 png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
639 OSD_MemFree(data->col_buff);
643 static void ErrorFunction(png_structp png_ptr,
644 png_const_charp error_msg)
646 DBG_PRINTF(
"PNG_ERR: %s\n", error_msg);
649 static void WarningFunction(png_structp png_ptr,
650 png_const_charp warning_msg)
652 DBG_PRINTF(
"PNG_WARN: %s\n", warning_msg);
S_IMAGE * DEC_DecodePng(U8BIT *data, U32BIT len)
Allocate memory for png and decode bitmap.
void DEC_FreePng(S_IMAGE *data)
Free memory allocated for PNG bitmap.
The functions in this file are OPTIONALLY provided by Receiver Platform *.