aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/win/SkIStream.cpp
diff options
context:
space:
mode:
authorGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-13 00:06:17 +0000
committerGravatar bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-08-13 00:06:17 +0000
commit60157927e37fcf427617027306b9395a1371f98a (patch)
tree6908df0a7df7e04366ab3f59ddd0e819604da47d /src/utils/win/SkIStream.cpp
parentff8a166e292871d70fddcf6128a00cccfba68250 (diff)
Make SkIStream closer to spec, to work with more consumers.
git-svn-id: http://skia.googlecode.com/svn/trunk@2109 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/utils/win/SkIStream.cpp')
-rw-r--r--src/utils/win/SkIStream.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/utils/win/SkIStream.cpp b/src/utils/win/SkIStream.cpp
index 4d5cd7711e..79164e6a31 100644
--- a/src/utils/win/SkIStream.cpp
+++ b/src/utils/win/SkIStream.cpp
@@ -107,7 +107,10 @@ SkIStream::SkIStream(SkStream* stream, bool unrefOnRelease)
: SkBaseIStream()
, fSkStream(stream)
, fUnrefOnRelease(unrefOnRelease)
-{ }
+ , fLocation()
+{
+ this->fSkStream->rewind();
+}
SkIStream::~SkIStream() {
if (NULL != this->fSkStream && fUnrefOnRelease) {
@@ -126,6 +129,7 @@ HRESULT SkIStream::CreateFromSkStream(SkStream* stream
// ISequentialStream Interface
HRESULT STDMETHODCALLTYPE SkIStream::Read(void* pv, ULONG cb, ULONG* pcbRead) {
*pcbRead = this->fSkStream->read(pv, cb);
+ this->fLocation.QuadPart += *pcbRead;
return (*pcbRead == cb) ? S_OK : S_FALSE;
}
@@ -141,11 +145,8 @@ HRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
, DWORD dwOrigin
, ULARGE_INTEGER* lpNewFilePointer)
{
- if (lpNewFilePointer != NULL) {
- (*lpNewFilePointer).QuadPart = NULL;
- }
-
HRESULT hr = S_OK;
+
switch(dwOrigin) {
case STREAM_SEEK_SET: {
if (!this->fSkStream->rewind()) {
@@ -154,6 +155,7 @@ HRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
size_t skipped = this->fSkStream->skip(
liDistanceToMove.QuadPart
);
+ this->fLocation.QuadPart = skipped;
if (skipped != liDistanceToMove.QuadPart) {
hr = E_FAIL;
}
@@ -162,6 +164,7 @@ HRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
}
case STREAM_SEEK_CUR: {
size_t skipped = this->fSkStream->skip(liDistanceToMove.QuadPart);
+ this->fLocation.QuadPart += skipped;
if (skipped != liDistanceToMove.QuadPart) {
hr = E_FAIL;
}
@@ -171,10 +174,11 @@ HRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
if (!this->fSkStream->rewind()) {
hr = E_FAIL;
} else {
- size_t skipped = this->fSkStream->skip(
- this->fSkStream->getLength() + liDistanceToMove.QuadPart
- );
- if (skipped != liDistanceToMove.QuadPart) {
+ LONGLONG skip = this->fSkStream->getLength()
+ + liDistanceToMove.QuadPart;
+ size_t skipped = this->fSkStream->skip(skip);
+ this->fLocation.QuadPart = skipped;
+ if (skipped != skip) {
hr = E_FAIL;
}
}
@@ -185,6 +189,9 @@ HRESULT STDMETHODCALLTYPE SkIStream::Seek(LARGE_INTEGER liDistanceToMove
break;
}
+ if (NULL != lpNewFilePointer) {
+ lpNewFilePointer->QuadPart = this->fLocation.QuadPart;
+ }
return hr;
}