Author: spouliot
Date: 2007-06-13 11:55:28 -0400 (Wed, 13 Jun 2007)
New Revision: 79438
Added:
trunk/moon/src/mkcolor.cs
Modified:
trunk/moon/src/ChangeLog
trunk/moon/src/brush.cpp
trunk/moon/src/brush.h
Log:
2007-06-13 Sebastien Pouliot <[EMAIL PROTECTED]>
* brush.cpp|h: Added code for LinearGradientBrush and partial setup
for all gradient-related brushes (needs testing). Add all color
definitions supported by XAML.
* mkcolor.cs: Tool to generate colors from System.Drawing (as they
are identical).
Modified: trunk/moon/src/ChangeLog
===================================================================
--- trunk/moon/src/ChangeLog 2007-06-13 15:39:39 UTC (rev 79437)
+++ trunk/moon/src/ChangeLog 2007-06-13 15:55:28 UTC (rev 79438)
@@ -1,3 +1,11 @@
+2007-06-13 Sebastien Pouliot <[EMAIL PROTECTED]>
+
+ * brush.cpp|h: Added code for LinearGradientBrush and partial setup
+ for all gradient-related brushes (needs testing). Add all color
+ definitions supported by XAML.
+ * mkcolor.cs: Tool to generate colors from System.Drawing (as they
+ are identical).
+
2007-06-13 Rolf Bjarne Kvinge <[EMAIL PROTECTED]>
* runtime.h: Add Visual.
Modified: trunk/moon/src/brush.cpp
===================================================================
--- trunk/moon/src/brush.cpp 2007-06-13 15:39:39 UTC (rev 79437)
+++ trunk/moon/src/brush.cpp 2007-06-13 15:55:28 UTC (rev 79438)
@@ -23,6 +23,25 @@
#include "transform.h"
//
+// SL-Cairo convertion and helper routines
+//
+
+static cairo_extend_t
+convert_gradient_spread_method (GradientSpreadMethod method)
+{
+ switch (method) {
+ case GradientSpreadMethodPad:
+ return CAIRO_EXTEND_PAD;
+ case GradientSpreadMethodReflect:
+ return CAIRO_EXTEND_REFLECT;
+ case GradientSpreadMethodRepeat:
+ return CAIRO_EXTEND_REPEAT;
+ }
+ g_warning ("Invalid GradientSpreadMethod value");
+ return CAIRO_EXTEND_NONE;
+}
+
+//
// Brush
//
@@ -125,22 +144,149 @@
} named_colors_t;
named_colors_t named_colors [] = {
-
- { "black", 0xFF000000 },
- { "blue", 0xFF0000FF },
- { "brown", 0xFFA52A2A },
- { "cyan", 0xFF00FFFF },
- { "darkgray", 0xFFA9A9A9 },
- { "gray", 0xFF808080 },
- { "green", 0xFF008000 },
- { "lightgray", 0xFFD3D3D3 },
- { "magenta", 0xFFFF00FF },
- { "orange", 0xFFFFA500 },
- { "purple", 0xFF800080 },
- { "red", 0xFFFF0000 },
- { "transparent", 0x00FFFFFF },
- { "white", 0xFFFFFFFF },
- { "yellow", 0xFFFFFF00 },
+ // NOTE: samples shows that XAML supports more than the colors defined
in System.Windows.Media.Colors
+ // in fact tests shows that all System.Drawing.Color seems to be
available
+ { "transparent", 0x00FFFFFF },
+ { "aliceblue", 0xFFF0F8FF },
+ { "antiquewhite", 0xFFFAEBD7 },
+ { "aqua", 0xFF00FFFF },
+ { "aquamarine", 0xFF7FFFD4 },
+ { "azure", 0xFFF0FFFF },
+ { "beige", 0xFFF5F5DC },
+ { "bisque", 0xFFFFE4C4 },
+ { "black", 0xFF000000 },
+ { "blanchedalmond", 0xFFFFEBCD },
+ { "blue", 0xFF0000FF },
+ { "blueviolet", 0xFF8A2BE2 },
+ { "brown", 0xFFA52A2A },
+ { "burlywood", 0xFFDEB887 },
+ { "cadetblue", 0xFF5F9EA0 },
+ { "chartreuse", 0xFF7FFF00 },
+ { "chocolate", 0xFFD2691E },
+ { "coral", 0xFFFF7F50 },
+ { "cornflowerblue", 0xFF6495ED },
+ { "cornsilk", 0xFFFFF8DC },
+ { "crimson", 0xFFDC143C },
+ { "cyan", 0xFF00FFFF },
+ { "darkblue", 0xFF00008B },
+ { "darkcyan", 0xFF008B8B },
+ { "darkgoldenrod", 0xFFB8860B },
+ { "darkgray", 0xFFA9A9A9 },
+ { "darkgreen", 0xFF006400 },
+ { "darkkhaki", 0xFFBDB76B },
+ { "darkmagenta", 0xFF8B008B },
+ { "darkolivegreen", 0xFF556B2F },
+ { "darkorange", 0xFFFF8C00 },
+ { "darkorchid", 0xFF9932CC },
+ { "darkred", 0xFF8B0000 },
+ { "darksalmon", 0xFFE9967A },
+ { "darkseagreen", 0xFF8FBC8B },
+ { "darkslateblue", 0xFF483D8B },
+ { "darkslategray", 0xFF2F4F4F },
+ { "darkturquoise", 0xFF00CED1 },
+ { "darkviolet", 0xFF9400D3 },
+ { "deeppink", 0xFFFF1493 },
+ { "deepskyblue", 0xFF00BFFF },
+ { "dimgray", 0xFF696969 },
+ { "dodgerblue", 0xFF1E90FF },
+ { "firebrick", 0xFFB22222 },
+ { "floralwhite", 0xFFFFFAF0 },
+ { "forestgreen", 0xFF228B22 },
+ { "fuchsia", 0xFFFF00FF },
+ { "gainsboro", 0xFFDCDCDC },
+ { "ghostwhite", 0xFFF8F8FF },
+ { "gold", 0xFFFFD700 },
+ { "goldenrod", 0xFFDAA520 },
+ { "gray", 0xFF808080 },
+ { "green", 0xFF008000 },
+ { "greenyellow", 0xFFADFF2F },
+ { "honeydew", 0xFFF0FFF0 },
+ { "hotpink", 0xFFFF69B4 },
+ { "indianred", 0xFFCD5C5C },
+ { "indigo", 0xFF4B0082 },
+ { "ivory", 0xFFFFFFF0 },
+ { "khaki", 0xFFF0E68C },
+ { "lavender", 0xFFE6E6FA },
+ { "lavenderblush", 0xFFFFF0F5 },
+ { "lawngreen", 0xFF7CFC00 },
+ { "lemonchiffon", 0xFFFFFACD },
+ { "lightblue", 0xFFADD8E6 },
+ { "lightcoral", 0xFFF08080 },
+ { "lightcyan", 0xFFE0FFFF },
+ { "lightgoldenrodyellow", 0xFFFAFAD2 },
+ { "lightgreen", 0xFF90EE90 },
+ { "lightgray", 0xFFD3D3D3 },
+ { "lightpink", 0xFFFFB6C1 },
+ { "lightsalmon", 0xFFFFA07A },
+ { "lightseagreen", 0xFF20B2AA },
+ { "lightskyblue", 0xFF87CEFA },
+ { "lightslategray", 0xFF778899 },
+ { "lightsteelblue", 0xFFB0C4DE },
+ { "lightyellow", 0xFFFFFFE0 },
+ { "lime", 0xFF00FF00 },
+ { "limegreen", 0xFF32CD32 },
+ { "linen", 0xFFFAF0E6 },
+ { "magenta", 0xFFFF00FF },
+ { "maroon", 0xFF800000 },
+ { "mediumaquamarine", 0xFF66CDAA },
+ { "mediumblue", 0xFF0000CD },
+ { "mediumorchid", 0xFFBA55D3 },
+ { "mediumpurple", 0xFF9370DB },
+ { "mediumseagreen", 0xFF3CB371 },
+ { "mediumslateblue", 0xFF7B68EE },
+ { "mediumspringgreen", 0xFF00FA9A },
+ { "mediumturquoise", 0xFF48D1CC },
+ { "mediumvioletred", 0xFFC71585 },
+ { "midnightblue", 0xFF191970 },
+ { "mintcream", 0xFFF5FFFA },
+ { "mistyrose", 0xFFFFE4E1 },
+ { "moccasin", 0xFFFFE4B5 },
+ { "navajowhite", 0xFFFFDEAD },
+ { "navy", 0xFF000080 },
+ { "oldlace", 0xFFFDF5E6 },
+ { "olive", 0xFF808000 },
+ { "olivedrab", 0xFF6B8E23 },
+ { "orange", 0xFFFFA500 },
+ { "orangered", 0xFFFF4500 },
+ { "orchid", 0xFFDA70D6 },
+ { "palegoldenrod", 0xFFEEE8AA },
+ { "palegreen", 0xFF98FB98 },
+ { "paleturquoise", 0xFFAFEEEE },
+ { "palevioletred", 0xFFDB7093 },
+ { "papayawhip", 0xFFFFEFD5 },
+ { "peachpuff", 0xFFFFDAB9 },
+ { "peru", 0xFFCD853F },
+ { "pink", 0xFFFFC0CB },
+ { "plum", 0xFFDDA0DD },
+ { "powderblue", 0xFFB0E0E6 },
+ { "purple", 0xFF800080 },
+ { "red", 0xFFFF0000 },
+ { "rosybrown", 0xFFBC8F8F },
+ { "royalblue", 0xFF4169E1 },
+ { "saddlebrown", 0xFF8B4513 },
+ { "salmon", 0xFFFA8072 },
+ { "sandybrown", 0xFFF4A460 },
+ { "seagreen", 0xFF2E8B57 },
+ { "seashell", 0xFFFFF5EE },
+ { "sienna", 0xFFA0522D },
+ { "silver", 0xFFC0C0C0 },
+ { "skyblue", 0xFF87CEEB },
+ { "slateblue", 0xFF6A5ACD },
+ { "slategray", 0xFF708090 },
+ { "snow", 0xFFFFFAFA },
+ { "springgreen", 0xFF00FF7F },
+ { "steelblue", 0xFF4682B4 },
+ { "tan", 0xFFD2B48C },
+ { "teal", 0xFF008080 },
+ { "thistle", 0xFFD8BFD8 },
+ { "tomato", 0xFFFF6347 },
+ { "turquoise", 0xFF40E0D0 },
+ { "violet", 0xFFEE82EE },
+ { "wheat", 0xFFF5DEB3 },
+ { "white", 0xFFFFFFFF },
+ { "whitesmoke", 0xFFF5F5F5 },
+ { "yellow", 0xFFFFFF00 },
+ { "yellowgreen", 0xFF9ACD32 },
{ NULL, 0 }
};
@@ -307,7 +453,83 @@
}
}
+void
+GradientBrush::SetupPattern (cairo_pattern_t *pattern)
+{
+ GradientSpreadMethod gsm = gradient_brush_get_spread (this);
+ cairo_pattern_set_extend (pattern, convert_gradient_spread_method
(gsm));
+
+ // TODO - BrushMappingMode is ignore (use a matrix)
+
+ // TODO - ColorInterpolationModeProperty is ignored (map to ?)
+
+ for (GSList *g = children->list; g != NULL; g = g->next) {
+ GradientStop *stop = (GradientStop*) g->data;
+ Color *color = gradient_stop_get_color (stop);
+ double offset = gradient_stop_get_offset (stop);
+ cairo_pattern_add_color_stop_rgba (pattern, offset, color->r,
color->g, color->b, color->a);
+ }
+}
+
//
+// LinearGradientBrush
+//
+
+DependencyProperty* LinearGradientBrush::EndPointProperty;
+DependencyProperty* LinearGradientBrush::StartPointProperty;
+
+LinearGradientBrush*
+linear_gradient_brush_new ()
+{
+ return new LinearGradientBrush ();
+}
+
+Point*
+linear_gradient_brush_get_end_point (LinearGradientBrush *brush)
+{
+ Value *value = brush->GetValue (LinearGradientBrush::EndPointProperty);
+ return (value ? value->AsPoint() : NULL);
+}
+
+void
+linear_gradient_brush_set_end_point (LinearGradientBrush *brush, Point *point)
+{
+ brush->SetValue (LinearGradientBrush::EndPointProperty, Value (*point));
+}
+
+Point*
+linear_gradient_brush_get_start_point (LinearGradientBrush *brush)
+{
+ Value *value = brush->GetValue
(LinearGradientBrush::StartPointProperty);
+ return (value ? value->AsPoint() : NULL);
+}
+
+void
+linear_gradient_brush_set_start_point (LinearGradientBrush *brush, Point
*point)
+{
+ brush->SetValue (LinearGradientBrush::StartPointProperty, Value
(*point));
+}
+
+void
+LinearGradientBrush::SetupBrush (cairo_t *cairo, UIElement *uielement)
+{
+ Point *start = linear_gradient_brush_get_start_point (this);
+ double x0 = start ? start->x : 0.0;
+ double y0 = start ? start->y : 0.0;
+
+ Point *end = linear_gradient_brush_get_end_point (this);
+ double x1 = end ? start->x : 1.0;
+ double y1 = end ? start->y : 1.0;
+
+ cairo_pattern_t *pattern = cairo_pattern_create_linear (x0, y0, x1, y1);
+
+ GradientBrush::SetupPattern (pattern);
+
+ cairo_set_source (cairo, pattern);
+ cairo_pattern_destroy (pattern);
+}
+
+//
// RadialGradientBrush
//
@@ -326,7 +548,7 @@
radial_gradient_brush_get_center (RadialGradientBrush *brush)
{
Value *value = brush->GetValue (RadialGradientBrush::CenterProperty);
- return (value ? value->AsPoint() : NULL);
+ return (value ? value->AsPoint() : new Point (0.5, 0.5));
}
void
@@ -339,7 +561,7 @@
radial_gradient_brush_get_gradientorigin (RadialGradientBrush *brush)
{
Value *value = brush->GetValue
(RadialGradientBrush::GradientOriginProperty);
- return (value ? value->AsPoint() : NULL);
+ return (value ? value->AsPoint() : new Point (0.5, 0.5));
}
void
@@ -375,6 +597,18 @@
void
RadialGradientBrush::SetupBrush (cairo_t *cairo, UIElement *uielement)
{
+ Point *center = radial_gradient_brush_get_center (this);
+ Point *origin = radial_gradient_brush_get_gradientorigin (this);
+ double rx = radial_gradient_brush_get_radius_x (this);
+ double ry = radial_gradient_brush_get_radius_y (this);
+
+ // FIXME - not ok
+ cairo_pattern_t *pattern = cairo_pattern_create_radial (center->x,
center->y, rx, origin->x, origin->y, ry);
+
+ GradientBrush::SetupPattern (pattern);
+
+ cairo_set_source (cairo, pattern);
+ cairo_pattern_destroy (pattern);
}
//
@@ -460,11 +694,15 @@
GradientBrush::MappingModeProperty = DependencyObject::Register
(Value::GRADIENTBRUSH, "MappingMode", new Value (0));
GradientBrush::SpreadMethodProperty = DependencyObject::Register
(Value::GRADIENTBRUSH, "SpreadMethod", new Value (0));
+ /* LinearGradientBrush fields */
+ LinearGradientBrush::EndPointProperty = DependencyObject::Register
(Value::LINEARGRADIENTBRUSH, "EndPoint", Value::POINT);
+ LinearGradientBrush::StartPointProperty = DependencyObject::Register
(Value::LINEARGRADIENTBRUSH, "StartPoint", Value::POINT);
+
/* RadialGradientBrush fields */
RadialGradientBrush::CenterProperty = DependencyObject::Register
(Value::RADIALGRADIENTBRUSH, "Center", Value::POINT);
RadialGradientBrush::GradientOriginProperty =
DependencyObject::Register (Value::RADIALGRADIENTBRUSH, "GradientOrigin",
Value::POINT);
- RadialGradientBrush::RadiusXProperty = DependencyObject::Register
(Value::RADIALGRADIENTBRUSH, "RadiusX", new Value (0.0));
- RadialGradientBrush::RadiusYProperty = DependencyObject::Register
(Value::RADIALGRADIENTBRUSH, "RadiusY", new Value (0.0));
+ RadialGradientBrush::RadiusXProperty = DependencyObject::Register
(Value::RADIALGRADIENTBRUSH, "RadiusX", new Value (0.5));
+ RadialGradientBrush::RadiusYProperty = DependencyObject::Register
(Value::RADIALGRADIENTBRUSH, "RadiusY", new Value (0.5));
/* GradientStop */
GradientStop::ColorProperty = DependencyObject::Register
(Value::GRADIENTSTOP, "Color", new Value (Color (0x00FFFFFF)));
Modified: trunk/moon/src/brush.h
===================================================================
--- trunk/moon/src/brush.h 2007-06-13 15:39:39 UTC (rev 79437)
+++ trunk/moon/src/brush.h 2007-06-13 15:55:28 UTC (rev 79438)
@@ -71,6 +71,7 @@
Value::Kind GetObjectType () { return Value::GRADIENTBRUSH; }
virtual void OnPropertyChanged (DependencyProperty *prop);
+ virtual void SetupPattern (cairo_pattern_t *pattern);
};
ColorInterpolationMode gradient_brush_get_color_interpolation_mode
(GradientBrush *brush);
void gradient_brush_set_color_interpolation_mode (GradientBrush *brush,
ColorInterpolationMode mode);
@@ -94,8 +95,20 @@
};
class LinearGradientBrush : public GradientBrush {
+ public:
+ static DependencyProperty* EndPointProperty;
+ static DependencyProperty* StartPointProperty;
+
+ LinearGradientBrush () {};
Value::Kind GetObjectType () { return Value::LINEARGRADIENTBRUSH; }
+
+ virtual void SetupBrush (cairo_t *cairo, UIElement *uielement);
};
+LinearGradientBrush *linear_gradient_brush_new ();
+Point *linear_gradient_brush_get_end_point (LinearGradientBrush *brush);
+void linear_gradient_brush_set_end_point (LinearGradientBrush *brush,
Point *point);
+Point *linear_gradient_brush_get_start_point (LinearGradientBrush *brush);
+void linear_gradient_brush_set_start_point (LinearGradientBrush *brush,
Point *point);
class RadialGradientBrush : public GradientBrush {
public:
Added: trunk/moon/src/mkcolor.cs
===================================================================
--- trunk/moon/src/mkcolor.cs 2007-06-13 15:39:39 UTC (rev 79437)
+++ trunk/moon/src/mkcolor.cs 2007-06-13 15:55:28 UTC (rev 79438)
@@ -0,0 +1,17 @@
+// mcs mkcolor.cs -pkg:dotnet
+using System;
+using System.Drawing;
+using System.Reflection;
+using System.Text;
+
+class Program {
+ static void Main ()
+ {
+ PropertyInfo [] properties = typeof (Color).GetProperties
(BindingFlags.Public | BindingFlags.Static);
+ // { "black", 0xFF000000 },
+ foreach (PropertyInfo pi in properties) {
+ Color color = Color.FromName (pi.Name);
+ Console.WriteLine ("\t{{
\"{0}\",\t\t0x{1:X2}{2:X2}{3:X2}{4:X2} }},", pi.Name.ToLower (), color.A,
color.R, color.G, color.B);
+ }
+ }
+}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches