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