1e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com/*
2e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com * Copyright 2012 Google Inc.
3e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com *
4e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com * Use of this source code is governed by a BSD-style license that can be
5e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com * found in the LICENSE file.
6e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com */
7e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
8e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#ifndef SkDWriteFontFileStream_DEFINED
9e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#define SkDWriteFontFileStream_DEFINED
10e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
11e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#include "SkTypes.h"
12e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
137b274c78fbeefa3818af68099545f2839c854847mtklein#include "SkMutex.h"
14e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#include "SkStream.h"
15e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#include "SkTScopedComPtr.h"
16e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
17e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#include <dwrite.h>
18e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
19e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com/**
20e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com *  An SkStream backed by an IDWriteFontFileStream.
21e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com *  This allows Skia code to read an IDWriteFontFileStream.
22e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com */
236cab1a4b6a68aa81237731308ff37a646d48f51cbungeman@google.comclass SkDWriteFontFileStream : public SkStreamMemory {
24e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.compublic:
25e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream);
26e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual ~SkDWriteFontFileStream();
27d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
2836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    size_t read(void* buffer, size_t size) override;
2936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isAtEnd() const override;
3036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool rewind() override;
3136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkDWriteFontFileStream* duplicate() const override;
3236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    size_t getPosition() const override;
3336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool seek(size_t position) override;
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool move(long offset) override;
3536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkDWriteFontFileStream* fork() const override;
3636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    size_t getLength() const override;
3736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const void* getMemoryBase() override;
38e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
39e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.comprivate:
40e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    SkTScopedComPtr<IDWriteFontFileStream> fFontFileStream;
41e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    size_t fPos;
42e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    const void* fLockedMemory;
43e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    void* fFragmentLock;
44e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com};
45e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
46e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com/**
47e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com *  An IDWriteFontFileStream backed by an SkStream.
48e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com *  This allows DirectWrite to read an SkStream.
49e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com */
50e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.comclass SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream {
51e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.compublic:
52e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    // IUnknown methods
53e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
54e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual ULONG STDMETHODCALLTYPE AddRef();
55e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual ULONG STDMETHODCALLTYPE Release();
56e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
57e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    // IDWriteFontFileStream methods
58e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(
59e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com        void const** fragmentStart,
60e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com        UINT64 fileOffset,
61e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com        UINT64 fragmentSize,
62e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com        void** fragmentContext);
63e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
64e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
65e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize);
66e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime);
67e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
680babd3c61987428a5c532f65be9d98c7ac583e0dbungeman    static HRESULT Create(SkStreamAsset* stream,
690babd3c61987428a5c532f65be9d98c7ac583e0dbungeman                          SkDWriteFontFileStreamWrapper** streamFontFileStream);
70e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
71e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.comprivate:
720babd3c61987428a5c532f65be9d98c7ac583e0dbungeman    explicit SkDWriteFontFileStreamWrapper(SkStreamAsset* stream);
73d7f846bdd171e4be0c05cfe61bc4446caf5c99c6bungeman    virtual ~SkDWriteFontFileStreamWrapper() { }
74e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com
75e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    ULONG fRefCount;
760babd3c61987428a5c532f65be9d98c7ac583e0dbungeman    SkAutoTDelete<SkStreamAsset> fStream;
77e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com    SkMutex fStreamMutex;
78e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com};
79e8f0592ae8b37e94d99f49816eb22e9fafde6d86bungeman@google.com#endif
80