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

📄 gdkpixmap.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    {      color.pixel = info->pixels[i];      gdk_colormap_free_colors (info->colormap, &color, 1);    }  gdk_colormap_unref (info->colormap);  g_free (info);}  static GdkPixmap *_gdk_pixmap_create_from_xpm (GdkWindow  *window,			     GdkColormap *colormap,			     GdkBitmap **mask,			     GdkColor   *transparent_color,			     gchar *   (*get_buf) (enum buffer_op op,						   gpointer       handle),			     gpointer    handle){  GdkPixmap *pixmap = NULL;  GdkImage *image = NULL;  GdkVisual *visual;  GdkGC *gc = NULL;  GdkColor tmp_color;  gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;  gchar *buffer, pixel_str[32];  gchar *name_buf;  _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;  _GdkPixmapColor *colors = NULL;  gulong index;  GHashTable *color_hash = NULL;  _GdkPixmapInfo *color_info = NULL;    if ((window == NULL) && (colormap == NULL))    g_warning ("Creating pixmap from xpm with NULL window and colormap");    if (window == NULL)    window = (GdkWindow *)&gdk_root_parent;    if (colormap == NULL)    {      colormap = gdk_window_get_colormap (window);      visual = gdk_window_get_visual (window);    }  else    visual = ((GdkColormapPrivate *)colormap)->visual;    buffer = (*get_buf) (op_header, handle);  if (buffer == NULL)    return NULL;    sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);  if (cpp >= 32)    {      g_warning ("Pixmap has more than 31 characters per color\n");      return NULL;    }    color_hash = g_hash_table_new (g_str_hash, g_str_equal);    if (transparent_color == NULL)    {      gdk_color_white (colormap, &tmp_color);      transparent_color = &tmp_color;    }  /* For pseudo-color and grayscale visuals, we have to remember   * the colors we allocated, so we can free them later.   */  if ((visual->type == GDK_VISUAL_PSEUDO_COLOR) ||      (visual->type == GDK_VISUAL_GRAYSCALE))    {      color_info = g_malloc (sizeof (_GdkPixmapInfo) + 			     sizeof(gulong) * (num_cols - 1));      color_info->ncolors = num_cols;      color_info->colormap = colormap;      gdk_colormap_ref (colormap);    }  name_buf = g_new (gchar, num_cols * (cpp+1));  colors = g_new (_GdkPixmapColor, num_cols);  for (cnt = 0; cnt < num_cols; cnt++)    {      gchar *color_name;            buffer = (*get_buf) (op_cmap, handle);      if (buffer == NULL)	goto error;            color = &colors[cnt];      color->color_string = &name_buf [cnt * (cpp + 1)];      strncpy (color->color_string, buffer, cpp);      color->color_string[cpp] = 0;      buffer += strlen (color->color_string);      color->transparent = FALSE;            color_name = gdk_pixmap_extract_color (buffer);            if (color_name == NULL || g_strcasecmp (color_name, "None") == 0 ||	  gdk_color_parse (color_name, &color->color) == FALSE)	{	  color->color = *transparent_color;	  color->transparent = TRUE;	}            g_free (color_name);            /* FIXME: The remaining slowness appears to happen in this         function. */      gdk_color_alloc (colormap, &color->color);      if (color_info)	color_info->pixels[cnt] = color->color.pixel;            g_hash_table_insert (color_hash, color->color_string, color);      if (cnt == 0)	fallbackcolor = color;    }    index = 0;  image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);    if (mask)    {      /* The pixmap mask is just a bits pattern.       * Color 0 is used for background and 1 for foreground.       * We don't care about the colormap, we just need 0 and 1.       */      GdkColor mask_pattern;            *mask = gdk_pixmap_new (window, width, height, 1);      gc = gdk_gc_new (*mask);            mask_pattern.pixel = 0;      gdk_gc_set_foreground (gc, &mask_pattern);      gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);            mask_pattern.pixel = 1;      gdk_gc_set_foreground (gc, &mask_pattern);    }    wbytes = width * cpp;  for (ycnt = 0; ycnt < height; ycnt++)    {      buffer = (*get_buf) (op_body, handle);            /* FIXME: this slows things down a little - it could be       * integrated into the strncpy below, perhaps. OTOH, strlen       * is fast.       */      if ((buffer == NULL) || strlen (buffer) < wbytes)	continue;            for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)	{	  strncpy (pixel_str, &buffer[n], cpp);	  pixel_str[cpp] = 0;	  ns = 0;	  	  color = g_hash_table_lookup (color_hash, pixel_str);	  	  if (!color) /* screwed up XPM file */	    color = fallbackcolor;	  	  gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);	  	  if (mask && color->transparent)	    {	      if (cnt < xcnt)		gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);	      cnt = xcnt + 1;	    }	}            if (mask && (cnt < xcnt))	gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);    }   error:    if (mask)    gdk_gc_destroy (gc);    if (image != NULL)    {      pixmap = gdk_pixmap_new (window, width, height, visual->depth);      if (color_info)	gdk_drawable_set_data (pixmap, "gdk-xpm", color_info, 			       gdk_xpm_destroy_notify);            gc = gdk_gc_new (pixmap);      gdk_gc_set_foreground (gc, transparent_color);      gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);      gdk_gc_destroy (gc);      gdk_image_destroy (image);    }  else if (color_info)    gdk_xpm_destroy_notify (color_info);    if (color_hash != NULL)    g_hash_table_destroy (color_hash);  if (colors != NULL)    g_free (colors);  if (name_buf != NULL)    g_free (name_buf);  return pixmap;}struct file_handle{  FILE *infile;  gchar *buffer;  guint buffer_size;};static gchar *file_buffer (enum buffer_op op, gpointer handle){  struct file_handle *h = handle;  switch (op)    {    case op_header:      if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)	break;      if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)	break;      /* Fall through to the next gdk_pixmap_seek_char. */    case op_cmap:      gdk_pixmap_seek_char (h->infile, '"');      fseek (h->infile, -1, SEEK_CUR);      /* Fall through to the gdk_pixmap_read_string. */    case op_body:      gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);      return h->buffer;    }  return 0;}GdkPixmap*gdk_pixmap_colormap_create_from_xpm (GdkWindow   *window,				     GdkColormap *colormap,				     GdkBitmap  **mask,				     GdkColor    *transparent_color,				     const gchar *filename){  struct file_handle h;  GdkPixmap *pixmap = NULL;  memset (&h, 0, sizeof (h));  h.infile = fopen (filename, "rb");  if (h.infile != NULL)    {      pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,					    transparent_color,					    file_buffer, &h);      fclose (h.infile);      g_free (h.buffer);    }  return pixmap;}GdkPixmap*gdk_pixmap_create_from_xpm (GdkWindow  *window,			    GdkBitmap **mask,			    GdkColor   *transparent_color,			    const gchar *filename){  return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,				       transparent_color, filename);}struct mem_handle{  gchar **data;  int offset;};static gchar *mem_buffer (enum buffer_op op, gpointer handle){  struct mem_handle *h = handle;  switch (op)    {    case op_header:    case op_cmap:    case op_body:      if (h->data[h->offset])	return h->data[h->offset ++];    }  return 0;}GdkPixmap*gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,				       GdkColormap *colormap,				       GdkBitmap **mask,				       GdkColor   *transparent_color,				       gchar     **data){  struct mem_handle h;  GdkPixmap *pixmap = NULL;  memset (&h, 0, sizeof (h));  h.data = data;  pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,					transparent_color,					mem_buffer, &h);  return pixmap;}GdkPixmap*gdk_pixmap_create_from_xpm_d (GdkWindow  *window,			      GdkBitmap **mask,			      GdkColor   *transparent_color,			      gchar     **data){  return gdk_pixmap_colormap_create_from_xpm_d (window, NULL, mask,						transparent_color, data);}GdkPixmap*gdk_pixmap_foreign_new (guint32 anid){  GdkPixmap *pixmap;  GdkWindowPrivate *window_private;  GdkWindowPrivate *private;  Pixmap xpixmap;  Window root_return;  unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;  /* check to make sure we were passed something at     least a little sane */  g_return_val_if_fail((anid != 0), NULL);    /* set the pixmap to the passed in value */  xpixmap = anid;  /* get the root window */  window_private = &gdk_root_parent;  /* get information about the Pixmap to fill in the structure for     the gdk window */  if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return,		    &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))      return NULL;        /* allocate a new gdk pixmap */  private = g_new(GdkWindowPrivate, 1);  pixmap = (GdkPixmap *)private;  private->xdisplay = window_private->xdisplay;  private->window_type = GDK_WINDOW_PIXMAP;  private->xwindow = xpixmap;  private->colormap = NULL;  private->parent = NULL;  private->x = 0;  private->y = 0;  private->width = w_ret;  private->height = h_ret;  private->resize_count = 0;  private->ref_count = 1;  private->destroyed = 0;    gdk_xid_table_insert(&private->xwindow, pixmap);  return pixmap;}GdkPixmap*gdk_pixmap_ref (GdkPixmap *pixmap){  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;  g_return_val_if_fail (pixmap != NULL, NULL);  private->ref_count += 1;  return pixmap;}voidgdk_pixmap_unref (GdkPixmap *pixmap){  GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;  g_return_if_fail (pixmap != NULL);  g_return_if_fail (private->ref_count > 0);  private->ref_count -= 1;  if (private->ref_count == 0)    {      XFreePixmap (private->xdisplay, private->xwindow);      gdk_xid_table_remove (private->xwindow);      g_dataset_destroy (private);      g_free (private);    }}GdkBitmap *gdk_bitmap_ref (GdkBitmap *bitmap){  return (GdkBitmap *)gdk_pixmap_ref ((GdkPixmap *)bitmap);}voidgdk_bitmap_unref (GdkBitmap *bitmap){  gdk_pixmap_unref ((GdkPixmap *)bitmap);}

⌨️ 快捷键说明

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