2 * Unit test suite for palettes
4 * Copyright 2005 Glenn Wurster
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/test.h"
32 static const PALETTEENTRY logpalettedata
[8] = {
33 { 0x10, 0x20, 0x30, PC_NOCOLLAPSE
},
34 { 0x20, 0x30, 0x40, PC_NOCOLLAPSE
},
35 { 0x30, 0x40, 0x50, PC_NOCOLLAPSE
},
36 { 0x40, 0x50, 0x60, PC_NOCOLLAPSE
},
37 { 0x50, 0x60, 0x70, PC_NOCOLLAPSE
},
38 { 0x60, 0x70, 0x80, PC_NOCOLLAPSE
},
39 { 0x70, 0x80, 0x90, PC_NOCOLLAPSE
},
40 { 0x80, 0x90, 0xA0, PC_NOCOLLAPSE
},
43 static void test_DIB_PAL_COLORS(void) {
44 HDC hdc
= GetDC( NULL
);
45 HDC memhdc
= CreateCompatibleDC( hdc
);
46 HBITMAP hbmp
, hbmpOld
;
47 char bmpbuf
[sizeof(BITMAPINFO
) + 10 * sizeof(WORD
)];
48 PBITMAPINFO bmp
= (PBITMAPINFO
)bmpbuf
;
50 char logpalettebuf
[sizeof(LOGPALETTE
) + sizeof(logpalettedata
)];
51 PLOGPALETTE logpalette
= (PLOGPALETTE
)logpalettebuf
;
52 HPALETTE hpal
, hpalOld
;
53 COLORREF setColor
, chkColor
, getColor
;
56 /* Initalize the logical palette with a few colours */
57 logpalette
->palVersion
= 0x300;
58 logpalette
->palNumEntries
= 8;
59 memcpy( logpalette
->palPalEntry
, logpalettedata
, sizeof(logpalettedata
) );
60 hpal
= CreatePalette( logpalette
);
61 hpalOld
= SelectPalette( memhdc
, hpal
, FALSE
);
62 ok( hpalOld
!= NULL
, "error=%d\n", GetLastError() );
64 /* Create a DIB BMP which references colours in the logical palette */
65 memset( bmp
, 0x00, sizeof(BITMAPINFO
) );
66 bmp
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
67 bmp
->bmiHeader
.biWidth
= 1;
68 bmp
->bmiHeader
.biHeight
= 1;
69 bmp
->bmiHeader
.biPlanes
= 1;
70 bmp
->bmiHeader
.biBitCount
= 8;
71 bmp
->bmiHeader
.biCompression
= BI_RGB
;
72 bmp
->bmiHeader
.biClrUsed
= 10;
73 bmp
->bmiHeader
.biClrImportant
= 0;
74 bmpPalPtr
= (WORD
*)&bmp
->bmiColors
;
75 for( i
= 0; i
< 8; i
++ ) {
78 *bmpPalPtr
++ = 8; /* Pointer to logical palette index just outside range */
79 *bmpPalPtr
++ = 19; /* Pointer to bad logical palette index */
81 hbmp
= CreateDIBSection( memhdc
, bmp
, DIB_PAL_COLORS
, 0, 0, 0 );
82 ok( hbmp
!= NULL
, "error=%d\n", GetLastError() );
83 hbmpOld
= SelectObject( memhdc
, hbmp
);
84 ok( hbmpOld
!= NULL
, "error=%d\n", GetLastError() );
86 /* Test with a RGB to DIB_PAL_COLORS */
87 setColor
= RGB( logpalettedata
[1].peRed
, logpalettedata
[1].peGreen
, logpalettedata
[1].peBlue
);
88 SetPixel( memhdc
, 0, 0, setColor
);
89 chkColor
= RGB( logpalettedata
[1].peRed
, logpalettedata
[1].peGreen
, logpalettedata
[1].peBlue
);
90 getColor
= GetPixel( memhdc
, 0, 0 );
91 ok( getColor
== chkColor
, "getColor=%08X\n", (UINT
)getColor
);
93 /* Test with a valid DIBINDEX to DIB_PAL_COLORS */
94 setColor
= DIBINDEX( 2 );
95 SetPixel( memhdc
, 0, 0, setColor
);
96 chkColor
= RGB( logpalettedata
[2].peRed
, logpalettedata
[2].peGreen
, logpalettedata
[2].peBlue
);
97 getColor
= GetPixel( memhdc
, 0, 0 );
98 ok( getColor
== chkColor
, "getColor=%08X\n", (UINT
)getColor
);
100 /* Test with a invalid DIBINDEX to DIB_PAL_COLORS */
101 setColor
= DIBINDEX( 12 );
102 SetPixel( memhdc
, 0, 0, setColor
);
103 chkColor
= RGB( 0, 0, 0 );
104 getColor
= GetPixel( memhdc
, 0, 0 );
105 ok( getColor
== chkColor
, "getColor=%08X\n", (UINT
)getColor
);
107 /* Test for double wraparound on logical palette references from */
108 /* DIBINDEX by DIB_PAL_COLORS. */
109 setColor
= DIBINDEX( 9 );
110 SetPixel( memhdc
, 0, 0, setColor
);
111 chkColor
= RGB( logpalettedata
[3].peRed
, logpalettedata
[3].peGreen
, logpalettedata
[3].peBlue
);
112 getColor
= GetPixel( memhdc
, 0, 0 );
113 ok( getColor
== chkColor
||
114 broken(getColor
== 0), /* win9x */
115 "getColor=%08X\n", (UINT
)getColor
);
117 SelectPalette( memhdc
, hpalOld
, FALSE
);
118 DeleteObject( hpal
);
119 SelectObject( memhdc
, hbmpOld
);
120 DeleteObject( hbmp
);
122 ReleaseDC( NULL
, hdc
);
125 static void test_palette_entries(void)
127 char logpalettebuf
[sizeof(LOGPALETTE
) + sizeof(logpalettedata
)];
128 PLOGPALETTE logpalette
= (PLOGPALETTE
)logpalettebuf
;
131 PALETTEENTRY palEntry
= { 0x1, 0x2, 0x3, 0xff };
132 PALETTEENTRY getEntryResult
;
134 /* Initalize the logical palette with a few colours */
135 logpalette
->palVersion
= 0x300;
136 logpalette
->palNumEntries
= 8;
137 memcpy( logpalette
->palPalEntry
, logpalettedata
, sizeof(logpalettedata
) );
138 hpal
= CreatePalette( logpalette
);
140 /* Set a new entry with peFlags to 0xff */
141 SetPaletteEntries(hpal
, 0, 1, &palEntry
);
143 /* Retrieve the entry to see if GDI32 performs any filtering on peFlags */
144 res
= GetPaletteEntries(hpal
, 0, 1, &getEntryResult
);
145 ok(res
== 1, "GetPaletteEntries should have returned 1 but returned %d\n", res
);
147 ok( palEntry
.peFlags
== getEntryResult
.peFlags
, "palEntry.peFlags (%#x) != getEntryResult.peFlags (%#x)\n", palEntry
.peFlags
, getEntryResult
.peFlags
);
152 test_DIB_PAL_COLORS();
153 test_palette_entries();