/// <summary>Prevent requeuing multiple times the same widget</summary>
public bool IsQueueForRedraw = false;
/// <summary>drawing Cache, if null, a redraw is done, cached or not</summary>
- public byte[] bmp;
+ public Surface bmp;
public bool IsDirty = true;
/// <summary>
/// This size is computed on each child' layout changes.
/// this trigger the effective drawing routine </summary>
protected virtual void RecreateCache ()
{
- int stride = 4 * Slot.Width;
-
- int bmpSize = Math.Abs (stride) * Slot.Height;
- bmp = new byte[bmpSize];
IsDirty = false;
- using (ImageSurface draw =
- new ImageSurface(bmp, Format.Argb32, Slot.Width, Slot.Height, stride)) {
- using (Context gr = new Context (draw)) {
- gr.Antialias = Interface.Antialias;
- onDraw (gr);
- }
- draw.Flush ();
+ if (bmp != null)
+ bmp.Dispose ();
+ bmp = new ImageSurface (Format.Argb32, Slot.Width, Slot.Height);
+ using (Context gr = new Context (bmp)) {
+ gr.Antialias = Interface.Antialias;
+ onDraw (gr);
}
+ bmp.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)) {
- if (clearBackground) {
- ctx.Save ();
- ctx.Operator = Operator.Clear;
- ctx.Rectangle (rb);
- ctx.Fill ();
- ctx.Restore ();
- }
- ctx.SetSourceSurface (cache, rb.X, rb.Y);
- ctx.Paint ();
+ if (clearBackground) {
+ ctx.Save ();
+ ctx.Operator = Operator.Clear;
+ ctx.Rectangle (rb);
+ ctx.Fill ();
+ ctx.Restore ();
}
+ ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+ ctx.Paint ();
//Clipping.clearAndClip (ctx);
Clipping.Reset();
}
{
Rectangle rb = Slot + Parent.ClientRectangle.Position;
- using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
- Context gr = new Context (cache);
-
- if (Clipping.count > 0) {
- Clipping.clearAndClip (gr);
- base.onDraw (gr);
-
- //clip to client zone
- CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
- gr.Clip ();
-
- lock (Children) {
- 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
+ Context gr = new Context (bmp);
+
+ if (Clipping.count > 0) {
+ Clipping.clearAndClip (gr);
+ base.onDraw (gr);
+
+ //clip to client zone
+ CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+ gr.Clip ();
+
+ lock (Children) {
+ foreach (GraphicObject c in Children) {
+ if (!c.Visible)
+ continue;
+ if (Clipping.intersect (c.Slot + ClientRectangle.Position))
+ c.Paint (ref gr);
+ }
}
- gr.Dispose ();
- ctx.SetSourceSurface (cache, rb.X, rb.Y);
- ctx.Paint ();
+ #if DEBUG_CLIP_RECTANGLE
+ Clipping.stroke (gr, Color.Amaranth.AdjustAlpha (0.8));
+ #endif
}
+ gr.Dispose ();
+
+ ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+ ctx.Paint ();
+
Clipping.Reset();
}
#endregion
{
Rectangle rb = Slot + Parent.ClientRectangle.Position;
- using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) {
- Context gr = new Context (cache);
+ Context gr = new Context (bmp);
- if (Clipping.count > 0) {
- Clipping.clearAndClip (gr);
+ if (Clipping.count > 0) {
+ Clipping.clearAndClip (gr);
- onDraw (gr);
- }
-
- gr.Dispose ();
-
- ctx.SetSourceSurface (cache, rb.X, rb.Y);
- ctx.Paint ();
+ onDraw (gr);
}
- Clipping.Reset();
+
+ gr.Dispose ();
+
+ ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+ ctx.Paint ();
}
#endregion