forked from kumpera/PixelMagic
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathTestGen.cs
100 lines (85 loc) · 2.81 KB
/
TestGen.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Windows.Media.Imaging;
using System.Windows.Media.Effects;
using System.Windows.Controls;
using System.Windows.Media;
using System.IO;
using System.Windows;
using System.Globalization;
using System.Windows.Shapes;
namespace ShaderTestGen
{
public class TestSuite {
public static readonly TestCase[] Tests = new TestCase[] {
new TestCase ("invert-color") {
Effect = "shaders/InvertColor.ps",
InputFile = "images/test2.png"
},
new TestCase ("bright-extract") {
Effect = "shaders/BrightExtract.ps",
InputFile = "images/test2.png",
CreateShader = (tc) => new SingleScalarShader (tc.Effect) { Scalar = 0.5 },
ExtraArgs = "-c0=0.5"
},
};
}
public class TestCase {
public TestCase (string testName) {
TestName = testName;
}
public const double DefaultTolerance = 0.5;
public double Tolerance { get; set; }
public string TestName { get; set; }
public string Effect { get; set; }
public string InputFile { get; set; }
public Func<TestCase, Shader> CreateShader { get; set; }
public string ExtraArgs { get; set; }
public void Run (TextWriter runscript) {
Shader shader;
if (CreateShader != null)
shader = CreateShader (this);
else
shader = new Shader (Effect);
BitmapImage bitmap = new BitmapImage (new Uri (Driver.MakePath (InputFile)));
string reference = string.Format ("references/{0}.png", TestName);
double t = Tolerance == 0 ? DefaultTolerance : Tolerance;
Apply (shader, bitmap, reference);
runscript.WriteLine ("{0} {1} {2} {3} {4} {5} {6} {7}", TestName, Effect, InputFile, reference, t, ExtraArgs);
}
static void Apply (Shader shader, BitmapImage bitmap, string destImage) {
Rectangle r = new Rectangle ();
r.Effect = shader;
shader.Input = new ImageBrush (bitmap);
/*The fill brush is ignored due to the effect been applied*/
r.Fill = new SolidColorBrush (Colors.Aquamarine);
Size size = new Size (bitmap.PixelWidth, bitmap.PixelHeight);
r.Measure (size);
r.Arrange (new Rect (size));
RenderTargetBitmap render = new RenderTargetBitmap (
bitmap.PixelWidth,
bitmap.PixelHeight,
96,
96,
PixelFormats.Pbgra32);
render.Render (r);
PngBitmapEncoder png = new PngBitmapEncoder ();
png.Frames.Add (BitmapFrame.Create (render));
using (Stream stm = File.Open (destImage, FileMode.OpenOrCreate)) {
png.Save (stm);
}
}
}
public class Driver
{
public static string MakePath (string rel) {
return Environment.CurrentDirectory + System.IO.Path.DirectorySeparatorChar + rel;
}
[STAThread]
static void Main (string[] args) {
using (StreamWriter sw = new StreamWriter ("tests.in")) {
foreach (var test in TestSuite.Tests)
test.Run (sw);
}
}
}
}