MCPcopy Create free account
hub / github.com/diasurgical/devilution / FileStream_GetBitmap

Function FileStream_GetBitmap

3rdParty/StormLib/src/FileStream.cpp:2574–2653  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2572 */
2573
2574bool FileStream_GetBitmap(TFileStream * pStream, void * pvBitmap, DWORD cbBitmap, DWORD * pcbLengthNeeded)
2575{
2576 TStreamBitmap * pBitmap = (TStreamBitmap *)pvBitmap;
2577 TBlockStream * pBlockStream = (TBlockStream *)pStream;
2578 ULONGLONG BlockOffset;
2579 LPBYTE Bitmap = (LPBYTE)(pBitmap + 1);
2580 DWORD BitmapSize;
2581 DWORD BlockCount;
2582 DWORD BlockSize;
2583 bool bResult = false;
2584
2585 // Retrieve the size of one block
2586 if(pStream->BlockCheck != NULL)
2587 {
2588 BlockCount = pBlockStream->BlockCount;
2589 BlockSize = pBlockStream->BlockSize;
2590 }
2591 else
2592 {
2593 BlockCount = (DWORD)((pStream->StreamSize + DEFAULT_BLOCK_SIZE - 1) / DEFAULT_BLOCK_SIZE);
2594 BlockSize = DEFAULT_BLOCK_SIZE;
2595 }
2596
2597 // Fill-in the variables
2598 BitmapSize = (BlockCount + 7) / 8;
2599
2600 // Give the number of blocks
2601 if(pcbLengthNeeded != NULL)
2602 pcbLengthNeeded[0] = sizeof(TStreamBitmap) + BitmapSize;
2603
2604 // If the length of the buffer is not enough
2605 if(pvBitmap != NULL && cbBitmap != 0)
2606 {
2607 // Give the STREAM_BLOCK_MAP structure
2608 if(cbBitmap >= sizeof(TStreamBitmap))
2609 {
2610 pBitmap->StreamSize = pStream->StreamSize;
2611 pBitmap->BitmapSize = BitmapSize;
2612 pBitmap->BlockCount = BlockCount;
2613 pBitmap->BlockSize = BlockSize;
2614 pBitmap->IsComplete = (pStream->BlockCheck != NULL) ? pBlockStream->IsComplete : 1;
2615 bResult = true;
2616 }
2617
2618 // Give the block bitmap, if enough space
2619 if(cbBitmap >= sizeof(TStreamBitmap) + BitmapSize)
2620 {
2621 // Version with bitmap present
2622 if(pStream->BlockCheck != NULL)
2623 {
2624 DWORD ByteIndex = 0;
2625 BYTE BitMask = 0x01;
2626
2627 // Initialize the map with zeros
2628 memset(Bitmap, 0, BitmapSize);
2629
2630 // Fill the map
2631 for(BlockOffset = 0; BlockOffset < pStream->StreamSize; BlockOffset += BlockSize)

Callers 1

SFileGetFileInfoFunction · 0.85

Calls 1

SetLastErrorFunction · 0.85

Tested by

no test coverage detected