- moved all plugin-related classes to Eithne.Plugin namespace
[FaRetSys.git] / Plugins / FFT / DCT.cs
bloba1fe9fdf51a4779aa9b0e781db90874a0ad7a4a4
1 using System;
2 using System.Xml;
3 using Mono.Unix;
5 namespace Eithne
7 public class DCTInfo : IInfo
9 public override string Name
11 get { return Catalog.GetString("Discrete Cosine Transform"); }
14 public override string ShortName
16 get { return "DCT"; }
19 public override string Author
21 get { return "Bartosz Taudul"; }
24 public override string Description
26 get { return Catalog.GetString("This plugin performs discrete cosine transform."); }
30 public class DCTFactory : IFactory
32 IInfo _info = new DCTInfo();
33 public IInfo Info
35 get { return _info; }
38 public IType Type
40 get { return IType.ImgProc; }
43 public void Initialize()
47 public Plugin.Base Create()
49 return new DCTPlugin();
53 public class DCTPlugin : Plugin.ImgProc
55 private bool zero = true;
56 private float progress;
58 public DCTPlugin()
60 _info = new DCTInfo();
63 public override XmlNode Config
65 get { return GetConfig(); }
66 set { LoadConfig(value); }
69 private void UpdateValue(bool z)
71 zero = z;
72 _block.SlotsChanged();
75 public override void Setup()
77 new FFTSetup(zero, UpdateValue, true);
80 public override void Work()
82 progress = 0;
84 ICommImage socket = _in[0] as ICommImage;
85 IImage[] img = socket.Images;
86 IImage[] res = new IImage[img.Length];
87 _out = new CommSocket(1);
89 for(int i=0; i<img.Length; i++)
91 res[i] = DCT(img[i]);
92 progress = (float)i/img.Length;
95 _out[0] = new ICommImage(res, socket.OriginalImages, socket.Categories);
97 FFTW.Cleanup();
99 _workdone = true;
102 private IImage DCT(IImage img)
104 double[] datain = new double[img.W * img.H];
105 double[] dataout = new double[img.W * img.H];
107 for(int y=0; y<img.H; y++)
108 for(int x=0; x<img.W; x++)
109 datain[x + y*img.W] = (byte)img[x, y];
111 IntPtr plan = FFTW.PlanR2R2D(img.H, img.W, datain, dataout, FFTW.Kind.FFTW_REDFT10,
112 FFTW.Kind.FFTW_REDFT10, 0);
114 FFTW.Execute(plan);
116 FFTW.DestroyPlan(plan);
118 IImage ret = new IImage(BPP.Float, img.W, img.H);
120 for(int y=0; y<img.H; y++)
121 for(int x=0; x<img.W; x++)
122 ret[x, y] = (float)dataout[x + y*img.W] / 255f;
124 if(zero)
125 ret[0, 0] = 0f;
127 return ret;
130 public override void Lock()
132 FFTW.mutex.WaitOne();
135 public override void Unlock()
137 FFTW.mutex.ReleaseMutex();
140 private XmlNode GetConfig()
142 XmlNode root = _xmldoc.CreateNode(XmlNodeType.Element, "config", "");
144 if(zero)
145 root.InnerText = "1";
146 else
147 root.InnerText = "0";
149 return root;
152 private void LoadConfig(XmlNode root)
154 if(root.InnerText == "1")
155 UpdateValue(true);
156 else
157 UpdateValue(false);
160 public override int NumIn { get { return 1; } }
161 public override int NumOut { get { return 1; } }
163 public override string DescIn(int n)
165 return Catalog.GetString("Input image.");
168 public override string DescOut(int n)
170 return Catalog.GetString("DCT of image.");
173 private static string[] matchin = new string[] { "image/grayscale" };
174 private static string[] matchout = new string[] { "image/float" };
176 public override string[] MatchIn { get { return matchin; } }
177 public override string[] MatchOut { get { return matchout; } }
179 public override float Progress { get { return progress; } }