Vincent Povirk : windowscodecs: Implement IWICPixelFormatInfo:: GetChannelMask.

Alexandre Julliard julliard at winehq.org
Mon Jun 25 13:24:15 CDT 2012


Module: wine
Branch: master
Commit: 0648e09f3c8cc5d8a2661dc17817b12ac8738005
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0648e09f3c8cc5d8a2661dc17817b12ac8738005

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Wed Jun 13 10:11:53 2012 -0500

windowscodecs: Implement IWICPixelFormatInfo::GetChannelMask.

---

 dlls/windowscodecs/info.c |   39 +++++++++++++++++++++++++++++++++++++--
 1 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c
index b520f82..f6c7fd0 100644
--- a/dlls/windowscodecs/info.c
+++ b/dlls/windowscodecs/info.c
@@ -48,6 +48,7 @@ static const WCHAR vendor_valuename[] = {'V','e','n','d','o','r',0};
 static const WCHAR version_valuename[] = {'V','e','r','s','i','o','n',0};
 static const WCHAR bitsperpixel_valuename[] = {'B','i','t','L','e','n','g','t','h',0};
 static const WCHAR channelcount_valuename[] = {'C','h','a','n','n','e','l','C','o','u','n','t',0};
+static const WCHAR channelmasks_keyname[] = {'C','h','a','n','n','e','l','M','a','s','k','s',0};
 
 static HRESULT ComponentInfo_GetStringValue(HKEY classkey, LPCWSTR value,
     UINT buffer_size, WCHAR *buffer, UINT *actual_size)
@@ -1274,8 +1275,42 @@ static HRESULT WINAPI PixelFormatInfo_GetChannelCount(IWICPixelFormatInfo2 *ifac
 static HRESULT WINAPI PixelFormatInfo_GetChannelMask(IWICPixelFormatInfo2 *iface,
     UINT uiChannelIndex, UINT cbMaskBuffer, BYTE *pbMaskBuffer, UINT *pcbActual)
 {
-    FIXME("(%p,%u,%u,%p,%p): stub\n", iface, uiChannelIndex, cbMaskBuffer, pbMaskBuffer, pcbActual);
-    return E_NOTIMPL;
+    static const WCHAR uintformatW[] = {'%','u',0};
+    PixelFormatInfo *This = impl_from_IWICPixelFormatInfo2(iface);
+    UINT channel_count;
+    HRESULT hr;
+    LONG ret;
+    WCHAR valuename[11];
+    DWORD cbData;
+
+    TRACE("(%p,%u,%u,%p,%p)\n", iface, uiChannelIndex, cbMaskBuffer, pbMaskBuffer, pcbActual);
+
+    if (!pcbActual)
+        return E_INVALIDARG;
+
+    hr = PixelFormatInfo_GetChannelCount(iface, &channel_count);
+
+    if (SUCCEEDED(hr) && uiChannelIndex >= channel_count)
+        hr = E_INVALIDARG;
+
+    if (SUCCEEDED(hr))
+    {
+        snprintfW(valuename, 11, uintformatW, uiChannelIndex);
+
+        cbData = cbMaskBuffer;
+
+        ret = RegGetValueW(This->classkey, channelmasks_keyname, valuename, RRF_RT_REG_BINARY, NULL, pbMaskBuffer, &cbData);
+
+        if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA)
+            *pcbActual = cbData;
+
+        if (ret == ERROR_MORE_DATA)
+            hr = E_INVALIDARG;
+        else
+            hr = HRESULT_FROM_WIN32(ret);
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI PixelFormatInfo_SupportsTransparency(IWICPixelFormatInfo2 *iface,




More information about the wine-cvs mailing list