blob: ac98be6142a4e7dfd2e1fdaf35947a77841599b2 [file] [log] [blame]
bungeman@google.come8f05922012-08-16 16:13:40 +00001/*
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 "SkStream.h"
14#include "SkTScopedComPtr.h"
15
16#include <dwrite.h>
17
18/**
19 * An SkStream backed by an IDWriteFontFileStream.
20 * This allows Skia code to read an IDWriteFontFileStream.
21 */
bungeman@google.com6cab1a42013-05-29 13:43:31 +000022class SkDWriteFontFileStream : public SkStreamMemory {
bungeman@google.come8f05922012-08-16 16:13:40 +000023public:
24 explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream);
25 virtual ~SkDWriteFontFileStream();
rmistry@google.comd6176b02012-08-23 18:14:13 +000026
bungeman@google.come8f05922012-08-16 16:13:40 +000027 virtual size_t read(void* buffer, size_t size) SK_OVERRIDE;
bungeman@google.com6cab1a42013-05-29 13:43:31 +000028 virtual bool isAtEnd() const SK_OVERRIDE;
29 virtual bool rewind() SK_OVERRIDE;
30 virtual SkDWriteFontFileStream* duplicate() const SK_OVERRIDE;
31 virtual size_t getPosition() const SK_OVERRIDE;
32 virtual bool seek(size_t position) SK_OVERRIDE;
33 virtual bool move(long offset) SK_OVERRIDE;
34 virtual SkDWriteFontFileStream* fork() const SK_OVERRIDE;
35 virtual size_t getLength() const SK_OVERRIDE;
bungeman@google.come8f05922012-08-16 16:13:40 +000036 virtual const void* getMemoryBase() SK_OVERRIDE;
37
38private:
39 SkTScopedComPtr<IDWriteFontFileStream> fFontFileStream;
40 size_t fPos;
41 const void* fLockedMemory;
42 void* fFragmentLock;
43};
44
45/**
46 * An IDWriteFontFileStream backed by an SkStream.
47 * This allows DirectWrite to read an SkStream.
48 */
49class SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream {
50public:
51 // IUnknown methods
52 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
53 virtual ULONG STDMETHODCALLTYPE AddRef();
54 virtual ULONG STDMETHODCALLTYPE Release();
55
56 // IDWriteFontFileStream methods
57 virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(
58 void const** fragmentStart,
59 UINT64 fileOffset,
60 UINT64 fragmentSize,
61 void** fragmentContext);
62
63 virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
64 virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize);
65 virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime);
66
67 static HRESULT Create(SkStream* stream, SkDWriteFontFileStreamWrapper** streamFontFileStream);
68
69private:
70 explicit SkDWriteFontFileStreamWrapper(SkStream* stream);
bungemand7f846b2014-06-19 11:26:59 -070071 virtual ~SkDWriteFontFileStreamWrapper() { }
bungeman@google.come8f05922012-08-16 16:13:40 +000072
73 ULONG fRefCount;
74 SkAutoTUnref<SkStream> fStream;
75 SkMutex fStreamMutex;
76};
77#endif