From b44f71e251febb07794866209bcd568af62b2b1a Mon Sep 17 00:00:00 2001 From: Haibo Date: Mon, 12 Nov 2018 23:32:50 +0800 Subject: [PATCH] update: Resource --- core/base/Resource.cpp | 75 ++++++++++++++++----------------------- core/base/Resource.h | 38 ++++++++++++-------- core/base/render.cpp | 7 ++-- core/utils/File.cpp | 5 +-- core/utils/Transcoder.cpp | 9 ++--- core/utils/Transcoder.h | 2 +- 6 files changed, 66 insertions(+), 70 deletions(-) diff --git a/core/base/Resource.cpp b/core/base/Resource.cpp index 3f88df13..120424df 100644 --- a/core/base/Resource.cpp +++ b/core/base/Resource.cpp @@ -19,15 +19,13 @@ // THE SOFTWARE. #include "Resource.h" +#include "logs.h" namespace easy2d { Resource::Resource(LPCWSTR name, LPCWSTR type) : name_(name) , type_(type) - , data_(nullptr) - , data_size_(0) - , loaded_(false) { } @@ -41,58 +39,45 @@ namespace easy2d return type_; } - LPVOID Resource::GetData() const - { - return data_; - } - - DWORD Resource::GetDataSize() const - { - return data_size_; - } - size_t Resource::GetHashCode() const { return std::hash{}(name_); } - bool Resource::Load() + bool Resource::Load(ResourceData* buffer) const { - if (!loaded_) + if (!buffer) + return false; + + HGLOBAL res_data; + HRSRC res_info; + + res_info = FindResourceW(nullptr, name_, type_); + if (res_info == nullptr) { - HRSRC res_info; - HGLOBAL res_data; - HINSTANCE hinstance = GetModuleHandle(NULL); + logs::Trace(L"FindResource"); + return false; + } - res_info = FindResourceW(hinstance, name_, type_); - if (res_info == nullptr) - { - E2D_WARNING("FindResource"); - return false; - } + res_data = LoadResource(nullptr, res_info); + if (res_data == nullptr) + { + logs::Trace(L"LoadResource"); + return false; + } - res_data = LoadResource(hinstance, res_info); - if (res_data == nullptr) - { - E2D_WARNING("LoadResource"); - return false; - } + (*buffer).buffer_size = SizeofResource(nullptr, res_info); + if ((*buffer).buffer_size == 0) + { + logs::Trace(L"SizeofResource"); + return false; + } - data_size_ = SizeofResource(hinstance, res_info); - if (data_size_ == 0) - { - E2D_WARNING("SizeofResource"); - return false; - } - - data_ = LockResource(res_data); - if (data_ == nullptr) - { - E2D_WARNING("LockResource"); - return false; - } - - loaded_ = true; + (*buffer).buffer = LockResource(res_data); + if ((*buffer).buffer == nullptr) + { + logs::Trace(L"LockResource"); + return false; } return true; } diff --git a/core/base/Resource.h b/core/base/Resource.h index 8dcb1f58..3a21eef1 100644 --- a/core/base/Resource.h +++ b/core/base/Resource.h @@ -23,18 +23,31 @@ namespace easy2d { + // 资源数据 + // + // Usage: + // 如果需要手动加载资源, 可以通过 Resource::Load 方法获取资源内容 + // ResourceData data; + // if (res.Load(&data)) { + // LPVOID data = data.buffer; + // DWORD size = data.buffer_size; + // } + // + struct ResourceData + { + LPVOID buffer; + DWORD buffer_size; + }; + + // 资源 // // Usage: // Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的 // 资源类型和名称标识符。 - // 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1, 那么可以这样指定该资源: - // Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE"); - // 如果需要手动加载这份资源, 可以通过 Load 方法获取资源内容 - // if (res.Load()) { - // LPVOID data = res.GetData(); - // DWORD size = res.GetDataSize(); - // } + // 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1, + // 那么可以这样指定该资源: Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE"); + // // 了解资源的更多信息: https://docs.microsoft.com/en-us/windows/desktop/menurc/resources // class Resource @@ -45,23 +58,18 @@ namespace easy2d LPCWSTR type /* 资源类型 */ ); - bool Load(); + bool Load( + ResourceData* buffer + ) const; LPCWSTR GetName() const; LPCWSTR GetType() const; - LPVOID GetData() const; - - DWORD GetDataSize() const; - size_t GetHashCode() const; private: - bool loaded_; LPCWSTR name_; LPCWSTR type_; - LPVOID data_; - DWORD data_size_; }; } diff --git a/core/base/render.cpp b/core/base/render.cpp index 77fe26b9..4a1d16a0 100644 --- a/core/base/render.cpp +++ b/core/base/render.cpp @@ -491,9 +491,10 @@ namespace easy2d IWICBitmapFrameDecode* source = nullptr; IWICStream* stream = nullptr; IWICFormatConverter* converter = nullptr; + ResourceData buffer; // 加载资源 - hr = res.Load() ? S_OK : E_FAIL; + hr = res.Load(&buffer) ? S_OK : E_FAIL; if (SUCCEEDED(hr)) { @@ -505,8 +506,8 @@ namespace easy2d { // 初始化流 hr = stream->InitializeFromMemory( - static_cast(res.GetData()), - res.GetDataSize() + static_cast(buffer.buffer), + buffer.buffer_size ); } diff --git a/core/utils/File.cpp b/core/utils/File.cpp index 0f28c254..fc34d7bf 100644 --- a/core/utils/File.cpp +++ b/core/utils/File.cpp @@ -124,11 +124,12 @@ namespace easy2d if (file_handle == INVALID_HANDLE_VALUE) return file; - if (res.Load()) + ResourceData buffer; + if (res.Load(&buffer)) { // 写入文件 DWORD written_bytes = 0; - ::WriteFile(file_handle, res.GetData(), res.GetDataSize(), &written_bytes, NULL); + ::WriteFile(file_handle, buffer.buffer, buffer.buffer_size, &written_bytes, NULL); ::CloseHandle(file_handle); file.Open(dest_file_name); diff --git a/core/utils/Transcoder.cpp b/core/utils/Transcoder.cpp index 56572d84..befd6d53 100644 --- a/core/utils/Transcoder.cpp +++ b/core/utils/Transcoder.cpp @@ -67,7 +67,7 @@ namespace easy2d return hr; } - HRESULT Transcoder::LoadMediaResource(Resource& res, BYTE** wave_data, UINT32* wave_data_size) + HRESULT Transcoder::LoadMediaResource(const Resource& res, BYTE** wave_data, UINT32* wave_data_size) { HRESULT hr = S_OK; @@ -76,11 +76,12 @@ namespace easy2d IMFByteStream* byte_stream = nullptr; IMFSourceReader* reader = nullptr; - if (!res.Load()) { return false; } + ResourceData buffer; + if (!res.Load(&buffer)) { return false; } stream = SHCreateMemStream( - static_cast(res.GetData()), - static_cast(res.GetDataSize()) + static_cast(buffer.buffer), + static_cast(buffer.buffer_size) ); if (stream == nullptr) diff --git a/core/utils/Transcoder.h b/core/utils/Transcoder.h index b68bc560..a95b4c7a 100644 --- a/core/utils/Transcoder.h +++ b/core/utils/Transcoder.h @@ -45,7 +45,7 @@ namespace easy2d ); HRESULT LoadMediaResource( - Resource& res, + const Resource& res, BYTE** wave_data, UINT32* wave_data_size );