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

📄 pixbuf-draw.c

📁 This GTK+ version 2.12.3. GTK+ is a multi-platform toolkit for creating graphical user interfaces.
💻 C
📖 第 1 页 / 共 3 页
字号:
/* GTK+ Pixbuf Engine * Copyright (C) 1998-2000 Red Hat, Inc. * * 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. * * Written by Owen Taylor <otaylor@redhat.com>, based on code by * Carsten Haitzler <raster@rasterman.com> */#include <math.h>#include <string.h>#undef GDK_DISABLE_DEPRECATED#include "pixbuf.h"#include "pixbuf-rc-style.h"#include "pixbuf-style.h"static void pixbuf_style_init       (PixbufStyle      *style);static void pixbuf_style_class_init (PixbufStyleClass *klass);static GtkStyleClass *parent_class = NULL;static ThemeImage *match_theme_image (GtkStyle       *style,		   ThemeMatchData *match_data){  GList *tmp_list;  tmp_list = PIXBUF_RC_STYLE (style->rc_style)->img_list;    while (tmp_list)    {      guint flags;      ThemeImage *image = tmp_list->data;      tmp_list = tmp_list->next;      if (match_data->function != image->match_data.function)	continue;      flags = match_data->flags & image->match_data.flags;            if (flags != image->match_data.flags) /* Required components not present */	continue;      if ((flags & THEME_MATCH_STATE) &&	  match_data->state != image->match_data.state)	continue;      if ((flags & THEME_MATCH_SHADOW) &&	  match_data->shadow != image->match_data.shadow)	continue;            if ((flags & THEME_MATCH_ARROW_DIRECTION) &&	  match_data->arrow_direction != image->match_data.arrow_direction)	continue;      if ((flags & THEME_MATCH_ORIENTATION) &&	  match_data->orientation != image->match_data.orientation)	continue;      if ((flags & THEME_MATCH_GAP_SIDE) &&	  match_data->gap_side != image->match_data.gap_side)	continue;      if ((flags & THEME_MATCH_EXPANDER_STYLE) &&	  match_data->expander_style != image->match_data.expander_style)	continue;      if ((flags & THEME_MATCH_WINDOW_EDGE) &&	  match_data->window_edge != image->match_data.window_edge)	continue;      if (image->match_data.detail &&	  (!match_data->detail ||	   strcmp (match_data->detail, image->match_data.detail) != 0))      continue;      return image;    }    return NULL;}static gbooleandraw_simple_image(GtkStyle       *style,		  GdkWindow      *window,		  GdkRectangle   *area,		  GtkWidget      *widget,		  ThemeMatchData *match_data,		  gboolean        draw_center,		  gboolean        allow_setbg,		  gint            x,		  gint            y,		  gint            width,		  gint            height){  ThemeImage *image;    if ((width == -1) && (height == -1))    gdk_drawable_get_size(window, &width, &height);  else if (width == -1)    gdk_drawable_get_size(window, &width, NULL);  else if (height == -1)    gdk_drawable_get_size(window, NULL, &height);  if (!(match_data->flags & THEME_MATCH_ORIENTATION))    {      match_data->flags |= THEME_MATCH_ORIENTATION;            if (height > width)	match_data->orientation = GTK_ORIENTATION_VERTICAL;      else	match_data->orientation = GTK_ORIENTATION_HORIZONTAL;    }      image = match_theme_image (style, match_data);  if (image)    {      if (image->background)	{	  theme_pixbuf_render (image->background,			       window, NULL, area,			       draw_center ? COMPONENT_ALL : COMPONENT_ALL | COMPONENT_CENTER,			       FALSE,			       x, y, width, height);	}            if (image->overlay && draw_center)	theme_pixbuf_render (image->overlay,			     window, NULL, area, COMPONENT_ALL,			     TRUE, 			     x, y, width, height);      return TRUE;    }  else    return FALSE;}static gbooleandraw_gap_image(GtkStyle       *style,	       GdkWindow      *window,	       GdkRectangle   *area,	       GtkWidget      *widget,	       ThemeMatchData *match_data,	       gboolean        draw_center,	       gint            x,	       gint            y,	       gint            width,	       gint            height,	       GtkPositionType gap_side,	       gint            gap_x,	       gint            gap_width){  ThemeImage *image;    if ((width == -1) && (height == -1))    gdk_drawable_get_size(window, &width, &height);  else if (width == -1)    gdk_drawable_get_size(window, &width, NULL);  else if (height == -1)    gdk_drawable_get_size(window, NULL, &height);  if (!(match_data->flags & THEME_MATCH_ORIENTATION))    {      match_data->flags |= THEME_MATCH_ORIENTATION;            if (height > width)	match_data->orientation = GTK_ORIENTATION_VERTICAL;      else	match_data->orientation = GTK_ORIENTATION_HORIZONTAL;    }  match_data->flags |= THEME_MATCH_GAP_SIDE;  match_data->gap_side = gap_side;      image = match_theme_image (style, match_data);  if (image)    {      gint thickness;      GdkRectangle r1, r2, r3;      GdkPixbuf *pixbuf = NULL;      guint components = COMPONENT_ALL;      if (!draw_center)	components |= COMPONENT_CENTER;      if (image->gap_start)	pixbuf = theme_pixbuf_get_pixbuf (image->gap_start);      switch (gap_side)	{	case GTK_POS_TOP:	  if (pixbuf)	    thickness = gdk_pixbuf_get_height (pixbuf);	  else	    thickness = style->ythickness;	  	  if (!draw_center)	    components |= COMPONENT_NORTH_WEST | COMPONENT_NORTH | COMPONENT_NORTH_EAST;	  r1.x      = x;	  r1.y      = y;	  r1.width  = gap_x;	  r1.height = thickness;	  r2.x      = x + gap_x;	  r2.y      = y;	  r2.width  = gap_width;	  r2.height = thickness;	  r3.x      = x + gap_x + gap_width;	  r3.y      = y;	  r3.width  = width - (gap_x + gap_width);	  r3.height = thickness;	  break;	  	case GTK_POS_BOTTOM:	  if (pixbuf)	    thickness = gdk_pixbuf_get_height (pixbuf);	  else	    thickness = style->ythickness;	  if (!draw_center)	    components |= COMPONENT_SOUTH_WEST | COMPONENT_SOUTH | COMPONENT_SOUTH_EAST;	  r1.x      = x;	  r1.y      = y + height - thickness;	  r1.width  = gap_x;	  r1.height = thickness;	  r2.x      = x + gap_x;	  r2.y      = y + height - thickness;	  r2.width  = gap_width;	  r2.height = thickness;	  r3.x      = x + gap_x + gap_width;	  r3.y      = y + height - thickness;	  r3.width  = width - (gap_x + gap_width);	  r3.height = thickness;	  break;	  	case GTK_POS_LEFT:	  if (pixbuf)	    thickness = gdk_pixbuf_get_width (pixbuf);	  else	    thickness = style->xthickness;	  if (!draw_center)	    components |= COMPONENT_NORTH_WEST | COMPONENT_WEST | COMPONENT_SOUTH_WEST;	  r1.x      = x;	  r1.y      = y;	  r1.width  = thickness;	  r1.height = gap_x;	  r2.x      = x;	  r2.y      = y + gap_x;	  r2.width  = thickness;	  r2.height = gap_width;	  r3.x      = x;	  r3.y      = y + gap_x + gap_width;	  r3.width  = thickness;	  r3.height = height - (gap_x + gap_width);	  break;	  	case GTK_POS_RIGHT:	  if (pixbuf)	    thickness = gdk_pixbuf_get_width (pixbuf);	  else	    thickness = style->xthickness;	  if (!draw_center)	    components |= COMPONENT_NORTH_EAST | COMPONENT_EAST | COMPONENT_SOUTH_EAST;	  r1.x      = x + width - thickness;	  r1.y      = y;	  r1.width  = thickness;	  r1.height = gap_x;	  r2.x      = x + width - thickness;	  r2.y      = y + gap_x;	  r2.width  = thickness;	  r2.height = gap_width;	  r3.x      = x + width - thickness;	  r3.y      = y + gap_x + gap_width;	  r3.width  = thickness;	  r3.height = height - (gap_x + gap_width);	  break;	default:	  g_assert_not_reached ();	}      if (image->background)	theme_pixbuf_render (image->background,			     window, NULL, area, components, FALSE,			     x, y, width, height);      if (image->gap_start)	theme_pixbuf_render (image->gap_start,			     window, NULL, area, COMPONENT_ALL, FALSE,			     r1.x, r1.y, r1.width, r1.height);      if (image->gap)	theme_pixbuf_render (image->gap,			     window, NULL, area, COMPONENT_ALL, FALSE,			     r2.x, r2.y, r2.width, r2.height);      if (image->gap_end)	theme_pixbuf_render (image->gap_end,			     window, NULL, area, COMPONENT_ALL, FALSE,			     r3.x, r3.y, r3.width, r3.height);      return TRUE;    }  else    return FALSE;}static voiddraw_hline (GtkStyle     *style,	    GdkWindow    *window,	    GtkStateType  state,	    GdkRectangle *area,	    GtkWidget    *widget,	    const gchar  *detail,	    gint          x1,	    gint          x2,	    gint          y){  ThemeImage *image;  ThemeMatchData   match_data;    g_return_if_fail(style != NULL);  g_return_if_fail(window != NULL);  match_data.function = TOKEN_D_HLINE;  match_data.detail = (gchar *)detail;  match_data.flags = THEME_MATCH_ORIENTATION | THEME_MATCH_STATE;  match_data.state = state;  match_data.orientation = GTK_ORIENTATION_HORIZONTAL;    image = match_theme_image (style, &match_data);  if (image)    {      if (image->background)	theme_pixbuf_render (image->background,			     window, NULL, area, COMPONENT_ALL, FALSE,			     x1, y, (x2 - x1) + 1, 2);    }  else    parent_class->draw_hline (style, window, state, area, widget, detail,			      x1, x2, y);}static voiddraw_vline (GtkStyle     *style,	    GdkWindow    *window,	    GtkStateType  state,	    GdkRectangle *area,	    GtkWidget    *widget,	    const gchar  *detail,	    gint          y1,	    gint          y2,	    gint          x)

⌨️ 快捷键说明

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