r=mkaply, a=brendan
Port of nsDeviceContextOS2 to be more like Windows and removal of nsPaletteOS2
This commit is contained in:
mkaply%us.ibm.com 2000-07-26 14:21:07 +00:00
parent 3b8c9f1a14
commit 0cb64066c3
9 changed files with 541 additions and 552 deletions

View File

@ -45,7 +45,6 @@ CPPSRCS = \
nsScreenOS2.cpp \
nsScreenManagerOS2.cpp \
nsGfxFactoryOS2.cpp \
nsPaletteOS2.cpp \
$(NULL)
RES_FILE = $(srcdir)/libprint.res

View File

@ -1,13 +1,14 @@
/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the Mozilla OS/2 libraries.
*
@ -15,73 +16,62 @@
* <john_fairhurst@iname.com>. Portions created by John Fairhurst are
* Copyright (C) 1999 John Fairhurst. All Rights Reserved.
*
* Contributor(s): Henry Sobotka <sobotka@axess.com> 2OOO/O2 update
*
* This Original Code has been modified by IBM Corporation.
* Modifications made by IBM described herein are
* Copyright (c) International Business Machines
* Corporation, 2000
*
* Modifications to Mozilla code or documentation
* identified per MPL Section 3.3
*
* Date Modified by Description of modification
* ---- ----------- ---------------------------
* 5/31/2000 IBM Corp. Add method isPrintDC() to class nsDeviceContextOS2 to use in file
* nsRenderingContextOS2.cpp
* 06/07/2000 IBM Corp. Corrected querying of screen and client sizes
* Contributor(s):
* Henry Sobotka <sobotka@axess.com> 2OOO/O2 update
* IBM Corp.
*/
// ToDo:
#include "nsGfxDefs.h"
#include "libprint.h"
#include "nsDeviceContextSpecOS2.h"
#include "nsDeviceContextOS2.h"
#include "nsDrawingSurfaceOS2.h"
#include "nsPaletteOS2.h"
#include "nsHashtable.h"
#include "nsString.h"
#include "nsFont.h"
#include "nsRenderingContextOS2.h"
#include "nsDeviceContextSpecOS2.h"
#include "il_util.h"
#include "nsIPref.h"
#include "nsIServiceManager.h"
#include "nsCOMPtr.h"
#include "nsIScreenManager.h"
#include "nsIScreen.h"
// nsDeviceContextOS2 - The graphics state associated with a window.
// Keep the colour palette for all rendering contexts here; they share
// it and the widget can do palette-y things.
//
// Remember that this thing can be fairly long-lived, linked to a window.
//
// It's a bit schizophrenic - really there should be a nsIPrintDC <: nsIDC ...
#include "nsHashTable.h" // For CreateFontAliasTable()
// Init/Term -----------------------------------------------------------------
#include "nsGfxDefs.h"
// Size of the color cube
#define COLOR_CUBE_SIZE 216
#define NOT_SETUP 0x33
static PRBool gIsWarp4 = NOT_SETUP;
nsDeviceContextOS2::nsDeviceContextOS2() : DeviceContextImpl()
{
// Default for now
mSurface = nsnull;
mDepth = 0;
mPaletteInfo.isPaletteDevice = PR_FALSE;
mPaletteInfo.sizePalette = 0;
mPaletteInfo.numReserved = 0;
mPaletteInfo.palette = nsnull;
mPalette = nsnull;
mPixelsToTwips = 0;
mTwipsToPixels = 0;
mPixelScale = 1.0f;
mWidth = -1;
mHeight = -1;
mPrintDC = nsnull;
mSpec = nsnull;
mCachedClientRect = PR_FALSE;
mCachedFullRect = PR_FALSE;
mPrintState = nsPrintState_ePreBeginDoc;
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
// Init module if necessary (XXX find a better way of doing this!)
PRBool nsDeviceContextOS2::gRound = PR_FALSE;
PRUint32 nsDeviceContextOS2::sNumberOfScreens = 0;
static char* nav4rounding = "font.size.nav4rounding";
nsDeviceContextOS2 :: nsDeviceContextOS2()
: DeviceContextImpl()
{
mSurface = nsnull;
mPaletteInfo.isPaletteDevice = PR_FALSE;
mPaletteInfo.sizePalette = 0;
mPaletteInfo.numReserved = 0;
mPaletteInfo.palette = nsnull;
mDC = nsnull;
mPixelScale = 1.0f;
mWidth = -1;
mHeight = -1;
mSpec = nsnull;
mCachedClientRect = PR_FALSE;
mCachedFullRect = PR_FALSE;
#ifdef XP_OS2
mPrintState = nsPrintState_ePreBeginDoc;
#endif
#ifdef XP_OS2 // OS2TODO - GET RID OF THIS!
// Init module if necessary
if( !gModuleData.lDisplayDepth)
gModuleData.Init();
#endif
// The first time in we initialize gIsWarp4 flag
if (NOT_SETUP == gIsWarp4) {
@ -90,144 +80,163 @@ nsDeviceContextOS2::nsDeviceContextOS2() : DeviceContextImpl()
ulValues, sizeof(ulValues));
gIsWarp4 = (ulValues[0] >= 20) && (ulValues[1] >= 40);
}
#ifndef XP_OS2
nsresult res = NS_ERROR_FAILURE;
NS_WITH_SERVICE(nsIPref, prefs, kPrefCID, &res);
if (NS_SUCCEEDED(res)) {
static PRBool roundingInitialized = PR_FALSE;
if (!roundingInitialized) {
roundingInitialized = PR_TRUE;
PrefChanged(nav4rounding, this);
}
prefs->RegisterCallback(nav4rounding, PrefChanged, this);
}
#endif
}
nsDeviceContextOS2::~nsDeviceContextOS2()
{
NS_IF_RELEASE( mSurface);
NS_IF_RELEASE( mPalette);
if(mDC)
{
GpiAssociate(mPS, 0);
GpiDestroyPS(mPS);
PrnCloseDC(mDC);
}
if( mPrintDC)
{
GpiAssociate( mPS, 0);
GpiDestroyPS( mPS);
PrnCloseDC( mPrintDC);
}
NS_IF_RELEASE(mSpec);
NS_IF_RELEASE(mSpec);
}
nsresult nsDeviceContextOS2::Init( nsNativeWidget aWidget)
{
HWND hwnd = aWidget ? (HWND)aWidget : HWND_DESKTOP;
HDC hdc = WinOpenWindowDC( hwnd);
nsresult retval = DeviceContextImpl::Init(aWidget);
CommonInit( hdc);
HWND hwnd = (HWND)aWidget;
HDC hdc = WinOpenWindowDC(hwnd);
// Get size - don't know if this is needed for non-print DCs
long lCaps[2];
DevQueryCaps( hdc, CAPS_WIDTH, 2, lCaps);
mWidth = lCaps[0]; // these are in device units...
mHeight = lCaps[1];
CommonInit(hdc);
// Don't need to close HDCs obtained from WinOpenWindowDC
#ifdef XP_OS2 /* OS2TODO - Why are we doing this? These were set in CommonInit */
// Get size - don't know if this is needed for non-print DCs
long lCaps[2];
DevQueryCaps( hdc, CAPS_WIDTH, 2, lCaps);
mWidth = lCaps[0]; // these are in device units...
mHeight = lCaps[1];
#endif
return DeviceContextImpl::Init( aWidget);
return retval;
}
// This version of Init() is called when creating a print DC
nsresult nsDeviceContextOS2::Init( nsNativeDeviceContext aContext,
nsIDeviceContext *aOrigContext)
{
// These calcs are from the windows version & I'm not 100%
// sure what's going on...
float origscale, newscale;
float t2d, a2d;
float origscale, newscale;
float t2d, a2d;
mDC = (HDC)aContext;
mPrintDC = (HDC)aContext; // we are print dc...
#ifdef XP_OS2
// Create a print PS now. This is necessary 'cos we need it from
// odd places to do font-y things, where the only common reference
// point is this DC. We can't just create a new PS because only one
// PS can be associated with a given DC, and we can't get that PS from
// the DC (really?). And it would be slow :-)
SIZEL sizel = { 0 , 0 };
mPS = GpiCreatePS( 0/*hab*/, mDC, &sizel,
PU_PELS | GPIT_MICRO | GPIA_ASSOC);
#endif
// Create a print PS now. This is necessary 'cos we need it from
// odd places to do font-y things, where the only common reference
// point is this DC. We can't just create a new PS because only one
// PS can be associated with a given DC, and we can't get that PS from
// the DC (really?). And it would be slow :-)
SIZEL sizel = { 0 , 0 };
mPS = GpiCreatePS( 0/*hab*/, mPrintDC, &sizel,
PU_PELS | GPIT_MICRO | GPIA_ASSOC);
CommonInit( mDC);
CommonInit( mPrintDC);
GetTwipsToDevUnits( newscale);
aOrigContext->GetTwipsToDevUnits( origscale);
GetTwipsToDevUnits( newscale);
aOrigContext->GetTwipsToDevUnits( origscale);
mPixelScale = newscale / origscale;
mPixelScale = newscale / origscale;
aOrigContext->GetTwipsToDevUnits( t2d);
aOrigContext->GetAppUnitsToDevUnits( a2d);
aOrigContext->GetTwipsToDevUnits( t2d);
aOrigContext->GetAppUnitsToDevUnits( a2d);
mAppUnitsToDevUnits = (a2d / t2d) * mTwipsToPixels;
mDevUnitsToAppUnits = 1.0f / mAppUnitsToDevUnits;
mAppUnitsToDevUnits = (a2d / t2d) * mTwipsToPixels;
mDevUnitsToAppUnits = 1.0f / mAppUnitsToDevUnits;
#ifdef XP_OS2
HCINFO hcinfo;
PrnQueryHardcopyCaps( mDC, &hcinfo);
mWidth = hcinfo.xPels;
mHeight = hcinfo.yPels;
// XXX hsb says there are margin problems, must be from here...
printf( "Got surface of size %d x %d pixels\n", mWidth, mHeight);
printf( "mPixelScale = %f\n", mPixelScale);
HCINFO hcinfo;
PrnQueryHardcopyCaps( mPrintDC, &hcinfo);
mWidth = hcinfo.xPels;
mHeight = hcinfo.yPels;
// XXX hsb says there are margin problems, must be from here...
printf( "Got surface of size %d x %d pixels\n", mWidth, mHeight);
printf( "mPixelScale = %f\n", mPixelScale);
// We need to begin a document now, because the client is entitled at
// this point to do stuff like create fonts, which required the PS to
// be associated with a DC which has been DEVESC_STARTDOC'd.
BeginDocument();
#endif
// We need to begin a document now, because the client is entitled at
// this point to do stuff like create fonts, which required the PS to
// be associated with a DC which has been DEVESC_STARTDOC'd.
BeginDocument();
return NS_OK;
return NS_OK;
}
// XXXX Reduce to one call to DevQueryCaps???
void nsDeviceContextOS2::CommonInit( HDC aDC)
void nsDeviceContextOS2 :: CommonInit(HDC aDC)
{
// Record palette-potential of device even if it is >8bpp
long lCap = 0;
DevQueryCaps( aDC, CAPS_ADDITIONAL_GRAPHICS, 1, &lCap);
mPaletteInfo.isPaletteDevice = !!(lCap & CAPS_PALETTE_MANAGER);
LONG alArray[CAPS_DEVICE_POLYSET_POINTS];
// Work out the pels-to-twips conversion
DevQueryCaps( aDC, CAPS_VERTICAL_FONT_RES, 1, &lCap);
mTwipsToPixels = ((float) lCap) / (float)NSIntPointsToTwips(72);
mPixelsToTwips = 1.0f / mTwipsToPixels;
DevQueryCaps(aDC, CAPS_FAMILY, CAPS_DEVICE_POLYSET_POINTS, alArray);
// max palette size: level out at COLOR_CUBE_SIZE
// (or CAPS_COLORS ?)
DevQueryCaps( aDC, CAPS_PHYS_COLORS, 1, &lCap);
mPaletteInfo.sizePalette = (PRUint8) (min( lCap, COLOR_CUBE_SIZE));
mTwipsToPixels = ((float)alArray[CAPS_VERTICAL_FONT_RES]) / (float)NSIntPointsToTwips(72);
mPixelsToTwips = 1.0f / mTwipsToPixels;
// erm?
mPaletteInfo.numReserved = 0;
mDepth = alArray[CAPS_COLOR_BITCOUNT];
mPaletteInfo.isPaletteDevice = !!(alArray[CAPS_ADDITIONAL_GRAPHICS] & CAPS_PALETTE_MANAGER);
DevQueryCaps( aDC, CAPS_COLOR_BITCOUNT, 1, &lCap);
mDepth = lCap;
/* OS2TODO - pref to turn off palette management should set isPaletteDevice to false */
mClientRect.x = mClientRect.y = 0;
DevQueryCaps( aDC, CAPS_HORIZONTAL_RESOLUTION, 1, &lCap);
mClientRect.width = lCap;
DevQueryCaps( aDC, CAPS_VERTICAL_RESOLUTION, 1, &lCap);
mClientRect.height = lCap;
if (mPaletteInfo.isPaletteDevice)
mPaletteInfo.sizePalette = 256;
DevQueryCaps( aDC, CAPS_TECHNOLOGY, 1, &lCap);
if (lCap & CAPS_TECH_RASTER_DISPLAY) {
mClientRect.width = WinQuerySysValue(HWND_DESKTOP, SV_CXFULLSCREEN);
mClientRect.height = WinQuerySysValue(HWND_DESKTOP, SV_CYFULLSCREEN);
}
if (alArray[CAPS_COLORS] >= 20) {
mPaletteInfo.numReserved = 20;
} else {
mPaletteInfo.numReserved = alArray[CAPS_COLORS];
} /* endif */
DeviceContextImpl::CommonInit();
mWidth = alArray[CAPS_WIDTH];
mHeight = alArray[CAPS_HEIGHT];
if (alArray[CAPS_TECHNOLOGY] == CAPS_TECH_RASTER_DISPLAY)
{
// init the screen manager and compute our client rect based on the
// screen objects. We'll save the result
nsresult ignore;
mScreenManager = do_GetService("component://netscape/gfx/screenmanager", &ignore);
if ( !sNumberOfScreens )
mScreenManager->GetNumberOfScreens(&sNumberOfScreens);
} // if this dc is not a print device
DeviceContextImpl::CommonInit();
}
void
nsDeviceContextOS2::ComputeClientRectUsingScreen ( nsRect* outRect )
nsDeviceContextOS2 :: ComputeClientRectUsingScreen ( nsRect* outRect )
{
if ( !mCachedClientRect ) {
// convert to device units
outRect->y = NSToIntRound(mClientRect.y * mDevUnitsToAppUnits);
outRect->x = NSToIntRound(mClientRect.x * mDevUnitsToAppUnits);
outRect->width = NSToIntRound(mClientRect.width * mDevUnitsToAppUnits);
outRect->height = NSToIntRound(mClientRect.height * mDevUnitsToAppUnits);
nsCOMPtr<nsIScreen> screen;
FindScreen ( getter_AddRefs(screen) );
if ( screen ) {
PRInt32 x, y, width, height;
screen->GetAvailRect ( &x, &y, &width, &height );
// convert to device units
outRect->y = NSToIntRound(y * mDevUnitsToAppUnits);
outRect->x = NSToIntRound(x * mDevUnitsToAppUnits);
outRect->width = NSToIntRound(width * mDevUnitsToAppUnits);
outRect->height = NSToIntRound(height * mDevUnitsToAppUnits);
mCachedClientRect = PR_TRUE;
mClientRect = *outRect;
} // if we need to recompute the client rect
mCachedClientRect = PR_TRUE;
mClientRect = *outRect;
}
}
else
*outRect = mClientRect;
@ -235,60 +244,57 @@ nsDeviceContextOS2::ComputeClientRectUsingScreen ( nsRect* outRect )
void
nsDeviceContextOS2::ComputeFullAreaUsingScreen ( nsRect* outRect )
nsDeviceContextOS2 :: ComputeFullAreaUsingScreen ( nsRect* outRect )
{
outRect->y = 0;
outRect->x = 0;
outRect->width = NSToIntRound(mWidth * mDevUnitsToAppUnits);
outRect->height = NSToIntRound(mHeight * mDevUnitsToAppUnits);
if ( !mCachedFullRect ) {
nsCOMPtr<nsIScreen> screen;
FindScreen ( getter_AddRefs(screen) );
if ( screen ) {
PRInt32 x, y, width, height;
screen->GetRect ( &x, &y, &width, &height );
// convert to device units
outRect->y = NSToIntRound(y * mDevUnitsToAppUnits);
outRect->x = NSToIntRound(x * mDevUnitsToAppUnits);
outRect->width = NSToIntRound(width * mDevUnitsToAppUnits);
outRect->height = NSToIntRound(height * mDevUnitsToAppUnits);
mWidth = width;
mHeight = height;
mCachedFullRect = PR_TRUE;
}
}
else {
outRect->y = 0;
outRect->x = 0;
outRect->width = NSToIntRound(mWidth * mDevUnitsToAppUnits);
outRect->height = NSToIntRound(mHeight * mDevUnitsToAppUnits);
}
} // ComputeFullRectUsingScreen
// Creation of other gfx objects malarky -------------------------------------
nsresult nsDeviceContextOS2::GetDrawingSurface( nsIRenderingContext &aContext, nsDrawingSurface &aSurface)
//
// FindScreen
//
// Determines which screen intersects the largest area of the given surface.
//
void
nsDeviceContextOS2 :: FindScreen ( nsIScreen** outScreen )
{
if( !mSurface)
{
nsDrawingSurface tSurface;
aContext.CreateDrawingSurface( nsnull, 0, tSurface);
mSurface = (nsDrawingSurfaceOS2 *) tSurface;
NS_ADDREF(mSurface);
}
printf("Dodgy nsDeviceContext::GetDrawingContext() called\n");
aSurface = mSurface;
return NS_OK;
}
nsresult nsDeviceContextOS2::GetDeviceContextFor( nsIDeviceContextSpec *aDevice,
nsIDeviceContext *&aContext)
{
// Prolly want to clean this up xpCom-wise...
nsDeviceContextOS2 *newCX = new nsDeviceContextOS2;
nsDeviceContextSpecOS2 *spec = (nsDeviceContextSpecOS2*) aDevice;
if (!newCX)
return NS_ERROR_OUT_OF_MEMORY;
aContext = newCX;
NS_ADDREF(aContext);
PRTQUEUE *pq;
spec->GetPRTQUEUE( pq);
HDC hdcPrint = PrnOpenDC( pq, "Mozilla");
return newCX->Init( (nsNativeDeviceContext) hdcPrint, this);
}
// optimize for the case where we only have one monitor.
static nsCOMPtr<nsIScreen> sPrimaryScreen;
if ( !sPrimaryScreen && mScreenManager )
mScreenManager->GetPrimaryScreen ( getter_AddRefs(sPrimaryScreen) );
NS_IF_ADDREF(*outScreen = sPrimaryScreen.get());
return;
} // FindScreen
/* OS2TODO - NOT PORTED */
// Create a rendering context against our hdc for a printer
nsresult nsDeviceContextOS2::CreateRenderingContext( nsIRenderingContext *&aContext)
{
NS_ASSERTION( mPrintDC, "CreateRenderingContext for non-print DC");
NS_ASSERTION( mDC, "CreateRenderingContext for non-print DC");
nsIRenderingContext *pContext = new nsRenderingContextOS2;
if (!pContext)
@ -315,40 +321,26 @@ nsresult nsDeviceContextOS2::CreateRenderingContext( nsIRenderingContext *&aCont
return rc;
}
HPS nsDeviceContextOS2::GetRepresentativePS() const
NS_IMETHODIMP nsDeviceContextOS2 :: SupportsNativeWidgets(PRBool &aSupportsWidgets)
{
HPS hps;
if (nsnull == mDC)
aSupportsWidgets = PR_TRUE;
else
aSupportsWidgets = PR_FALSE;
if( mPrintDC == 0)
{
HWND hwnd = mWidget ? (HWND)mWidget : HWND_DESKTOP;
hps = WinGetPS( hwnd);
}
else
hps = mPS;
return hps;
return NS_OK;
}
void nsDeviceContextOS2::ReleaseRepresentativePS( HPS aPS)
NS_IMETHODIMP nsDeviceContextOS2 :: GetCanonicalPixelScale(float &aScale) const
{
if( mPrintDC == 0)
if( !WinReleasePS( aPS))
PMERROR( "WinReleasePS (DC)");
else
/* nop */ ;
aScale = mPixelScale;
return NS_OK;
}
// Metrics -------------------------------------------------------------------
// Note that this returns values in app units, as opposed to GetSystemAttr(),
// which uses device units.
nsresult nsDeviceContextOS2::GetScrollBarDimensions( float &aWidth, float &aHeight) const
NS_IMETHODIMP nsDeviceContextOS2 :: GetScrollBarDimensions(float &aWidth, float &aHeight) const
{
aWidth = (float) WinQuerySysValue( HWND_DESKTOP, SV_CXVSCROLL) *
mDevUnitsToAppUnits;
aHeight = (float) WinQuerySysValue( HWND_DESKTOP, SV_CYHSCROLL) *
mDevUnitsToAppUnits;
aWidth = ::WinQuerySysValue( HWND_DESKTOP, SV_CXVSCROLL) * mDevUnitsToAppUnits;
aHeight = ::WinQuerySysValue( HWND_DESKTOP, SV_CYHSCROLL) * mDevUnitsToAppUnits;
return NS_OK;
}
@ -554,10 +546,161 @@ NS_IMETHODIMP nsDeviceContextOS2 :: GetSystemAttribute(nsSystemAttrID anID, Syst
return NS_OK;
}
//
// (XXX) the screen object thinks these are in pels, duh. (jmf)
//
nsresult nsDeviceContextOS2::GetDeviceSurfaceDimensions( PRInt32 &aWidth, PRInt32 &aHeight)
nsresult nsDeviceContextOS2::GetDrawingSurface( nsIRenderingContext &aContext, nsDrawingSurface &aSurface)
{
if (NULL == mSurface) {
aContext.CreateDrawingSurface(nsnull, 0, mSurface);
}
aSurface = mSurface;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextOS2 :: CheckFontExistence(const nsString& aFontName)
{
HWND hwnd = (HWND)mWidget;
HPS hps = ::WinGetPS(hwnd);
PRBool isthere = PR_FALSE;
char fontName[FACESIZE];
aFontName.ToCString( fontName, FACESIZE);
long lWant = 0;
long lFonts = GpiQueryFonts( hps, QF_PUBLIC | QF_PRIVATE,
fontName, &lWant, 0, 0);
::WinReleasePS(hps);
if (lFonts > 0)
return NS_OK;
else
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP nsDeviceContextOS2::GetDepth(PRUint32& aDepth)
{
aDepth = mDepth;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextOS2::GetILColorSpace(IL_ColorSpace*& aColorSpace)
{
if (nsnull == mColorSpace) {
// See if we're dealing with an 8-bit palette device
if (8 == mDepth) {
// 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 + 10);
#else
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;
}
NS_IMETHODIMP nsDeviceContextOS2::GetPaletteInfo(nsPaletteInfo& aPaletteInfo)
{
aPaletteInfo.isPaletteDevice = mPaletteInfo.isPaletteDevice;
aPaletteInfo.numReserved = mPaletteInfo.numReserved;
if (NULL == mPaletteInfo.palette) {
IL_ColorSpace* colorSpace;
GetILColorSpace(colorSpace);
if (NI_PseudoColor == colorSpace->type) {
// Create a logical palette
#ifdef XP_OS2
PULONG aulTable;
ULONG ulCount = COLOR_CUBE_SIZE;
aulTable = (PULONG)malloc(ulCount*sizeof(ULONG));
#else
ULONG aulTable[COLOR_CUBE_SIZE+20];
ULONG ulCount = COLOR_CUBE_SIZE + 20;
#endif
#ifndef XP_OS2
// First ten system colors
::GetPaletteEntries(hDefaultPalette, 0, 10, logPal->palPalEntry);
// Last ten system colors
::GetPaletteEntries(hDefaultPalette, 10, 10, &logPal->palPalEntry[COLOR_CUBE_SIZE + 10]);
#endif
// Now set the color cube entries.
#ifdef XP_OS2
NI_RGB* map = colorSpace->cmap.map;
#else
NI_RGB* map = colorSpace->cmap.map + 10;
#endif
#ifdef XP_OS2
for (PRInt32 i = 0; i < COLOR_CUBE_SIZE; i++, map++) {
#else
for (PRInt32 i = 10; i < COLOR_CUBE_SIZE; i++, map++) {
#endif
aulTable[i] = MK_RGB( map->red, map->green, map->blue);
}
if (mPaletteInfo.isPaletteDevice) {
// Create a GPI palette
mPaletteInfo.palette = (void*)::GpiCreatePalette( (HAB)0, NULL, LCOLF_CONSECRGB, ulCount, aulTable );
free(aulTable);
} else {
mPaletteInfo.palette = (void*)aulTable;
mPaletteInfo.sizePalette = ulCount;
}
}
IL_ReleaseColorSpace(colorSpace);
}
aPaletteInfo.palette = mPaletteInfo.palette;
aPaletteInfo.sizePalette = mPaletteInfo.sizePalette;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextOS2 :: ConvertPixel(nscolor aColor, PRUint32 & aPixel)
{
aPixel = aColor;
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextOS2 :: GetDeviceSurfaceDimensions(PRInt32 &aWidth, PRInt32 &aHeight)
{
if ( mSpec )
{
@ -575,7 +718,7 @@ nsresult nsDeviceContextOS2::GetDeviceSurfaceDimensions( PRInt32 &aWidth, PRInt3
return NS_OK;
}
NS_IMETHODIMP nsDeviceContextOS2::GetRect(nsRect &aRect)
NS_IMETHODIMP nsDeviceContextOS2 :: GetRect(nsRect &aRect)
{
if ( mSpec )
{
@ -591,7 +734,8 @@ NS_IMETHODIMP nsDeviceContextOS2::GetRect(nsRect &aRect)
return NS_OK;
}
nsresult nsDeviceContextOS2::GetClientRect(nsRect &aRect)
NS_IMETHODIMP nsDeviceContextOS2 :: GetClientRect(nsRect &aRect)
{
if ( mSpec )
{
@ -607,46 +751,23 @@ nsresult nsDeviceContextOS2::GetClientRect(nsRect &aRect)
return NS_OK;
}
nsresult nsDeviceContextOS2::GetDepth( PRUint32& aDepth)
NS_IMETHODIMP nsDeviceContextOS2 :: GetDeviceContextFor(nsIDeviceContextSpec *aDevice,
nsIDeviceContext *&aContext)
{
aDepth = mDepth;
return NS_OK;
PRTQUEUE *pq;
aContext = new nsDeviceContextOS2();
((nsDeviceContextOS2 *)aContext)->mSpec = aDevice;
NS_ADDREF(aDevice);
((nsDeviceContextSpecOS2 *)aDevice)->GetPRTQUEUE(pq);
HDC dc = PrnOpenDC(pq, "Mozilla");
return ((nsDeviceContextOS2 *)aContext)->Init((nsNativeDeviceContext)dc, this);
}
// Yuck...
nsresult nsDeviceContextOS2::SupportsNativeWidgets( PRBool &aSupportsWidgets)
{
aSupportsWidgets = (mPrintDC == 0) ? PR_TRUE : PR_FALSE;
return NS_OK;
}
nsresult nsDeviceContextOS2::GetCanonicalPixelScale( float &aScale) const
{
aScale = mPixelScale;
return NS_OK;
}
// Fonts ---------------------------------------------------------------------
// Rather unfortunate place for this method...
nsresult nsDeviceContextOS2::CheckFontExistence( const nsString &aFontName)
{
HPS hps = GetRepresentativePS();
char fontName[ FACESIZE];
aFontName.ToCString( fontName, FACESIZE);
long lWant = 0;
long lFonts = GpiQueryFonts( hps, QF_PUBLIC | QF_PRIVATE,
fontName, &lWant, 0, 0);
ReleaseRepresentativePS( hps);
return lFonts > 0 ? NS_OK : NS_ERROR_FAILURE;
}
// Font setup - defaults aren't terribly helpful; this may be no better!
nsresult nsDeviceContextOS2::CreateFontAliasTable()
{
nsresult result = NS_OK;
@ -683,105 +804,13 @@ nsresult nsDeviceContextOS2::CreateFontAliasTable()
return result;
}
// Colourspaces and palettes -------------------------------------------------
// Override these so we can use palette manager
nsresult nsDeviceContextOS2::GetILColorSpace( IL_ColorSpace *&aColorSpace)
{
if( !mColorSpace)
{
// !! Might want to do something funky for 4bpp displays
// See if we're dealing with an 8-bit palette device
if( (8 == mDepth) && mPaletteInfo.isPaletteDevice)
{
IL_ColorMap *cMap = IL_NewCubeColorMap( 0, 0, COLOR_CUBE_SIZE);
if( !cMap)
return NS_ERROR_OUT_OF_MEMORY;
// Create a pseudo color space
mColorSpace = IL_CreatePseudoColorSpace( cMap, 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( !mColorSpace)
{
aColorSpace = nsnull;
return NS_ERROR_OUT_OF_MEMORY;
}
}
// Return the color space
aColorSpace = mColorSpace;
IL_AddRefToColorSpace( aColorSpace);
return NS_OK;
}
nsresult nsDeviceContextOS2::GetPaletteInfo( nsPaletteInfo& aPaletteInfo)
{
aPaletteInfo.isPaletteDevice = mPaletteInfo.isPaletteDevice;
aPaletteInfo.sizePalette = mPaletteInfo.sizePalette;
aPaletteInfo.numReserved = mPaletteInfo.numReserved;
nsresult rc = NS_OK;
SetupColorMaps();
aPaletteInfo.palette = mPaletteInfo.palette;
return rc;
}
nsresult nsDeviceContextOS2::GetPalette( nsIPaletteOS2 *&aPalette)
{
nsresult rc = SetupColorMaps();
aPalette = mPalette;
NS_ADDREF( aPalette);
return rc;
}
nsresult nsDeviceContextOS2::SetupColorMaps()
{
nsresult rc = NS_OK;
if( !mPalette)
{
// Share a single palette between all screen instances; printers need
// a separate palette for compatability reasons.
if( mPrintDC) rc = NS_CreatePalette( this, mPalette);
else mPalette = gModuleData.GetUIPalette( this);
if( rc == NS_OK)
rc = mPalette->GetNSPalette( mPaletteInfo.palette);
}
return rc;
}
NS_IMETHODIMP nsDeviceContextOS2::ConvertPixel(nscolor aColor, PRUint32 & aPixel)
{
printf( "Alert: nsDeviceContext::ConvertPixel called\n");
aPixel = aColor;
return NS_OK;
}
// Printing ------------------------------------------------------------------
nsresult nsDeviceContextOS2::BeginDocument()
{
NS_ASSERTION(mPrintDC, "BeginDocument for non-print DC");
NS_ASSERTION(mDC, "BeginDocument for non-print DC");
if( mPrintState == nsPrintState_ePreBeginDoc)
{
PrnStartJob( mPrintDC, "Warpzilla NGLayout job");
PrnStartJob( mDC, "Warpzilla NGLayout job");
printf( "BeginDoc\n");
mPrintState = nsPrintState_eBegunDoc;
}
@ -790,7 +819,7 @@ nsresult nsDeviceContextOS2::BeginDocument()
nsresult nsDeviceContextOS2::EndDocument()
{
PrnEndJob( mPrintDC);
PrnEndJob( mDC);
mPrintState = nsPrintState_ePreBeginDoc;
printf("EndDoc\n");
return NS_OK;
@ -802,7 +831,7 @@ nsresult nsDeviceContextOS2::BeginPage()
mPrintState = nsPrintState_eBegunFirstPage;
else
{
PrnNewPage( mPrintDC);
PrnNewPage( mDC);
printf("NewPage");
}
return NS_OK;
@ -816,7 +845,7 @@ nsresult nsDeviceContextOS2::EndPage()
BOOL nsDeviceContextOS2::isPrintDC()
{
if ( mPrintDC == nsnull )
if ( mDC == nsnull )
return 0;
else

View File

@ -1,147 +1,123 @@
/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* The Original Code is the Mozilla OS/2 libraries.
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Initial Developer of the Original Code is John Fairhurst,
* <john_fairhurst@iname.com>. Portions created by John Fairhurst are
* Copyright (C) 1999 John Fairhurst. All Rights Reserved.
* The Original Code is mozilla.org code.
*
* Contributor(s):
* This Original Code has been modified by IBM Corporation.
* Modifications made by IBM described herein are
* Copyright (c) International Business Machines
* Corporation, 2000
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Modifications to Mozilla code or documentation
* identified per MPL Section 3.3
*
* Date Modified by Description of modification
* ---- ----------- ---------------------------
* 03/28/2000 IBM Corp. Changes to make os2.h file similar to windows.h file
* 05/31/2000 IBM Corp. Print changes.
* 06/07/2000 IBM Corp. Corrected querying of screen and client sizes
* Contributor(s):
*/
#ifndef _nsDeviceContextOS2_h
#define _nsDeviceContextOS2_h
#ifndef nsDeviceContextOS2_h___
#define nsDeviceContextOS2_h___
#include "nsDeviceContext.h"
#include "nsRenderingContextOS2.h"
#include "nsIScreenManager.h"
#define INCL_GPI
#define INCL_PM
#define INCL_DOS
#include <os2.h>
#include "libprint.h"
// Device contexts are either for windows or for printers.
// If the former, the DeviceContextImpl member mWidget is set.
// If the latter, the mPrintDC member here is set.
// (yes, I know: eventually want to split these guys up)
class nsIPaletteOS2;
class nsDrawingSurfaceOS2;
class nsIScreen;
class nsDeviceContextOS2 : public DeviceContextImpl
{
public:
nsDeviceContextOS2();
nsDeviceContextOS2();
NS_IMETHOD Init( nsNativeWidget aWidget);
NS_IMETHOD Init(nsNativeWidget aWidget);
NS_IMETHOD CreateRenderingContext( nsIRenderingContext *&aContext);
NS_IMETHOD CreateRenderingContext(nsIRenderingContext *&aContext);
NS_IMETHOD SupportsNativeWidgets( PRBool &aSupportsWidgets);
NS_IMETHOD SupportsNativeWidgets(PRBool &aSupportsWidgets);
NS_IMETHOD GetCanonicalPixelScale( float &aScale) const;
NS_IMETHOD GetCanonicalPixelScale(float &aScale) const;
NS_IMETHOD GetScrollBarDimensions( float &aWidth, float &aHeight) const;
NS_IMETHOD GetSystemAttribute( nsSystemAttrID anID, SystemAttrStruct *aInfo) const;
NS_IMETHOD GetScrollBarDimensions(float &aWidth, float &aHeight) const;
NS_IMETHOD GetSystemAttribute(nsSystemAttrID anID, SystemAttrStruct * aInfo) const;
// get a low level drawing surface for rendering. the rendering context
// that is passed in is used to create the drawing surface if there isn't
// already one in the device context. the drawing surface is then cached
// in the device context for re-use.
NS_IMETHOD GetDrawingSurface( nsIRenderingContext &aContext, nsDrawingSurface &aSurface);
//get a low level drawing surface for rendering. the rendering context
//that is passed in is used to create the drawing surface if there isn't
//already one in the device context. the drawing surface is then cached
//in the device context for re-use.
NS_IMETHOD GetDrawingSurface(nsIRenderingContext &aContext, nsDrawingSurface &aSurface);
NS_IMETHOD CheckFontExistence( const nsString &aFontName);
NS_IMETHOD CheckFontExistence(const nsString& aFontName);
NS_IMETHOD GetDepth( PRUint32 &aDepth);
NS_IMETHOD GetDepth(PRUint32& aDepth);
NS_IMETHOD GetILColorSpace( IL_ColorSpace*& aColorSpace);
NS_IMETHOD GetILColorSpace(IL_ColorSpace*& aColorSpace);
NS_IMETHOD GetPaletteInfo( nsPaletteInfo &);
NS_IMETHOD GetPaletteInfo(nsPaletteInfo&);
NS_IMETHOD ConvertPixel( nscolor aColor, PRUint32 & aPixel);
NS_IMETHOD ConvertPixel(nscolor aColor, PRUint32 & aPixel);
NS_IMETHOD GetDeviceSurfaceDimensions( PRInt32 &aWidth, PRInt32 &aHeight);
NS_IMETHOD GetDeviceSurfaceDimensions(PRInt32 &aWidth, PRInt32 &aHeight);
NS_IMETHOD GetRect(nsRect &aRect);
NS_IMETHOD GetClientRect(nsRect &aRect);
NS_IMETHOD GetRect(nsRect &aRect);
NS_IMETHOD GetDeviceContextFor(nsIDeviceContextSpec *aDevice,
nsIDeviceContext *&aContext);
NS_IMETHOD GetClientRect(nsRect &aRect);
NS_IMETHOD BeginDocument(void);
NS_IMETHOD EndDocument(void);
NS_IMETHOD GetDeviceContextFor( nsIDeviceContextSpec *aDevice,
nsIDeviceContext *&aContext);
NS_IMETHOD BeginPage(void);
NS_IMETHOD EndPage(void);
NS_IMETHOD BeginDocument(void);
NS_IMETHOD EndDocument(void);
protected:
virtual ~nsDeviceContextOS2();
void CommonInit(HDC aDC);
nsresult Init(nsNativeDeviceContext aContext, nsIDeviceContext *aOrigContext);
void FindScreen ( nsIScreen** outScreen ) ;
void ComputeClientRectUsingScreen ( nsRect* outRect ) ;
void ComputeFullAreaUsingScreen ( nsRect* outRect ) ;
NS_IMETHOD BeginPage(void);
NS_IMETHOD EndPage(void);
PRBool mCachedClientRect;
PRBool mCachedFullRect;
// XXXX Copped from GTK version to remove warning about hidden virtual; nothing in Windows
NS_IMETHOD CreateRenderingContext(nsIView *aView, nsIRenderingContext *&aContext) {return (DeviceContextImpl::CreateRenderingContext(aView,aContext));}
NS_IMETHOD CreateRenderingContext(nsIWidget *aWidget, nsIRenderingContext *&aContext) {return (DeviceContextImpl::CreateRenderingContext(aWidget,aContext));}
nsDrawingSurface mSurface;
PRUint32 mDepth; // bit depth of device
nsPaletteInfo mPaletteInfo;
float mPixelScale;
PRInt32 mWidth;
PRInt32 mHeight;
nsRect mClientRect;
nsIDeviceContextSpec *mSpec;
// OS2 specific methods
public:
// Call to ensure colour table/palette is loaded and ready.
nsresult SetupColorMaps();
// Get the palette object for the device, used to pick colours.
// Release when done.
nsresult GetPalette( nsIPaletteOS2 *&apalette);
// Init from a HDC for printing purposes
void CommonInit(HDC aDC);
nsresult Init( nsNativeDeviceContext aContext, nsIDeviceContext *aOrigContext);
nsCOMPtr<nsIScreenManager> mScreenManager;
static PRUint32 sNumberOfScreens;
// Needed by the fontmetrics - can't rely on having a widget.
HPS GetRepresentativePS() const;
void ReleaseRepresentativePS( HPS aPS);
BOOL isPrintDC();
public:
HDC mDC;
HPS mPS;
protected:
virtual ~nsDeviceContextOS2();
static PRBool gRound;
static int PrefChanged(const char* aPref, void* aClosure);
virtual nsresult CreateFontAliasTable();
enum nsPrintState
{
nsPrintState_ePreBeginDoc,
nsPrintState_eBegunDoc,
nsPrintState_eBegunFirstPage,
nsPrintState_eEndedDoc
} mPrintState;
void ComputeClientRectUsingScreen ( nsRect* outRect ) ;
void ComputeFullAreaUsingScreen ( nsRect* outRect ) ;
PRBool mCachedClientRect;
PRBool mCachedFullRect;
nsDrawingSurfaceOS2 *mSurface;
PRUint32 mDepth; // bit depth of device
nsPaletteInfo mPaletteInfo;
float mPixelScale;
nsIPaletteOS2 *mPalette;
PRInt32 mWidth;
PRInt32 mHeight;
nsRect mClientRect;
nsIDeviceContextSpec *mSpec;
HDC mPrintDC; // PrintDC. Owned by libprint.
HPS mPS; // PrintPS.
enum nsPrintState
{
nsPrintState_ePreBeginDoc,
nsPrintState_eBegunDoc,
nsPrintState_eBegunFirstPage,
nsPrintState_eEndedDoc
} mPrintState;
BOOL isPrintDC();
nsresult nsDeviceContextOS2::CreateFontAliasTable();
};
#endif /* nsDeviceContextOS2_h__ */
#endif /* nsDeviceContextOS2_h___ */

View File

@ -25,7 +25,6 @@
#include "nsIWidget.h"
#include "nsDrawingSurfaceOS2.h"
#include "nsFontMetricsOS2.h"
#include "nsPaletteOS2.h"
// Base class -- fonts, palette and xpcom -----------------------------------
@ -35,7 +34,7 @@ NS_IMPL_ISUPPORTS(nsDrawingSurfaceOS2, NS_GET_IID(nsIDrawingSurface))
// do testing with, and 0 is, of course, LCID_DEFAULT.
nsDrawingSurfaceOS2::nsDrawingSurfaceOS2()
: mNextID(2), mTopID(1), mPalette(0), mPS(0)
: mNextID(2), mTopID(1), mPS(0)
{
NS_INIT_REFCNT();
mHTFonts = new nsHashtable;
@ -43,8 +42,6 @@ nsDrawingSurfaceOS2::nsDrawingSurfaceOS2()
nsDrawingSurfaceOS2::~nsDrawingSurfaceOS2()
{
// release palette; no harm if it's already been done by a subclass
DeselectPalette();
DisposeFonts();
}
@ -99,23 +96,6 @@ void nsDrawingSurfaceOS2::FlushFontCache()
// leave mTopID where it is.
}
// Palette
void nsDrawingSurfaceOS2::SetPalette( nsIPaletteOS2 *aPalette)
{
NS_IF_RELEASE(mPalette);
mPalette = aPalette;
NS_ADDREF(mPalette);
}
void nsDrawingSurfaceOS2::DeselectPalette()
{
if( mPalette)
{
mPalette->Deselect( mPS);
NS_RELEASE(mPalette); // this nulls out mPalette
}
}
// yuck.
nsresult nsDrawingSurfaceOS2::GetBitmap( HBITMAP &aBitmap)
{
@ -203,7 +183,6 @@ nsOffscreenSurface::~nsOffscreenSurface()
PMERROR( "GpiSetBitmap");
if( !GpiDeleteBitmap( mBitmap))
PMERROR( "GpiDeleteBitmap");
DeselectPalette();
//
// Don't need to do this because the PS is a micro-one.
//

View File

@ -35,7 +35,6 @@
class nsHashtable;
class nsIWidget;
class nsIPaletteOS2;
// These were called `drawables' in os2fe.
//
@ -55,7 +54,6 @@ class nsDrawingSurfaceOS2 : public nsIDrawingSurface
nsHashtable *mHTFonts; // cache of fonthandle to lcid
long mNextID; // next lcid to allocate
long mTopID; // highest used lcid
nsIPaletteOS2 *mPalette; // palette
public:
nsDrawingSurfaceOS2();
@ -71,13 +69,10 @@ class nsDrawingSurfaceOS2 : public nsIDrawingSurface
void SelectFont( nsIFontMetrics *metrics);
void FlushFontCache();
void SetPalette( nsIPaletteOS2 *aPalette);
NS_IMETHOD GetBitmap( HBITMAP &aBitmap); // yuck (for blender, may go)
NS_IMETHOD RequiresInvertedMask( PRBool *aBool); // double yuck (images)
protected:
void DeselectPalette();
void DisposeFonts(); // MUST be called before disposing of PS
};

View File

@ -37,7 +37,6 @@
void PMERROR(const char *str);
class nsString;
class nsIPaletteOS2;
class nsIDeviceContext;
// Module data
@ -67,12 +66,6 @@ struct nsGfxModuleData
// XXX XXX XXX end hack
void Init();
// This addref's
nsIPaletteOS2 *GetUIPalette( nsIDeviceContext *aContext);
protected:
nsIPaletteOS2 *uiPalette;
};
extern nsGfxModuleData gModuleData;

View File

@ -43,7 +43,6 @@
#include "nsDeviceContextOS2.h"
#include "nsRegionOS2.h"
#include "nsBlender.h"
#include "nsPaletteOS2.h"
#include "nsDeviceContextSpecOS2.h"
#include "nsDeviceContextSpecFactoryO.h"
//#include "nsScriptableRegion.h"
@ -285,7 +284,7 @@ void PMERROR( const char *api)
}
nsGfxModuleData::nsGfxModuleData() : hModResources(0), hpsScreen(0),
lDisplayDepth(0), uiPalette(0)
lDisplayDepth(0)
{}
void nsGfxModuleData::Init()
@ -336,18 +335,6 @@ nsGfxModuleData::~nsGfxModuleData()
if( hModResources)
DosFreeModule( hModResources);
WinReleasePS( hpsScreen);
NS_IF_RELEASE(uiPalette);
}
nsIPaletteOS2 *nsGfxModuleData::GetUIPalette( nsIDeviceContext *aContext)
{
if( !uiPalette)
NS_CreatePalette( aContext, uiPalette);
NS_ADDREF(uiPalette);
return uiPalette;
}
nsGfxModuleData gModuleData;

View File

@ -46,7 +46,6 @@
#include "nsFontMetricsOS2.h"
#include "nsIFontMetrics.h"
#include "nsTransform2D.h"
#include "nsPaletteOS2.h"
#include "nsRegionOS2.h"
#include "nsGfxCIID.h"
#include "nsString.h"
@ -215,7 +214,6 @@ nsRenderingContextOS2::nsRenderingContextOS2()
NS_INIT_REFCNT();
mContext = nsnull;
mPalette = nsnull;
mSurface = nsnull;
mFrontSurface = nsnull;
mColor = NS_RGB( 0, 0, 0);
@ -254,7 +252,6 @@ nsRenderingContextOS2::~nsRenderingContextOS2()
// Release surfaces and the palette
NS_IF_RELEASE(mFrontSurface);
NS_IF_RELEASE(mSurface);
NS_IF_RELEASE(mPalette);
NS_IF_RELEASE(mFontMetrics);
}
@ -277,10 +274,14 @@ nsresult nsRenderingContextOS2::Init( nsIDeviceContext *aContext,
mSurface = surf;
NS_ADDREF(mSurface);
mDCOwner = aWindow;
// Grab another reference to the onscreen for later uniformity
mFrontSurface = mSurface;
NS_ADDREF(mFrontSurface);
mContext->GetGammaTable(mGammaTable);
return CommonInit();
}
@ -309,11 +310,29 @@ nsresult nsRenderingContextOS2::CommonInit()
mTMatrix.AddScale( app2dev, app2dev);
mContext->GetDevUnitsToAppUnits( mP2T);
((nsDeviceContextOS2 *) mContext)->GetPalette( mPalette);
// If this is a palette device, then select and realize the palette
nsPaletteInfo palInfo;
mContext->GetPaletteInfo(palInfo);
mPalette->Select( mSurface->mPS, mContext);
mSurface->SetPalette( mPalette);
return NS_OK;
if (palInfo.isPaletteDevice && palInfo.palette)
{
ULONG cclr;
// Select the palette in the background
::GpiSelectPalette(mSurface->mPS, (HPAL)palInfo.palette);
::WinRealizePalette((HWND)mDCOwner->GetNativeData(NS_NATIVE_WINDOW),mSurface->mPS, &cclr);
} else if (!palInfo.isPaletteDevice && palInfo.palette) {
GpiCreateLogColorTable( mSurface->mPS, LCOL_RESET | LCOL_PURECOLOR,
LCOLF_CONSECRGB, 0,
palInfo.sizePalette, (PLONG) palInfo.palette);
free(palInfo.palette);
palInfo.palette = nsnull;
}
else
{
GpiCreateLogColorTable( mSurface->mPS, LCOL_PURECOLOR,
LCOLF_RGB, 0, 0, 0);
}
return NS_OK;
}
// PS & drawing surface management -----------------------------------------
@ -326,8 +345,28 @@ nsresult nsRenderingContextOS2::SelectOffScreenDrawingSurface( nsDrawingSurface
{
NS_IF_RELEASE(mSurface);
mSurface = (nsDrawingSurfaceOS2 *) aSurface;
mPalette->Select( mSurface->mPS, mContext);
mSurface->SetPalette( mPalette);
// If this is a palette device, then select and realize the palette
nsPaletteInfo palInfo;
mContext->GetPaletteInfo(palInfo);
if (palInfo.isPaletteDevice && palInfo.palette)
{
ULONG cclr;
// Select the palette in the background
::GpiSelectPalette(mSurface->mPS, (HPAL)palInfo.palette);
::WinRealizePalette((HWND)mDCOwner->GetNativeData(NS_NATIVE_WINDOW),mSurface->mPS, &cclr);
} else if (!palInfo.isPaletteDevice && palInfo.palette) {
GpiCreateLogColorTable( mSurface->mPS, LCOL_RESET | LCOL_PURECOLOR,
LCOLF_CONSECRGB, 0,
palInfo.sizePalette, (PLONG) palInfo.palette);
free(palInfo.palette);
palInfo.palette = nsnull;
}
else
{
GpiCreateLogColorTable( mSurface->mPS, LCOL_PURECOLOR,
LCOLF_RGB, 0, 0, 0);
}
}
else // deselect current offscreen...
{
@ -832,7 +871,10 @@ void nsRenderingContextOS2::SetupDrawingColor( BOOL bForce)
LINEBUNDLE lineBundle;
long lColor = mPalette->GetGPIColor( mContext, mSurface->mPS, mColor);
long gcolor = MK_RGB( mGammaTable[NS_GET_R(mColor)],
mGammaTable[NS_GET_G(mColor)],
mGammaTable[NS_GET_B(mColor)]);
long lColor = GpiQueryColorIndex( mSurface->mPS, 0, gcolor);
long lLineFlags = LBB_COLOR;
long lAreaFlags = ABB_COLOR;
@ -841,21 +883,6 @@ void nsRenderingContextOS2::SetupDrawingColor( BOOL bForce)
lineBundle.lColor = lColor;
if ( (((nsDeviceContextOS2 *) mContext)->isPrintDC() ) == 1)
{
areaBundle.lBackColor = 0x00FFFFFF; //OS2TODO
lineBundle.lBackColor = 0x00FFFFFF;
areaBundle.usMixMode = FM_LEAVEALONE;
areaBundle.usBackMixMode = BM_LEAVEALONE;
lLineFlags = lLineFlags | LBB_BACK_COLOR ;
lAreaFlags = lAreaFlags | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE;
}
GpiSetAttrs( mSurface->mPS, PRIM_LINE,lLineFlags, 0, (PBUNDLE)&lineBundle);
GpiSetAttrs( mSurface->mPS, PRIM_AREA,lAreaFlags, 0, (PBUNDLE)&areaBundle);
@ -897,7 +924,10 @@ void nsRenderingContextOS2::SetupFontAndColor( BOOL bForce)
CHARBUNDLE cBundle;
cBundle.lColor = mPalette->GetGPIColor( mContext, mSurface->mPS, mColor);
long gcolor = MK_RGB( mGammaTable[NS_GET_R(mColor)],
mGammaTable[NS_GET_G(mColor)],
mGammaTable[NS_GET_B(mColor)]);
cBundle.lColor = GpiQueryColorIndex( mSurface->mPS, 0, gcolor);
cBundle.usMixMode = FM_OVERPAINT;

View File

@ -29,6 +29,7 @@
#define _nsRenderingContextOS2_h
#include "nsIRenderingContext.h"
#include "nsFont.h"
#include "nsCRT.h"
#include "nsTransform2D.h"
#include "nscoord.h"
@ -38,11 +39,9 @@
class nsIDeviceContext;
class nsIFontMetrics;
class nsIPaletteOS2;
class nsString;
class nsIWidget;
class nsPoint;
class nsFont;
class nsRect;
class GraphicsState;
@ -238,7 +237,6 @@ protected:
#endif
nsIDeviceContext *mContext; // device context
nsIPaletteOS2 *mPalette; // palette from the dc
nsDrawingSurfaceOS2 *mSurface; // draw things here
nsDrawingSurfaceOS2 *mFrontSurface; // if offscreen, this is onscreen
nscolor mColor; // current colour
@ -249,9 +247,12 @@ protected:
nsIFontMetrics *mFontMetrics; // current font
nsIFontMetrics *mCurrFontMetrics; // currently selected font
nscolor mCurrDrawingColor;// currently selected drawing color
PRUint8 *mGammaTable;
nscolor mCurrTextColor; // currently selected text color
nsLineStyle mCurrLineStyle; // currently selected line style
HDC mDC;
nsIWidget *mDCOwner;
};
inline void nsRenderingContextOS2::GetTargetHeight( PRUint32 &ht)