180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkDWriteFontFileStream_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkDWriteFontFileStream_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTypes.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTScopedComPtr.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <dwrite.h>
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  An SkStream backed by an IDWriteFontFileStream.
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  This allows Skia code to read an IDWriteFontFileStream.
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass SkDWriteFontFileStream : public SkStreamMemory {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream);
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkDWriteFontFileStream();
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual size_t read(void* buffer, size_t size) SK_OVERRIDE;
2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual bool isAtEnd() const SK_OVERRIDE;
2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual bool rewind() SK_OVERRIDE;
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual SkDWriteFontFileStream* duplicate() const SK_OVERRIDE;
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual size_t getPosition() const SK_OVERRIDE;
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual bool seek(size_t position) SK_OVERRIDE;
3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual bool move(long offset) SK_OVERRIDE;
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual SkDWriteFontFileStream* fork() const SK_OVERRIDE;
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual size_t getLength() const SK_OVERRIDE;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const void* getMemoryBase() SK_OVERRIDE;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTScopedComPtr<IDWriteFontFileStream> fFontFileStream;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t fPos;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const void* fLockedMemory;
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void* fFragmentLock;
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  An IDWriteFontFileStream backed by an SkStream.
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  This allows DirectWrite to read an SkStream.
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream {
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // IUnknown methods
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ULONG STDMETHODCALLTYPE AddRef();
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ULONG STDMETHODCALLTYPE Release();
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // IDWriteFontFileStream methods
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void const** fragmentStart,
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        UINT64 fileOffset,
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        UINT64 fragmentSize,
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void** fragmentContext);
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime);
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static HRESULT Create(SkStream* stream, SkDWriteFontFileStreamWrapper** streamFontFileStream);
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    explicit SkDWriteFontFileStreamWrapper(SkStream* stream);
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ULONG fRefCount;
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoTUnref<SkStream> fStream;
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMutex fStreamMutex;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
77