示例#1
0
        public UGRadialGradientBrush(IUGContext context, Vector2 center, float radius, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            Center       = center;
            Radius       = radius;
            EdgeBehavior = edgeBehavior;
            Stops        = gradientStops.ToArray();

            if (Stops.Length < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            unsafe
            {
                var baseFunction = CGFunctionsHelper.GetCGFunction(EdgeBehavior);
                CGFunction.CGFunctionEvaluate function = (data, outData) => baseFunction(Stops, data, outData);
                var domain = new nfloat[] { 0, edgeBehavior != UGEdgeBehavior.Clamp ? 1.5F : 1 };
                _function = new CGFunction(domain, new nfloat[] { 0, 1, 0, 1, 0, 1, 0, 1 }, function);
            }

            var cgCenter = Center.ToCGPoint();
            var cgRadius = EdgeBehavior != UGEdgeBehavior.Clamp ? 1.5F * Radius : Radius;

            using (var colorSpace = CGColorSpace.CreateSrgb())
            {
                _native = CGShading.CreateRadial(colorSpace, cgCenter, 0F, cgCenter, cgRadius, _function, true, true);
            }
        }
        public static CGFunctionEvaluateWithStops GetCGFunction(UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(CGClampFunction);

            case UGEdgeBehavior.Wrap:
                return(CGWrapFunction);

            case UGEdgeBehavior.Mirror:
                return(CGMirrorFunction);

            default:
                throw new NotSupportedException();
            }
        }
示例#3
0
        public static CanvasEdgeBehavior ToWinRTEdgeBehavior(this UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(CanvasEdgeBehavior.Clamp);

            case UGEdgeBehavior.Wrap:
                return(CanvasEdgeBehavior.Wrap);

            case UGEdgeBehavior.Mirror:
                return(CanvasEdgeBehavior.Mirror);

            default:
                throw new NotSupportedException();
            }
        }
示例#4
0
        public static GradientSpreadMethod ToWPFSpreadMethod(this UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(GradientSpreadMethod.Pad);

            case UGEdgeBehavior.Wrap:
                return(GradientSpreadMethod.Repeat);

            case UGEdgeBehavior.Mirror:
                return(GradientSpreadMethod.Reflect);

            default:
                throw new NotSupportedException();
            }
        }
示例#5
0
        public static Shader.TileMode ToAGShaderTileMode(this UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(Shader.TileMode.Clamp);

            case UGEdgeBehavior.Wrap:
                return(Shader.TileMode.Repeat);

            case UGEdgeBehavior.Mirror:
                return(Shader.TileMode.Mirror);

            default:
                throw new NotSupportedException();
            }
        }
