70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
|
package render
|
||
|
|
||
|
// TrimBox helps with Engine.Copy() to trim a destination box so that it
|
||
|
// won't overflow with the parent container.
|
||
|
func TrimBox(src, dst *Rect, p Point, S Rect, thickness int32) {
|
||
|
// Constrain source width to not bigger than Canvas width.
|
||
|
if src.W > S.W {
|
||
|
src.W = S.W
|
||
|
}
|
||
|
if src.H > S.H {
|
||
|
src.H = S.H
|
||
|
}
|
||
|
|
||
|
// If the destination width will cause it to overflow the widget
|
||
|
// box, trim off the right edge of the destination rect.
|
||
|
//
|
||
|
// Keep in mind we're dealing with chunks here, and a chunk is
|
||
|
// a small part of the image. Example:
|
||
|
// - Canvas is 800x600 (S.W=800 S.H=600)
|
||
|
// - Chunk wants to render at 790,0 width 100,100 or whatever
|
||
|
// dst={790, 0, 100, 100}
|
||
|
// - Chunk box would exceed 800px width (X=790 + W=100 == 890)
|
||
|
// - Find the delta how much it exceeds as negative (800 - 890 == -90)
|
||
|
// - Lower the Source and Dest rects by that delta size so they
|
||
|
// stay proportional and don't scale or anything dumb.
|
||
|
if dst.X+src.W > p.X+S.W {
|
||
|
// NOTE: delta is a negative number,
|
||
|
// so it will subtract from the width.
|
||
|
delta := (p.X + S.W - thickness) - (dst.W + dst.X)
|
||
|
src.W += delta
|
||
|
dst.W += delta
|
||
|
}
|
||
|
if dst.Y+src.H > p.Y+S.H {
|
||
|
// NOTE: delta is a negative number
|
||
|
delta := (p.Y + S.H - thickness) - (dst.H + dst.Y)
|
||
|
src.H += delta
|
||
|
dst.H += delta
|
||
|
}
|
||
|
|
||
|
// The same for the top left edge, so the drawings don't overlap
|
||
|
// menu bars or left side toolbars.
|
||
|
// - Canvas was placed 80px from the left of the screen.
|
||
|
// Canvas.MoveTo(80, 0)
|
||
|
// - A texture wants to draw at 60, 0 which would cause it to
|
||
|
// overlap 20 pixels into the left toolbar. It needs to be cropped.
|
||
|
// - The delta is: p.X=80 - dst.X=60 == 20
|
||
|
// - Set destination X to p.X to constrain it there: 20
|
||
|
// - Subtract the delta from destination W so we don't scale it.
|
||
|
// - Add 20 to X of the source: the left edge of source is not visible
|
||
|
if dst.X < p.X {
|
||
|
// NOTE: delta is a positive number,
|
||
|
// so it will add to the destination coordinates.
|
||
|
delta := p.X - dst.X
|
||
|
dst.X = p.X + thickness
|
||
|
dst.W -= delta
|
||
|
src.X += delta
|
||
|
}
|
||
|
if dst.Y < p.Y {
|
||
|
delta := p.Y - dst.Y
|
||
|
dst.Y = p.Y + thickness
|
||
|
dst.H -= delta
|
||
|
src.Y += delta
|
||
|
}
|
||
|
|
||
|
// Trim the destination width so it doesn't overlap the Canvas border.
|
||
|
if dst.W >= S.W-thickness {
|
||
|
dst.W = S.W - thickness
|
||
|
}
|
||
|
}
|