Vincent Povirk : windowscodecs: Implement IWICBitmapDecoderInfo:: GetPatterns.

Alexandre Julliard julliard at winehq.org
Wed Aug 5 09:48:12 CDT 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue Jul 28 16:21:12 2009 -0500

windowscodecs: Implement IWICBitmapDecoderInfo::GetPatterns.

---

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

diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c
index c3895da..db77232 100644
--- a/dlls/windowscodecs/info.c
+++ b/dlls/windowscodecs/info.c
@@ -31,6 +31,7 @@
 #include "wincodecs_private.h"
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wincodecs);
 
@@ -233,8 +234,97 @@ static HRESULT WINAPI BitmapDecoderInfo_MatchesMimeType(IWICBitmapDecoderInfo *i
 static HRESULT WINAPI BitmapDecoderInfo_GetPatterns(IWICBitmapDecoderInfo *iface,
     UINT cbSizePatterns, WICBitmapPattern *pPatterns, UINT *pcPatterns, UINT *pcbPatternsActual)
 {
-    FIXME("(%p,%i,%p,%p,%p): stub\n", iface, cbSizePatterns, pPatterns, pcPatterns, pcbPatternsActual);
-    return E_NOTIMPL;
+    BitmapDecoderInfo *This = (BitmapDecoderInfo*)iface;
+    UINT pattern_count=0, patterns_size=0;
+    WCHAR subkeyname[11];
+    LONG res;
+    HKEY patternskey, patternkey;
+    static const WCHAR uintformatW[] = {'%','u',0};
+    static const WCHAR patternsW[] = {'P','a','t','t','e','r','n','s',0};
+    static const WCHAR positionW[] = {'P','o','s','i','t','i','o','n',0};
+    static const WCHAR lengthW[] = {'L','e','n','g','t','h',0};
+    static const WCHAR patternW[] = {'P','a','t','t','e','r','n',0};
+    static const WCHAR maskW[] = {'M','a','s','k',0};
+    static const WCHAR endofstreamW[] = {'E','n','d','O','f','S','t','r','e','a','m',0};
+    HRESULT hr=S_OK;
+    UINT i;
+    BYTE *bPatterns=(BYTE*)pPatterns;
+    DWORD length, valuesize;
+
+    TRACE("(%p,%i,%p,%p,%p)\n", iface, cbSizePatterns, pPatterns, pcPatterns, pcbPatternsActual);
+
+    res = RegOpenKeyExW(This->classkey, patternsW, 0, KEY_READ, &patternskey);
+    if (res != ERROR_SUCCESS) return HRESULT_FROM_WIN32(res);
+
+    res = RegQueryInfoKeyW(patternskey, NULL, NULL, NULL, &pattern_count, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+    if (res == ERROR_SUCCESS)
+    {
+        patterns_size = pattern_count * sizeof(WICBitmapPattern);
+
+        for (i=0; i<pattern_count; i++)
+        {
+            snprintfW(subkeyname, 11, uintformatW, i);
+            res = RegOpenKeyExW(patternskey, subkeyname, 0, KEY_READ, &patternkey);
+            if (res == ERROR_SUCCESS)
+            {
+                valuesize = sizeof(ULONG);
+                res = RegGetValueW(patternkey, NULL, lengthW, RRF_RT_DWORD, NULL,
+                    &length, &valuesize);
+                patterns_size += length*2;
+
+                if ((cbSizePatterns >= patterns_size) && (res == ERROR_SUCCESS))
+                {
+                    pPatterns[i].Length = length;
+
+                    pPatterns[i].EndOfStream = 0;
+                    valuesize = sizeof(BOOL);
+                    RegGetValueW(patternkey, NULL, endofstreamW, RRF_RT_DWORD, NULL,
+                        &pPatterns[i].EndOfStream, &valuesize);
+
+                    pPatterns[i].Position.QuadPart = 0;
+                    valuesize = sizeof(ULARGE_INTEGER);
+                    res = RegGetValueW(patternkey, NULL, positionW, RRF_RT_DWORD|RRF_RT_QWORD, NULL,
+                        &pPatterns[i].Position, &valuesize);
+
+                    if (res == ERROR_SUCCESS)
+                    {
+                        pPatterns[i].Pattern = bPatterns+patterns_size-length*2;
+                        valuesize = length;
+                        res = RegGetValueW(patternkey, NULL, patternW, RRF_RT_REG_BINARY, NULL,
+                            pPatterns[i].Pattern, &valuesize);
+                    }
+
+                    if (res == ERROR_SUCCESS)
+                    {
+                        pPatterns[i].Mask = bPatterns+patterns_size-length;
+                        valuesize = length;
+                        res = RegGetValueW(patternkey, NULL, maskW, RRF_RT_REG_BINARY, NULL,
+                            pPatterns[i].Mask, &valuesize);
+                    }
+                }
+
+                RegCloseKey(patternkey);
+            }
+            if (res != ERROR_SUCCESS)
+            {
+                hr = HRESULT_FROM_WIN32(res);
+                break;
+            }
+        }
+    }
+    else hr = HRESULT_FROM_WIN32(res);
+
+    RegCloseKey(patternskey);
+
+    if (hr == S_OK)
+    {
+        *pcPatterns = pattern_count;
+        *pcbPatternsActual = patterns_size;
+        if (pPatterns && cbSizePatterns < patterns_size)
+            hr = WINCODEC_ERR_INSUFFICIENTBUFFER;
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI BitmapDecoderInfo_MatchesPattern(IWICBitmapDecoderInfo *iface,




More information about the wine-cvs mailing list