Public feed
#894115
Index: uielement.h
===================================================================
--- uielement.h (revision 95027)
+++ uielement.h (working copy)
@@ -69,7 +69,8 @@
SHAPE_EMPTY = 0x20, // there's is nothing to draw, the cached path may be NULL
SHAPE_NORMAL = 0x40, // normal drawing
SHAPE_DEGENERATE = 0x80, // degenerate drawing, use the Stroke brush for filling
- SHAPE_MASK = (SHAPE_EMPTY | SHAPE_NORMAL | SHAPE_DEGENERATE)
+ SHAPE_RADII = 0x100,
+ SHAPE_MASK = (SHAPE_EMPTY | SHAPE_NORMAL | SHAPE_DEGENERATE | SHAPE_RADII)
};
int flags;
Index: shape.cpp
===================================================================
--- shape.cpp (revision 95027)
+++ shape.cpp (working copy)
@@ -501,6 +501,12 @@
}
}
+Rect
+Shape::ComputeLargestRectangle ()
+{
+ return Rect ();
+}
+
Brush *
shape_get_fill (Shape *shape)
{
@@ -765,6 +771,15 @@
// note: both moon_rounded_rectangle and moon_ellipse close the path
}
+Rect
+Ellipse::ComputeLargestRectangle ()
+{
+ double t = GetValue (Shape::StrokeThicknessProperty)->AsDouble ();
+ double x = (GetValue (FrameworkElement::WidthProperty)->AsDouble () - t) * cos (M_PI_2);
+ double y = (GetValue (FrameworkElement::HeightProperty)->AsDouble () - t) * sin (M_PI_2);
+ return bounds.GrowBy (-x, -y).RoundIn ();
+}
+
void
Ellipse::OnPropertyChanged (DependencyProperty *prop)
{
@@ -811,8 +826,8 @@
if (!SetupLine (cr))
return drawn;
- // FIXME: is it worth checking for round-corners ?
- SetupLineJoinMiter (cr);
+ if (!HasRadii ())
+ SetupLineJoinMiter (cr);
// Draw if the path wasn't drawn by the Fill call
if (!drawn)
@@ -961,6 +976,7 @@
shape:
// rounded-corner rectangle ?
if (round) {
+ AddShapeFlags (UIElement::SHAPE_RADII);
path = moon_path_renew (path, MOON_PATH_ROUNDED_RECTANGLE_LENGTH);
moon_rounded_rectangle (path, x, y, w, h, radius_x, radius_y);
} else {
@@ -1006,10 +1022,22 @@
return ((*rx != 0.0) && (*ry != 0.0));
}
+Rect
+Rectangle::ComputeLargestRectangle ()
+{
+ double x = GetValue (Shape::StrokeThicknessProperty)->AsDouble ();
+ double y = x;
+ if (HasRadii ()) {
+ x += GetValue (Rectangle::RadiusXProperty)->AsDouble ();
+ y += GetValue (Rectangle::RadiusYProperty)->AsDouble ();
+ }
+ return bounds.GrowBy (-x, -y).RoundIn ();
+}
+
double
rectangle_get_radius_x (Rectangle *rectangle)
{
- return rectangle->GetValue (Rectangle::RadiusXProperty)->AsDouble();
+ return rectangle->GetValue (Rectangle::RadiusXProperty)->AsDouble ();
}
void
Index: shape.h
===================================================================
--- shape.h (revision 95027)
+++ shape.h (working copy)
@@ -72,6 +72,7 @@
virtual void Render (cairo_t *cr, int x, int y, int width, int height);
virtual void GetSizeForBrush (cairo_t *cr, double *width, double *height);
virtual void ComputeBounds ();
+ virtual Rect ComputeLargestRectangle ();
virtual bool InsideObject (cairo_t *cr, double x, double y);
virtual Point GetTransformOrigin ();
virtual Point GetOriginPoint () {
@@ -107,7 +108,9 @@
bool IsEmpty () { return (flags & UIElement::SHAPE_EMPTY); };
bool IsNormal () { return (flags & UIElement::SHAPE_NORMAL); };
bool IsDegenerate () { return (flags & UIElement::SHAPE_DEGENERATE); };
+ bool HasRadii () { return (flags & UIElement::SHAPE_RADII); };
void SetShapeFlags (UIElementFlags sf) { flags &= ~UIElement::SHAPE_MASK; flags |= sf; };
+ void AddShapeFlags (UIElementFlags sf) { flags |= sf; };
};
Brush *shape_get_fill (Shape *shape);
@@ -145,6 +148,7 @@
virtual Type::Kind GetObjectType () { return Type::ELLIPSE; };
virtual void BuildPath ();
+ virtual Rect ComputeLargestRectangle ();
virtual bool CanFill () { return true; }
virtual void OnPropertyChanged (DependencyProperty *prop);
@@ -167,6 +171,7 @@
virtual Type::Kind GetObjectType () { return Type::RECTANGLE; };
virtual void BuildPath ();
+ virtual Rect ComputeLargestRectangle ();
virtual void OnPropertyChanged (DependencyProperty *prop);