Vincent Povirk : windowscodecs: Implement IWICBitmapDecoderInfo:: MatchesPattern.
Alexandre Julliard
julliard at winehq.org
Wed Aug 5 09:48:14 CDT 2009
Module: wine
Branch: master
Commit: a13899cc90ad5f0823d952f4c998c26feffed142
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a13899cc90ad5f0823d952f4c998c26feffed142
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Tue Jul 28 16:58:47 2009 -0500
windowscodecs: Implement IWICBitmapDecoderInfo::MatchesPattern.
---
dlls/windowscodecs/info.c | 73 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/info.c b/dlls/windowscodecs/info.c
index 39b522f..12eb4f0 100644
--- a/dlls/windowscodecs/info.c
+++ b/dlls/windowscodecs/info.c
@@ -330,8 +330,77 @@ static HRESULT WINAPI BitmapDecoderInfo_GetPatterns(IWICBitmapDecoderInfo *iface
static HRESULT WINAPI BitmapDecoderInfo_MatchesPattern(IWICBitmapDecoderInfo *iface,
IStream *pIStream, BOOL *pfMatches)
{
- FIXME("(%p,%p,%p): stub\n", iface, pIStream, pfMatches);
- return E_NOTIMPL;
+ WICBitmapPattern *patterns;
+ UINT pattern_count=0, patterns_size=0;
+ HRESULT hr;
+ int i, pos;
+ BYTE *data=NULL;
+ ULONG datasize=0;
+ ULONG bytesread;
+ LARGE_INTEGER seekpos;
+
+ TRACE("(%p,%p,%p)\n", iface, pIStream, pfMatches);
+
+ hr = BitmapDecoderInfo_GetPatterns(iface, 0, NULL, &pattern_count, &patterns_size);
+ if (FAILED(hr)) return hr;
+
+ patterns = HeapAlloc(GetProcessHeap(), 0, patterns_size);
+ if (!patterns) return E_OUTOFMEMORY;
+
+ hr = BitmapDecoderInfo_GetPatterns(iface, patterns_size, patterns, &pattern_count, &patterns_size);
+ if (FAILED(hr)) goto end;
+
+ for (i=0; i<pattern_count; i++)
+ {
+ if (datasize < patterns[i].Length)
+ {
+ HeapFree(GetProcessHeap(), 0, data);
+ datasize = patterns[i].Length;
+ data = HeapAlloc(GetProcessHeap(), 0, patterns[i].Length);
+ if (!data)
+ {
+ hr = E_OUTOFMEMORY;
+ break;
+ }
+ }
+
+ if (patterns[i].EndOfStream)
+ seekpos.QuadPart = -patterns[i].Position.QuadPart;
+ else
+ seekpos.QuadPart = patterns[i].Position.QuadPart;
+ hr = IStream_Seek(pIStream, seekpos, patterns[i].EndOfStream ? STREAM_SEEK_END : STREAM_SEEK_SET, NULL);
+ if (hr == STG_E_INVALIDFUNCTION) continue; /* before start of stream */
+ if (FAILED(hr)) break;
+
+ hr = IStream_Read(pIStream, data, patterns[i].Length, &bytesread);
+ if (hr == S_FALSE || (hr == S_OK && bytesread != patterns[i].Length)) /* past end of stream */
+ continue;
+ if (FAILED(hr)) break;
+
+ for (pos=0; pos<patterns[i].Length; pos++)
+ {
+ if ((data[pos] & patterns[i].Mask[pos]) != patterns[i].Pattern[pos])
+ break;
+ }
+ if (pos == patterns[i].Length) /* matches pattern */
+ {
+ hr = S_OK;
+ *pfMatches = TRUE;
+ break;
+ }
+ }
+
+ if (i == pattern_count) /* does not match any pattern */
+ {
+ hr = S_OK;
+ *pfMatches = FALSE;
+ }
+
+end:
+ HeapFree(GetProcessHeap(), 0, patterns);
+ HeapFree(GetProcessHeap(), 0, data);
+
+ return hr;
}
static HRESULT WINAPI BitmapDecoderInfo_CreateInstance(IWICBitmapDecoderInfo *iface,
More information about the wine-cvs
mailing list