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

📄 gdkpixmap.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include "config.h"#include <stdlib.h>#include <stdio.h>#include <string.h>/* Needed for SEEK_END in SunOS */#include <unistd.h>#include <X11/Xlib.h>#include "gdk.h"#include "gdkprivate.h"typedef struct{  gchar *color_string;  GdkColor color;  gint transparent;} _GdkPixmapColor;typedef struct{  guint ncolors;  GdkColormap *colormap;  gulong pixels[1];} _GdkPixmapInfo;GdkPixmap*gdk_pixmap_new (GdkWindow *window,		gint       width,		gint       height,		gint       depth){  GdkPixmap *pixmap;  GdkWindowPrivate *private;  GdkWindowPrivate *window_private;  g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);  g_return_val_if_fail ((width != 0) && (height != 0), NULL);  if (!window)    window = (GdkWindow*) &gdk_root_parent;  window_private = (GdkWindowPrivate*) window;  if (window_private->destroyed)    return NULL;  if (depth == -1)    depth = gdk_window_get_visual (window)->depth;  private = g_new0 (GdkWindowPrivate, 1);  pixmap = (GdkPixmap*) private;  private->xdisplay = window_private->xdisplay;  private->window_type = GDK_WINDOW_PIXMAP;  private->xwindow = XCreatePixmap (private->xdisplay, window_private->xwindow,				    width, height, depth);  private->colormap = NULL;  private->parent = NULL;  private->x = 0;  private->y = 0;  private->width = width;  private->height = height;  private->resize_count = 0;  private->ref_count = 1;  private->destroyed = 0;  gdk_xid_table_insert (&private->xwindow, pixmap);  return pixmap;}GdkPixmap *gdk_bitmap_create_from_data (GdkWindow   *window,			     const gchar *data,			     gint         width,			     gint         height){  GdkPixmap *pixmap;  GdkWindowPrivate *private;  GdkWindowPrivate *window_private;  g_return_val_if_fail (data != NULL, NULL);  g_return_val_if_fail ((width != 0) && (height != 0), NULL);  if (!window)    window = (GdkWindow*) &gdk_root_parent;  window_private = (GdkWindowPrivate*) window;  if (window_private->destroyed)    return NULL;  private = g_new0 (GdkWindowPrivate, 1);  pixmap = (GdkPixmap*) private;  private->parent = NULL;  private->xdisplay = window_private->xdisplay;  private->window_type = GDK_WINDOW_PIXMAP;  private->x = 0;  private->y = 0;  private->width = width;  private->height = height;  private->resize_count = 0;  private->ref_count = 1;  private->destroyed = FALSE;  private->xwindow = XCreateBitmapFromData (private->xdisplay,					    window_private->xwindow,					    (char *)data, width, height);  gdk_xid_table_insert (&private->xwindow, pixmap);  return pixmap;}GdkPixmap*gdk_pixmap_create_from_data (GdkWindow   *window,			     const gchar *data,			     gint         width,			     gint         height,			     gint         depth,			     GdkColor    *fg,			     GdkColor    *bg){  GdkPixmap *pixmap;  GdkWindowPrivate *private;  GdkWindowPrivate *window_private;  g_return_val_if_fail (data != NULL, NULL);  g_return_val_if_fail (fg != NULL, NULL);  g_return_val_if_fail (bg != NULL, NULL);  g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);  g_return_val_if_fail ((width != 0) && (height != 0), NULL);  if (!window)    window = (GdkWindow*) &gdk_root_parent;  window_private = (GdkWindowPrivate*) window;  if (window_private->destroyed)    return NULL;  if (depth == -1)    depth = gdk_window_get_visual (window)->depth;  private = g_new0 (GdkWindowPrivate, 1);  pixmap = (GdkPixmap*) private;  private->parent = NULL;  private->xdisplay = window_private->xdisplay;  private->window_type = GDK_WINDOW_PIXMAP;  private->x = 0;  private->y = 0;  private->width = width;  private->height = height;  private->resize_count = 0;  private->ref_count = 1;  private->destroyed = FALSE;  private->xwindow = XCreatePixmapFromBitmapData (private->xdisplay,						  window_private->xwindow,						  (char *)data, width, height,						  fg->pixel, bg->pixel, depth);  gdk_xid_table_insert (&private->xwindow, pixmap);  return pixmap;}static gintgdk_pixmap_seek_string (FILE  *infile,                        const gchar *str,                        gint   skip_comments){  char instr[1024];  while (!feof (infile))    {      fscanf (infile, "%1023s", instr);      if (skip_comments == TRUE && strcmp (instr, "/*") == 0)        {          fscanf (infile, "%1023s", instr);          while (!feof (infile) && strcmp (instr, "*/") != 0)            fscanf (infile, "%1023s", instr);          fscanf(infile, "%1023s", instr);        }      if (strcmp (instr, str)==0)        return TRUE;    }  return FALSE;}static gintgdk_pixmap_seek_char (FILE  *infile,                      gchar  c){  gint b, oldb;  while ((b = getc(infile)) != EOF)    {      if (c != b && b == '/')	{	  b = getc (infile);	  if (b == EOF)	    return FALSE;	  else if (b == '*')	/* we have a comment */ 	    {	      b = -1;	      do 		{ 		  oldb = b;		  b = getc (infile); 		  if (b == EOF) 		    return FALSE; 		} 	      while (!(oldb == '*' && b == '/')); 	    }        }      else if (c == b) 	return TRUE;    }  return FALSE;}static gintgdk_pixmap_read_string (FILE  *infile,                        gchar **buffer,			guint *buffer_size){  gint c;  guint cnt = 0, bufsiz, ret = FALSE;  gchar *buf;  buf = *buffer;  bufsiz = *buffer_size;  if (buf == NULL)    {      bufsiz = 10 * sizeof (gchar);      buf = g_new(gchar, bufsiz);    }  do    c = getc (infile);  while (c != EOF && c != '"');  if (c != '"')    goto out;  while ((c = getc(infile)) != EOF)    {      if (cnt == bufsiz)	{	  guint new_size = bufsiz * 2;	  if (new_size > bufsiz)	    bufsiz = new_size;	  else	    goto out;	   	  buf = (gchar *) g_realloc (buf, bufsiz);	  buf[bufsiz-1] = '\0';	}      if (c != '"')        buf[cnt++] = c;      else        {          buf[cnt] = 0;	  ret = TRUE;	  break;        }    } out:  buf[bufsiz-1] = '\0';		/* ensure null termination for errors */  *buffer = buf;  *buffer_size = bufsiz;  return ret;}static gchar*gdk_pixmap_skip_whitespaces (gchar *buffer){  gint32 index = 0;  while (buffer[index] != 0 && (buffer[index] == 0x20 || buffer[index] == 0x09))    index++;  return &buffer[index];}static gchar*gdk_pixmap_skip_string (gchar *buffer){  gint32 index = 0;  while (buffer[index] != 0 && buffer[index] != 0x20 && buffer[index] != 0x09)    index++;  return &buffer[index];}/* Xlib crashed ince at a color name lengths around 125 */#define MAX_COLOR_LEN 120static gchar*gdk_pixmap_extract_color (gchar *buffer){  gint counter, numnames;  gchar *ptr = NULL, ch, temp[128];  gchar color[MAX_COLOR_LEN], *retcol;  gint space;  counter = 0;  while (ptr == NULL)    {      if (buffer[counter] == 'c')        {          ch = buffer[counter + 1];          if (ch == 0x20 || ch == 0x09)            ptr = &buffer[counter + 1];        }      else if (buffer[counter] == 0)        return NULL;      counter++;    }  ptr = gdk_pixmap_skip_whitespaces (ptr);  if (ptr[0] == 0)    return NULL;  else if (ptr[0] == '#')    {      counter = 1;      while (ptr[counter] != 0 &&              ((ptr[counter] >= '0' && ptr[counter] <= '9') ||              (ptr[counter] >= 'a' && ptr[counter] <= 'f') ||              (ptr[counter] >= 'A' && ptr[counter] <= 'F')))        counter++;      retcol = g_new (gchar, counter+1);      strncpy (retcol, ptr, counter);      retcol[counter] = 0;            return retcol;    }  color[0] = 0;  numnames = 0;  space = MAX_COLOR_LEN - 1;  while (space > 0)    {      sscanf (ptr, "%127s", temp);      if (((gint)ptr[0] == 0) ||	  (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||          (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))	{	  break;	}      else        {          if (numnames > 0)	    {	      space -= 1;	      strcat (color, " ");	    }	  strncat (color, temp, space);	  space -= MIN (space, strlen (temp));          ptr = gdk_pixmap_skip_string (ptr);          ptr = gdk_pixmap_skip_whitespaces (ptr);          numnames++;        }    }  retcol = g_strdup (color);  return retcol;}enum buffer_op{  op_header,  op_cmap,  op_body};  static void gdk_xpm_destroy_notify (gpointer data){  _GdkPixmapInfo *info = (_GdkPixmapInfo *)data;  GdkColor color;  int i;  for (i=0; i<info->ncolors; i++)

⌨️ 快捷键说明

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