SkDWriteFontFileStream.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  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. #ifndef SkDWriteFontFileStream_DEFINED
  8. #define SkDWriteFontFileStream_DEFINED
  9. #include "include/core/SkTypes.h"
  10. #include "include/core/SkStream.h"
  11. #include "include/private/SkMutex.h"
  12. #include "src/utils/win/SkTScopedComPtr.h"
  13. #include <dwrite.h>
  14. /**
  15. * An SkStream backed by an IDWriteFontFileStream.
  16. * This allows Skia code to read an IDWriteFontFileStream.
  17. */
  18. class SkDWriteFontFileStream : public SkStreamMemory {
  19. public:
  20. explicit SkDWriteFontFileStream(IDWriteFontFileStream* fontFileStream);
  21. ~SkDWriteFontFileStream() override;
  22. size_t read(void* buffer, size_t size) override;
  23. bool isAtEnd() const override;
  24. bool rewind() override;
  25. size_t getPosition() const override;
  26. bool seek(size_t position) override;
  27. bool move(long offset) override;
  28. size_t getLength() const override;
  29. const void* getMemoryBase() override;
  30. std::unique_ptr<SkDWriteFontFileStream> duplicate() const {
  31. return std::unique_ptr<SkDWriteFontFileStream>(this->onDuplicate());
  32. }
  33. std::unique_ptr<SkDWriteFontFileStream> fork() const {
  34. return std::unique_ptr<SkDWriteFontFileStream>(this->onFork());
  35. }
  36. private:
  37. SkDWriteFontFileStream* onDuplicate() const override;
  38. SkDWriteFontFileStream* onFork() const override;
  39. SkTScopedComPtr<IDWriteFontFileStream> fFontFileStream;
  40. size_t fPos;
  41. const void* fLockedMemory;
  42. void* fFragmentLock;
  43. };
  44. /**
  45. * An IDWriteFontFileStream backed by an SkStream.
  46. * This allows DirectWrite to read an SkStream.
  47. */
  48. class SkDWriteFontFileStreamWrapper : public IDWriteFontFileStream {
  49. public:
  50. // IUnknown methods
  51. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
  52. virtual ULONG STDMETHODCALLTYPE AddRef();
  53. virtual ULONG STDMETHODCALLTYPE Release();
  54. // IDWriteFontFileStream methods
  55. virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(
  56. void const** fragmentStart,
  57. UINT64 fileOffset,
  58. UINT64 fragmentSize,
  59. void** fragmentContext);
  60. virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
  61. virtual HRESULT STDMETHODCALLTYPE GetFileSize(UINT64* fileSize);
  62. virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(UINT64* lastWriteTime);
  63. static HRESULT Create(SkStreamAsset* stream,
  64. SkDWriteFontFileStreamWrapper** streamFontFileStream);
  65. private:
  66. explicit SkDWriteFontFileStreamWrapper(SkStreamAsset* stream);
  67. virtual ~SkDWriteFontFileStreamWrapper() { }
  68. ULONG fRefCount;
  69. std::unique_ptr<SkStreamAsset> fStream;
  70. SkMutex fStreamMutex;
  71. };
  72. #endif