static public Texture2D LoadBitmap(string imageName, int w, int h)
    {
        //
        // Load a bitmap image through writeablebitmap so that we can populate our device
        // texture
        //

        StreamResourceInfo sr = Application.GetResourceStream(new Uri(imageName, UriKind.Relative));
        BitmapImage        bs = new BitmapImage();

        bs.SetSource(sr.Stream);

        var wb = new WriteableBitmap(w, h);

        ScaleTransform t = new ScaleTransform();

        t.ScaleX = (double)w / (double)bs.PixelWidth;
        t.ScaleY = (double)h / (double)bs.PixelHeight;

        Image image = new Image();

        image.Source = bs;
        wb.Render(image, t);
        wb.Invalidate();

        Texture2D tex = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, wb.PixelWidth, wb.PixelHeight, false, SurfaceFormat.Color);

        wb.CopyTo(tex);

        return(tex);
    }
    private static Texture2D LoadBitmapAndMip(Stream stream)
    {
        var bs = new BitmapImage();

        bs.SetSource(stream);

        // Get dimensions
        int w = bs.PixelWidth;
        int h = bs.PixelHeight;

        if ((w % 2 != 0 && w != 1) || (h % 2 != 0 && h != 1))
        {
            throw new InvalidOperationException("Bitmap must be power of 2.");
        }

        // Calculate mip levels
        int mipLevels    = 1;
        int maxDimension = Math.Max(w, h);

        while (maxDimension > 1)
        {
            mipLevels++;
            maxDimension /= 2;
        }

        // Create the chain
        Texture2D tex = new Texture2D(GraphicsDeviceManager.Current.GraphicsDevice, w, h, true, SurfaceFormat.Color);

        // Put bitmap into a renderable image
        Image image = new Image();

        image.Source = bs;

        // Generate mip level data
        for (int level = 0; level < mipLevels; level++)
        {
            var wb = new WriteableBitmap(w, h);

            // Scale to current mip level
            ScaleTransform t = new ScaleTransform();
            t.ScaleX = (double)w / (double)bs.PixelWidth;
            t.ScaleY = (double)h / (double)bs.PixelHeight;

            // Black out the image
            for (int c = 0; c < w * h; c++)
            {
                wb.Pixels[c] = 0;
            }

            // Small mip levels are rendering as white, so don't render
            if (w > 1 && h > 1)
            {
                wb.Render(image, t);
            }

            // Update WB
            wb.Invalidate();

            // Grab pixel data
            wb.CopyTo(tex, level, null, 0, 0);

            // Shrink for the next level
            if (w != 1)
            {
                w /= 2;
            }
            if (h != 1)
            {
                h /= 2;
            }
        }

        return(tex);
    }