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.
#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<LPCWSTR>{}(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;
}

View File

@ -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_;
};
}

View File

@ -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<WICInProcPointer>(res.GetData()),
res.GetDataSize()
static_cast<WICInProcPointer>(buffer.buffer),
buffer.buffer_size
);
}

View File

@ -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);

View File

@ -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<const BYTE*>(res.GetData()),
static_cast<UINT>(res.GetDataSize())
static_cast<const BYTE*>(buffer.buffer),
static_cast<UINT>(buffer.buffer_size)
);
if (stream == nullptr)

View File

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