Add exceptions
This commit is contained in:
		
							parent
							
								
									1e93eddb88
								
							
						
					
					
						commit
						56ae199587
					
				|  | @ -19,6 +19,7 @@ | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" /> |     <ClInclude Include="..\..\src\kiwano\core\event\KeyEvent.h" /> | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\event\MouseEvent.h" /> |     <ClInclude Include="..\..\src\kiwano\core\event\MouseEvent.h" /> | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\event\WindowEvent.h" /> |     <ClInclude Include="..\..\src\kiwano\core\event\WindowEvent.h" /> | ||||||
|  |     <ClInclude Include="..\..\src\kiwano\core\Exception.h" /> | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\Keys.h" /> |     <ClInclude Include="..\..\src\kiwano\core\Keys.h" /> | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\Library.h" /> |     <ClInclude Include="..\..\src\kiwano\core\Library.h" /> | ||||||
|     <ClInclude Include="..\..\src\kiwano\core\Singleton.h" /> |     <ClInclude Include="..\..\src\kiwano\core\Singleton.h" /> | ||||||
|  | @ -123,6 +124,7 @@ | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\event\KeyEvent.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\event\KeyEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\event\MouseEvent.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\event\MouseEvent.cpp" /> | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\event\WindowEvent.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\event\WindowEvent.cpp" /> | ||||||
|  |     <ClCompile Include="..\..\src\kiwano\core\Exception.cpp" /> | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\Library.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\Library.cpp" /> | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\Logger.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\Logger.cpp" /> | ||||||
|     <ClCompile Include="..\..\src\kiwano\core\ObjectBase.cpp" /> |     <ClCompile Include="..\..\src\kiwano\core\ObjectBase.cpp" /> | ||||||
|  |  | ||||||
|  | @ -300,6 +300,9 @@ | ||||||
|     <ClInclude Include="..\..\src\kiwano\platform\win32\WindowImpl.h"> |     <ClInclude Include="..\..\src\kiwano\platform\win32\WindowImpl.h"> | ||||||
|       <Filter>platform\win32</Filter> |       <Filter>platform\win32</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\..\src\kiwano\core\Exception.h"> | ||||||
|  |       <Filter>core</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp"> |     <ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp"> | ||||||
|  | @ -509,5 +512,8 @@ | ||||||
|     <ClCompile Include="..\..\src\kiwano\render\DirectX\RendererImpl.cpp"> |     <ClCompile Include="..\..\src\kiwano\render\DirectX\RendererImpl.cpp"> | ||||||
|       <Filter>render\DirectX</Filter> |       <Filter>render\DirectX</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="..\..\src\kiwano\core\Exception.cpp"> | ||||||
|  |       <Filter>core</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
| </Project> | </Project> | ||||||
|  | @ -51,7 +51,7 @@ void AudioEngine::SetupComponent() | ||||||
|         hr = x_audio2_->CreateMasteringVoice(&mastering_voice_); |         hr = x_audio2_->CreateMasteringVoice(&mastering_voice_); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create audio resources failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void AudioEngine::DestroyComponent() | void AudioEngine::DestroyComponent() | ||||||
|  | @ -100,7 +100,7 @@ bool AudioEngine::CreateSound(Sound& sound, const Transcoder::Buffer& buffer) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::WarnIfFailed(hr); |     win32::WarnIfFailed(hr, "Create sound failed"); | ||||||
|     return SUCCEEDED(hr); |     return SUCCEEDED(hr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,60 @@ | ||||||
|  | // 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 <kiwano/core/Exception.h> | ||||||
|  | 
 | ||||||
|  | namespace kiwano | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | Exception::Exception() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Exception::Exception(String const& message) | ||||||
|  |     : message_(message) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Exception::~Exception() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const String& Exception::ToString() const | ||||||
|  | { | ||||||
|  |     return message_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const char* Exception::what() const | ||||||
|  | { | ||||||
|  |     return message_.c_str(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SystemException::SystemException() | ||||||
|  |     : code_(0) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | SystemException::SystemException(ErrorCodeType code, String const& message) | ||||||
|  |     : Exception(message) | ||||||
|  |     , code_(code) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | }  // namespace kiwano
 | ||||||
|  | @ -0,0 +1,91 @@ | ||||||
|  | // 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 <kiwano/core/Common.h> | ||||||
|  | #include <kiwano/macros.h> | ||||||
|  | #include <stdexcept> | ||||||
|  | 
 | ||||||
|  | namespace kiwano | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \~chinese | ||||||
|  |  * @brief 异常 | ||||||
|  |  */ | ||||||
|  | class KGE_API Exception : public std::exception | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     Exception(); | ||||||
|  | 
 | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 构造异常
 | ||||||
|  |     /// @param message 描述异常的信息
 | ||||||
|  |     explicit Exception(String const& message); | ||||||
|  | 
 | ||||||
|  |     virtual ~Exception(); | ||||||
|  | 
 | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 转为解释性字符串
 | ||||||
|  |     const String& ToString() const; | ||||||
|  | 
 | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 转为解释性字符串
 | ||||||
|  |     virtual const char* what() const override; | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  |     String message_; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * \~chinese | ||||||
|  |  * @brief 系统异常 | ||||||
|  |  */ | ||||||
|  | class SystemException : public Exception | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | #if defined(KGE_WIN32) | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 错误代码类型
 | ||||||
|  |     typedef HRESULT ErrorCodeType; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  |     SystemException(); | ||||||
|  | 
 | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 构造系统异常
 | ||||||
|  |     /// @param code 错误代码
 | ||||||
|  |     /// @param message 描述异常的信息
 | ||||||
|  |     SystemException(ErrorCodeType code, String const& message); | ||||||
|  | 
 | ||||||
|  |     /// \~chinese
 | ||||||
|  |     /// @brief 获取错误代码
 | ||||||
|  |     ErrorCodeType GetErrorCode() const; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     ErrorCodeType code_; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | inline SystemException::ErrorCodeType SystemException::GetErrorCode() const | ||||||
|  | { | ||||||
|  |     return code_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | }  // namespace kiwano
 | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
| #include <kiwano/core/Time.h> | #include <kiwano/core/Time.h> | ||||||
| #include <regex> | #include <regex> | ||||||
|  | @ -357,7 +358,7 @@ Duration Duration::Parse(const String& format) | ||||||
| 
 | 
 | ||||||
|     if (!std::regex_match(format.c_str(), duration_regex)) |     if (!std::regex_match(format.c_str(), duration_regex)) | ||||||
|     { |     { | ||||||
|         throw std::runtime_error("Duration::Parse failed, invalid duration"); |         throw Exception("Duration::Parse failed, invalid duration"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (format.empty() || format == "0") |     if (format.empty() || format == "0") | ||||||
|  | @ -390,7 +391,7 @@ Duration Duration::Parse(const String& format) | ||||||
|         pos = i; |         pos = i; | ||||||
| 
 | 
 | ||||||
|         if (num_str.empty() || num_str == ".") |         if (num_str.empty() || num_str == ".") | ||||||
|             throw std::runtime_error("Duration::Parse failed, invalid duration"); |             throw Exception("Duration::Parse failed, invalid duration"); | ||||||
| 
 | 
 | ||||||
|         // µ¥Î»
 |         // µ¥Î»
 | ||||||
|         for (; i < len; ++i) |         for (; i < len; ++i) | ||||||
|  | @ -407,7 +408,7 @@ Duration Duration::Parse(const String& format) | ||||||
|         pos = i; |         pos = i; | ||||||
| 
 | 
 | ||||||
|         if (unit_map.find(unit_str) == unit_map.end()) |         if (unit_map.find(unit_str) == unit_map.end()) | ||||||
|             throw std::runtime_error("Duration::Parse failed, invalid duration"); |             throw Exception("Duration::Parse failed, invalid duration"); | ||||||
| 
 | 
 | ||||||
|         double   num  = std::stod(num_str.c_str()); |         double   num  = std::stod(num_str.c_str()); | ||||||
|         Duration unit = unit_map.at(unit_str); |         Duration unit = unit_map.at(unit_str); | ||||||
|  |  | ||||||
|  | @ -107,7 +107,7 @@ struct KGE_API Duration | ||||||
|     ///   例如: "300ms", "-1.5h", "2h45m"
 |     ///   例如: "300ms", "-1.5h", "2h45m"
 | ||||||
|     ///   允许的时间单位有 "ms", "s", "m", "h"
 |     ///   允许的时间单位有 "ms", "s", "m", "h"
 | ||||||
|     /// @return 解析出的时间段
 |     /// @return 解析出的时间段
 | ||||||
|     /// @throw std::runtime_error 传入了一个不合法的格式
 |     /// @throw kiwano::Exception 传入一个不合法的格式时抛出
 | ||||||
|     static Duration Parse(const String& str); |     static Duration Parse(const String& str); | ||||||
| 
 | 
 | ||||||
|     static const Duration Ms;      ///< 毫秒
 |     static const Duration Ms;      ///< 毫秒
 | ||||||
|  |  | ||||||
|  | @ -66,7 +66,7 @@ public: | ||||||
|      * @param icon 图标资源ID |      * @param icon 图标资源ID | ||||||
|      * @param resizable 窗口大小可拉伸 |      * @param resizable 窗口大小可拉伸 | ||||||
|      * @param fullscreen 全屏模式 |      * @param fullscreen 全屏模式 | ||||||
|      * @throw std::runtime_error 窗口创建失败时抛出 |      * @throw kiwano::SystemException 窗口创建失败时抛出 | ||||||
|      */ |      */ | ||||||
|     virtual void Create(String const& title, uint32_t width, uint32_t height, uint32_t icon = 0, bool resizable = false, |     virtual void Create(String const& title, uint32_t width, uint32_t height, uint32_t icon = 0, bool resizable = false, | ||||||
|                         bool fullscreen = false) = 0; |                         bool fullscreen = false) = 0; | ||||||
|  |  | ||||||
|  | @ -24,6 +24,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <Windowsx.h>  // GET_X_LPARAM, GET_Y_LPARAM
 | #include <Windowsx.h>  // GET_X_LPARAM, GET_Y_LPARAM
 | ||||||
| #include <imm.h>       // ImmAssociateContext
 | #include <imm.h>       // ImmAssociateContext
 | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
| #include <kiwano/core/event/KeyEvent.h> | #include <kiwano/core/event/KeyEvent.h> | ||||||
| #include <kiwano/core/event/MouseEvent.h> | #include <kiwano/core/event/MouseEvent.h> | ||||||
|  | @ -236,7 +237,7 @@ void WindowImpl::Create(String const& title, uint32_t width, uint32_t height, ui | ||||||
|         ::UnregisterClassW(L"KiwanoAppWnd", hinst); |         ::UnregisterClassW(L"KiwanoAppWnd", hinst); | ||||||
| 
 | 
 | ||||||
|         KGE_ERROR("Failed with HRESULT of %08X", HRESULT_FROM_WIN32(GetLastError())); |         KGE_ERROR("Failed with HRESULT of %08X", HRESULT_FROM_WIN32(GetLastError())); | ||||||
|         throw std::runtime_error("Create window failed"); |         throw SystemException(HRESULT_FROM_WIN32(GetLastError()), "Create window failed"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     width_ = width; |     width_ = width; | ||||||
|  |  | ||||||
|  | @ -19,9 +19,8 @@ | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
| #include <kiwano/macros.h> |  | ||||||
| #include <stdexcept> |  | ||||||
| 
 | 
 | ||||||
| namespace kiwano | namespace kiwano | ||||||
| { | { | ||||||
|  | @ -31,25 +30,23 @@ void PrintCallStack(); | ||||||
| 
 | 
 | ||||||
| void PrintCallStackOnContext(PCONTEXT pContext); | void PrintCallStackOnContext(PCONTEXT pContext); | ||||||
| 
 | 
 | ||||||
| inline void ThrowIfFailed(HRESULT hr) | inline void ThrowIfFailed(HRESULT hr, const String& message) | ||||||
| { | { | ||||||
|     if (FAILED(hr)) |     if (FAILED(hr)) | ||||||
|     { |     { | ||||||
|         PrintCallStack(); |         PrintCallStack(); | ||||||
| 
 | 
 | ||||||
|         static char buffer[32]; |         throw SystemException(hr, message); | ||||||
|         sprintf_s(buffer, "Failed with HRESULT of %08X", hr); |  | ||||||
|         throw std::runtime_error(buffer); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline void WarnIfFailed(HRESULT hr) | inline void WarnIfFailed(HRESULT hr, const String& message) | ||||||
| { | { | ||||||
|     if (FAILED(hr)) |     if (FAILED(hr)) | ||||||
|     { |     { | ||||||
|         PrintCallStack(); |         PrintCallStack(); | ||||||
| 
 | 
 | ||||||
|         KGE_WARN("Failed with HRESULT of %08X", hr); |         KGE_WARN("Failed with HRESULT of %08X: ", hr, message.c_str()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
| #include <kiwano/platform/win32/libraries.h> | #include <kiwano/platform/win32/libraries.h> | ||||||
| 
 | 
 | ||||||
|  | @ -41,7 +42,7 @@ Shlwapi::Shlwapi() | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         KGE_ERROR("Load shlapi.dll failed"); |         KGE_ERROR("Load shlapi.dll failed"); | ||||||
|         throw std::runtime_error("Load shlapi.dll failed"); |         throw SystemException(HRESULT_FROM_WIN32(GetLastError()), "Load shlapi.dll failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ struct D3D10DeviceResources : public ID3D10DeviceResources | ||||||
| public: | public: | ||||||
|     HRESULT Present(bool vsync); |     HRESULT Present(bool vsync); | ||||||
| 
 | 
 | ||||||
|     HRESULT ClearRenderTarget(Color& clear_color); |     void ClearRenderTarget(Color& clear_color); | ||||||
| 
 | 
 | ||||||
|     HRESULT HandleDeviceLost(); |     HRESULT HandleDeviceLost(); | ||||||
| 
 | 
 | ||||||
|  | @ -164,14 +164,13 @@ HRESULT D3D10DeviceResources::Present(bool vsync) | ||||||
|     return dxgi_swap_chain_->Present(vsync ? 1 : 0, 0); |     return dxgi_swap_chain_->Present(vsync ? 1 : 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| HRESULT D3D10DeviceResources::ClearRenderTarget(Color& clear_color) | void D3D10DeviceResources::ClearRenderTarget(Color& clear_color) | ||||||
| { | { | ||||||
|     KGE_ASSERT(device_ != nullptr && rt_view_ != nullptr && ds_view_ != nullptr); |     KGE_ASSERT(device_ != nullptr && rt_view_ != nullptr && ds_view_ != nullptr); | ||||||
| 
 | 
 | ||||||
|     auto rt_view = rt_view_.get(); |     auto rt_view = rt_view_.get(); | ||||||
|     device_->OMSetRenderTargets(1, &rt_view, ds_view_.get()); |     device_->OMSetRenderTargets(1, &rt_view, ds_view_.get()); | ||||||
|     device_->ClearRenderTargetView(rt_view, reinterpret_cast<float*>(&clear_color)); |     device_->ClearRenderTargetView(rt_view, reinterpret_cast<float*>(&clear_color)); | ||||||
|     return S_OK; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void D3D10DeviceResources::DiscardResources() | void D3D10DeviceResources::DiscardResources() | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ struct D3D11DeviceResources : public ID3D11DeviceResources | ||||||
| public: | public: | ||||||
|     HRESULT Present(bool vsync) override; |     HRESULT Present(bool vsync) override; | ||||||
| 
 | 
 | ||||||
|     HRESULT ClearRenderTarget(Color& clear_color) override; |     void ClearRenderTarget(Color& clear_color) override; | ||||||
| 
 | 
 | ||||||
|     HRESULT HandleDeviceLost() override; |     HRESULT HandleDeviceLost() override; | ||||||
| 
 | 
 | ||||||
|  | @ -156,14 +156,13 @@ HRESULT D3D11DeviceResources::Present(bool vsync) | ||||||
|     return dxgi_swap_chain_->Present(vsync ? 1 : 0, 0); |     return dxgi_swap_chain_->Present(vsync ? 1 : 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| HRESULT D3D11DeviceResources::ClearRenderTarget(Color& clear_color) | void D3D11DeviceResources::ClearRenderTarget(Color& clear_color) | ||||||
| { | { | ||||||
|     KGE_ASSERT(device_context_ != nullptr && rt_view_ != nullptr && ds_view_ != nullptr); |     KGE_ASSERT(device_context_ != nullptr && rt_view_ != nullptr && ds_view_ != nullptr); | ||||||
| 
 | 
 | ||||||
|     auto rt_view = rt_view_.get(); |     auto rt_view = rt_view_.get(); | ||||||
|     device_context_->OMSetRenderTargets(1, &rt_view, ds_view_.get()); |     device_context_->OMSetRenderTargets(1, &rt_view, ds_view_.get()); | ||||||
|     device_context_->ClearRenderTargetView(rt_view, reinterpret_cast<float*>(&clear_color)); |     device_context_->ClearRenderTargetView(rt_view, reinterpret_cast<float*>(&clear_color)); | ||||||
|     return S_OK; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void D3D11DeviceResources::DiscardResources() | void D3D11DeviceResources::DiscardResources() | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ ID3DDeviceResourcesBase : public IUnknown | ||||||
| public: | public: | ||||||
|     virtual HRESULT Present(bool vsync) = 0; |     virtual HRESULT Present(bool vsync) = 0; | ||||||
| 
 | 
 | ||||||
|     virtual HRESULT ClearRenderTarget(Color & clear_color) = 0; |     virtual void ClearRenderTarget(Color & clear_color) = 0; | ||||||
| 
 | 
 | ||||||
|     virtual HRESULT HandleDeviceLost() = 0; |     virtual HRESULT HandleDeviceLost() = 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -86,7 +86,7 @@ void RenderContextImpl::BeginDraw() | ||||||
| 
 | 
 | ||||||
| void RenderContextImpl::EndDraw() | void RenderContextImpl::EndDraw() | ||||||
| { | { | ||||||
|     win32::ThrowIfFailed(render_target_->EndDraw()); |     win32::ThrowIfFailed(render_target_->EndDraw(), "ID2D1RenderTarget EndDraw failed"); | ||||||
| 
 | 
 | ||||||
|     RenderContext::EndDraw(); |     RenderContext::EndDraw(); | ||||||
| 
 | 
 | ||||||
|  | @ -314,7 +314,7 @@ void RenderContextImpl::CreateTexture(Texture& texture, math::Vec2T<uint32_t> si | ||||||
|         texture.SetBitmap(saved_bitmap); |         texture.SetBitmap(saved_bitmap); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create texture failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RenderContextImpl::PushClipRect(Rect const& clip_rect) | void RenderContextImpl::PushClipRect(Rect const& clip_rect) | ||||||
|  | @ -336,6 +336,7 @@ void RenderContextImpl::PushLayer(LayerArea& layer) | ||||||
|     if (!layer.IsValid()) |     if (!layer.IsValid()) | ||||||
|     { |     { | ||||||
|         ComPtr<ID2D1Layer> output; |         ComPtr<ID2D1Layer> output; | ||||||
|  | 
 | ||||||
|         HRESULT hr = render_target_->CreateLayer(&output); |         HRESULT hr = render_target_->CreateLayer(&output); | ||||||
| 
 | 
 | ||||||
|         if (SUCCEEDED(hr)) |         if (SUCCEEDED(hr)) | ||||||
|  | @ -344,7 +345,7 @@ void RenderContextImpl::PushLayer(LayerArea& layer) | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             win32::ThrowIfFailed(hr); |             win32::ThrowIfFailed(hr, "Create ID2D1Layer failed"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ | ||||||
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | ||||||
| // THE SOFTWARE.
 | // THE SOFTWARE.
 | ||||||
| 
 | 
 | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
| #include <kiwano/core/event/WindowEvent.h> | #include <kiwano/core/event/WindowEvent.h> | ||||||
| #include <kiwano/platform/FileSystem.h> | #include <kiwano/platform/FileSystem.h> | ||||||
|  | @ -49,7 +50,7 @@ void RendererImpl::SetupComponent() | ||||||
| { | { | ||||||
|     KGE_SYS_LOG("Creating device resources"); |     KGE_SYS_LOG("Creating device resources"); | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(::CoInitialize(nullptr)); |     win32::ThrowIfFailed(::CoInitialize(nullptr), "CoInitialize failed"); | ||||||
| 
 | 
 | ||||||
|     HWND target_window = WindowImpl::GetInstance().GetHandle(); |     HWND target_window = WindowImpl::GetInstance().GetHandle(); | ||||||
|     output_size_   = Window::GetInstance().GetSize(); |     output_size_   = Window::GetInstance().GetSize(); | ||||||
|  | @ -111,7 +112,7 @@ void RendererImpl::SetupComponent() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create render resources failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::DestroyComponent() | void RendererImpl::DestroyComponent() | ||||||
|  | @ -149,8 +150,7 @@ void RendererImpl::Clear() | ||||||
| { | { | ||||||
|     KGE_ASSERT(d3d_res_); |     KGE_ASSERT(d3d_res_); | ||||||
| 
 | 
 | ||||||
|     HRESULT hr = d3d_res_->ClearRenderTarget(clear_color_); |     d3d_res_->ClearRenderTarget(clear_color_); | ||||||
|     win32::ThrowIfFailed(hr); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::Present() | void RendererImpl::Present() | ||||||
|  | @ -165,7 +165,7 @@ void RendererImpl::Present() | ||||||
|         hr = HandleDeviceLost(); |         hr = HandleDeviceLost(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Unexpected DXGI exception"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::HandleEvent(Event* evt) | void RendererImpl::HandleEvent(Event* evt) | ||||||
|  | @ -244,7 +244,7 @@ void RendererImpl::CreateTexture(Texture& texture, String const& file_path) | ||||||
| 
 | 
 | ||||||
|     if (FAILED(hr)) |     if (FAILED(hr)) | ||||||
|     { |     { | ||||||
|         KGE_WARN("Load texture failed with HRESULT of %08X!", hr); |         win32::ThrowIfFailed(hr, "Load texture failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -562,7 +562,7 @@ void RendererImpl::CreateFontCollection(Font& font, String const& file_path) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create font collection failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateFontCollection(Font& font, Resource const& res) | void RendererImpl::CreateFontCollection(Font& font, Resource const& res) | ||||||
|  | @ -593,7 +593,7 @@ void RendererImpl::CreateFontCollection(Font& font, Resource const& res) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create font collection failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateTextFormat(TextLayout& layout) | void RendererImpl::CreateTextFormat(TextLayout& layout) | ||||||
|  | @ -620,7 +620,7 @@ void RendererImpl::CreateTextFormat(TextLayout& layout) | ||||||
|         layout.SetTextFormat(output); |         layout.SetTextFormat(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create text format failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateTextLayout(TextLayout& layout) | void RendererImpl::CreateTextLayout(TextLayout& layout) | ||||||
|  | @ -644,7 +644,7 @@ void RendererImpl::CreateTextLayout(TextLayout& layout) | ||||||
|         layout.SetTextLayout(output); |         layout.SetTextLayout(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create text layout failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateLineShape(Shape& shape, Point const& begin_pos, Point const& end_pos) | void RendererImpl::CreateLineShape(Shape& shape, Point const& begin_pos, Point const& end_pos) | ||||||
|  | @ -680,7 +680,7 @@ void RendererImpl::CreateLineShape(Shape& shape, Point const& begin_pos, Point c | ||||||
|         shape.SetGeometry(path_geo); |         shape.SetGeometry(path_geo); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create ID2D1PathGeometry failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateRectShape(Shape& shape, Rect const& rect) | void RendererImpl::CreateRectShape(Shape& shape, Rect const& rect) | ||||||
|  | @ -702,7 +702,7 @@ void RendererImpl::CreateRectShape(Shape& shape, Rect const& rect) | ||||||
|         shape.SetGeometry(output); |         shape.SetGeometry(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create ID2D1RectangleGeometry failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateRoundedRectShape(Shape& shape, Rect const& rect, Vec2 const& radius) | void RendererImpl::CreateRoundedRectShape(Shape& shape, Rect const& rect, Vec2 const& radius) | ||||||
|  | @ -725,7 +725,7 @@ void RendererImpl::CreateRoundedRectShape(Shape& shape, Rect const& rect, Vec2 c | ||||||
|         shape.SetGeometry(output); |         shape.SetGeometry(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create ID2D1RoundedRectangleGeometry failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateEllipseShape(Shape& shape, Point const& center, Vec2 const& radius) | void RendererImpl::CreateEllipseShape(Shape& shape, Point const& center, Vec2 const& radius) | ||||||
|  | @ -748,7 +748,7 @@ void RendererImpl::CreateEllipseShape(Shape& shape, Point const& center, Vec2 co | ||||||
|         shape.SetGeometry(output); |         shape.SetGeometry(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create ID2D1EllipseGeometry failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateShapeSink(ShapeSink& sink) | void RendererImpl::CreateShapeSink(ShapeSink& sink) | ||||||
|  | @ -770,7 +770,133 @@ void RendererImpl::CreateShapeSink(ShapeSink& sink) | ||||||
|         sink.SetPathGeometry(output); |         sink.SetPathGeometry(output); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Create ID2D1PathGeometry failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void RendererImpl::CreateBrush(Brush& brush, Color const& color) | ||||||
|  | { | ||||||
|  |     HRESULT hr = S_OK; | ||||||
|  |     if (!d2d_res_) | ||||||
|  |     { | ||||||
|  |         hr = E_UNEXPECTED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (SUCCEEDED(hr)) | ||||||
|  |     { | ||||||
|  |         ComPtr<ID2D1SolidColorBrush> solid_brush; | ||||||
|  | 
 | ||||||
|  |         if (brush.GetType() == Brush::Type::SolidColor && brush.GetBrush()) | ||||||
|  |         { | ||||||
|  |             hr = brush.GetBrush()->QueryInterface(&solid_brush); | ||||||
|  |             if (SUCCEEDED(hr)) | ||||||
|  |             { | ||||||
|  |                 solid_brush->SetColor(DX::ConvertToColorF(color)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             hr = d2d_res_->GetDeviceContext()->CreateSolidColorBrush(DX::ConvertToColorF(color), &solid_brush); | ||||||
|  | 
 | ||||||
|  |             if (SUCCEEDED(hr)) | ||||||
|  |             { | ||||||
|  |                 brush.SetBrush(solid_brush, Brush::Type::SolidColor); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     win32::ThrowIfFailed(hr, "Create ID2D1SolidBrush failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void RendererImpl::CreateBrush(Brush& brush, LinearGradientStyle const& style) | ||||||
|  | { | ||||||
|  |     HRESULT hr = S_OK; | ||||||
|  |     if (!d2d_res_) | ||||||
|  |     { | ||||||
|  |         hr = E_UNEXPECTED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (SUCCEEDED(hr)) | ||||||
|  |     { | ||||||
|  |         ComPtr<ID2D1GradientStopCollection> collection; | ||||||
|  |         hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection( | ||||||
|  |             reinterpret_cast<const D2D1_GRADIENT_STOP*>(&style.stops[0]), UINT32(style.stops.size()), D2D1_GAMMA_2_2, | ||||||
|  |             D2D1_EXTEND_MODE(style.extend_mode), &collection); | ||||||
|  | 
 | ||||||
|  |         if (SUCCEEDED(hr)) | ||||||
|  |         { | ||||||
|  |             ComPtr<ID2D1LinearGradientBrush> output; | ||||||
|  |             hr = d2d_res_->GetDeviceContext()->CreateLinearGradientBrush( | ||||||
|  |                 D2D1::LinearGradientBrushProperties(DX::ConvertToPoint2F(style.begin), DX::ConvertToPoint2F(style.end)), | ||||||
|  |                 collection.get(), &output); | ||||||
|  | 
 | ||||||
|  |             if (SUCCEEDED(hr)) | ||||||
|  |             { | ||||||
|  |                 brush.SetBrush(output, Brush::Type::LinearGradient); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     win32::ThrowIfFailed(hr, "Create ID2D1LinearGradientBrush failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void RendererImpl::CreateBrush(Brush& brush, RadialGradientStyle const& style) | ||||||
|  | { | ||||||
|  |     HRESULT hr = S_OK; | ||||||
|  |     if (!d2d_res_) | ||||||
|  |     { | ||||||
|  |         hr = E_UNEXPECTED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (SUCCEEDED(hr)) | ||||||
|  |     { | ||||||
|  |         ComPtr<ID2D1GradientStopCollection> collection; | ||||||
|  |         hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection( | ||||||
|  |             reinterpret_cast<const D2D1_GRADIENT_STOP*>(&style.stops[0]), UINT32(style.stops.size()), D2D1_GAMMA_2_2, | ||||||
|  |             D2D1_EXTEND_MODE(style.extend_mode), &collection); | ||||||
|  | 
 | ||||||
|  |         if (SUCCEEDED(hr)) | ||||||
|  |         { | ||||||
|  |             ComPtr<ID2D1RadialGradientBrush> output; | ||||||
|  |             hr = d2d_res_->GetDeviceContext()->CreateRadialGradientBrush( | ||||||
|  |                 D2D1::RadialGradientBrushProperties(DX::ConvertToPoint2F(style.center), | ||||||
|  |                                                     DX::ConvertToPoint2F(style.offset), style.radius.x, style.radius.y), | ||||||
|  |                 collection.get(), &output); | ||||||
|  | 
 | ||||||
|  |             if (SUCCEEDED(hr)) | ||||||
|  |             { | ||||||
|  |                 brush.SetBrush(output, Brush::Type::RadialGradient); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     win32::ThrowIfFailed(hr, "Create ID2D1RadialGradientBrush failed"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void RendererImpl::CreateStrokeStyle(StrokeStyle& stroke_style, CapStyle cap, LineJoinStyle line_join, | ||||||
|  |                                  const float* dash_array, size_t dash_size, float dash_offset) | ||||||
|  | { | ||||||
|  |     HRESULT hr = S_OK; | ||||||
|  |     if (!d2d_res_) | ||||||
|  |     { | ||||||
|  |         hr = E_UNEXPECTED; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (SUCCEEDED(hr)) | ||||||
|  |     { | ||||||
|  |         D2D1_STROKE_STYLE_PROPERTIES style = | ||||||
|  |             D2D1::StrokeStyleProperties(D2D1_CAP_STYLE(cap), D2D1_CAP_STYLE(cap), D2D1_CAP_STYLE(cap), | ||||||
|  |                                         D2D1_LINE_JOIN(line_join), 10.0f, D2D1_DASH_STYLE_CUSTOM, dash_offset); | ||||||
|  | 
 | ||||||
|  |         ComPtr<ID2D1StrokeStyle> output; | ||||||
|  |         hr = d2d_res_->GetFactory()->CreateStrokeStyle(style, dash_array, dash_size, &output); | ||||||
|  | 
 | ||||||
|  |         if (SUCCEEDED(hr)) | ||||||
|  |         { | ||||||
|  |             stroke_style.SetStrokeStyle(output); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     win32::ThrowIfFailed(hr, "Create ID2D1StrokeStyle failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TextureRenderContextPtr RendererImpl::CreateTextureRenderContext(const Size* desired_size) | TextureRenderContextPtr RendererImpl::CreateTextureRenderContext(const Size* desired_size) | ||||||
|  | @ -814,132 +940,6 @@ TextureRenderContextPtr RendererImpl::CreateTextureRenderContext(const Size* des | ||||||
|     return nullptr; |     return nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RendererImpl::CreateBrush(Brush& brush, Color const& color) |  | ||||||
| { |  | ||||||
|     HRESULT hr = S_OK; |  | ||||||
|     if (!d2d_res_) |  | ||||||
|     { |  | ||||||
|         hr = E_UNEXPECTED; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (SUCCEEDED(hr)) |  | ||||||
|     { |  | ||||||
|         ComPtr<ID2D1SolidColorBrush> solid_brush; |  | ||||||
| 
 |  | ||||||
|         if (brush.GetType() == Brush::Type::SolidColor && brush.GetBrush()) |  | ||||||
|         { |  | ||||||
|             hr = brush.GetBrush()->QueryInterface(&solid_brush); |  | ||||||
|             if (SUCCEEDED(hr)) |  | ||||||
|             { |  | ||||||
|                 solid_brush->SetColor(DX::ConvertToColorF(color)); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             hr = d2d_res_->GetDeviceContext()->CreateSolidColorBrush(DX::ConvertToColorF(color), &solid_brush); |  | ||||||
| 
 |  | ||||||
|             if (SUCCEEDED(hr)) |  | ||||||
|             { |  | ||||||
|                 brush.SetBrush(solid_brush, Brush::Type::SolidColor); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     win32::ThrowIfFailed(hr); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void RendererImpl::CreateBrush(Brush& brush, LinearGradientStyle const& style) |  | ||||||
| { |  | ||||||
|     HRESULT hr = S_OK; |  | ||||||
|     if (!d2d_res_) |  | ||||||
|     { |  | ||||||
|         hr = E_UNEXPECTED; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (SUCCEEDED(hr)) |  | ||||||
|     { |  | ||||||
|         ComPtr<ID2D1GradientStopCollection> collection; |  | ||||||
|         hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection( |  | ||||||
|             reinterpret_cast<const D2D1_GRADIENT_STOP*>(&style.stops[0]), UINT32(style.stops.size()), D2D1_GAMMA_2_2, |  | ||||||
|             D2D1_EXTEND_MODE(style.extend_mode), &collection); |  | ||||||
| 
 |  | ||||||
|         if (SUCCEEDED(hr)) |  | ||||||
|         { |  | ||||||
|             ComPtr<ID2D1LinearGradientBrush> output; |  | ||||||
|             hr = d2d_res_->GetDeviceContext()->CreateLinearGradientBrush( |  | ||||||
|                 D2D1::LinearGradientBrushProperties(DX::ConvertToPoint2F(style.begin), DX::ConvertToPoint2F(style.end)), |  | ||||||
|                 collection.get(), &output); |  | ||||||
| 
 |  | ||||||
|             if (SUCCEEDED(hr)) |  | ||||||
|             { |  | ||||||
|                 brush.SetBrush(output, Brush::Type::LinearGradient); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     win32::ThrowIfFailed(hr); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void RendererImpl::CreateBrush(Brush& brush, RadialGradientStyle const& style) |  | ||||||
| { |  | ||||||
|     HRESULT hr = S_OK; |  | ||||||
|     if (!d2d_res_) |  | ||||||
|     { |  | ||||||
|         hr = E_UNEXPECTED; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (SUCCEEDED(hr)) |  | ||||||
|     { |  | ||||||
|         ComPtr<ID2D1GradientStopCollection> collection; |  | ||||||
|         hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection( |  | ||||||
|             reinterpret_cast<const D2D1_GRADIENT_STOP*>(&style.stops[0]), UINT32(style.stops.size()), D2D1_GAMMA_2_2, |  | ||||||
|             D2D1_EXTEND_MODE(style.extend_mode), &collection); |  | ||||||
| 
 |  | ||||||
|         if (SUCCEEDED(hr)) |  | ||||||
|         { |  | ||||||
|             ComPtr<ID2D1RadialGradientBrush> output; |  | ||||||
|             hr = d2d_res_->GetDeviceContext()->CreateRadialGradientBrush( |  | ||||||
|                 D2D1::RadialGradientBrushProperties(DX::ConvertToPoint2F(style.center), |  | ||||||
|                                                     DX::ConvertToPoint2F(style.offset), style.radius.x, style.radius.y), |  | ||||||
|                 collection.get(), &output); |  | ||||||
| 
 |  | ||||||
|             if (SUCCEEDED(hr)) |  | ||||||
|             { |  | ||||||
|                 brush.SetBrush(output, Brush::Type::RadialGradient); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     win32::ThrowIfFailed(hr); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void RendererImpl::CreateStrokeStyle(StrokeStyle& stroke_style, CapStyle cap, LineJoinStyle line_join, |  | ||||||
|                                  const float* dash_array, size_t dash_size, float dash_offset) |  | ||||||
| { |  | ||||||
|     HRESULT hr = S_OK; |  | ||||||
|     if (!d2d_res_) |  | ||||||
|     { |  | ||||||
|         hr = E_UNEXPECTED; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (SUCCEEDED(hr)) |  | ||||||
|     { |  | ||||||
|         D2D1_STROKE_STYLE_PROPERTIES style = |  | ||||||
|             D2D1::StrokeStyleProperties(D2D1_CAP_STYLE(cap), D2D1_CAP_STYLE(cap), D2D1_CAP_STYLE(cap), |  | ||||||
|                                         D2D1_LINE_JOIN(line_join), 10.0f, D2D1_DASH_STYLE_CUSTOM, dash_offset); |  | ||||||
| 
 |  | ||||||
|         ComPtr<ID2D1StrokeStyle> output; |  | ||||||
|         hr = d2d_res_->GetFactory()->CreateStrokeStyle(style, dash_array, dash_size, &output); |  | ||||||
| 
 |  | ||||||
|         if (SUCCEEDED(hr)) |  | ||||||
|         { |  | ||||||
|             stroke_style.SetStrokeStyle(output); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     win32::ThrowIfFailed(hr); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void RendererImpl::Resize(uint32_t width, uint32_t height) | void RendererImpl::Resize(uint32_t width, uint32_t height) | ||||||
| { | { | ||||||
|     HRESULT hr = S_OK; |     HRESULT hr = S_OK; | ||||||
|  | @ -965,7 +965,7 @@ void RendererImpl::Resize(uint32_t width, uint32_t height) | ||||||
|         render_ctx_->Resize(output_size_); |         render_ctx_->Resize(output_size_); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Resize render target failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| }  // namespace kiwano
 | }  // namespace kiwano
 | ||||||
|  |  | ||||||
|  | @ -63,116 +63,134 @@ public: | ||||||
|     virtual void SetVSyncEnabled(bool enabled); |     virtual void SetVSyncEnabled(bool enabled); | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建纹理
 |     /// @brief 创建纹理内部资源
 | ||||||
|     /// @param[out] texture 纹理
 |     /// @param[out] texture 纹理
 | ||||||
|     /// @param[in] file_path 图片路径
 |     /// @param[in] file_path 图片路径
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateTexture(Texture& texture, String const& file_path) = 0; |     virtual void CreateTexture(Texture& texture, String const& file_path) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建纹理
 |     /// @brief 创建纹理内部资源
 | ||||||
|     /// @param[out] texture 纹理
 |     /// @param[out] texture 纹理
 | ||||||
|     /// @param[in] resource 图片资源
 |     /// @param[in] resource 图片资源
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateTexture(Texture& texture, Resource const& resource) = 0; |     virtual void CreateTexture(Texture& texture, Resource const& resource) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建GIF图像
 |     /// @brief 创建GIF图像内部资源
 | ||||||
|     /// @param[out] gif GIF图像
 |     /// @param[out] gif GIF图像
 | ||||||
|     /// @param[in] file_path 图片路径
 |     /// @param[in] file_path 图片路径
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateGifImage(GifImage& gif, String const& file_path) = 0; |     virtual void CreateGifImage(GifImage& gif, String const& file_path) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建GIF图像
 |     /// @brief 创建GIF图像内部资源
 | ||||||
|     /// @param[out] gif GIF图像
 |     /// @param[out] gif GIF图像
 | ||||||
|     /// @param[in] resource 图片资源
 |     /// @param[in] resource 图片资源
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateGifImage(GifImage& gif, Resource const& resource) = 0; |     virtual void CreateGifImage(GifImage& gif, Resource const& resource) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建GIF图像帧
 |     /// @brief 创建GIF图像帧内部资源
 | ||||||
|     /// @param[out] frame GIF图像帧
 |     /// @param[out] frame GIF图像帧
 | ||||||
|     /// @param[in] gif GIF图像
 |     /// @param[in] gif GIF图像
 | ||||||
|     /// @param[in] frame_index 帧下标
 |     /// @param[in] frame_index 帧下标
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateGifImageFrame(GifImage::Frame& frame, GifImage const& gif, size_t frame_index) = 0; |     virtual void CreateGifImageFrame(GifImage::Frame& frame, GifImage const& gif, size_t frame_index) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建字体集
 |     /// @brief 创建字体集内部资源
 | ||||||
|     /// @param[out] font 字体
 |     /// @param[out] font 字体
 | ||||||
|     /// @param[in] file_paths 字体文件路径
 |     /// @param[in] file_paths 字体文件路径
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateFontCollection(Font& font, String const& file_path) = 0; |     virtual void CreateFontCollection(Font& font, String const& file_path) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建字体集
 |     /// @brief 创建字体集内部资源
 | ||||||
|     /// @param[out] font 字体
 |     /// @param[out] font 字体
 | ||||||
|     /// @param[in] res_arr 字体资源
 |     /// @param[in] res_arr 字体资源
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateFontCollection(Font& font, Resource const& res) = 0; |     virtual void CreateFontCollection(Font& font, Resource const& res) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建文字格式
 |     /// @brief 创建文字格式内部资源
 | ||||||
|     /// @param[out] layout 字体布局
 |     /// @param[out] layout 字体布局
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateTextFormat(TextLayout& layout) = 0; |     virtual void CreateTextFormat(TextLayout& layout) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建文字布局
 |     /// @brief 创建文字布局内部资源
 | ||||||
|     /// @param[out] layout 字体布局
 |     /// @param[out] layout 字体布局
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateTextLayout(TextLayout& layout) = 0; |     virtual void CreateTextLayout(TextLayout& layout) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建线段形状
 |     /// @brief 创建线段形状内部资源
 | ||||||
|     /// @param[out] geo 形状
 |     /// @param[out] shape 形状
 | ||||||
|     /// @param[in] begin_pos 线段起点
 |     /// @param[in] begin_pos 线段起点
 | ||||||
|     /// @param[in] end_pos 线段终点
 |     /// @param[in] end_pos 线段终点
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateLineShape(Shape& shape, Point const& begin_pos, Point const& end_pos) = 0; |     virtual void CreateLineShape(Shape& shape, Point const& begin_pos, Point const& end_pos) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建矩形形状
 |     /// @brief 创建矩形形状内部资源
 | ||||||
|     /// @param[out] geo 形状
 |     /// @param[out] shape 形状
 | ||||||
|     /// @param[in] rect 矩形大小
 |     /// @param[in] rect 矩形大小
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateRectShape(Shape& shape, Rect const& rect) = 0; |     virtual void CreateRectShape(Shape& shape, Rect const& rect) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建圆角矩形形状
 |     /// @brief 创建圆角矩形形状内部资源
 | ||||||
|     /// @param[out] geo 形状
 |     /// @param[out] shape 形状
 | ||||||
|     /// @param[in] rect 矩形大小
 |     /// @param[in] rect 矩形大小
 | ||||||
|     /// @param[in] radius 圆角半径
 |     /// @param[in] radius 圆角半径
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateRoundedRectShape(Shape& shape, Rect const& rect, Vec2 const& radius) = 0; |     virtual void CreateRoundedRectShape(Shape& shape, Rect const& rect, Vec2 const& radius) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建椭圆形状
 |     /// @brief 创建椭圆形状内部资源
 | ||||||
|     /// @param[out] geo 形状
 |     /// @param[out] shape 形状
 | ||||||
|     /// @param[in] center 椭圆圆心
 |     /// @param[in] center 椭圆圆心
 | ||||||
|     /// @param[in] radius 椭圆半径
 |     /// @param[in] radius 椭圆半径
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateEllipseShape(Shape& shape, Point const& center, Vec2 const& radius) = 0; |     virtual void CreateEllipseShape(Shape& shape, Point const& center, Vec2 const& radius) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建几何图形生成器
 |     /// @brief 创建几何图形生成器内部资源
 | ||||||
|     /// @param[out] sink 形状生成器
 |     /// @param[out] sink 形状生成器
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateShapeSink(ShapeSink& sink) = 0; |     virtual void CreateShapeSink(ShapeSink& sink) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建纯色画刷
 |     /// @brief 创建纯色画刷内部资源
 | ||||||
|     /// @param[out] brush 画刷
 |     /// @param[out] brush 画刷
 | ||||||
|     /// @param[in] color 颜色
 |     /// @param[in] color 颜色
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateBrush(Brush& brush, Color const& color) = 0; |     virtual void CreateBrush(Brush& brush, Color const& color) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建线性渐变画刷
 |     /// @brief 创建线性渐变画刷内部资源
 | ||||||
|     /// @param[out] brush 画刷
 |     /// @param[out] brush 画刷
 | ||||||
|     /// @param[in] style 线性渐变样式
 |     /// @param[in] style 线性渐变样式
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateBrush(Brush& brush, LinearGradientStyle const& style) = 0; |     virtual void CreateBrush(Brush& brush, LinearGradientStyle const& style) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建径向渐变画刷
 |     /// @brief 创建径向渐变画刷内部资源
 | ||||||
|     /// @param[out] brush 画刷
 |     /// @param[out] brush 画刷
 | ||||||
|     /// @param[in] style 径向渐变样式
 |     /// @param[in] style 径向渐变样式
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateBrush(Brush& brush, RadialGradientStyle const& style) = 0; |     virtual void CreateBrush(Brush& brush, RadialGradientStyle const& style) = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 创建线条样式
 |     /// @brief 创建线条样式内部资源
 | ||||||
|     /// @param[out] stroke_style 线条样式
 |     /// @param[out] stroke_style 线条样式
 | ||||||
|     /// @param[in] cap 线段端点样式
 |     /// @param[in] cap 线段端点样式
 | ||||||
|     /// @param[in] line_join 线段相交样式
 |     /// @param[in] line_join 线段相交样式
 | ||||||
|     /// @param[in] dash_array 虚线长度与间隙数组
 |     /// @param[in] dash_array 虚线长度与间隙数组
 | ||||||
|     /// @param[in] dash_size 虚线数组大小
 |     /// @param[in] dash_size 虚线数组大小
 | ||||||
|     /// @param[in] dash_offset 虚线偏移量
 |     /// @param[in] dash_offset 虚线偏移量
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual void CreateStrokeStyle(StrokeStyle& stroke_style, CapStyle cap, LineJoinStyle line_join, |     virtual void CreateStrokeStyle(StrokeStyle& stroke_style, CapStyle cap, LineJoinStyle line_join, | ||||||
|                                    const float* dash_array, size_t dash_size, float dash_offset) = 0; |                                    const float* dash_array, size_t dash_size, float dash_offset) = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -180,6 +198,7 @@ public: | ||||||
|     /// @brief 创建纹理渲染上下文
 |     /// @brief 创建纹理渲染上下文
 | ||||||
|     /// @param[in] desired_size 期望的输出大小
 |     /// @param[in] desired_size 期望的输出大小
 | ||||||
|     /// @return 纹理渲染上下文
 |     /// @return 纹理渲染上下文
 | ||||||
|  |     /// @throw kiwano::SystemException 创建失败时抛出
 | ||||||
|     virtual TextureRenderContextPtr CreateTextureRenderContext(const Size* desired_size = nullptr) = 0; |     virtual TextureRenderContextPtr CreateTextureRenderContext(const Size* desired_size = nullptr) = 0; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  | @ -197,6 +216,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|     /// @brief 将绘制内容呈现至窗口
 |     /// @brief 将绘制内容呈现至窗口
 | ||||||
|  |     /// @throw kiwano::SystemException 呈现失败时抛出
 | ||||||
|     virtual void Present() = 0; |     virtual void Present() = 0; | ||||||
| 
 | 
 | ||||||
|     /// \~chinese
 |     /// \~chinese
 | ||||||
|  |  | ||||||
|  | @ -38,7 +38,7 @@ void ShapeSink::Open() | ||||||
|         path_geo_.reset(); |         path_geo_.reset(); | ||||||
|         Renderer::GetInstance().CreateShapeSink(*this); |         Renderer::GetInstance().CreateShapeSink(*this); | ||||||
| 
 | 
 | ||||||
|         win32::ThrowIfFailed(path_geo_->Open(&sink_)); |         win32::ThrowIfFailed(path_geo_->Open(&sink_), "Open ID2D1GeometrySink failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -46,7 +46,7 @@ void ShapeSink::Close() | ||||||
| { | { | ||||||
|     if (IsOpened()) |     if (IsOpened()) | ||||||
|     { |     { | ||||||
|         win32::ThrowIfFailed(sink_->Close()); |         win32::ThrowIfFailed(sink_->Close(), "Close ID2D1GeometrySink failed"); | ||||||
|         sink_.reset(); |         sink_.reset(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -75,8 +75,10 @@ ShapeSink& ShapeSink::AddShape(ShapePtr input, const Matrix3x2* input_matrix) | ||||||
|     if (input && input->IsValid()) |     if (input && input->IsValid()) | ||||||
|     { |     { | ||||||
|         ComPtr<ID2D1Geometry> geo = input->GetGeometry(); |         ComPtr<ID2D1Geometry> geo = input->GetGeometry(); | ||||||
|         win32::ThrowIfFailed( | 
 | ||||||
|             geo->Outline(DX::ConvertToMatrix3x2F(input_matrix), D2D1_DEFAULT_FLATTENING_TOLERANCE, sink_.get())); |         HRESULT hr = | ||||||
|  |             geo->Outline(DX::ConvertToMatrix3x2F(input_matrix), D2D1_DEFAULT_FLATTENING_TOLERANCE, sink_.get()); | ||||||
|  |         win32::ThrowIfFailed(hr, "Get outline of ID2D1Geometry failed"); | ||||||
|     } |     } | ||||||
|     return (*this); |     return (*this); | ||||||
| } | } | ||||||
|  | @ -148,8 +150,10 @@ ShapeSink& ShapeSink::Combine(ShapePtr shape_a, ShapePtr shape_b, CombineMode mo | ||||||
|     { |     { | ||||||
|         ComPtr<ID2D1Geometry> geo_a_raw = shape_a->geo_; |         ComPtr<ID2D1Geometry> geo_a_raw = shape_a->geo_; | ||||||
|         ComPtr<ID2D1Geometry> geo_b_raw = shape_b->geo_; |         ComPtr<ID2D1Geometry> geo_b_raw = shape_b->geo_; | ||||||
|         win32::ThrowIfFailed(geo_a_raw->CombineWithGeometry(geo_b_raw.get(), D2D1_COMBINE_MODE(mode), | 
 | ||||||
|                                                             DX::ConvertToMatrix3x2F(matrix), sink_.get())); |         HRESULT hr = geo_a_raw->CombineWithGeometry(geo_b_raw.get(), D2D1_COMBINE_MODE(mode), | ||||||
|  |                                                     DX::ConvertToMatrix3x2F(matrix), sink_.get()); | ||||||
|  |         win32::ThrowIfFailed(hr, "Combine ID2D1Geometry failed"); | ||||||
|     } |     } | ||||||
|     return (*this); |     return (*this); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -183,7 +183,7 @@ void TextLayout::SetWrapWidth(float wrap_width) | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         win32::ThrowIfFailed(hr); |         win32::ThrowIfFailed(hr, "Apply word wrapping to text layout failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -202,7 +202,7 @@ void TextLayout::SetLineSpacing(float line_spacing) | ||||||
|         { |         { | ||||||
|             hr = text_layout_->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, line_spacing, line_spacing * 0.8f); |             hr = text_layout_->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, line_spacing, line_spacing * 0.8f); | ||||||
|         } |         } | ||||||
|         win32::ThrowIfFailed(hr); |         win32::ThrowIfFailed(hr, "Apply line spacing to text layout failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -213,7 +213,7 @@ void TextLayout::SetAlignment(TextAlign align) | ||||||
|     if (text_layout_) |     if (text_layout_) | ||||||
|     { |     { | ||||||
|         HRESULT hr = text_layout_->SetTextAlignment(DWRITE_TEXT_ALIGNMENT(align)); |         HRESULT hr = text_layout_->SetTextAlignment(DWRITE_TEXT_ALIGNMENT(align)); | ||||||
|         win32::ThrowIfFailed(hr); |         win32::ThrowIfFailed(hr, "Apply alignment style to text layout failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -228,7 +228,7 @@ void TextLayout::SetUnderline(bool enable, uint32_t start, uint32_t length) | ||||||
|     { |     { | ||||||
|         hr = text_layout_->SetUnderline(enable, { start, length }); |         hr = text_layout_->SetUnderline(enable, { start, length }); | ||||||
|     } |     } | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Apply underline style to text layout failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void TextLayout::SetStrikethrough(bool enable, uint32_t start, uint32_t length) | void TextLayout::SetStrikethrough(bool enable, uint32_t start, uint32_t length) | ||||||
|  | @ -242,7 +242,7 @@ void TextLayout::SetStrikethrough(bool enable, uint32_t start, uint32_t length) | ||||||
|     { |     { | ||||||
|         hr = text_layout_->SetStrikethrough(enable, { start, length }); |         hr = text_layout_->SetStrikethrough(enable, { start, length }); | ||||||
|     } |     } | ||||||
|     win32::ThrowIfFailed(hr); |     win32::ThrowIfFailed(hr, "Apply strikethrough style to text layout failed"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| }  // namespace kiwano
 | }  // namespace kiwano
 | ||||||
|  |  | ||||||
|  | @ -139,7 +139,7 @@ void Texture::CopyFrom(TexturePtr copy_from) | ||||||
|     { |     { | ||||||
|         HRESULT hr = bitmap_->CopyFromBitmap(nullptr, copy_from->GetBitmap().get(), nullptr); |         HRESULT hr = bitmap_->CopyFromBitmap(nullptr, copy_from->GetBitmap().get(), nullptr); | ||||||
| 
 | 
 | ||||||
|         win32::ThrowIfFailed(hr); |         win32::ThrowIfFailed(hr, "Copy texture data failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -152,7 +152,7 @@ void Texture::CopyFrom(TexturePtr copy_from, Rect const& src_rect, Point const& | ||||||
|             &D2D1::RectU(uint32_t(src_rect.GetLeft()), uint32_t(src_rect.GetTop()), uint32_t(src_rect.GetRight()), |             &D2D1::RectU(uint32_t(src_rect.GetLeft()), uint32_t(src_rect.GetTop()), uint32_t(src_rect.GetRight()), | ||||||
|                          uint32_t(src_rect.GetBottom()))); |                          uint32_t(src_rect.GetBottom()))); | ||||||
| 
 | 
 | ||||||
|         win32::ThrowIfFailed(hr); |         win32::ThrowIfFailed(hr, "Copy texture data failed"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
| 
 | 
 | ||||||
| #include <fstream> | #include <fstream> | ||||||
| #include <kiwano/core/Logger.h> | #include <kiwano/core/Logger.h> | ||||||
|  | #include <kiwano/core/Exception.h> | ||||||
| #include <kiwano/platform/FileSystem.h> | #include <kiwano/platform/FileSystem.h> | ||||||
| #include <kiwano/utils/ResourceCache.h> | #include <kiwano/utils/ResourceCache.h> | ||||||
| 
 | 
 | ||||||
|  | @ -55,7 +56,7 @@ bool ResourceCache::LoadFromJsonFile(String const& file_path) | ||||||
| { | { | ||||||
|     if (!FileSystem::GetInstance().IsFileExists(file_path)) |     if (!FileSystem::GetInstance().IsFileExists(file_path)) | ||||||
|     { |     { | ||||||
|         KGE_ERROR("ResourceCache::LoadFromJsonFile failed: File not found."); |         KGE_ERROR("%s failed: File not found.", __FUNCTION__); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -73,12 +74,12 @@ bool ResourceCache::LoadFromJsonFile(String const& file_path) | ||||||
|     } |     } | ||||||
|     catch (std::wifstream::failure& e) |     catch (std::wifstream::failure& e) | ||||||
|     { |     { | ||||||
|         KGE_ERROR("ResourceCache::LoadFromJsonFile failed: Cannot open file. (%s)", e.what()); |         KGE_ERROR("%s failed: Cannot open file. (%s)", __FUNCTION__, e.what()); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     catch (Json::exception& e) |     catch (Json::exception& e) | ||||||
|     { |     { | ||||||
|         KGE_ERROR("ResourceCache::LoadFromJsonFile failed: Cannot parse to JSON. (%s)", e.what()); |         KGE_ERROR("%s failed: Cannot parse to JSON. (%s)", __FUNCTION__, e.what()); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     return LoadFromJson(json_data); |     return LoadFromJson(json_data); | ||||||
|  | @ -101,12 +102,12 @@ bool ResourceCache::LoadFromJson(Json const& json_data) | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             throw std::runtime_error("unknown JSON data version"); |             KGE_ERROR("%s failed: unknown resource data version", __FUNCTION__); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     catch (Json::exception& e) |     catch (Json::exception& e) | ||||||
|     { |     { | ||||||
|         KGE_ERROR("ResourceCache::LoadFromJson failed: JSON data is invalid. (%s)", e.what()); |         KGE_ERROR("%s failed: JSON data is invalid. (%s)", __FUNCTION__, e.what()); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     return false; |     return false; | ||||||
|  | @ -116,7 +117,7 @@ bool ResourceCache::LoadFromXmlFile(String const& file_path) | ||||||
| { | { | ||||||
|     if (!FileSystem::GetInstance().IsFileExists(file_path)) |     if (!FileSystem::GetInstance().IsFileExists(file_path)) | ||||||
|     { |     { | ||||||
|         KGE_ERROR("ResourceCache::LoadFromXmlFile failed: File not found."); |         KGE_ERROR("%s failed: File not found.", __FUNCTION__); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -131,7 +132,7 @@ bool ResourceCache::LoadFromXmlFile(String const& file_path) | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         KGE_ERROR("XML [%s] parsed with errors: %s", full_path.c_str(), result.description()); |         KGE_ERROR("%s failed: XML [%s] parsed with errors: %s", __FUNCTION__, full_path.c_str(), result.description()); | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -155,12 +156,9 @@ bool ResourceCache::LoadFromXml(const pugi::xml_document& doc) | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             KGE_ERROR("Unknown  version"); |             KGE_ERROR("%s failed: unknown resource data version", __FUNCTION__); | ||||||
|             return false; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     KGE_ERROR("Unknown  version"); |  | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue