Release 971130 Sat Nov 29 12:35:26 1997 Alexandre Julliard <julliard@lrc.epfl.ch> * [if1632/builtin.c] Build a complete PE header for builtin Win32 modules. * [loader/pe_image.c] [loader/module.c] HMODULE32 now points to the loading address of the module. There is no longer a separate PE_MODULE structure. Fri Nov 28 11:21:47 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [ole/*][configure.in][Makefile.in][include/interfaces.h] [if1632/olesvr32.spec][if1632/olecli32.spec] New directory, moved OLE stuff there. new .spec files for olecli32,olesvr32, some stubs added. * [misc/shell.c] Added support for extracting icons from PE dlls. * [misc/shellord.c][if1632/shell32.spec] Added a huge heap of ordinal only exported shell functions (will work only in Win95). * [loader/task.c] Hack to make MakeProcInstance16 work in all cases (mplayer.exe). * [win32/string32.c][include/string32.h] Obsolete, removed. * [windows/keyboard.c] Added *RegisterHotkey. * [objects/font.c][objects/text.c] Added GetFontLanguageInfo, GetTextCharsetInfo. Wed Nov 26 18:10:40 1997 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de> * [misc/network.c] In WNetGetConnection16 return the Drive label and not the DOS-Cwd. Makes Wordview 6 start on a network connected machine. * [controls/status.c] Catch a Null pointer in SW_SetText. * [files/dos_fs.c] Add NT5 functions GetLongPathName32. * [files/file.c] Make GetTempFileName16 accept drive 0 (Current Drive) too. Handle more errors and be more verbose in FILE_SetDosError, fix an error in DeleteFile32W * [memory/virtual.c] Implement FlushViewOfFile. * [misc/crtdll] Implement _rotl and splitpath and add a stub for _abnormal_termination. * [misc/printdrv.c] Stub for EnumPrinters32A. * [win32/newfns] Add Stub for QueryPerformanceFrequency, change return value for QueryPerformanceCounter. Add stub for DeviceIoControl. Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de> * [controls/combo.c] [controls/edit.c] [windows/defwnd.c] [windows/winpos.c] [windows/win.c] Removed WIN_NO_REDRAW flag. Tue Nov 25 13:20:35 1997 Douglas Ridgway <ridgway@taiga.v-wave.com> * [graphics/x11drv/bitblt.c] Fixed memory leak in BITBLT_GetDstArea. Sun Nov 23 14:05:23 1997 Andreas Mohr <100.30936@germany.net> * [files/directory.c] Export windows system directory to environment. * [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec] [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c] Added Win32s DLLs W32SKRNL and WIN32S16. * [if1632/kernel32.spec] [loader/module.c] Added misc functions for Win32s. * [if1632/kernel.spec] [loader/task.c] Added DefineHandleTable(). * [scheduler/process.c] Fixed SetEnvironmentVariable32A() to avoid heap corruption. Sat Nov 22 14:11:42 1997 Kristian Nielsen <kristian.nielsen@risoe.dk> * [windows/painting.c] Fix leak in BeginPaint16() for CS_PARENTDC windows where the update region was not properly released. Thu Nov 20 03:55:29 1997 Gordon Chaffee <chaffee@CS.Berkeley.EDU> * [loader/pe_image.c] Implemented forwarded DLL functions. * [objects/dib.c] Added support for 16- and 32-bit mode DIBs. Support negative bitmap heights. * [win32/process.c] Added stub for CreateProcess32W. * [win32/security.c] [include/ntdll.h] Added stubs for LookupAccountSid32A/W. * [scheduler/process.c] Use the size specified in the PE header for the process heap. Mon Nov 17 00:53:35 1997 Len White <phreak@cgocable.net> * [msdos/int3d.c] New file. Stubs for int3d. Sun Nov 16 12:30:00 PST 1997 Jason Schonberg <schon@mti.sgi.com> * [include/aspi.h] Changed comment style from C++ to C.
diff --git a/objects/cursoricon.c b/objects/cursoricon.c index 569b6ab..a9a7a06 100644 --- a/objects/cursoricon.c +++ b/objects/cursoricon.c
@@ -1258,9 +1258,10 @@ * * FIXME: exact parameter sizes */ -UINT16 WINAPI LookupIconIdFromDirectoryEx16( CURSORICONDIR *dir, BOOL16 bIcon, +INT16 WINAPI LookupIconIdFromDirectoryEx16( LPBYTE xdir, BOOL16 bIcon, INT16 width, INT16 height, UINT16 cFlag ) { + CURSORICONDIR *dir = (CURSORICONDIR*)xdir; UINT16 retVal = 0; if( dir && !dir->idReserved && (dir->idType & 3) ) { @@ -1285,16 +1286,16 @@ /********************************************************************** * LookupIconIdFromDirectoryEx32 (USER32.379) */ -INT32 WINAPI LookupIconIdFromDirectoryEx32( CURSORICONDIR *dir, BOOL32 bIcon, +INT32 WINAPI LookupIconIdFromDirectoryEx32( LPBYTE dir, BOOL32 bIcon, INT32 width, INT32 height, UINT32 cFlag ) { return LookupIconIdFromDirectoryEx16( dir, bIcon, width, height, cFlag ); } /********************************************************************** - * LookupIconIdFromDirectory (USER32.378) + * LookupIconIdFromDirectory (USER.???) */ -INT32 WINAPI LookupIconIdFromDirectory( CURSORICONDIR *dir, BOOL32 bIcon ) +INT16 WINAPI LookupIconIdFromDirectory16( LPBYTE dir, BOOL16 bIcon ) { return LookupIconIdFromDirectoryEx16( dir, bIcon, bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR, @@ -1302,14 +1303,24 @@ } /********************************************************************** + * LookupIconIdFromDirectory (USER32.378) + */ +INT32 WINAPI LookupIconIdFromDirectory32( LPBYTE dir, BOOL32 bIcon ) +{ + return LookupIconIdFromDirectoryEx32( dir, bIcon, + bIcon ? SYSMETRICS_CXICON : SYSMETRICS_CXCURSOR, + bIcon ? SYSMETRICS_CYICON : SYSMETRICS_CYCURSOR, bIcon ? 0 : LR_MONOCHROME ); +} + +/********************************************************************** * GetIconID (USER.455) */ WORD WINAPI GetIconID( HGLOBAL16 hResource, DWORD resType ) { - CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource); + LPBYTE lpDir = (LPBYTE)GlobalLock16(hResource); dprintf_cursor( stddeb, "GetIconID: hRes=%04x, entries=%i\n", - hResource, lpDir ? lpDir->idCount : 0); + hResource, lpDir ? ((CURSORICONDIR*)lpDir)->idCount : 0); switch(resType) {
diff --git a/objects/dib.c b/objects/dib.c index 88cb033..3c1be2e 100644 --- a/objects/dib.c +++ b/objects/dib.c
@@ -27,7 +27,7 @@ { DC *dc; LPCVOID bits; - DWORD lines; + int lines; DWORD infoWidth; WORD depth; WORD infoBpp; @@ -145,7 +145,7 @@ * Return 1 for INFOHEADER, 0 for COREHEADER, -1 for error. */ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, DWORD *width, - DWORD *height, WORD *bpp ) + int *height, WORD *bpp ) { if (header->biSize == sizeof(BITMAPINFOHEADER)) { @@ -235,50 +235,66 @@ return colorMapping; } +/*********************************************************************** + * DIB_SetImageBits_1_Line + * + * Handles a single line of 1 bit data. + */ +static void DIB_SetImageBits_1_Line(DWORD dstwidth, int *colors, + XImage *bmpImage, int h, const BYTE *bits) +{ + BYTE pix; + DWORD i, x; + + for (i = dstwidth/8, x = 0; (i > 0); i--) + { + pix = *bits++; + XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 6) & 1] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 5) & 1] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 4) & 1] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 3) & 1] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 2) & 1] ); + XPutPixel( bmpImage, x++, h, colors[(pix >> 1) & 1] ); + XPutPixel( bmpImage, x++, h, colors[pix & 1] ); + } + pix = *bits; + switch(dstwidth & 7) + { + case 7: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 6: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 5: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 4: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 3: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 2: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); pix <<= 1; + case 1: XPutPixel( bmpImage, x++, h, colors[pix >> 7] ); + } +} /*********************************************************************** * DIB_SetImageBits_1 * * SetDIBits for a 1-bit deep DIB. */ -static void DIB_SetImageBits_1( DWORD lines, const BYTE *srcbits, +static void DIB_SetImageBits_1( int lines, const BYTE *srcbits, DWORD srcwidth, DWORD dstwidth, int *colors, XImage *bmpImage ) { - DWORD i, x; - BYTE pix; - const BYTE *bits = srcbits; + int h; /* 32 bit aligned */ DWORD linebytes = ((srcwidth + 31) & ~31) / 8; - while (lines--) - { - for (i = dstwidth/8, x = 0; (i > 0); i--) - { - pix = *bits++; - XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 6) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 5) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 4) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 3) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 2) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[(pix >> 1) & 1] ); - XPutPixel( bmpImage, x++, lines, colors[pix & 1] ); + if (lines > 0) { + for (h = lines-1; h >=0; h--) { + DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits); + srcbits += linebytes; } - pix = *bits; - switch(dstwidth & 7) - { - case 7: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 6: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 5: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 4: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 3: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 2: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); pix <<= 1; - case 1: XPutPixel( bmpImage, x++, lines, colors[pix >> 7] ); + } else { + for (h = 0; h < lines; h++) { + DIB_SetImageBits_1_Line(dstwidth, colors, bmpImage, h, srcbits); + srcbits += linebytes; } - srcbits += linebytes; - bits = srcbits; } } @@ -288,27 +304,39 @@ * * SetDIBits for a 4-bit deep DIB. */ -static void DIB_SetImageBits_4( DWORD lines, const BYTE *srcbits, +static void DIB_SetImageBits_4( int lines, const BYTE *srcbits, DWORD srcwidth, DWORD dstwidth, int *colors, XImage *bmpImage ) { DWORD i, x; + int h; const BYTE *bits = srcbits; /* 32 bit aligned */ DWORD linebytes = ((srcwidth+7)&~7)/2; - while (lines--) - { - for (i = dstwidth/2, x = 0; i > 0; i--) - { - BYTE pix = *bits++; - XPutPixel( bmpImage, x++, lines, colors[pix >> 4] ); - XPutPixel( bmpImage, x++, lines, colors[pix & 0x0f] ); + if (lines > 0) { + for (h = lines-1; h >= 0; h--) { + for (i = dstwidth/2, x = 0; i > 0; i--) { + BYTE pix = *bits++; + XPutPixel( bmpImage, x++, h, colors[pix >> 4] ); + XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] ); + } + if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] ); + srcbits += linebytes; + bits = srcbits; } - if (dstwidth & 1) XPutPixel( bmpImage, x, lines, colors[*bits >> 4] ); - srcbits += linebytes; - bits = srcbits; + } else { + for (h = 0; h < lines; h++) { + for (i = dstwidth/2, x = 0; i > 0; i--) { + BYTE pix = *bits++; + XPutPixel( bmpImage, x++, h, colors[pix >> 4] ); + XPutPixel( bmpImage, x++, h, colors[pix & 0x0f] ); + } + if (dstwidth & 1) XPutPixel( bmpImage, x, h, colors[*bits >> 4] ); + srcbits += linebytes; + bits = srcbits; + } } } @@ -324,7 +352,7 @@ * * SetDIBits for a 4-bit deep compressed DIB. */ -static void DIB_SetImageBits_RLE4( DWORD lines, const BYTE *bits, DWORD width, +static void DIB_SetImageBits_RLE4( int lines, const BYTE *bits, DWORD width, DWORD dstwidth, int *colors, XImage *bmpImage ) { int x = 0, c, length; @@ -384,22 +412,32 @@ * * SetDIBits for an 8-bit deep DIB. */ -static void DIB_SetImageBits_8( DWORD lines, const BYTE *srcbits, - DWORD srcwidth, DWORD dstwidth, +static void DIB_SetImageBits_8( int lines, const BYTE *srcbits, + DWORD srcwidth, DWORD dstwidth, int *colors, XImage *bmpImage ) { DWORD x; + int h; const BYTE *bits = srcbits; /* align to 32 bit */ DWORD linebytes = (srcwidth + 3) & ~3; - while (lines--) - { - for (x = 0; x < dstwidth; x++) - XPutPixel( bmpImage, x, lines, colors[*bits++] ); - srcbits += linebytes; - bits = srcbits; + if (lines > 0) { + for (h = lines - 1; h >= 0; h--) { + for (x = 0; x < dstwidth; x++, bits++) { + XPutPixel( bmpImage, x, h, colors[*bits] ); + } + bits = (srcbits += linebytes); + } + } else { + lines = -lines; + for (h = 0; h < lines; h++) { + for (x = 0; x < dstwidth; x++, bits++) { + XPutPixel( bmpImage, x, h, colors[*bits] ); + } + bits = (srcbits += linebytes); + } } } @@ -434,7 +472,7 @@ RleDelta = 2 /* Delta */ }; -static void DIB_SetImageBits_RLE8( DWORD lines, const BYTE *bits, DWORD width, +static void DIB_SetImageBits_RLE8( int lines, const BYTE *bits, DWORD width, DWORD dstwidth, int *colors, XImage *bmpImage ) { int x; /* X-positon on each line. Increases. */ @@ -583,29 +621,123 @@ /*********************************************************************** + * DIB_SetImageBits_16 + * + * SetDIBits for a 16-bit deep DIB. + */ +static void DIB_SetImageBits_16( int lines, const BYTE *srcbits, + DWORD srcwidth, DWORD dstwidth, + DC *dc, XImage *bmpImage ) +{ + DWORD x; + LPWORD ptr; + WORD val; + int h; + BYTE r, g, b; + + /* align to 32 bit */ + DWORD linebytes = (srcwidth * 2 + 3) & ~3; + + ptr = (LPWORD) srcbits; + if (lines > 0) { + for (h = lines - 1; h >= 0; h--) { + for (x = 0; x < dstwidth; x++, ptr++) { + val = *ptr; + r = (BYTE) ((val & 0x7c00) >> 7); + g = (BYTE) ((val & 0x03e0) >> 2); + b = (BYTE) ((val & 0x001f) << 3); + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(r,g,b)) ); + } + ptr = (LPWORD) (srcbits += linebytes); + } + } else { + lines = -lines; + for (h = 0; h < lines; h++) { + for (x = 0; x < dstwidth; x++, ptr++) { + val = *ptr; + r = (BYTE) ((val & 0x7c00) >> 7); + g = (BYTE) ((val & 0x03e0) >> 2); + b = (BYTE) ((val & 0x001f) << 3); + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(r,g,b)) ); + } + ptr = (LPWORD) (srcbits += linebytes); + } + } +} + + +/*********************************************************************** * DIB_SetImageBits_24 * * SetDIBits for a 24-bit deep DIB. */ -static void DIB_SetImageBits_24( DWORD lines, const BYTE *srcbits, +static void DIB_SetImageBits_24( int lines, const BYTE *srcbits, DWORD srcwidth, DWORD dstwidth, DC *dc, XImage *bmpImage ) { DWORD x; const BYTE *bits = srcbits; + int h; /* align to 32 bit */ DWORD linebytes = (srcwidth * 3 + 3) & ~3; /* "bits" order is reversed for some reason */ - while (lines--) - { - for (x = 0; x < dstwidth; x++, bits += 3) - XPutPixel( bmpImage, x, lines, - COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0])) ); + if (lines > 0) { + for (h = lines - 1; h >= 0; h--) { + for (x = 0; x < dstwidth; x++, bits += 3) { + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0]))); + } + bits = (srcbits += linebytes); + } + } else { + lines = -lines; + for (h = 0; h < lines; h++) { + for (x = 0; x < dstwidth; x++, bits += 3) { + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0]))); + } + bits = (srcbits += linebytes); + } + } +} - bits = (srcbits += linebytes); + +/*********************************************************************** + * DIB_SetImageBits_32 + * + * SetDIBits for a 32-bit deep DIB. + */ +static void DIB_SetImageBits_32( int lines, const BYTE *srcbits, + DWORD srcwidth, DWORD dstwidth, + DC *dc, XImage *bmpImage ) +{ + DWORD x; + const BYTE *bits = srcbits; + int h; + + DWORD linebytes = (srcwidth * 4); + + if (lines > 0) { + for (h = lines - 1; h >= 0; h--) { + for (x = 0; x < dstwidth; x++, bits += 4) { + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0]))); + } + bits = (srcbits += linebytes); + } + } else { + for (h = 0; h < lines; h++) { + for (x = 0; x < dstwidth; x++, bits += 4) { + XPutPixel( bmpImage, x, h, + COLOR_ToPhysical(dc, RGB(bits[2],bits[1],bits[0]))); + } + bits = (srcbits += linebytes); + } } } @@ -621,6 +753,7 @@ int *colorMapping; XImage *bmpImage; DWORD compression = 0; + int lines; if (descr->info->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) compression = descr->info->bmiHeader.biCompression; @@ -635,7 +768,9 @@ if( descr->dc->w.flags & DC_DIRTY ) CLIPPING_UpdateGCRegion(descr->dc); /* Transfer the pixels */ - XCREATEIMAGE(bmpImage, descr->infoWidth, descr->lines, descr->depth ); + lines = descr->lines; + if (lines < 0) lines = -lines; + XCREATEIMAGE(bmpImage, descr->infoWidth, lines, descr->depth ); switch(descr->infoBpp) { @@ -657,10 +792,19 @@ else DIB_SetImageBits_8( descr->lines, descr->bits, descr->infoWidth, descr->width, colorMapping, bmpImage ); break; + case 15: + case 16: + DIB_SetImageBits_16( descr->lines, descr->bits, descr->infoWidth, + descr->width, descr->dc, bmpImage); + break; case 24: DIB_SetImageBits_24( descr->lines, descr->bits, descr->infoWidth, descr->width, descr->dc, bmpImage ); break; + case 32: + DIB_SetImageBits_32( descr->lines, descr->bits, descr->infoWidth, + descr->width, descr->dc, bmpImage); + break; default: fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp ); break; @@ -670,7 +814,7 @@ descr->xSrc, descr->ySrc, descr->xDest, descr->yDest, descr->width, descr->height ); XDestroyImage( bmpImage ); - return descr->lines; + return lines; } @@ -732,7 +876,7 @@ { DIB_SETIMAGEBITS_DESCR descr; BITMAPOBJ * bmp; - DWORD height; + int height, tmpheight; INT32 result; /* Check parameters */ @@ -755,6 +899,8 @@ GDI_HEAP_UNLOCK( hdc ); return 0; } + tmpheight = height; + if (height < 0) height = -height; if (!lines || (startscan >= height)) { GDI_HEAP_UNLOCK( hbitmap ); @@ -764,7 +910,7 @@ if (startscan + lines > height) lines = height - startscan; descr.bits = bits; - descr.lines = lines; + descr.lines = tmpheight >= 0 ? lines : -lines; descr.depth = bmp->bitmap.bmBitsPixel; descr.info = info; descr.coloruse = coloruse; @@ -807,7 +953,8 @@ { DIB_SETIMAGEBITS_DESCR descr; DC * dc; - DWORD width, height; + DWORD width; + int height, tmpheight; /* Check parameters */ @@ -820,6 +967,8 @@ if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height, &descr.infoBpp ) == -1) return 0; + tmpheight = height; + if (height < 0) height = -height; if (!lines || (startscan >= height)) return 0; if (startscan + lines > height) lines = height - startscan; if (ySrc < startscan) ySrc = startscan; @@ -834,7 +983,7 @@ descr.dc = dc; descr.bits = bits; - descr.lines = lines; + descr.lines = tmpheight >= 0 ? lines : -lines; descr.infoWidth = width; descr.depth = dc->w.bitsPerPixel; descr.info = info; @@ -851,7 +1000,92 @@ return CALL_LARGE_STACK( DIB_SetImageBits, &descr ); } +/*********************************************************************** + * SetDIBColorTable32 (GDI32.311) + */ +UINT32 WINAPI SetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries, + RGBQUAD *colors ) +{ + DC * dc; + PALETTEENTRY * palEntry; + PALETTEOBJ * palette; + RGBQUAD *end; + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } + + if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC ))) + { + return 0; + } + + /* Transfer color info */ + + if (dc->w.bitsPerPixel <= 8) { + palEntry = palette->logpalette.palPalEntry + startpos; + if (startpos + entries > (1 << dc->w.bitsPerPixel)) { + entries = (1 << dc->w.bitsPerPixel) - startpos; + } + for (end = colors + entries; colors < end; palEntry++, colors++) + { + palEntry->peRed = colors->rgbRed; + palEntry->peGreen = colors->rgbGreen; + palEntry->peBlue = colors->rgbBlue; + } + } else { + entries = 0; + } + GDI_HEAP_UNLOCK( dc->w.hPalette ); + return entries; +} + +/*********************************************************************** + * GetDIBColorTable32 (GDI32.169) + */ +UINT32 WINAPI GetDIBColorTable32( HDC32 hdc, UINT32 startpos, UINT32 entries, + RGBQUAD *colors ) +{ + DC * dc; + PALETTEENTRY * palEntry; + PALETTEOBJ * palette; + RGBQUAD *end; + + dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); + if (!dc) + { + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + } + + if (!(palette = (PALETTEOBJ*)GDI_GetObjPtr( dc->w.hPalette, PALETTE_MAGIC ))) + { + return 0; + } + + /* Transfer color info */ + + if (dc->w.bitsPerPixel <= 8) { + palEntry = palette->logpalette.palPalEntry + startpos; + if (startpos + entries > (1 << dc->w.bitsPerPixel)) { + entries = (1 << dc->w.bitsPerPixel) - startpos; + } + for (end = colors + entries; colors < end; palEntry++, colors++) + { + colors->rgbRed = palEntry->peRed; + colors->rgbGreen = palEntry->peGreen; + colors->rgbBlue = palEntry->peBlue; + colors->rgbReserved = 0; + } + } else { + entries = 0; + } + GDI_HEAP_UNLOCK( dc->w.hPalette ); + return entries; +} /*********************************************************************** * GetDIBits16 (GDI.441) @@ -1018,6 +1252,18 @@ bbits += pad; } break; + case 32: + for( y = yend - 1; (int)y >= (int)startscan; y-- ) + { + *bbits = 0; + for( x = 0; x < xend; x++ ) { + unsigned long pixel=XGetPixel( bmpImage, x, y); + *bbits++ = (pixel >>16) & 0xff; + *bbits++ = (pixel >> 8) & 0xff; + *bbits++ = pixel & 0xff; + } + } + break; default: fprintf(stderr,"GetDIBits*: unsupported depth %d\n", info->bmiHeader.biBitCount @@ -1069,10 +1315,12 @@ { HBITMAP32 handle; BOOL32 fColor; - DWORD width, height; + DWORD width; + int height; WORD bpp; if (DIB_GetBitmapInfo( header, &width, &height, &bpp ) == -1) return 0; + if (height < 0) height = -height; /* Check if we should create a monochrome or color bitmap. */ /* We create a monochrome bitmap only if it has exactly 2 */
diff --git a/objects/font.c b/objects/font.c index f65f016..124663e 100644 --- a/objects/font.c +++ b/objects/font.c
@@ -1189,3 +1189,21 @@ return TRUE; } + +/************************************************************************* + * GetFontLanguageInfo (GDI32.182) + */ +DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) { + /* return value 0 is correct for most cases anyway */ + fprintf(stderr,"GetFontLanguageInfo:stub!\n"); + return 0; +} + +/************************************************************************* + * GetFontLanguageInfo (GDI.616) + */ +DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) { + /* return value 0 is correct for most cases anyway */ + fprintf(stderr,"GetFontLanguageInfo:stub!\n"); + return 0; +}
diff --git a/objects/text.c b/objects/text.c index 7844d8a..04f8f8b 100644 --- a/objects/text.c +++ b/objects/text.c
@@ -636,7 +636,7 @@ } /*********************************************************************** - * GetTextCharset (USER32.226) (USER.612) + * GetTextCharset (GDI32.226) (GDI.612) */ INT32 WINAPI GetTextCharset32(HDC32 hdc) { @@ -648,3 +648,15 @@ { return GetTextCharset32(hdc); } + +/*********************************************************************** + * GetTextCharsetInfo (GDI32.381) + */ +INT32 WINAPI GetTextCharsetInfo(HDC32 hdc,LPCHARSETINFO csi,DWORD flags) +{ + fprintf(stdnimp,"GetTextCharsetInfo(0x%x,%p,%08lx), stub!\n",hdc,csi,flags); + csi->ciCharset = DEFAULT_CHARSET; + csi->ciACP = GetACP(); + /* ... fill fontstruct too ... */ + return DEFAULT_CHARSET; +}