public void Render(Image image, Drawable drawable, bool preview) { int size = GetValue <int>("size"); image.UndoGroupStart(); var procedure = new Procedure("plug_in_pixelize"); procedure.Run(image, drawable, size); var palette = new MinisteckPalette(); image.ConvertIndexed(ConvertDitherType.No, ConvertPaletteType.Custom, 0, false, false, "Ministeck"); palette.Delete(); image.ConvertRgb(); image.UndoGroupEnd(); // And finally calculate the Ministeck pieces using (var painter = new Painter(drawable, size, GetValue <RGB>("color"))) { Shape.Painter = painter; int width = drawable.Width / size; int height = drawable.Height / size; var A = new BoolMatrix(width, height); // Fill in shapes bool limit = GetValue <bool>("limit"); var shapes = new ShapeSet(); shapes.Add((limit) ? 2 : 1, new TwoByTwoShape()); shapes.Add((limit) ? 8 : 1, new ThreeByOneShape()); shapes.Add((limit) ? 3 : 1, new TwoByOneShape()); shapes.Add((limit) ? 2 : 1, new CornerShape()); shapes.Add((limit) ? 1 : 1, new OneByOneShape()); Action <int> update = null; if (!preview) { var progress = new Progress(_("Ministeck...")); update = y => progress.Update((double)y / height); } var generator = new CoordinateGenerator(new Rectangle(0, 0, width, height), update); generator.ForEach(c => { if (!A.Get(c)) { shapes.Fits(A, c); } }); } drawable.Flush(); drawable.Update(); }
public bool Fits(Painter painter, BoolMatrix A, IntCoordinate p) { var color = painter.GetPixel(p); return(TrueForAll(offset => { var c = new IntCoordinate(p.X + offset.X, p.Y + offset.Y); return A.IsInside(c) && !A.Get(c) && painter.IsSameColor(c, color); })); }
public void Render(Image image, Drawable drawable, bool preview) { int size = GetValue<int>("size"); image.UndoGroupStart(); var procedure = new Procedure("plug_in_pixelize"); procedure.Run(image, drawable, size); var palette = new MinisteckPalette(); image.ConvertIndexed(ConvertDitherType.No, ConvertPaletteType.Custom, 0, false, false, "Ministeck"); palette.Delete(); image.ConvertRgb(); image.UndoGroupEnd(); // And finally calculate the Ministeck pieces using (var painter = new Painter(drawable, size, GetValue<RGB>("color"))) { Shape.Painter = painter; int width = drawable.Width / size; int height = drawable.Height / size; var A = new BoolMatrix(width, height); // Fill in shapes bool limit = GetValue<bool>("limit"); var shapes = new ShapeSet(); shapes.Add((limit) ? 2 : 1, new TwoByTwoShape()); shapes.Add((limit) ? 8 : 1, new ThreeByOneShape()); shapes.Add((limit) ? 3 : 1, new TwoByOneShape()); shapes.Add((limit) ? 2 : 1, new CornerShape()); shapes.Add((limit) ? 1 : 1, new OneByOneShape()); Action<int> update = null; if (!preview) { var progress = new Progress(_("Ministeck...")); update = y => progress.Update((double) y / height); } var generator = new CoordinateGenerator(new Rectangle(0, 0, width, height), update); generator.ForEach(c => {if (!A.Get(c)) shapes.Fits(A, c);}); } drawable.Flush(); drawable.Update(); }