13 #include <thumbcache.h>
21 #pragma comment(lib, "shlwapi.lib")
27 class CBlendThumb :
public IInitializeWithStream,
public IThumbnailProvider {
42 static const QITAB qit[] = {
47 return QISearch(
this, qit, riid, ppv);
52 return InterlockedIncrement(&_cRef);
57 ULONG cRef = InterlockedDecrement(&_cRef);
65 IFACEMETHODIMP
Initialize(IStream *pStream, DWORD grfMode);
68 IFACEMETHODIMP
GetThumbnail(
UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha);
78 HRESULT hr = pNew ? S_OK : E_OUTOFMEMORY;
88 if (_pStream !=
NULL) {
93 return pStream->QueryInterface(&_pStream);
120 DWORD origin = STREAM_SEEK_SET;
123 origin = STREAM_SEEK_CUR;
126 origin = STREAM_SEEK_END;
129 LARGE_INTEGER offsetI;
130 offsetI.QuadPart =
offset;
131 ULARGE_INTEGER newPos;
132 stream->
_pStream->Seek(offsetI, origin, &newPos);
146 HRESULT hr = S_FALSE;
152 file->reader.offset = 0;
153 file->_pStream = _pStream;
155 file->reader.seek(&
file->reader, 0, SEEK_SET);
164 for (
int i = 0; i < thumb.
width * thumb.
height; i++) {
172 *pdwAlpha = WTSAT_ARGB;
175 if ((
unsigned)thumb.
width > cx || (
unsigned)thumb.
height > cx) {
177 LONG NewWidth = (LONG)(thumb.
width * scale);
178 LONG NewHeight = (LONG)(thumb.
height * scale);
180 IWICImagingFactory *pImgFac;
181 hr = CoCreateInstance(
182 CLSID_WICImagingFactory,
NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pImgFac));
185 hr = pImgFac->CreateBitmapFromHBITMAP(*phbmp, 0, WICBitmapUseAlpha, &WICBmp);
188 bmi.bmiHeader.biSize =
sizeof(bmi.bmiHeader);
189 bmi.bmiHeader.biWidth = NewWidth;
190 bmi.bmiHeader.biHeight = -NewHeight;
191 bmi.bmiHeader.biPlanes = 1;
192 bmi.bmiHeader.biBitCount = 32;
193 bmi.bmiHeader.biCompression = BI_RGB;
196 HBITMAP ResizedHBmp = CreateDIBSection(
NULL, &bmi, DIB_RGB_COLORS, (
void **)&pBits,
NULL, 0);
197 hr = ResizedHBmp ? S_OK : E_OUTOFMEMORY;
199 IWICBitmapScaler *pIScaler;
200 hr = pImgFac->CreateBitmapScaler(&pIScaler);
201 hr = pIScaler->Initialize(WICBmp, NewWidth, NewHeight, WICBitmapInterpolationModeFant);
203 WICRect rect = {0, 0, NewWidth, NewHeight};
204 hr = pIScaler->CopyPixels(&rect, NewWidth * 4, NewWidth * NewHeight * 4, pBits);
207 DeleteObject(*phbmp);
208 *phbmp = ResizedHBmp;
211 DeleteObject(ResizedHBmp);
typedef float(TangentPoint)[2]
Wrapper for reading from various sources (e.g. raw files, compressed files, memory....
typedef UINT(API *GHOST_WIN32_GetDpiForWindow)(HWND)
eThumbStatus blendthumb_create_thumb_from_file(struct FileReader *rawfile, Thumbnail *thumb)
static void stream_close(FileReader *reader)
HRESULT CBlendThumb_CreateInstance(REFIID riid, void **ppv)
static off64_t stream_seek(FileReader *reader, off64_t offset, int whence)
static ssize_t stream_read(FileReader *reader, void *buffer, size_t size)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
IFACEMETHODIMP Initialize(IStream *pStream, DWORD grfMode)
IFACEMETHODIMP_(ULONG) AddRef()
IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv)
IFACEMETHODIMP GetThumbnail(UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha)
IFACEMETHODIMP_(ULONG) Release()
ccl_global float * buffer
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
blender::Array< uint8_t > data