diff --git a/internal/system/box.go b/internal/system/box.go index 7e5fdd8..224e9ac 100644 --- a/internal/system/box.go +++ b/internal/system/box.go @@ -75,7 +75,8 @@ func (this *System) newBox (outer anyBox) *box { if box.parent == nil { return nil } parentCanvas := box.parent.getCanvas() if parentCanvas == nil { return nil } - return parentCanvas.SubCanvas(box.bounds) + drawableArea := box.bounds.Intersect(box.parent.getInnerClippingBounds()) + return parentCanvas.SubCanvas(drawableArea) }) if outer == nil { box.drawer = box diff --git a/internal/system/containerbox.go b/internal/system/containerbox.go index 3c454db..58a3ef7 100644 --- a/internal/system/containerbox.go +++ b/internal/system/containerbox.go @@ -298,6 +298,10 @@ func (this *containerBox) getCanvas () canvas.Canvas { return this.canvas.Value() } +func (this *containerBox) getInnerClippingBounds () image.Rectangle { + return this.innerClippingBounds +} + func (this *containerBox) notifyMinimumSizeChange (child anyBox) { this.invalidateMinimum() size := child.minimumSize() diff --git a/internal/system/hierarchy.go b/internal/system/hierarchy.go index b4181df..5a45116 100644 --- a/internal/system/hierarchy.go +++ b/internal/system/hierarchy.go @@ -193,6 +193,10 @@ func (this *Hierarchy) getCanvas () canvas.Canvas { return this.canvas } +func (this *Hierarchy) getInnerClippingBounds () image.Rectangle { + return this.canvas.Bounds() +} + func (this *Hierarchy) getModifiers () input.Modifiers { return this.modifiers } diff --git a/internal/system/internal-iface.go b/internal/system/internal-iface.go index 986f207..4304e99 100644 --- a/internal/system/internal-iface.go +++ b/internal/system/internal-iface.go @@ -12,6 +12,9 @@ type parent interface { getHierarchy () *Hierarchy // canvas returns the canvas held by the parent. getCanvas () canvas.Canvas + // getInnerClippingBounds returns the area of the canvas that children + // can draw to. + getInnerClippingBounds () image.Rectangle // notifyMinimumSizeChange informs the parent that the minimum size of // one of its children has changed. notifyMinimumSizeChange (anyBox)