Fix for #135226 - 256 color palettes should be selected as background palettes

(Checking in patch for saari)
r=blythe, sr=waterson, a=adt for checkin to trunk
This commit is contained in:
chak%netscape.com 2002-04-16 20:54:23 +00:00
parent 4369bcc66e
commit 5913aadd80
4 changed files with 23 additions and 257 deletions

View File

@ -52,8 +52,6 @@
#include "nsString.h"
static NS_DEFINE_CID(kPrintOptionsCID, NS_PRINTOPTIONS_CID);
// Size of the color cube
#define COLOR_CUBE_SIZE 216
#define DOC_TITLE_LENGTH 64
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
@ -604,225 +602,6 @@ NS_IMETHODIMP nsDeviceContextWin::GetDepth(PRUint32& aDepth)
return NS_OK;
}
#define COLOR_CUBE_SIZE 216
nscolor map[COLOR_CUBE_SIZE] = {
NS_RGB(0x0, 0x0, 0x0 ),
NS_RGB(0x0, 0x0, 0x33),
NS_RGB(0x0, 0x0, 0x66),
NS_RGB(0x0, 0x0, 0x99),
NS_RGB(0x0, 0x0, 0xcc),
NS_RGB(0x0, 0x0, 0xff),
NS_RGB(0x0, 0x33, 0x0 ),
NS_RGB(0x0, 0x33, 0x33),
NS_RGB(0x0, 0x33, 0x66),
NS_RGB(0x0, 0x33, 0x99),
NS_RGB(0x0, 0x33, 0xcc),
NS_RGB(0x0, 0x33, 0xff),
NS_RGB(0x0, 0x66, 0x0 ),
NS_RGB(0x0, 0x66, 0x33),
NS_RGB(0x0, 0x66, 0x66),
NS_RGB(0x0, 0x66, 0x99),
NS_RGB(0x0, 0x66, 0xcc),
NS_RGB(0x0, 0x66, 0xff),
NS_RGB(0x0, 0x99, 0x0 ),
NS_RGB(0x0, 0x99, 0x33),
NS_RGB(0x0, 0x99, 0x66),
NS_RGB(0x0, 0x99, 0x99),
NS_RGB(0x0, 0x99, 0xcc),
NS_RGB(0x0, 0x99, 0xff),
NS_RGB(0x0, 0xcc, 0x0 ),
NS_RGB(0x0, 0xcc, 0x33),
NS_RGB(0x0, 0xcc, 0x66),
NS_RGB(0x0, 0xcc, 0x99),
NS_RGB(0x0, 0xcc, 0xcc),
NS_RGB(0x0, 0xcc, 0xff),
NS_RGB(0x0, 0xff, 0x0 ),
NS_RGB(0x0, 0xff, 0x33),
NS_RGB(0x0, 0xff, 0x66),
NS_RGB(0x0, 0xff, 0x99),
NS_RGB(0x0, 0xff, 0xcc),
NS_RGB(0x0, 0xff, 0xff),
NS_RGB(0x33, 0x0, 0x0 ),
NS_RGB(0x33, 0x0, 0x33),
NS_RGB(0x33, 0x0, 0x66),
NS_RGB(0x33, 0x0, 0x99),
NS_RGB(0x33, 0x0, 0xcc),
NS_RGB(0x33, 0x0, 0xff),
NS_RGB(0x33, 0x33, 0x0 ),
NS_RGB(0x33, 0x33, 0x33),
NS_RGB(0x33, 0x33, 0x66),
NS_RGB(0x33, 0x33, 0x99),
NS_RGB(0x33, 0x33, 0xcc),
NS_RGB(0x33, 0x33, 0xff),
NS_RGB(0x33, 0x66, 0x0 ),
NS_RGB(0x33, 0x66, 0x33),
NS_RGB(0x33, 0x66, 0x66),
NS_RGB(0x33, 0x66, 0x99),
NS_RGB(0x33, 0x66, 0xcc),
NS_RGB(0x33, 0x66, 0xff),
NS_RGB(0x33, 0x99, 0x0 ),
NS_RGB(0x33, 0x99, 0x33),
NS_RGB(0x33, 0x99, 0x66),
NS_RGB(0x33, 0x99, 0x99),
NS_RGB(0x33, 0x99, 0xcc),
NS_RGB(0x33, 0x99, 0xff),
NS_RGB(0x33, 0xcc, 0x0 ),
NS_RGB(0x33, 0xcc, 0x33),
NS_RGB(0x33, 0xcc, 0x66),
NS_RGB(0x33, 0xcc, 0x99),
NS_RGB(0x33, 0xcc, 0xcc),
NS_RGB(0x33, 0xcc, 0xff),
NS_RGB(0x33, 0xff, 0x0 ),
NS_RGB(0x33, 0xff, 0x33),
NS_RGB(0x33, 0xff, 0x66),
NS_RGB(0x33, 0xff, 0x99),
NS_RGB(0x33, 0xff, 0xcc),
NS_RGB(0x33, 0xff, 0xff),
NS_RGB(0x66, 0x0, 0x0 ),
NS_RGB(0x66, 0x0, 0x33),
NS_RGB(0x66, 0x0, 0x66),
NS_RGB(0x66, 0x0, 0x99),
NS_RGB(0x66, 0x0, 0xcc),
NS_RGB(0x66, 0x0, 0xff),
NS_RGB(0x66, 0x33, 0x0 ),
NS_RGB(0x66, 0x33, 0x33),
NS_RGB(0x66, 0x33, 0x66),
NS_RGB(0x66, 0x33, 0x99),
NS_RGB(0x66, 0x33, 0xcc),
NS_RGB(0x66, 0x33, 0xff),
NS_RGB(0x66, 0x66, 0x0 ),
NS_RGB(0x66, 0x66, 0x33),
NS_RGB(0x66, 0x66, 0x66),
NS_RGB(0x66, 0x66, 0x99),
NS_RGB(0x66, 0x66, 0xcc),
NS_RGB(0x66, 0x66, 0xff),
NS_RGB(0x66, 0x99, 0x0 ),
NS_RGB(0x66, 0x99, 0x33),
NS_RGB(0x66, 0x99, 0x66),
NS_RGB(0x66, 0x99, 0x99),
NS_RGB(0x66, 0x99, 0xcc),
NS_RGB(0x66, 0x99, 0xff),
NS_RGB(0x66, 0xcc, 0x0 ),
NS_RGB(0x66, 0xcc, 0x33),
NS_RGB(0x66, 0xcc, 0x66),
NS_RGB(0x66, 0xcc, 0x99),
NS_RGB(0x66, 0xcc, 0xcc),
NS_RGB(0x66, 0xcc, 0xff),
NS_RGB(0x66, 0xff, 0x0 ),
NS_RGB(0x66, 0xff, 0x33),
NS_RGB(0x66, 0xff, 0x66),
NS_RGB(0x66, 0xff, 0x99),
NS_RGB(0x66, 0xff, 0xcc),
NS_RGB(0x66, 0xff, 0xff),
NS_RGB(0x99, 0x0, 0x0 ),
NS_RGB(0x99, 0x0, 0x33),
NS_RGB(0x99, 0x0, 0x66),
NS_RGB(0x99, 0x0, 0x99),
NS_RGB(0x99, 0x0, 0xcc),
NS_RGB(0x99, 0x0, 0xff),
NS_RGB(0x99, 0x33, 0x0 ),
NS_RGB(0x99, 0x33, 0x33),
NS_RGB(0x99, 0x33, 0x66),
NS_RGB(0x99, 0x33, 0x99),
NS_RGB(0x99, 0x33, 0xcc),
NS_RGB(0x99, 0x33, 0xff),
NS_RGB(0x99, 0x66, 0x0 ),
NS_RGB(0x99, 0x66, 0x33),
NS_RGB(0x99, 0x66, 0x66),
NS_RGB(0x99, 0x66, 0x99),
NS_RGB(0x99, 0x66, 0xcc),
NS_RGB(0x99, 0x66, 0xff),
NS_RGB(0x99, 0x99, 0x0 ),
NS_RGB(0x99, 0x99, 0x33),
NS_RGB(0x99, 0x99, 0x66),
NS_RGB(0x99, 0x99, 0x99),
NS_RGB(0x99, 0x99, 0xcc),
NS_RGB(0x99, 0x99, 0xff),
NS_RGB(0x99, 0xcc, 0x0 ),
NS_RGB(0x99, 0xcc, 0x33),
NS_RGB(0x99, 0xcc, 0x66),
NS_RGB(0x99, 0xcc, 0x99),
NS_RGB(0x99, 0xcc, 0xcc),
NS_RGB(0x99, 0xcc, 0xff),
NS_RGB(0x99, 0xff, 0x0 ),
NS_RGB(0x99, 0xff, 0x33),
NS_RGB(0x99, 0xff, 0x66),
NS_RGB(0x99, 0xff, 0x99),
NS_RGB(0x99, 0xff, 0xcc),
NS_RGB(0x99, 0xff, 0xff),
NS_RGB(0xcc, 0x0, 0x0 ),
NS_RGB(0xcc, 0x0, 0x33),
NS_RGB(0xcc, 0x0, 0x66),
NS_RGB(0xcc, 0x0, 0x99),
NS_RGB(0xcc, 0x0, 0xcc),
NS_RGB(0xcc, 0x0, 0xff),
NS_RGB(0xcc, 0x33, 0x0 ),
NS_RGB(0xcc, 0x33, 0x33),
NS_RGB(0xcc, 0x33, 0x66),
NS_RGB(0xcc, 0x33, 0x99),
NS_RGB(0xcc, 0x33, 0xcc),
NS_RGB(0xcc, 0x33, 0xff),
NS_RGB(0xcc, 0x66, 0x0 ),
NS_RGB(0xcc, 0x66, 0x33),
NS_RGB(0xcc, 0x66, 0x66),
NS_RGB(0xcc, 0x66, 0x99),
NS_RGB(0xcc, 0x66, 0xcc),
NS_RGB(0xcc, 0x66, 0xff),
NS_RGB(0xcc, 0x99, 0x0 ),
NS_RGB(0xcc, 0x99, 0x33),
NS_RGB(0xcc, 0x99, 0x66),
NS_RGB(0xcc, 0x99, 0x99),
NS_RGB(0xcc, 0x99, 0xcc),
NS_RGB(0xcc, 0x99, 0xff),
NS_RGB(0xcc, 0xcc, 0x0 ),
NS_RGB(0xcc, 0xcc, 0x33),
NS_RGB(0xcc, 0xcc, 0x66),
NS_RGB(0xcc, 0xcc, 0x99),
NS_RGB(0xcc, 0xcc, 0xcc),
NS_RGB(0xcc, 0xcc, 0xff),
NS_RGB(0xcc, 0xff, 0x0 ),
NS_RGB(0xcc, 0xff, 0x33),
NS_RGB(0xcc, 0xff, 0x66),
NS_RGB(0xcc, 0xff, 0x99),
NS_RGB(0xcc, 0xff, 0xcc),
NS_RGB(0xcc, 0xff, 0xff),
NS_RGB(0xff, 0x0, 0x0 ),
NS_RGB(0xff, 0x0, 0x33),
NS_RGB(0xff, 0x0, 0x66),
NS_RGB(0xff, 0x0, 0x99),
NS_RGB(0xff, 0x0, 0xcc),
NS_RGB(0xff, 0x0, 0xff),
NS_RGB(0xff, 0x33, 0x0 ),
NS_RGB(0xff, 0x33, 0x33),
NS_RGB(0xff, 0x33, 0x66),
NS_RGB(0xff, 0x33, 0x99),
NS_RGB(0xff, 0x33, 0xcc),
NS_RGB(0xff, 0x33, 0xff),
NS_RGB(0xff, 0x66, 0x0 ),
NS_RGB(0xff, 0x66, 0x33),
NS_RGB(0xff, 0x66, 0x66),
NS_RGB(0xff, 0x66, 0x99),
NS_RGB(0xff, 0x66, 0xcc),
NS_RGB(0xff, 0x66, 0xff),
NS_RGB(0xff, 0x99, 0x0 ),
NS_RGB(0xff, 0x99, 0x33),
NS_RGB(0xff, 0x99, 0x66),
NS_RGB(0xff, 0x99, 0x99),
NS_RGB(0xff, 0x99, 0xcc),
NS_RGB(0xff, 0x99, 0xff),
NS_RGB(0xff, 0xcc, 0x0 ),
NS_RGB(0xff, 0xcc, 0x33),
NS_RGB(0xff, 0xcc, 0x66),
NS_RGB(0xff, 0xcc, 0x99),
NS_RGB(0xff, 0xcc, 0xcc),
NS_RGB(0xff, 0xcc, 0xff),
NS_RGB(0xff, 0xff, 0x0 ),
NS_RGB(0xff, 0xff, 0x33),
NS_RGB(0xff, 0xff, 0x66),
NS_RGB(0xff, 0xff, 0x99),
NS_RGB(0xff, 0xff, 0xcc),
NS_RGB(0xff, 0xff, 0xff)};
NS_IMETHODIMP nsDeviceContextWin::GetPaletteInfo(nsPaletteInfo& aPaletteInfo)
{
@ -831,38 +610,15 @@ NS_IMETHODIMP nsDeviceContextWin::GetPaletteInfo(nsPaletteInfo& aPaletteInfo)
aPaletteInfo.numReserved = mPaletteInfo.numReserved;
if (NULL == mPaletteInfo.palette) {
// Create a logical palette
BYTE tmp[sizeof(LOGPALETTE) + ((COLOR_CUBE_SIZE + 20) * sizeof(PALETTEENTRY))];
LPLOGPALETTE logPal = (LPLOGPALETTE)tmp;
logPal->palVersion = 0x300;
logPal->palNumEntries = COLOR_CUBE_SIZE + 20;
// Initialize it from the default Windows palette
HPALETTE hDefaultPalette = (HPALETTE)::GetStockObject(DEFAULT_PALETTE);
// First ten system colors
::GetPaletteEntries(hDefaultPalette, 0, 10, logPal->palPalEntry);
// Last ten system colors
::GetPaletteEntries(hDefaultPalette, 10, 10, &logPal->palPalEntry[COLOR_CUBE_SIZE + 10]);
// Now set the color cube entries.
PALETTEENTRY* entry = &logPal->palPalEntry[10];
for (PRInt32 i = 0; i < COLOR_CUBE_SIZE; i++) {
entry->peRed = NS_GET_R(map[i]);
entry->peGreen = NS_GET_G(map[i]);
entry->peBlue = NS_GET_B(map[i]);
entry->peFlags = 0;
entry++;
}
// Create a GDI palette
mPaletteInfo.palette = ::CreatePalette(logPal);
HWND hwnd = (HWND)mWidget;
HDC hdc = ::GetDC(hwnd);
mPaletteInfo.palette = ::CreateHalftonePalette(hdc);
::SetStretchBltMode(hdc, HALFTONE);
::ReleaseDC(hwnd, hdc);
}
aPaletteInfo.palette = mPaletteInfo.palette;
return NS_OK;
}

View File

@ -525,9 +525,12 @@ nsImageWin :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
}
}
} else {
int saveMode = ::GetStretchBltMode(TheHDC);
::SetStretchBltMode(TheHDC, HALFTONE);
::StretchDIBits(TheHDC, aDX, aDY, aDWidth, aDHeight,aSX, srcy, aSWidth, aSHeight, mAlphaBits,
(LPBITMAPINFO)&bmi, DIB_RGB_COLORS, SRCAND);
rop = SRCPAINT;
::SetStretchBltMode(TheHDC, saveMode);
}
}
}
@ -547,7 +550,10 @@ nsImageWin :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
blendFunction.AlphaFormat = 1 /*AC_SRC_ALPHA*/;
gAlphaBlend(TheHDC, aDX, aDY, aDWidth, aDHeight, srcDC, aSX, aSY, aSWidth, aSHeight, blendFunction);
} else {
int saveMode = ::GetStretchBltMode(TheHDC);
::SetStretchBltMode(TheHDC, HALFTONE);
::StretchBlt(TheHDC, aDX, aDY, aDWidth, aDHeight, srcDC, aSX, aSY,aSWidth, aSHeight, rop);
::SetStretchBltMode(TheHDC, saveMode);
}
}else{
if (! didComposite)
@ -565,7 +571,10 @@ nsImageWin :: Draw(nsIRenderingContext &aContext, nsDrawingSurface aSurface,
blendFunction.AlphaFormat = 1 /*AC_SRC_ALPHA*/;
gAlphaBlend(TheHDC, aDX, aDY, aDWidth, aDHeight, srcDC, aSX, aSY, aSWidth, aSHeight, blendFunction);
} else {
int saveMode = ::GetStretchBltMode(TheHDC);
::SetStretchBltMode(TheHDC, HALFTONE);
::StretchBlt(TheHDC,aDX,aDY,aDWidth,aDHeight,srcDC,aSX,aSY,aSWidth,aSHeight,rop);
::SetStretchBltMode(TheHDC, saveMode);
}
}
@ -624,8 +633,11 @@ void nsImageWin::DrawComposited(HDC TheHDC, int aDX, int aDY, int aDWidth, int a
DrawComposited24(screenBits, aSX, aSY, aSWidth, aSHeight);
/* Copy back to the HDC */
int saveMode = ::GetStretchBltMode(TheHDC);
::SetStretchBltMode(TheHDC, HALFTONE);
::StretchBlt(TheHDC, aDX, aDY, aDWidth, aDHeight,
memDC, 0, 0, aSWidth, aSHeight, SRCCOPY);
::SetStretchBltMode(TheHDC, saveMode);
::SelectObject(memDC, oldBitmap);
::DeleteObject(tmpBitmap);

View File

@ -445,7 +445,7 @@ nsresult nsRenderingContextWin :: SetupDC(HDC aOldDC, HDC aNewDC)
mCurrTextColor = mCurrentColor;
::SetBkMode(aNewDC, TRANSPARENT);
::SetPolyFillMode(aNewDC, WINDING);
::SetStretchBltMode(aNewDC, COLORONCOLOR);
::SetStretchBltMode(aNewDC, HALFTONE);
::SetTextAlign(aNewDC, TA_BASELINE);
if (nsnull != aOldDC)
@ -488,7 +488,7 @@ nsresult nsRenderingContextWin :: SetupDC(HDC aOldDC, HDC aNewDC)
if (palInfo.isPaletteDevice && palInfo.palette)
{
// Select the palette in the background
::SelectPalette(aNewDC, (HPALETTE)palInfo.palette, PR_FALSE);
::SelectPalette(aNewDC, (HPALETTE)palInfo.palette, PR_TRUE);
::RealizePalette(aNewDC);
}
@ -537,9 +537,8 @@ NS_IMETHODIMP nsRenderingContextWin :: LockDrawingSurface(PRInt32 aX, PRInt32 aY
mContext->GetPaletteInfo(palInfo);
if(palInfo.isPaletteDevice && palInfo.palette){
::SelectPalette(mDC,(HPALETTE)palInfo.palette,PR_FALSE);
::SelectPalette(mDC,(HPALETTE)palInfo.palette,PR_TRUE);
::RealizePalette(mDC);
::UpdateColors(mDC);
}
}
@ -2635,9 +2634,8 @@ NS_IMETHODIMP nsRenderingContextWin :: CopyOffScreenBits(nsDrawingSurface aSrcSu
mContext->GetPaletteInfo(palInfo);
if (palInfo.isPaletteDevice && palInfo.palette){
::SelectPalette(destdc, (HPALETTE)palInfo.palette, PR_FALSE);
::SelectPalette(destdc, (HPALETTE)palInfo.palette, PR_TRUE);
::RealizePalette(destdc);
::UpdateColors(destdc);
}
if (aCopyFlags & NS_COPYBITS_XFORM_SOURCE_VALUES)

View File

@ -3866,7 +3866,7 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
mContext->GetPaletteInfo(palInfo);
if (palInfo.isPaletteDevice && palInfo.palette) {
HDC hDC = ::GetDC(mWnd);
HPALETTE hOldPal = ::SelectPalette(hDC, (HPALETTE)palInfo.palette, FALSE);
HPALETTE hOldPal = ::SelectPalette(hDC, (HPALETTE)palInfo.palette, TRUE);
// Realize the drawing palette
int i = ::RealizePalette(hDC);