using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace ReflectedAlphaImage
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            Loaded += OnMainPageLoaded;
        }

        async void OnMainPageLoaded(object sender, RoutedEventArgs e)
        {
            Uri uri = new Uri("http://www.charlespetzold.com/pw6/PetzoldJersey.jpg");
            RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromUri(uri);

            // Tworzenie bufora do odczytu strumienia
            Windows.Storage.Streams.Buffer buffer = null;

            // Odczyt całego pliku
            using (IRandomAccessStreamWithContentType fileStream = await streamRef.OpenReadAsync())
            {
                buffer = new Windows.Storage.Streams.Buffer((uint)fileStream.Size);
                await fileStream.ReadAsync(buffer, (uint)fileStream.Size, InputStreamOptions.None);
            }

            // Tworzenie WriteableBitmap z nieznaną wielkością
            WriteableBitmap bitmap = new WriteableBitmap(1, 1);

            // Tworzenie strumienia pamięciowego do przesyłania danych
            using (InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream())
            {
                await memoryStream.WriteAsync(buffer);
                memoryStream.Seek(0);

                // Użycie strumienia pamięciowego jako źródło dla Bitmap
                bitmap.SetSource(memoryStream);
            }

            // Odczytanie pikseli z mapy bitowej
            byte[] pixels = new byte[4 * bitmap.PixelWidth * bitmap.PixelHeight];
            int index = 0;

            using (Stream pixelStream = bitmap.PixelBuffer.AsStream())
            {
                await pixelStream.ReadAsync(pixels, 0, pixels.Length);

                // Zastosowanie przezroczystości do pikseli
                for (int y = 0; y < bitmap.PixelHeight; y++)
                {
                    double opacity = (double)y / bitmap.PixelHeight;

                    for (int x = 0; x < bitmap.PixelWidth; x++)
                        for (int i = 0; i < 4; i++)
                        {
                            pixels[index] = (byte)(opacity * pixels[index]);
                            index++;
                        }
                }

                // Umieszczenie pikseli z powrotem w mapie bitowej
                pixelStream.Seek(0, SeekOrigin.Begin);
                await pixelStream.WriteAsync(pixels, 0, pixels.Length);
            }
            bitmap.Invalidate();
            reflectedImage.Source = bitmap;
        }
    }
}
