update: Resource

This commit is contained in:
Haibo 2018-11-12 23:32:50 +08:00 committed by Nomango
parent 1ed684f3a1
commit b44f71e251
6 changed files with 66 additions and 70 deletions

View File

@ -19,15 +19,13 @@
// THE SOFTWARE. // THE SOFTWARE.
#include "Resource.h" #include "Resource.h"
#include "logs.h"
namespace easy2d namespace easy2d
{ {
Resource::Resource(LPCWSTR name, LPCWSTR type) Resource::Resource(LPCWSTR name, LPCWSTR type)
: name_(name) : name_(name)
, type_(type) , type_(type)
, data_(nullptr)
, data_size_(0)
, loaded_(false)
{ {
} }
@ -41,59 +39,46 @@ namespace easy2d
return type_; return type_;
} }
LPVOID Resource::GetData() const
{
return data_;
}
DWORD Resource::GetDataSize() const
{
return data_size_;
}
size_t Resource::GetHashCode() const size_t Resource::GetHashCode() const
{ {
return std::hash<LPCWSTR>{}(name_); return std::hash<LPCWSTR>{}(name_);
} }
bool Resource::Load() bool Resource::Load(ResourceData* buffer) const
{ {
if (!loaded_) if (!buffer)
{ return false;
HRSRC res_info;
HGLOBAL res_data;
HINSTANCE hinstance = GetModuleHandle(NULL);
res_info = FindResourceW(hinstance, name_, type_); HGLOBAL res_data;
HRSRC res_info;
res_info = FindResourceW(nullptr, name_, type_);
if (res_info == nullptr) if (res_info == nullptr)
{ {
E2D_WARNING("FindResource"); logs::Trace(L"FindResource");
return false; return false;
} }
res_data = LoadResource(hinstance, res_info); res_data = LoadResource(nullptr, res_info);
if (res_data == nullptr) if (res_data == nullptr)
{ {
E2D_WARNING("LoadResource"); logs::Trace(L"LoadResource");
return false; return false;
} }
data_size_ = SizeofResource(hinstance, res_info); (*buffer).buffer_size = SizeofResource(nullptr, res_info);
if (data_size_ == 0) if ((*buffer).buffer_size == 0)
{ {
E2D_WARNING("SizeofResource"); logs::Trace(L"SizeofResource");
return false; return false;
} }
data_ = LockResource(res_data); (*buffer).buffer = LockResource(res_data);
if (data_ == nullptr) if ((*buffer).buffer == nullptr)
{ {
E2D_WARNING("LockResource"); logs::Trace(L"LockResource");
return false; return false;
} }
loaded_ = true;
}
return true; return true;
} }
} }

View File

@ -23,18 +23,31 @@
namespace easy2d 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: // Usage:
// Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的 // Resource 用于获取可执行文件 (exe) 中的资源, 必须在构造函数中指定它的
// 资源类型和名称标识符。 // 资源类型和名称标识符。
// 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1, 那么可以这样指定该资源: // 例如, 一份音频资源的类型为 L"WAVE", 名称标识符为 IDR_WAVE_1,
// Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE"); // 那么可以这样指定该资源: Resource res(MAKEINTRESOURCE(IDR_WAVE_1), L"WAVE");
// 如果需要手动加载这份资源, 可以通过 Load 方法获取资源内容 //
// if (res.Load()) {
// LPVOID data = res.GetData();
// DWORD size = res.GetDataSize();
// }
// 了解资源的更多信息: https://docs.microsoft.com/en-us/windows/desktop/menurc/resources // 了解资源的更多信息: https://docs.microsoft.com/en-us/windows/desktop/menurc/resources
// //
class Resource class Resource
@ -45,23 +58,18 @@ namespace easy2d
LPCWSTR type /* 资源类型 */ LPCWSTR type /* 资源类型 */
); );
bool Load(); bool Load(
ResourceData* buffer
) const;
LPCWSTR GetName() const; LPCWSTR GetName() const;
LPCWSTR GetType() const; LPCWSTR GetType() const;
LPVOID GetData() const;
DWORD GetDataSize() const;
size_t GetHashCode() const; size_t GetHashCode() const;
private: private:
bool loaded_;
LPCWSTR name_; LPCWSTR name_;
LPCWSTR type_; LPCWSTR type_;
LPVOID data_;
DWORD data_size_;
}; };
} }

View File

@ -491,9 +491,10 @@ namespace easy2d
IWICBitmapFrameDecode* source = nullptr; IWICBitmapFrameDecode* source = nullptr;
IWICStream* stream = nullptr; IWICStream* stream = nullptr;
IWICFormatConverter* converter = nullptr; IWICFormatConverter* converter = nullptr;
ResourceData buffer;
// ¼ÓÔØ×ÊÔ´ // ¼ÓÔØ×ÊÔ´
hr = res.Load() ? S_OK : E_FAIL; hr = res.Load(&buffer) ? S_OK : E_FAIL;
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
@ -505,8 +506,8 @@ namespace easy2d
{ {
// ³õʼ»¯Á÷ // ³õʼ»¯Á÷
hr = stream->InitializeFromMemory( hr = stream->InitializeFromMemory(
static_cast<WICInProcPointer>(res.GetData()), static_cast<WICInProcPointer>(buffer.buffer),
res.GetDataSize() buffer.buffer_size
); );
} }

View File

@ -124,11 +124,12 @@ namespace easy2d
if (file_handle == INVALID_HANDLE_VALUE) if (file_handle == INVALID_HANDLE_VALUE)
return file; return file;
if (res.Load()) ResourceData buffer;
if (res.Load(&buffer))
{ {
// 写入文件 // 写入文件
DWORD written_bytes = 0; 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); ::CloseHandle(file_handle);
file.Open(dest_file_name); file.Open(dest_file_name);

View File

@ -67,7 +67,7 @@ namespace easy2d
return hr; 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; HRESULT hr = S_OK;
@ -76,11 +76,12 @@ namespace easy2d
IMFByteStream* byte_stream = nullptr; IMFByteStream* byte_stream = nullptr;
IMFSourceReader* reader = nullptr; IMFSourceReader* reader = nullptr;
if (!res.Load()) { return false; } ResourceData buffer;
if (!res.Load(&buffer)) { return false; }
stream = SHCreateMemStream( stream = SHCreateMemStream(
static_cast<const BYTE*>(res.GetData()), static_cast<const BYTE*>(buffer.buffer),
static_cast<UINT>(res.GetDataSize()) static_cast<UINT>(buffer.buffer_size)
); );
if (stream == nullptr) if (stream == nullptr)

View File

@ -45,7 +45,7 @@ namespace easy2d
); );
HRESULT LoadMediaResource( HRESULT LoadMediaResource(
Resource& res, const Resource& res,
BYTE** wave_data, BYTE** wave_data,
UINT32* wave_data_size UINT32* wave_data_size
); );