update: Resource
This commit is contained in:
		
							parent
							
								
									1ed684f3a1
								
							
						
					
					
						commit
						b44f71e251
					
				|  | @ -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; | ||||
| 	} | ||||
|  |  | |||
|  | @ -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_; | ||||
| 	}; | ||||
| } | ||||
|  |  | |||
|  | @ -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 | ||||
| 				); | ||||
| 			} | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ namespace easy2d | |||
| 		); | ||||
| 
 | ||||
| 		HRESULT LoadMediaResource( | ||||
| 			Resource& res, | ||||
| 			const Resource& res, | ||||
| 			BYTE** wave_data, | ||||
| 			UINT32* wave_data_size | ||||
| 		); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue