Implement SelectPalette and RealizePalette in mfdrv
Warren_Baird at cimmetry.com
Warren_Baird at cimmetry.com
Thu Feb 6 08:39:12 CST 2003
ChangeLog:
Implementation of SelectPalette and RealizePalette
in Metafile driver.
Warren Baird : Warren_Baird at cimmetry.com
Dave Belanger
diff -ur clean/wine/dlls/gdi/mfdrv/objects.c wine/dlls/gdi/mfdrv/objects.c
--- clean/wine/dlls/gdi/mfdrv/objects.c Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/objects.c Fri Jan 31 12:32:31 2003
@@ -234,3 +234,89 @@
if (MFDRV_CreatePenIndirect( dev, hpen, &logpen )) return hpen;
return 0;
}
+
+
+/******************************************************************
+ * MFDRV_CreatePalette
+ */
+static BOOL MFDRV_CreatePalette(PHYSDEV dev, HPALETTE hPalette, LOGPALETTE*
logPalette, int sizeofPalette)
+{
+ int index;
+ char buffer[sizeof(METARECORD) + sizeofPalette - sizeof(WORD)];
+ METARECORD *mr = (METARECORD *)&buffer;
+
+ mr->rdSize = (sizeof(METARECORD) + sizeofPalette - sizeof(WORD)) /
sizeof(WORD);
+ mr->rdFunction = META_CREATEPALETTE;
+ memcpy(&(mr->rdParm), logPalette, sizeofPalette);
+ if (!(MFDRV_WriteRecord( dev, mr, mr->rdSize * sizeof(WORD)))) return
FALSE;
+
+ mr->rdSize = sizeof(METARECORD) / sizeof(WORD);
+ mr->rdFunction = META_SELECTPALETTE;
+
+ if ((index = MFDRV_AddHandleDC( dev )) == -1) return FALSE;
+ *(mr->rdParm) = index;
+ return MFDRV_WriteRecord( dev, mr, mr->rdSize * sizeof(WORD));
+}
+
+
+/***********************************************************************
+ * MFDRV_SelectPalette
+ */
+HPALETTE MFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPalette, BOOL
bForceBackground )
+{
+#define PALVERSION 0x0300
+
+ PLOGPALETTE logPalette = NULL;
+ WORD wNumEntries = 0;
+ BOOL creationSucceed = FALSE;
+ int sizeofPalette;
+
+ GetObjectA(hPalette, sizeof(WORD), (LPSTR) &wNumEntries);
+
+ if (wNumEntries == 0) {
+ return 0;
+ }
+
+ sizeofPalette = sizeof(LOGPALETTE) + ((wNumEntries-1) *
sizeof(PALETTEENTRY));
+ logPalette = (LPLOGPALETTE)malloc(sizeofPalette);
+
+ if (logPalette == NULL) {
+ return 0;
+ }
+
+ logPalette->palVersion = PALVERSION;
+ logPalette->palNumEntries = wNumEntries;
+
+ GetPaletteEntries(hPalette, 0, wNumEntries, logPalette->palPalEntry);
+
+ creationSucceed = MFDRV_CreatePalette( dev, hPalette, logPalette,
sizeofPalette );
+
+ free(logPalette);
+
+ if (creationSucceed)
+ return hPalette;
+
+ return 0;
+}
+
+/***********************************************************************
+ * MFDRV_RealizePalette
+ */
+UINT MFDRV_RealizePalette(PHYSDEV dev, HPALETTE hPalette, BOOL dummy)
+{
+ char buffer[sizeof(METARECORD) - sizeof(WORD)];
+ METARECORD *mr = (METARECORD *)&buffer;
+
+ mr->rdSize = (sizeof(METARECORD) - sizeof(WORD)) / sizeof(WORD);
+ mr->rdFunction = META_REALIZEPALETTE;
+
+ if (!(MFDRV_WriteRecord( dev, mr, mr->rdSize * sizeof(WORD)))) return 0;
+
+ /* The return value is suppose to be the number of entries
+ in the logical palette mapped to the system palette or 0
+ if the function failed. Since it's not trivial here to
+ get that kind of information and since it's of little
+ use in the case of metafiles, we'll always return 1. */
+
+ return 1;
+}
diff -ur clean/wine/dlls/gdi/mfdrv/metafiledrv.h
wine/dlls/gdi/mfdrv/metafiledrv.h
--- clean/wine/dlls/gdi/mfdrv/metafiledrv.h Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/metafiledrv.h Fri Jan 31 12:40:36 2003
@@ -117,6 +117,8 @@
extern BOOL MFDRV_SelectClipPath( PHYSDEV dev, INT iMode );
extern HFONT MFDRV_SelectFont( PHYSDEV dev, HFONT handle );
extern HPEN MFDRV_SelectPen( PHYSDEV dev, HPEN handle );
+HPALETTE MFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPalette, BOOL
bForceBackground);
+UINT MFDRV_RealizePalette(PHYSDEV dev, HPALETTE hPalette, BOOL);
extern COLORREF MFDRV_SetBkColor( PHYSDEV dev, COLORREF color );
extern INT MFDRV_SetBkMode( PHYSDEV dev, INT mode );
extern INT MFDRV_SetMapMode( PHYSDEV dev, INT mode );
diff -ur clean/wine/dlls/gdi/mfdrv/init.c wine/dlls/gdi/mfdrv/init.c
--- clean/wine/dlls/gdi/mfdrv/init.c Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/init.c Fri Jan 31 12:45:02 2003
@@ -95,7 +95,7 @@
MFDRV_Polyline, /* pPolyline */
NULL, /* pPolylineTo */
NULL, /* pRealizeDefaultPalette */
- NULL, /* pRealizePalette */
+ MFDRV_RealizePalette, /* pRealizePalette */
MFDRV_Rectangle, /* pRectangle */
NULL, /* pResetDC */
MFDRV_RestoreDC, /* pRestoreDC */
@@ -107,7 +107,7 @@
MFDRV_SelectBrush, /* pSelectBrush */
MFDRV_SelectClipPath, /* pSelectClipPath */
MFDRV_SelectFont, /* pSelectFont */
- NULL, /* pSelectPalette */
+ MFDRV_SelectPalette, /* pSelectPalette */
MFDRV_SelectPen, /* pSelectPen */
NULL, /* pSetBitmapBits */
MFDRV_SetBkColor, /* pSetBkColor */
diff -ur clean/wine/objects/palette.c wine/objects/palette.c
--- clean/wine/objects/palette.c Wed Jan 29 15:31:13 2003
+++ wine/objects/palette.c Fri Jan 31 12:47:21 2003
@@ -674,6 +674,7 @@
}
if (!(dc = DC_GetDCPtr( hdc ))) return 0;
prev = dc->hPalette;
+ if (dc->funcs->pSelectPalette) hpal = dc->funcs->pSelectPalette(
dc->physDev, hpal, FALSE );
dc->hPalette = hpal;
GDI_ReleaseObj( hdc );
if (!wBkg) hPrimaryPalette = hpal;
More information about the wine-patches
mailing list