8#if defined(SK_BUILD_FOR_WIN)
25 : fFontFileStream(SkRefComPtr(fontFileStream))
27 , fLockedMemory(nullptr)
28 , fFragmentLock(nullptr) {
33 fFontFileStream->ReleaseFileFragment(fFragmentLock);
43 if (fPos + size > fileSize) {
44 size_t skipped = fileSize - fPos;
55 hr = fFontFileStream->ReadFileFragment(&
start, fPos, size, &fragmentLock);
58 fFontFileStream->ReleaseFileFragment(fragmentLock);
65 if (fPos + size <= fileSize) {
70 size_t read = fileSize - fPos;
71 hr = fFontFileStream->ReadFileFragment(&
start, fPos,
read, &fragmentLock);
74 fFontFileStream->ReleaseFileFragment(fragmentLock);
110 std::unique_ptr<SkDWriteFontFileStream> that(this->
duplicate());
112 return that.release();
116 UINT64 realFileSize = 0;
117 fFontFileStream->GetFileSize(&realFileSize);
118 if (!SkTFitsIn<size_t>(realFileSize)) {
121 return static_cast<size_t>(realFileSize);
126 return fLockedMemory;
130 HRNM(fFontFileStream->GetFileSize(&fileSize),
"Could not get file size");
131 HRNM(fFontFileStream->ReadFileFragment(&fLockedMemory, 0, fileSize, &fFragmentLock),
132 "Could not lock file fragment.");
133 return fLockedMemory;
143 if (
nullptr == *streamFontFileStream) {
144 return E_OUTOFMEMORY;
149SkDWriteFontFileStreamWrapper::SkDWriteFontFileStreamWrapper(
SkStreamAsset* stream)
150 : fRefCount(1), fStream(
stream) {
154 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
159 *ppvObject =
nullptr;
160 return E_NOINTERFACE;
165 return InterlockedIncrement(&fRefCount);
169 ULONG newCount = InterlockedDecrement(&fRefCount);
177 void const** fragmentStart,
180 void** fragmentContext)
185 if (fileOffset > fileSize || fragmentSize > fileSize - fileOffset) {
186 *fragmentStart =
nullptr;
187 *fragmentContext =
nullptr;
191 if (!SkTFitsIn<size_t>(fileOffset + fragmentSize)) {
195 const void*
data = fStream->getMemoryBase();
197 *fragmentStart =
static_cast<BYTE const*
>(
data) +
static_cast<size_t>(fileOffset);
198 *fragmentContext =
nullptr;
204 *fragmentStart =
nullptr;
205 *fragmentContext =
nullptr;
207 if (!fStream->seek(
static_cast<size_t>(fileOffset))) {
211 if (fStream->read(streamData.get(),
static_cast<size_t>(fragmentSize)) != fragmentSize) {
215 *fragmentStart = streamData.get();
216 *fragmentContext = streamData.release();
221SK_STDMETHODIMP_(
void) SkDWriteFontFileStreamWrapper::ReleaseFileFragment(
void* fragmentContext) {
226 *fileSize = fStream->getLength();
SK_API void sk_free(void *)
#define SK_STDMETHODIMP_(type)
static HRESULT Create(SkStreamAsset *stream, SkDWriteFontFileStreamWrapper **streamFontFileStream)
SK_STDMETHODIMP GetFileSize(UINT64 *fileSize) override
SK_STDMETHODIMP ReadFileFragment(void const **fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, void **fragmentContext) override
SK_STDMETHODIMP QueryInterface(REFIID iid, void **ppvObject) override
SK_STDMETHODIMP GetLastWriteTime(UINT64 *lastWriteTime) override
SkDWriteFontFileStream * onDuplicate() const override
bool isAtEnd() const override
size_t read(void *buffer, size_t size) override
bool move(long offset) override
SkDWriteFontFileStream(IDWriteFontFileStream *fontFileStream)
size_t getLength() const override
SkDWriteFontFileStream * onFork() const override
bool seek(size_t position) override
const void * getMemoryBase() override
~SkDWriteFontFileStream() override
size_t getPosition() const override
std::unique_ptr< SkDWriteFontFileStream > duplicate() const
static const uint8_t buffer[]
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size