1 /* $NetBSD: palette.c,v 1.3 2001/02/25 12:58:38 takemura Exp $ */ 2 3 /*- 4 * Copyright (c) 1999 Shin Takemura. 5 * All rights reserved. 6 * 7 * This software is part of the PocketBSD. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by the PocketBSD project 20 * and its contributors. 21 * 4. Neither the name of the project nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 */ 38 #include <pbsdboot.h> 39 40 #include <dev/hpc/hpccmapvar.h> 41 42 /* 43 * If Windows have no color palette, we have nothing to do here. 44 */ 45 #if ( _WIN32_WCE >= 200 ) // WIN CE Ver 2.00 or greater 46 #define HAVE_COLOR_PALETTE 47 #endif 48 49 #ifndef ASSERT 50 #define ASSERT(a) \ 51 if (!(a)) { \ 52 msg_printf(MSG_ERROR, TEXT("assertion failure"), \ 53 TEXT(#a)); \ 54 } 55 #endif /* !ASSERT */ 56 57 #ifdef HAVE_COLOR_PALETTE 58 enum palette_status palette_succeeded = PAL_ERROR; 59 static void palette_setup(PALETTEENTRY *pal); 60 #else 61 enum palette_status palette_succeeded = PAL_NOERROR; 62 #endif 63 64 static HPALETTE pal = NULL; 65 66 void 67 palette_init(HWND hWnd) 68 { 69 #ifdef HAVE_COLOR_PALETTE 70 HDC hdc; 71 PAINTSTRUCT ps; 72 LOGPALETTE* logpal; 73 74 debug_printf(TEXT("*** palette init ***\n")); 75 76 hdc = BeginPaint(hWnd, &ps); 77 if (GetDeviceCaps(hdc, TECHNOLOGY) == DT_RASDISPLAY && 78 (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) && 79 GetDeviceCaps(hdc, COLORRES) == 8) { 80 ASSERT(GetDeviceCaps(hdc, BITSPIXEL) == 8); 81 ASSERT(GetDeviceCaps(hdc, PLANES) == 1); 82 /* 83 * create logical palette 84 */ 85 logpal = LocalAlloc (LPTR, 86 (sizeof(LOGPALETTE) + 87 sizeof(PALETTEENTRY) * 256)); 88 logpal->palVersion = 0x300; 89 logpal->palNumEntries = 256; 90 palette_setup(logpal->palPalEntry); 91 92 pal = CreatePalette(logpal); 93 if (pal == NULL) { 94 debug_printf(TEXT("CreatePalette() failed")); 95 msg_printf(MSG_ERROR, TEXT("Error"), 96 TEXT("CreatePalette() failed: %d"), 97 GetLastError()); 98 } 99 LocalFree((HLOCAL)logpal); 100 } else { 101 /* 102 * The screen is not 8 bit depth nor indexed color. 103 */ 104 palette_succeeded = PAL_NOERROR; 105 } 106 EndPaint(hWnd, &ps); 107 #endif /* HAVE_COLOR_PALETTE */ 108 } 109 110 #ifdef HAVE_COLOR_PALETTE 111 static void 112 palette_setup(PALETTEENTRY *pal) 113 { 114 int i; 115 116 for (i = 0; i < 256; i++) { 117 pal[i].peFlags = PC_EXPLICIT; 118 pal[i].peRed = bivideo_cmap_r[i]; 119 pal[i].peGreen = bivideo_cmap_g[i]; 120 pal[i].peBlue = bivideo_cmap_b[i]; 121 } 122 } 123 #endif /* HAVE_COLOR_PALETTE */ 124 125 void 126 palette_set(HWND hWnd) 127 { 128 #ifdef HAVE_COLOR_PALETTE 129 int n; 130 HDC hdc; 131 PAINTSTRUCT ps; 132 HPALETTE prev_pal; 133 134 debug_printf(TEXT("*** palette set ***\n")); 135 136 if (pal != NULL) { 137 hdc = BeginPaint(hWnd, &ps); 138 prev_pal = SelectPalette(hdc, pal, FALSE); 139 if (prev_pal == NULL) { 140 debug_printf(TEXT("SelectPalette() failed")); 141 msg_printf(MSG_ERROR, TEXT("Error"), 142 TEXT("SelectPalette() failed: %d"), 143 GetLastError()); 144 } else { 145 n = RealizePalette(hdc); 146 debug_printf(TEXT("RealizePalette() = %d\n"), n); 147 if (n == GDI_ERROR) { 148 debug_printf(TEXT("RealizePalette() failed")); 149 msg_printf(MSG_ERROR, TEXT("Error"), 150 TEXT("RealizePalette() failed: %d"), 151 GetLastError()); 152 } 153 } 154 EndPaint(hWnd, &ps); 155 } 156 #endif /* HAVE_COLOR_PALETTE */ 157 } 158 159 void 160 palette_check(HWND hWnd) 161 { 162 #ifdef HAVE_COLOR_PALETTE 163 HDC hdc; 164 PAINTSTRUCT ps; 165 PALETTEENTRY syspal[256]; 166 PALETTEENTRY canonpal[256]; 167 int i, n, error; 168 169 debug_printf(TEXT("*** palette check ***\n")); 170 171 error = 0; 172 if (pal != NULL) { 173 hdc = BeginPaint(hWnd, &ps); 174 175 palette_setup(canonpal); 176 177 n = GetSystemPaletteEntries(hdc, 0, 256, syspal); 178 if (n == 0) { 179 msg_printf(MSG_ERROR, TEXT("Error"), 180 TEXT("GetSystemPaletteEntries() failed: %d"), 181 GetLastError()); 182 error++; 183 } else { 184 for (i = 0; i < n; i++) { 185 debug_printf(TEXT("%3d: %02x %02x %02x"), 186 i, 187 syspal[i].peRed, 188 syspal[i].peGreen, 189 syspal[i].peBlue); 190 if (syspal[i].peRed != canonpal[i].peRed || 191 syspal[i].peGreen != canonpal[i].peGreen || 192 syspal[i].peBlue != canonpal[i].peBlue ) { 193 debug_printf(TEXT(" *")); 194 error++; 195 } 196 debug_printf(TEXT("\n")); 197 } 198 } 199 EndPaint(hWnd, &ps); 200 if (error) { 201 palette_succeeded = PAL_ERROR; 202 } else { 203 palette_succeeded = PAL_SUCCEEDED; 204 } 205 } 206 #endif /* HAVE_COLOR_PALETTE */ 207 } 208