24#define WIN32_NO_STATUS
61 png_error(
png_ptr,
"failed reading data");
71 int color_type, bit_depth;
108 png_set_chunk_malloc_max(
png_ptr, 0);
132 transparency = png_get_tRNS(
png_ptr,
info_ptr, &trans, &num_trans, &trans_values);
142 png_set_tRNS_to_alpha(
png_ptr);
153 This->decoder_frame.bpp = bit_depth * 4;
158 This->decoder_frame.pixel_format = GUID_WICPixelFormat32bppBGRA;
160 case 16:
This->decoder_frame.pixel_format = GUID_WICPixelFormat64bppRGBA;
break;
162 ERR(
"invalid RGBA bit depth: %i\n", bit_depth);
168 This->decoder_frame.bpp = bit_depth;
173 case 1:
This->decoder_frame.pixel_format = GUID_WICPixelFormatBlackWhite;
break;
174 case 2:
This->decoder_frame.pixel_format = GUID_WICPixelFormat2bppGray;
break;
175 case 4:
This->decoder_frame.pixel_format = GUID_WICPixelFormat4bppGray;
break;
176 case 8:
This->decoder_frame.pixel_format = GUID_WICPixelFormat8bppGray;
break;
177 case 16:
This->decoder_frame.pixel_format = GUID_WICPixelFormat16bppGray;
break;
179 ERR(
"invalid grayscale bit depth: %i\n", bit_depth);
187 This->decoder_frame.bpp = bit_depth;
190 case 1:
This->decoder_frame.pixel_format = GUID_WICPixelFormat1bppIndexed;
break;
191 case 2:
This->decoder_frame.pixel_format = GUID_WICPixelFormat2bppIndexed;
break;
192 case 4:
This->decoder_frame.pixel_format = GUID_WICPixelFormat4bppIndexed;
break;
193 case 8:
This->decoder_frame.pixel_format = GUID_WICPixelFormat8bppIndexed;
break;
195 ERR(
"invalid indexed color bit depth: %i\n", bit_depth);
201 This->decoder_frame.bpp = bit_depth * 3;
206 This->decoder_frame.pixel_format = GUID_WICPixelFormat24bppBGR;
208 case 16:
This->decoder_frame.pixel_format = GUID_WICPixelFormat48bppRGB;
break;
210 ERR(
"invalid RGB color bit depth: %i\n", bit_depth);
216 ERR(
"invalid color type %i\n", color_type);
228 This->decoder_frame.dpix = xres * 0.0254;
229 This->decoder_frame.dpiy = yres * 0.0254;
233 WARN(
"no pHYs block present\n");
234 This->decoder_frame.dpix =
This->decoder_frame.dpiy = 96.0;
237 ret = png_get_iCCP(
png_ptr,
info_ptr, &cp_name, &cp_compression, &cp_profile, &cp_len);
240 This->decoder_frame.num_color_contexts = 1;
241 This->color_profile_len = cp_len;
243 if (!
This->color_profile)
248 memcpy(
This->color_profile, cp_profile, cp_len);
251 This->decoder_frame.num_color_contexts = 0;
258 ERR(
"paletted image with no PLTE chunk\n");
263 if (num_palette > 256)
265 ERR(
"palette has %i colors?!\n", num_palette);
270 This->decoder_frame.num_colors = num_palette;
271 for (
i=0;
i<num_palette;
i++)
274 This->decoder_frame.palette[
i] = (
alpha << 24 |
275 png_palette[
i].
red << 16|
276 png_palette[
i].
green << 8|
277 png_palette[
i].
blue);
281 num_palette = 1 << bit_depth;
283 This->decoder_frame.num_colors = num_palette;
284 for (
i=0;
i<num_palette;
i++)
287 BYTE val =
i * 255 / (num_palette - 1);
293 This->decoder_frame.num_colors = 0;
296 This->stride = (
This->decoder_frame.width *
This->decoder_frame.bpp + 7) / 8;
300 if (!
This->image_bits)
313 for (
i=0;
i<
This->decoder_frame.height;
i++)
314 row_pointers[
i] =
This->image_bits +
i *
This->stride;
316 png_read_image(
png_ptr, row_pointers);
358 This->decoder_frame.width,
This->decoder_frame.height,
This->stride,
372 ULONG metadata_blocks_size = 0;
385 if (chunk_type[0] >=
'a' && chunk_type[0] <=
'z' &&
386 memcmp(chunk_type,
"tRNS", 4) &&
memcmp(chunk_type,
"pHYs", 4))
389 if (*
count == metadata_blocks_size)
392 ULONG new_metadata_blocks_size;
394 new_metadata_blocks_size = 4 + metadata_blocks_size * 2;
395 new_metadata_blocks =
malloc(new_metadata_blocks_size *
sizeof(*new_metadata_blocks));
397 if (!new_metadata_blocks)
404 *
count *
sizeof(*new_metadata_blocks));
407 result = new_metadata_blocks;
408 metadata_blocks_size = new_metadata_blocks_size;
417 seek = chunk_start + chunk_size + 12;
418 }
while (
memcmp(chunk_type,
"IEND", 4));
484 info->container_format = GUID_ContainerFormatPng;
485 info->block_format = GUID_ContainerFormatPng;
486 info->clsid = CLSID_WICPngDecoder;
546 png_error(
png_ptr,
"failed writing data");
565 This->info_ptr = png_create_info_struct(
This->png_ptr);
568 png_destroy_write_struct(&
This->png_ptr,
NULL);
578 png_destroy_write_struct(&
This->png_ptr, &
This->info_ptr);
635 This->lines_written = 0;
647 if (
This->format->bit_depth > 8)
648 png_set_swap(
This->png_ptr);
651 This->format->bit_depth,
This->format->color_type,
665 UINT i, num_trans = 0, colors;
672 for (
i = 0;
i < colors;
i++)
678 if (trans[
i] != 0xff)
682 png_set_PLTE(
This->png_ptr,
This->info_ptr, png_palette, colors);
685 png_set_tRNS(
This->png_ptr,
This->info_ptr, trans, num_trans,
NULL);
688 png_write_info(
This->png_ptr,
This->info_ptr);
690 if (
This->format->remove_filler)
693 if (
This->format->swap_rgb)
694 png_set_bgr(
This->png_ptr);
697 This->passes = png_set_interlace_handling(
This->png_ptr);
701 static const int png_filter_map[] =
721 png_byte **row_pointers=
NULL;
724 if (
This->encoder_frame.interlace)
727 for (
i=0;
i<line_count;
i++)
732 This->lines_written += line_count;
744 row_pointers =
malloc(line_count *
sizeof(png_byte*));
748 for (
i=0;
i<line_count;
i++)
751 png_write_rows(
This->png_ptr, row_pointers, line_count);
752 This->lines_written += line_count;
762 png_byte **row_pointers=
NULL;
771 if (
This->encoder_frame.interlace)
775 row_pointers =
malloc(
This->encoder_frame.height *
sizeof(png_byte*));
779 for (
i=0;
i<
This->encoder_frame.height;
i++)
780 row_pointers[
i] =
This->data +
This->stride *
i;
783 png_write_rows(
This->png_ptr, row_pointers,
This->encoder_frame.height);
786 png_write_end(
This->png_ptr,
This->info_ptr);
802 png_destroy_write_struct(&
This->png_ptr, &
This->info_ptr);
835 info->container_format = GUID_ContainerFormatPng;
836 info->clsid = CLSID_WICPngEncoder;
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void copy_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch, BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, const struct volume *size, const struct pixel_format_desc *format) DECLSPEC_HIDDEN
GLuint GLuint GLsizei count
GLclampf GLclampf GLclampf alpha
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLsizei GLsizei * length
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
static const struct encoder_funcs png_encoder_vtable
static void CDECL png_encoder_destroy(struct encoder *encoder)
static struct png_encoder * impl_from_encoder(struct encoder *iface)
static HRESULT CDECL png_encoder_initialize(struct encoder *encoder, IStream *stream)
static const struct decoder_funcs png_decoder_vtable
static HRESULT CDECL png_decoder_get_color_context(struct decoder *iface, UINT frame, UINT num, BYTE **data, DWORD *datasize)
static void CDECL png_decoder_destroy(struct decoder *iface)
static const struct png_pixelformat formats[]
static HRESULT CDECL png_decoder_initialize(struct decoder *iface, IStream *stream, struct decoder_stat *st)
HRESULT CDECL png_encoder_create(struct encoder_info *info, struct encoder **result)
static void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
static void user_flush(png_structp png_ptr)
static struct png_decoder * impl_from_decoder(struct decoder *iface)
static void user_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
static HRESULT CDECL png_decoder_copy_pixels(struct decoder *iface, UINT frame, const WICRect *prc, UINT stride, UINT buffersize, BYTE *buffer)
static HRESULT CDECL png_encoder_commit_frame(struct encoder *encoder)
static HRESULT CDECL png_decoder_get_metadata_blocks(struct decoder *iface, UINT frame, UINT *count, struct decoder_block **blocks)
static HRESULT CDECL png_decoder_get_frame_info(struct decoder *iface, UINT frame, struct decoder_frame *info)
static HRESULT CDECL png_encoder_get_supported_format(struct encoder *iface, GUID *pixel_format, DWORD *bpp, BOOL *indexed)
static HRESULT CDECL png_encoder_write_lines(struct encoder *encoder, BYTE *data, DWORD line_count, DWORD stride)
HRESULT CDECL png_decoder_create(struct decoder_info *info, struct decoder **result)
static HRESULT CDECL png_encoder_commit_file(struct encoder *encoder)
static HRESULT CDECL png_encoder_create_frame(struct encoder *encoder, const struct encoder_frame *encoder_frame)
static GLint image_size(GLint width, GLint height, GLenum format, GLenum type)
#define memcpy(s1, s2, n)
#define PNG_COLOR_TYPE_RGB
#define PNG_COLOR_TYPE_RGB_ALPHA
#define PNG_COLOR_TYPE_GRAY_ALPHA
#define PNG_COLOR_TYPE_GRAY
#define PNG_COLOR_TYPE_PALETTE
png_voidp PNGAPI png_get_io_ptr(png_const_structrp png_ptr)
#define PNG_COMPRESSION_TYPE_DEFAULT
#define png_jmpbuf(png_ptr)
#define PNG_CRC_QUIET_USE
#define PNG_RESOLUTION_METER
#define PNG_INTERLACE_ADAM7
#define PNG_LIBPNG_VER_STRING
#define PNG_FILTER_TYPE_DEFAULT
#define PNG_INTERLACE_NONE
png_const_structrp png_const_inforp info_ptr
static __inline const char * wine_dbgstr_guid(const GUID *id)
int seek(void *fd, ulong off, int mode)
const struct png_pixelformat * format
struct encoder_frame encoder_frame
#define CONTAINING_RECORD(address, type, field)
@ WICPngFilterUnspecified
@ WICBitmapDecoderCapabilityCanDecodeSomeImages
@ WICBitmapDecoderCapabilityCanEnumerateMetadata
@ WICBitmapDecoderCapabilityCanDecodeAllImages
HRESULT CDECL stream_write(IStream *stream, const void *buffer, ULONG write, ULONG *bytes_written)
HRESULT CDECL stream_seek(IStream *stream, LONGLONG ofs, DWORD origin, ULONGLONG *new_position)
HRESULT read_png_chunk(IStream *stream, BYTE *type, BYTE **data, ULONG *data_size)
#define ENCODER_FLAGS_SUPPORTS_METADATA
@ ENCODER_OPTION_INTERLACE
@ WICMetadataCreationAllowUnknown
#define WINCODEC_ERR_UNKNOWNIMAGEFORMAT