aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/Gradient.cs
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2016-02-02 23:38:54 +0100
committerjpbruyere <jp.bruyere@hotmail.com>2016-02-02 23:38:54 +0100
commit67bd044b6e5fe52b8b76cc5d7eb8fd0ce9dc3ee9 (patch)
treeb94ae5e6ef363eab5f0888b459789ecea9ac5d5d /src/Gradient.cs
parent2b087282dd73152d21140ea7312a90e046c84f61 (diff)
Gradient, Bitmap and Svg Filling
Diffstat (limited to 'src/Gradient.cs')
-rw-r--r--src/Gradient.cs130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/Gradient.cs b/src/Gradient.cs
new file mode 100644
index 00000000..c521fd67
--- /dev/null
+++ b/src/Gradient.cs
@@ -0,0 +1,130 @@
+//
+// Gradient.cs
+//
+// Author:
+// Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2016 jp
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+using System;
+using System.Collections.Generic;
+
+namespace Crow
+{
+ public class Gradient : Fill
+ {
+ public enum Type
+ {
+ Vertical,
+ Horizontal,
+ Oblic,
+ Radial
+ }
+ public class ColorStop
+ {
+ public double Offset;
+ public Color Color;
+
+ public ColorStop(double offset, Color color){
+ Offset = offset;
+ Color = color;
+ }
+ public static object Parse(string s)
+ {
+ if (string.IsNullOrEmpty (s))
+ return null;
+
+ string[] parts = s.Trim ().Split (':');
+
+ if (parts.Length > 2)
+ throw new Exception ("too many parameters in color stop: " + s);
+
+ if (parts.Length == 2)
+ return new ColorStop (double.Parse (parts [0]), (Color)parts [1]);
+
+ return new ColorStop (-1, (Color)parts [0]);
+ }
+ }
+ public Gradient.Type GradientType = Type.Vertical;
+// public double x0;
+// public double y0;
+// public double x1;
+// public double y1;
+// public double Radius1;
+// public double Radius2;
+ public List<ColorStop> Stops = new List<ColorStop>();
+ public Gradient(Gradient.Type _type)
+ {
+ GradientType = _type;
+ }
+
+ #region implemented abstract members of Fill
+
+ public override void SetAsSource (Cairo.Context ctx, Rectangle bounds = default(Rectangle))
+ {
+ Cairo.Gradient grad = null;
+ switch (GradientType) {
+ case Type.Vertical:
+ grad = new Cairo.LinearGradient (bounds.Left, bounds.Top, bounds.Left, bounds.Bottom);
+ break;
+ case Type.Horizontal:
+ grad = new Cairo.LinearGradient (bounds.Left, bounds.Top, bounds.Right, bounds.Top);
+ break;
+ case Type.Oblic:
+ grad = new Cairo.LinearGradient (bounds.Left, bounds.Top, bounds.Right, bounds.Bottom);
+ break;
+ case Type.Radial:
+ throw new NotImplementedException ();
+ }
+
+ foreach (ColorStop cs in Stops)
+ grad.AddColorStop (cs.Offset, cs.Color);
+
+ ctx.SetSource (grad);
+ grad.Dispose ();
+ }
+ #endregion
+
+ public static object Parse(string s)
+ {
+ if (string.IsNullOrEmpty (s))
+ return Color.White;
+
+ Crow.Gradient tmp;
+
+ string[] stops = s.Trim ().Split ('|');
+
+ switch (stops[0].Trim()) {
+ case "vgradient":
+ tmp = new Gradient (Type.Vertical);
+ break;
+ case "hgradient":
+ tmp = new Gradient (Type.Horizontal);
+ break;
+ case "ogradient":
+ tmp = new Gradient (Type.Oblic);
+ break;
+ default:
+ throw new Exception ("Unknown gradient type: " + stops [0]);
+ }
+
+ for (int i = 1; i < stops.Length; i++)
+ tmp.Stops.Add((ColorStop)ColorStop.Parse(stops[i]));
+
+ return tmp;
+ }
+ }
+}
+