예제 #1
0
        protected override void Render(RenderTarget rt)
        {
            if (image == null)
            {
                base.Render(rt);
                return;
            }
            rt.Clear(this.SceneColorBrush.Color);

            rt.Transform = Matrix3x2.Identity;

            Size2 imageSize = this.image.PixelSize;

            double scale       = Math.Min((double)(ClientSize.Width - ImagePadding) / imageSize.Width, (double)(ClientSize.Height - ImagePadding) / imageSize.Height);
            int    imageWidth  = (int)(imageSize.Width * scale);
            int    imageHeight = (int)(imageSize.Height * scale);

            var rcBounds = new RectangleF(0, 0, imageSize.Width, imageSize.Height);
            var rcImage  = new RectangleF((ClientSize.Width - imageWidth) / 2, (ClientSize.Height - imageHeight) / 2, imageWidth, imageHeight);

            bool isBGRAImage = image.PixelFormat.Format == SharpDX.DXGI.Format.B8G8R8A8_UNorm;

            if (!isBGRAImage)
            {
                var sz = new Size2F(imageSize.Width, imageSize.Height);
                var rc = new RectangleF(0, 0, imageSize.Width, imageSize.Height);

                if (bgraImageRenderer == null || bgraImageRenderer.Size != sz)
                {
                    SharpDX.Utilities.Dispose(ref bgraImageRenderer);
                    bgraImageRenderer = new BitmapRenderTarget(RenderTarget2D, CompatibleRenderTargetOptions.None, sz);
                }

                bgraImageRenderer.BeginDraw();
                bgraImageRenderer.Clear(Color.Black);
                bgraImageRenderer.AntialiasMode = AntialiasMode.Aliased;
                bgraImageRenderer.FillOpacityMask(this.image, whiteBrush, OpacityMaskContent.Graphics, rc, rc);
                bgraImageRenderer.EndDraw();
            }

            rt.DrawBitmap(isBGRAImage ? image : bgraImageRenderer.Bitmap, rcImage, 1, BitmapInterpolationMode.NearestNeighbor, rcBounds);

            if (ImagePadding != 0)
            {
                rt.DrawRectangle(rcImage, whiteBrush, 1);
            }
        }