[PATCH 5/7] windowscodecs: Support Seek() for memory streams in IWICStream
Tony Wasserka
tony.wasserka at freenet.de
Mon Aug 17 10:59:10 CDT 2009
---
dlls/windowscodecs/stream.c | 19 +++++++++++++++++--
1 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/stream.c b/dlls/windowscodecs/stream.c
index d3e968c..ef9b5da 100644
--- a/dlls/windowscodecs/stream.c
+++ b/dlls/windowscodecs/stream.c
@@ -110,8 +110,23 @@ static HRESULT WINAPI StreamOnMemory_Write(IStream *iface,
static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface,
LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
- FIXME("(%p): stub\n", iface);
- return E_NOTIMPL;
+ StreamOnMemory *This = (StreamOnMemory*)iface;
+ LARGE_INTEGER NewPosition;
+ TRACE("(%p)\n", This);
+
+ if (dlibMove.QuadPart > 0xFFFFFFFF) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
+
+ if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart;
+ else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart;
+ else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart;
+ else return E_INVALIDARG;
+
+ if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG;
+ if (NewPosition.QuadPart < 0) return E_INVALIDARG;
+ This->dwCurPos = NewPosition.LowPart;
+
+ if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos;
+ return S_OK;
}
/* SetSize isn't implemented in the native windowscodecs DLL either */
--
1.6.3.3
--------------050205060100050502060807--
More information about the wine-patches
mailing list