From 69f298211c8e9c0b90aead46c6ec624112b2175a Mon Sep 17 00:00:00 2001 From: Nomango Date: Tue, 4 Aug 2020 02:19:08 +0800 Subject: [PATCH] update NativeObject & NativePtr --- projects/kiwano/kiwano.vcxproj | 1 + projects/kiwano/kiwano.vcxproj.filters | 3 ++ src/kiwano/render/DirectX/NativePtr.h | 4 +- src/kiwano/render/NativeObject.cpp | 47 ++++++++++++++++++++ src/kiwano/render/NativeObject.h | 59 +++++++++++++------------- 5 files changed, 83 insertions(+), 31 deletions(-) create mode 100644 src/kiwano/render/NativeObject.cpp diff --git a/projects/kiwano/kiwano.vcxproj b/projects/kiwano/kiwano.vcxproj index d78cedd3..eb83575f 100644 --- a/projects/kiwano/kiwano.vcxproj +++ b/projects/kiwano/kiwano.vcxproj @@ -166,6 +166,7 @@ + diff --git a/projects/kiwano/kiwano.vcxproj.filters b/projects/kiwano/kiwano.vcxproj.filters index 0cc9eff1..e13e15a7 100644 --- a/projects/kiwano/kiwano.vcxproj.filters +++ b/projects/kiwano/kiwano.vcxproj.filters @@ -587,6 +587,9 @@ render + + render + diff --git a/src/kiwano/render/DirectX/NativePtr.h b/src/kiwano/render/DirectX/NativePtr.h index 5d2fc309..2e132d68 100644 --- a/src/kiwano/render/DirectX/NativePtr.h +++ b/src/kiwano/render/DirectX/NativePtr.h @@ -34,7 +34,7 @@ public: { if (object) { - ComPtr ptr = object->GetNativePointer>(); + ComPtr ptr = object->GetNativePointer(); if (ptr) { ComPtr<_Ty> native; @@ -61,7 +61,7 @@ public: { if (object) { - object->SetNativePointer(com_ptr); + object->ResetNativePointer(com_ptr.Get()); } } diff --git a/src/kiwano/render/NativeObject.cpp b/src/kiwano/render/NativeObject.cpp new file mode 100644 index 00000000..fa43030d --- /dev/null +++ b/src/kiwano/render/NativeObject.cpp @@ -0,0 +1,47 @@ +#include "NativeObject.h" + +namespace kiwano +{ +NativeObjectBase::NativeObjectBase() + : native_pointer_(nullptr) +{ +} + +bool NativeObjectBase::IsValid() const +{ + return native_pointer_ != nullptr; +} + +void NativeObjectBase::ResetNativePointer(void* native_pointer) +{ + native_pointer_ = native_pointer; +} + +// +// NativeObject for Windows +// +#if defined(KGE_PLATFORM_WINDOWS) + +NativeObject::~NativeObject() +{ + ResetNativePointer(); +} + +void NativeObject::ResetNativePointer(void* native_pointer) +{ + if (native_pointer_) + { + static_cast(native_pointer_)->Release(); + native_pointer_ = nullptr; + } + + if (native_pointer) + { + native_pointer_ = native_pointer; + static_cast(native_pointer_)->AddRef(); + } +} + +#endif + +} diff --git a/src/kiwano/render/NativeObject.h b/src/kiwano/render/NativeObject.h index fc020b23..99627496 100644 --- a/src/kiwano/render/NativeObject.h +++ b/src/kiwano/render/NativeObject.h @@ -39,54 +39,55 @@ KGE_DECLARE_SMART_PTR(NativeObject); * \~chinese * @brief 含有本机指针的对象 */ -class KGE_API NativeObject : public ObjectBase +class KGE_API NativeObjectBase : public ObjectBase { public: - virtual bool IsValid() const; + NativeObjectBase(); - Any GetNativePointer() const; + bool IsValid() const override; + + void* GetNativePointer() const; template - _NativeTy GetNativePointer() const; + _NativeTy* GetNativePointer() const; - void SetNativePointer(const Any& native_pointer); + virtual void ResetNativePointer(void* native_pointer = nullptr); - void ResetNativePointer(); - -private: - Any native_pointer_; +protected: + void* native_pointer_; }; +#if defined(KGE_PLATFORM_WINDOWS) + +class KGE_API NativeObject : public NativeObjectBase +{ +public: + virtual ~NativeObject(); + + void ResetNativePointer(void* native_pointer = nullptr) override; +}; + +#else + +typedef NativeObjectBase NativeObject; + +#endif + /** @} */ -inline bool NativeObject::IsValid() const -{ - return native_pointer_.HasValue(); -} - -inline Any NativeObject::GetNativePointer() const +inline void* NativeObjectBase::GetNativePointer() const { return native_pointer_; } template -inline _NativeTy NativeObject::GetNativePointer() const +inline _NativeTy* NativeObjectBase::GetNativePointer() const { - if (native_pointer_.HasValue()) + if (native_pointer_ != nullptr) { - return native_pointer_.Cast<_NativeTy>(); + return static_cast<_NativeTy*>(native_pointer_); } - return _NativeTy(); -} - -inline void NativeObject::SetNativePointer(const Any& native_pointer) -{ - native_pointer_ = native_pointer; -} - -inline void NativeObject::ResetNativePointer() -{ - native_pointer_.Clear(); + return nullptr; } } // namespace kiwano