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 |