// SPDX-License-Identifier: MIT
// Derived from Rough.js 4.0.4, Copyright (c) 2019 Preet Shihn.

package rough

import 

// patternFiller is the source-shaped counterpart of Rough.js's PatternFiller.
type patternFiller interface {
	fillPolygon(points []Point, o *ResolvedOptions) OpSet
}

// renderHelper is the narrow portion of renderer.go used by the pattern
// fillers. Rough.js represents this helper as an object of function fields;
// preserving that shape also makes filler behavior independently testable.
type renderHelper struct {
	randOffset          func(x float64, o *ResolvedOptions) float64
	randOffsetWithRange func(min, max float64, o *ResolvedOptions) float64
	ellipse             func(x, y, width, height float64, o *ResolvedOptions) OpSet
	doubleLineOps       func(x1, y1, x2, y2 float64, o *ResolvedOptions) []Op
}

var fillerCache = struct {
	sync.Mutex
	fillers map[string]patternFiller
}{fillers: make(map[string]patternFiller)}

// getFiller mirrors Rough.js's module-level filler cache. renderer.go always
// supplies the same helper; the lock makes first use safe across concurrent
// generators without changing the source cache semantics.
func getFiller( *ResolvedOptions,  renderHelper) patternFiller {
	 := .FillStyle
	if  == "" {
		 = "hachure"
	}

	fillerCache.Lock()
	defer fillerCache.Unlock()
	if  := fillerCache.fillers[];  != nil {
		return 
	}

	var  patternFiller
	switch  {
	case "zigzag":
		 = &zigZagFiller{hachureFiller: hachureFiller{helper: }}
	case "cross-hatch":
		 = &hatchFiller{hachureFiller: hachureFiller{helper: }}
	case "dots":
		 = &dotFiller{helper: }
	case "dashed":
		 = &dashedFiller{helper: }
	case "zigzag-line":
		 = &zigZagLineFiller{helper: }
	case "hachure":
		 = &hachureFiller{helper: }
	default:
		 = "hachure"
		if  = fillerCache.fillers[];  != nil {
			return 
		}
		 = &hachureFiller{helper: }
	}
	fillerCache.fillers[] = 
	return 
}