示例#6
0
        public static WrapMode ToGDIWrapMode(this UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(WrapMode.Clamp);

            case UGEdgeBehavior.Wrap:
                return(WrapMode.Tile);

            case UGEdgeBehavior.Mirror:
                return(WrapMode.TileFlipXY);

            default:
                throw new NotSupportedException();
            }
        }
        public UGRadialGradientBrush(IUGContext context, Vector2 center, float radius, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            Center       = center;
            Radius       = radius;
            EdgeBehavior = edgeBehavior;
            Stops        = gradientStops.ToArray();

            if (Stops.Length < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var colors  = gradientStops.Select(s => s.Color.ColorAsInt).ToArray();
            var offsets = gradientStops.Select(s => s.Offset).ToArray();

            _native = new RadialGradient(
                Center.X, Center.Y,
                Radius,
                colors,
                offsets,
                edgeBehavior.ToAGShaderTileMode());
        }
示例#8
0
        public UGLinearGradientBrush(IUGContext context, Vector2 startPoint, Vector2 endPoint, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            StartPoint   = startPoint;
            EndPoint     = endPoint;
            EdgeBehavior = edgeBehavior;
            Stops        = gradientStops.ToArray();

            if (Stops.Length < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var colors  = gradientStops.Select(s => s.Color.ColorAsInt).ToArray();
            var offsets = gradientStops.Select(s => s.Offset).ToArray();

            _native = new LinearGradient(
                StartPoint.X, StartPoint.Y,
                EndPoint.X, EndPoint.Y,
                colors,
                offsets,
                edgeBehavior.ToAGShaderTileMode());
        }
        public UGRadialGradientBrush(IUGContext context, Vector2 center, float radius, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            Radius = radius;

            var ugStops = gradientStops.Reverse().ToArray();

            if (ugStops.Length < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }
            for (var i = 0; i < ugStops.Length; ++i)
            {
                ugStops[i].Offset = 1F - ugStops[i].Offset;
            }

            var size   = radius * 4F;
            var offset = .5F * size;

            using (var path = new GraphicsPath())
            {
                path.AddEllipse(center.X - offset, center.Y - offset, size, size);

                var native = new PathGradientBrush(path);
                native.CenterPoint         = center.ToGDIPointF();
                native.WrapMode            = edgeBehavior.ToGDIWrapMode();
                native.InterpolationColors = ugStops.ToGDIColorBlendWithEdgeBehavior(edgeBehavior);
                _native = native;
            }
        }
 public UGRadialGradientBrush(IUGContext context, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
     : this(context, new Vector2(.5F, .5F), .5F, gradientStops, edgeBehavior)
 {
 }
 public UGRadialGradientBrush(IUGContext context, UGColor startColor, UGColor endColor, UGEdgeBehavior edgeBehavior)
     : this(context, new Vector2(.5F, .5F), .5F, new[] { new UGGradientStop(startColor, 0F), new UGGradientStop(endColor, 1F) }, edgeBehavior)
 {
 }
示例#12
0
        public UGLinearGradientBrush(IUGContext context, Vector2 startPoint, Vector2 endPoint, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            var count = gradientStops.Count();

            if (count < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var device     = ((UGContext)context).Device;
            var winrtStops = gradientStops.ToWinRTGradientStops();
            var native     = new CanvasLinearGradientBrush(device, winrtStops, edgeBehavior.ToWinRTEdgeBehavior(), CanvasAlphaMode.Premultiplied);

            native.StartPoint = startPoint;
            native.EndPoint   = endPoint;
            _native           = native;
        }
示例#13
0
 public UGLinearGradientBrush(IUGContext context, Vector2 startPoint, Vector2 endPoint, UGColor startColor, UGColor endColor, UGEdgeBehavior edgeBehavior)
     : this(context, startPoint, endPoint, new[] { new UGGradientStop(startColor, 0F), new UGGradientStop(endColor, 1F) }, edgeBehavior)
 {
 }
示例#14
0
 public UGLinearGradientBrush(IUGContext context, UGColor startColor, UGColor endColor, float angle, UGEdgeBehavior edgeBehavior)
     : this(context, Vector2.Zero, UGLinearGradientHelper.EndPointFromAngle(angle), startColor, endColor, edgeBehavior)
 {
 }
        public UGLinearGradientBrush(IUGContext context, Vector2 startPoint, Vector2 endPoint, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            var count = gradientStops.Count();

            if (count < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var wpfStops = gradientStops.ToWPFGradientStopCollection(count);
            var native   = new LinearGradientBrush(wpfStops, startPoint.ToWPFPoint(), endPoint.ToWPFPoint());

            native.SpreadMethod = edgeBehavior.ToWPFSpreadMethod();
            native.Freeze();
            _native = native;
        }
        public UGRadialGradientBrush(IUGContext context, Vector2 center, float radius, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            var count = gradientStops.Count();

            if (count < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var wpfStops  = gradientStops.ToWPFGradientStopCollection(count);
            var native    = new RadialGradientBrush(wpfStops);
            var wpfCenter = center.ToWPFPoint();

            native.Center         = wpfCenter;
            native.GradientOrigin = wpfCenter;
            native.RadiusX        = radius;
            native.RadiusY        = radius;
            native.SpreadMethod   = edgeBehavior.ToWPFSpreadMethod();
            native.Freeze();
            _native = native;
        }
示例#17
0
        public UGRadialGradientBrush(IUGContext context, Vector2 center, float radius, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            var count = gradientStops.Count();

            if (count < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var device     = ((UGContext)context).Device;
            var winrtStops = gradientStops.ToWinRTGradientStops();
            var native     = new CanvasRadialGradientBrush(device, winrtStops, edgeBehavior.ToWinRTEdgeBehavior(), CanvasAlphaMode.Premultiplied);

            native.Center  = center;
            native.RadiusX = radius;
            native.RadiusY = radius;
            _native        = native;
        }
示例#18
0
        public static ColorBlend ToGDIColorBlendWithEdgeBehavior(this UGGradientStop[] ugStops, UGEdgeBehavior edgeBehavior)
        {
            switch (edgeBehavior)
            {
            case UGEdgeBehavior.Clamp:
                return(ugStops.ToGDIClampColorBlend());

            case UGEdgeBehavior.Wrap:
                return(ugStops.ToGDIWrapColorBlend());

            case UGEdgeBehavior.Mirror:
                return(ugStops.ToGDIMirrorColorBlend());

            default:
                throw new NotSupportedException();
            }
        }
示例#19
0
        public UGLinearGradientBrush(IUGContext context, Vector2 startPoint, Vector2 endPoint, IEnumerable <UGGradientStop> gradientStops, UGEdgeBehavior edgeBehavior)
        {
            StartPoint = startPoint;
            EndPoint   = endPoint;

            var ugStops = gradientStops.ToArray();

            if (ugStops.Length < 2)
            {
                throw new ArgumentException(nameof(gradientStops));
            }

            var diff   = endPoint - startPoint;
            var angle  = MathHelper.RadiansToDegrees((float)Math.Atan2(diff.Y, diff.X));
            var native = new LinearGradientBrush(
                new RectangleF(0F, 0F, 1F, 1F),
                Color.Transparent, Color.Transparent,
                angle,
                false);

            native.InterpolationColors = ugStops.ToGDIColorBlend();
            _native = native;
        }