Index: src/utils/win/SkDWriteFontFileStream.cpp |
=================================================================== |
--- src/utils/win/SkDWriteFontFileStream.cpp (revision 9222) |
+++ src/utils/win/SkDWriteFontFileStream.cpp (working copy) |
@@ -8,6 +8,7 @@ |
#include "SkTypes.h" |
#include "SkDWriteFontFileStream.h" |
#include "SkHRESULT.h" |
+#include "SkTScopedComPtr.h" |
#include <dwrite.h> |
#include <limits> |
@@ -16,11 +17,10 @@ |
// SkIDWriteFontFileStream |
SkDWriteFontFileStream::SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream) |
- : fFontFileStream(fontFileStream) |
+ : fFontFileStream(SkRefComPtr(fontFileStream)) |
, fPos(0) |
, fLockedMemory(NULL) |
, fFragmentLock(NULL) { |
- fontFileStream->AddRef(); |
} |
SkDWriteFontFileStream::~SkDWriteFontFileStream() { |
@@ -29,44 +29,19 @@ |
} |
} |
-const void* SkDWriteFontFileStream::getMemoryBase() { |
- if (fLockedMemory) { |
- return fLockedMemory; |
- } |
- |
- UINT64 fileSize; |
- HRNM(fFontFileStream->GetFileSize(&fileSize), "Could not get file size"); |
- HRNM(fFontFileStream->ReadFileFragment(&fLockedMemory, 0, fileSize, &fFragmentLock), |
- "Could not lock file fragment."); |
- return fLockedMemory; |
-} |
- |
-bool SkDWriteFontFileStream::rewind() { |
- fPos = 0; |
- return true; |
-} |
- |
size_t SkDWriteFontFileStream::read(void* buffer, size_t size) { |
HRESULT hr = S_OK; |
if (NULL == buffer) { |
- UINT64 realFileSize = 0; |
- hr = fFontFileStream->GetFileSize(&realFileSize); |
- if (realFileSize > (std::numeric_limits<size_t>::max)()) { |
- return 0; |
- } |
- size_t fileSize = static_cast<size_t>(realFileSize); |
- if (size == 0) { |
- return fileSize; |
+ size_t fileSize = this->getLength(); |
+ |
+ if (fPos + size > fileSize) { |
+ size_t skipped = fileSize - fPos; |
+ fPos = fileSize; |
+ return skipped; |
} else { |
- if (fPos + size > fileSize) { |
- size_t skipped = fileSize - fPos; |
- fPos = fileSize; |
- return skipped; |
- } else { |
- fPos += size; |
- return size; |
- } |
+ fPos += size; |
+ return size; |
} |
} |
@@ -81,29 +56,79 @@ |
} |
//The read may have failed because we asked for too much data. |
+ size_t fileSize = this->getLength(); |
+ if (fPos + size <= fileSize) { |
+ //This means we were within bounds, but failed for some other reason. |
+ return 0; |
+ } |
+ |
+ size_t read = fileSize - fPos; |
+ hr = fFontFileStream->ReadFileFragment(&start, fPos, read, &fragmentLock); |
+ if (SUCCEEDED(hr)) { |
+ memcpy(buffer, start, read); |
+ fFontFileStream->ReleaseFileFragment(fragmentLock); |
+ fPos = fileSize; |
+ return read; |
+ } |
+ |
+ return 0; |
+} |
+ |
+bool SkDWriteFontFileStream::atEnd() const { |
+ return fPos == this->getLength(); |
+} |
+ |
+bool SkDWriteFontFileStream::rewind() { |
+ fPos = 0; |
+ return true; |
+} |
+ |
+SkDWriteFontFileStream* SkDWriteFontFileStream::duplicate() const { |
+ return SkNEW_ARGS(SkDWriteFontFileStream, (fFontFileStream.get())); |
+} |
+ |
+size_t SkDWriteFontFileStream::getPosition() const { |
+ return fPos; |
+} |
+ |
+bool SkDWriteFontFileStream::seek(size_t position) { |
+ size_t length = this->getLength(); |
+ fPos = (position > length) ? length : position; |
+ return true; |
+} |
+ |
+bool SkDWriteFontFileStream::move(long offset) { |
+ return seek(fPos + offset); |
+} |
+ |
+SkDWriteFontFileStream* SkDWriteFontFileStream::fork() const { |
+ SkAutoTUnref<SkDWriteFontFileStream> that(this->duplicate()); |
+ that->seek(fPos); |
+ return that.detach(); |
+} |
+ |
+size_t SkDWriteFontFileStream::getLength() const { |
+ HRESULT hr = S_OK; |
UINT64 realFileSize = 0; |
hr = fFontFileStream->GetFileSize(&realFileSize); |
if (realFileSize > (std::numeric_limits<size_t>::max)()) { |
return 0; |
} |
- size_t fileSize = static_cast<size_t>(realFileSize); |
- if (fPos + size > fileSize) { |
- size_t read = fileSize - fPos; |
- hr = fFontFileStream->ReadFileFragment(&start, fPos, read, &fragmentLock); |
- if (SUCCEEDED(hr)) { |
- memcpy(buffer, start, read); |
- fFontFileStream->ReleaseFileFragment(fragmentLock); |
- fPos = fileSize; |
- return read; |
- } |
- return 0; |
- } else { |
- //This means we were within bounds, but failed for some other reason. |
- return 0; |
+ return static_cast<size_t>(realFileSize); |
+} |
+ |
+const void* SkDWriteFontFileStream::getMemoryBase() { |
+ if (fLockedMemory) { |
+ return fLockedMemory; |
} |
+ |
+ UINT64 fileSize; |
+ HRNM(fFontFileStream->GetFileSize(&fileSize), "Could not get file size"); |
+ HRNM(fFontFileStream->ReadFileFragment(&fLockedMemory, 0, fileSize, &fFragmentLock), |
+ "Could not lock file fragment."); |
+ return fLockedMemory; |
} |
- |
/////////////////////////////////////////////////////////////////////////////// |
// SkIDWriteFontFileStreamWrapper |
@@ -116,8 +141,7 @@ |
} |
SkDWriteFontFileStreamWrapper::SkDWriteFontFileStreamWrapper(SkStream* stream) |
- : fRefCount(1), fStream(stream) { |
- stream->ref(); |
+ : fRefCount(1), fStream(SkRef(stream)) { |
} |
HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::QueryInterface(REFIID iid, void** ppvObject) { |
@@ -180,7 +204,7 @@ |
if (fStream->skip(static_cast<size_t>(fileOffset)) != fileOffset) { |
return E_FAIL; |
} |
- SkAutoTDeleteArray<uint8_t> streamData(new uint8_t[static_cast<size_t>(fragmentSize)]); |
+ SkAutoTMalloc<uint8_t> streamData(static_cast<size_t>(fragmentSize)); |
if (fStream->read(streamData.get(), static_cast<size_t>(fragmentSize)) != fragmentSize) { |
return E_FAIL; |
} |
@@ -192,10 +216,7 @@ |
} |
void STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::ReleaseFileFragment(void* fragmentContext) { |
- if (NULL == fragmentContext) { |
- return; |
- } |
- delete [] fragmentContext; |
+ sk_free(fragmentContext); |
} |
HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::GetFileSize(UINT64* fileSize) { |