using System; using Cairo; using Gdk; using Gtk; class Area : DrawingArea { public ImageSurface surface; public int imageWidth, // Ширина зображення imageHeight,// Висота зображення gap = 1; // Відступ по вертикалі між зображеннями protected override bool OnDrawn(Context cr) // малювання { int height = Allocation.Height; // Заповнити тло плавним ґрадієнтом від чорного до темно-сірого LinearGradient lg = new LinearGradient(0, 0, 0, height * 3); lg.AddColorStop(0, new Cairo.Color(0, 0, 0, 1)); lg.AddColorStop(height, new Cairo.Color(0.0, 0.2, 0.2, 1)); cr.SetSource(lg); cr.Paint(); cr.SetSourceSurface(surface, 0, 0); cr.Paint(); double alpha = 0.9; // Початкова прозорість double step = 1.0 / imageHeight; // Величина зміни прозорості за 1 px по вертикалі cr.Translate(0, 2 * imageHeight + gap); // Перенесення зображення cr.Scale(1, -1); // Симетрія відносно горзонталі for (int i = 0; i < imageHeight; i++) // Надання прозорості, змінної по вертикалі { cr.Rectangle(new Cairo.Rectangle(0, imageHeight - i, imageWidth, 1)); cr.Clip(); cr.SetSource(surface, 0, 0); cr.PaintWithAlpha(alpha -= step); cr.ResetClip(); } return true; } } class OwnWindow : Gtk.Window // клас вікна застосунку { public OwnWindow() : base("Віддзеркалення") { Area da = new Area(); try { da.surface = new ImageSurface("image.png"); } catch { Console.WriteLine("Файлу зображення не знайдено"); Environment.Exit(1); } da.imageWidth = da.surface.Width; da.imageHeight = da.surface.Height; Resize(da.imageWidth, 2 * da.imageHeight + da.gap); Add(da); // додавання області малювання } protected override bool OnDeleteEvent(Event e) { Application.Quit(); return true; } } class Example { static void Main() { Application.Init(); OwnWindow w = new OwnWindow(); w.ShowAll(); Application.Run(); } }