?? gdk-pixbuf-xlibrgb.c
字號:
/** * xlib_rgb_init_with_depth: * @display: X display to use. * @screen: Screen to use. * @prefDepth: Visual depth to use for color substitution tables. This must * be one of the supported visual depths in the specified @display. * * Initializes the XlibRGB machinery with a particular depth you specify, * instead of automatically picking the best depth in the display. This * function or xlib_rgb_init() must be called before using any of the other * functions in XlibRGB. **/voidxlib_rgb_init_with_depth (Display *display, Screen *screen, int prefDepth){ int i; static const int byte_order[1] = { 1 }; static int initialized = 0; if (initialized) { return; } initialized = 1; /* check endian sanity */#if G_BYTE_ORDER == G_BIG_ENDIAN if (((char *)byte_order)[0] == 1) { printf ("xlib_rgb_init: compiled for big endian, but this is a little endian machine.\n\n"); exit(1); }#else if (((char *)byte_order)[0] != 1) { printf ("xlib_rgb_init: compiled for little endian, but this is a big endian machine.\n\n"); exit(1); }#endif if (image_info == NULL) { image_info = malloc(sizeof(XlibRgbInfo)); memset(image_info, 0, sizeof(XlibRgbInfo)); image_info->display = display; image_info->screen = screen; image_info->screen_num = XScreenNumberOfScreen(screen); image_info->x_visual_info = NULL; image_info->cmap = 0; image_info->default_visualid = DefaultVisual(display, image_info->screen_num); image_info->default_colormap = DefaultColormap(display, image_info->screen_num); image_info->color_pixels = NULL; image_info->gray_pixels = NULL; image_info->reserved_pixels = NULL; image_info->nred_shades = 6; image_info->ngreen_shades = 6; image_info->nblue_shades = 4; image_info->ngray_shades = 24; image_info->nreserved = 0; image_info->bpp = 0; image_info->cmap_alloced = FALSE; image_info->gamma_val = 1.0; image_info->stage_buf = NULL; image_info->own_gc = NULL; image_info->red_shift = 0; image_info->red_prec = 0; image_info->green_shift = 0; image_info->green_prec = 0; image_info->blue_shift = 0; image_info->blue_prec = 0; if (prefDepth != -1) xlib_rgb_choose_visual_for_xprint (prefDepth); else xlib_rgb_choose_visual (); if ((image_info->x_visual_info->class == PseudoColor || image_info->x_visual_info->class == StaticColor) && image_info->x_visual_info->depth < 8 && image_info->x_visual_info->depth >= 3) { image_info->cmap = image_info->default_colormap; xlib_rgb_colorcube_222 (); } else if (image_info->x_visual_info->class == PseudoColor) { if (xlib_rgb_install_cmap || image_info->x_visual_info->visualid != image_info->default_visualid->visualid) { image_info->cmap = XCreateColormap(image_info->display, RootWindow(image_info->display, image_info->screen_num), image_info->x_visual_info->visual, AllocNone); image_info->cmap_alloced = TRUE; } if (!xlib_rgb_do_colormaps ()) { image_info->cmap = XCreateColormap(image_info->display, RootWindow(image_info->display, image_info->screen_num), image_info->x_visual_info->visual, AllocNone); image_info->cmap_alloced = TRUE; xlib_rgb_do_colormaps (); } if (xlib_rgb_verbose) printf ("color cube: %d x %d x %d\n", image_info->nred_shades, image_info->ngreen_shades, image_info->nblue_shades); if (!image_info->cmap_alloced) image_info->cmap = image_info->default_colormap; }#ifdef ENABLE_GRAYSCALE else if (image_info->x_visual_info->class == GrayScale) { image_info->cmap = XCreateColormap(image_info->display, RootWindow(image_info->display, image_info->screen_num), image_info->x_visual_info->visual, AllocNone); xlib_rgb_set_gray_cmap (image_info->cmap); image_info->cmap_alloced = TRUE; }#endif else { /* Always install colormap in direct color. */ if (image_info->x_visual_info->class != DirectColor && image_info->x_visual_info->visualid == image_info->default_visualid->visualid) image_info->cmap = image_info->default_colormap; else { image_info->cmap = XCreateColormap(image_info->display, RootWindow(image_info->display, image_info->screen_num), image_info->x_visual_info->visual, AllocNone); image_info->cmap_alloced = TRUE; } } image_info->bitmap = (image_info->x_visual_info->depth == 1); for (i = 0; i < N_IMAGES; i++) { if (image_info->bitmap) { /* Use malloc() instead of g_malloc since X will free() this mem */ static_image[i] = XCreateImage(image_info->display, image_info->x_visual_info->visual, 1, XYBitmap, 0, NULL, IMAGE_WIDTH, IMAGE_HEIGHT, 8, 0); static_image[i]->data = malloc(IMAGE_WIDTH * IMAGE_HEIGHT >> 3); static_image[i]->bitmap_bit_order = MSBFirst; static_image[i]->byte_order = MSBFirst; } else { static_image[i] = XCreateImage(image_info->display, image_info->x_visual_info->visual, (unsigned int)image_info->x_visual_info->depth, ZPixmap, 0, NULL, IMAGE_WIDTH, IMAGE_HEIGHT, 32, 0); /* remove this when we are using shared memory.. */ static_image[i]->data = malloc((size_t)IMAGE_WIDTH * IMAGE_HEIGHT * image_info->x_visual_info->depth); static_image[i]->bitmap_bit_order = MSBFirst; static_image[i]->byte_order = MSBFirst; } } /* ok, so apparently, image_info->bpp is actually BYTES per pixel. What fun! */ switch (static_image[0]->bits_per_pixel) { case 1: case 8: image_info->bpp = 1; break; case 16: image_info->bpp = 2; break; case 24: image_info->bpp = 3; break; case 32: image_info->bpp = 4; break; } xlib_rgb_select_conv (static_image[0], MSB_FIRST); }}/** * xlib_rgb_xpixel_from_rgb: * @rgb: 32-bit representation of an RGB value, specified as 0x00RRGGBB. * * Converts an RGB triplet into the closest color that XlibRGB visual can * handle. * * Return value: X pixel value that corresponds to the closest color in the * XlibRGB visual and colormap. **/unsigned longxlib_rgb_xpixel_from_rgb (guint32 rgb){ unsigned long pixel = 0; if (image_info->bitmap) { return ((rgb & 0xff0000) >> 16) + ((rgb & 0xff00) >> 7) + (rgb & 0xff) > 510; } else if (image_info->x_visual_info->class == PseudoColor) pixel = colorcube[((rgb & 0xf00000) >> 12) | ((rgb & 0xf000) >> 8) | ((rgb & 0xf0) >> 4)]; else if (image_info->x_visual_info->depth < 8 && image_info->x_visual_info->class == StaticColor) { pixel = colorcube_d[((rgb & 0x800000) >> 17) | ((rgb & 0x8000) >> 12) | ((rgb & 0x80) >> 7)]; } else if (image_info->x_visual_info->class == TrueColor || image_info->x_visual_info->class == DirectColor) {#ifdef VERBOSE printf ("shift, prec: r %d %d g %d %d b %d %d\n", image_info->red_shift, image_info->red_prec, image_info->green_shift, image_info->green_prec, image_info->blue_shift, image_info->blue_prec);#endif pixel = (((((rgb & 0xff0000) >> 16) >> (8 - image_info->red_prec)) << image_info->red_shift) + ((((rgb & 0xff00) >> 8) >> (8 - image_info->green_prec)) << image_info->green_shift) +
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -