summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/utils/win/SkIStream.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/utils/win/SkIStream.h')
-rw-r--r--gfx/skia/skia/src/utils/win/SkIStream.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/utils/win/SkIStream.h b/gfx/skia/skia/src/utils/win/SkIStream.h
new file mode 100644
index 0000000000..37d9b02283
--- /dev/null
+++ b/gfx/skia/skia/src/utils/win/SkIStream.h
@@ -0,0 +1,101 @@
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#ifndef SkIStream_DEFINED
+#define SkIStream_DEFINED
+
+#include "include/core/SkTypes.h"
+
+#ifdef SK_BUILD_FOR_WIN
+
+#include "src/base/SkLeanWindows.h"
+#include "src/utils/win/SkObjBase.h"
+#include <ole2.h>
+
+class SkStream;
+class SkWStream;
+
+/**
+ * A bare IStream implementation which properly reference counts
+ * but returns E_NOTIMPL for all ISequentialStream and IStream methods.
+ */
+class SkBaseIStream : public IStream {
+public:
+ // IUnknown methods
+ SK_STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) override;
+ SK_STDMETHODIMP_(ULONG) AddRef() override;
+ SK_STDMETHODIMP_(ULONG) Release() override;
+
+ // ISequentialStream methods
+ SK_STDMETHODIMP Read(void* pv, ULONG cb, ULONG* pcbRead) override;
+ SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override;
+
+ // IStream methods
+ SK_STDMETHODIMP SetSize(ULARGE_INTEGER) override;
+ SK_STDMETHODIMP CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) override;
+ SK_STDMETHODIMP Commit(DWORD) override;
+ SK_STDMETHODIMP Revert() override;
+ SK_STDMETHODIMP LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override;
+ SK_STDMETHODIMP UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override;
+ SK_STDMETHODIMP Clone(IStream**) override;
+ SK_STDMETHODIMP Seek(LARGE_INTEGER liDistanceToMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER* lpNewFilePointer) override;
+ SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override;
+
+protected:
+ explicit SkBaseIStream();
+ virtual ~SkBaseIStream();
+
+private:
+ LONG _refcount;
+};
+
+/**
+ * A minimal read-only IStream implementation which wraps an SkStream.
+ */
+class SkIStream : public SkBaseIStream {
+public:
+ HRESULT static CreateFromSkStream(std::unique_ptr<SkStreamAsset>, IStream** ppStream);
+
+ SK_STDMETHODIMP Read(void* pv, ULONG cb, ULONG* pcbRead) override;
+ SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override;
+ SK_STDMETHODIMP Seek(LARGE_INTEGER liDistanceToMove,
+ DWORD dwOrigin,
+ ULARGE_INTEGER* lpNewFilePointer) override;
+ SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override;
+
+private:
+ const std::unique_ptr<SkStream> fSkStream;
+ ULARGE_INTEGER fLocation;
+
+ explicit SkIStream(std::unique_ptr<SkStreamAsset>);
+ ~SkIStream() override;
+};
+
+/**
+ * A minimal write-only IStream implementation which wraps an SkWIStream.
+ */
+class SkWIStream : public SkBaseIStream {
+public:
+ HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
+
+ SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override;
+ SK_STDMETHODIMP Commit(DWORD) override;
+ SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override;
+
+private:
+ SkWStream *fSkWStream;
+
+ SkWIStream(SkWStream* stream);
+ ~SkWIStream() override;
+};
+
+#endif // SK_BUILD_FOR_WIN
+#endif // SkIStream_DEFINED