📄 gdkdrawable-x11.c
字号:
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 + -