aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/GraphicObjects
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2016-02-12 17:47:36 +0100
committerjpbruyere <jp.bruyere@hotmail.com>2016-02-12 17:47:36 +0100
commit970a3f7239d5e57eb011295cda9eee015bbe97f4 (patch)
tree7d09918825c72a7e0f58b5d8b174f27805cdfcc5 /src/GraphicObjects
parent44caf51048bde7e9daf78acc779278642c798748 (diff)
parentd1e33e2f2212e2f9a60caebd3eb839b36357b2c6 (diff)
Merge branch 'NewClipping'
Diffstat (limited to 'src/GraphicObjects')
-rw-r--r--src/GraphicObjects/Border.cs9
-rw-r--r--src/GraphicObjects/GraphicObject.cs112
-rw-r--r--src/GraphicObjects/Group.cs73
-rw-r--r--src/GraphicObjects/IGOLibHost.cs1
-rw-r--r--src/GraphicObjects/ILayoutable.cs1
-rw-r--r--src/GraphicObjects/Label.cs3
-rw-r--r--src/GraphicObjects/PrivateContainer.cs78
-rw-r--r--src/GraphicObjects/RadioButton.cs3
-rw-r--r--src/GraphicObjects/Scroller.cs53
-rw-r--r--src/GraphicObjects/TemplatedControl.cs5
-rw-r--r--src/GraphicObjects/Window.cs2
11 files changed, 209 insertions, 131 deletions
diff --git a/src/GraphicObjects/Border.cs b/src/GraphicObjects/Border.cs
index 58ccff33..7011690e 100644
--- a/src/GraphicObjects/Border.cs
+++ b/src/GraphicObjects/Border.cs
@@ -62,6 +62,15 @@ namespace Crow
CairoHelpers.CairoRectangle(gr, rBack, CornerRadius);
gr.Stroke ();
}
+
+ gr.Save ();
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
+
+ if (child != null)
+ child.Paint (ref gr);
+ gr.Restore ();
}
#endregion
}
diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs
index 14516dba..24fd852a 100644
--- a/src/GraphicObjects/GraphicObject.cs
+++ b/src/GraphicObjects/GraphicObject.cs
@@ -31,6 +31,9 @@ namespace Crow
internal List<Binding> Bindings = new List<Binding> ();
internal int layoutingTries = 0;
+ Rectangles clipping = new Rectangles();
+ public Rectangles Clipping { get { return clipping; }}
+
#region IValueChange implementation
public event EventHandler<ValueChangeEventArgs> ValueChanged;
public virtual void NotifyValueChanged(string MemberName, object _value)
@@ -121,15 +124,7 @@ namespace Crow
[XmlIgnore]public ILayoutable Parent {
get { return _parent; }
set {
-// if (_parent == value)
-// return;
-// if (_parent != null)
-// ClearBinding ();
-//
_parent = value;
-//
-// if (DataSource != null)
-// ResolveBindings ();
}
}
@@ -149,21 +144,19 @@ namespace Crow
get { return Parent == null ? null : Parent.HostContainer; }
}
public virtual Rectangle ContextCoordinates(Rectangle r){
- return
- Parent.ContextCoordinates (r);// + ClientRectangle.Position;
+ GraphicObject go = Parent as GraphicObject;
+ if (go == null)
+ return r + Parent.ClientRectangle.Position;
+ return go.CacheEnabled ?
+ r + Parent.ClientRectangle.Position :
+ Parent.ContextCoordinates (r);
}
public virtual Rectangle ScreenCoordinates (Rectangle r){
return
Parent.ScreenCoordinates(r) + Parent.getSlot().Position + Parent.ClientRectangle.Position;
}
- public virtual Rectangle getSlot()
- {
- return Slot;
- }
- public virtual Rectangle getBounds()
- {
- return Bounds;
- }
+ public virtual Rectangle getSlot() => Slot;
+ public virtual Rectangle getBounds() => Bounds;
#endregion
#region EVENT HANDLERS
@@ -478,14 +471,21 @@ namespace Crow
public virtual bool Contains(GraphicObject goToFind){
return false;
}
-
- public virtual void registerClipRect()
- {
- HostContainer.redrawClip.AddRectangle (ScreenCoordinates(Slot));
+ public virtual void RegisterClip(Rectangle clip){
+ if (CacheEnabled && bmp != null)
+ Clipping.AddRectangle (clip + ClientRectangle.Position);
+ Parent.RegisterClip (clip + Slot.Position + ClientRectangle.Position);
+ }
+// public virtual void registerClipRect(Rectangle clip)
+// {
+// Rectangle tmp = ContextCoordinates (clip);
+// if (CacheEnabled) {
+// }
+ //HostContainer.redrawClip.AddRectangle (ScreenCoordinates(Slot));
//this clipping should take only last painted slots on each level in ancestor tree which
//is not the case for now.
- HostContainer.redrawClip.AddRectangle (ScreenCoordinates(LastPaintedSlot));
- }
+ //HostContainer.redrawClip.AddRectangle (ScreenCoordinates(LastPaintedSlot));
+ //}
/// <summary>
/// Clear chached object and add clipping region in redraw list of interface
/// </summary>
@@ -502,12 +502,6 @@ namespace Crow
{
if (IsQueuedForRedraw)
return;
- //test if this speed up a lot to cancel clipping for an uncached group
- Group p = Parent as Group;
- if (p != null) {
- if (p.bmp == null)
- return;
- }
if (HostContainer == null)
return;
HostContainer.gobjsToRedraw.Add (this);
@@ -734,9 +728,9 @@ namespace Crow
}
/// <summary>
- /// Interfal drawing context creation on a cached surface limited to slot size
+ /// Internal drawing context creation on a cached surface limited to slot size
/// this trigger the effective drawing routine </summary>
- protected virtual void UpdateGraphic ()
+ protected virtual void RecreateCache ()
{
int stride = 4 * Slot.Width;
@@ -752,17 +746,34 @@ namespace Crow
draw.Flush ();
}
}
+ protected virtual void UpdateCache(Context ctx){
+ Rectangle rb = Slot + Parent.ClientRectangle.Position;
+ using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
+ // //TODO:improve equality test for basic color and Fill
+ // if (this.Background is SolidColor) {
+ // if ((this.Background as SolidColor).Equals (Color.Clear)) {
+ // ctx.Save ();
+ // ctx.Operator = Operator.Clear;
+ // ctx.Rectangle (rb);
+ // ctx.Fill ();
+ // ctx.Restore ();
+ // }
+ // }
+ ctx.SetSourceSurface (cache, rb.X, rb.Y);
+ ctx.Paint ();
+ }
+ //Clipping.clearAndClip (ctx);
+ Clipping.Reset();
+ }
/// <summary> Chained painting routine on the parent context of the actual cached version
/// of the widget </summary>
- public virtual void Paint (ref Context ctx, Rectangles clip = null)
+ public virtual void Paint (ref Context ctx)
{
if (!Visible)
return;
LastPaintedSlot = Slot;
- Rectangle rb = Parent.ContextCoordinates (Slot);
-
if (cacheEnabled) {
if (Slot.Width > Interface.MaxCacheSize || Slot.Height > Interface.MaxCacheSize)
cacheEnabled = false;
@@ -770,28 +781,19 @@ namespace Crow
if (cacheEnabled) {
if (bmp == null)
- UpdateGraphic ();
+ RecreateCache ();
- using (ImageSurface source = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
- //TODO:improve equality test for basic color and Fill
- if (this.Background is SolidColor) {
- if ((this.Background as SolidColor).Equals (Color.Clear)) {
- ctx.Save ();
- ctx.Operator = Operator.Clear;
- ctx.Rectangle (rb);
- ctx.Fill ();
- ctx.Restore ();
- }
- }
- ctx.SetSourceSurface (source, rb.X, rb.Y);
- ctx.Paint ();
- }
- return;
+ UpdateCache (ctx);
+ } else {
+ Rectangle rb = Slot + Parent.ClientRectangle.Position;
+ ctx.Save ();
+
+ ctx.Translate (rb.X, rb.Y);
+
+ onDraw (ctx);
+
+ ctx.Restore ();
}
- ctx.Save ();
- ctx.Translate (rb.X, rb.Y);
- onDraw (ctx);
- ctx.Restore ();
}
#endregion
diff --git a/src/GraphicObjects/Group.cs b/src/GraphicObjects/Group.cs
index 9d9abbc6..e1e95579 100644
--- a/src/GraphicObjects/Group.cs
+++ b/src/GraphicObjects/Group.cs
@@ -204,66 +204,53 @@ namespace Crow
break;
}
}
- public override Rectangle ContextCoordinates(Rectangle r){
- return r + ClientRectangle.Position;
- }
protected override void onDraw (Context gr)
{
base.onDraw (gr);
+ gr.Save ();
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
+
foreach (GraphicObject g in children) {
g.Paint (ref gr);
}
+ gr.Restore ();
}
-
- public override void Paint(ref Context ctx, Rectangles clip = null)
+ protected override void UpdateCache (Context ctx)
{
- if ( !Visible )
- return;
-
- if (bmp == null)
- UpdateGraphic ();
- else {
- if (clip != null)
- clip.Rebase (this);
- else {
- clip = new Rectangles ();
- //TODO:added lately slot to empty clip,
- //should rework this precise case causing expandable not
- //to show image changes
- clip.AddRectangle (ContextCoordinates (Slot.Size));
- }
+ Rectangle rb = Slot + Parent.ClientRectangle.Position;
- if (!DrawingIsValid || clip != null) {//false when 1 child has changed
- //child having their content changed has to be repainted
- //and those with slot intersecting clip rectangle have also to be repainted
+ using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
+ Context gr = new Context (cache);
- using (ImageSurface cache =
- new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, Slot.Width * 4)) {
- Context gr = new Context (cache);
- clip.clearAndClip (gr);
+ if (Clipping.count > 0) {
+ Clipping.clearAndClip (gr);
+ base.onDraw (gr);
- Rectangle rBack = Slot.Size;
- Background.SetAsSource (gr, rBack);
- CairoHelpers.CairoRectangle(gr, rBack, CornerRadius);
- gr.Fill ();
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
- #if DEBUG_CLIP_RECTANGLE
- clip.stroke (gr, Color.Amaranth.AdjustAlpha (0.8));
- #endif
- foreach (GraphicObject c in children.Where(ch=>ch.Visible)) {
- Rectangles childClip = clip.intersectingRects (ContextCoordinates(c.Slot));
- if (!c.DrawingIsValid || childClip.count > 0)
- c.Paint (ref gr, childClip);//, localClip);
- }
-
- gr.Dispose ();
+ foreach (GraphicObject c in children) {
+ if (!c.Visible)
+ continue;
+ if (Clipping.intersect(c.Slot + ClientRectangle.Position))
+ c.Paint (ref gr);
}
+
+ #if DEBUG_CLIP_RECTANGLE
+ Clipping.stroke (gr, Color.Amaranth.AdjustAlpha (0.8));
+ #endif
}
+ gr.Dispose ();
+
+ ctx.SetSourceSurface (cache, rb.X, rb.Y);
+ ctx.Paint ();
}
-
- base.Paint (ref ctx, clip);
+ Clipping.Reset();
}
#endregion
diff --git a/src/GraphicObjects/IGOLibHost.cs b/src/GraphicObjects/IGOLibHost.cs
index 1c50d558..1cf6978c 100644
--- a/src/GraphicObjects/IGOLibHost.cs
+++ b/src/GraphicObjects/IGOLibHost.cs
@@ -5,7 +5,6 @@ namespace Crow
{
public interface IGOLibHost
{
- Rectangles redrawClip { get; set; }
List<GraphicObject> gobjsToRedraw { get; }
GraphicObject activeWidget { get; set; }
GraphicObject hoverWidget { get; set; }
diff --git a/src/GraphicObjects/ILayoutable.cs b/src/GraphicObjects/ILayoutable.cs
index 54e54f03..bbf1b4a6 100644
--- a/src/GraphicObjects/ILayoutable.cs
+++ b/src/GraphicObjects/ILayoutable.cs
@@ -21,6 +21,7 @@ namespace Crow
LayoutingType RegisteredLayoutings { get; set; }
void RegisterForLayouting(LayoutingType layoutType);
+ void RegisterClip(Rectangle clip);
bool UpdateLayout(LayoutingType layoutType);
diff --git a/src/GraphicObjects/Label.cs b/src/GraphicObjects/Label.cs
index 1ce9409b..4c7e7006 100644
--- a/src/GraphicObjects/Label.cs
+++ b/src/GraphicObjects/Label.cs
@@ -597,12 +597,11 @@ namespace Crow
SelBegin = -1;
SelRelease = -1;
SelectionInProgress = true;
+ registerForGraphicUpdate();//TODO:should put it in properties
}
//done at the end to set 'hasFocus' value after testing it
base.onMouseDown (sender, e);
-
- registerForGraphicUpdate();
}
public override void onMouseUp (object sender, MouseButtonEventArgs e)
{
diff --git a/src/GraphicObjects/PrivateContainer.cs b/src/GraphicObjects/PrivateContainer.cs
index 9f787eac..77bf655f 100644
--- a/src/GraphicObjects/PrivateContainer.cs
+++ b/src/GraphicObjects/PrivateContainer.cs
@@ -133,33 +133,77 @@ namespace Crow
break;
}
}
-
- public override Rectangle ContextCoordinates (Rectangle r)
+ protected override void onDraw (Context gr)
{
- return
- Parent.ContextCoordinates(r) + Slot.Position + ClientRectangle.Position;
+ base.onDraw (gr);
+
+ gr.Save ();
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
+
+ if (child != null)
+ child.Paint (ref gr);
+ gr.Restore ();
}
- public override void Paint(ref Cairo.Context ctx, Rectangles clip = null)
+ protected override void UpdateCache (Context ctx)
{
- if (!Visible)//check if necessary??
- return;
+ //ctx.Save ();
- ctx.Save();
+ Rectangle rb = Slot + Parent.ClientRectangle.Position;
- if (clip != null)
- clip.clip(ctx);
+ using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
+ Context gr = new Context (cache);
- base.Paint(ref ctx, clip);
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
- //clip to client zone
- CairoHelpers.CairoRectangle (ctx, Parent.ContextCoordinates(ClientRectangle + Slot.Position), CornerRadius);
- ctx.Clip();
+ if (Clipping.count > 0) {
+
+ Clipping.clearAndClip (gr);
+
+ if (child != null) {
+
+ base.onDraw (gr);
- if (child != null)
- child.Paint(ref ctx, clip);
- ctx.Restore();
+ child.Paint (ref gr);
+ }
+ }
+
+ gr.Dispose ();
+
+ ctx.SetSourceSurface (cache, rb.X, rb.Y);
+ ctx.Paint ();
+ }
+ Clipping.Reset();
+
+ //ctx.Restore ();
}
+// public override Rectangle ContextCoordinates (Rectangle r)
+// {
+// return
+// Parent.ContextCoordinates(r) + Slot.Position + ClientRectangle.Position;
+// }
+// public override void Paint(ref Cairo.Context ctx)
+// {
+// if (!Visible)//check if necessary??
+// return;
+//
+// ctx.Save();
+//
+// base.Paint(ref ctx);
+//
+// //clip to client zone
+// CairoHelpers.CairoRectangle (ctx, Parent.ContextCoordinates(ClientRectangle + Slot.Position), CornerRadius);
+// ctx.Clip();
+//
+// if (child != null)
+// child.Paint(ref ctx);
+//
+// ctx.Restore();
+// }
#endregion
diff --git a/src/GraphicObjects/RadioButton.cs b/src/GraphicObjects/RadioButton.cs
index 141a9887..297b4c2b 100644
--- a/src/GraphicObjects/RadioButton.cs
+++ b/src/GraphicObjects/RadioButton.cs
@@ -71,6 +71,9 @@ namespace Crow
get { return isChecked; }
set
{
+ if (isChecked == value)
+ return;
+
isChecked = value;
NotifyValueChanged ("IsChecked", value);
diff --git a/src/GraphicObjects/Scroller.cs b/src/GraphicObjects/Scroller.cs
index 3ac8d66c..1924aac0 100644
--- a/src/GraphicObjects/Scroller.cs
+++ b/src/GraphicObjects/Scroller.cs
@@ -100,6 +100,11 @@ namespace Crow
: base(){}
#region GraphicObject Overrides
+ [XmlAttributeAttribute()][DefaultValue(false)]
+ public override bool CacheEnabled {
+ get { return base.CacheEnabled; }
+ set { base.CacheEnabled = value; }
+ }
void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
{
int maxScroll = MaximumScroll;
@@ -177,22 +182,56 @@ namespace Crow
savedMousePos.Y += e.YDelta;
base.onMouseMove (sender, new MouseMoveEventArgs(savedMousePos.X,savedMousePos.Y,e.XDelta,e.YDelta));
}
- #endregion
-
- public override Rectangle ContextCoordinates (Rectangle r)
+ public override void RegisterClip (Rectangle clip)
{
- return base.ContextCoordinates (r) - new Point((int)ScrollX,(int)ScrollY);
+ base.RegisterClip (clip - new Point((int)ScrollX,(int)ScrollY));
}
+ #endregion
+
public override Rectangle ScreenCoordinates (Rectangle r)
{
return base.ScreenCoordinates (r) - new Point((int)ScrollX,(int)ScrollY);
}
-
- public override void registerClipRect ()
+// protected override void onDraw (Context gr)
+// {
+// gr.Save ();
+// //gr.ResetClip ();
+//
+// base.onDraw (gr);
+// gr.Restore ();
+// }
+ protected override void onDraw (Context gr)
{
- HostContainer.redrawClip.AddRectangle (base.ScreenCoordinates(Slot));
+ Rectangle rBack = new Rectangle (Slot.Size);
+
+ Background.SetAsSource (gr, rBack);
+ CairoHelpers.CairoRectangle(gr,rBack, CornerRadius);
+ gr.Fill ();
+
+ gr.Save ();
+ //clip to scrolled client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);//+ new Point((int)ScrollX,(int)ScrollY)
+ gr.Clip ();
+
+ gr.Translate (-ScrollX, -ScrollY);
+ if (child != null)
+ child.Paint (ref gr);
+ gr.Restore ();
}
+// public override void Paint (ref Context ctx)
+// {
+// ctx.Save ();
+// //ctx.ResetClip ();
+// ctx.Translate (-ScrollX, -ScrollY);
+// base.Paint (ref ctx);
+// ctx.Restore ();
+// }
+// public override void registerClipRect ()
+// {
+// HostContainer.redrawClip.AddRectangle (base.ScreenCoordinates(Slot));
+// }
+
}
}
diff --git a/src/GraphicObjects/TemplatedControl.cs b/src/GraphicObjects/TemplatedControl.cs
index 9dacd466..50199f7a 100644
--- a/src/GraphicObjects/TemplatedControl.cs
+++ b/src/GraphicObjects/TemplatedControl.cs
@@ -93,11 +93,6 @@ namespace Crow
NotifyValueChanged ("TemplatedHeight", 0);
}
}
-
- protected override void loadDefaultValues ()
- {
- base.loadDefaultValues ();
- }
public override GraphicObject FindByName (string nameToFind)
{
//prevent name searching in template
diff --git a/src/GraphicObjects/Window.cs b/src/GraphicObjects/Window.cs
index d98d296c..726f858a 100644
--- a/src/GraphicObjects/Window.cs
+++ b/src/GraphicObjects/Window.cs
@@ -89,7 +89,7 @@ namespace Crow
if (!HasFocus)
return;
- otkgw.redrawClip.AddRectangle (this.ScreenCoordinates(this.Slot));
+ //otkgw.redrawClip.AddRectangle (this.ScreenCoordinates(this.Slot));
int currentLeft = this.Left;
int currentTop = this.Top;