示例#1
0
        public void BitmapCompressFullResize()
        {
            var b1 = new PixelBitmapContent <Color>(16, 16);

            Fill(b1, Color.Red);
            var b2 = new Dxt1BitmapContent(8, 8);

            BitmapContent.Copy(b1, b2);
        }
        void BitmapCompressFullResize <T>(T color1)
            where T : struct, IEquatable <T>
        {
            var b1 = new PixelBitmapContent <T>(16, 16);

            Fill(b1, color1);
            var b2 = new Dxt1BitmapContent(8, 8);

            BitmapContent.Copy(b1, b2);
        }
        /// <summary>
        /// Converts a DigitalRune <see cref="Image"/> to an XNA <see cref="BitmapContent"/>.
        /// </summary>
        /// <param name="image">The <see cref="Image"/>.</param>
        /// <returns>The <see cref="BitmapContent"/>.</returns>
        public static BitmapContent ToContent(Image image)
        {
            BitmapContent content;

            switch (image.Format)
            {
            case DataFormat.R8G8B8A8_UNORM:
            case DataFormat.R8G8B8A8_UNORM_SRGB:
                content = new PixelBitmapContent <Color>(image.Width, image.Height);
                break;

            case DataFormat.B5G6R5_UNORM:
                content = new PixelBitmapContent <Bgr565>(image.Width, image.Height);
                break;

#if !MONOGAME
            case DataFormat.B5G5R5A1_UNORM:
                content = new PixelBitmapContent <Bgra5551>(image.Width, image.Height);
                break;
#endif
            case DataFormat.B4G4R4A4_UNORM:
                content = new PixelBitmapContent <Bgra4444>(image.Width, image.Height);
                break;

            case DataFormat.BC1_UNORM:
            case DataFormat.BC1_UNORM_SRGB:
                content = new Dxt1BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.BC2_UNORM:
            case DataFormat.BC2_UNORM_SRGB:
                content = new Dxt3BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.BC3_UNORM:
            case DataFormat.BC3_UNORM_SRGB:
                content = new Dxt5BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.R8G8_SNORM:
                content = new PixelBitmapContent <NormalizedByte2>(image.Width, image.Height);
                break;

            case DataFormat.R8G8B8A8_SNORM:
                content = new PixelBitmapContent <NormalizedByte4>(image.Width, image.Height);
                break;

#if !MONOGAME
            case DataFormat.R10G10B10A2_UNORM:
                content = new PixelBitmapContent <Rgba1010102>(image.Width, image.Height);
                break;

            case DataFormat.R16G16_UNORM:
                content = new PixelBitmapContent <Rg32>(image.Width, image.Height);
                break;

            case DataFormat.R16G16B16A16_UNORM:
                content = new PixelBitmapContent <Rgba64>(image.Width, image.Height);
                break;

            case DataFormat.A8_UNORM:
            case DataFormat.R8_UNORM:
                content = new PixelBitmapContent <Alpha8>(image.Width, image.Height);
                break;
#endif
            case DataFormat.R32_FLOAT:
                content = new PixelBitmapContent <float>(image.Width, image.Height);
                break;

            case DataFormat.R32G32_FLOAT:
                content = new PixelBitmapContent <Vector2>(image.Width, image.Height);
                break;

            case DataFormat.R32G32B32A32_FLOAT:
                content = new PixelBitmapContent <Vector4>(image.Width, image.Height);
                break;

            case DataFormat.R16_FLOAT:
                content = new PixelBitmapContent <HalfSingle>(image.Width, image.Height);
                break;

            case DataFormat.R16G16_FLOAT:
                content = new PixelBitmapContent <HalfVector2>(image.Width, image.Height);
                break;

            case DataFormat.R16G16B16A16_FLOAT:
                content = new PixelBitmapContent <HalfVector4>(image.Width, image.Height);
                break;

#if MONOGAME
            case DataFormat.PVRTCI_2bpp_RGB:
                content = new PvrtcRgb2BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.PVRTCI_4bpp_RGB:
                content = new PvrtcRgb4BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.PVRTCI_2bpp_RGBA:
                content = new PvrtcRgba2BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.PVRTCI_4bpp_RGBA:
                content = new PvrtcRgba4BitmapContent(image.Width, image.Height);
                break;

            case DataFormat.ETC1:
                content = new Etc1BitmapContent(image.Width, image.Height);
                break;

            //case DataFormat.ATC_RGB: Not supported in MonoGame.
            case DataFormat.ATC_RGBA_EXPLICIT_ALPHA:
                content = new AtcExplicitBitmapContent(image.Width, image.Height);
                break;

            case DataFormat.ATC_RGBA_INTERPOLATED_ALPHA:
                content = new AtcInterpolatedBitmapContent(image.Width, image.Height);
                break;
#endif

            default:
                string message = string.Format("The texture format {0} is not supported in MonoGame.", image.Format);
                throw new NotSupportedException(message);

                // Not supported:
                //  SurfaceFormat.HdrBlendable  // Only needed as render target format.
                //  SurfaceFormat.Bgr32         // Only used as WPF render target.
                //  SurfaceFormat.Bgra32        // Only used as WPF render target.
                //  SurfaceFormat.Dxt1a
            }

            Debug.Assert(content != null);
#if !MONOGAME
            // content.GetPixelData() is null in MonoGame.
            Debug.Assert(image.Data.Length == content.GetPixelData().Length);
#endif

            content.SetPixelData(image.Data);
            return(content);
        }