⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdk-pixbuf-xlibrgb.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 5 页
字号:
/** * 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 + -