swf2ass-go/types/shapes/PendingPath.go

45 lines
939 B
Go

package shapes
import (
"git.gammaspectra.live/WeebDataHoarder/swf-go/types"
"slices"
)
type PendingPathMap map[int]*PendingPath[types.Twip]
func (m PendingPathMap) MergePath(p *ActivePath, directed bool) {
if _, ok := m[p.StyleId]; !ok {
m[p.StyleId] = &PendingPath[types.Twip]{}
}
m[p.StyleId].MergePath(&p.Segment, directed)
}
type PendingPath[T ~float64 | ~int64] []*PathSegment[T]
func (p *PendingPath[T]) MergePath(newSegment *PathSegment[T], directed bool) {
if !newSegment.IsEmpty() {
var merged *PathSegment[T]
for i, segment := range *p {
if segment.TryMerge(newSegment, directed) {
*p = slices.Delete(*p, i, i+1)
merged = segment
break
}
}
if merged != nil {
p.MergePath(merged, directed)
} else {
*p = append(*p, newSegment)
}
}
}
func (p *PendingPath[T]) GetShape() (shape Shape) {
for _, segment := range *p {
shape = shape.Merge(segment.GetShape())
}
return shape
}