Some more work on transparent images

This commit is contained in:
troy%netscape.com 1998-07-17 00:09:19 +00:00
Родитель 2a21bd184c
Коммит 7598292705
2 изменённых файлов: 53 добавлений и 14 удалений

Просмотреть файл

@ -30,6 +30,7 @@ nsImageWin :: nsImageWin()
mImageBits = nsnull; mImageBits = nsnull;
mHBitmap = nsnull; mHBitmap = nsnull;
mAlphaHBitmap = nsnull;
mHPalette = nsnull; mHPalette = nsnull;
mAlphaBits = nsnull; mAlphaBits = nsnull;
mColorMap = nsnull; mColorMap = nsnull;
@ -52,6 +53,7 @@ NS_IMPL_ISUPPORTS(nsImageWin, kIImageIID);
nsresult nsImageWin :: Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth,nsMaskRequirements aMaskRequirements) nsresult nsImageWin :: Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth,nsMaskRequirements aMaskRequirements)
{ {
mHBitmap = nsnull; mHBitmap = nsnull;
mAlphaHBitmap = nsnull;
mHPalette = nsnull; mHPalette = nsnull;
CleanUp(PR_TRUE); CleanUp(PR_TRUE);
ComputePaletteSize(aDepth); ComputePaletteSize(aDepth);
@ -97,7 +99,7 @@ nsresult nsImageWin :: Init(PRInt32 aWidth, PRInt32 aHeight, PRInt32 aDepth,nsMa
mAlphaBits = new unsigned char[mARowBytes * aHeight]; mAlphaBits = new unsigned char[mARowBytes * aHeight];
mAlphaWidth = aWidth; mAlphaWidth = aWidth;
mAlphaWidth = aHeight; mAlphaHeight = aHeight;
} }
else else
{ {
@ -753,6 +755,7 @@ nsImageWin *theimage;
theimage->MakePalette(); theimage->MakePalette();
theimage->mHBitmap = nsnull; theimage->mHBitmap = nsnull;
theimage->mAlphaHBitmap = nsnull;
return (theimage); return (theimage);
} }
@ -824,6 +827,29 @@ PRBool nsImageWin :: SetSystemPalette(HDC* aHdc)
//------------------------------------------------------------ //------------------------------------------------------------
struct MONOBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[2];
MONOBITMAPINFO(LONG aWidth, LONG aHeight)
{
memset(&bmiHeader, 0, sizeof(bmiHeader));
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = aWidth;
bmiHeader.biHeight = aHeight;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = 1;
bmiColors[0].rgbBlue = 0;
bmiColors[0].rgbGreen = 0;
bmiColors[0].rgbRed = 0;
bmiColors[0].rgbReserved = 0;
bmiColors[1].rgbBlue = 255;
bmiColors[1].rgbGreen = 255;
bmiColors[1].rgbRed = 255;
bmiColors[1].rgbReserved = 0;
}
};
// creates an optimized bitmap, or HBITMAP // creates an optimized bitmap, or HBITMAP
nsresult nsImageWin :: Optimize(nsDrawingSurface aSurface) nsresult nsImageWin :: Optimize(nsDrawingSurface aSurface)
{ {
@ -831,7 +857,19 @@ nsresult nsImageWin :: Optimize(nsDrawingSurface aSurface)
if ((the_hdc != NULL) && !IsOptimized() && (mSizeImage > 0)) if ((the_hdc != NULL) && !IsOptimized() && (mSizeImage > 0))
{ {
mHBitmap = ::CreateDIBitmap(the_hdc, mBHead, CBM_INIT, mImageBits, (LPBITMAPINFO)mBHead, DIB_RGB_COLORS); mHBitmap = ::CreateDIBitmap(the_hdc, mBHead, CBM_INIT, mImageBits, (LPBITMAPINFO)mBHead,
DIB_RGB_COLORS);
if (nsnull != mAlphaBits)
{
// Create a monochrome bitmap
// XXX Handle the case of 8-bit alpha bits...
mAlphaHBitmap = ::CreateBitmap(mAlphaWidth, mAlphaHeight, 1, 1, NULL);
MONOBITMAPINFO bmi(mAlphaWidth, mAlphaHeight);
::SetDIBits(NULL /* ignored */, mAlphaHBitmap, 0, mAlphaHeight, mAlphaBits,
(LPBITMAPINFO)&bmi, DIB_RGB_COLORS);
}
mIsOptimized = PR_TRUE; mIsOptimized = PR_TRUE;
CleanUp(PR_FALSE); CleanUp(PR_FALSE);
@ -905,11 +943,10 @@ void nsImageWin :: CleanUp(PRBool aCleanUpAll)
// this only happens when we need to clean up everything // this only happens when we need to clean up everything
if (aCleanUpAll == PR_TRUE) if (aCleanUpAll == PR_TRUE)
{ {
if (mAlphaBits != nsnull)
delete [] mAlphaBits;
if (mHBitmap != nsnull) if (mHBitmap != nsnull)
::DeleteObject(mHBitmap); ::DeleteObject(mHBitmap);
if (mAlphaHBitmap != nsnull)
::DeleteObject(mAlphaHBitmap);
if(mBHead) if(mBHead)
{ {
@ -918,16 +955,16 @@ void nsImageWin :: CleanUp(PRBool aCleanUpAll)
} }
mHBitmap = nsnull; mHBitmap = nsnull;
mAlphaHBitmap = nsnull;
mAlphaBits = nsnull; mAlphaBits = nsnull;
mIsOptimized = PR_FALSE; mIsOptimized = PR_FALSE;
}
if (mImageBits != nsnull) if (mImageBits != nsnull)
{
delete [] mImageBits; delete [] mImageBits;
mImageBits = nsnull; if (mAlphaBits != nsnull)
} delete [] mAlphaBits;
}
if (mHPalette != nsnull) if (mHPalette != nsnull)
::DeleteObject(mHPalette); ::DeleteObject(mHPalette);
@ -946,6 +983,7 @@ void nsImageWin :: CleanUp(PRBool aCleanUpAll)
mSizeImage = 0; mSizeImage = 0;
mHPalette = nsnull; mHPalette = nsnull;
mImageBits = nsnull; mImageBits = nsnull;
mAlphaBits = nsnull;
mColorMap = nsnull; mColorMap = nsnull;
} }

Просмотреть файл

@ -227,7 +227,8 @@ private:
// for Set/GetColorMap // for Set/GetColorMap
HPALETTE mHPalette; HPALETTE mHPalette;
HBITMAP mHBitmap; // the GDI bitmap HBITMAP mHBitmap; // the GDI bitmaps
HBITMAP mAlphaHBitmap;
LPBITMAPINFOHEADER mBHead; // BITMAPINFOHEADER LPBITMAPINFOHEADER mBHead; // BITMAPINFOHEADER
}; };