From d009e304101dd78c0ae222ec955140f765e77924 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Tue, 28 Jul 2009 16:21:12 -0500 Subject: [PATCH] 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= 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, -- 1.5.4.3