From 48d85a1e97b922541986382dadc3ec15045ee19f Mon Sep 17 00:00:00 2001 From: Nomango Date: Thu, 7 Nov 2019 18:16:28 +0800 Subject: [PATCH] Add Library --- projects/kiwano/kiwano.vcxproj | 2 + projects/kiwano/kiwano.vcxproj.filters | 6 + src/kiwano-audio/audio-modules.cpp | 49 ++-- src/kiwano-audio/audio-modules.h | 45 +-- src/kiwano/2d/Actor.h | 363 +++++++++++++++++++------ src/kiwano/2d/action/Action.h | 164 ++++++++--- src/kiwano/2d/action/ActionDelay.cpp | 4 +- src/kiwano/2d/action/ActionTween.cpp | 6 +- src/kiwano/base/Library.cpp | 68 +++++ src/kiwano/base/Library.h | 54 ++++ src/kiwano/platform/modules.cpp | 12 +- src/kiwano/platform/modules.h | 25 +- 12 files changed, 608 insertions(+), 190 deletions(-) create mode 100644 src/kiwano/base/Library.cpp create mode 100644 src/kiwano/base/Library.h diff --git a/projects/kiwano/kiwano.vcxproj b/projects/kiwano/kiwano.vcxproj index 57b8f114..6fec72a7 100644 --- a/projects/kiwano/kiwano.vcxproj +++ b/projects/kiwano/kiwano.vcxproj @@ -12,6 +12,7 @@ + @@ -118,6 +119,7 @@ + diff --git a/projects/kiwano/kiwano.vcxproj.filters b/projects/kiwano/kiwano.vcxproj.filters index 24b70a35..9b71bc4f 100644 --- a/projects/kiwano/kiwano.vcxproj.filters +++ b/projects/kiwano/kiwano.vcxproj.filters @@ -300,6 +300,9 @@ utils + + base + @@ -476,5 +479,8 @@ utils + + base + \ No newline at end of file diff --git a/src/kiwano-audio/audio-modules.cpp b/src/kiwano-audio/audio-modules.cpp index fe4403e9..f46335bb 100644 --- a/src/kiwano-audio/audio-modules.cpp +++ b/src/kiwano-audio/audio-modules.cpp @@ -28,7 +28,7 @@ namespace kiwano namespace modules { XAudio2::XAudio2() - : xaudio2(nullptr) + : xaudio2() , XAudio2Create(nullptr) { const auto xaudio2_dll_names = @@ -40,16 +40,17 @@ namespace kiwano for (const auto& name : xaudio2_dll_names) { - xaudio2 = LoadLibraryW(name); - if (xaudio2) + if (xaudio2.Load(name)) { - XAudio2Create = (PFN_XAudio2Create) - GetProcAddress(xaudio2, "XAudio2Create"); break; } } - if (!xaudio2) + if (xaudio2.IsValid()) + { + XAudio2Create = xaudio2.GetProcess(L"XAudio2Create"); + } + else { KGE_ERROR_LOG(L"Load xaudio2.dll failed"); throw std::runtime_error("Load xaudio2.dll failed"); @@ -57,8 +58,8 @@ namespace kiwano } MediaFoundation::MediaFoundation() - : mfplat(nullptr) - , mfreadwrite(nullptr) + : mfplat() + , mfreadwrite() , MFStartup(nullptr) , MFShutdown(nullptr) , MFCreateMediaType(nullptr) @@ -67,23 +68,13 @@ namespace kiwano , MFCreateSourceReaderFromByteStream(nullptr) , MFCreateMFByteStreamOnStream(nullptr) { - mfplat = LoadLibraryW(L"Mfplat.dll"); - if (mfplat) + if (mfplat.Load(L"Mfplat.dll")) { - MFStartup = (PFN_MFStartup) - GetProcAddress(mfplat, "MFStartup"); - - MFShutdown = (PFN_MFShutdown) - GetProcAddress(mfplat, "MFShutdown"); - - MFCreateMediaType = (PFN_MFCreateMediaType) - GetProcAddress(mfplat, "MFCreateMediaType"); - - MFCreateWaveFormatExFromMFMediaType = (PFN_MFCreateWaveFormatExFromMFMediaType) - GetProcAddress(mfplat, "MFCreateWaveFormatExFromMFMediaType"); - - MFCreateMFByteStreamOnStream = (PFN_MFCreateMFByteStreamOnStream) - GetProcAddress(mfplat, "MFCreateMFByteStreamOnStream"); + MFStartup = mfplat.GetProcess(L"MFStartup"); + MFShutdown = mfplat.GetProcess(L"MFShutdown"); + MFCreateMediaType = mfplat.GetProcess(L"MFCreateMediaType"); + MFCreateWaveFormatExFromMFMediaType = mfplat.GetProcess(L"MFCreateWaveFormatExFromMFMediaType"); + MFCreateMFByteStreamOnStream = mfplat.GetProcess(L"MFCreateMFByteStreamOnStream"); } else { @@ -91,14 +82,10 @@ namespace kiwano throw std::runtime_error("Load Mfplat.dll failed"); } - mfreadwrite = LoadLibraryW(L"Mfreadwrite.dll"); - if (mfreadwrite) + if (mfreadwrite.Load(L"Mfreadwrite.dll")) { - MFCreateSourceReaderFromURL = (PFN_MFCreateSourceReaderFromURL) - GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromURL"); - - MFCreateSourceReaderFromByteStream = (PFN_MFCreateSourceReaderFromByteStream) - GetProcAddress(mfreadwrite, "MFCreateSourceReaderFromByteStream"); + MFCreateSourceReaderFromURL = mfreadwrite.GetProcess(L"MFCreateSourceReaderFromURL"); + MFCreateSourceReaderFromByteStream = mfreadwrite.GetProcess(L"MFCreateSourceReaderFromByteStream"); } else { diff --git a/src/kiwano-audio/audio-modules.h b/src/kiwano-audio/audio-modules.h index 689ba0dd..97a7e8a9 100644 --- a/src/kiwano-audio/audio-modules.h +++ b/src/kiwano-audio/audio-modules.h @@ -19,6 +19,7 @@ // THE SOFTWARE. #pragma once +#include #include #include #include @@ -32,13 +33,6 @@ namespace kiwano { class KGE_API XAudio2 { - XAudio2(); - - HMODULE xaudio2; - - // XAudio2 functions - typedef HRESULT(WINAPI* PFN_XAudio2Create)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR); - public: static inline XAudio2& Get() { @@ -46,16 +40,29 @@ namespace kiwano return instance; } + // XAudio2 functions + typedef HRESULT(WINAPI* PFN_XAudio2Create)(IXAudio2**, UINT32, XAUDIO2_PROCESSOR); + PFN_XAudio2Create XAudio2Create; + + private: + XAudio2(); + + XAudio2(const XAudio2&) = delete; + XAudio2& operator=(const XAudio2&) = delete; + + Library xaudio2; }; class KGE_API MediaFoundation { - MediaFoundation(); - - HMODULE mfplat; - HMODULE mfreadwrite; + public: + static inline MediaFoundation& Get() + { + static MediaFoundation instance; + return instance; + } // MediaFoundation functions typedef HRESULT(WINAPI* PFN_MFStartup)(ULONG, DWORD); @@ -66,13 +73,6 @@ namespace kiwano typedef HRESULT(WINAPI* PFN_MFCreateSourceReaderFromByteStream)(IMFByteStream*, IMFAttributes*, IMFSourceReader**); typedef HRESULT(WINAPI* PFN_MFCreateMFByteStreamOnStream)(IStream*, IMFByteStream**); - public: - static inline MediaFoundation& Get() - { - static MediaFoundation instance; - return instance; - } - PFN_MFStartup MFStartup; PFN_MFShutdown MFShutdown; PFN_MFCreateMediaType MFCreateMediaType; @@ -80,6 +80,15 @@ namespace kiwano PFN_MFCreateSourceReaderFromURL MFCreateSourceReaderFromURL; PFN_MFCreateSourceReaderFromByteStream MFCreateSourceReaderFromByteStream; PFN_MFCreateMFByteStreamOnStream MFCreateMFByteStreamOnStream; + + private: + MediaFoundation(); + + MediaFoundation(const MediaFoundation&) = delete; + MediaFoundation& operator=(const MediaFoundation&) = delete; + + Library mfplat; + Library mfreadwrite; }; } } diff --git a/src/kiwano/2d/Actor.h b/src/kiwano/2d/Actor.h index 6d805471..74b4fdba 100644 --- a/src/kiwano/2d/Actor.h +++ b/src/kiwano/2d/Actor.h @@ -49,109 +49,109 @@ namespace kiwano Actor(); // 更新角色 - virtual void OnUpdate(Duration dt) { KGE_NOT_USED(dt); } + virtual void OnUpdate(Duration dt); // 渲染角色 - virtual void OnRender(RenderTarget* rt) { KGE_NOT_USED(rt); } + virtual void OnRender(RenderTarget* rt); // 获取显示状态 - bool IsVisible() const { return visible_; } + bool IsVisible() const; // 获取响应状态 - bool IsResponsible() const { return responsible_; } + bool IsResponsible() const; // 是否启用级联透明度 - bool IsCascadeOpacityEnabled() const { return cascade_opacity_; } + bool IsCascadeOpacityEnabled() const; // 获取名称的 Hash 值 - size_t GetHashName() const { return hash_name_; } + size_t GetHashName() const; // 获取 Z 轴顺序 - int GetZOrder() const { return z_order_; } + int GetZOrder() const; // 获取坐标 - Point const& GetPosition() const { return transform_.position; } + Point const& GetPosition() const; // 获取 x 坐标 - float GetPositionX() const { return GetPosition().x; } + float GetPositionX() const; // 获取 y 坐标 - float GetPositionY() const { return GetPosition().y; } + float GetPositionY() const; // 获取缩放比例 - Point const& GetScale() const { return transform_.scale; } + Point const& GetScale() const; // 获取横向缩放比例 - float GetScaleX() const { return GetScale().x; } + float GetScaleX() const; // 获取纵向缩放比例 - float GetScaleY() const { return GetScale().y; } + float GetScaleY() const; // 获取错切角度 - Point const& GetSkew() const { return transform_.skew; } + Point const& GetSkew() const; // 获取横向错切角度 - float GetSkewX() const { return GetSkew().x; } + float GetSkewX() const; // 获取纵向错切角度 - float GetSkewY() const { return GetSkew().y; } + float GetSkewY() const; // 获取旋转角度 - float GetRotation() const { return transform_.rotation; } + float GetRotation() const; // 获取宽度 - float GetWidth() const { return GetSize().x; } + float GetWidth() const; // 获取高度 - float GetHeight() const { return GetSize().y; } + float GetHeight() const; // 获取大小 - Size const& GetSize() const { return size_; } + Size const& GetSize() const; // 获取缩放后的宽度 - float GetScaledWidth() const { return GetWidth() * GetScaleX(); } + float GetScaledWidth() const; // 获取缩放后的高度 - float GetScaledHeight() const { return GetHeight() * GetScaleY(); } + float GetScaledHeight() const; // 获取缩放后的大小 - Size GetScaledSize() const { return Size{ GetScaledWidth(), GetScaledHeight() }; } + Size GetScaledSize() const; // 获取锚点 - Point const& GetAnchor() const { return anchor_; } + Point const& GetAnchor() const; // 获取 x 方向锚点 - float GetAnchorX() const { return GetAnchor().x; } + float GetAnchorX() const; // 获取 y 方向锚点 - float GetAnchorY() const { return GetAnchor().y; } + float GetAnchorY() const; // 获取透明度 - float GetOpacity() const { return opacity_; } + float GetOpacity() const; // 获取显示透明度 - float GetDisplayedOpacity() const { return displayed_opacity_; } + float GetDisplayedOpacity() const; // 获取变换 - Transform GetTransform() const { return transform_; } + Transform GetTransform() const; // 获取父角色 - inline Actor* GetParent() const { return parent_; } + Actor* GetParent() const; // 获取所在舞台 - inline Stage* GetStage() const { return stage_; } + Stage* GetStage() const; // 获取边框 - virtual Rect GetBounds() const; + virtual Rect GetBounds() const; // 获取外切包围盒 - virtual Rect GetBoundingBox() const; + virtual Rect GetBoundingBox() const; // 获取二维变换矩阵 - Matrix3x2 const& GetTransformMatrix() const; + Matrix3x2 const& GetTransformMatrix() const; // 获取二维变换的逆矩阵 - Matrix3x2 const& GetTransformInverseMatrix() const; + Matrix3x2 const& GetTransformInverseMatrix() const; // 设置是否显示 void SetVisible( @@ -169,13 +169,10 @@ namespace kiwano ); // 设置坐标 - inline void SetPosition( + void SetPosition( float x, float y - ) - { - SetPosition(Point{ x, y }); - } + ); // 设置横坐标 void SetPositionX( @@ -193,13 +190,10 @@ namespace kiwano ); // 移动坐标 - inline void Move( + void Move( float vx, float vy - ) - { - Move(Vec2{ vx, vy }); - } + ); // 设置缩放比例 // 默认为 (1.0, 1.0) @@ -209,13 +203,10 @@ namespace kiwano // 设置缩放比例 // 默认为 (1.0, 1.0) - inline void SetScale( + void SetScale( float scalex, float scaley - ) - { - SetScale(Vec2{ scalex, scaley }); - } + ); // 设置错切角度 // 默认为 (0, 0) @@ -225,13 +216,10 @@ namespace kiwano // 设置错切角度 // 默认为 (0, 0) - inline void SetSkew( + void SetSkew( float skewx, float skewy - ) - { - SetSkew(Vec2{ skewx, skewy }); - } + ); // 设置旋转角度 // 默认为 0 @@ -247,13 +235,10 @@ namespace kiwano // 设置锚点位置 // 默认为 (0, 0), 范围 [0, 1] - inline void SetAnchor( + void SetAnchor( float anchorx, float anchory - ) - { - SetAnchor(Vec2{ anchorx, anchory }); - } + ); // 修改宽度 virtual void SetWidth( @@ -271,13 +256,10 @@ namespace kiwano ); // 修改大小 - inline void SetSize( + void SetSize( float width, float height - ) - { - SetSize(Size{ width, height }); - } + ); // 设置透明度 // 默认为 1.0, 范围 [0, 1] @@ -364,6 +346,24 @@ namespace kiwano // 判断点是否在角色内 virtual bool ContainsPoint(const Point& point) const; + // 暂停角色更新 + void PauseUpdating(); + + // 继续角色更新 + void ResumeUpdating(); + + // 角色更新是否暂停 + bool IsUpdatePausing() const; + + // 设置更新时的回调函数 + void SetCallbackOnUpdate(UpdateCallback const& cb); + + // 获取更新时的回调函数 + UpdateCallback GetCallbackOnUpdate() const; + + // 渲染角色边界 + void ShowBorder(bool show); + // 事件分发 void Dispatch(Event& evt) override; @@ -373,24 +373,6 @@ namespace kiwano float anchor_y ); - // 暂停角色更新 - inline void PauseUpdating() { update_pausing_ = true; } - - // 继续角色更新 - inline void ResumeUpdating() { update_pausing_ = false; } - - // 角色更新是否暂停 - inline bool IsUpdatePausing() const { return update_pausing_; } - - // 设置更新时的回调函数 - inline void SetCallbackOnUpdate(UpdateCallback const& cb) { cb_update_ = cb; } - - // 获取更新时的回调函数 - inline UpdateCallback GetCallbackOnUpdate() const { return cb_update_; } - - // 渲染角色边界 - inline void ShowBorder(bool show) { show_border_ = show; } - protected: virtual void Update(Duration dt); @@ -439,4 +421,219 @@ namespace kiwano mutable Matrix3x2 transform_matrix_inverse_; }; + inline void Actor::OnUpdate(Duration dt) + { + KGE_NOT_USED(dt); + } + + inline void Actor::OnRender(RenderTarget* rt) + { + KGE_NOT_USED(rt); + } + + inline bool Actor::IsVisible() const + { + return visible_; + } + + inline bool Actor::IsResponsible() const + { + return responsible_; + } + + inline bool Actor::IsCascadeOpacityEnabled() const + { + return cascade_opacity_; + } + + inline size_t Actor::GetHashName() const + { + return hash_name_; + } + + inline int Actor::GetZOrder() const + { + return z_order_; + } + + inline Point const& Actor::GetPosition() const + { + return transform_.position; + } + + inline float Actor::GetPositionX() const + { + return GetPosition().x; + } + + inline float Actor::GetPositionY() const + { + return GetPosition().y; + } + + inline Point const& Actor::GetScale() const + { + return transform_.scale; + } + + inline float Actor::GetScaleX() const + { + return GetScale().x; + } + + inline float Actor::GetScaleY() const + { + return GetScale().y; + } + + inline Point const& Actor::GetSkew() const + { + return transform_.skew; + } + + inline float Actor::GetSkewX() const + { + return GetSkew().x; + } + + inline float Actor::GetSkewY() const + { + return GetSkew().y; + } + + inline float Actor::GetRotation() const + { + return transform_.rotation; + } + + inline float Actor::GetWidth() const + { + return GetSize().x; + } + + inline float Actor::GetHeight() const + { + return GetSize().y; + } + + inline Size const& Actor::GetSize() const + { + return size_; + } + + inline float Actor::GetScaledWidth() const + { + return GetWidth() * GetScaleX(); + } + + inline float Actor::GetScaledHeight() const + { + return GetHeight() * GetScaleY(); + } + + inline Size Actor::GetScaledSize() const + { + return Size{ GetScaledWidth(), GetScaledHeight() }; + } + + inline Point const& Actor::GetAnchor() const + { + return anchor_; + } + + inline float Actor::GetAnchorX() const + { + return GetAnchor().x; + } + + inline float Actor::GetAnchorY() const + { + return GetAnchor().y; + } + + inline float Actor::GetOpacity() const + { + return opacity_; + } + + inline float Actor::GetDisplayedOpacity() const + { + return displayed_opacity_; + } + + inline Transform Actor::GetTransform() const + { + return transform_; + } + + inline Actor* Actor::GetParent() const + { + return parent_; + } + + inline Stage* Actor::GetStage() const + { + return stage_; + } + + inline void Actor::PauseUpdating() + { + update_pausing_ = true; + } + + inline void Actor::ResumeUpdating() + { + update_pausing_ = false; + } + + inline bool Actor::IsUpdatePausing() const + { + return update_pausing_; + } + + inline void Actor::SetCallbackOnUpdate(UpdateCallback const& cb) + { + cb_update_ = cb; + } + + inline Actor::UpdateCallback Actor::GetCallbackOnUpdate() const + { + return cb_update_; + } + + inline void Actor::ShowBorder(bool show) + { + show_border_ = show; + } + + inline void Actor::SetPosition(float x, float y) + { + SetPosition(Point{ x, y }); + } + + inline void Actor::Move(float vx, float vy) + { + Move(Vec2{ vx, vy }); + } + + inline void Actor::SetScale(float scalex, float scaley) + { + SetScale(Vec2{ scalex, scaley }); + } + + inline void Actor::SetAnchor(float anchorx, float anchory) + { + SetAnchor(Vec2{ anchorx, anchory }); + } + + inline void Actor::SetSize(float width, float height) + { + SetSize(Size{ width, height }); + } + + inline void Actor::SetSkew(float skewx, float skewy) + { + SetSkew(Vec2{ skewx, skewy }); + } + } diff --git a/src/kiwano/2d/action/Action.h b/src/kiwano/2d/action/Action.h index 2b222214..915f29f8 100644 --- a/src/kiwano/2d/action/Action.h +++ b/src/kiwano/2d/action/Action.h @@ -36,42 +36,33 @@ namespace kiwano friend IntrusiveList; public: - enum class Status - { - NotStarted, - Delayed, - Started, - Done, - Removeable - }; - Action(); virtual ~Action(); // 继续动作 - inline void Resume() { running_ = true; } + void Resume(); // 暂停动作 - inline void Pause() { running_ = false; } + void Pause(); // 停止动作 - inline void Stop() { status_ = Status::Removeable; } + void Stop(); // 设置动作延时 - inline void SetDelay(Duration delay) { delay_ = delay; } + void SetDelay(Duration delay); // 设置循环次数 (-1 为永久循环) - inline void SetLoops(int loops) { loops_ = loops; } + void SetLoops(int loops); // 动作结束时移除目标角色 - inline void RemoveTargetWhenDone() { detach_target_ = true; } + void RemoveTargetWhenDone(); // 设置动作结束时的回调函数 - inline void SetDoneCallback(ActionCallback const& cb) { cb_done_ = cb; } + void SetDoneCallback(ActionCallback const& cb); // 设置动作循环结束时的回调函数 - inline void SetLoopDoneCallback(ActionCallback const& cb) { cb_loop_done_ = cb; } + void SetLoopDoneCallback(ActionCallback const& cb); // 获取动作的拷贝 virtual ActionPtr Clone() const = 0; @@ -79,25 +70,15 @@ namespace kiwano // 获取动作的倒转 virtual ActionPtr Reverse() const = 0; - inline void Done() { status_ = Status::Done; } + bool IsRunning() const; - inline Status GetStatus() const { return status_; } + int GetLoops() const; - inline bool IsRunning() const { return running_; } + Duration GetDelay() const; - inline bool IsDone() const { return status_ == Status::Done || status_ == Status::Removeable; } + ActionCallback GetDoneCallback() const; - inline bool IsRemoveable() const { return status_ == Status::Removeable; } - - inline int GetLoops() const { return loops_; } - - inline Duration GetDelay() const { return delay_; } - - inline Duration GetElapsed() const { return elapsed_; } - - inline ActionCallback GetDoneCallback() const { return cb_done_; } - - inline ActionCallback GetLoopDoneCallback() const { return cb_loop_done_; } + ActionCallback GetLoopDoneCallback() const; protected: virtual void Init(ActorPtr target); @@ -110,7 +91,28 @@ namespace kiwano void Restart(ActorPtr target); - protected: + enum class Status + { + NotStarted, + Delayed, + Started, + Done, + Removeable + }; + + Status GetStatus() const; + + Duration GetElapsed() const; + + int GetLoopsDone() const; + + void Done(); + + bool IsDone() const; + + bool IsRemoveable() const; + + private: Status status_; bool running_; bool detach_target_; @@ -121,4 +123,100 @@ namespace kiwano ActionCallback cb_done_; ActionCallback cb_loop_done_; }; + + + inline void Action::Resume() + { + running_ = true; + } + + inline void Action::Pause() + { + running_ = false; + } + + inline void Action::Stop() + { + Done(); + } + + inline void Action::SetDelay(Duration delay) + { + delay_ = delay; + } + + inline void Action::SetLoops(int loops) + { + loops_ = loops; + } + + inline void Action::RemoveTargetWhenDone() + { + detach_target_ = true; + } + + inline void Action::SetDoneCallback(ActionCallback const& cb) + { + cb_done_ = cb; + } + + inline void Action::SetLoopDoneCallback(ActionCallback const& cb) + { + cb_loop_done_ = cb; + } + + inline void Action::Done() + { + status_ = Status::Done; + } + + inline Action::Status Action::GetStatus() const + { + return status_; + } + + inline bool Action::IsRunning() const + { + return running_; + } + + inline bool Action::IsDone() const + { + return status_ == Status::Done || status_ == Status::Removeable; + } + + inline bool Action::IsRemoveable() const + { + return status_ == Status::Removeable; + } + + inline int Action::GetLoops() const + { + return loops_; + } + + inline Duration Action::GetDelay() const + { + return delay_; + } + + inline Duration Action::GetElapsed() const + { + return elapsed_; + } + + inline int Action::GetLoopsDone() const + { + return loops_done_; + } + + inline ActionCallback Action::GetDoneCallback() const + { + return cb_done_; + } + + inline ActionCallback Action::GetLoopDoneCallback() const + { + return cb_loop_done_; + } } diff --git a/src/kiwano/2d/action/ActionDelay.cpp b/src/kiwano/2d/action/ActionDelay.cpp index 17aea335..9daa2945 100644 --- a/src/kiwano/2d/action/ActionDelay.cpp +++ b/src/kiwano/2d/action/ActionDelay.cpp @@ -29,12 +29,12 @@ namespace kiwano ActionPtr ActionDelay::Clone() const { - return new ActionDelay(delay_); + return new ActionDelay(GetDelay()); } ActionPtr ActionDelay::Reverse() const { - return new ActionDelay(delay_); + return new ActionDelay(GetDelay()); } } diff --git a/src/kiwano/2d/action/ActionTween.cpp b/src/kiwano/2d/action/ActionTween.cpp index 48e135b2..0a53988b 100644 --- a/src/kiwano/2d/action/ActionTween.cpp +++ b/src/kiwano/2d/action/ActionTween.cpp @@ -108,15 +108,15 @@ namespace kiwano } else { - Duration elapsed = elapsed_ - delay_; + Duration elapsed = GetElapsed() - GetDelay(); float loops_done = elapsed / dur_; - while (loops_done_ < static_cast(loops_done)) + while (GetLoopsDone() < static_cast(loops_done)) { Complete(target); // loops_done_++ } - percent = (status_ == Status::Done) ? 1.f : (loops_done - static_cast(loops_done_)); + percent = (GetStatus() == Status::Done) ? 1.f : (loops_done - static_cast(GetLoopsDone())); } if (ease_func_) diff --git a/src/kiwano/base/Library.cpp b/src/kiwano/base/Library.cpp new file mode 100644 index 00000000..6756fdab --- /dev/null +++ b/src/kiwano/base/Library.cpp @@ -0,0 +1,68 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include + +namespace kiwano +{ + + Library::Library() + : instance_(nullptr) + { + } + + Library::Library(String const& lib) + : instance_(nullptr) + { + Load(lib); + } + + Library::~Library() + { + Free(); + } + + bool Library::Load(String const& lib) + { + instance_ = ::LoadLibraryW(lib.c_str()); + return IsValid(); + } + + bool Library::IsValid() const + { + return instance_ != nullptr; + } + + void Library::Free() + { + if (instance_) + { + ::FreeLibrary(instance_); + instance_ = nullptr; + } + } + + FARPROC Library::GetProcess(String const& proc_name) + { + KGE_ASSERT(instance_ != nullptr); + return GetProcAddress(instance_, wide_to_string(proc_name).c_str()); + } + +} diff --git a/src/kiwano/base/Library.h b/src/kiwano/base/Library.h new file mode 100644 index 00000000..9e1cf034 --- /dev/null +++ b/src/kiwano/base/Library.h @@ -0,0 +1,54 @@ +// Copyright (c) 2016-2018 Kiwano - Nomango +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#pragma once +#include +#include +#include + +namespace kiwano +{ + // DLL 库 + class KGE_API Library + { + public: + Library(); + Library(String const& lib); + virtual ~Library(); + + bool Load(String const& lib); + + bool IsValid() const; + + void Free(); + + FARPROC GetProcess(String const& proc_name); + + template + inline _Proc GetProcess(String const& proc_name) + { + return reinterpret_cast<_Proc>(GetProcess(proc_name)); + } + + private: + HMODULE instance_; + }; + +} diff --git a/src/kiwano/platform/modules.cpp b/src/kiwano/platform/modules.cpp index 0f3dac51..fe4aec97 100644 --- a/src/kiwano/platform/modules.cpp +++ b/src/kiwano/platform/modules.cpp @@ -26,18 +26,14 @@ namespace kiwano namespace modules { Shlwapi::Shlwapi() - : shlwapi(nullptr) + : shlwapi() , PathFileExistsW(nullptr) , SHCreateMemStream(nullptr) { - shlwapi = LoadLibraryW(L"shlwapi.dll"); - if (shlwapi) + if (shlwapi.Load(L"shlwapi.dll")) { - PathFileExistsW = (PFN_PathFileExistsW) - GetProcAddress(shlwapi, "PathFileExistsW"); - - SHCreateMemStream = (PFN_SHCreateMemStream) - GetProcAddress(shlwapi, "SHCreateMemStream"); + PathFileExistsW = shlwapi.GetProcess(L"PathFileExistsW"); + SHCreateMemStream = shlwapi.GetProcess(L"SHCreateMemStream"); } else { diff --git a/src/kiwano/platform/modules.h b/src/kiwano/platform/modules.h index 6a5bf47b..727a79fd 100644 --- a/src/kiwano/platform/modules.h +++ b/src/kiwano/platform/modules.h @@ -20,10 +20,7 @@ #pragma once #include -#include -#include -#include -#include +#include namespace kiwano { @@ -31,14 +28,6 @@ namespace kiwano { class KGE_API Shlwapi { - Shlwapi(); - - HMODULE shlwapi; - - // Shlwapi functions - typedef BOOL(WINAPI *PFN_PathFileExistsW)(LPCWSTR); - typedef IStream*(WINAPI *PFN_SHCreateMemStream)(const BYTE*, UINT); - public: static inline Shlwapi& Get() { @@ -46,8 +35,20 @@ namespace kiwano return instance; } + // Shlwapi functions + typedef BOOL(WINAPI* PFN_PathFileExistsW)(LPCWSTR); + typedef IStream* (WINAPI* PFN_SHCreateMemStream)(const BYTE*, UINT); + PFN_PathFileExistsW PathFileExistsW; PFN_SHCreateMemStream SHCreateMemStream; + + private: + Shlwapi(); + + Shlwapi(const Shlwapi&) = delete; + Shlwapi& operator=(const Shlwapi&) = delete; + + Library shlwapi; }; } }