예제 #1
0
        public MoveToolContentRenderer(BitmapLayer activeLayer, MoveToolChanges changes, Result <IRenderer <ColorAlpha8> > lazyDeltaSelectionMask, Result <IRenderer <ColorAlpha8> > lazyFinalSelectionMask) : base(activeLayer.Width, activeLayer.Height, false)
        {
            Validate.Begin().IsNotNull <BitmapLayer>(activeLayer, "activeLayer").IsNotNull <MoveToolChanges>(changes, "changes").IsNotNull <Result <IRenderer <ColorAlpha8> > >(lazyDeltaSelectionMask, "lazyDeltaSelectionMask").IsNotNull <Result <IRenderer <ColorAlpha8> > >(lazyFinalSelectionMask, "lazyFinalSelectionMask").Check();
            this.activeLayer            = activeLayer;
            this.changes                = changes;
            this.lazyDeltaSelectionMask = lazyDeltaSelectionMask;
            this.lazyFinalSelectionMask = lazyFinalSelectionMask;
            switch (changes.PixelSource)
            {
            case MoveToolPixelSource.ActiveLayer:
                this.source = activeLayer.Surface;
                break;

            case MoveToolPixelSource.Bitmap:
                this.source = changes.BitmapSource.Object;
                break;

            default:
                throw ExceptionUtil.InvalidEnumArgumentException <MoveToolPixelSource>(changes.PixelSource, "changes.PixelSource");
            }
            Matrix3x2Double matrix = changes.DeltaTransform * changes.EditTransform;

            if ((changes.MoveToolResamplingAlgorithm == ResamplingAlgorithm.NearestNeighbor) || changes.FinalTransform.IsIntegerTranslation)
            {
                this.sourceTx = new TransformedNearestNeighborContentRenderer(activeLayer.Size(), this.source, matrix);
            }
            else
            {
                RectDouble baseBounds        = changes.BaseBounds;
                RectInt32  srcCoverageBounds = changes.BaseTransform.Transform(baseBounds).Int32Bound;
                this.sourceTx = new TransformedBilinearContentRenderer(activeLayer.Size(), this.source, srcCoverageBounds, matrix);
            }
        }
예제 #2
0
        public RecolorToolContentRenderer(BitmapLayer activeLayer, RecolorToolChanges changes) : base(activeLayer.Width, activeLayer.Height, changes)
        {
            IRenderer <ColorAlpha8> renderer2;

            this.sampleSource = activeLayer.Surface;
            byte x         = (byte)Math.Round((double)(changes.Tolerance * 255.0), MidpointRounding.AwayFromZero);
            byte tolerance = ByteUtil.FastScale(x, x);

            if (changes.SamplingMode == RecolorToolSamplingMode.SecondaryColor)
            {
                this.basisColor = changes.BasisColor;
            }
            else
            {
                this.basisColor = GetBasisColor(changes, this.sampleSource);
            }
            IRenderer <ColorAlpha8> stencilSource = new FillStencilByColorRenderer(this.sampleSource, this.basisColor, tolerance, this);

            if (changes.Antialiasing)
            {
                renderer2 = new FeatheredMaskRenderer(this.sampleSource, changes.BasisColor, stencilSource, tolerance, this);
            }
            else
            {
                renderer2 = stencilSource;
            }
            IRenderer <ColorAlpha8> first = changes.RenderCache.CreateMaskRenderer(activeLayer.Size(), this);

            this.maskRenderer = new MultiplyRendererAlpha8(first, renderer2);
        }