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

📄 gdkdrawable-x11.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
  PangoRenderer *renderer;  impl = GDK_DRAWABLE_IMPL_X11 (drawable);  g_return_if_fail (PANGO_XFT_IS_FONT (font));  renderer = _gdk_x11_renderer_get (drawable, gc);  if (matrix)    pango_renderer_set_matrix (renderer, matrix);  pango_renderer_draw_glyphs (renderer, font, glyphs, x, y);  if (matrix)    pango_renderer_set_matrix (renderer, NULL);}static voidgdk_x11_draw_image     (GdkDrawable     *drawable,                        GdkGC           *gc,                        GdkImage        *image,                        gint             xsrc,                        gint             ysrc,                        gint             xdest,                        gint             ydest,                        gint             width,                        gint             height){  GdkDrawableImplX11 *impl;  impl = GDK_DRAWABLE_IMPL_X11 (drawable);#ifdef USE_SHM    if (image->type == GDK_IMAGE_SHARED)    XShmPutImage (GDK_SCREEN_XDISPLAY (impl->screen), impl->xid,                  GDK_GC_GET_XGC (gc), GDK_IMAGE_XIMAGE (image),                  xsrc, ysrc, xdest, ydest, width, height, False);  else#endif    XPutImage (GDK_SCREEN_XDISPLAY (impl->screen), impl->xid,               GDK_GC_GET_XGC (gc), GDK_IMAGE_XIMAGE (image),               xsrc, ysrc, xdest, ydest, width, height);}static gintgdk_x11_get_depth (GdkDrawable *drawable){  /* This is a bit bogus but I'm not sure the other way is better */  return gdk_drawable_get_depth (GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper);}static GdkDrawable *get_impl_drawable (GdkDrawable *drawable){  if (GDK_IS_WINDOW (drawable))    return ((GdkWindowObject *)drawable)->impl;  else if (GDK_IS_PIXMAP (drawable))    return ((GdkPixmapObject *)drawable)->impl;  else    {      g_warning (G_STRLOC " drawable is not a pixmap or window");      return NULL;    }}static GdkScreen*gdk_x11_get_screen (GdkDrawable *drawable){  if (GDK_IS_DRAWABLE_IMPL_X11 (drawable))    return GDK_DRAWABLE_IMPL_X11 (drawable)->screen;  else    return GDK_DRAWABLE_IMPL_X11 (get_impl_drawable (drawable))->screen;}static GdkVisual*gdk_x11_get_visual (GdkDrawable    *drawable){  return gdk_drawable_get_visual (GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper);}/** * gdk_x11_drawable_get_xdisplay: * @drawable: a #GdkDrawable. *  * Returns the display of a #GdkDrawable. *  * Return value: an Xlib <type>Display*</type>. **/Display *gdk_x11_drawable_get_xdisplay (GdkDrawable *drawable){  if (GDK_IS_DRAWABLE_IMPL_X11 (drawable))    return GDK_SCREEN_XDISPLAY (GDK_DRAWABLE_IMPL_X11 (drawable)->screen);  else    return GDK_SCREEN_XDISPLAY (GDK_DRAWABLE_IMPL_X11 (get_impl_drawable (drawable))->screen);}/** * gdk_x11_drawable_get_xid: * @drawable: a #GdkDrawable. *  * Returns the X resource (window or pixmap) belonging to a #GdkDrawable. *  * Return value: the ID of @drawable's X resource. **/XIDgdk_x11_drawable_get_xid (GdkDrawable *drawable){  GdkDrawable *impl;    if (GDK_IS_WINDOW (drawable))    impl = ((GdkPixmapObject *)drawable)->impl;  else if (GDK_IS_PIXMAP (drawable))    impl = ((GdkPixmapObject *)drawable)->impl;  else    {      g_warning (G_STRLOC " drawable is not a pixmap or window");      return None;    }  return ((GdkDrawableImplX11 *)impl)->xid;}/* Code for accelerated alpha compositing using the RENDER extension. * It's a bit long because there are lots of possibilities for * what's the fastest depending on the available picture formats, * whether we can used shared pixmaps, etc. */static GdkX11FormatTypeselect_format (GdkDisplay         *display,	       XRenderPictFormat **format,	       XRenderPictFormat **mask){  Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);  XRenderPictFormat pf;  if (!_gdk_x11_have_render (display))    return GDK_X11_FORMAT_NONE;    /* Look for a 32-bit xRGB and Axxx formats that exactly match the   * in memory data format. We can use them as pixmap and mask   * to deal with non-premultiplied data.   */  pf.type = PictTypeDirect;  pf.depth = 32;  pf.direct.redMask = 0xff;  pf.direct.greenMask = 0xff;  pf.direct.blueMask = 0xff;    pf.direct.alphaMask = 0;  if (ImageByteOrder (xdisplay) == LSBFirst)    {      /* ABGR */      pf.direct.red = 0;      pf.direct.green = 8;      pf.direct.blue = 16;    }  else    {      /* RGBA */      pf.direct.red = 24;      pf.direct.green = 16;      pf.direct.blue = 8;    }    *format = XRenderFindFormat (xdisplay,			       (PictFormatType | PictFormatDepth |				PictFormatRedMask | PictFormatRed |				PictFormatGreenMask | PictFormatGreen |				PictFormatBlueMask | PictFormatBlue |				PictFormatAlphaMask),			       &pf,			       0);  pf.direct.alphaMask = 0xff;  if (ImageByteOrder (xdisplay) == LSBFirst)    {      /* ABGR */      pf.direct.alpha = 24;    }  else    {      pf.direct.alpha = 0;    }    *mask = XRenderFindFormat (xdisplay,			     (PictFormatType | PictFormatDepth |			      PictFormatAlphaMask | PictFormatAlpha),			     &pf,			     0);  if (*format && *mask)    return GDK_X11_FORMAT_EXACT_MASK;  /* OK, that failed, now look for xRGB and Axxx formats in   * RENDER's preferred order   */  pf.direct.alphaMask = 0;  /* ARGB */  pf.direct.red = 16;  pf.direct.green = 8;  pf.direct.blue = 0;    *format = XRenderFindFormat (xdisplay,			       (PictFormatType | PictFormatDepth |				PictFormatRedMask | PictFormatRed |				PictFormatGreenMask | PictFormatGreen |				PictFormatBlueMask | PictFormatBlue |				PictFormatAlphaMask),			       &pf,			       0);  pf.direct.alphaMask = 0xff;  pf.direct.alpha = 24;    *mask = XRenderFindFormat (xdisplay,			     (PictFormatType | PictFormatDepth |			      PictFormatAlphaMask | PictFormatAlpha),			     &pf,			     0);  if (*format && *mask)    return GDK_X11_FORMAT_ARGB_MASK;  /* Finally, if neither of the above worked, fall back to   * looking for combined ARGB -- we'll premultiply ourselves.   */  pf.type = PictTypeDirect;  pf.depth = 32;  pf.direct.red = 16;  pf.direct.green = 8;  pf.direct.blue = 0;  pf.direct.alphaMask = 0xff;  pf.direct.alpha = 24;  *format = XRenderFindFormat (xdisplay,			       (PictFormatType | PictFormatDepth |				PictFormatRedMask | PictFormatRed |				PictFormatGreenMask | PictFormatGreen |				PictFormatBlueMask | PictFormatBlue |				PictFormatAlphaMask | PictFormatAlpha),			       &pf,			       0);  *mask = NULL;  if (*format)    return GDK_X11_FORMAT_ARGB;  return GDK_X11_FORMAT_NONE;}#if 0static voidlist_formats (XRenderPictFormat *pf){  gint i;    for (i=0 ;; i++)    {      XRenderPictFormat *pf = XRenderFindFormat (impl->xdisplay, 0, NULL, i);      if (pf)	{	  g_print ("%2d R-%#06x/%#06x G-%#06x/%#06x B-%#06x/%#06x A-%#06x/%#06x\n",		   pf->depth,		   pf->direct.red,		   pf->direct.redMask,		   pf->direct.green,		   pf->direct.greenMask,		   pf->direct.blue,		   pf->direct.blueMask,		   pf->direct.alpha,		   pf->direct.alphaMask);	}      else	break;    }}#endif  void_gdk_x11_convert_to_format (guchar           *src_buf,                            gint              src_rowstride,                            guchar           *dest_buf,                            gint              dest_rowstride,                            GdkX11FormatType  dest_format,                            GdkByteOrder      dest_byteorder,                            gint              width,                            gint              height){  gint i;  for (i=0; i < height; i++)    {      switch (dest_format)	{	case GDK_X11_FORMAT_EXACT_MASK:	  {	    memcpy (dest_buf + i * dest_rowstride,		    src_buf + i * src_rowstride,		    width * 4);	    break;	  }	case GDK_X11_FORMAT_ARGB_MASK:	  {	    guchar *row = src_buf + i * src_rowstride;	    if (((gsize)row & 3) != 0)	      {		guchar *p = row;		guint32 *q = (guint32 *)(dest_buf + i * dest_rowstride);		guchar *end = p + 4 * width;		while (p < end)		  {		    *q = (p[3] << 24) | (p[0] << 16) | (p[1] << 8) | p[2];		    p += 4;		    q++;		  }	      }	    else	      {		guint32 *p = (guint32 *)row;		guint32 *q = (guint32 *)(dest_buf + i * dest_rowstride);		guint32 *end = p + width;#if G_BYTE_ORDER == G_LITTLE_ENDIAN	    		if (dest_byteorder == GDK_LSB_FIRST)		  {		    /* ABGR => ARGB */				    while (p < end)		      {			*q = ( (*p & 0xff00ff00) |			       ((*p & 0x000000ff) << 16) |			       ((*p & 0x00ff0000) >> 16));			q++;			p++;		      }		  }		else		  {		    /* ABGR => BGRA */				    while (p < end)		      {			*q = (((*p & 0xff000000) >> 24) |			      ((*p & 0x00ffffff) << 8));			q++;			p++;		      }		  }#else /* G_BYTE_ORDER == G_BIG_ENDIAN */		if (dest_byteorder == GDK_LSB_FIRST)		  {		    /* RGBA => BGRA */				    while (p < end)		      {			*q = ( (*p & 0x00ff00ff) |			       ((*p & 0x0000ff00) << 16) |			       ((*p & 0xff000000) >> 16));			q++;			p++;		      }		  }		else		  {		    /* RGBA => ARGB */				    while (p < end)		      {			*q = (((*p & 0xffffff00) >> 8) |			      ((*p & 0x000000ff) << 24));			q++;			p++;		      }		  }#endif /* G_BYTE_ORDER*/	    	      }	    break;	  }	case GDK_X11_FORMAT_ARGB:	  {	    guchar *p = (src_buf + i * src_rowstride);	    guchar *q = (dest_buf + i * dest_rowstride);	    guchar *end = p + 4 * width;	    guint t1,t2,t3;	    #define MULT(d,c,a,t) G_STMT_START { t = c * a; d = ((t >> 8) + t) >> 8; } G_STMT_END	    	    if (dest_byteorder == GDK_LSB_FIRST)	      {		while (p < end)		  {		    MULT(q[0], p[2], p[3], t1);		    MULT(q[1], p[1], p[3], t2);		    MULT(q[2], p[0], p[3], t3);		    q[3] = p[3];		    p += 4;		    q += 4;		  }	      }	    else	      {		while (p < end)		  {		    q[0] = p[3];		    MULT(q[1], p[0], p[3], t1);		    MULT(q[2], p[1], p[3], t2);		    MULT(q[3], p[2], p[3], t3);		    p += 4;		    q += 4;		  }	      }#undef MULT	    break;	  }	case GDK_X11_FORMAT_NONE:	  g_assert_not_reached ();	  break;	}    }}static voiddraw_with_images (GdkDrawable       *drawable,		  GdkGC             *gc,		  GdkX11FormatType   format_type,

⌨️ 快捷键说明

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