/* null driver fallback implementation for GetSystemPaletteEntries */ UINT nulldrv_GetSystemPaletteEntries( PHYSDEV dev, UINT start, UINT count, PALETTEENTRY *entries ) { if (entries && start < 256) { UINT i; const RGBQUAD *default_entries; if (start + count > 256) count = 256 - start; default_entries = get_default_color_table( 8 ); for (i = 0; i < count; ++i) { if (start + i < 10 || start + i >= 246) { entries[i].peRed = default_entries[start + i].rgbRed; entries[i].peGreen = default_entries[start + i].rgbGreen; entries[i].peBlue = default_entries[start + i].rgbBlue; } else { entries[i].peRed = 0; entries[i].peGreen = 0; entries[i].peBlue = 0; } entries[i].peFlags = 0; } } return 0; }
/*********************************************************************** * CreateHalftonePalette [GDI32.@] * * Creates a halftone palette. * * RETURNS * Success: Handle to logical halftone palette * Failure: 0 * * FIXME: This simply creates the halftone palette derived from running * tests on a windows NT machine. This is assuming a color depth * of greater that 256 color. On a 256 color device the halftone * palette will be different and this function will be incorrect */ HPALETTE WINAPI CreateHalftonePalette( HDC hdc) /* [in] Handle to device context */ { const RGBQUAD *entries = get_default_color_table( 8 ); char buffer[FIELD_OFFSET( LOGPALETTE, palPalEntry[256] )]; LOGPALETTE *pal = (LOGPALETTE *)buffer; int i; pal->palVersion = 0x300; pal->palNumEntries = 256; for (i = 0; i < 256; i++) { pal->palPalEntry[i].peRed = entries[i].rgbRed; pal->palPalEntry[i].peGreen = entries[i].rgbGreen; pal->palPalEntry[i].peBlue = entries[i].rgbBlue; pal->palPalEntry[i].peFlags = 0; } return CreatePalette( pal ); }
/*********************************************************************** * PALETTE_Init * * Create the system palette. */ HPALETTE PALETTE_Init(void) { const RGBQUAD *entries = get_default_color_table( 8 ); char buffer[FIELD_OFFSET( LOGPALETTE, palPalEntry[20] )]; LOGPALETTE *palPtr = (LOGPALETTE *)buffer; int i; /* create default palette (20 system colors) */ palPtr->palVersion = 0x300; palPtr->palNumEntries = 20; for (i = 0; i < 20; i++) { palPtr->palPalEntry[i].peRed = entries[i < 10 ? i : 236 + i].rgbRed; palPtr->palPalEntry[i].peGreen = entries[i < 10 ? i : 236 + i].rgbGreen; palPtr->palPalEntry[i].peBlue = entries[i < 10 ? i : 236 + i].rgbBlue; palPtr->palPalEntry[i].peFlags = 0; } return CreatePalette( palPtr ); }
static void init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields, const RGBQUAD *color_table, void *bits, enum dib_info_flags flags) { dib->bit_count = bi->biBitCount; dib->width = bi->biWidth; dib->height = bi->biHeight; dib->compression = bi->biCompression; dib->stride = get_dib_stride( dib->width, dib->bit_count ); dib->bits.ptr = bits; dib->bits.is_copy = FALSE; dib->bits.free = NULL; dib->bits.param = NULL; if(dib->height < 0) /* top-down */ { dib->height = -dib->height; } else /* bottom-up */ { /* bits always points to the top-left corner and the stride is -ve */ dib->bits.ptr = (BYTE*)dib->bits.ptr + (dib->height - 1) * dib->stride; dib->stride = -dib->stride; } dib->funcs = &funcs_null; switch(dib->bit_count) { case 32: if(bi->biCompression == BI_RGB) bit_fields = bit_fields_888; init_bit_fields(dib, bit_fields); if(dib->red_mask == 0xff0000 && dib->green_mask == 0x00ff00 && dib->blue_mask == 0x0000ff) dib->funcs = &funcs_8888; else dib->funcs = &funcs_32; break; case 24: dib->funcs = &funcs_24; break; case 16: if(bi->biCompression == BI_RGB) bit_fields = bit_fields_555; init_bit_fields(dib, bit_fields); if(dib->red_mask == 0x7c00 && dib->green_mask == 0x03e0 && dib->blue_mask == 0x001f) dib->funcs = &funcs_555; else dib->funcs = &funcs_16; break; case 8: dib->funcs = &funcs_8; break; case 4: dib->funcs = &funcs_4; break; case 1: dib->funcs = &funcs_1; break; } if (color_table && bi->biClrUsed) { dib->color_table = color_table; dib->color_table_size = bi->biClrUsed; } else if (flags & default_color_table) { dib->color_table = get_default_color_table( dib->bit_count ); dib->color_table_size = dib->color_table ? (1 << dib->bit_count) : 0; } else { dib->color_table = NULL; dib->color_table_size = 0; } }