Пример #1
0
        public static Surface CreateSurface(Gdk.Drawable d)
        {
            d.GetSize(out var width, out var height);
            var surface = new XlibSurface(GdkUtils.GetXDisplay(d.Display),
                                          GdkUtils.GetXid(d),
                                          GdkUtils.GetXVisual(d.Visual),
                                          width, height);

            return(surface);
        }
        public static Surface CreateSurface(Gdk.Drawable d)
        {
            int width, height;

            d.GetSize(out width, out height);
            XlibSurface surface = new XlibSurface(GdkUtils.GetXDisplay(d.Display),
                                                  (IntPtr)GdkUtils.GetXid(d),
                                                  GdkUtils.GetXVisual(d.Visual),
                                                  width, height);

            return(surface);
        }
        public static Cairo.Context CreateDrawable(Gdk.Drawable drawable, bool double_buffered)
        {
            int x, y, w, h, d;

            Cairo.Surface surface;
            bool          needs_xlate;

            ((Gdk.Window)drawable).GetGeometry(out x, out y, out w, out h, out d);

            PlatformID os = Environment.OSVersion.Platform;

            needs_xlate = drawable is Gdk.Window && double_buffered;

            if (needs_xlate)
            {
                ((Gdk.Window)drawable).GetInternalPaintInfo(out drawable, out x, out y);
            }

            if (os == PlatformID.Win32Windows || os == PlatformID.Win32NT ||
                os == PlatformID.Win32S || os == PlatformID.WinCE)
            {
                Gdk.GC gcc   = new Gdk.GC(drawable);
                IntPtr windc = gdk_win32_hdc_get(drawable.Handle, gcc.Handle, 0);
                surface = new Win32Surface(windc);

                if (double_buffered)
                {
                    gdk_win32_hdc_release(drawable.Handle, gcc.Handle, 0);
                }
            }
            else
            {
                IntPtr display   = gdk_x11_drawable_get_xdisplay(drawable.Handle);
                IntPtr visual    = gdk_drawable_get_visual(drawable.Handle);
                IntPtr xvisual   = gdk_x11_visual_get_xvisual(visual);
                IntPtr xdrawable = gdk_x11_drawable_get_xid(drawable.Handle);
                surface = new XlibSurface(display, xdrawable, xvisual, w, h);
            }

            Cairo.Context ctx = new Cairo.Context(surface);

            if (needs_xlate)
            {
                ctx.Translate(-(double)x, -(double)y);
            }
            return(ctx);
        }
        public static void SetSourceDrawable(Context ctx, Gdk.Drawable d, double x, double y)
        {
            try {
                gdk_cairo_set_source_pixmap(ctx.Handle, d.Handle, x, y);
            } catch (EntryPointNotFoundException) {
                int width, height;
                d.GetSize(out width, out height);
                XlibSurface surface = new XlibSurface(GdkUtils.GetXDisplay(d.Display),
                                                      (IntPtr)GdkUtils.GetXid(d),
                                                      GdkUtils.GetXVisual(d.Visual),
                                                      width, height);

                SurfacePattern p = new SurfacePattern(surface);
                Matrix         m = new Matrix();
                m.Translate(-x, -y);
                p.Matrix   = m;
                ctx.Source = p;
            }
        }