|  |  | 
|  | /* | 
|  | *  Visual control | 
|  | * | 
|  | *  (C) Copyright 2001 Geert Uytterhoeven | 
|  | * | 
|  | *  This file is subject to the terms and conditions of the GNU General Public | 
|  | *  License. See the file COPYING in the main directory of this archive for | 
|  | *  more details. | 
|  | */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #include "types.h" | 
|  | #include "visual.h" | 
|  | #include "visops.h" | 
|  | #include "fb.h" | 
|  | #include "util.h" | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  Set the visual | 
|  | */ | 
|  |  | 
|  | int visual_set(enum visual_id id) | 
|  | { | 
|  | return visops.set_visual(id); | 
|  | } | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  Monochrome | 
|  | */ | 
|  |  | 
|  | pixel_t black_pixel, white_pixel; | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  Grayscale | 
|  | */ | 
|  |  | 
|  | u32 gray_len, gray_bits; | 
|  | const pixel_t *gray_pixel; | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  CLUT for Pseudocolor and Directcolor | 
|  | */ | 
|  |  | 
|  | u32 idx_len, idx_bits; | 
|  | const pixel_t *idx_pixel; | 
|  | rgba_t *clut; | 
|  |  | 
|  |  | 
|  | void clut_update(void) | 
|  | { | 
|  | if (visops.update_cmap) | 
|  | visops.update_cmap(); | 
|  | } | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  RGB(A) for Truecolor and DirectColor | 
|  | */ | 
|  |  | 
|  | u32 red_len, green_len, blue_len, alpha_len; | 
|  | u32 red_bits, green_bits, blue_bits, alpha_bits; | 
|  | const pixel_t *red_pixel, *green_pixel, *blue_pixel, *alpha_pixel; | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  Reverse the bits in a 32-bit word | 
|  | */ | 
|  |  | 
|  | static u32 reverse32(u32 x) | 
|  | { | 
|  | x = ((x & 0xffff0000) >> 16) | ((x & 0x0000ffff) << 16); | 
|  | x = ((x & 0xff00ff00) >>  8) | ((x & 0x00ff00ff) <<  8); | 
|  | x = ((x & 0xf0f0f0f0) >>  4) | ((x & 0x0f0f0f0f) <<  4); | 
|  | x = ((x & 0xcccccccc) >>  2) | ((x & 0x33333333) <<  2); | 
|  | x = ((x & 0xaaaaaaaa) >>  1) | ((x & 0x55555555) <<  1); | 
|  | return x; | 
|  | } | 
|  |  | 
|  |  | 
|  | /* | 
|  | *  Create an indexed table for one color component, based on the color | 
|  | *  bitfield | 
|  | */ | 
|  |  | 
|  | pixel_t *create_component_table(u32 size, u32 offset, int msb_right, u32 bpp) | 
|  | { | 
|  | pixel_t *table, pixel; | 
|  | int i; | 
|  |  | 
|  | if (!size) | 
|  | return NULL; | 
|  |  | 
|  | table = malloc(size*sizeof(pixel_t)); | 
|  | for (i = 0; i < size; i++) { | 
|  | pixel = i<<offset; | 
|  | table[i] = msb_right ? reverse32(pixel)>>(32-bpp) : pixel; | 
|  | } | 
|  | return table; | 
|  | } | 
|  |  |