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