-
Notifications
You must be signed in to change notification settings - Fork 0
/
ResourceImageLoader.cpp
100 lines (79 loc) · 2.7 KB
/
ResourceImageLoader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "StdAfx.h"
#include "ResourceImageLoader.h"
#include "wincodec.h"
CResourceImageLoader::CResourceImageLoader(LPCTSTR lpName, LPCTSTR lpType)
{
m_strName=lpName;
m_strType=lpType;
}
CResourceImageLoader::~CResourceImageLoader(void)
{
}
IWICBitmapSource *CResourceImageLoader::LoadImage() {
// load the PNG image data into a stream
IStream * ipImageStream = CreateStreamOnResource(m_strName, m_strType.c_str());
if (ipImageStream == NULL)
goto Return;
// load the bitmap with WIC
IWICBitmapSource * ipBitmap = LoadBitmapFromStream(ipImageStream);
ipImageStream->Release();
Return:
return ipBitmap;
}
IStream *CResourceImageLoader::CreateStreamOnResource(LPCTSTR lpName, LPCTSTR lpType)
{
// initialize return value
IStream * ipStream = NULL;
// find the resource
HRSRC hrsrc = FindResourceEx(NULL, lpType, lpName, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));
if (hrsrc == NULL)
goto Return;
// load the resource
DWORD dwResourceSize = SizeofResource(NULL, hrsrc);
HGLOBAL hglbImage = LoadResource(NULL, hrsrc);
if (hglbImage == NULL)
goto Return;
// lock the resource, getting a pointer to its data
LPVOID pvSourceResourceData = LockResource(hglbImage);
if (pvSourceResourceData == NULL)
goto Return;
// allocate memory to hold the resource data
HGLOBAL hgblResourceData = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize);
if (hgblResourceData == NULL)
goto Return;
// get a pointer to the allocated memory
LPVOID pvResourceData = GlobalLock(hgblResourceData);
if (pvResourceData == NULL)
goto FreeData;
// copy the data from the resource to the new memory block
CopyMemory(pvResourceData, pvSourceResourceData, dwResourceSize);
GlobalUnlock(hgblResourceData);
// create a stream on the HGLOBAL containing the data
if (SUCCEEDED(CreateStreamOnHGlobal(hgblResourceData, TRUE, &ipStream)))
goto Return;
FreeData:
// couldn't create stream; free the memory
GlobalFree(hgblResourceData);
Return:
// no need to unlock or free the resource
return ipStream;
}
// Loads a PNG image from the specified stream (using Windows Imaging Component).
IWICBitmapSource *CResourceImageLoader::LoadBitmapFromStream(IStream * ipImageStream)
{
IWICImagingFactory* imagingFactory = NULL;
IWICBitmapDecoder* decoder = NULL;
IWICBitmapSource *ipBitmap = NULL;
if (FAILED(CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*) &imagingFactory))) {
goto Return;
}
if (FAILED(imagingFactory->CreateDecoderFromStream(ipImageStream, NULL, WICDecodeMetadataCacheOnDemand, &decoder))) {
goto ReleaseDecoder;
}
ipBitmap = LoadImageFromDecoder(decoder);
ReleaseDecoder:
decoder->Release();
imagingFactory->Release();
Return:
return ipBitmap;
}