blob: 186fb933bb7c3eb51070deba6264694578ca4b2b [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
bungeman@google.com9df621d2011-06-23 21:43:52 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
bungeman@google.com9df621d2011-06-23 21:43:52 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
bungeman@google.com9df621d2011-06-23 21:43:52 +000010#ifndef SkIStream_DEFINED
11#define SkIStream_DEFINED
12
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkTypes.h"
halcanary0cbe7ee2015-12-01 09:02:49 -080014
15#ifdef SK_BUILD_FOR_WIN
16
Ben Wagnerab6eefe2019-05-20 11:02:49 -040017#include "src/core/SkLeanWindows.h"
bungeman@google.com9df621d2011-06-23 21:43:52 +000018#include <ole2.h>
19
20class SkStream;
21class SkWStream;
22
23/**
24 * A bare IStream implementation which properly reference counts
25 * but returns E_NOTIMPL for all ISequentialStream and IStream methods.
26 */
27class SkBaseIStream : public IStream {
28private:
29 LONG _refcount;
30
31protected:
32 explicit SkBaseIStream();
33 virtual ~SkBaseIStream();
34
35public:
36 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid
37 , void ** ppvObject);
38 virtual ULONG STDMETHODCALLTYPE AddRef(void);
39 virtual ULONG STDMETHODCALLTYPE Release(void);
40
41 // ISequentialStream Interface
42public:
43 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
44
45 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
46 , ULONG cb
47 , ULONG* pcbWritten);
48
49 // IStream Interface
50public:
51 virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000052
bungeman@google.com9df621d2011-06-23 21:43:52 +000053 virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
54 , ULARGE_INTEGER
55 , ULARGE_INTEGER*
56 , ULARGE_INTEGER*);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000057
bungeman@google.com9df621d2011-06-23 21:43:52 +000058 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000059
bungeman@google.com9df621d2011-06-23 21:43:52 +000060 virtual HRESULT STDMETHODCALLTYPE Revert(void);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000061
bungeman@google.com9df621d2011-06-23 21:43:52 +000062 virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
63 , ULARGE_INTEGER
64 , DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000065
bungeman@google.com9df621d2011-06-23 21:43:52 +000066 virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
67 , ULARGE_INTEGER
68 , DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000069
bungeman@google.com9df621d2011-06-23 21:43:52 +000070 virtual HRESULT STDMETHODCALLTYPE Clone(IStream **);
71
72 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
73 , DWORD dwOrigin
74 , ULARGE_INTEGER* lpNewFilePointer);
75
76 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
77 , DWORD grfStatFlag);
78};
79
80/**
bungeman44af7ba2015-01-22 07:33:51 -080081 * A minimal read-only IStream implementation which wraps an SkStream.
bungeman@google.com9df621d2011-06-23 21:43:52 +000082 */
83class SkIStream : public SkBaseIStream {
84private:
85 SkStream *fSkStream;
bungeman44af7ba2015-01-22 07:33:51 -080086 const bool fDeleteOnRelease;
bungeman@google.com60157922011-08-13 00:06:17 +000087 ULARGE_INTEGER fLocation;
bungeman@google.com9df621d2011-06-23 21:43:52 +000088
bungeman2dca8172015-01-22 06:08:31 -080089 SkIStream(SkStream* stream, bool fDeleteOnRelease);
bungeman@google.com9df621d2011-06-23 21:43:52 +000090 virtual ~SkIStream();
91
92public:
93 HRESULT static CreateFromSkStream(SkStream* stream
bungeman2dca8172015-01-22 06:08:31 -080094 , bool fDeleteOnRelease
bungeman@google.com9df621d2011-06-23 21:43:52 +000095 , IStream ** ppStream);
96
97 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
98
99 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
100 , ULONG cb
101 , ULONG* pcbWritten);
102
103 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
104 , DWORD dwOrigin
105 , ULARGE_INTEGER* lpNewFilePointer);
106
107 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
108 , DWORD grfStatFlag);
109};
110
111/**
112 * A minimal write-only IStream implementation which wraps an SkWIStream.
113 */
114class SkWIStream : public SkBaseIStream {
115private:
116 SkWStream *fSkWStream;
117
118 SkWIStream(SkWStream* stream);
119 virtual ~SkWIStream();
120
121public:
122 HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
123
124 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
125 , ULONG cb
126 , ULONG* pcbWritten);
127
bungeman@google.com14fc3212011-08-01 20:41:53 +0000128 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
129
bungeman@google.com9df621d2011-06-23 21:43:52 +0000130 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
131 , DWORD grfStatFlag);
132};
133
halcanary0cbe7ee2015-12-01 09:02:49 -0800134#endif // SK_BUILD_FOR_WIN
135#endif // SkIStream_DEFINED