From 21137cd3c3570e14e4231d6f6cc1dc6a047fb3e9 Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Wed, 5 Jan 2011 07:25:23 -0600 Subject: [PATCH] windowscodecs: Use Mac OS X native ICNS support, not libicns. The ICNS support is only used on Mac OS X and is not anticipated to be used on any other platform. So, we can rely on the native frameworks rather than a third-party dependency. --- configure | 78 +-------- configure.ac | 16 +- dlls/windowscodecs/Makefile.in | 1 + dlls/windowscodecs/icnsformat.c | 270 +++++++++++++------------------- include/config.h.in | 10 +- 5 files changed, 123 insertions(+), 252 deletions(-) diff --git a/configure b/configure index a49899b371a..17b49254560 100755 --- a/configure +++ b/configure @@ -658,6 +658,7 @@ FRAMEWORK_OPENAL COREAUDIO DISKARBITRATIONLIB LDEXECFLAGS +APPLICATIONSERVICESLIB QUICKTIMELIB IOKITLIB COREFOUNDATIONLIB @@ -786,7 +787,6 @@ with_gnutls with_gsm with_gstreamer with_hal -with_icns with_jack with_jpeg with_ldap @@ -1477,7 +1477,6 @@ Optional Packages: --without-gsm do not use libgsm (GSM 06.10 codec support) --without-gstreamer do not use GStreamer (codecs support) --without-hal do not use HAL (dynamic device support) - --without-icns do not use ICNS icon support --without-jack do not use the Jack sound support --without-jpeg do not use JPEG --without-ldap do not use LDAP @@ -2607,12 +2606,6 @@ if test "${with_hal+set}" = set; then : fi -# Check whether --with-icns was given. -if test "${with_icns+set}" = set; then : - withval=$with_icns; if test "x$withval" = "xno"; then ac_cv_header_icns_h=no; fi -fi - - # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; if test "x$withval" = "xno"; then ac_cv_header_jack_jack_h=no; fi @@ -5768,6 +5761,7 @@ done for ac_header in \ AL/al.h \ + ApplicationServices/ApplicationServices.h \ AudioToolbox/AudioConverter.h \ AudioUnit/AudioUnit.h \ CL/cl.h \ @@ -5797,7 +5791,6 @@ for ac_header in \ grp.h \ gsm.h \ gsm/gsm.h \ - icns.h \ ieeefp.h \ inet/mib2.h \ io.h \ @@ -6522,6 +6515,8 @@ fi QUICKTIMELIB="-framework QuickTime -framework ApplicationServices -framework CoreVideo" + APPLICATIONSERVICESLIB="-framework ApplicationServices" + LDEXECFLAGS="-image_base 0x7bf00000 -Wl,-segaddr,WINE_DOS,0x00000000,-segaddr,WINE_SHAREDHEAP,0x7f000000" if test "$ac_cv_header_DiskArbitration_DiskArbitration_h" = "yes" @@ -11453,71 +11448,6 @@ This is an error since --with-gsm was requested." "$LINENO" 5 ;; esac fi -if test "$ac_cv_header_icns_h" = "yes" -then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -licns" >&5 -$as_echo_n "checking for -licns... " >&6; } -if test "${ac_cv_lib_soname_icns+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_soname_save_LIBS=$LIBS -LIBS="-licns $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 icns_write_family_to_file (); -int -main () -{ -return icns_write_family_to_file (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - case "$LIBEXT" in - dll) ac_cv_lib_soname_icns=`$ac_cv_path_LDD conftest.exe | grep "icns" | sed -e "s/dll.*/dll/"';2,$d'` ;; - dylib) ac_cv_lib_soname_icns=`otool -L conftest$ac_exeext | grep "libicns\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libicns\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;; - *) ac_cv_lib_soname_icns=`$ac_cv_path_LDD conftest$ac_exeext | grep "libicns\\.$LIBEXT" | sed -e "s/^.*\(libicns\.$LIBEXT[^ ]*\).*$/\1/"';2,$d'` ;; - esac -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_soname_save_LIBS -fi -if test "x$ac_cv_lib_soname_icns" = "x"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_icns" >&5 -$as_echo "$ac_cv_lib_soname_icns" >&6; } - -cat >>confdefs.h <<_ACEOF -#define SONAME_LIBICNS "$ac_cv_lib_soname_icns" -_ACEOF - - -fi -fi -case $host_os in - darwin*|macosx*) - if test "x$ac_cv_lib_soname_icns" = "x"; then : - case "x$with_icns" in - x) as_fn_append wine_notices "|libicns ${notice_platform}development files not found, ICNS icons won't be supported." ;; - xno) ;; - *) as_fn_error $? "libicns ${notice_platform}development files not found, ICNS icons won't be supported. -This is an error since --with-icns was requested." "$LINENO" 5 ;; -esac -fi ;; -esac - if test "$ac_cv_header_jpeglib_h" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -ljpeg" >&5 diff --git a/configure.ac b/configure.ac index 6462974a5ff..d1a9c20599f 100644 --- a/configure.ac +++ b/configure.ac @@ -56,8 +56,6 @@ AC_ARG_WITH(gsm, AS_HELP_STRING([--without-gsm],[do not use libgsm (GSM 06 [if test "x$withval" = "xno"; then ac_cv_header_gsm_h=no; ac_cv_header_gsm_gsm_h=no; fi]) AC_ARG_WITH(gstreamer, AS_HELP_STRING([--without-gstreamer],[do not use GStreamer (codecs support)])) AC_ARG_WITH(hal, AS_HELP_STRING([--without-hal],[do not use HAL (dynamic device support)])) -AC_ARG_WITH(icns, AS_HELP_STRING([--without-icns],[do not use ICNS icon support]), - [if test "x$withval" = "xno"; then ac_cv_header_icns_h=no; fi]) AC_ARG_WITH(jack, AS_HELP_STRING([--without-jack],[do not use the Jack sound support]), [if test "x$withval" = "xno"; then ac_cv_header_jack_jack_h=no; fi]) AC_ARG_WITH(jpeg, AS_HELP_STRING([--without-jpeg],[do not use JPEG]), @@ -370,6 +368,7 @@ AC_SYS_LARGEFILE() AC_CHECK_HEADERS(\ AL/al.h \ + ApplicationServices/ApplicationServices.h \ AudioToolbox/AudioConverter.h \ AudioUnit/AudioUnit.h \ CL/cl.h \ @@ -399,7 +398,6 @@ AC_CHECK_HEADERS(\ grp.h \ gsm.h \ gsm/gsm.h \ - icns.h \ ieeefp.h \ inet/mib2.h \ io.h \ @@ -703,6 +701,7 @@ case $host_os in AC_SUBST(COREFOUNDATIONLIB,"-framework CoreFoundation") AC_SUBST(IOKITLIB,"-framework IOKit -framework CoreFoundation") AC_SUBST(QUICKTIMELIB,"-framework QuickTime -framework ApplicationServices -framework CoreVideo") + AC_SUBST(APPLICATIONSERVICESLIB,"-framework ApplicationServices") AC_SUBST(LDEXECFLAGS,["-image_base 0x7bf00000 -Wl,-segaddr,WINE_DOS,0x00000000,-segaddr,WINE_SHAREDHEAP,0x7f000000"]) if test "$ac_cv_header_DiskArbitration_DiskArbitration_h" = "yes" then @@ -1560,17 +1559,6 @@ fi WINE_NOTICE_WITH(gsm,[test "x$ac_cv_lib_soname_gsm" = "x"], [libgsm ${notice_platform}development files not found, gsm 06.10 codec won't be supported.]) -dnl **** Check for libicns **** -if test "$ac_cv_header_icns_h" = "yes" -then - WINE_CHECK_SONAME(icns,icns_write_family_to_file) -fi -case $host_os in - darwin*|macosx*) - WINE_NOTICE_WITH(icns,[test "x$ac_cv_lib_soname_icns" = "x"], - [libicns ${notice_platform}development files not found, ICNS icons won't be supported.]) ;; -esac - dnl **** Check for libjpeg **** if test "$ac_cv_header_jpeglib_h" = "yes" then diff --git a/dlls/windowscodecs/Makefile.in b/dlls/windowscodecs/Makefile.in index bc61cb49b07..1eeedf6ae45 100644 --- a/dlls/windowscodecs/Makefile.in +++ b/dlls/windowscodecs/Makefile.in @@ -3,6 +3,7 @@ IMPORTLIB = windowscodecs IMPORTS = uuid ole32 oleaut32 shlwapi advapi32 rpcrt4 EXTRAINCL = @PNGINCL@ EXTRADEFS = -DENTRY_PREFIX=WIC_ -DPROXY_DELEGATION -DWINE_REGISTER_DLL +EXTRALIBS = @APPLICATIONSERVICESLIB@ C_SRCS = \ bmpdecode.c \ diff --git a/dlls/windowscodecs/icnsformat.c b/dlls/windowscodecs/icnsformat.c index bc765a77fc4..fa5a71d4033 100644 --- a/dlls/windowscodecs/icnsformat.c +++ b/dlls/windowscodecs/icnsformat.c @@ -21,8 +21,37 @@ #include -#ifdef HAVE_ICNS_H -#include +#ifdef HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H +#define GetCurrentProcess GetCurrentProcess_Mac +#define GetCurrentThread GetCurrentThread_Mac +#define LoadResource LoadResource_Mac +#define EqualRect EqualRect_Mac +#define FillRect FillRect_Mac +#define FrameRect FrameRect_Mac +#define GetCursor GetCursor_Mac +#define InvertRect InvertRect_Mac +#define OffsetRect OffsetRect_Mac +#define PtInRect PtInRect_Mac +#define SetCursor SetCursor_Mac +#define SetRect SetRect_Mac +#define ShowCursor ShowCursor_Mac +#define UnionRect UnionRect_Mac +#include +#undef GetCurrentProcess +#undef GetCurrentThread +#undef LoadResource +#undef EqualRect +#undef FillRect +#undef FrameRect +#undef GetCursor +#undef InvertRect +#undef OffsetRect +#undef PtInRect +#undef SetCursor +#undef SetRect +#undef ShowCursor +#undef UnionRect +#undef DPRINTF #endif #define COBJMACROS @@ -39,47 +68,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); -#ifdef SONAME_LIBICNS - -static void *libicns_handle; -#define MAKE_FUNCPTR(f) static typeof(f) * p##f -MAKE_FUNCPTR(icns_create_family); -MAKE_FUNCPTR(icns_export_family_data); -MAKE_FUNCPTR(icns_free_image); -MAKE_FUNCPTR(icns_get_mask_type_for_icon_type); -MAKE_FUNCPTR(icns_get_type_from_image_info); -MAKE_FUNCPTR(icns_init_image_for_type); -MAKE_FUNCPTR(icns_new_element_from_image); -MAKE_FUNCPTR(icns_set_element_in_family); -#undef MAKE_FUNCPTR - -static void *load_libicns(void) -{ - if((libicns_handle = wine_dlopen(SONAME_LIBICNS, RTLD_NOW, NULL, 0)) != NULL) { - -#define LOAD_FUNCPTR(f) \ - if((p##f = wine_dlsym(libicns_handle, #f, NULL, 0)) == NULL) { \ - libicns_handle = NULL; \ - return NULL; \ - } - LOAD_FUNCPTR(icns_create_family); - LOAD_FUNCPTR(icns_export_family_data); - LOAD_FUNCPTR(icns_free_image); - LOAD_FUNCPTR(icns_get_mask_type_for_icon_type); - LOAD_FUNCPTR(icns_get_type_from_image_info); - LOAD_FUNCPTR(icns_init_image_for_type); - LOAD_FUNCPTR(icns_new_element_from_image); - LOAD_FUNCPTR(icns_set_element_in_family); -#undef LOAD_FUNCPTR - } - return libicns_handle; -} +#ifdef HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H typedef struct IcnsEncoder { IWICBitmapEncoder IWICBitmapEncoder_iface; LONG ref; IStream *stream; - icns_family_t *icns_family; + IconFamilyHandle icns_family; BOOL any_frame_committed; int outstanding_commits; BOOL committed; @@ -96,10 +91,9 @@ typedef struct IcnsFrameEncode { IcnsEncoder *encoder; LONG ref; BOOL initialized; - UINT width; - UINT height; - icns_type_t icns_type; - icns_image_t icns_image; + UINT size; + OSType icns_type; + BYTE* icns_image; int lines_written; BOOL committed; } IcnsFrameEncode; @@ -157,8 +151,8 @@ static ULONG WINAPI IcnsFrameEncode_Release(IWICBitmapFrameEncode *iface) This->encoder->outstanding_commits--; LeaveCriticalSection(&This->encoder->lock); } - if (This->icns_image.imageData != NULL) - picns_free_image(&This->icns_image); + if (This->icns_image != NULL) + HeapFree(GetProcessHeap(), 0, This->icns_image); IUnknown_Release((IUnknown*)This->encoder); HeapFree(GetProcessHeap(), 0, This); @@ -199,14 +193,35 @@ static HRESULT WINAPI IcnsFrameEncode_SetSize(IWICBitmapFrameEncode *iface, EnterCriticalSection(&This->encoder->lock); - if (!This->initialized || This->icns_image.imageData) + if (!This->initialized || This->icns_image) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } - This->width = uiWidth; - This->height = uiHeight; + if (uiWidth != uiHeight) + { + WARN("cannot generate ICNS icon from %dx%d image\n", uiWidth, uiHeight); + hr = E_INVALIDARG; + goto end; + } + + switch (uiWidth) + { + case 16: + case 32: + case 48: + case 128: + case 256: + case 512: + break; + default: + WARN("cannot generate ICNS icon from %dx%d image\n", This->size, This->size); + hr = E_INVALIDARG; + goto end; + } + + This->size = uiWidth; end: LeaveCriticalSection(&This->encoder->lock); @@ -223,7 +238,7 @@ static HRESULT WINAPI IcnsFrameEncode_SetResolution(IWICBitmapFrameEncode *iface EnterCriticalSection(&This->encoder->lock); - if (!This->initialized || This->icns_image.imageData) + if (!This->initialized || This->icns_image) { hr = WINCODEC_ERR_WRONGSTATE; goto end; @@ -244,7 +259,7 @@ static HRESULT WINAPI IcnsFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *ifac EnterCriticalSection(&This->encoder->lock); - if (!This->initialized || This->icns_image.imageData) + if (!This->initialized || This->icns_image) { hr = WINCODEC_ERR_WRONGSTATE; goto end; @@ -284,43 +299,41 @@ static HRESULT WINAPI IcnsFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, IcnsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface); HRESULT hr = S_OK; UINT i; - int ret; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); EnterCriticalSection(&This->encoder->lock); - if (!This->initialized || !This->width || !This->height) + if (!This->initialized || !This->size) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } - if (lineCount == 0 || lineCount + This->lines_written > This->height) + if (lineCount == 0 || lineCount + This->lines_written > This->size) { hr = E_INVALIDARG; goto end; } - if (!This->icns_image.imageData) + if (!This->icns_image) { - icns_icon_info_t icns_info; - icns_info.isImage = 1; - icns_info.iconWidth = This->width; - icns_info.iconHeight = This->height; - icns_info.iconBitDepth = 32; - icns_info.iconChannels = 4; - icns_info.iconPixelDepth = icns_info.iconBitDepth / icns_info.iconChannels; - This->icns_type = picns_get_type_from_image_info(icns_info); - if (This->icns_type == ICNS_NULL_TYPE) + switch (This->size) { - WARN("cannot generate ICNS icon from %dx%d image\n", This->width, This->height); - hr = E_INVALIDARG; - goto end; + case 16: This->icns_type = kIconServices16PixelDataARGB; break; + case 32: This->icns_type = kIconServices32PixelDataARGB; break; + case 48: This->icns_type = kIconServices48PixelDataARGB; break; + case 128: This->icns_type = kIconServices128PixelDataARGB; break; + case 256: This->icns_type = kIconServices256PixelDataARGB; break; + case 512: This->icns_type = kIconServices512PixelDataARGB; break; + default: + WARN("cannot generate ICNS icon from %dx%d image\n", This->size, This->size); + hr = E_INVALIDARG; + goto end; } - ret = picns_init_image_for_type(This->icns_type, &This->icns_image); - if (ret != ICNS_STATUS_OK) + This->icns_image = HeapAlloc(GetProcessHeap(), 0, This->size * This->size * 4); + if (!This->icns_image) { - WARN("error %d in icns_init_image_for_type\n", ret); + WARN("failed to allocate image buffer\n"); hr = E_FAIL; goto end; } @@ -331,14 +344,14 @@ static HRESULT WINAPI IcnsFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, BYTE *src_row, *dst_row; UINT j; src_row = pbPixels + cbStride * i; - dst_row = This->icns_image.imageData + (This->lines_written + i)*(This->width*4); + dst_row = This->icns_image + (This->lines_written + i)*(This->size*4); /* swap bgr -> rgb */ - for (j = 0; j < This->width*4; j += 4) + for (j = 0; j < This->size*4; j += 4) { - dst_row[j] = src_row[j+2]; - dst_row[j+1] = src_row[j+1]; - dst_row[j+2] = src_row[j]; - dst_row[j+3] = src_row[j+3]; + dst_row[j] = src_row[j+3]; + dst_row[j+1] = src_row[j+2]; + dst_row[j+2] = src_row[j+1]; + dst_row[j+3] = src_row[j]; } } This->lines_written += lineCount; @@ -360,7 +373,7 @@ static HRESULT WINAPI IcnsFrameEncode_WriteSource(IWICBitmapFrameEncode *iface, TRACE("(%p,%p,%p)\n", iface, pIBitmapSource, prc); - if (!This->initialized || !This->width || !This->height) + if (!This->initialized || !This->size) { hr = WINCODEC_ERR_WRONGSTATE; goto end; @@ -389,13 +402,13 @@ static HRESULT WINAPI IcnsFrameEncode_WriteSource(IWICBitmapFrameEncode *iface, prc = &rc; } - if (prc->Width != This->width) + if (prc->Width != This->size) { hr = E_INVALIDARG; goto end; } - stride = (32 * This->width + 7)/8; + stride = (32 * This->size + 7)/8; pixeldata = HeapAlloc(GetProcessHeap(), 0, stride * prc->Height); if (!pixeldata) { @@ -419,76 +432,37 @@ end: static HRESULT WINAPI IcnsFrameEncode_Commit(IWICBitmapFrameEncode *iface) { IcnsFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface); - icns_element_t *icns_element = NULL; - icns_image_t mask; - icns_element_t *mask_element = NULL; - int ret; - int i; + Handle handle; + OSErr ret; HRESULT hr = S_OK; TRACE("(%p): stub\n", iface); - memset(&mask, 0, sizeof(mask)); - EnterCriticalSection(&This->encoder->lock); - if (!This->icns_image.imageData || This->lines_written != This->height || This->committed) + if (!This->icns_image || This->lines_written != This->size || This->committed) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } - ret = picns_new_element_from_image(&This->icns_image, This->icns_type, &icns_element); - if (ret != ICNS_STATUS_OK && icns_element != NULL) + ret = PtrToHand(This->icns_image, &handle, This->size * This->size * 4); + if (ret != noErr || !handle) { - WARN("icns_new_element_from_image failed with error %d\n", ret); + WARN("PtrToHand failed with error %d\n", ret); hr = E_FAIL; goto end; } - if (This->icns_type != ICNS_512x512_32BIT_ARGB_DATA && This->icns_type != ICNS_256x256_32BIT_ARGB_DATA) - { - /* we need to write the mask too */ - ret = picns_init_image_for_type(picns_get_mask_type_for_icon_type(This->icns_type), &mask); - if (ret != ICNS_STATUS_OK) - { - WARN("icns_init_image_from_type failed to make mask, error %d\n", ret); - hr = E_FAIL; - goto end; - } - for (i = 0; i < mask.imageHeight; i++) - { - int j; - for (j = 0; j < mask.imageWidth; j++) - mask.imageData[i*mask.imageWidth + j] = This->icns_image.imageData[i*mask.imageWidth*4 + j*4 + 3]; - } - ret = picns_new_element_from_image(&mask, picns_get_mask_type_for_icon_type(This->icns_type), &mask_element); - if (ret != ICNS_STATUS_OK) - { - WARN("icns_new_element_from image failed to make element from mask, error %d\n", ret); - hr = E_FAIL; - goto end; - } - } + ret = SetIconFamilyData(This->encoder->icns_family, This->icns_type, handle); + DisposeHandle(handle); - ret = picns_set_element_in_family(&This->encoder->icns_family, icns_element); - if (ret != ICNS_STATUS_OK) - { - WARN("icns_set_element_in_family failed for image with error %d\n", ret); + if (ret != noErr) + { + WARN("SetIconFamilyData failed for image with error %d\n", ret); hr = E_FAIL; goto end; - } - - if (mask_element) - { - ret = picns_set_element_in_family(&This->encoder->icns_family, mask_element); - if (ret != ICNS_STATUS_OK) - { - WARN("icns_set_element_in_family failed for mask with error %d\n", ret); - hr = E_FAIL; - goto end; - } - } + } This->committed = TRUE; This->encoder->any_frame_committed = TRUE; @@ -496,9 +470,6 @@ static HRESULT WINAPI IcnsFrameEncode_Commit(IWICBitmapFrameEncode *iface) end: LeaveCriticalSection(&This->encoder->lock); - picns_free_image(&mask); - free(icns_element); - free(mask_element); return hr; } @@ -571,7 +542,7 @@ static ULONG WINAPI IcnsEncoder_Release(IWICBitmapEncoder *iface) This->lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->lock); if (This->icns_family) - free(This->icns_family); + DisposeHandle((Handle)This->icns_family); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This); @@ -584,7 +555,6 @@ static HRESULT WINAPI IcnsEncoder_Initialize(IWICBitmapEncoder *iface, IStream *pIStream, WICBitmapEncoderCacheOption cacheOption) { IcnsEncoder *This = impl_from_IWICBitmapEncoder(iface); - int ret; HRESULT hr = S_OK; TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption); @@ -596,10 +566,10 @@ static HRESULT WINAPI IcnsEncoder_Initialize(IWICBitmapEncoder *iface, hr = WINCODEC_ERR_WRONGSTATE; goto end; } - ret = picns_create_family(&This->icns_family); - if (ret != ICNS_STATUS_OK) + This->icns_family = (IconFamilyHandle)NewHandle(0); + if (!This->icns_family) { - WARN("error %d creating icns family\n", ret); + WARN("error creating icns family\n"); hr = E_FAIL; goto end; } @@ -682,9 +652,8 @@ static HRESULT WINAPI IcnsEncoder_CreateNewFrame(IWICBitmapEncoder *iface, frameEncode->encoder = This; frameEncode->ref = 1; frameEncode->initialized = FALSE; - frameEncode->width = 0; - frameEncode->height = 0; - memset(&frameEncode->icns_image, 0, sizeof(icns_image_t)); + frameEncode->size = 0; + frameEncode->icns_image = NULL; frameEncode->lines_written = 0; frameEncode->committed = FALSE; *ppIFrameEncode = &frameEncode->IWICBitmapFrameEncode_iface; @@ -700,9 +669,7 @@ end: static HRESULT WINAPI IcnsEncoder_Commit(IWICBitmapEncoder *iface) { IcnsEncoder *This = impl_from_IWICBitmapEncoder(iface); - icns_byte_t *buffer = NULL; - icns_size_t buffer_size; - int ret; + size_t buffer_size; HRESULT hr = S_OK; ULONG byteswritten; @@ -716,14 +683,8 @@ static HRESULT WINAPI IcnsEncoder_Commit(IWICBitmapEncoder *iface) goto end; } - ret = picns_export_family_data(This->icns_family, &buffer_size, &buffer); - if (ret != ICNS_STATUS_OK) - { - WARN("icns_export_family_data failed with error %d\n", ret); - hr = E_FAIL; - goto end; - } - hr = IStream_Write(This->stream, buffer, buffer_size, &byteswritten); + buffer_size = GetHandleSize((Handle)This->icns_family); + hr = IStream_Write(This->stream, *This->icns_family, buffer_size, &byteswritten); if (FAILED(hr) || byteswritten != buffer_size) { WARN("writing file failed, hr = 0x%08X\n", hr); @@ -735,7 +696,6 @@ static HRESULT WINAPI IcnsEncoder_Commit(IWICBitmapEncoder *iface) end: LeaveCriticalSection(&This->lock); - free(buffer); return hr; } @@ -773,12 +733,6 @@ HRESULT IcnsEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) if (pUnkOuter) return CLASS_E_NOAGGREGATION; - if (!libicns_handle && !load_libicns()) - { - ERR("Failed writing ICNS because unable to find %s\n",SONAME_LIBICNS); - return E_FAIL; - } - This = HeapAlloc(GetProcessHeap(), 0, sizeof(IcnsEncoder)); if (!This) return E_OUTOFMEMORY; @@ -798,7 +752,7 @@ HRESULT IcnsEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) return ret; } -#else /* !defined(SONAME_LIBICNS) */ +#else /* !defined(HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H) */ HRESULT IcnsEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) { diff --git a/include/config.h.in b/include/config.h.in index 8a526ea71ab..3af1424a071 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -21,6 +21,10 @@ /* Define to 1 if you have the header file. */ #undef HAVE_AL_AL_H +/* Define to 1 if you have the + header file. */ +#undef HAVE_APPLICATIONSERVICES_APPLICATIONSERVICES_H + /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H @@ -259,9 +263,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_HAL_LIBHAL_H -/* Define to 1 if you have the header file. */ -#undef HAVE_ICNS_H - /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H @@ -1216,9 +1217,6 @@ /* Define to the soname of the libhal library. */ #undef SONAME_LIBHAL -/* Define to the soname of the libicns library. */ -#undef SONAME_LIBICNS - /* Define to the soname of the libjack library. */ #undef SONAME_LIBJACK