| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
| 9 #include "SkDWriteFontFileStream.h" | 9 #include "SkDWriteFontFileStream.h" |
| 10 #include "SkHRESULT.h" | 10 #include "SkHRESULT.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 UINT64 fileSize; | 126 UINT64 fileSize; |
| 127 HRNM(fFontFileStream->GetFileSize(&fileSize), "Could not get file size"); | 127 HRNM(fFontFileStream->GetFileSize(&fileSize), "Could not get file size"); |
| 128 HRNM(fFontFileStream->ReadFileFragment(&fLockedMemory, 0, fileSize, &fFragme
ntLock), | 128 HRNM(fFontFileStream->ReadFileFragment(&fLockedMemory, 0, fileSize, &fFragme
ntLock), |
| 129 "Could not lock file fragment."); | 129 "Could not lock file fragment."); |
| 130 return fLockedMemory; | 130 return fLockedMemory; |
| 131 } | 131 } |
| 132 | 132 |
| 133 /////////////////////////////////////////////////////////////////////////////// | 133 /////////////////////////////////////////////////////////////////////////////// |
| 134 // SkIDWriteFontFileStreamWrapper | 134 // SkIDWriteFontFileStreamWrapper |
| 135 | 135 |
| 136 HRESULT SkDWriteFontFileStreamWrapper::Create(SkStream* stream, SkDWriteFontFile
StreamWrapper** streamFontFileStream) { | 136 HRESULT SkDWriteFontFileStreamWrapper::Create(SkStreamAsset* stream, |
| 137 SkDWriteFontFileStreamWrapper** st
reamFontFileStream) |
| 138 { |
| 137 *streamFontFileStream = new SkDWriteFontFileStreamWrapper(stream); | 139 *streamFontFileStream = new SkDWriteFontFileStreamWrapper(stream); |
| 138 if (NULL == streamFontFileStream) { | 140 if (NULL == streamFontFileStream) { |
| 139 return E_OUTOFMEMORY; | 141 return E_OUTOFMEMORY; |
| 140 } | 142 } |
| 141 return S_OK; | 143 return S_OK; |
| 142 } | 144 } |
| 143 | 145 |
| 144 SkDWriteFontFileStreamWrapper::SkDWriteFontFileStreamWrapper(SkStream* stream) | 146 SkDWriteFontFileStreamWrapper::SkDWriteFontFileStreamWrapper(SkStreamAsset* stre
am) |
| 145 : fRefCount(1), fStream(stream) { | 147 : fRefCount(1), fStream(stream) { |
| 146 } | 148 } |
| 147 | 149 |
| 148 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::QueryInterface(REFIID i
id, void** ppvObject) { | 150 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::QueryInterface(REFIID i
id, void** ppvObject) { |
| 149 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) { | 151 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) { |
| 150 *ppvObject = this; | 152 *ppvObject = this; |
| 151 AddRef(); | 153 AddRef(); |
| 152 return S_OK; | 154 return S_OK; |
| 153 } else { | 155 } else { |
| 154 *ppvObject = NULL; | 156 *ppvObject = NULL; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 if (!SkTFitsIn<size_t>(fileOffset + fragmentSize)) { | 188 if (!SkTFitsIn<size_t>(fileOffset + fragmentSize)) { |
| 187 return E_FAIL; | 189 return E_FAIL; |
| 188 } | 190 } |
| 189 | 191 |
| 190 const void* data = fStream->getMemoryBase(); | 192 const void* data = fStream->getMemoryBase(); |
| 191 if (data) { | 193 if (data) { |
| 192 *fragmentStart = static_cast<BYTE const*>(data) + static_cast<size_t>(fi
leOffset); | 194 *fragmentStart = static_cast<BYTE const*>(data) + static_cast<size_t>(fi
leOffset); |
| 193 *fragmentContext = NULL; | 195 *fragmentContext = NULL; |
| 194 | 196 |
| 195 } else { | 197 } else { |
| 196 //May be called from multiple threads. | 198 // May be called from multiple threads. |
| 197 SkAutoMutexAcquire ama(fStreamMutex); | 199 SkAutoMutexAcquire ama(fStreamMutex); |
| 198 | 200 |
| 199 *fragmentStart = NULL; | 201 *fragmentStart = NULL; |
| 200 *fragmentContext = NULL; | 202 *fragmentContext = NULL; |
| 201 | 203 |
| 202 if (!fStream->rewind()) { | 204 if (!fStream->seek(static_cast<size_t>(fileOffset))) { |
| 203 return E_FAIL; | |
| 204 } | |
| 205 if (fStream->skip(static_cast<size_t>(fileOffset)) != fileOffset) { | |
| 206 return E_FAIL; | 205 return E_FAIL; |
| 207 } | 206 } |
| 208 SkAutoTMalloc<uint8_t> streamData(static_cast<size_t>(fragmentSize)); | 207 SkAutoTMalloc<uint8_t> streamData(static_cast<size_t>(fragmentSize)); |
| 209 if (fStream->read(streamData.get(), static_cast<size_t>(fragmentSize)) !
= fragmentSize) { | 208 if (fStream->read(streamData.get(), static_cast<size_t>(fragmentSize)) !
= fragmentSize) { |
| 210 return E_FAIL; | 209 return E_FAIL; |
| 211 } | 210 } |
| 212 | 211 |
| 213 *fragmentStart = streamData.get(); | 212 *fragmentStart = streamData.get(); |
| 214 *fragmentContext = streamData.detach(); | 213 *fragmentContext = streamData.detach(); |
| 215 } | 214 } |
| 216 return S_OK; | 215 return S_OK; |
| 217 } | 216 } |
| 218 | 217 |
| 219 void STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::ReleaseFileFragment(void*
fragmentContext) { | 218 void STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::ReleaseFileFragment(void*
fragmentContext) { |
| 220 sk_free(fragmentContext); | 219 sk_free(fragmentContext); |
| 221 } | 220 } |
| 222 | 221 |
| 223 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::GetFileSize(UINT64* fil
eSize) { | 222 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::GetFileSize(UINT64* fil
eSize) { |
| 224 *fileSize = fStream->getLength(); | 223 *fileSize = fStream->getLength(); |
| 225 return S_OK; | 224 return S_OK; |
| 226 } | 225 } |
| 227 | 226 |
| 228 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::GetLastWriteTime(UINT64
* lastWriteTime) { | 227 HRESULT STDMETHODCALLTYPE SkDWriteFontFileStreamWrapper::GetLastWriteTime(UINT64
* lastWriteTime) { |
| 229 // The concept of last write time does not apply to this loader. | 228 // The concept of last write time does not apply to this loader. |
| 230 *lastWriteTime = 0; | 229 *lastWriteTime = 0; |
| 231 return E_NOTIMPL; | 230 return E_NOTIMPL; |
| 232 } | 231 } |
| OLD | NEW |