List <RectangleRef> FindRanges(RectangleRef rect, ColorBgra Color, bool IgnoreWithinTolerance) { Surface src = SrcArgs.Surface; List <RectangleRef> ranges = new List <RectangleRef>(); byte rangeFound = 0; int rangeStart = 0, rangeEnd = 0; for (int y = rect.Top; y < rect.Bottom; ++y) { if (IsCancelRequested) { goto endloop; } for (int x = rect.Left; x < rect.Right; ++x) { switch (rangeFound) { case 0: { if (ColorUtils.RGBPercentage(src[x, y], Color) <= Tolerance ^ IgnoreWithinTolerance) { rangeFound = 1; rangeStart = x; } break; } case 1: { if (ColorUtils.RGBPercentage(src[x, y], Color) > Tolerance ^ IgnoreWithinTolerance) { rangeFound = 2; rangeEnd = x; goto case 2; } break; } case 2: { ranges.Add(new RectangleRef(rangeStart, y, rangeEnd - rangeStart, 1)); rangeFound = 0; break; } } } if (1 == rangeFound) { ranges.Add(new RectangleRef(rangeStart, y, rect.Right - rangeStart, 1)); rangeFound = 0; } } endloop: CompressRanges(ranges); return(ranges); }
void CleanUp(RectangleRef r) { Surface dst = DstArgs.Surface, src = SrcArgs.Surface; int ymax = r.Bottom; int xmax = r.Right; for (int y = r.Top; y < ymax; ++y) { for (int x = r.Left; x < xmax; ++x) { dst[x, y] = src[x, y]; } } }
static void CompressRanges(List <RectangleRef> ranges) { ranges.Sort(); for (int i = 1; i < ranges.Count(); ++i) { if (ranges[i - 1].rect.Left == ranges[i].rect.Left && ranges[i - 1].rect.Right == ranges[i].rect.Right && ranges[i - 1].rect.Bottom == ranges[i].rect.Top) { ranges[i - 1] = new RectangleRef(ranges[i - 1].rect.Location, new Size(ranges[i].rect.Width, ranges[i - 1].rect.Height + ranges[i].rect.Height)); ranges.RemoveAt(i--); } /* * else if(ranges[i-1].r==ranges[i].r) { * ranges.RemoveAt(--i); * }*/ } }
protected override void OnSetRenderInfo(PropertyBasedEffectConfigToken newToken, RenderArgs dstArgs, RenderArgs srcArgs) { Modes OldMode = Mode; Mode = (Modes)newToken.GetProperty <StaticListChoiceProperty>(PropertyNames.Mode).Value; ModeChanged = Mode != OldMode; LowerThreshold = newToken.GetProperty <Int32Property>(PropertyNames.LowerThreshold).Value; UpperThreshold = newToken.GetProperty <Int32Property>(PropertyNames.UpperThreshold).Value; float OldTolerance = Tolerance; Tolerance = newToken.GetProperty <Int32Property>(PropertyNames.Tolerance).Value; Tolerance *= Tolerance / toleranceMax / toleranceMax; ToleranceChanged = Tolerance != OldTolerance; base.OnSetRenderInfo(newToken, dstArgs, srcArgs); PdnRegion selection = EnvironmentParameters.GetSelection(SrcArgs.Surface.Bounds); List <RectangleRef> selRects = RectangleRef.RectanglesToRectangleRefs(selection.GetRegionScansInt()); CustomOnRender(RectangleRef.SplitSmall(selRects, selection.GetBoundsInt().Bottom / 4)); }
public ClusterPart(RectangleRef rr) { Rectangle = rr; }