michael@0: /* michael@0: * Copyright 2012 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #ifndef SkDWriteFontFileStream_DEFINED michael@0: #define SkDWriteFontFileStream_DEFINED michael@0: michael@0: #include "SkTypes.h" michael@0: michael@0: #include "SkStream.h" michael@0: #include "SkTScopedComPtr.h" michael@0: michael@0: #include michael@0: michael@0: /** michael@0: * An SkStream backed by an IDWriteFontFileStream. michael@0: * This allows Skia code to read an IDWriteFontFileStream. michael@0: */ michael@0: class SkDWriteFontFileStream : public SkStreamMemory { michael@0: public: michael@0: explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream); michael@0: virtual ~SkDWriteFontFileStream(); michael@0: michael@0: virtual size_t read(void* buffer, size_t size) SK_OVERRIDE; michael@0: virtual bool isAtEnd() const SK_OVERRIDE; michael@0: virtual bool rewind() SK_OVERRIDE; michael@0: virtual SkDWriteFontFileStream* duplicate() const SK_OVERRIDE; michael@0: virtual size_t getPosition() const SK_OVERRIDE; michael@0: virtual bool seek(size_t position) SK_OVERRIDE; michael@0: virtual bool move(long offset) SK_OVERRIDE; michael@0: virtual SkDWriteFontFileStream* fork() const SK_OVERRIDE; michael@0: virtual size_t getLength() const SK_OVERRIDE; michael@0: virtual const void* getMemoryBase() SK_OVERRIDE; michael@0: michael@0: private: michael@0: SkTScopedComPtr fFontFileStream; michael@0: size_t fPos; michael@0: const void* fLockedMemory; michael@0: void* fFragmentLock; michael@0: }; michael@0: michael@0: /** michael@0: * An IDWriteFontFileStream backed by an SkStream. michael@0: * This allows DirectWrite to read an SkStream. michael@0: */ michael@0: class SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream { michael@0: public: michael@0: // IUnknown methods michael@0: virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject); michael@0: virtual ULONG STDMETHODCALLTYPE AddRef(); michael@0: virtual ULONG STDMETHODCALLTYPE Release(); michael@0: michael@0: // IDWriteFontFileStream methods michael@0: virtual HRESULT STDMETHODCALLTYPE ReadFileFragment( michael@0: void const** fragmentStart, michael@0: UINT64 fileOffset, michael@0: UINT64 fragmentSize, michael@0: void** fragmentContext); michael@0: michael@0: virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext); michael@0: virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize); michael@0: virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime); michael@0: michael@0: static HRESULT Create(SkStream* stream, SkDWriteFontFileStreamWrapper** streamFontFileStream); michael@0: michael@0: private: michael@0: explicit SkDWriteFontFileStreamWrapper(SkStream* stream); michael@0: michael@0: ULONG fRefCount; michael@0: SkAutoTUnref fStream; michael@0: SkMutex fStreamMutex; michael@0: }; michael@0: #endif