Commit 665ab72f authored by Esme Povirk's avatar Esme Povirk Committed by Alexandre Julliard

windowscodecs: Move PNG encoding to the unix lib.

parent 19033430
......@@ -15,6 +15,7 @@ C_SRCS = \
converter.c \
ddsformat.c \
decoder.c \
encoder.c \
fliprotate.c \
gifformat.c \
icnsformat.c \
......
......@@ -223,6 +223,11 @@ HRESULT CDECL stream_seek(IStream *stream, LONGLONG ofs, DWORD origin, ULONGLONG
return hr;
}
HRESULT CDECL stream_write(IStream *stream, const void *buffer, ULONG write, ULONG *bytes_written)
{
return IStream_Write(stream, buffer, write, bytes_written);
}
HRESULT get_pixelformat_bpp(const GUID *pixelformat, UINT *bpp)
{
HRESULT hr;
......
......@@ -42,7 +42,8 @@ static const struct unix_funcs *unix_funcs;
static const struct win32_funcs win32_funcs = {
stream_getsize,
stream_read,
stream_seek
stream_seek,
stream_write
};
static BOOL WINAPI load_unixlib( INIT_ONCE *once, void *param, void **context )
......@@ -155,6 +156,42 @@ static inline struct encoder_wrapper *impl_from_encoder(struct encoder* iface)
return CONTAINING_RECORD(iface, struct encoder_wrapper, win32_encoder);
}
HRESULT CDECL encoder_wrapper_initialize(struct encoder* iface, IStream* stream)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_initialize(This->unix_encoder, stream);
}
HRESULT CDECL encoder_wrapper_get_supported_format(struct encoder* iface, GUID *pixel_format, DWORD *bpp, BOOL *indexed)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_get_supported_format(This->unix_encoder, pixel_format, bpp, indexed);
}
HRESULT CDECL encoder_wrapper_create_frame(struct encoder* iface, const struct encoder_frame *frame)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_create_frame(This->unix_encoder, frame);
}
HRESULT CDECL encoder_wrapper_write_lines(struct encoder* iface, BYTE *data, DWORD line_count, DWORD stride)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_write_lines(This->unix_encoder, data, line_count, stride);
}
HRESULT CDECL encoder_wrapper_commit_frame(struct encoder* iface)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_commit_frame(This->unix_encoder);
}
HRESULT CDECL encoder_wrapper_commit_file(struct encoder* iface)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
return unix_funcs->encoder_commit_file(This->unix_encoder);
}
void CDECL encoder_wrapper_destroy(struct encoder* iface)
{
struct encoder_wrapper* This = impl_from_encoder(iface);
......@@ -163,6 +200,12 @@ void CDECL encoder_wrapper_destroy(struct encoder* iface)
}
static const struct encoder_funcs encoder_wrapper_vtable = {
encoder_wrapper_initialize,
encoder_wrapper_get_supported_format,
encoder_wrapper_create_frame,
encoder_wrapper_write_lines,
encoder_wrapper_commit_frame,
encoder_wrapper_commit_file,
encoder_wrapper_destroy
};
......
......@@ -62,6 +62,11 @@ HRESULT CDECL stream_seek(IStream *stream, LONGLONG ofs, DWORD origin, ULONGLONG
return win32_funcs->stream_seek(stream, ofs, origin, new_position);
}
HRESULT CDECL stream_write(IStream *stream, const void *buffer, ULONG write, ULONG *bytes_written)
{
return win32_funcs->stream_write(stream, buffer, write, bytes_written);
}
HRESULT CDECL decoder_create(const CLSID *decoder_clsid, struct decoder_info *info, struct decoder **result)
{
if (IsEqualGUID(decoder_clsid, &CLSID_WICPngDecoder))
......@@ -93,6 +98,12 @@ static const struct unix_funcs unix_funcs = {
decoder_get_color_context,
decoder_destroy,
encoder_create,
encoder_initialize,
encoder_get_supported_format,
encoder_create_frame,
encoder_write_lines,
encoder_commit_frame,
encoder_commit_file,
encoder_destroy
};
......
......@@ -48,6 +48,36 @@ void CDECL decoder_destroy(struct decoder *decoder)
decoder->vtable->destroy(decoder);
}
HRESULT CDECL encoder_initialize(struct encoder *encoder, IStream *stream)
{
return encoder->vtable->initialize(encoder, stream);
}
HRESULT CDECL encoder_get_supported_format(struct encoder* encoder, GUID *pixel_format, DWORD *bpp, BOOL *indexed)
{
return encoder->vtable->get_supported_format(encoder, pixel_format, bpp, indexed);
}
HRESULT CDECL encoder_create_frame(struct encoder* encoder, const struct encoder_frame *frame)
{
return encoder->vtable->create_frame(encoder, frame);
}
HRESULT CDECL encoder_write_lines(struct encoder* encoder, BYTE *data, DWORD line_count, DWORD stride)
{
return encoder->vtable->write_lines(encoder, data, line_count, stride);
}
HRESULT CDECL encoder_commit_frame(struct encoder* encoder)
{
return encoder->vtable->commit_frame(encoder);
}
HRESULT CDECL encoder_commit_file(struct encoder* encoder)
{
return encoder->vtable->commit_file(encoder);
}
void CDECL encoder_destroy(struct encoder *encoder)
{
encoder->vtable->destroy(encoder);
......
......@@ -313,12 +313,14 @@ struct decoder_funcs
HRESULT CDECL stream_getsize(IStream *stream, ULONGLONG *size);
HRESULT CDECL stream_read(IStream *stream, void *buffer, ULONG read, ULONG *bytes_read);
HRESULT CDECL stream_seek(IStream *stream, LONGLONG ofs, DWORD origin, ULONGLONG *new_position);
HRESULT CDECL stream_write(IStream *stream, const void *buffer, ULONG write, ULONG *bytes_written);
struct win32_funcs
{
HRESULT (CDECL *stream_getsize)(IStream *stream, ULONGLONG *size);
HRESULT (CDECL *stream_read)(IStream *stream, void *buffer, ULONG read, ULONG *bytes_read);
HRESULT (CDECL *stream_seek)(IStream *stream, LONGLONG ofs, DWORD origin, ULONGLONG *new_position);
HRESULT (CDECL *stream_write)(IStream *stream, const void *buffer, ULONG write, ULONG *bytes_written);
};
HRESULT CDECL decoder_create(const CLSID *decoder_clsid, struct decoder_info *info, struct decoder **result);
......@@ -342,13 +344,30 @@ enum encoder_option
ENCODER_OPTION_END
};
#define ENCODER_FLAGS_MULTI_FRAME 0x1
struct encoder_info
{
DWORD flags;
GUID container_format;
CLSID clsid;
DWORD encoder_options[7];
};
struct encoder_frame
{
GUID pixel_format;
UINT width, height;
UINT bpp;
BOOL indexed;
double dpix, dpiy;
DWORD num_colors;
WICColor palette[256];
/* encoder options */
BOOL interlace;
DWORD filter;
};
struct encoder
{
const struct encoder_funcs *vtable;
......@@ -356,9 +375,21 @@ struct encoder
struct encoder_funcs
{
HRESULT (CDECL *initialize)(struct encoder* This, IStream *stream);
HRESULT (CDECL *get_supported_format)(struct encoder* This, GUID *pixel_format, DWORD *bpp, BOOL *indexed);
HRESULT (CDECL *create_frame)(struct encoder* This, const struct encoder_frame *frame);
HRESULT (CDECL *write_lines)(struct encoder* This, BYTE *data, DWORD line_count, DWORD stride);
HRESULT (CDECL *commit_frame)(struct encoder* This);
HRESULT (CDECL *commit_file)(struct encoder* This);
void (CDECL *destroy)(struct encoder* This);
};
HRESULT CDECL encoder_initialize(struct encoder* This, IStream *stream);
HRESULT CDECL encoder_get_supported_format(struct encoder* This, GUID *pixel_format, DWORD *bpp, BOOL *indexed);
HRESULT CDECL encoder_create_frame(struct encoder* This, const struct encoder_frame *frame);
HRESULT CDECL encoder_write_lines(struct encoder* This, BYTE *data, DWORD line_count, DWORD stride);
HRESULT CDECL encoder_commit_frame(struct encoder* This);
HRESULT CDECL encoder_commit_file(struct encoder* This);
void CDECL encoder_destroy(struct encoder* This);
HRESULT CDECL png_decoder_create(struct decoder_info *info, struct decoder **result);
......@@ -380,6 +411,12 @@ struct unix_funcs
BYTE **data, DWORD *datasize);
void (CDECL *decoder_destroy)(struct decoder* This);
HRESULT (CDECL *encoder_create)(const CLSID *encoder_clsid, struct encoder_info *info, struct encoder **result);
HRESULT (CDECL *encoder_initialize)(struct encoder* This, IStream *stream);
HRESULT (CDECL *encoder_get_supported_format)(struct encoder* This, GUID *pixel_format, DWORD *bpp, BOOL *indexed);
HRESULT (CDECL *encoder_create_frame)(struct encoder* This, const struct encoder_frame *frame);
HRESULT (CDECL *encoder_write_lines)(struct encoder* This, BYTE *data, DWORD line_count, DWORD stride);
HRESULT (CDECL *encoder_commit_frame)(struct encoder* This);
HRESULT (CDECL *encoder_commit_file)(struct encoder* This);
void (CDECL *encoder_destroy)(struct encoder* This);
};
......@@ -389,4 +426,7 @@ HRESULT get_unix_encoder(const CLSID *encoder_clsid, struct encoder_info *info,
extern HRESULT CommonDecoder_CreateInstance(struct decoder *decoder,
const struct decoder_info *decoder_info, REFIID iid, void** ppv) DECLSPEC_HIDDEN;
extern HRESULT CommonEncoder_CreateInstance(struct encoder *encoder,
const struct encoder_info *encoder_info, REFIID iid, void** ppv) DECLSPEC_HIDDEN;
#endif /* WINCODECS_PRIVATE_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment