From bd7ac1d4e898fff2a30e40ca3ef63ef751e8595f Mon Sep 17 00:00:00 2001 From: "mkaply%us.ibm.com" Date: Thu, 16 Jan 2003 00:23:32 +0000 Subject: [PATCH] #140683 r=pedemont, sr=blizzard (OS/2 only) OS/2 only - Add 256 color support git-svn-id: svn://10.0.0.236/trunk@136392 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/gfx/src/os2/nsDeviceContextOS2.cpp | 192 +----------------- mozilla/gfx/src/os2/nsDeviceContextOS2.h | 12 +- mozilla/gfx/src/os2/nsDrawingSurfaceOS2.cpp | 3 + mozilla/gfx/src/os2/nsGfxFactoryOS2.cpp | 2 + mozilla/gfx/src/os2/nsRenderingContextOS2.cpp | 18 +- mozilla/widget/src/os2/nsWindow.cpp | 57 +++--- .../xpfe/bootstrap/nsNativeAppSupportOS2.cpp | 12 +- 7 files changed, 47 insertions(+), 249 deletions(-) diff --git a/mozilla/gfx/src/os2/nsDeviceContextOS2.cpp b/mozilla/gfx/src/os2/nsDeviceContextOS2.cpp index 4fb36be9f01..80f80eb7d46 100644 --- a/mozilla/gfx/src/os2/nsDeviceContextOS2.cpp +++ b/mozilla/gfx/src/os2/nsDeviceContextOS2.cpp @@ -24,9 +24,6 @@ #include "nsDeviceContextOS2.h" #include "nsRenderingContextOS2.h" #include "nsDeviceContextSpecOS2.h" -#ifdef COLOR_256 -#include "il_util.h" -#endif #include "nsIServiceManager.h" #include "nsCOMPtr.h" #include "nsIScreenManager.h" @@ -38,9 +35,7 @@ #include "nsIPref.h" #include "nsOS2Uni.h" - -// Size of the color cube -#define COLOR_CUBE_SIZE 216 +#include "nsPaletteOS2.h" #define NOT_SETUP 0x33 static PRBool gIsWarp4 = NOT_SETUP; @@ -52,12 +47,7 @@ nsDeviceContextOS2 :: nsDeviceContextOS2() : DeviceContextImpl() { mSurface = NULL; -#ifdef COLOR_256 - mPaletteInfo.isPaletteDevice = PR_FALSE; - mPaletteInfo.sizePalette = 0; - mPaletteInfo.numReserved = 0; - mPaletteInfo.palette = NULL; -#endif + mIsPaletteDevice = PR_FALSE; mPrintDC = NULL; mWidth = -1; mHeight = -1; @@ -209,20 +199,7 @@ void nsDeviceContextOS2 :: CommonInit(HDC aDC) GFX (::DevQueryCaps(aDC, CAPS_FAMILY, CAPS_DEVICE_POLYSET_POINTS, alArray), FALSE); mDepth = alArray[CAPS_COLOR_BITCOUNT]; -#ifdef COLOR_256 - mPaletteInfo.isPaletteDevice = !!(alArray[CAPS_ADDITIONAL_GRAPHICS] & CAPS_PALETTE_MANAGER); - - /* OS2TODO - pref to turn off palette management should set isPaletteDevice to false */ - - if (mPaletteInfo.isPaletteDevice) - mPaletteInfo.sizePalette = 256; - - if (alArray[CAPS_COLORS] >= 20) { - mPaletteInfo.numReserved = 20; - } else { - mPaletteInfo.numReserved = alArray[CAPS_COLORS]; - } /* endif */ -#endif + mIsPaletteDevice = ((alArray[CAPS_ADDITIONAL_GRAPHICS] & CAPS_PALETTE_MANAGER) == CAPS_PALETTE_MANAGER); mWidth = alArray[CAPS_WIDTH]; mHeight = alArray[CAPS_HEIGHT]; @@ -652,169 +629,6 @@ int prefChanged(const char *aPref, void *aClosure) return 0; } -#ifdef COLOR_256 -NS_IMETHODIMP nsDeviceContextOS2::GetILColorSpace(IL_ColorSpace*& aColorSpace) -{ - if (nsnull == mColorSpace) { - // See if we're dealing with an 8-bit palette device - if ((8 == mDepth) && mPaletteInfo.isPaletteDevice) { - // Create a color cube. We want to use DIB_PAL_COLORS because it's faster - // than DIB_RGB_COLORS, so make sure the indexes match that of the - // GDI physical palette - // - // Note: the image library doesn't use the reserved colors, so it doesn't - // matter what they're set to... -#ifdef XP_OS2 - IL_ColorMap* colorMap = IL_NewCubeColorMap(0, 0, COLOR_CUBE_SIZE); -#else /* This code causes traps on 256 color */ - IL_RGB reserved[10]; - memset(reserved, 0, sizeof(reserved)); - IL_ColorMap* colorMap = IL_NewCubeColorMap(reserved, 10, COLOR_CUBE_SIZE + 10); -#endif - if (nsnull == colorMap) { - return NS_ERROR_OUT_OF_MEMORY; - } - - // Create a pseudo color space - mColorSpace = IL_CreatePseudoColorSpace(colorMap, 8, 8); - - } else { - IL_RGBBits colorRGBBits; - - // Create a 24-bit color space - colorRGBBits.red_shift = 16; - colorRGBBits.red_bits = 8; - colorRGBBits.green_shift = 8; - colorRGBBits.green_bits = 8; - colorRGBBits.blue_shift = 0; - colorRGBBits.blue_bits = 8; - - mColorSpace = IL_CreateTrueColorSpace(&colorRGBBits, 24); - } - - if (nsnull == mColorSpace) { - aColorSpace = nsnull; - return NS_ERROR_OUT_OF_MEMORY; - } - } - - // Return the color space - aColorSpace = mColorSpace; - IL_AddRefToColorSpace(aColorSpace); - return NS_OK; -} - -#define NUM_SYS_COLORS 22 - -typedef struct _MYRGB -{ - BYTE red; - BYTE green; - BYTE blue; -} MYRGB; - -MYRGB sysColors[NUM_SYS_COLORS] = -{ - 0x00, 0x00, 0x00, // CLR_BLACK - 0x00, 0x00, 0x80, // CLR_DARKBLUE - 0x00, 0x80, 0x00, // CLR_DARKGREEN - 0x00, 0x80, 0x80, // CLR_DARKCYAN - 0x80, 0x00, 0x00, // CLR_DARKRED - 0x80, 0x00, 0x80, // CLR_DARKPINK - 0x80, 0x80, 0x00, // CLR_BROWN - 0x80, 0x80, 0x80, // CLR_DARKGRAY - 0xCC, 0xCC, 0xCC, // CLR_PALEGRAY - 0x00, 0x00, 0xFF, // CLR_BLUE - 0x00, 0xFF, 0x00, // CLR_GREEN - 0x00, 0xFF, 0xFF, // CLR_CYAN - 0xFF, 0x00, 0x00, // CLR_RED - 0xFF, 0x00, 0xFF, // CLR_PINK - 0xFF, 0xFF, 0x00, // CLR_YELLOW - 0xFE, 0xFE, 0xFE, // CLR_OFFWHITE - can only use white at index 255 - - 0xC0, 0xC0, 0xC0, // Gray (Windows) - 0xFF, 0xFB, 0xF0, // Pale Yellow (Windows) - 0xC0, 0xDC, 0xC0, // Pale Green (Windows) - 0xA4, 0xC8, 0xF0, // Light Blue (Windows) - 0xA4, 0xA0, 0xA4, // Medium Gray (Windows) - - 0xFF, 0xFF, 0xE4 // Tooltip color - see nsLookAndFeel.cpp -}; - -NS_IMETHODIMP nsDeviceContextOS2::GetPaletteInfo(nsPaletteInfo& aPaletteInfo) -{ - static PRBool fPaletteInitialized = PR_FALSE; - static ULONG aulTable[256]; - - aPaletteInfo.isPaletteDevice = mPaletteInfo.isPaletteDevice; - aPaletteInfo.sizePalette = mPaletteInfo.sizePalette; - aPaletteInfo.numReserved = mPaletteInfo.numReserved; - - if ((mPaletteInfo.isPaletteDevice) && (NULL == mPaletteInfo.palette)) { - if (!fPaletteInitialized) { - IL_ColorSpace* colorSpace; - GetILColorSpace(colorSpace); - - // Create a logical palette - ULONG ulCount; - - PRInt32 i,j; - // system colors - for (i = 0; i < NUM_SYS_COLORS; i++) { - aulTable[i] = MK_RGB(sysColors[i].red, sysColors[i].green, sysColors[i].blue); - } - - // Now set the color cube entries. -#ifdef XP_OS2 - NI_RGB* map = colorSpace->cmap.map; -#else /* Combined with changes in GetILColor Space, this traps */ - NI_RGB* map = colorSpace->cmap.map + 10; -#endif - - PRInt32 k = NUM_SYS_COLORS; - for (i = 0; i < COLOR_CUBE_SIZE; i++, map++) { - aulTable[k] = MK_RGB(map->red, map->green, map->blue); - for (j = 0;j < NUM_SYS_COLORS; j++) { - if (aulTable[k] == aulTable[j]) { - aulTable[k] = 0; - break; - } /* endif */ - } /* endfor */ - if (j == NUM_SYS_COLORS) { - k++; - } /* endif */ - } /* endfor */ - - ulCount = (k-1); - - // This overwrites the last entry in the cube (white) - for (i=ulCount;i<256 ;i++ ) { - aulTable[i] = MK_RGB(254,254,254); - } /* endfor */ - - aulTable[255] = MK_RGB(255, 255, 255); // Entry 255 must be white - fPaletteInitialized = PR_TRUE; - - IL_ReleaseColorSpace(colorSpace); - -#ifdef DEBUG - for (i=0;i<256 ;i++ ) - printf("Entry[%d] in table is %x\n", i, aulTable[i]); -#endif - - } /* endif */ - // Create a GPI palette - mPaletteInfo.palette = - (void*)GFX (::GpiCreatePalette ((HAB)0, NULL, - LCOLF_CONSECRGB, 256, aulTable), - GPI_ERROR); - } /* endif */ - - aPaletteInfo.palette = mPaletteInfo.palette; - return NS_OK; -} -#endif - NS_IMETHODIMP nsDeviceContextOS2 :: ConvertPixel(nscolor aColor, PRUint32 & aPixel) { aPixel = aColor; diff --git a/mozilla/gfx/src/os2/nsDeviceContextOS2.h b/mozilla/gfx/src/os2/nsDeviceContextOS2.h index 257b39cdd72..64d4358bc49 100644 --- a/mozilla/gfx/src/os2/nsDeviceContextOS2.h +++ b/mozilla/gfx/src/os2/nsDeviceContextOS2.h @@ -65,13 +65,6 @@ public: NS_IMETHOD GetDepth(PRUint32& aDepth); - -#ifdef COLOR_256 - NS_IMETHOD GetILColorSpace(IL_ColorSpace*& aColorSpace); - - NS_IMETHOD GetPaletteInfo(nsPaletteInfo&); -#endif - NS_IMETHOD ConvertPixel(nscolor aColor, PRUint32 & aPixel); NS_IMETHOD GetDeviceSurfaceDimensions(PRInt32 &aWidth, PRInt32 &aHeight); @@ -109,9 +102,7 @@ protected: nsDrawingSurface mSurface; PRUint32 mDepth; // bit depth of device -#ifdef COLOR_256 - nsPaletteInfo mPaletteInfo; -#endif + PRBool mIsPaletteDevice; PRInt32 mWidth; PRInt32 mHeight; nsRect mClientRect; @@ -136,6 +127,7 @@ public: BOOL isPrintDC(); PRBool SupportsRasterFonts(); + PRBool IsPaletteDevice() {return mIsPaletteDevice;}; nsresult nsDeviceContextOS2::CreateFontAliasTable(); }; diff --git a/mozilla/gfx/src/os2/nsDrawingSurfaceOS2.cpp b/mozilla/gfx/src/os2/nsDrawingSurfaceOS2.cpp index 19d840eda9e..c9c421dc3e6 100644 --- a/mozilla/gfx/src/os2/nsDrawingSurfaceOS2.cpp +++ b/mozilla/gfx/src/os2/nsDrawingSurfaceOS2.cpp @@ -25,6 +25,7 @@ #include "nsIWidget.h" #include "nsDrawingSurfaceOS2.h" #include "nsFontMetricsOS2.h" +#include "nsPaletteOS2.h" // Base class -- fonts, palette and xpcom ----------------------------------- @@ -188,6 +189,8 @@ nsresult nsOffscreenSurface::Init( HPS aCompatiblePS, if( GPI_ERROR != mPS) { + nsPaletteOS2::SelectGlobalPalette(mPS); + // now create a bitmap of the right size BITMAPINFOHEADER2 hdr = { 0 }; diff --git a/mozilla/gfx/src/os2/nsGfxFactoryOS2.cpp b/mozilla/gfx/src/os2/nsGfxFactoryOS2.cpp index ea61f6ba0a5..3be0514b572 100644 --- a/mozilla/gfx/src/os2/nsGfxFactoryOS2.cpp +++ b/mozilla/gfx/src/os2/nsGfxFactoryOS2.cpp @@ -58,6 +58,7 @@ #include "gfxImageFrame.h" #include "nsOS2Uni.h" +#include "nsPaletteOS2.h" // objects that just require generic constructors @@ -205,6 +206,7 @@ PR_STATIC_CALLBACK(void) nsGfxOS2ModuleDtor(nsIModule *self) { OS2Uni::FreeUconvObjects(); + nsPaletteOS2::FreeGlobalPalette(); // nsRenderingContextOS2::Shutdown(); } diff --git a/mozilla/gfx/src/os2/nsRenderingContextOS2.cpp b/mozilla/gfx/src/os2/nsRenderingContextOS2.cpp index 101727ff924..0f28b7b7190 100644 --- a/mozilla/gfx/src/os2/nsRenderingContextOS2.cpp +++ b/mozilla/gfx/src/os2/nsRenderingContextOS2.cpp @@ -52,6 +52,7 @@ #include "nsFont.h" #include "prprf.h" #include "nsIRenderingContextOS2.h" +#include "nsPaletteOS2.h" // helper clip region functions - defined at the bottom of this file. @@ -265,28 +266,15 @@ nsresult nsRenderingContextOS2::SetupPS (void) { LONG BlackColor, WhiteColor; -#ifdef COLOR_256 - // If this is a palette device, then select and realize the palette - nsPaletteInfo palInfo; - mContext->GetPaletteInfo(palInfo); - - if (palInfo.isPaletteDevice && palInfo.palette) + // If this is a palette device, then set transparent colors + if (((nsDeviceContextOS2*)mContext)->IsPaletteDevice()) { - ULONG cclr; - - // Select the palette in the background - GFX (::GpiSelectPalette (mPS, (HPAL)palInfo.palette), PAL_ERROR); - - if (mDCOwner) - GFX (::WinRealizePalette((HWND)mDCOwner->GetNativeData(NS_NATIVE_WINDOW), mPS, &cclr), PAL_ERROR); - BlackColor = GFX (::GpiQueryColorIndex (mPS, 0, MK_RGB (0x00, 0x00, 0x00)), GPI_ALTERROR); // CLR_BLACK; WhiteColor = GFX (::GpiQueryColorIndex (mPS, 0, MK_RGB (0xFF, 0xFF, 0xFF)), GPI_ALTERROR); // CLR_WHITE; mPaletteMode = PR_TRUE; } else -#endif { GFX (::GpiCreateLogColorTable (mPS, 0, LCOLF_RGB, 0, 0, 0), FALSE); diff --git a/mozilla/widget/src/os2/nsWindow.cpp b/mozilla/widget/src/os2/nsWindow.cpp index afd254dc5ef..c63e41bb1a9 100644 --- a/mozilla/widget/src/os2/nsWindow.cpp +++ b/mozilla/widget/src/os2/nsWindow.cpp @@ -61,6 +61,7 @@ #include "nsIFile.h" #include "nsOS2Uni.h" +#include "nsPaletteOS2.h" #include #include @@ -1844,8 +1845,12 @@ void* nsWindow::GetNativeData(PRUint32 aDataType) case NS_NATIVE_GRAPHIC: if( !mPS) { - if( mDragInside) mPS = DrgGetPS( mWnd); - else mPS = WinGetPS( mWnd); + if( mDragInside) { + mPS = DrgGetPS(mWnd); + } else { + mPS = WinGetPS(mWnd); + } + nsPaletteOS2::SelectGlobalPalette(mPS, mWnd); } mPSRefs++; rc = (void*) mPS; @@ -2592,32 +2597,24 @@ PRBool nsWindow::OnReposition( PSWP pSwp) return result; } -// Realize-palette. I reckon only top-level windows get the message, so -// there's code in frame to broadcast it to children. PRBool nsWindow::OnRealizePalette() { - PRBool rc = PR_FALSE; + if (WinQueryWindowUShort(mWnd, QWS_ID) == FID_CLIENT) { + HWND hwndFocus = WinQueryFocus(HWND_DESKTOP); + if (WinIsChild(hwndFocus, mWnd)) { + /* We are getting the focus */ + HPS hps = WinGetPS(hwndFocus); + nsPaletteOS2::SelectGlobalPalette(hps, hwndFocus); + WinReleasePS(hps); + WinInvalidateRect( mWnd, 0, TRUE); + } else { + /* We are losing the focus */ + WinInvalidateRect( mWnd, 0, TRUE); + } + } -#ifdef COLOR_256 - // Get palette info from device - nsPaletteInfo palInfo; - mContext->GetPaletteInfo( palInfo); - - if( mPS && palInfo.isPaletteDevice && palInfo.palette) - { - // An onscreen nsDrawingSurface has been created for the window, - // and we have a palette. So realize it. - ULONG cclr; - long palrc = WinRealizePalette( mWnd, mPS, &cclr); - if( palrc && palrc != PAL_ERROR) - // Colours have changed, redraw. - WinInvalidateRect( mWnd, 0, FALSE); - - rc = PR_TRUE; - } -#endif - - return rc; + // Always call the default window procedure + return PR_TRUE; } PRBool nsWindow::OnPresParamChanged( MPARAM mp1, MPARAM mp2) @@ -2715,6 +2712,7 @@ PRBool nsWindow::OnPaint() RECTL rcl = { 0 }; HPS hPS = WinBeginPaint(mWnd, NULLHANDLE, &rcl); + nsPaletteOS2::SelectGlobalPalette(hPS, mWnd); // XXX What is this check doing? If it's trying to check for an empty // paint rect then use the IsRectEmpty() function... @@ -2764,15 +2762,6 @@ PRBool nsWindow::OnPaint() if (NS_OK == winrc->CreateDrawingSurface(hPS, surf, event.widget)) { event.renderingContext->Init(mContext, surf); -#ifdef COLOR_256 - nsPaletteInfo palInfo; - mContext->GetPaletteInfo(palInfo); - if (palInfo.isPaletteDevice && palInfo.palette) - { - ULONG cclr; - ::WinRealizePalette(mWnd, hPS, &cclr); - } -#endif rc = DispatchWindowEvent(&event); event.renderingContext->DestroyDrawingSurface(surf); } diff --git a/mozilla/xpfe/bootstrap/nsNativeAppSupportOS2.cpp b/mozilla/xpfe/bootstrap/nsNativeAppSupportOS2.cpp index a5746a653a4..1bc9f9a8310 100644 --- a/mozilla/xpfe/bootstrap/nsNativeAppSupportOS2.cpp +++ b/mozilla/xpfe/bootstrap/nsNativeAppSupportOS2.cpp @@ -56,6 +56,7 @@ #include "nsIPromptService.h" #include "nsNetCID.h" #include "nsIObserverService.h" +#include "nsPaletteOS2.h" // These are needed to load a URL in a browser window. #include "nsIDOMLocation.h" @@ -338,7 +339,8 @@ private: * whether Mozilla is already running. */ -class nsNativeAppSupportOS2 : public nsNativeAppSupportBase { +class nsNativeAppSupportOS2 : public nsNativeAppSupportBase +{ public: // Overrides of base implementation. NS_IMETHOD Start( PRBool *aResult ); @@ -589,6 +591,7 @@ MRESULT EXPENTRY DialogProc( HWND dlg, ULONG msg, MPARAM mp1, MPARAM mp2 ) { else if ( msg == WM_PAINT ) { nsSplashScreenOS2 *splashScreen = (nsSplashScreenOS2*)WinQueryWindowPtr( dlg, QWL_USER ); HPS hps = WinBeginPaint (dlg, NULLHANDLE, NULL); + nsPaletteOS2::SelectGlobalPalette(hps, dlg); GpiErase (hps); POINTL aptl[8] = {0, 0, splashScreen->mBitmapCX, splashScreen->mBitmapCY, 0, 0, 0, 0, @@ -599,6 +602,13 @@ MRESULT EXPENTRY DialogProc( HWND dlg, ULONG msg, MPARAM mp1, MPARAM mp2 ) { WinEndPaint( hps ); return (MRESULT)TRUE; } + else if ( msg == WM_REALIZEPALETTE ) { + HPS hps = WinGetPS(dlg); + nsPaletteOS2::SelectGlobalPalette(hps, dlg); + WinReleasePS(hps); + WinInvalidateRect( dlg, 0, TRUE); + return (MRESULT)TRUE; + } return WinDefDlgProc (dlg, msg, mp1, mp2); }