diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/utils/win/SkDWriteFontFileStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/utils/win/SkDWriteFontFileStream.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,76 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkDWriteFontFileStream_DEFINED +#define SkDWriteFontFileStream_DEFINED + +#include "SkTypes.h" + +#include "SkStream.h" +#include "SkTScopedComPtr.h" + +#include + +/** + * An SkStream backed by an IDWriteFontFileStream. + * This allows Skia code to read an IDWriteFontFileStream. + */ +class SkDWriteFontFileStream : public SkStreamMemory { +public: + explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream); + virtual ~SkDWriteFontFileStream(); + + virtual size_t read(void* buffer, size_t size) SK_OVERRIDE; + virtual bool isAtEnd() const SK_OVERRIDE; + virtual bool rewind() SK_OVERRIDE; + virtual SkDWriteFontFileStream* duplicate() const SK_OVERRIDE; + virtual size_t getPosition() const SK_OVERRIDE; + virtual bool seek(size_t position) SK_OVERRIDE; + virtual bool move(long offset) SK_OVERRIDE; + virtual SkDWriteFontFileStream* fork() const SK_OVERRIDE; + virtual size_t getLength() const SK_OVERRIDE; + virtual const void* getMemoryBase() SK_OVERRIDE; + +private: + SkTScopedComPtr fFontFileStream; + size_t fPos; + const void* fLockedMemory; + void* fFragmentLock; +}; + +/** + * An IDWriteFontFileStream backed by an SkStream. + * This allows DirectWrite to read an SkStream. + */ +class SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream { +public: + // IUnknown methods + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef(); + virtual ULONG STDMETHODCALLTYPE Release(); + + // IDWriteFontFileStream methods + virtual HRESULT STDMETHODCALLTYPE ReadFileFragment( + void const** fragmentStart, + UINT64 fileOffset, + UINT64 fragmentSize, + void** fragmentContext); + + virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext); + virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize); + virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime); + + static HRESULT Create(SkStream* stream, SkDWriteFontFileStreamWrapper** streamFontFileStream); + +private: + explicit SkDWriteFontFileStreamWrapper(SkStream* stream); + + ULONG fRefCount; + SkAutoTUnref fStream; + SkMutex fStreamMutex; +}; +#endif