📄 gdkpixmap.c
字号:
/* 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 + -