diff options
author | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-23 21:43:52 +0000 |
---|---|---|
committer | bungeman@google.com <bungeman@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-23 21:43:52 +0000 |
commit | 9df621da5024dda2ffd77cfa6e6c0a0f68e4aa86 (patch) | |
tree | 857a1eb5abe4bd51781e49fd6bbeb9dae6fc7056 /include | |
parent | 8fd48b8bd877bf74ba787b2a60be96b6ffe96d67 (diff) |
Wrap SkStreams in IStreams instead of copying data around.
http://codereview.appspot.com/4630062/
git-svn-id: http://skia.googlecode.com/svn/trunk@1694 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include')
-rw-r--r-- | include/utils/win/SkAutoCoInitialize.h | 37 | ||||
-rw-r--r-- | include/utils/win/SkIStream.h | 135 | ||||
-rw-r--r-- | include/utils/win/SkTScopedComPtr.h | 47 |
3 files changed, 219 insertions, 0 deletions
diff --git a/include/utils/win/SkAutoCoInitialize.h b/include/utils/win/SkAutoCoInitialize.h new file mode 100644 index 0000000000..8819047eef --- /dev/null +++ b/include/utils/win/SkAutoCoInitialize.h @@ -0,0 +1,37 @@ +/* + Copyright 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef SkAutoCo_DEFINED +#define SkAutoCo_DEFINED + +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> +#include "SkTemplates.h" + +/** + * An instance of this class initializes COM on creation + * and closes the COM library on destruction. + */ +class AutoCoInitialize : SkNoncopyable { +private: + HRESULT fHR; +public: + AutoCoInitialize(); + ~AutoCoInitialize(); + HRESULT getHR(); +}; + +#endif diff --git a/include/utils/win/SkIStream.h b/include/utils/win/SkIStream.h new file mode 100644 index 0000000000..bc8aff5560 --- /dev/null +++ b/include/utils/win/SkIStream.h @@ -0,0 +1,135 @@ +/* + Copyright 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef SkIStream_DEFINED +#define SkIStream_DEFINED + +#define WIN32_LEAN_AND_MEAN +#include <Windows.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 { +private: + LONG _refcount; + +protected: + explicit SkBaseIStream(); + virtual ~SkBaseIStream(); + +public: + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid + , void ** ppvObject); + virtual ULONG STDMETHODCALLTYPE AddRef(void); + virtual ULONG STDMETHODCALLTYPE Release(void); + + // ISequentialStream Interface +public: + virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); + + virtual HRESULT STDMETHODCALLTYPE Write(void const* pv + , ULONG cb + , ULONG* pcbWritten); + + // IStream Interface +public: + virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER); + + virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream* + , ULARGE_INTEGER + , ULARGE_INTEGER* + , ULARGE_INTEGER*); + + virtual HRESULT STDMETHODCALLTYPE Commit(DWORD); + + virtual HRESULT STDMETHODCALLTYPE Revert(void); + + virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER + , ULARGE_INTEGER + , DWORD); + + virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER + , ULARGE_INTEGER + , DWORD); + + virtual HRESULT STDMETHODCALLTYPE Clone(IStream **); + + virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove + , DWORD dwOrigin + , ULARGE_INTEGER* lpNewFilePointer); + + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg + , DWORD grfStatFlag); +}; + +/** + * A minimal read-only IStream implementation which wraps an SkIStream. + */ +class SkIStream : public SkBaseIStream { +private: + SkStream *fSkStream; + bool fUnrefOnRelease; + + SkIStream(SkStream* stream, bool unrefOnRelease); + virtual ~SkIStream(); + +public: + HRESULT static CreateFromSkStream(SkStream* stream + , bool unrefOnRelease + , IStream ** ppStream); + + virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); + + virtual HRESULT STDMETHODCALLTYPE Write(void const* pv + , ULONG cb + , ULONG* pcbWritten); + + virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove + , DWORD dwOrigin + , ULARGE_INTEGER* lpNewFilePointer); + + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg + , DWORD grfStatFlag); +}; + +/** + * A minimal write-only IStream implementation which wraps an SkWIStream. + */ +class SkWIStream : public SkBaseIStream { +private: + SkWStream *fSkWStream; + + SkWIStream(SkWStream* stream); + virtual ~SkWIStream(); + +public: + HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream); + + virtual HRESULT STDMETHODCALLTYPE Write(void const* pv + , ULONG cb + , ULONG* pcbWritten); + + virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg + , DWORD grfStatFlag); +}; + +#endif diff --git a/include/utils/win/SkTScopedComPtr.h b/include/utils/win/SkTScopedComPtr.h new file mode 100644 index 0000000000..202dc7e83f --- /dev/null +++ b/include/utils/win/SkTScopedComPtr.h @@ -0,0 +1,47 @@ +/* + Copyright 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef SkSkTScopedPtr_DEFINED +#define SkSkTScopedPtr_DEFINED + +#include "SkTemplates.h" + +template<typename T> +class SkTScopedComPtr : SkNoncopyable { +private: + T *fPtr; + +public: + explicit SkTScopedComPtr(T *ptr = NULL) : fPtr(ptr) { } + ~SkTScopedComPtr() { + if (NULL != fPtr) { + fPtr->Release(); + fPtr = NULL; + } + } + T &operator*() const { return *fPtr; } + T *operator->() const { return fPtr; } + /** + * Returns the address of the underlying pointer. + * This is dangerous -- it breaks encapsulation and the reference escapes. + * Must only be used on instances currently pointing to NULL, + * and only to initialize the instance. + */ + T **operator&() { SkASSERT(fPtr == NULL); return &fPtr; } + T *get() const { return fPtr; } +}; + +#endif |