示例#1
0
            public void CopyToImage(X11Image image)
            {
                if (image.Height != height || image.Width != width)
                {
                    throw new InvalidOperationException($"Source size ({width} x {height}) does not match image size ({image.Width} x {image.Height}).");
                }

                using (X11Bitmap xBitmap = X11Bitmap.Create(image.Display, image.Visual, width, height))
                {
                    if (pixelFormat == PixelFormat.RGBA_32)
                    {
                        PixelConverter.Convert_RGBA_32BE_To_PARGB_32(dataPtr, stride, xBitmap.ImageData, 4 * width, width, height);
                    }
                    else if (pixelFormat == PixelFormat.RGB_24)
                    {
                        PixelConverter.Convert_RGB_24BE_To_ARGB_32(dataPtr, stride, xBitmap.ImageData, 4 * width, width, height);
                    }
                    else
                    {
                        throw new InvalidOperationException($"Unexpected pixel format: {pixelFormat}.");
                    }

                    var gcValues = new XGCValues();
                    var gc       = LibX11.XCreateGC(image.Display, image.PixmapId, 0, ref gcValues);
                    try
                    {
                        LibX11.XPutImage(image.Display, image.PixmapId, gc, xBitmap.XImage, 0, 0, 0, 0, (uint)width, (uint)height);
                    }
                    finally
                    {
                        LibX11.XFreeGC(image.Display, gc);
                    }
                }
            }
示例#2
0
        public static X11Bitmap Create(IntPtr display, IntPtr visual, int width, int height)
        {
            if (width < 0 || height < 0)
            {
                throw new ArgumentException($"Image dimensions cannot be negative ({width} x {height}).");
            }

            IntPtr imageData = Marshal.AllocHGlobal(4 * width * height);
            IntPtr xImage    = IntPtr.Zero;

            try
            {
                xImage = LibX11.XCreateImage
                         (
                    display,
                    visual,
                    X11Application.RequiredColorDepth,
                    XImageFormat.ZPixmap,
                    0,
                    imageData,
                    (uint)width,
                    (uint)height,
                    X11Application.RequiredColorDepth,
                    width * 4
                         );

                X11Bitmap bitmap = new X11Bitmap(xImage, imageData);

                xImage    = IntPtr.Zero;
                imageData = IntPtr.Zero;

                return(bitmap);
            }
            finally
            {
                if (xImage != IntPtr.Zero)
                {
                    LibX11.XDestroyImage(xImage);
                }
                else if (imageData != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(imageData);
                }
            }
        }
示例#3
0
        public void CopyFromBitmap(Rectangle imageArea, IntPtr bitmap, int bitmapStride)
        {
            // todo: create separate validation ?
            NativeBitmapSourceParameterValidation.CopyToBitmap(this, imageArea, bitmap, bitmapStride, out _);

            using (X11Bitmap xBitmap = X11Bitmap.Create(Display, Visual, imageArea.Width, imageArea.Height))
            {
                PixelConverter.Convert_ARGB_32_To_PARGB_32(bitmap, bitmapStride, xBitmap.ImageData, imageArea.Width * 4, imageArea.Width, imageArea.Height);

                var gcValues = new XGCValues();
                var gc       = LibX11.XCreateGC(Display, PixmapId, 0, ref gcValues);
                try
                {
                    LibX11.XPutImage(Display, PixmapId, gc, xBitmap.XImage, 0, 0, imageArea.X, imageArea.Y, (uint)imageArea.Width, (uint)imageArea.Height);
                }
                finally
                {
                    LibX11.XFreeGC(Display, gc);
                }
            }
        }
示例#4
0
        public void CopyToBitmap(Rectangle imageArea, IntPtr bitmap, int bitmapStride)
        {
            NativeBitmapSourceParameterValidation.CopyToBitmap(this, imageArea, bitmap, bitmapStride, out _);

            using (X11Bitmap xBitmap = X11Bitmap.Create(Display, Visual, imageArea.Width, imageArea.Height))
            {
                LibX11.XGetSubImage(
                    Display,
                    PixmapId,
                    imageArea.X,
                    imageArea.Y,
                    (uint)imageArea.Width,
                    (uint)imageArea.Height,
                    ulong.MaxValue,
                    XImageFormat.ZPixmap,
                    xBitmap.XImage,
                    0,
                    0
                    );

                PixelConverter.Convert_PARGB_32_To_ARGB_32(xBitmap.ImageData, imageArea.Width * 4, bitmap, bitmapStride, imageArea.Width, imageArea.Height);
            }
        }