StretchBlt() and memory usage

Giganews Newsgroups
Subject: StretchBlt() and memory usage
Posted by:  William (po…@mx15.freecom.ne.jp)
Date: Fri, 30 Mar 2007

Env: WindowsXP, VC++6.0

My app need to deal with large DIB bitmap(256color, cx=4000, cy=4000) with
scale(x8) and mask display function.
I did as follows,

hdcImage = CreateCompatibleDC(hdcParent);
hbmImage = Create256DIBitmap(hdcParent, cxImage, cyImage, FALSE );
SelectObject(hdcImage, hbmImage);

hdcMask = CreateCompatibleDC(hdcImage);
hbmMask = Create256DIBitmap(hdcParent, cxImage, cyImage, TRUE);
SelectObject(hdcMask, hbmMask);

hdcShow = CreateCompatibleDC(hdcImage);
hbmShow = CreateCompatibleBitmap(hdcImage, cxScale, cyScale);
SelectObject(hdcShow, hbmShow);

To show the image, we call the following function
void CDIBView::OnDrawScaleImage(CDC* pDC)
{
    BYTE MaskByte = 0x00~0xFF;
    memset(pvBitsMask, MaskByte, nSizeOfColorBitMask);
    BitBlt( hdcMask, 0, 0, cxImage, cyImage, hdcImage, 0, 0, SRCAND);

    StretchBlt( hdcShow, 0, 0, cxScale, cyScale, hdcMask, 0, 0, cxImage,
cyImage, SRCCOPY);

    // Copy the bits to the screen.
    BitBlt(pDC->m_hDC, 0, 0, cxScale, cyScale, hdcShow, 0, 0, SRCCOPY);
}

I find that StretchBlt() will use quite a lot of system memory when
cxScale=cxImage*8, cyScale=cyImage*8.

On the other hand, if I edit the same bitmap(256color, cx=cy=1000) under
MSPaint.exe, I can't find obvious increase of memory usage when I change the
scale from x1 to x8.

So, my problem is why does StretchBlt() use so many system memory even after
calling it?
And how should I work it around?

TIA
William

Replies