123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689 |
- #include "main.h"
- #include "./ml_imageloader.h"
- #include "api__gen_ml.h"
- #include "./ml_ipc_0313.h"
- #include <api/service/waServiceFactory.h>
- #include <api/service/svcs/svc_imgload.h>
- #include <api/memmgr/api_memmgr.h>
- #include <commctrl.h>
- #include <shlwapi.h>
- static const GUID pngGUID = { 0x5e04fb28, 0x53f5, 0x4032, { 0xbd, 0x29, 0x3, 0x2b, 0x87, 0xec, 0x37, 0x25 } };
- #ifndef LOAD_LIBRARY_AS_IMAGE_RESOURCE
- #define LOAD_LIBRARY_AS_IMAGE_RESOURCE 0x000000020
- #endif //LOAD_LIBRARY_AS_IMAGE_RESOURCE
- static svc_imageLoader *wasabiPNGLoader = NULL;
- static api_memmgr *wasabiMemMgr = NULL;
- static BOOL InitializePNGService(void)
- {
- waServiceFactory *sf;
- if (!wasabiMemMgr)
- {
- sf = WASABI_API_SVC->service_getServiceByGuid(memMgrApiServiceGuid);
- if (sf) wasabiMemMgr = reinterpret_cast<api_memmgr*>(sf->getInterface());
- }
- if (wasabiMemMgr && !wasabiPNGLoader)
- {
- sf = WASABI_API_SVC->service_getServiceByGuid(pngGUID);
- if (sf) wasabiPNGLoader = reinterpret_cast<svc_imageLoader*>(sf->getInterface());
- }
- return (wasabiMemMgr && wasabiPNGLoader);
- }
- static HBITMAP LoadImage_LoadPngData(void *pngData, UINT pngSize, BOOL fPremultiply)
- {
- INT cx, cy;
- HBITMAP bitmap;
- if (NULL == wasabiPNGLoader)
- {
- if (FALSE == InitializePNGService() ||
- NULL == wasabiPNGLoader)
- {
- return NULL;
- }
- }
- pngData = (FALSE != fPremultiply) ?
- wasabiPNGLoader->loadImage(pngData, pngSize, &cx, &cy) :
- wasabiPNGLoader->loadImageData(pngData, pngSize, &cx, &cy);
-
-
- if (NULL != pngData)
- {
- BITMAPINFOHEADER header;
- void *pixelData;
- ZeroMemory(&header, sizeof(BITMAPINFOHEADER));
- header.biSize = sizeof(BITMAPINFOHEADER);
- header.biBitCount = 32;
- header.biPlanes = 1;
- header.biWidth = cx;
- header.biHeight = -cy;
- bitmap = CreateDIBSection(NULL, (LPBITMAPINFO)&header, DIB_RGB_COLORS, &pixelData, NULL, 0);
- if (NULL != bitmap)
- CopyMemory(pixelData, pngData, cx * cy * sizeof(DWORD));
-
- wasabiMemMgr->sysFree(pngData);
- }
- else
- bitmap = NULL;
-
- return bitmap;
- }
- static HBITMAP LoadImage_PngResource(HINSTANCE hInstance, HINSTANCE langModule,
- LPCWSTR pszName, LPCWSTR pszType, BOOL fPremultiply)
- {
- HRSRC res;
-
- res = (NULL != langModule) ?
- FindResourceW(langModule, pszName, pszType) :
- NULL;
-
- if (NULL == res)
- {
- res = FindResourceW(hInstance, pszName, pszType);
- }
- else
- {
- hInstance = langModule;
- }
-
- if (NULL == res)
- return NULL;
- HANDLE handle = LoadResource(hInstance, res);
- if (NULL == handle)
- return NULL;
-
- UINT pngSize = SizeofResource(hInstance, res);
- if (0 == pngSize)
- return NULL;
-
- void *pngData = LockResource(handle);
- if (NULL == pngData)
- return NULL;
- return LoadImage_LoadPngData(pngData, pngSize, fPremultiply);
-
- }
- static HBITMAP LoadImage_BmpResource(HINSTANCE hInstace, HINSTANCE langModule, LPCWSTR pszName, LPCWSTR pszType, BOOL fPremultiply)
- {
- UINT flags = LR_DEFAULTCOLOR | LR_CREATEDIBSECTION;
- if (NULL != langModule)
- {
- HBITMAP bitmap;
- bitmap = (HBITMAP)LoadImageW(langModule, pszName, IMAGE_BITMAP, 0, 0, flags);
- if (NULL != bitmap)
- return bitmap;
- }
-
- return (HBITMAP)LoadImageW(hInstace, pszName, IMAGE_BITMAP, 0, 0, flags);
- }
- static BOOL LoadImage_IsValidGuidChar(wchar_t c)
- {
- if ((c >= L'0' && c <= L'9') ||
- (c >= L'A' && c <= L'F') ||
- (c >= L'a' && c <= L'f') ||
- (L'-' == c))
- {
- return TRUE;
- }
- return FALSE;
- }
- static HRESULT LoadImage_CrackResProtocol(LPCWSTR pszAddress, LPCWSTR pszDefaultType, HINSTANCE *module,
- HINSTANCE *langModule, LPCWSTR *name, wchar_t **type)
- {
- if (NULL == module) return E_POINTER;
- if (NULL == pszAddress || L'\0' == *pszAddress)
- return E_INVALIDARG;
- INT cchAddress = lstrlenW(pszAddress);
- const WCHAR szPrefix[] = L"res://";
- INT cchPrefix = ARRAYSIZE(szPrefix) - 1;
-
- if (cchAddress <= cchPrefix ||
- CSTR_EQUAL != CompareStringW(CSTR_INVARIANT, NORM_IGNORECASE, pszAddress, cchPrefix, szPrefix, cchPrefix))
- {
- return S_FALSE;
- }
-
- pszAddress += cchPrefix;
- cchAddress -= cchPrefix;
- LPCWSTR resType = NULL;
- LPCWSTR resName = NULL;
- LPCWSTR p = pszAddress + cchAddress;
- while (p != pszAddress && L'/' != *p) p--;
- if (p != pszAddress && p < (pszAddress + cchAddress))
- {
- resName = p + 1;
- p--;
- }
-
- if (NULL == resName || L'\0' == *resName)
- return E_FAIL;
-
- WCHAR szFile[MAX_PATH + 128] = {0};
- if (FAILED(StringCchCopyNW(szFile, ARRAYSIZE(szFile), pszAddress, (resName - pszAddress - 1))))
- return E_OUTOFMEMORY;
- while (p != pszAddress && L'/' != *p) p--;
- if (p != pszAddress && p < resName)
- {
- resType = p + 1;
- if (L'\0' == *resType)
- {
- resType = NULL;
- }
- else
- {
- size_t pos = (resType - pszAddress);
- szFile[pos - 1] = L'\0';
- resType = &szFile[pos];
- }
- }
- HINSTANCE hModule = LoadLibraryExW(szFile, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
- if (NULL == hModule && NULL != resType)
- {
- DWORD errorCode = GetLastError();
- if (ERROR_FILE_NOT_FOUND == errorCode)
- {
- *((LPWSTR)(resType - 1)) = L'/';
- resType = NULL;
- hModule = LoadLibraryExW(szFile, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
- }
- }
-
- if (NULL == hModule)
- return E_FAIL;
- if (NULL != type)
- {
- if (NULL == resType)
- resType = pszDefaultType;
- if (FALSE == IS_INTRESOURCE(resType))
- {
- if (L'#' == *resType)
- {
- INT typeId;
- if (FALSE != StrToIntExW(resType + 1, STIF_DEFAULT, &typeId))
- resType = MAKEINTRESOURCEW(typeId);
- else
- resType = NULL;
- }
- else
- {
- int length = lstrlenW(resType);
- wchar_t *str = (wchar_t*)malloc((length + 1) * sizeof(wchar_t));
- if (NULL != str)
- CopyMemory(str, resType, sizeof(wchar_t) * (length + 1));
- resType = str;
- }
- }
-
- *type = (wchar_t*)resType;
- }
- if (NULL != langModule)
- {
- *langModule = NULL;
- if (NULL != WASABI_API_LNG &&
- FALSE == SENDWAIPC(plugin.hwndParent, IPC_GETLANGUAGEPACKINSTANCE, 1))
- {
- wchar_t buffer[64], *lang_str;
- GUID lang_id;
- if (0 != LoadStringW(hModule, LANG_DLL_GUID_STRING_ID, buffer, ARRAYSIZE(buffer)))
- {
- lang_str = buffer;
- while(FALSE == LoadImage_IsValidGuidChar(*lang_str))
- {
- if (L'0' == *lang_str)
- break;
- lang_str++;
- }
-
- int len = lstrlenW(lang_str);
- if (len > 0)
- {
- wchar_t *cursor = lang_str + (len - 1);
- while(FALSE == LoadImage_IsValidGuidChar(*cursor))
- {
- if (lang_str == cursor)
- break;
- cursor--;
- }
- *(cursor+1) = L'\0';
- }
-
- if (RPC_S_OK == UuidFromStringW((RPC_WSTR)lang_str, &lang_id))
- {
- *langModule = WASABI_API_LNG->FindDllHandleByGUID(lang_id);
- if (*langModule == hModule)
- *langModule = NULL;
- }
- }
- }
- }
- *module = hModule;
-
- if (NULL != name)
- *name = resName;
-
- return S_OK;
- }
- static HBITMAP
- LoadImage_CrackHBitmapProtocol(const wchar_t *address)
- {
- INT addressLen, prefixLen;
- const WCHAR prefix[] = L"hbitmap://";
- LONGLONG value;
-
- if (NULL == address || L'\0' == *address)
- return NULL;
- addressLen = lstrlenW(address);
- prefixLen = ARRAYSIZE(prefix) - 1;
-
- if (addressLen <= prefixLen ||
- CSTR_EQUAL != CompareStringW(CSTR_INVARIANT, NORM_IGNORECASE,
- address, prefixLen, prefix, prefixLen))
- {
- return NULL;
- }
- address += prefixLen;
- while(L'\0' != *address && L' ' == *address)
- address++;
- if (FALSE == StrToInt64ExW(address, STIF_SUPPORT_HEX, &value))
- return NULL;
- return (HBITMAP)value;
- }
-
- static HBITMAP LoadImage_ResProtocol(LPCWSTR pszAddress, LPCWSTR pszDefaultType,
- BOOL fPremultiply, BOOL ignoreLocalized)
- {
- HRESULT hr;
- HINSTANCE hModule, langModule;
- LPCWSTR resName;
- wchar_t *resType;
- HBITMAP bitmap;
- BOOL loaded = FALSE;
- hr = LoadImage_CrackResProtocol(pszAddress, pszDefaultType, &hModule,
- (FALSE == ignoreLocalized) ? &langModule : NULL,
- &resName, &resType);
-
- if (FAILED(hr) || S_FALSE == hr)
- return NULL;
- if (FALSE != ignoreLocalized)
- langModule = NULL;
- if (NULL != resType)
- {
- if (IS_INTRESOURCE(resType))
- {
- switch((INT)(INT_PTR)resType)
- {
- case (INT)(INT_PTR)RT_BITMAP:
- bitmap = LoadImage_BmpResource(hModule, langModule, resName, resType, fPremultiply);
- loaded = TRUE;
- break;
- }
- }
- }
- if (FALSE == loaded)
- {
- bitmap = LoadImage_PngResource(hModule, langModule, resName, resType, fPremultiply);
- }
- if (NULL != langModule)
- {
- // do not call FreeLibrary for langModule (it was never loaded)
- // FreeLibrary(langModule);
- }
- FreeLibrary(hModule);
- if (FALSE == IS_INTRESOURCE(resType))
- free(resType);
- return bitmap;
- }
- static HBITMAP LoadImage_PngFile(LPCWSTR pszPath, BOOL fPremultiply, BOOL ignoreLocalized)
- {
- HANDLE hFile = CreateFileW(pszPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if (INVALID_HANDLE_VALUE == hFile)
- return NULL;
-
- HBITMAP bitmap = NULL;
- UINT pngSize = GetFileSize(hFile, NULL);
- if (INVALID_FILE_SIZE != pngSize)
- {
- void *pngData = malloc(pngSize);
- if (NULL != pngData)
- {
- DWORD readed = 0;
- if (0 != ReadFile(hFile, pngData, pngSize, &readed, NULL) || pngSize != readed)
- {
- bitmap = LoadImage_LoadPngData(pngData, pngSize, fPremultiply);
- }
- free(pngData);
- }
- }
-
- CloseHandle(hFile);
- return bitmap;
- }
- static HBITMAP LoadImage_Png(const MLIMAGESOURCE_I *pImgSource)
- {
- HBITMAP bitmap;
- const wchar_t *path;
- BOOL premultiply, ignoreLocalized;
- path = pImgSource->lpszName;
- premultiply = (0 != (ISF_PREMULTIPLY_I & pImgSource->flags));
- ignoreLocalized = (0 != (ISF_NOLOCALIZED_LOAD_I & pImgSource->flags));
-
- if (FALSE == IS_INTRESOURCE(path))
- {
- bitmap = LoadImage_CrackHBitmapProtocol(path);
- if (NULL != bitmap)
- {
- bitmap = (HBITMAP)CopyImage(bitmap,IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- return bitmap;
- }
- bitmap = LoadImage_ResProtocol(path, (LPCWSTR)RT_RCDATA, premultiply, ignoreLocalized);
- if (NULL != bitmap)
- return bitmap;
- if (0 != (ISF_LOADFROMFILE_I & pImgSource->flags))
- return LoadImage_PngFile(path, premultiply, ignoreLocalized);
- }
-
- bitmap = LoadImage_PngResource(pImgSource->hInst, NULL, path, (LPCWSTR)RT_RCDATA, premultiply);
- if (NULL != bitmap)
- return bitmap;
- bitmap = LoadImage_PngResource(pImgSource->hInst, NULL, path, (LPCWSTR)L"PNG", premultiply);
- return bitmap;
- }
- static HBITMAP LoadImage_Bmp(const MLIMAGESOURCE_I *pImgSource)
- {
- HBITMAP bitmap;
- const wchar_t *path;
- BOOL premultiply, ignoreLocalized;
- path = pImgSource->lpszName;
- premultiply = (0 != (ISF_PREMULTIPLY_I & pImgSource->flags));
- ignoreLocalized = (0 != (ISF_NOLOCALIZED_LOAD_I & pImgSource->flags));
- if (FALSE == IS_INTRESOURCE(path))
- {
- bitmap = LoadImage_CrackHBitmapProtocol(path);
- if (NULL != bitmap)
- {
- bitmap = (HBITMAP)CopyImage(bitmap,IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- return bitmap;
- }
- bitmap = LoadImage_ResProtocol(path, (LPCWSTR)RT_BITMAP, premultiply, ignoreLocalized);
- if (NULL != bitmap)
- return bitmap;
- }
- UINT flags = LR_DEFAULTCOLOR | LR_CREATEDIBSECTION;
- if (0 != (ISF_LOADFROMFILE_I & pImgSource->flags))
- flags |= LR_LOADFROMFILE;
- bitmap = (HBITMAP)LoadImageW(pImgSource->hInst, path, IMAGE_BITMAP, 0, 0, flags);
- return bitmap;
- }
- static HBITMAP LoadImage_HIMAGELIST(const MLIMAGESOURCE_I *pImgSource)
- {
- // IMAGEINFO ii;
- // if (!pImgSource) return NULL;
- // return (ImageList_GetImageInfo((HIMAGELIST)pImgSource->hInst, (INT)(INT_PTR)pImgSource->lpszName, &ii)) ? ii.hbmImage : NULL;
- return NULL; // not supported;
- }
- static HBITMAP DuplicateStretchedDib(HBITMAP hbmpSrc, INT xSrc, INT ySrc, INT cxSrc, INT cySrc, INT cxDst, INT cyDst, INT bppDst, INT bppSrc, BOOL fStretch)
- {
- HDC hdcSrc, hdcDst;
- HBITMAP hbmpDst;
- LPVOID dib;
- BITMAPINFOHEADER bi;
- hdcSrc = CreateCompatibleDC(0);
- if (!hdcSrc) return NULL;
- hdcDst = CreateCompatibleDC(0);
- if (!hdcDst) { DeleteDC(hdcSrc); return NULL; }
-
- ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
- bi.biSize = sizeof (BITMAPINFOHEADER);
- bi.biWidth = cxDst;
- bi.biHeight = -ABS(cyDst);
- bi.biPlanes = 1;
- bi.biBitCount = bppDst;
- hbmpDst = CreateDIBSection(hdcDst, (BITMAPINFO *)&bi, DIB_RGB_COLORS, &dib, NULL, NULL);
- if (hbmpDst)
- {
- HGDIOBJ hgdiDst = SelectObject(hdcDst, hbmpDst);
- HGDIOBJ hgdiSrc = SelectObject(hdcSrc, hbmpSrc);
- if (fStretch && (cxDst != cxSrc || cyDst != cySrc))
- {
- if (32 == bppDst || 32 == bppSrc)
- {
- BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
- GdiAlphaBlend(hdcDst, 0, 0, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, bf);
- }
- else
- {
- INT stretchModeOld = SetStretchBltMode(hdcDst, HALFTONE);
- StretchBlt(hdcDst, 0, 0, cxDst, ABS(cyDst), hdcSrc, xSrc, ySrc, cxSrc, cySrc, SRCCOPY);
- SetStretchBltMode(hdcDst, stretchModeOld);
- }
- }
- else BitBlt(hdcDst, 0, 0, cxDst, ABS(cyDst), hdcSrc, xSrc, ySrc, SRCCOPY);
- SelectObject(hdcSrc, hgdiSrc);
- SelectObject(hdcDst, hgdiDst);
- }
- DeleteDC(hdcSrc);
- DeleteDC(hdcDst);
- return hbmpDst;
- }
- HBITMAP MLImageLoaderI_LoadDib(const MLIMAGESOURCE_I *pImgSource)
- {
- HBITMAP hbmp;
- if (NULL == pImgSource)
- return NULL;
- switch(pImgSource->type)
- {
- case SRC_TYPE_BMP_I: hbmp = LoadImage_Bmp(pImgSource); break;
- case SRC_TYPE_PNG_I: hbmp = LoadImage_Png(pImgSource); break;
- case SRC_TYPE_HBITMAP_I: hbmp = (HBITMAP)CopyImage((HANDLE)pImgSource->lpszName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); break;
- case SRC_TYPE_HIMAGELIST_I: hbmp = LoadImage_HIMAGELIST(pImgSource); break;
- default: hbmp = NULL; break;
- }
- if (NULL != hbmp) //
- {
- // get bitmap info
- BITMAP bm;
- if (sizeof(bm) == GetObjectW(hbmp, sizeof(bm), &bm))
- {
- if (((ISF_USE_OFFSET_I & pImgSource->flags) && (pImgSource->xSrc || pImgSource->ySrc)) ||
- ((ISF_USE_SIZE_I & pImgSource->flags) && (pImgSource->cxSrc != bm.bmWidth || pImgSource->cySrc != bm.bmHeight)) ||
- ((ISF_FORCE_SIZE_I & pImgSource->flags) && (pImgSource->cxDst != bm.bmWidth || pImgSource->cyDst != bm.bmHeight)) ||
- ((ISF_FORCE_BPP_I & pImgSource->flags) && (pImgSource->bpp != bm.bmBitsPixel)))
- {
- HBITMAP hOldBmp;
- hOldBmp = hbmp;
- hbmp = DuplicateStretchedDib( hbmp,
- (ISF_USE_OFFSET_I & pImgSource->flags) ? pImgSource->xSrc : 0,
- (ISF_USE_OFFSET_I & pImgSource->flags) ? pImgSource->ySrc : 0,
- (ISF_USE_SIZE_I & pImgSource->flags) ? pImgSource->cxSrc : bm.bmWidth,
- (ISF_USE_SIZE_I & pImgSource->flags) ? pImgSource->cySrc : bm.bmHeight,
- (ISF_FORCE_SIZE_I & pImgSource->flags) ? pImgSource->cxDst: bm.bmWidth,
- (ISF_FORCE_SIZE_I & pImgSource->flags) ? pImgSource->cyDst: bm.bmHeight,
- (ISF_FORCE_BPP_I & pImgSource->flags) ? pImgSource->bpp : bm.bmBitsPixel,
- bm.bmBitsPixel,
- (ISF_SCALE_I & pImgSource->flags));
- DeleteObject(hOldBmp);
- }
- }
- else
- {
- DeleteObject(hbmp);
- hbmp = NULL;
- }
- }
- return hbmp;
- }
- BOOL MLImageLoaderI_CopyData(MLIMAGESOURCE_I *pisDst, const MLIMAGESOURCE_I *pisSrc)
- {
- if (!pisDst || !pisSrc) return FALSE;
- CopyMemory(pisDst, pisSrc, sizeof(MLIMAGESOURCE_I));
- if (SRC_TYPE_HBITMAP_I != pisSrc->type && SRC_TYPE_HIMAGELIST_I != pisSrc->type &&
- pisSrc->lpszName && !IS_INTRESOURCE(pisSrc->lpszName)) pisDst->lpszName = _wcsdup(pisSrc->lpszName);
- return TRUE;
- }
- BOOL MLImageLoaderI_FreeData(MLIMAGESOURCE_I *pis)
- {
- if (!pis) return FALSE;
- if (SRC_TYPE_HBITMAP_I != pis->type && SRC_TYPE_HIMAGELIST_I != pis->type &&
- pis->lpszName && !IS_INTRESOURCE(pis->lpszName)) free((LPWSTR)pis->lpszName);
- return TRUE;
- }
- BOOL MLImageLoaderI_CheckExist(const MLIMAGESOURCE_I *pis)
- {
- const wchar_t *resType;
- if (NULL == pis)
- return FALSE;
- switch(pis->type)
- {
- case SRC_TYPE_HBITMAP_I: return (NULL != pis->lpszName);
- case SRC_TYPE_HIMAGELIST_I: return FALSE;
- case SRC_TYPE_PNG_I: resType = (LPCWSTR)RT_RCDATA; break;
- case SRC_TYPE_BMP_I: resType = (LPCWSTR)RT_BITMAP; break;
- default: resType = NULL; break;
- }
- if (FALSE == IS_INTRESOURCE(pis->lpszName))
- {
- BOOL result;
- HINSTANCE module, langModule;
- LPCWSTR name;
- wchar_t *type;
- HRESULT hr;
- if (NULL != LoadImage_CrackHBitmapProtocol(pis->lpszName))
- return TRUE;
- result = FALSE;
- langModule = NULL;
- hr = LoadImage_CrackResProtocol(pis->lpszName, resType, &module,
- (0 == (ISF_NOLOCALIZED_LOAD_I & pis->flags)) ? &langModule : NULL,
- &name, &type);
- if (0 != (ISF_NOLOCALIZED_LOAD_I & pis->flags))
- langModule = NULL;
- if (S_OK == hr)
- {
- if (NULL != langModule)
- {
- result = (NULL != FindResourceW(langModule, name, type));
- // do not call FreeLibrary for langModule (it was never loaded)
- //FreeLibrary(langModule);
- }
- if (FALSE == result)
- result = (NULL != FindResourceW(module, name, type));
- FreeLibrary(module);
- if (FALSE == IS_INTRESOURCE(type))
- free(type);
- return result;
- }
- if (0 != (ISF_LOADFROMFILE_I & pis->flags))
- {
- HANDLE hFile = CreateFileW(pis->lpszName, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
- if (INVALID_HANDLE_VALUE != hFile)
- {
- switch(pis->type)
- {
- case SRC_TYPE_PNG_I:
- if (NULL != wasabiPNGLoader ||
- InitializePNGService())
- {
- BYTE data[8] = {0}; // png signature len
- DWORD dataRead = 0;
- if(ReadFile(hFile, data, sizeof(data), &dataRead, NULL) && 0 != dataRead)
- result = wasabiPNGLoader->testData(data, dataRead);
- }
- break;
- default:
- result = TRUE;
- break;
- }
- CloseHandle(hFile);
- }
- return result;
- }
- }
- return (NULL != resType &&
- NULL != FindResourceW(pis->hInst, pis->lpszName, resType));
- }
|