using System;
namespace Assistance {
namespace Drawing {
public class Helper {
public static Rectangle getBounds(Cairo.Context context) {
double w = 1.0;
double h = 1.0;
if (context.GetTarget() is Cairo.ImageSurface) {
Cairo.ImageSurface surface = (Cairo.ImageSurface)context.GetTarget();
w = surface.Width;
h = surface.Height;
}
Point[] corners = new Point[] {
new Point(0.0, 0.0),
new Point( w, 0.0),
new Point( w, h),
new Point(0.0, h) };
Rectangle bounds = new Rectangle();
for(int i = 0; i < corners.Length; ++i) {
double x = corners[i].x;
double y = corners[i].y;
context.DeviceToUser(ref x, ref y);
if (i == 0)
bounds = new Rectangle(x, y);
else
bounds = bounds.expand(new Point(x, y));
}
return bounds;
}
}
public struct Color {
public double r, g, b, a;
public Color(string name, double alpha = 1.0) {
Gdk.Color c = new Gdk.Color();
if (!Gdk.Color.Parse(name, ref c))
Console.Error.WriteLine("Color [" + name + "] not found");
this.r = (double)c.Red/65535.0;
this.g = (double)c.Green/65535.0;
this.b = (double)c.Blue/65535.0;
this.a = alpha;
}
public Color(double r, double g, double b, double a = 1.0) {
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
public void apply(Cairo.Context context) {
context.SetSourceRGBA(r, g, b, a);
}
}
public struct Pen {
public Color color;
public double width;
public Pen(string color, double width = 1.0, double alpha = 1.0) {
this.color = new Color(color, alpha);
this.width = width;
}
public void apply(Cairo.Context context) {
color.apply(context);
context.LineWidth = width;
}
}
public struct Brush {
public Color color;
public Brush(string color, double alpha = 1.0) {
this.color = new Color(color, alpha);
}
public void apply(Cairo.Context context) {
color.apply(context);
}
}
}
}