mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-03 00:28:29 +00:00
wmphoto: Implement WMP decoder using jxrlib.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Esme Povirk <esme@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3c2da5b9c9
commit
958b433272
122
configure
vendored
122
configure
vendored
|
@ -646,6 +646,8 @@ TIFF_LIBS
|
|||
TIFF_CFLAGS
|
||||
PNG_LIBS
|
||||
PNG_CFLAGS
|
||||
JXRLIB_LIBS
|
||||
JXRLIB_CFLAGS
|
||||
JPEG_LIBS
|
||||
JPEG_CFLAGS
|
||||
GSSAPI_LIBS
|
||||
|
@ -863,6 +865,7 @@ with_gstreamer
|
|||
with_hal
|
||||
with_inotify
|
||||
with_jpeg
|
||||
with_jxrlib
|
||||
with_krb5
|
||||
with_ldap
|
||||
with_mingw
|
||||
|
@ -1928,6 +1931,8 @@ GSSAPI_CFLAGS
|
|||
GSSAPI_LIBS
|
||||
JPEG_CFLAGS
|
||||
JPEG_LIBS
|
||||
JXRLIB_CFLAGS
|
||||
JXRLIB_LIBS
|
||||
PNG_CFLAGS
|
||||
PNG_LIBS
|
||||
TIFF_CFLAGS
|
||||
|
@ -2603,6 +2608,7 @@ Optional Packages:
|
|||
--without-hal do not use HAL (dynamic device support)
|
||||
--without-inotify do not use inotify (filesystem change notifications)
|
||||
--without-jpeg do not use JPEG
|
||||
--without-jxrlib do not use JPEG-XR
|
||||
--without-krb5 do not use krb5 (Kerberos)
|
||||
--without-ldap do not use LDAP
|
||||
--without-mingw do not use the MinGW cross-compiler
|
||||
|
@ -2729,6 +2735,9 @@ Some influential environment variables:
|
|||
GSSAPI_LIBS Linker flags for krb5-gssapi, overriding pkg-config
|
||||
JPEG_CFLAGS C compiler flags for libjpeg, overriding pkg-config
|
||||
JPEG_LIBS Linker flags for libjpeg, overriding pkg-config
|
||||
JXRLIB_CFLAGS
|
||||
C compiler flags for jxrlib, overriding pkg-config
|
||||
JXRLIB_LIBS Linker flags for jxrlib, overriding pkg-config
|
||||
PNG_CFLAGS C compiler flags for libpng, overriding pkg-config
|
||||
PNG_LIBS Linker flags for libpng, overriding pkg-config
|
||||
TIFF_CFLAGS C compiler flags for libtiff-4, overriding pkg-config
|
||||
|
@ -4037,6 +4046,12 @@ if test "${with_jpeg+set}" = set; then :
|
|||
fi
|
||||
|
||||
|
||||
# Check whether --with-jxrlib was given.
|
||||
if test "${with_jxrlib+set}" = set; then :
|
||||
withval=$with_jxrlib;
|
||||
fi
|
||||
|
||||
|
||||
# Check whether --with-krb5 was given.
|
||||
if test "${with_krb5+set}" = set; then :
|
||||
withval=$with_krb5;
|
||||
|
@ -15830,6 +15845,111 @@ esac
|
|||
|
||||
fi
|
||||
|
||||
if test "x$with_jxrlib" != "xno"
|
||||
then
|
||||
if ${JXRLIB_CFLAGS:+false} :; then :
|
||||
if ${PKG_CONFIG+:} false; then :
|
||||
JXRLIB_CFLAGS=`$PKG_CONFIG --cflags jxrlib 2>/dev/null`
|
||||
fi
|
||||
fi
|
||||
test "$cross_compiling" = yes || JXRLIB_CFLAGS=${JXRLIB_CFLAGS:-${JXRLIB_CFLAGS:--I/usr/include/jxrlib}}
|
||||
if ${JXRLIB_LIBS:+false} :; then :
|
||||
if ${PKG_CONFIG+:} false; then :
|
||||
JXRLIB_LIBS=`$PKG_CONFIG --libs jxrlib 2>/dev/null`
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: jxrlib cflags: $JXRLIB_CFLAGS" >&5
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: jxrlib libs: $JXRLIB_LIBS" >&5
|
||||
ac_save_CPPFLAGS=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $JXRLIB_CFLAGS"
|
||||
for ac_header in JXRGlue.h
|
||||
do :
|
||||
ac_fn_c_check_header_compile "$LINENO" "JXRGlue.h" "ac_cv_header_JXRGlue_h" "#define FAR
|
||||
"
|
||||
if test "x$ac_cv_header_JXRGlue_h" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_JXRGLUE_H 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
if test "$ac_cv_header_JXRGlue_h" = "yes"
|
||||
then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -ljxrglue" >&5
|
||||
$as_echo_n "checking for -ljxrglue... " >&6; }
|
||||
if ${ac_cv_lib_soname_jxrglue+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_soname_save_LIBS=$LIBS
|
||||
LIBS="-ljxrglue $JXRLIB_LIBS $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char PKImageDecode_Create_WMP ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return PKImageDecode_Create_WMP ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
case "$LIBEXT" in
|
||||
dll) ac_cv_lib_soname_jxrglue=`$ac_cv_path_LDD conftest.exe | grep "jxrglue" | sed -e "s/dll.*/dll/"';2,$d'` ;;
|
||||
dylib) ac_cv_lib_soname_jxrglue=`$OTOOL -L conftest$ac_exeext | grep "libjxrglue\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libjxrglue\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
|
||||
*) ac_cv_lib_soname_jxrglue=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libjxrglue\\.$LIBEXT" | sed -e "s/^.*\\[\\(libjxrglue\\.$LIBEXT[^ ]*\\)\\].*$/\1/"';2,$d'`
|
||||
if ${ac_cv_lib_soname_jxrglue:+false} :; then :
|
||||
ac_cv_lib_soname_jxrglue=`$LDD conftest$ac_exeext | grep "libjxrglue\\.$LIBEXT" | sed -e "s/^.*\(libjxrglue\.$LIBEXT[^ ]*\).*$/\1/"';2,$d'`
|
||||
fi ;;
|
||||
esac
|
||||
else
|
||||
ac_cv_lib_soname_jxrglue=
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_soname_save_LIBS
|
||||
fi
|
||||
if ${ac_cv_lib_soname_jxrglue:+false} :; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
||||
$as_echo "not found" >&6; }
|
||||
JXRLIB_CFLAGS=""
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_jxrglue" >&5
|
||||
$as_echo "$ac_cv_lib_soname_jxrglue" >&6; }
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define SONAME_LIBJXRGLUE "$ac_cv_lib_soname_jxrglue"
|
||||
_ACEOF
|
||||
|
||||
|
||||
fi
|
||||
else
|
||||
JXRLIB_CFLAGS=""
|
||||
fi
|
||||
CPPFLAGS=$ac_save_CPPFLAGS
|
||||
|
||||
fi
|
||||
if test "x$ac_cv_lib_soname_jxrglue" = "x"; then :
|
||||
case "x$with_jxrlib" in
|
||||
x) as_fn_append wine_notices "|jxrlib ${notice_platform}development files not found, JPEG-XR won't be supported." ;;
|
||||
xno) ;;
|
||||
*) as_fn_error $? "jxrlib ${notice_platform}development files not found, JPEG-XR won't be supported.
|
||||
This is an error since --with-jxrlib was requested." "$LINENO" 5 ;;
|
||||
esac
|
||||
|
||||
fi
|
||||
|
||||
if test "x$with_png" != "xno"
|
||||
then
|
||||
if ${PNG_CFLAGS:+false} :; then :
|
||||
|
@ -19782,6 +19902,8 @@ GSSAPI_CFLAGS = $GSSAPI_CFLAGS
|
|||
GSSAPI_LIBS = $GSSAPI_LIBS
|
||||
JPEG_CFLAGS = $JPEG_CFLAGS
|
||||
JPEG_LIBS = $JPEG_LIBS
|
||||
JXRLIB_CFLAGS = $JXRLIB_CFLAGS
|
||||
JXRLIB_LIBS = $JXRLIB_LIBS
|
||||
PNG_CFLAGS = $PNG_CFLAGS
|
||||
PNG_LIBS = $PNG_LIBS
|
||||
TIFF_CFLAGS = $TIFF_CFLAGS
|
||||
|
|
16
configure.ac
16
configure.ac
|
@ -58,6 +58,7 @@ AC_ARG_WITH(gstreamer, AS_HELP_STRING([--without-gstreamer],[do not use GStreame
|
|||
AC_ARG_WITH(hal, AS_HELP_STRING([--without-hal],[do not use HAL (dynamic device support)]))
|
||||
AC_ARG_WITH(inotify, AS_HELP_STRING([--without-inotify],[do not use inotify (filesystem change notifications)]))
|
||||
AC_ARG_WITH(jpeg, AS_HELP_STRING([--without-jpeg],[do not use JPEG]))
|
||||
AC_ARG_WITH(jxrlib, AS_HELP_STRING([--without-jxrlib],[do not use JPEG-XR]))
|
||||
AC_ARG_WITH(krb5, AS_HELP_STRING([--without-krb5],[do not use krb5 (Kerberos)]))
|
||||
AC_ARG_WITH(ldap, AS_HELP_STRING([--without-ldap],[do not use LDAP]),
|
||||
[if test "x$withval" = "xno"; then ac_cv_header_ldap_h=no; ac_cv_header_lber_h=no; fi])
|
||||
|
@ -1829,6 +1830,21 @@ fi
|
|||
WINE_WARNING_WITH(jpeg,[test "x$ac_cv_lib_soname_jpeg" = "x"],
|
||||
[libjpeg ${notice_platform}development files not found, JPEG won't be supported.])
|
||||
|
||||
dnl **** Check for libjxrglue ****
|
||||
if test "x$with_jxrlib" != "xno"
|
||||
then
|
||||
WINE_PACKAGE_FLAGS(JXRLIB,[jxrlib],,[${JXRLIB_CFLAGS:--I/usr/include/jxrlib}],,
|
||||
[AC_CHECK_HEADERS([JXRGlue.h],,,[#define FAR])
|
||||
if test "$ac_cv_header_JXRGlue_h" = "yes"
|
||||
then
|
||||
WINE_CHECK_SONAME(jxrglue,PKImageDecode_Create_WMP,,[JXRLIB_CFLAGS=""],[$JXRLIB_LIBS])
|
||||
else
|
||||
JXRLIB_CFLAGS=""
|
||||
fi])
|
||||
fi
|
||||
WINE_NOTICE_WITH(jxrlib,[test "x$ac_cv_lib_soname_jxrglue" = "x"],
|
||||
[jxrlib ${notice_platform}development files not found, JPEG-XR won't be supported.])
|
||||
|
||||
dnl **** Check for libpng ****
|
||||
if test "x$with_png" != "xno"
|
||||
then
|
||||
|
|
|
@ -1531,8 +1531,7 @@ static void test_get_image_info(void)
|
|||
for (i = 0; i < ARRAY_SIZE(test_image); ++i)
|
||||
{
|
||||
hr = D3DX10GetImageInfoFromMemory(test_image[i].data, test_image[i].size, NULL, &image_info, NULL);
|
||||
todo_wine_if(test_image[i].expected.ImageFileFormat == D3DX10_IFF_WMP)
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
if (hr != S_OK)
|
||||
continue;
|
||||
check_image_info(&image_info, i, __LINE__);
|
||||
|
@ -1552,13 +1551,11 @@ static void test_get_image_info(void)
|
|||
create_file(test_filename, test_image[i].data, test_image[i].size, path);
|
||||
|
||||
hr = D3DX10GetImageInfoFromFileW(path, NULL, &image_info, NULL);
|
||||
todo_wine_if(test_image[i].expected.ImageFileFormat == D3DX10_IFF_WMP)
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
if (hr == S_OK)
|
||||
check_image_info(&image_info, i, __LINE__);
|
||||
|
||||
hr = D3DX10GetImageInfoFromFileA(get_str_a(path), NULL, &image_info, NULL);
|
||||
todo_wine_if(test_image[i].expected.ImageFileFormat == D3DX10_IFF_WMP)
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
if (hr == S_OK)
|
||||
check_image_info(&image_info, i, __LINE__);
|
||||
|
@ -1583,13 +1580,11 @@ static void test_get_image_info(void)
|
|||
resource_module = create_resource_module(test_resource_name, test_image[i].data, test_image[i].size);
|
||||
|
||||
hr = D3DX10GetImageInfoFromResourceW(resource_module, test_resource_name, NULL, &image_info, NULL);
|
||||
todo_wine_if(test_image[i].expected.ImageFileFormat == D3DX10_IFF_WMP)
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
if (hr == S_OK)
|
||||
check_image_info(&image_info, i, __LINE__);
|
||||
|
||||
hr = D3DX10GetImageInfoFromResourceA(resource_module, get_str_a(test_resource_name), NULL, &image_info, NULL);
|
||||
todo_wine_if(test_image[i].expected.ImageFileFormat == D3DX10_IFF_WMP)
|
||||
ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
|
||||
if (hr == S_OK)
|
||||
check_image_info(&image_info, i, __LINE__);
|
||||
|
|
|
@ -89,7 +89,7 @@ static void test_decode(void)
|
|||
&IID_IWICBitmapDecoder, (void **)&decoder);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
todo_wine win_skip("WmpDecoder isn't available, skipping test\n");
|
||||
win_skip("WmpDecoder isn't available, skipping test\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ static void test_decode(void)
|
|||
ok(count == 1, "unexpected count %u\n", count);
|
||||
|
||||
hr = IWICBitmapDecoder_GetFrame(decoder, 0, NULL);
|
||||
ok(hr == E_INVALIDARG, "GetFrame(NULL) returned hr=%x\n", hr);
|
||||
todo_wine ok(hr == E_INVALIDARG, "GetFrame(NULL) returned hr=%x\n", hr);
|
||||
|
||||
for (j = 2; j > 0; --j)
|
||||
{
|
||||
|
|
|
@ -37,14 +37,371 @@
|
|||
#include "objbase.h"
|
||||
|
||||
#include "initguid.h"
|
||||
#include "wincodecs_private.h"
|
||||
#ifdef SONAME_LIBJXRGLUE
|
||||
#define ERR JXR_ERR
|
||||
#include <JXRGlue.h>
|
||||
#undef ERR
|
||||
#endif
|
||||
|
||||
#include "wincodecs_private.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
|
||||
|
||||
#include "wincodecs_common.h"
|
||||
|
||||
#ifdef SONAME_LIBJXRGLUE
|
||||
static void *libjxrglue;
|
||||
static typeof(PKImageDecode_Create_WMP) *pPKImageDecode_Create_WMP;
|
||||
|
||||
static const struct
|
||||
{
|
||||
const WICPixelFormatGUID *format;
|
||||
UINT bpp;
|
||||
} pixel_format_bpp[] =
|
||||
{
|
||||
{&GUID_PKPixelFormat128bppRGBAFixedPoint, 128},
|
||||
{&GUID_PKPixelFormat128bppRGBAFloat, 128},
|
||||
{&GUID_PKPixelFormat128bppRGBFloat, 128},
|
||||
{&GUID_PKPixelFormat16bppRGB555, 16},
|
||||
{&GUID_PKPixelFormat16bppRGB565, 16},
|
||||
{&GUID_PKPixelFormat16bppGray, 16},
|
||||
{&GUID_PKPixelFormat16bppGrayFixedPoint, 16},
|
||||
{&GUID_PKPixelFormat16bppGrayHalf, 16},
|
||||
{&GUID_PKPixelFormat24bppBGR, 24},
|
||||
{&GUID_PKPixelFormat24bppRGB, 24},
|
||||
{&GUID_PKPixelFormat32bppBGR, 32},
|
||||
{&GUID_PKPixelFormat32bppRGB101010, 32},
|
||||
{&GUID_PKPixelFormat32bppBGRA, 32},
|
||||
{&GUID_PKPixelFormat32bppCMYK, 32},
|
||||
{&GUID_PKPixelFormat32bppGrayFixedPoint, 32},
|
||||
{&GUID_PKPixelFormat32bppGrayFloat, 32},
|
||||
{&GUID_PKPixelFormat32bppRGBE, 32},
|
||||
{&GUID_PKPixelFormat40bppCMYKAlpha, 40},
|
||||
{&GUID_PKPixelFormat48bppRGB, 48},
|
||||
{&GUID_PKPixelFormat48bppRGBFixedPoint, 48},
|
||||
{&GUID_PKPixelFormat48bppRGBHalf, 48},
|
||||
{&GUID_PKPixelFormat64bppCMYK, 64},
|
||||
{&GUID_PKPixelFormat64bppRGBA, 64},
|
||||
{&GUID_PKPixelFormat64bppRGBAFixedPoint, 64},
|
||||
{&GUID_PKPixelFormat64bppRGBAHalf, 64},
|
||||
{&GUID_PKPixelFormat80bppCMYKAlpha, 80},
|
||||
{&GUID_PKPixelFormat8bppGray, 8},
|
||||
{&GUID_PKPixelFormat96bppRGBFixedPoint, 96},
|
||||
{&GUID_PKPixelFormatBlackWhite, 1},
|
||||
};
|
||||
|
||||
static inline UINT pixel_format_get_bpp(const WICPixelFormatGUID *format)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(pixel_format_bpp); ++i)
|
||||
if (IsEqualGUID(format, pixel_format_bpp[i].format)) return pixel_format_bpp[i].bpp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct wmp_decoder
|
||||
{
|
||||
struct decoder decoder_iface;
|
||||
struct WMPStream WMPStream_iface;
|
||||
PKImageDecode *decoder;
|
||||
IStream *stream;
|
||||
struct decoder_frame frame;
|
||||
UINT frame_stride;
|
||||
BYTE *frame_data;
|
||||
};
|
||||
|
||||
static inline struct wmp_decoder *impl_from_decoder(struct decoder *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct wmp_decoder, decoder_iface);
|
||||
}
|
||||
|
||||
static inline struct wmp_decoder *impl_from_WMPStream(struct WMPStream *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct wmp_decoder, WMPStream_iface);
|
||||
}
|
||||
|
||||
static JXR_ERR wmp_stream_Close(struct WMPStream **piface)
|
||||
{
|
||||
TRACE("iface %p\n", piface);
|
||||
return WMP_errSuccess;
|
||||
}
|
||||
|
||||
static Bool wmp_stream_EOS(struct WMPStream *iface)
|
||||
{
|
||||
FIXME("iface %p, stub!\n", iface);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static JXR_ERR wmp_stream_Read(struct WMPStream *iface, void *buf, size_t len)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_WMPStream(iface);
|
||||
ULONG count;
|
||||
if (FAILED(stream_read(This->stream, buf, len, &count)) || count != len)
|
||||
{
|
||||
WARN("Failed to read data!\n");
|
||||
return WMP_errFileIO;
|
||||
}
|
||||
return WMP_errSuccess;
|
||||
}
|
||||
|
||||
static JXR_ERR wmp_stream_Write(struct WMPStream *iface, const void *buf, size_t len)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_WMPStream(iface);
|
||||
ULONG count;
|
||||
if (FAILED(stream_write(This->stream, buf, len, &count)) || count != len)
|
||||
{
|
||||
WARN("Failed to write data!\n");
|
||||
return WMP_errFileIO;
|
||||
}
|
||||
return WMP_errSuccess;
|
||||
}
|
||||
|
||||
static JXR_ERR wmp_stream_SetPos(struct WMPStream *iface, size_t pos)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_WMPStream(iface);
|
||||
if (FAILED(stream_seek(This->stream, pos, STREAM_SEEK_SET, NULL)))
|
||||
{
|
||||
WARN("Failed to set stream pos!\n");
|
||||
return WMP_errFileIO;
|
||||
}
|
||||
return WMP_errSuccess;
|
||||
}
|
||||
|
||||
static JXR_ERR wmp_stream_GetPos(struct WMPStream *iface, size_t *pos)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_WMPStream(iface);
|
||||
ULONGLONG ofs;
|
||||
if (FAILED(stream_seek(This->stream, 0, STREAM_SEEK_CUR, &ofs)))
|
||||
{
|
||||
WARN("Failed to get stream pos!\n");
|
||||
return WMP_errFileIO;
|
||||
}
|
||||
*pos = ofs;
|
||||
return WMP_errSuccess;
|
||||
}
|
||||
|
||||
HRESULT CDECL wmp_decoder_initialize(struct decoder *iface, IStream *stream, struct decoder_stat *st)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_decoder(iface);
|
||||
HRESULT hr;
|
||||
Float dpix, dpiy;
|
||||
I32 width, height;
|
||||
U32 count;
|
||||
|
||||
TRACE("iface %p, stream %p, st %p\n", iface, stream, st);
|
||||
|
||||
if (This->stream)
|
||||
return WINCODEC_ERR_WRONGSTATE;
|
||||
|
||||
This->stream = stream;
|
||||
if (FAILED(hr = stream_seek(This->stream, 0, STREAM_SEEK_SET, NULL)))
|
||||
return hr;
|
||||
if (This->decoder->Initialize(This->decoder, &This->WMPStream_iface))
|
||||
{
|
||||
ERR("Failed to initialize jxrlib decoder!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (This->decoder->GetFrameCount(This->decoder, &st->frame_count))
|
||||
{
|
||||
ERR("Failed to get frame count!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (st->frame_count > 1) FIXME("multi frame JPEG-XR not implemented\n");
|
||||
st->frame_count = 1;
|
||||
st->flags = WICBitmapDecoderCapabilityCanDecodeAllImages |
|
||||
WICBitmapDecoderCapabilityCanDecodeSomeImages |
|
||||
WICBitmapDecoderCapabilityCanEnumerateMetadata;
|
||||
|
||||
if (This->decoder->SelectFrame(This->decoder, 0))
|
||||
{
|
||||
ERR("Failed to select frame 0!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
if (This->decoder->GetPixelFormat(This->decoder, &This->frame.pixel_format))
|
||||
{
|
||||
ERR("Failed to get frame pixel format!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
if (This->decoder->GetSize(This->decoder, &width, &height))
|
||||
{
|
||||
ERR("Failed to get frame size!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
if (This->decoder->GetResolution(This->decoder, &dpix, &dpiy))
|
||||
{
|
||||
ERR("Failed to get frame resolution!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
if (This->decoder->GetColorContext(This->decoder, NULL, &count))
|
||||
{
|
||||
ERR("Failed to get frame color context size!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (!(This->frame.bpp = pixel_format_get_bpp(&This->frame.pixel_format))) return E_FAIL;
|
||||
This->frame.width = width;
|
||||
This->frame.height = height;
|
||||
This->frame.dpix = dpix;
|
||||
This->frame.dpiy = dpiy;
|
||||
This->frame.num_colors = 0;
|
||||
if (count) This->frame.num_color_contexts = 1;
|
||||
else This->frame.num_color_contexts = 0;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wmp_decoder_get_frame_info(struct decoder *iface, UINT frame, struct decoder_frame *info)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_decoder(iface);
|
||||
|
||||
TRACE("iface %p, frame %d, info %p\n", iface, frame, info);
|
||||
|
||||
if (frame > 0)
|
||||
{
|
||||
FIXME("multi frame JPEG-XR not implemented\n");
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
*info = This->frame;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wmp_decoder_copy_pixels(struct decoder *iface, UINT frame, const WICRect *prc, UINT stride, UINT buffersize, BYTE *buffer)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_decoder(iface);
|
||||
PKRect pkrect;
|
||||
U8 *frame_data;
|
||||
|
||||
TRACE("iface %p, frame %d, rect %p, stride %d, buffersize %d, buffer %p\n", iface, frame, prc, stride, buffersize, buffer);
|
||||
|
||||
if (frame > 0)
|
||||
{
|
||||
FIXME("multi frame JPEG-XR not implemented\n");
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
if (!This->frame_data)
|
||||
{
|
||||
pkrect.X = 0;
|
||||
pkrect.Y = 0;
|
||||
pkrect.Width = This->frame.width;
|
||||
pkrect.Height = This->frame.height;
|
||||
This->frame_stride = (This->frame.width * This->frame.bpp + 7) / 8;
|
||||
if (!(frame_data = RtlAllocateHeap(GetProcessHeap(), 0, This->frame.height * This->frame_stride)))
|
||||
return E_FAIL;
|
||||
if (This->decoder->Copy(This->decoder, &pkrect, frame_data, stride))
|
||||
{
|
||||
ERR("Failed to copy frame data!\n");
|
||||
RtlFreeHeap(GetProcessHeap(), 0, frame_data);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
This->frame_data = frame_data;
|
||||
}
|
||||
|
||||
return copy_pixels(This->frame.bpp, This->frame_data,
|
||||
This->frame.width, This->frame.height, This->frame_stride,
|
||||
prc, stride, buffersize, buffer);
|
||||
}
|
||||
|
||||
HRESULT CDECL wmp_decoder_get_metadata_blocks(struct decoder* iface, UINT frame, UINT *count, struct decoder_block **blocks)
|
||||
{
|
||||
TRACE("iface %p, frame %d, count %p, blocks %p\n", iface, frame, count, blocks);
|
||||
|
||||
*count = 0;
|
||||
*blocks = NULL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CDECL wmp_decoder_get_color_context(struct decoder* iface, UINT frame, UINT num, BYTE **data, DWORD *datasize)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_decoder(iface);
|
||||
U32 count;
|
||||
U8 *bytes;
|
||||
|
||||
TRACE("iface %p, frame %d, num %u, data %p, datasize %p\n", iface, frame, num, data, datasize);
|
||||
|
||||
*datasize = 0;
|
||||
*data = NULL;
|
||||
|
||||
if (This->decoder->GetColorContext(This->decoder, NULL, &count))
|
||||
{
|
||||
ERR("Failed to get frame color context size!\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
*datasize = count;
|
||||
|
||||
bytes = RtlAllocateHeap(GetProcessHeap(), 0, count);
|
||||
if (!bytes)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
if (This->decoder->GetColorContext(This->decoder, bytes, &count))
|
||||
{
|
||||
ERR("Failed to get frame color context!\n");
|
||||
RtlFreeHeap(GetProcessHeap(), 0, bytes);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
*data = bytes;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void CDECL wmp_decoder_destroy(struct decoder* iface)
|
||||
{
|
||||
struct wmp_decoder *This = impl_from_decoder(iface);
|
||||
|
||||
TRACE("iface %p\n", iface);
|
||||
|
||||
This->decoder->Release(&This->decoder);
|
||||
RtlFreeHeap(GetProcessHeap(), 0, This->frame_data);
|
||||
RtlFreeHeap(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
static const struct decoder_funcs wmp_decoder_vtable = {
|
||||
wmp_decoder_initialize,
|
||||
wmp_decoder_get_frame_info,
|
||||
wmp_decoder_copy_pixels,
|
||||
wmp_decoder_get_metadata_blocks,
|
||||
wmp_decoder_get_color_context,
|
||||
wmp_decoder_destroy
|
||||
};
|
||||
|
||||
HRESULT CDECL wmp_decoder_create(struct decoder_info *info, struct decoder **result)
|
||||
{
|
||||
struct wmp_decoder *This;
|
||||
PKImageDecode *decoder;
|
||||
|
||||
if (!pPKImageDecode_Create_WMP || pPKImageDecode_Create_WMP(&decoder)) return E_FAIL;
|
||||
This = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(*This));
|
||||
if (!This)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
This->decoder_iface.vtable = &wmp_decoder_vtable;
|
||||
This->WMPStream_iface.Close = &wmp_stream_Close;
|
||||
This->WMPStream_iface.EOS = &wmp_stream_EOS;
|
||||
This->WMPStream_iface.Read = &wmp_stream_Read;
|
||||
This->WMPStream_iface.Write = &wmp_stream_Write;
|
||||
This->WMPStream_iface.SetPos = &wmp_stream_SetPos;
|
||||
This->WMPStream_iface.GetPos = &wmp_stream_GetPos;
|
||||
|
||||
This->decoder = decoder;
|
||||
This->stream = NULL;
|
||||
memset(&This->frame, 0, sizeof(This->frame));
|
||||
This->frame_stride = 0;
|
||||
This->frame_data = NULL;
|
||||
|
||||
*result = &This->decoder_iface;
|
||||
|
||||
info->container_format = GUID_ContainerFormatWmp;
|
||||
info->block_format = GUID_ContainerFormatWmp;
|
||||
info->clsid = CLSID_WICWmpDecoder;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct win32_funcs *win32_funcs;
|
||||
|
||||
HRESULT CDECL stream_getsize(IStream *stream, ULONGLONG *size)
|
||||
|
@ -69,7 +426,17 @@ HRESULT CDECL stream_write(IStream *stream, const void *buffer, ULONG write, ULO
|
|||
|
||||
HRESULT CDECL decoder_create(const CLSID *decoder_clsid, struct decoder_info *info, struct decoder **result)
|
||||
{
|
||||
FIXME("decoder_clsid %s, info %p, result %p, stub!\n", debugstr_guid(decoder_clsid), info, result);
|
||||
if (IsEqualGUID(decoder_clsid, &CLSID_WICWmpDecoder))
|
||||
#ifdef SONAME_LIBJXRGLUE
|
||||
return wmp_decoder_create(info, result);
|
||||
#else
|
||||
{
|
||||
WARN("jxrlib support not compiled in, returning E_NOINTERFACE.\n");
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
#endif
|
||||
|
||||
FIXME("encoder_clsid %s, info %p, result %p, stub!\n", debugstr_guid(decoder_clsid), info, result);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
@ -103,6 +470,15 @@ NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *p
|
|||
|
||||
win32_funcs = ptr_in;
|
||||
|
||||
#ifdef SONAME_LIBJXRGLUE
|
||||
if (!(libjxrglue = dlopen(SONAME_LIBJXRGLUE, RTLD_NOW)))
|
||||
ERR("failed to load %s\n", SONAME_LIBJXRGLUE);
|
||||
else if (!(pPKImageDecode_Create_WMP = dlsym(libjxrglue, "PKImageDecode_Create_WMP")))
|
||||
ERR("unable to find PKImageDecode_Create_WMP in %s!\n", SONAME_LIBJXRGLUE);
|
||||
#else
|
||||
ERR("jxrlib support not compiled in!\n");
|
||||
#endif
|
||||
|
||||
*(const struct unix_funcs **)ptr_out = &unix_funcs;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -300,6 +300,9 @@
|
|||
/* Define to 1 if you have the <jpeglib.h> header file. */
|
||||
#undef HAVE_JPEGLIB_H
|
||||
|
||||
/* Define to 1 if you have the <JXRGlue.h> header file. */
|
||||
#undef HAVE_JXRGLUE_H
|
||||
|
||||
/* Define to 1 if you have the `kqueue' function. */
|
||||
#undef HAVE_KQUEUE
|
||||
|
||||
|
@ -1265,6 +1268,9 @@
|
|||
/* Define to the soname of the libjpeg library. */
|
||||
#undef SONAME_LIBJPEG
|
||||
|
||||
/* Define to the soname of the libjxrglue library. */
|
||||
#undef SONAME_LIBJXRGLUE
|
||||
|
||||
/* Define to the soname of the libkrb5 library. */
|
||||
#undef SONAME_LIBKRB5
|
||||
|
||||
|
|
Loading…
Reference in a new issue