-
Notifications
You must be signed in to change notification settings - Fork 0
/
ScreenBleed.cs
71 lines (60 loc) · 3.06 KB
/
ScreenBleed.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using WindowsAPI;
using System.Drawing;
using System.Drawing.Imaging;
namespace Gotchya
{
/// <summary>
/// Performs an effect that makes the desktop appear that it is glitching.
/// </summary>
public static class ScreenBleed
{
public static void Run(int frames) {
Bitmap screenshot = Desktop.Screenshot();
Bitmap canvas = Desktop.Screenshot();
Mask mask = new Mask(screenshot);
//mask.Hide();
unsafe {
BitmapData screenshotData = screenshot.LockBits(new Rectangle(0, 0, screenshot.Width, screenshot.Height), ImageLockMode.ReadWrite, screenshot.PixelFormat);
int bytesPerPixel = System.Drawing.Bitmap.GetPixelFormatSize(screenshot.PixelFormat) / 8;
int heightInPixels = screenshotData.Height;
int widthInBytes = screenshotData.Width * bytesPerPixel;
byte* ptrFirstPixelScreenshot = (byte*)screenshotData.Scan0;
int lastBlue = 255;
int lastGreen = 255;
int lastRed = 255;
int thisBlue = 0;
int thisGreen = 0;
int thisRed = 0;
for (int time = 0; time < frames; time++) {
BitmapData canvasData = canvas.LockBits(new Rectangle(0, 0, canvas.Width, canvas.Height), ImageLockMode.ReadWrite, canvas.PixelFormat);
byte* ptrFirstPixelCanvas = (byte*)canvasData.Scan0;
for (int y = 0; y < heightInPixels; y++) {
byte* currentLineScreenshot = ptrFirstPixelScreenshot + (y * screenshotData.Stride);
byte* currentLineCanvas = ptrFirstPixelCanvas + (y * canvasData.Stride);
for (int x = 0; x < widthInBytes; x = x + bytesPerPixel) {
thisBlue = currentLineScreenshot[x];
thisGreen = currentLineScreenshot[x + 1];
thisRed = currentLineScreenshot[x + 2];
int xx = x / bytesPerPixel;
float factor = time * time * 7f / 255.0f;
currentLineCanvas[x] = (byte)Flattern(lastBlue, thisBlue, factor);
currentLineCanvas[x + 1] = (byte)Flattern(lastGreen, thisGreen, factor);
currentLineCanvas[x + 2] = (byte)Flattern(lastRed, thisRed, factor);
lastBlue = currentLineScreenshot[x];
lastGreen = currentLineScreenshot[x + 1];
lastRed = currentLineScreenshot[x + 2];
}
}
canvas.UnlockBits(canvasData);
mask.Picture.Image = canvas;
mask.Picture.Update();
}
}
mask.Close();
Mouse.Move(15, Desktop.GetWidth() - 15);
}
private static int Flattern(int oldColor, int newColor, float factor) {
return newColor - (int)(oldColor * factor);
}
}
}