1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkDWriteFontFileStream_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkDWriteFontFileStream_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMutex.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/win/SkObjBase.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/win/SkTScopedComPtr.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <dwrite.h> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * An SkStream backed by an IDWriteFontFileStream. 22*c8dee2aaSAndroid Build Coastguard Worker * This allows Skia code to read an IDWriteFontFileStream. 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker class SkDWriteFontFileStream : public SkStreamMemory { 25*c8dee2aaSAndroid Build Coastguard Worker public: 26*c8dee2aaSAndroid Build Coastguard Worker explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream); 27*c8dee2aaSAndroid Build Coastguard Worker ~SkDWriteFontFileStream() override; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker size_t read(void* buffer, size_t size) override; 30*c8dee2aaSAndroid Build Coastguard Worker bool isAtEnd() const override; 31*c8dee2aaSAndroid Build Coastguard Worker bool rewind() override; 32*c8dee2aaSAndroid Build Coastguard Worker size_t getPosition() const override; 33*c8dee2aaSAndroid Build Coastguard Worker bool seek(size_t position) override; 34*c8dee2aaSAndroid Build Coastguard Worker bool move(long offset) override; 35*c8dee2aaSAndroid Build Coastguard Worker size_t getLength() const override; 36*c8dee2aaSAndroid Build Coastguard Worker const void* getMemoryBase() override; 37*c8dee2aaSAndroid Build Coastguard Worker duplicate()38*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkDWriteFontFileStream> duplicate() const { 39*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<SkDWriteFontFileStream>(this->onDuplicate()); 40*c8dee2aaSAndroid Build Coastguard Worker } fork()41*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkDWriteFontFileStream> fork() const { 42*c8dee2aaSAndroid Build Coastguard Worker return std::unique_ptr<SkDWriteFontFileStream>(this->onFork()); 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker private: 46*c8dee2aaSAndroid Build Coastguard Worker SkDWriteFontFileStream* onDuplicate() const override; 47*c8dee2aaSAndroid Build Coastguard Worker SkDWriteFontFileStream* onFork() const override; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker SkTScopedComPtr<IDWriteFontFileStream> fFontFileStream; 50*c8dee2aaSAndroid Build Coastguard Worker size_t fPos; 51*c8dee2aaSAndroid Build Coastguard Worker const void* fLockedMemory; 52*c8dee2aaSAndroid Build Coastguard Worker void* fFragmentLock; 53*c8dee2aaSAndroid Build Coastguard Worker }; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker /** 56*c8dee2aaSAndroid Build Coastguard Worker * An IDWriteFontFileStream backed by an SkStream. 57*c8dee2aaSAndroid Build Coastguard Worker * This allows DirectWrite to read an SkStream. 58*c8dee2aaSAndroid Build Coastguard Worker */ 59*c8dee2aaSAndroid Build Coastguard Worker class SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream { 60*c8dee2aaSAndroid Build Coastguard Worker public: 61*c8dee2aaSAndroid Build Coastguard Worker // IUnknown methods 62*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP QueryInterface(REFIID iid, void** ppvObject) override; 63*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP_(ULONG) AddRef() override; 64*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP_(ULONG) Release() override; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker // IDWriteFontFileStream methods 67*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP ReadFileFragment( 68*c8dee2aaSAndroid Build Coastguard Worker void const** fragmentStart, 69*c8dee2aaSAndroid Build Coastguard Worker UINT64 fileOffset, 70*c8dee2aaSAndroid Build Coastguard Worker UINT64 fragmentSize, 71*c8dee2aaSAndroid Build Coastguard Worker void** fragmentContext) override; 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP_(void) ReleaseFileFragment(void* fragmentContext) override; 74*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP GetFileSize(UINT64* fileSize) override; 75*c8dee2aaSAndroid Build Coastguard Worker SK_STDMETHODIMP GetLastWriteTime(UINT64* lastWriteTime) override; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker static HRESULT Create(SkStreamAsset* stream, 78*c8dee2aaSAndroid Build Coastguard Worker SkDWriteFontFileStreamWrapper** streamFontFileStream); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker private: 81*c8dee2aaSAndroid Build Coastguard Worker explicit SkDWriteFontFileStreamWrapper(SkStreamAsset* stream); ~SkDWriteFontFileStreamWrapper()82*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkDWriteFontFileStreamWrapper() { } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker ULONG fRefCount; 85*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkStreamAsset> fStream; 86*c8dee2aaSAndroid Build Coastguard Worker SkMutex fStreamMutex; 87*c8dee2aaSAndroid Build Coastguard Worker }; 88*c8dee2aaSAndroid Build Coastguard Worker #endif 89