public ImageFilm(int xResolution, int yResolution, Filter filter, float[] cropWindow) : base(xResolution, yResolution) { _filter = filter; _cropWindow = cropWindow; _bitmap = new WriteableBitmap(xResolution, yResolution, 96.0, 96.0, PixelFormats.Pbgra32, null); // Compute film image extent _xPixelStart = MathUtility.Ceiling(xResolution * cropWindow[0]); _xPixelCount = Math.Max(1, MathUtility.Ceiling(xResolution * cropWindow[1]) - _xPixelStart); _yPixelStart = MathUtility.Ceiling(yResolution * cropWindow[2]); _yPixelCount = Math.Max(1, MathUtility.Ceiling(yResolution * cropWindow[3]) - _yPixelStart); // Allocate film image storage _pixels = new ImagePixel[_xPixelCount, _yPixelCount]; for (var x = 0; x < _xPixelCount; x++) for (var y = 0; y < _yPixelCount; y++) _pixels[x, y] = new ImagePixel(); // Precompute filter weight table _filterTable = new float[FilterTableSize * FilterTableSize]; var index = 0; for (int y = 0; y < FilterTableSize; ++y) { float fy = (y + .5f) * filter.YWidth / FilterTableSize; for (int x = 0; x < FilterTableSize; ++x) { float fx = (x + .5f) * filter.XWidth / FilterTableSize; _filterTable[index++] = filter.Evaluate(fx, fy); } } _bgra = new byte[_xPixelCount * _yPixelCount * 4]; }
public static Film MakeFilm(string name, ParamSet parameters, Filter filter) { switch (name) { case "image" : { var xres = parameters.FindInt32("xresolution", 640); var yres = parameters.FindInt32("yresolution", 480); var cropWindow = parameters.FindSingleList("cropwindow"); if (cropWindow.Length == 0) cropWindow = new float[] { 0, 1, 0, 1 }; return new ImageFilm(xres, yres, filter, cropWindow); } default: throw new ArgumentException("Unknown film: " + name); } }