Module: wine Branch: master Commit: bb83fb264b3cee27d8b7abae467d35d6b916f9f6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb83fb264b3cee27d8b7abae46...
Author: Tony Wasserka tony.wasserka@freenet.de Date: Fri Aug 21 11:07:37 2009 +0200
windowscodecs: Support reading from memory streams in IWICStream.
---
dlls/windowscodecs/stream.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/stream.c b/dlls/windowscodecs/stream.c index 6e28ae9..f1af925 100644 --- a/dlls/windowscodecs/stream.c +++ b/dlls/windowscodecs/stream.c @@ -37,6 +37,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); typedef struct StreamOnMemory { const IStreamVtbl *lpVtbl; LONG ref; + + BYTE *pbMemory; + DWORD dwMemsize; + DWORD dwCurPos; } StreamOnMemory;
static HRESULT WINAPI StreamOnMemory_QueryInterface(IStream *iface, @@ -86,8 +90,18 @@ static ULONG WINAPI StreamOnMemory_Release(IStream *iface) static HRESULT WINAPI StreamOnMemory_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead) { - FIXME("(%p): stub\n", iface); - return E_NOTIMPL; + StreamOnMemory *This = (StreamOnMemory*)iface; + ULONG uBytesRead; + TRACE("(%p)\n", This); + + if (!pv) return E_INVALIDARG; + + uBytesRead = min(cb, This->dwMemsize - This->dwCurPos); + memcpy(pv, This->pbMemory + This->dwCurPos, uBytesRead); + This->dwCurPos += uBytesRead; + if (pcbRead) *pcbRead = uBytesRead; + + return S_OK; }
static HRESULT WINAPI StreamOnMemory_Write(IStream *iface, @@ -400,6 +414,9 @@ static HRESULT WINAPI IWICStreamImpl_InitializeFromMemory(IWICStream *iface,
pObject->lpVtbl = &StreamOnMemory_Vtbl; pObject->ref = 1; + pObject->pbMemory = pbBuffer; + pObject->dwMemsize = cbBufferSize; + pObject->dwCurPos = 0;
This->pStream = (IStream*)pObject; return S_OK;