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