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