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

📄 gdkcolor-fb.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 2 页
字号:
      && colormap->visual->type != GDK_VISUAL_PSEUDO_COLOR)    return FALSE;  *ret = *color;    gdk_fb_color_round_to_hw (ret);  for (i = 0; i<colormap->size; i++)    {      if (!(private->info[i].flags & GDK_COLOR_WRITEABLE) &&	  (ret->red == colormap->colors[i].red) &&	  (ret->green == colormap->colors[i].green) &&	  (ret->blue == colormap->colors[i].blue))	{	  ret->pixel = i;	  colormap->colors[i].pixel = i;	  if (private->info[i].ref_count == 0)	    g_hash_table_insert (private->hash,				 &colormap->colors[ret->pixel],				 &colormap->colors[ret->pixel]);	  private->info[i].ref_count++;	  return TRUE;	}    }  for (i = 0; i<colormap->size; i++)    {      if (private->info[i].ref_count==0)	{	  guint16 red = color->red, green = color->green, blue = color->blue;	  struct fb_cmap fbc;	  	  fbc.len = 1;	  fbc.start = i;	  fbc.red = &red;	  fbc.green = &green;	  fbc.blue = &blue;	  ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);	  ret->pixel = i;	  colormap->colors[ret->pixel] = *ret;	  private->info[ret->pixel].ref_count = 1;	  g_hash_table_insert (private->hash,			       &colormap->colors[ret->pixel],			       &colormap->colors[ret->pixel]);	  return TRUE;	}    }        return FALSE;}static gintgdk_colormap_alloc_colors_shared (GdkColormap *colormap,				  GdkColor    *colors,				  gint         ncolors,				  gboolean     writeable,				  gboolean     best_match,				  gboolean    *success){  GdkColormapPrivateFB *private;  gint i, index;  gint nremaining = 0;  gint nfailed = 0;  private = GDK_COLORMAP_PRIVATE_DATA (colormap);  index = -1;  for (i = 0; i < ncolors; i++)    {      if (!success[i])	{	  if (gdk_colormap_alloc1 (colormap, &colors[i], &colors[i]))	    success[i] = TRUE;	  else	    nremaining++;	}    }  if (nremaining > 0 && best_match)    {      gchar *available = g_new (gchar, colormap->size);      for (i = 0; i < colormap->size; i++)	available[i] = ((private->info[i].ref_count == 0) ||			!(private->info[i].flags & GDK_COLOR_WRITEABLE));            while (nremaining > 0)	{	  for (i = 0; i < ncolors; i++)	    {	      if (!success[i])		{		  index = gdk_colormap_match_color (colormap, &colors[i], available);		  if (index != -1)		    {		      if (private->info[index].ref_count)			{			  private->info[index].ref_count++;			  colors[i] = colormap->colors[index];			  success[i] = TRUE;			  nremaining--;			}		      else			{			  if (gdk_colormap_alloc1 (colormap, 						   &colormap->colors[index],						   &colors[i]))			    {			      success[i] = TRUE;			      nremaining--;			      break;			    }			  else			    {			      available[index] = FALSE;			    }			}		    }		  else		    {		      nfailed++;		      nremaining--;		      success[i] = 2; /* flag as permanent failure */		    }		}	    }	}      g_free (available);    }  /* Change back the values we flagged as permanent failures */  if (nfailed > 0)    {      for (i = 0; i < ncolors; i++)	if (success[i] == 2)	  success[i] = FALSE;      nremaining = nfailed;    }    return (ncolors - nremaining);}static gintgdk_colormap_alloc_colors_pseudocolor (GdkColormap *colormap,				       GdkColor    *colors,				       gint         ncolors,				       gboolean     writeable,				       gboolean     best_match,				       gboolean    *success){  GdkColormapPrivateFB *private;  GdkColor *lookup_color;  gint i;  gint nremaining = 0;  private = GDK_COLORMAP_PRIVATE_DATA (colormap);  /* Check for an exact match among previously allocated colors */  for (i = 0; i < ncolors; i++)    {      if (!success[i])	{	  lookup_color = g_hash_table_lookup (private->hash, &colors[i]);	  if (lookup_color)	    {	      private->info[lookup_color->pixel].ref_count++;	      colors[i].pixel = lookup_color->pixel;	      success[i] = TRUE;	    }	  else	    nremaining++;	}    }  /* If that failed, we try to allocate a new color, or approxmiate   * with what we can get if best_match is TRUE.   */  if (nremaining > 0)    return gdk_colormap_alloc_colors_shared (colormap, colors, ncolors, writeable, best_match, success);  else    return 0;}gintgdk_colormap_alloc_colors (GdkColormap *colormap,			   GdkColor    *colors,			   gint         ncolors,			   gboolean     writeable,			   gboolean     best_match,			   gboolean    *success){  GdkColormapPrivateFB *private;  GdkVisual *visual;  gint i;  gint nremaining = 0;  g_return_val_if_fail (colormap != NULL, FALSE);  g_return_val_if_fail (colors != NULL, FALSE);  private = GDK_COLORMAP_PRIVATE_DATA (colormap);  for (i = 0; i < ncolors; i++)    success[i] = FALSE;  visual = colormap->visual;  switch (visual->type)    {    case GDK_VISUAL_PSEUDO_COLOR:    case GDK_VISUAL_GRAYSCALE:    case GDK_VISUAL_STATIC_GRAY:    case GDK_VISUAL_STATIC_COLOR:      return gdk_colormap_alloc_colors_pseudocolor (colormap, colors, ncolors,						    writeable, best_match, success);      break;    case GDK_VISUAL_DIRECT_COLOR:    case GDK_VISUAL_TRUE_COLOR:      for (i = 0; i < ncolors; i++)	{	  colors[i].pixel = (((colors[i].red >> (16 - visual->red_prec)) << visual->red_shift) +			     ((colors[i].green >> (16 - visual->green_prec)) << visual->green_shift) +			     ((colors[i].blue >> (16 - visual->blue_prec)) << visual->blue_shift));	  success[i] = TRUE;	}      break;    }  return nremaining;}gbooleangdk_color_change (GdkColormap *colormap,		  GdkColor    *color){  GdkColormapPrivateFB *private;  struct fb_cmap fbc = {0, 1};  g_return_val_if_fail (colormap != NULL, FALSE);  g_return_val_if_fail (color != NULL, FALSE);  private = GDK_COLORMAP_PRIVATE_DATA (colormap);  switch(colormap->visual->type)    {    case GDK_VISUAL_GRAYSCALE:      color->red = color->green = color->blue = (color->red + color->green + color->blue)/3;      /* Fall through */    case GDK_VISUAL_PSEUDO_COLOR:      colormap->colors[color->pixel] = *color;            fbc.start = color->pixel;      fbc.red = &color->red;      fbc.green = &color->green;      fbc.blue = &color->blue;      ioctl (gdk_display->fb_fd, FBIOPUTCMAP, &fbc);      break;    default:      break;    }  return TRUE;}static gintgdk_colormap_match_color (GdkColormap *cmap,			  GdkColor    *color,			  const gchar *available){  GdkColor *colors;  guint sum, max;  gint rdiff, gdiff, bdiff;  gint i, index;  g_return_val_if_fail (cmap != NULL, 0);  g_return_val_if_fail (color != NULL, 0);  colors = cmap->colors;  max = 3 * (65536);  index = -1;  for (i = 0; i < cmap->size; i++)    {      if ((!available) || (available && available[i]))	{	  rdiff = (color->red - colors[i].red);	  gdiff = (color->green - colors[i].green);	  bdiff = (color->blue - colors[i].blue);	  sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);	  if (sum < max)	    {	      index = i;	      max = sum;	    }	}    }  return index;}gbooleangdk_colors_alloc (GdkColormap	*colormap,		  gboolean 	 contiguous,		  gulong	*planes,		  gint		 nplanes,		  gulong	*pixels,		  gint		 npixels){  GdkColormapPrivateFB *private;  gint found, i, col;  g_return_val_if_fail (colormap != NULL, FALSE);  private = GDK_COLORMAP_PRIVATE_DATA (colormap);    if (nplanes > 0)    return FALSE;  found = 0;  for (i = 1; i < colormap->size; i++)    {      if (private->info[i].ref_count == 0)	{	  found++;	  if (found >= npixels)	    break;	}    }  if (found < npixels)    return FALSE;  col = 0;  for (i = 1; i < colormap->size; i++)    {      if (private->info[i].ref_count == 0)	{	  pixels[col++] = i;	  private->info[i].ref_count++;	  private->info[i].flags |= GDK_COLOR_WRITEABLE;	  if (col == npixels)	    return TRUE;	}    }  g_assert_not_reached ();  return FALSE;}voidgdk_colors_free	(GdkColormap	*colormap,		 gulong		*pixels,		 gint		 npixels,		 gulong	 	 planes){  GdkColormapPrivateFB *private;  gint i, pixel;  g_return_if_fail (colormap != NULL);  if ((colormap->visual->type != GDK_VISUAL_PSEUDO_COLOR) &&      (colormap->visual->type != GDK_VISUAL_GRAYSCALE))    return;    private = GDK_COLORMAP_PRIVATE_DATA (colormap);    for (i = 0; i < npixels; i++)    {      pixel = pixels[i];            if (private->info[pixel].ref_count)	{	  private->info[pixel].ref_count--;	  if (private->info[pixel].ref_count == 0)	    {	      if (!(private->info[pixel].flags & GDK_COLOR_WRITEABLE))		g_hash_table_remove (private->hash, &colormap->colors[pixel]);	      private->info[pixel].flags = 0;	    }	}    }}voidgdk_colormap_query_color (GdkColormap *colormap,			  gulong       pixel,			  GdkColor    *result){  GdkVisual *visual;  g_return_if_fail (GDK_IS_COLORMAP (colormap));    visual = gdk_colormap_get_visual (colormap);  switch (visual->type)    {    case GDK_VISUAL_DIRECT_COLOR:    case GDK_VISUAL_TRUE_COLOR:      result->red = 65535. * (gdouble) ((pixel & visual->red_mask) >> visual->red_shift) / ((1 << visual->red_prec) - 1);      result->green = 65535. * (gdouble) ((pixel & visual->green_mask) >> visual->green_shift) / ((1 << visual->green_prec) - 1);      result->blue = 65535. * (gdouble) ((pixel & visual->blue_mask) >> visual->blue_shift) / ((1 << visual->blue_prec) - 1);      break;    case GDK_VISUAL_STATIC_GRAY:    case GDK_VISUAL_GRAYSCALE:      result->red = result->green = result->blue = 65535. * (double)pixel/((1<<visual->depth) - 1);      break;    case GDK_VISUAL_PSEUDO_COLOR:      result->red = colormap->colors[pixel].red;      result->green = colormap->colors[pixel].green;      result->blue = colormap->colors[pixel].blue;      break;    default:      g_assert_not_reached ();      break;    }}GdkScreen*gdk_colormap_get_screen (GdkColormap *cmap){  g_return_val_if_fail (cmap != NULL, NULL);  return gdk_screen_get_default ();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -