-
Notifications
You must be signed in to change notification settings - Fork 0
/
provider.h
85 lines (70 loc) · 2.36 KB
/
provider.h
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
#pragma once
#include <thumbcache.h>
#include <Shlwapi.h> // for QueryInterface stuff
#include <new> // for std::nothrow
#include <atomic> // for reference counters
#define MAGIC_IWAD MAKEFOURCC('I','W','A','D')
#define MAGIC_PWAD MAKEFOURCC('P','W','A','D')
#define LUMPNAME(a,b,c,d,e,f,g,h) ((INT64)MAKEFOURCC(a,b,c,d) | ((INT64)MAKEFOURCC(e,f,g,h) << 32))
#define BUFFER_SIZE_DEFAULT ( 24 * 1024 * 1024)
#define BUFFER_SIZE_MAX (256 * 1024 * 1024)
#define BUFFER_SIZE_INCREMENT ( 4 * 1024 * 1024)
#define BUFFER_BLOCK_SIZE 2048
#define PLAYPAL_TYPE_DOOM 0
#define PLAYPAL_TYPE_HERETIC 1
struct WADFileHeader {
int magic;
int lumpCount;
int dirOffset;
};
union WADLumpName {
char str[8];
INT64 ival;
};
struct WADLumpInfo {
DWORD offset;
int size;
WADLumpName name;
};
struct WADPictureHeader {
short width;
short height;
short left;
short top;
};
// Building Thumbnail Handlers
// https://msdn.microsoft.com/en-us/library/windows/desktop/cc144114(v=vs.85).aspx
// IThumbnailProvider::GetThumbnail
// https://msdn.microsoft.com/en-us/library/windows/desktop/bb774612(v=vs.85).aspx
// Thumbnail Handlers
// https://msdn.microsoft.com/en-us/library/windows/desktop/cc144118(v=vs.85).aspx
// https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/winui/shell/appshellintegration/RecipeThumbnailProvider
class WADThumbnailProvider : public IInitializeWithStream, public IThumbnailProvider {
private:
ULARGE_INTEGER wadStart;
IStream* stream;
std::atomic<ULONG> references;
DWORD playpal;
DWORD titlepic;
bool heretic;
USHORT titlepicWidth;
USHORT titlepicHeight;
HBITMAP bmp;
HRESULT createMemoryStream();
HRESULT determineFileOffsetsAndGame();
HRESULT loadRelevantLumps();
HRESULT readTitlepic(byte (&palette)[256][3]);
HRESULT readTitle(byte (&palette)[256][3]);
HRESULT shrinkBitmap(int width, int height);
public:
WADThumbnailProvider();
private:
virtual ~WADThumbnailProvider();
public:
IFACEMETHODIMP GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha);
IFACEMETHODIMP Initialize(IStream* pstream, DWORD grfMode);
IFACEMETHODIMP QueryInterface(REFIID iid, void** object);
IFACEMETHODIMP_(ULONG) AddRef();
IFACEMETHODIMP_(ULONG) Release();
};
extern HRESULT WADThumbnailProvider_CreateInstance(REFIID riid, void **ppv);