MCPcopy Create free account
hub / github.com/ConEmu/ConEmu / LoadImageEx

Function LoadImageEx

src/ConEmu/LoadImg.cpp:643–699  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

641}
642
643BITMAPFILEHEADER* LoadImageEx(LPCWSTR asImgPath, BY_HANDLE_FILE_INFORMATION& inf)
644{
645 BITMAPFILEHEADER* pBkImgData = nullptr;
646 HANDLE hFile = CreateFile(asImgPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, nullptr);
647
648 if (hFile != INVALID_HANDLE_VALUE)
649 {
650 BOOL lbIsBmpFile = FALSE, lbFileIsValid = FALSE;
651
652 if (GetFileInformationByHandle(hFile, &inf) && inf.nFileSizeHigh == 0
653 && inf.nFileSizeLow >= (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO))) //-V119
654 {
655 lbFileIsValid = TRUE;
656
657 BYTE bm[2];
658 DWORD nRead;
659 if (ReadFile(hFile, bm, sizeof(bm), &nRead, nullptr) && nRead == 2 && (bm[0] == 'B' && bm[1] == 'M'))
660 {
661 lbIsBmpFile = TRUE;
662
663 pBkImgData = (BITMAPFILEHEADER*)malloc(inf.nFileSizeLow);
664 if (!pBkImgData)
665 {
666 _ASSERTE(pBkImgData!=nullptr);
667 CloseHandle(hFile);
668 return nullptr;
669 }
670 BYTE *pBuf = (BYTE*)pBkImgData;
671 memmove(pBkImgData, bm, sizeof(bm));
672
673 if (pBkImgData && ReadFile(hFile, pBuf+sizeof(bm), inf.nFileSizeLow-sizeof(bm), &inf.nFileSizeLow, nullptr))
674 {
675 inf.nFileSizeLow += sizeof(bm); // BM
676
677 if (pBuf[0] == 'B' && pBuf[1] == 'M' && *(uint32_t*)(pBuf + 0x0A) >= 0x36 && *(uint32_t*)(pBuf + 0x0A) <= 0x436 && *(uint32_t*)(pBuf + 0x0E) == 0x28 && !pBuf[0x1D] && !*(uint32_t*)(pBuf + 0x1E))
678 {
679 // OK
680 }
681 else
682 {
683 free(pBkImgData);
684 pBkImgData = nullptr;
685 }
686 }
687 }
688 }
689 CloseHandle(hFile);
690
691 if (!pBkImgData && lbFileIsValid && !lbIsBmpFile)
692 {
693 // Если это не BMP - попытаться через GDI+
694 pBkImgData = LoadImageGdip(asImgPath);
695 }
696 }
697
698 return pBkImgData;
699}
700

Callers 2

LoadBackgroundFileMethod · 0.85
LoadBackgroundFileMethod · 0.85

Calls 1

LoadImageGdipFunction · 0.85

Tested by

no test coverage detected