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

📄 gdkdrawable-x11.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
		  XRenderPictFormat *format,		  XRenderPictFormat *mask_format,		  guchar            *src_rgb,		  gint               src_rowstride,		  gint               dest_x,		  gint               dest_y,		  gint               width,		  gint               height){  GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;  Display *xdisplay = GDK_SCREEN_XDISPLAY (screen);  GdkImage *image;  GdkPixmap *pix;  GdkGC *pix_gc;  Picture pict;  Picture dest_pict;  Picture mask = None;  gint x0, y0;  pix = gdk_pixmap_new (gdk_screen_get_root_window (screen), width, height, 32);						    pict = XRenderCreatePicture (xdisplay, 			       GDK_PIXMAP_XID (pix),			       format, 0, NULL);  if (mask_format)    mask = XRenderCreatePicture (xdisplay, 				 GDK_PIXMAP_XID (pix),				 mask_format, 0, NULL);  dest_pict = gdk_x11_drawable_get_picture (drawable);      pix_gc = _gdk_drawable_get_scratch_gc (pix, FALSE);  for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)    {      gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);      for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)	{	  gint xs0, ys0;	  	  gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);	  	  image = _gdk_image_get_scratch (screen, width1, height1, 32, &xs0, &ys0);	  	  _gdk_x11_convert_to_format (src_rgb + y0 * src_rowstride + 4 * x0, src_rowstride,                                      (guchar *)image->mem + ys0 * image->bpl + xs0 * image->bpp, image->bpl,                                      format_type, image->byte_order,                                       width1, height1);	  gdk_draw_image (pix, pix_gc,			  image, xs0, ys0, x0, y0, width1, height1);	}    }    XRenderComposite (xdisplay, PictOpOver, pict, mask, dest_pict, 		    0, 0, 0, 0, dest_x, dest_y, width, height);  XRenderFreePicture (xdisplay, pict);  if (mask)    XRenderFreePicture (xdisplay, mask);    g_object_unref (pix);}typedef struct _ShmPixmapInfo ShmPixmapInfo;struct _ShmPixmapInfo{  GdkImage *image;  Pixmap    pix;  Picture   pict;  Picture   mask;};/* Returns FALSE if we can't get a shm pixmap */static gbooleanget_shm_pixmap_for_image (Display           *xdisplay,			  GdkImage          *image,			  XRenderPictFormat *format,			  XRenderPictFormat *mask_format,			  Pixmap            *pix,			  Picture           *pict,			  Picture           *mask){  ShmPixmapInfo *info;    if (image->type != GDK_IMAGE_SHARED)    return FALSE;    info = g_object_get_data (G_OBJECT (image), "gdk-x11-shm-pixmap");  if (!info)    {      *pix = _gdk_x11_image_get_shm_pixmap (image);            if (!*pix)	return FALSE;            info = g_new (ShmPixmapInfo, 1);      info->pix = *pix;            info->pict = XRenderCreatePicture (xdisplay, info->pix,					 format, 0, NULL);      if (mask_format)	info->mask = XRenderCreatePicture (xdisplay, info->pix,					   mask_format, 0, NULL);      else	info->mask = None;      g_object_set_data (G_OBJECT (image), "gdk-x11-shm-pixmap", info);    }  *pix = info->pix;  *pict = info->pict;  *mask = info->mask;  return TRUE;}#ifdef USE_SHM/* Returns FALSE if drawing with ShmPixmaps is not possible */static gbooleandraw_with_pixmaps (GdkDrawable       *drawable,		   GdkGC             *gc,		   GdkX11FormatType   format_type,		   XRenderPictFormat *format,		   XRenderPictFormat *mask_format,		   guchar            *src_rgb,		   gint               src_rowstride,		   gint               dest_x,		   gint               dest_y,		   gint               width,		   gint               height){  Display *xdisplay = GDK_SCREEN_XDISPLAY (GDK_DRAWABLE_IMPL_X11 (drawable)->screen);  GdkImage *image;  Pixmap pix;  Picture pict;  Picture dest_pict;  Picture mask = None;  gint x0, y0;  dest_pict = gdk_x11_drawable_get_picture (drawable);    for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)    {      gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);      for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)	{	  gint xs0, ys0;	  	  gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);	  	  image = _gdk_image_get_scratch (GDK_DRAWABLE_IMPL_X11 (drawable)->screen,					  width1, height1, 32, &xs0, &ys0);	  if (!get_shm_pixmap_for_image (xdisplay, image, format, mask_format, &pix, &pict, &mask))	    return FALSE;	  _gdk_x11_convert_to_format (src_rgb + y0 * src_rowstride + 4 * x0, src_rowstride,                                      (guchar *)image->mem + ys0 * image->bpl + xs0 * image->bpp, image->bpl,                                      format_type, image->byte_order,                                       width1, height1);	  XRenderComposite (xdisplay, PictOpOver, pict, mask, dest_pict, 			    xs0, ys0, xs0, ys0, x0 + dest_x, y0 + dest_y,			    width1, height1);	}    }  return TRUE;}#endifstatic voidgdk_x11_draw_pixbuf (GdkDrawable     *drawable,		     GdkGC           *gc,		     GdkPixbuf       *pixbuf,		     gint             src_x,		     gint             src_y,		     gint             dest_x,		     gint             dest_y,		     gint             width,		     gint             height,		     GdkRgbDither     dither,		     gint             x_dither,		     gint             y_dither){  GdkX11FormatType format_type;  XRenderPictFormat *format, *mask_format;  gint rowstride;#ifdef USE_SHM    gboolean use_pixmaps = TRUE;#endif /* USE_SHM */      format_type = select_format (gdk_drawable_get_display (drawable),			       &format, &mask_format);  if (format_type == GDK_X11_FORMAT_NONE ||      !gdk_pixbuf_get_has_alpha (pixbuf) ||      gdk_drawable_get_depth (drawable) == 1 ||      (dither == GDK_RGB_DITHER_MAX && gdk_drawable_get_depth (drawable) != 24) ||      gdk_x11_drawable_get_picture (drawable) == None)    {      GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper;      GDK_DRAWABLE_CLASS (parent_class)->draw_pixbuf (wrapper, gc, pixbuf,						      src_x, src_y, dest_x, dest_y,						      width, height,						      dither, x_dither, y_dither);      return;    }  gdk_x11_drawable_update_xft_clip (drawable, gc);  rowstride = gdk_pixbuf_get_rowstride (pixbuf);#ifdef USE_SHM  if (use_pixmaps)    {      if (!draw_with_pixmaps (drawable, gc,			      format_type, format, mask_format,			      gdk_pixbuf_get_pixels (pixbuf) + src_y * rowstride + src_x * 4,			      rowstride,			      dest_x, dest_y, width, height))	use_pixmaps = FALSE;    }  if (!use_pixmaps)#endif /* USE_SHM */    draw_with_images (drawable, gc,		      format_type, format, mask_format,		      gdk_pixbuf_get_pixels (pixbuf) + src_y * rowstride + src_x * 4,		      rowstride,		      dest_x, dest_y, width, height);}static voidgdk_x11_draw_trapezoids (GdkDrawable  *drawable,			 GdkGC	      *gc,			 GdkTrapezoid *trapezoids,			 gint          n_trapezoids){  GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;  GdkDisplay *display = gdk_screen_get_display (screen);  XTrapezoid *xtrapezoids;  gint i;  if (!_gdk_x11_have_render_with_trapezoids (display))    {      GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper;      GDK_DRAWABLE_CLASS (parent_class)->draw_trapezoids (wrapper, gc,							  trapezoids, n_trapezoids);      return;    }  xtrapezoids = g_new (XTrapezoid, n_trapezoids);  for (i = 0; i < n_trapezoids; i++)    {      xtrapezoids[i].top = XDoubleToFixed (trapezoids[i].y1);      xtrapezoids[i].bottom = XDoubleToFixed (trapezoids[i].y2);      xtrapezoids[i].left.p1.x = XDoubleToFixed (trapezoids[i].x11);      xtrapezoids[i].left.p1.y = XDoubleToFixed (trapezoids[i].y1);      xtrapezoids[i].left.p2.x = XDoubleToFixed (trapezoids[i].x12);      xtrapezoids[i].left.p2.y = XDoubleToFixed (trapezoids[i].y2);      xtrapezoids[i].right.p1.x = XDoubleToFixed (trapezoids[i].x21);      xtrapezoids[i].right.p1.y = XDoubleToFixed (trapezoids[i].y1);      xtrapezoids[i].right.p2.x = XDoubleToFixed (trapezoids[i].x22);      xtrapezoids[i].right.p2.y = XDoubleToFixed (trapezoids[i].y2);    }  _gdk_x11_drawable_draw_xtrapezoids (drawable, gc,				      xtrapezoids, n_trapezoids);    g_free (xtrapezoids);}/** * gdk_draw_rectangle_alpha_libgtk_only: * @drawable: The #GdkDrawable to draw on * @x: the x coordinate of the left edge of the rectangle. * @y: the y coordinate of the top edge of the rectangle. * @width: the width of the rectangle. * @height: the height of the rectangle. * @color: The color * @alpha: The alpha value. *  * Tries to draw a filled alpha blended rectangle using the window * system's native routines. This is not public API and must not be * used by applications. *  * Return value: TRUE if the rectangle could be drawn, FALSE * otherwise. **/gbooleangdk_draw_rectangle_alpha_libgtk_only (GdkDrawable  *drawable,				      gint          x,				      gint          y,				      gint          width,				      gint          height,				      GdkColor     *color,				      guint16       alpha){  Display *xdisplay;  XRenderColor render_color;  Picture pict;  int x_offset, y_offset;  GdkDrawable *real_drawable, *impl;  g_return_val_if_fail (color != NULL, FALSE);    if (!GDK_IS_WINDOW (drawable))    return FALSE;    if (!_gdk_x11_have_render (gdk_drawable_get_display (drawable)))    return FALSE;  gdk_window_get_internal_paint_info (GDK_WINDOW (drawable),				      &real_drawable,				      &x_offset, &y_offset);  impl = ((GdkWindowObject *)real_drawable)->impl;          pict = gdk_x11_drawable_get_picture (impl);  if (pict == None)    return FALSE;    xdisplay = GDK_DISPLAY_XDISPLAY (gdk_drawable_get_display (drawable));  render_color.alpha = alpha;  render_color.red = (guint32)color->red * render_color.alpha / 0xffff;  render_color.green = (guint32)color->green * render_color.alpha / 0xffff;  render_color.blue = (guint32)color->blue * render_color.alpha / 0xffff;  XRenderFillRectangle (xdisplay,			PictOpOver, pict, &render_color,			x - x_offset, y - y_offset,			width, height);  return TRUE;}void_gdk_x11_drawable_draw_xtrapezoids (GdkDrawable      *drawable,				    GdkGC            *gc,				    XTrapezoid       *xtrapezoids,				    int               n_trapezoids){  GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;  GdkDisplay *display = gdk_screen_get_display (screen);  GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display);     XftDraw *draw;  if (!_gdk_x11_have_render_with_trapezoids (display))    {      /* This is the case of drawing the borders of the unknown glyph box       * without render on the display, we need to feed it back to       * fallback code. Not efficient, but doesn't matter.       */      GdkTrapezoid *trapezoids = g_new (GdkTrapezoid, n_trapezoids);      int i;      for (i = 0; i < n_trapezoids; i++)	{	  trapezoids[i].y1 = XFixedToDouble (xtrapezoids[i].top);	  trapezoids[i].y2 = XFixedToDouble (xtrapezoids[i].bottom);	  trapezoids[i].x11 = XFixedToDouble (xtrapezoids[i].left.p1.x);	  trapezoids[i].x12 = XFixedToDouble (xtrapezoids[i].left.p2.x);	  trapezoids[i].x21 = XFixedToDouble (xtrapezoids[i].right.p1.x);	  trapezoids[i].x22 = XFixedToDouble (xtrapezoids[i].right.p2.x);	}      gdk_x11_draw_trapezoids (drawable, gc, trapezoids, n_trapezoids);      g_free (trapezoids);      return;    }  gdk_x11_drawable_update_xft_clip (drawable, gc);  draw = gdk_x11_drawable_get_xft_draw (drawable);  if (!x11display->mask_format)    x11display->mask_format = XRenderFindStandardFormat (x11display->xdisplay,							 PictStandardA8);  XRenderCompositeTrapezoids (x11display->xdisplay, PictOpOver,			      _gdk_x11_gc_get_fg_picture (gc),			      XftDrawPicture (draw),			      x11display->mask_format,			      - gc->ts_x_origin, - gc->ts_y_origin,			      xtrapezoids, n_trapezoids);}void_gdk_x11_drawable_draw_xft_glyphs (GdkDrawable      *drawable,				   GdkGC            *gc,				   XftFont          *xft_font,				   XftGlyphSpec     *glyphs,				   gint              n_glyphs){  GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;  GdkDisplay *display = gdk_screen_get_display (screen);  GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display);  XftDraw *draw;     gdk_x11_drawable_update_xft_clip (drawable, gc);  draw = gdk_x11_drawable_get_xft_draw (drawable);  if (_gdk_x11_have_render (display))    {      XftGlyphSpecRender (x11display->xdisplay, PictOpOver,			  _gdk_x11_gc_get_fg_picture (gc),			  xft_font,			  XftDrawPicture (draw),			  - gc->ts_x_origin, - gc->ts_y_origin,			  glyphs, n_glyphs);    }  else    {      XftColor color;            _gdk_gc_x11_get_fg_xft_color (gc, &color);      XftDrawGlyphSpec (draw, &color, xft_font, glyphs, n_glyphs);    }}#define __GDK_DRAWABLE_X11_C__#include "gdkaliasdef.c"

⌨️ 快捷键说明

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