Release 960805 Sun Aug 4 18:18:48 1996 Alexandre Julliard <julliard@lrc.epfl.ch> * [controls/scroll.c] Attempted to implement undocumented scroll-bar messages. * [tools/build.c] [include/callback.h] [windows/winproc.c] CallTo16_* functions now get DS from the previous 16-bit stackframe. * [if1632/thunk.c] [include/callback.h] Added thunks to implement callbacks for the emulator. Now all the Enum* functions always take a real function pointer even in the emulator. * [loader/builtin.c] Removed binary search in BUILTIN_GetEntryPoint32(), as it didn't work with NULL entry points. Using linear search now. * [loader/module.c] Implemented IsSharedSelector(). * [loader/task.c] Changed SwitchStackTo/Back to use the instance data to store the previous stack instead of the TDB. Also copy the local variables onto the new stack. Added GetExeVersion() and SetTackSignalProc(). Implemented SetSigHandler(). Sat Aug 3 22:19:00 1996 Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk> * [controls/menu.c] "Fixed" problem in deleting menus where win32 could get into an endless loop when it crashed. I think I've fixed the symptoms, not the original problem so it might be worth further investigation. * [debugger/registers.c] Added missing #ifdefs on FS_REG and GS_REG, needed for FreeBSD to compile wine properly. * [files/dos_fs.c] Made DOSFS_Hash and DOSFS_Match non-static so they can be called from win32/findfile.c (q.v.). * [if1632/gdi32.spec] Added SetMapMode (call existing function) * [if1632/kernel32.spec] Added FindFirstFileA and SetFileAttributesA. * [if1632/user32.spec] Added BringWindowToTop, CreatePopupMenu, GetKeyState, GetParent, IsDlgButtonChecked (call existing functions) and IsDialogMessageA, UnhookWindowsHookEx. * [win32/file.c] Added stub function SetFileAttributes32A. It's a stub because I can't really work out what this function should do with most attributes in a Unix environment. Anyone care to expand it? * [win32/findfile.c] New file. Initial stab at FindFirstFile. This doesn't work as specified yet, though a lot of the groundwork is there. I haven't time to work on this for the next month, so if anyone wants to pick it up and run with it please do. * [win32/memory.c] Removed malloc.h from includes (covered by stdlib.h include, and gets rid of a warning in FreeBSD). * [win32/newfns.c] UnhookWindowsHookEx32A stub added. * [win32/user32.c] Added implementation of IsDialogMessage32A. * [windows/dialog.c] IsDlgButtonChecked now calls SendDlgItemMessage32A instead of SendDlgItemMessage16. Sat Aug 3 18:00:00 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu> * [windows/graphics.c] Removed rectangle checking (conflicted with nonstandard mapping modes). * [windows/dialog.c] Added check for child-style dialogs to DS_ABSALIGN coordinate conversion. * [objects/color.c] Cleaned up misc. bits Thu Aug 1 10:51:45 1996 Andrew Lewycky <plewycky@oise.utoronto.ca> * [windows/focus.c] [windows/event.c] [windows/win.c] [windows/defdlg.c] Fixes to focusing and activation. * [windows/defdlg.c] Properly(?) handle DM_GETDEFID. * [controls/combo.c] Handle CB_FINDSTRINGEXACT, CB_SETEDITSEL, CB_GETEDITSEL. CBCheckSize: Adjust edit position. Tue Jul 30 09:46:36 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [files/file.c] [include/file.h] [loader/module.c] [loader/ne_image.c] Pass HFILEs instead of unix-fds to self-loader code. Mon Jul 29 21:48:25 1996 Albrecht Kleine <kleine@ak.sax.de> * [include/metafile.h] [objects/metafile.c] [objects/text.c] Implemented handling of some new metafile records (META_...) in PlayMetaFileRecord(), rewrite of 'case META_EXTTEXTOUT'. Added functions like MF_StretchBlt() for usage in metafiles. Minor bugfix in CopyMetafile(). * [objects/bitmap.c][objects/dib.c] Added check for metafile-DC in Bitmap and DIB functions: CreateCompatibleBitmap() etc.
diff --git a/objects/bitmap.c b/objects/bitmap.c index f609f25..afc0b6b 100644 --- a/objects/bitmap.c +++ b/objects/bitmap.c
@@ -129,8 +129,12 @@ dprintf_gdi( stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", hdc, width, height ); - if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0; - + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } hbmpRet = CreateBitmap( width, height, 1, dc->w.bitsPerPixel, NULL ); dprintf_gdi(stddeb,"\t\t%04x\n", hbmpRet); return hbmpRet;
diff --git a/objects/color.c b/objects/color.c index b7c45a2..308d191 100644 --- a/objects/color.c +++ b/objects/color.c
@@ -34,10 +34,6 @@ * http://198.105.232.5/MSDN/LIBRARY/TECHNOTE/CH3.HTM */ -extern void BITBLT_SetAccelMode( int ); /* speed up INVERT raster ops whenever possible - * parameter is a speedup level (see bitblt.c) - */ - typedef struct { Colormap colorMap; @@ -375,9 +371,6 @@ cs->size = c_min + NB_RESERVED_COLORS; - COLOR_gapStart = cs->size/2; - COLOR_gapEnd = 256 - cs->size/2; - XUngrabServer(display); dprintf_palette(stddeb,"adjusted size %i colorcells\n", cs->size); @@ -690,7 +683,7 @@ BYTE r = GetRValue(col), g = GetGValue(col), b = GetBValue(col); for( i = 0; i < size; i++ ) { - if( palPalEntry[i].peFlags & PC_SYS_USED ) /* skip gap */ + if( palPalEntry[i].peFlags & PC_SYS_USED ) /* skips gap */ if( palPalEntry[i].peRed == r && palPalEntry[i].peGreen == g && palPalEntry[i].peBlue == b ) @@ -964,17 +957,15 @@ COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[i]; COLOR_sysPal[index].peFlags = flag; - if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index]; - COLOR_freeList[index] = 0; - palPtr->logpalette.palPalEntry[i].peFlags = PC_SYS_USED | PC_SYS_MAPPED; + + if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index]; break; } else if ( cSpace.flags & COLOR_VIRTUAL ) { index = COLOR_ToPhysical( NULL, 0x00ffffff & *(COLORREF*)(palPtr->logpalette.palPalEntry + i)); - palPtr->logpalette.palPalEntry[i].peFlags = PC_SYS_USED; break; } @@ -983,7 +974,7 @@ index = COLOR_PaletteLookupPixel(COLOR_sysPal, 256, NULL, *(COLORREF*)(palPtr->logpalette.palPalEntry + i), TRUE); } - palPtr->logpalette.palPalEntry[i].peFlags = PC_SYS_USED; + palPtr->logpalette.palPalEntry[i].peFlags |= PC_SYS_USED; if( COLOR_PaletteToPixel ) index = COLOR_PaletteToPixel[index]; break;
diff --git a/objects/dib.c b/objects/dib.c index ef9f072..e94b417 100644 --- a/objects/dib.c +++ b/objects/dib.c
@@ -562,13 +562,17 @@ * Helper function for SetDIBits() and SetDIBitsToDevice(). */ static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits, - DWORD infoWidth, WORD infoBpp, DWORD compression, + DWORD infoWidth, WORD infoBpp, BITMAPINFO *info, WORD coloruse, Drawable drawable, GC gc, int xSrc, int ySrc, int xDest, int yDest, int width, int height ) { int *colorMapping; XImage *bmpImage; + DWORD compression = 0; + + if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) + compression = info->bmiHeader.biCompression; /* Build the color mapping table */ @@ -647,24 +651,27 @@ { DC * dc; BITMAPOBJ * bmp; - DWORD width, height, compression = 0; + DWORD width, height; WORD bpp; /* Check parameters */ - if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0; + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0; if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1) return 0; - if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) - compression = info->bmiHeader.biCompression; if (!lines || (startscan >= (WORD)height)) return 0; if (startscan + lines > height) lines = height - startscan; - return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 17, + return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 16, dc, lines, bmp->bitmap.bmBitsPixel, - bits, width, bpp, compression, info, + bits, width, bpp, info, coloruse, bmp->pixmap, BITMAP_GC(bmp), 0, 0, 0, startscan, bmp->bitmap.bmWidth, lines ); } @@ -679,16 +686,19 @@ UINT32 coloruse ) { DC * dc; - DWORD width, height, compression = 0; + DWORD width, height; WORD bpp; /* Check parameters */ - if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0; + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &bpp ) == -1) return 0; - if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) - compression = info->bmiHeader.biCompression; if (!lines || (startscan >= height)) return 0; if (startscan + lines > height) lines = height - startscan; if (ySrc < startscan) ySrc = startscan; @@ -700,9 +710,9 @@ DC_SetupGCForText( dc ); /* To have the correct colors */ XSetFunction( display, dc->u.x.gc, DC_XROPfunction[dc->w.ROPmode-1] ); - return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 17, + return CallTo32_LargeStack( (int(*)())DIB_SetImageBits, 16, dc, lines, dc->w.bitsPerPixel, bits, width, - bpp, compression, info, coloruse, + bpp, info, coloruse, dc->u.x.drawable, dc->u.x.gc, xSrc, ySrc - startscan, dc->w.DCOrgX + XLPTODP( dc, xDest ), @@ -726,7 +736,12 @@ int i, x, y; if (!lines) return 0; - if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0; + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } if (!(bmp = (BITMAPOBJ *)GDI_GetObjPtr( hbitmap, BITMAP_MAGIC ))) return 0; if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC )))
diff --git a/objects/font.c b/objects/font.c index fb4e234..5cdfd38 100644 --- a/objects/font.c +++ b/objects/font.c
@@ -15,7 +15,6 @@ #include <X11/Xatom.h> #include "font.h" #include "metafile.h" -#include "callback.h" #include "options.h" #include "string32.h" #include "xmalloc.h" @@ -1124,7 +1123,7 @@ /************************************************************************* * EnumFonts [GDI.70] */ -INT EnumFonts(HDC hDC, LPCSTR lpFaceName, FONTENUMPROC lpEnumFunc, LPARAM lpData) +INT EnumFonts(HDC hDC, LPCSTR lpFaceName, FONTENUMPROC16 lpEnumFunc, LPARAM lpData) { HANDLE hLog; HANDLE hMet; @@ -1178,8 +1177,8 @@ SelectObject(hDC, hOldFont); DeleteObject(hFont); dprintf_font(stddeb,"EnumFonts // i=%d lpLogFont=%p lptm=%p\n", i, lpLogFont, lptm); - nRet = CallEnumFontsProc((FARPROC16)lpEnumFunc, GDI_HEAP_SEG_ADDR(hLog), - GDI_HEAP_SEG_ADDR(hMet), 0, (LONG)lpData ); + nRet = lpEnumFunc( GDI_HEAP_SEG_ADDR(hLog), GDI_HEAP_SEG_ADDR(hMet), + 0, (LONG)lpData ); if (nRet == 0) { dprintf_font(stddeb,"EnumFonts // EnumEnd requested by application !\n"); break; @@ -1194,7 +1193,7 @@ /************************************************************************* * EnumFontFamilies [GDI.330] */ -INT EnumFontFamilies(HDC hDC, LPCSTR lpszFamily, FONTENUMPROC lpEnumFunc, LPARAM lpData) +INT EnumFontFamilies(HDC hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData) { HANDLE hLog; HANDLE hMet; @@ -1248,10 +1247,8 @@ DeleteObject(hFont); dprintf_font(stddeb, "EnumFontFamilies // i=%d lpLogFont=%p lptm=%p\n", i, lpEnumLogFont, lptm); - nRet = CallEnumFontFamProc( (FARPROC16)lpEnumFunc, - GDI_HEAP_SEG_ADDR(hLog), - GDI_HEAP_SEG_ADDR(hMet), - 0, lpData ); + nRet = lpEnumFunc( GDI_HEAP_SEG_ADDR(hLog), GDI_HEAP_SEG_ADDR(hMet), + 0, lpData ); if (nRet == 0) { dprintf_font(stddeb,"EnumFontFamilies // EnumEnd requested by application !\n"); break;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c index 1dffd30..c406140 100644 --- a/objects/gdiobj.c +++ b/objects/gdiobj.c
@@ -16,7 +16,6 @@ #include "palette.h" #include "pen.h" #include "region.h" -#include "callback.h" #include "stddebug.h" #include "debug.h" #include "xmalloc.h" @@ -435,7 +434,8 @@ /*********************************************************************** * EnumObjects (GDI.71) */ -INT EnumObjects( HDC hdc, INT nObjType, GOBJENUMPROC lpEnumFunc, LPARAM lParam ) +INT EnumObjects( HDC hdc, INT nObjType, GOBJENUMPROC16 lpEnumFunc, + LPARAM lParam ) { /* Solid colors to enumerate */ static const COLORREF solid_colors[] = @@ -466,8 +466,7 @@ pen->lopnWidth.x = 1; pen->lopnWidth.y = 0; pen->lopnColor = solid_colors[i]; - retval = CallEnumObjectsProc( (FARPROC16)lpEnumFunc, - SEGPTR_GET(pen), lParam ); + retval = lpEnumFunc( SEGPTR_GET(pen), lParam ); dprintf_gdi( stddeb, "EnumObject: solid pen %08lx, ret=%d\n", solid_colors[i], retval); if (!retval) break; @@ -483,8 +482,7 @@ brush->lbStyle = BS_SOLID; brush->lbColor = solid_colors[i]; brush->lbHatch = 0; - retval = CallEnumObjectsProc( (FARPROC16)lpEnumFunc, - SEGPTR_GET(brush), lParam ); + retval = lpEnumFunc( SEGPTR_GET(brush), lParam ); dprintf_gdi( stddeb, "EnumObject: solid brush %08lx, ret=%d\n", solid_colors[i], retval); if (!retval) break; @@ -496,8 +494,7 @@ brush->lbStyle = BS_HATCHED; brush->lbColor = RGB(0,0,0); brush->lbHatch = i; - retval = CallEnumObjectsProc( (FARPROC16)lpEnumFunc, - SEGPTR_GET(brush), lParam ); + retval = lpEnumFunc( SEGPTR_GET(brush), lParam ); dprintf_gdi( stddeb, "EnumObject: hatched brush %d, ret=%d\n", i, retval); if (!retval) break;
diff --git a/objects/linedda.c b/objects/linedda.c index 5ef10f2..be9693f 100644 --- a/objects/linedda.c +++ b/objects/linedda.c
@@ -2,24 +2,35 @@ * LineDDA * * Copyright 1993 Bob Amstadt - * */ +#define NO_TRANSITION_TYPES /* This file is Win32-clean */ #include <stdlib.h> #include "windows.h" -#include "callback.h" + /********************************************************************** - * LineDDA (GDI.100) + * LineDDA16 (GDI.100) */ -void LineDDA(short nXStart, short nYStart, short nXEnd, short nYEnd, - FARPROC16 callback, long lParam) +void LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd, INT16 nYEnd, + LINEDDAPROC16 callback, LPARAM lParam ) { - int xadd = 1, yadd = 1; - int err,erradd; - int cnt; - int dx = nXEnd - nXStart; - int dy = nYEnd - nYStart; + LineDDA32( nXStart, nYStart, nXEnd, nYEnd, + (LINEDDAPROC32)callback, lParam ); +} + + +/********************************************************************** + * LineDDA32 (GDI32.248) + */ +BOOL32 LineDDA32( INT32 nXStart, INT32 nYStart, INT32 nXEnd, INT32 nYEnd, + LINEDDAPROC32 callback, LPARAM lParam ) +{ + INT32 xadd = 1, yadd = 1; + INT32 err,erradd; + INT32 cnt; + INT32 dx = nXEnd - nXStart; + INT32 dy = nYEnd - nYStart; if (dx < 0) { dx = -dx; xadd = -1; @@ -30,7 +41,7 @@ if (dx > dy) { /* line is "more horizontal" */ err = 2*dy - dx; erradd = 2*dy - 2*dx; for(cnt = 0;cnt <= dx; cnt++) { - CallLineDDAProc(callback,nXStart,nYStart,lParam); + callback(nXStart,nYStart,lParam); if (err > 0) { nYStart += yadd; err += erradd; @@ -42,7 +53,7 @@ } else { /* line is "more vertical" */ err = 2*dx - dy; erradd = 2*dx - 2*dy; for(cnt = 0;cnt <= dy; cnt++) { - CallLineDDAProc(callback,nXStart,nYStart,lParam); + callback(nXStart,nYStart,lParam); if (err > 0) { nXStart += xadd; err += erradd; @@ -52,4 +63,5 @@ nYStart += yadd; } } + return TRUE; }
diff --git a/objects/metafile.c b/objects/metafile.c index f3fb1a7..3c2ad1a 100644 --- a/objects/metafile.c +++ b/objects/metafile.c
@@ -2,7 +2,7 @@ * Metafile functions * * Copyright David W. Metcalfe, 1994 - * Niels de Carpentier, 1996 + * Niels de Carpentier, Albrecht Kleine 1996 * */ @@ -12,8 +12,8 @@ #include "bitmap.h" #include "file.h" #include "metafile.h" +#include "stackframe.h" #include "stddebug.h" -#include "callback.h" #include "debug.h" #define HTINCR 10 /* handle table allocation size increment */ @@ -107,7 +107,7 @@ GDI_FreeObject(handle); return 0; } - + dc->w.bitsPerPixel = screenDepth; mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile); mh->mtHeaderSize = MFHEADERSIZE / 2; @@ -135,14 +135,13 @@ /* create the handle table */ HTLen = HTINCR; hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT, - sizeof(HANDLETABLE) * HTLen); + sizeof(HANDLETABLE16) * HTLen); GlobalUnlock16(dc->w.hMetaFile); dprintf_metafile(stddeb,"CreateMetaFile: returning %04x\n", handle); return handle; } - /****************************************************************** * CopyMetafile GDI.151 Niels de Carpentier, April 1996 */ @@ -163,8 +162,13 @@ if (lpFilename) /* disk based metafile */ { + int i,j; hFile = _lcreat(lpFilename, 0); - if (_lwrite(hFile, (char *)mh, mh->mtSize * 2) == -1) + j=mh->mtType; + mh->mtType=1; /* disk file version stores 1 here */ + i=_lwrite(hFile, (char *)mh, mh->mtSize * 2) ; + mh->mtType=j; /* restore old value [0 or 1] */ + if (i == -1) { _lclose(hFile); return 0; @@ -264,7 +268,7 @@ { METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf); METARECORD *mr; - HANDLETABLE *ht; + HANDLETABLE16 *ht; int offset = 0; WORD i; @@ -272,8 +276,8 @@ /* create the handle table */ hHT = GlobalAlloc16(GMEM_MOVEABLE|GMEM_ZEROINIT, - sizeof(HANDLETABLE) * mh->mtNoObjects); - ht = (HANDLETABLE *)GlobalLock16(hHT); + sizeof(HANDLETABLE16) * mh->mtNoObjects); + ht = (HANDLETABLE16 *)GlobalLock16(hHT); /* loop through metafile playing records */ offset = mh->mtHeaderSize * 2; @@ -303,7 +307,7 @@ * Niels de carpentier, april 1996 */ -BOOL EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc,LPARAM lpData) +BOOL EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC16 lpEnumFunc,LPARAM lpData) { METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf); METARECORD *mr; @@ -316,7 +320,7 @@ /* create the handle table */ hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT, - sizeof(HANDLETABLE) * mh->mtNoObjects); + sizeof(HANDLETABLE16) * mh->mtNoObjects); ht = WIN16_GlobalLock16(hHT); offset = mh->mtHeaderSize * 2; @@ -326,9 +330,8 @@ while (offset < (mh->mtSize * 2)) { mr = (METARECORD *)((char *)mh + offset); - if (!CallEnumMetafileProc( (FARPROC16)lpEnumFunc, hdc, ht, - MAKE_SEGPTR(mr), /* FIXME!! */ - mh->mtNoObjects, (LONG)lpData)) + if (!lpEnumFunc( hdc, ht, MAKE_SEGPTR(mr), /* FIXME!! */ + mh->mtNoObjects, (LONG)lpData)) break; offset += (mr->rdSize * 2); @@ -340,12 +343,53 @@ return TRUE; } +/******************************************************************* + * MF_GetDIBitsPointer [internal helper for e.g. PlayMetaFileRecord] + * + * Returns offset to DIB bits or 0 if error + * (perhaps should be moved to (objects/dib.c ?) + */ +static LPSTR MF_GetDIBitsPointer(LPBITMAPINFO info) +{ + int offset; + if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) + { + if (info->bmiHeader.biClrUsed) + { + if (info->bmiHeader.biClrUsed < (1 << info->bmiHeader.biBitCount)) + offset = info->bmiHeader.biClrUsed * 4; + else + offset = (1 << info->bmiHeader.biBitCount) * 4; + } + else + offset = (1 << info->bmiHeader.biBitCount) * 4; + } + else if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) + { + if (info->bmiHeader.biClrUsed) + { + if (info->bmiHeader.biClrUsed < (1 << info->bmiHeader.biBitCount)) + offset = info->bmiHeader.biClrUsed * 3; + else + offset = (1 << info->bmiHeader.biBitCount) * 3; + } + else + offset = (1 << info->bmiHeader.biBitCount) * 3; + } + else + { + fprintf(stderr,"Unknown size for BITMAPHEADER in MetaFile!\n"); + return NULL; + } + return (LPSTR)info + info->bmiHeader.biSize + offset; +} + /****************************************************************** * PlayMetaFileRecord GDI.176 */ -void PlayMetaFileRecord(HDC hdc, HANDLETABLE *ht, METARECORD *mr, +void PlayMetaFileRecord(HDC hdc, HANDLETABLE16 *ht, METARECORD *mr, WORD nHandles) { short s1; @@ -603,76 +647,93 @@ dprintf_metafile(stddeb,"PlayMetaFileRecord: META_ESCAPE unimplemented.\n"); break; - case META_EXTTEXTOUT: /* FIXME: don't know the exact parameters here */ - { - short x,y,options,x5,x6,x7,x8; - y=mr->rdParam[0]; /* X position */ - x=mr->rdParam[1]; /* Y position */ - s1=mr->rdParam[2]; /* String length */ - options=mr->rdParam[3]; - x5=mr->rdParam[(s1+1)/2+4]; /* unknown meaning */ - x6=mr->rdParam[(s1+1)/2+5]; /* unknown meaning */ - x7=mr->rdParam[(s1+1)/2+6]; /* unknown meaning */ - x8=mr->rdParam[(s1+1)/2+7]; /* unknown meaning */ - ExtTextOut16( hdc, x, y, options, (LPRECT16) &mr->rdParam[(s1+1)/2+4], - (char *)(mr->rdParam + 4), s1, NULL ); - /* fprintf(stderr,"EXTTEXTOUT (len: %d) %hd : %hd %hd %hd %hd [%s].\n", - (mr->rdSize-s1),options,x5,x6,x7,x8,(char*) &(mr->rdParam[4]) );*/ - } - break; - /* End new metafile operations. */ + /* --- Begin of fixed or new metafile operations. July 1996 ----*/ + case META_EXTTEXTOUT: + { + LPINT16 dxx; + s1=mr->rdParam[2]; /* String length */ + if (mr->rdSize-(s1+1)) + dxx=&mr->rdParam[8+(s1+1)/2]; /* start of array */ + else + dxx=NULL; /* NO array present */ + + ExtTextOut16( hdc, mr->rdParam[1], /* X position */ + mr->rdParam[0], /* Y position */ + mr->rdParam[3], /* options */ + (LPRECT16) &mr->rdParam[4], /* rectangle */ + (char *)(mr->rdParam + 8), /* string */ + s1, dxx); /* length, dx array */ + if (dxx) + dprintf_metafile(stddeb,"EXTTEXTOUT len: %ld (%hd %hd) [%s].\n", + mr->rdSize,dxx[0],dxx[1],(char*) &(mr->rdParam[8]) ); + } + break; case META_STRETCHDIB: { - LPSTR bits; - LPBITMAPINFO info; - int offset; - info = (LPBITMAPINFO) &(mr->rdParam[11]); - if (info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) - { - if (info->bmiHeader.biClrUsed) - { - if (info->bmiHeader.biClrUsed < (1 << info->bmiHeader.biBitCount)) - offset = info->bmiHeader.biClrUsed * 4; - else - offset = (1 << info->bmiHeader.biBitCount) * 4; - } - else - offset = (1 << info->bmiHeader.biBitCount) * 4; - } - else if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) - { - if (info->bmiHeader.biClrUsed) - { - if (info->bmiHeader.biClrUsed < (1 << info->bmiHeader.biBitCount)) - offset = info->bmiHeader.biClrUsed * 3; - else - offset = (1 << info->bmiHeader.biBitCount) * 3; - } - else - offset = (1 << info->bmiHeader.biBitCount) * 3; - } - else - { - fprintf(stderr,"Unknown size for BITMAPHEADER in PlayMetaRecord!\n"); - break; - } - - offset += info->bmiHeader.biSize; - bits = (LPSTR) info + offset; - StretchDIBits(hdc,mr->rdParam[10],mr->rdParam[9],mr->rdParam[8], + LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParam[11]); + LPSTR bits = MF_GetDIBitsPointer(info); + if (bits) + StretchDIBits(hdc,mr->rdParam[10],mr->rdParam[9],mr->rdParam[8], mr->rdParam[7],mr->rdParam[6],mr->rdParam[5], mr->rdParam[4],mr->rdParam[3],bits,info, - mr->rdParam[2],(DWORD)mr->rdParam[0]); + mr->rdParam[2],MAKELONG(mr->rdParam[0],mr->rdParam[1])); } break; - + + case META_DIBSTRETCHBLT: + { + LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParam[10]); + LPSTR bits = MF_GetDIBitsPointer(info); + if (bits) + StretchDIBits(hdc,mr->rdParam[9],mr->rdParam[8],mr->rdParam[7], + mr->rdParam[6],mr->rdParam[5],mr->rdParam[4], + mr->rdParam[3],mr->rdParam[2],bits,info, + DIB_RGB_COLORS,MAKELONG(mr->rdParam[0],mr->rdParam[1])); + } + break; + + case META_STRETCHBLT: + { + HDC hdcSrc=CreateCompatibleDC(hdc); + HBITMAP16 hbitmap=CreateBitmap(mr->rdParam[10], /*Width */ + mr->rdParam[11], /*Height*/ + mr->rdParam[13], /*Planes*/ + mr->rdParam[14], /*BitsPixel*/ + (LPSTR)&mr->rdParam[15]); /*bits*/ + SelectObject(hdcSrc,hbitmap); + StretchBlt(hdc,mr->rdParam[9],mr->rdParam[8], + mr->rdParam[7],mr->rdParam[6], + hdcSrc,mr->rdParam[5],mr->rdParam[4], + mr->rdParam[3],mr->rdParam[2], + MAKELONG(mr->rdParam[0],mr->rdParam[1])); + DeleteDC(hdcSrc); + } + break; + + case META_BITBLT: /* <-- not yet debugged */ + { + HDC hdcSrc=CreateCompatibleDC(hdc); + HBITMAP16 hbitmap=CreateBitmap(mr->rdParam[7]/*Width */,mr->rdParam[8]/*Height*/, + mr->rdParam[10]/*Planes*/,mr->rdParam[11]/*BitsPixel*/, + (LPSTR)&mr->rdParam[12]/*bits*/); + SelectObject(hdcSrc,hbitmap); + BitBlt(hdc,mr->rdParam[6],mr->rdParam[5], + mr->rdParam[4],mr->rdParam[3], + hdcSrc, + mr->rdParam[2],mr->rdParam[1], + MAKELONG(0,mr->rdParam[0])); + DeleteDC(hdcSrc); + } + break; + default: fprintf(stddeb,"PlayMetaFileRecord: Unknown record type %x\n", mr->rdFunction); } } + /****************************************************************** * GetMetaFileBits by William Magro, 19 Sep 1995 * @@ -744,7 +805,7 @@ * Add a handle to an external handle table and return the index */ -int MF_AddHandle(HANDLETABLE *ht, WORD htlen, HANDLE hobj) +int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HANDLE hobj) { int i; @@ -769,7 +830,7 @@ int MF_AddHandleInternal(HANDLE hobj) { int i; - HANDLETABLE *ht = (HANDLETABLE *)GlobalLock16(hHT); + HANDLETABLE16 *ht = (HANDLETABLE16 *)GlobalLock16(hHT); for (i = 0; i < HTLen; i++) { @@ -784,7 +845,7 @@ if (!(hHT = GlobalReAlloc16(hHT, HTINCR, GMEM_MOVEABLE | GMEM_ZEROINIT))) return -1; HTLen += HTINCR; - ht = (HANDLETABLE *)GlobalLock16(hHT); + ht = (HANDLETABLE16 *)GlobalLock16(hHT); *(ht->objectHandle + i) = hobj; GlobalUnlock16(hHT); return i; @@ -1158,6 +1219,40 @@ return handle; } +/****************************************************************** + * MF_ExtTextOut + */ +BOOL MF_ExtTextOut(DC *dc, short x, short y, UINT16 flags, const RECT16 *rect, + LPCSTR str, short count, const INT16 *lpDx) +{ + HMETAFILE handle; + DWORD len; + HANDLE hmr; + METARECORD *mr; + + len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 4 + sizeof(RECT16); + if (lpDx) + len+=count*sizeof(INT16); + if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock16(hmr); + memset(mr, 0, len); + + mr->rdSize = len / 2; + mr->rdFunction = META_EXTTEXTOUT; + *(mr->rdParam) = y; + *(mr->rdParam + 1) = x; + *(mr->rdParam + 2) = count; + *(mr->rdParam + 3) = flags; + memcpy(mr->rdParam + 4, rect, sizeof(RECT16)); + memcpy(mr->rdParam + 8, str, count); + if (lpDx) + memcpy(mr->rdParam + 8+ ((count + 1) >> 1),lpDx,count*sizeof(INT16)); + handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); + dc->w.hMetaFile = handle; + GlobalFree16(hmr); + return handle; +} /****************************************************************** * MF_MetaPoly - implements Polygon and Polyline @@ -1192,18 +1287,130 @@ BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width, short height, HDC hdcSrc, short xSrc, short ySrc, DWORD rop) { - fprintf(stdnimp,"MF_BitBlt: not implemented yet\n"); - return FALSE; + HMETAFILE handle; + DWORD len; + HANDLE hmr; + METARECORD *mr; + DC *dcSrc; + BITMAP16 BM; + + if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0; + GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM); + len = sizeof(METARECORD) + 12 * sizeof(INT16) + BM.bmWidthBytes * BM.bmHeight; + if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock16(hmr); + mr->rdFunction = META_BITBLT; + *(mr->rdParam + 7) = BM.bmWidth; + *(mr->rdParam + 8) = BM.bmHeight; + *(mr->rdParam + 9) = BM.bmWidthBytes; + *(mr->rdParam +10) = BM.bmPlanes; + *(mr->rdParam +11) = BM.bmBitsPixel; + dprintf_metafile(stddeb,"MF_StretchBlt->len = %ld rop=%lx \n",len,rop); + if (GetBitmapBits(dcSrc->w.hBitmap,BM.bmWidthBytes * BM.bmHeight,mr->rdParam +12)) + { + mr->rdSize = len / sizeof(INT16); + *(mr->rdParam) = HIWORD(rop); + *(mr->rdParam + 1) = ySrc; + *(mr->rdParam + 2) = xSrc; + *(mr->rdParam + 3) = height; + *(mr->rdParam + 4) = width; + *(mr->rdParam + 5) = yDest; + *(mr->rdParam + 6) = xDest; + handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2); + } + else + handle = 0; + dcDest->w.hMetaFile = handle; + GlobalFree16(hmr); + return handle; } -/****************************************************************** - * MF_StretchBlt +/********************************************************************** + * MF_StretchBlt + * this function contains TWO ways for procesing StretchBlt in metafiles, + * decide between rdFunction values META_STRETCHBLT or META_DIBSTRETCHBLT + * via #define STRETCH_VIA_DIB */ +#define STRETCH_VIA_DIB +#undef STRETCH_VIA_DIB BOOL MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest, short heightDest, HDC hdcSrc, short xSrc, short ySrc, short widthSrc, short heightSrc, DWORD rop) { - fprintf(stdnimp,"MF_StretchBlt: not implemented yet\n"); - return FALSE; + HMETAFILE handle; + DWORD len; + HANDLE hmr; + METARECORD *mr; + DC *dcSrc; + BITMAP16 BM; +#ifdef STRETCH_VIA_DIB + LPBITMAPINFOHEADER lpBMI; + WORD nBPP; +#endif + if (!(dcSrc = (DC *) GDI_GetObjPtr( hdcSrc, DC_MAGIC ))) return 0; + GetObject16(dcSrc->w.hBitmap, sizeof(BITMAP16), &BM); +#ifdef STRETCH_VIA_DIB + nBPP = BM.bmPlanes * BM.bmBitsPixel; + len = sizeof(METARECORD) + 10 * sizeof(INT16) + + sizeof(BITMAPINFOHEADER) + (nBPP != 24 ? 1 << nBPP: 0) * sizeof(RGBQUAD) + + ((BM.bmWidth * nBPP + 31) / 32) * 4 * BM.bmHeight; + if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock16(hmr); + mr->rdFunction = META_DIBSTRETCHBLT; + lpBMI=(LPBITMAPINFOHEADER)(mr->rdParam+10); + lpBMI->biSize = sizeof(BITMAPINFOHEADER); + lpBMI->biWidth = BM.bmWidth; + lpBMI->biHeight = BM.bmHeight; + lpBMI->biPlanes = 1; + lpBMI->biBitCount = nBPP; /* 1,4,8 or 24 */ + lpBMI->biClrUsed = nBPP != 24 ? 1 << nBPP : 0; + lpBMI->biSizeImage = ((lpBMI->biWidth * nBPP + 31) / 32) * 4 * lpBMI->biHeight; + lpBMI->biCompression = BI_RGB; + lpBMI->biXPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSX),3937,100); + lpBMI->biYPelsPerMeter = MulDiv32(GetDeviceCaps(hdcSrc,LOGPIXELSY),3937,100); + lpBMI->biClrImportant = 0; /* 1 meter = 39.37 inch */ + + dprintf_metafile(stddeb,"MF_StretchBltViaDIB->len = %ld rop=%lx PixYPM=%ld Caps=%d\n", + len,rop,lpBMI->biYPelsPerMeter,GetDeviceCaps(hdcSrc,LOGPIXELSY)); + if (GetDIBits(hdcSrc,dcSrc->w.hBitmap,0,(UINT)lpBMI->biHeight, + MF_GetDIBitsPointer((LPBITMAPINFO)lpBMI), /* DIB bits */ + (LPBITMAPINFO)lpBMI,DIB_RGB_COLORS)) /* DIB info structure */ +#else + len = sizeof(METARECORD) + 15 * sizeof(INT16) + BM.bmWidthBytes * BM.bmHeight; + if (!(hmr = GlobalAlloc16(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock16(hmr); + mr->rdFunction = META_STRETCHBLT; + *(mr->rdParam +10) = BM.bmWidth; + *(mr->rdParam +11) = BM.bmHeight; + *(mr->rdParam +12) = BM.bmWidthBytes; + *(mr->rdParam +13) = BM.bmPlanes; + *(mr->rdParam +14) = BM.bmBitsPixel; + dprintf_metafile(stddeb,"MF_StretchBlt->len = %ld rop=%lx \n",len,rop); + if (GetBitmapBits(dcSrc->w.hBitmap,BM.bmWidthBytes * BM.bmHeight,mr->rdParam +15)) +#endif + { + mr->rdSize = len / sizeof(INT16); + *(mr->rdParam) = LOWORD(rop); + *(mr->rdParam + 1) = HIWORD(rop); + *(mr->rdParam + 2) = heightSrc; + *(mr->rdParam + 3) = widthSrc; + *(mr->rdParam + 4) = ySrc; + *(mr->rdParam + 5) = xSrc; + *(mr->rdParam + 6) = heightDest; + *(mr->rdParam + 7) = widthDest; + *(mr->rdParam + 8) = yDest; + *(mr->rdParam + 9) = xDest; + handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2); + } + else + handle = 0; + dcDest->w.hMetaFile = handle; + GlobalFree16(hmr); + return handle; } + +
diff --git a/objects/palette.c b/objects/palette.c index 854322a..ab8f25b 100644 --- a/objects/palette.c +++ b/objects/palette.c
@@ -15,8 +15,6 @@ /* #define DEBUG_PALETTE */ #include "debug.h" -extern HWND DCE_hDC2hWnd( HDC ); /* get associated window by - * walking DCE list */ extern int COLOR_LookupSystemPixel(COLORREF); /* lookup pixel among static entries * of the system palette */ extern COLORREF COLOR_GetSystemPaletteEntry(BYTE); @@ -389,7 +387,7 @@ if( hPal != STOCK_DEFAULT_PALETTE ) { - HWND hWnd = DCE_hDC2hWnd( hDC ); + HWND hWnd = WindowFromDC( hDC ); HWND hActive = GetActiveWindow(); /* set primary palette if it's related to current active */ @@ -417,7 +415,7 @@ /* Send palette change notification */ HWND hWnd; - if( (hWnd = DCE_hDC2hWnd( hDC )) ) + if( (hWnd = WindowFromDC( hDC )) ) SendMessage16( HWND_BROADCAST, WM_PALETTECHANGED, hWnd, 0L); } return realized; @@ -430,7 +428,7 @@ */ int UpdateColors( HDC hDC ) { - HWND hWnd = DCE_hDC2hWnd( hDC ); + HWND hWnd = WindowFromDC( hDC ); /* Docs say that we have to remap current drawable pixel by pixel * but it would take forever given the speed of XGet/PutPixel.
diff --git a/objects/text.c b/objects/text.c index 5c892d8..bbfb6d5 100644 --- a/objects/text.c +++ b/objects/text.c
@@ -331,7 +331,7 @@ { dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC ); if (!dc) return FALSE; - MF_TextOut( dc, x, y, str, count ); + MF_ExtTextOut( dc, x, y, flags, lprect, str, count, lpDx ); return TRUE; } @@ -616,16 +616,16 @@ /*********************************************************************** - * GrayString (USER.185) + * GrayString (USER.185) */ -BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC16 gsprc, LPARAM lParam, +BOOL GrayString(HDC hdc, HBRUSH hbr, GRAYSTRINGPROC16 gsprc, LPARAM lParam, INT cch, INT x, INT y, INT cx, INT cy) { BOOL ret; COLORREF current_color; if (!cch) cch = lstrlen16( (LPCSTR)PTR_SEG_TO_LIN(lParam) ); - if (gsprc) return CallGrayStringProc( gsprc, hdc, lParam, cch ); + if (gsprc) return gsprc( hdc, lParam, cch ); current_color = GetTextColor( hdc ); SetTextColor( hdc, GetSysColor(COLOR_GRAYTEXT) ); ret = TextOut16( hdc, x, y, (LPCSTR)PTR_SEG_TO_LIN(lParam), cch );