- if (!io->cols)
- io->cols = rd->cols;
- if (!io->rows)
- io->rows = rd->rows;
- if (!(io->flags & IMAGE_CHANNELS_FORMAT))
- switch (rd->color_type)
- {
- case PNG_COLOR_TYPE_GRAY:
- io->flags |= COLOR_SPACE_GRAYSCALE;
- break;
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- io->flags |= COLOR_SPACE_GRAYSCALE | IMAGE_ALPHA;
- break;
- case PNG_COLOR_TYPE_RGB:
- io->flags |= COLOR_SPACE_RGB;
- break;
- case PNG_COLOR_TYPE_RGB_ALPHA:
- case PNG_COLOR_TYPE_PALETTE:
- io->flags |= COLOR_SPACE_RGB | IMAGE_ALPHA;
- break;
- default:
- png_destroy_read_struct(&rd->png_ptr, &rd->info_ptr, &rd->end_ptr);
- image_thread_err(io->thread, IMAGE_ERR_READ_FAILED, "Unknown color type");
- break;
- }
+ io->cols = rd->cols;
+ io->rows = rd->rows;
+ switch (rd->color_type)
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ io->flags = COLOR_SPACE_GRAYSCALE;
+ io->number_of_colors = 1 << 8;
+ break;
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ io->flags = COLOR_SPACE_GRAYSCALE | IMAGE_ALPHA;
+ io->number_of_colors = 1 << 8;
+ break;
+ case PNG_COLOR_TYPE_RGB:
+ io->flags = COLOR_SPACE_RGB;
+ io->number_of_colors = 1 << 24;
+ break;
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ io->number_of_colors = 1 << 24;
+ io->flags = COLOR_SPACE_RGB | IMAGE_ALPHA;
+ break;
+ case PNG_COLOR_TYPE_PALETTE:
+ io->flags = COLOR_SPACE_RGB | IMAGE_ALPHA | IMAGE_IO_HAS_PALETTE;
+ int num_palette;
+ if (png_get_PLTE(rd->png_ptr, rd->info_ptr, NULL, &num_palette))
+ io->number_of_colors = num_palette;
+ else
+ io->number_of_colors = 1 << rd->bit_depth;
+ break;
+ default:
+ png_destroy_read_struct(&rd->png_ptr, &rd->info_ptr, &rd->end_ptr);
+ IMAGE_ERROR(io->context, IMAGE_ERROR_READ_FAILED, "Unknown color type");
+ break;
+ }