Files
2026-09-17 22:59:42 +03:00

92 lines
2.6 KiB
Go

package video
import (
"fmt"
"sort"
"mxl-pattern-generator/kernels"
)
type PatternInfo struct {
Name string
Description string
}
type pattern struct {
PatternInfo
kernelSource string
dynamic bool
}
var patterns = map[string]pattern{
"ebu75": {
PatternInfo: PatternInfo{Name: "ebu75", Description: "EBU 75% Color Bar Signal"},
kernelSource: mustReadKernel("static/ebu75.wgsl"),
},
"ebu75-move": {
PatternInfo: PatternInfo{Name: "ebu75-move", Description: "EBU 75% Color Bar Signal with moving square"},
kernelSource: mustReadKernel("dynamic/ebu75.wgsl"),
dynamic: true,
},
"ebu100": {
PatternInfo: PatternInfo{Name: "ebu100", Description: "EBU 100% Color Bar Signal"},
kernelSource: mustReadKernel("static/ebu100.wgsl"),
},
"ebu100-move": {
PatternInfo: PatternInfo{Name: "ebu100-move", Description: "EBU 100% Color Bar Signal with moving square"},
kernelSource: mustReadKernel("dynamic/ebu100.wgsl"),
dynamic: true,
},
"smpte": {
PatternInfo: PatternInfo{Name: "smpte", Description: "SMPTE RP-219 Color Bar Signal"},
kernelSource: mustReadKernel("static/smpteBars.wgsl"),
},
"smpte-move": {
PatternInfo: PatternInfo{Name: "smpte-move", Description: "SMPTE RP-219 Color Bar Signal with moving square"},
kernelSource: mustReadKernel("dynamic/smpteBars.wgsl"),
dynamic: true,
},
"gray-bars": {
PatternInfo: PatternInfo{Name: "gray-bars", Description: "13-step grayscale bars (Y 64..940)"},
kernelSource: mustReadKernel("static/yBars.wgsl"),
},
"gray-bars-move": {
PatternInfo: PatternInfo{Name: "gray-bars-move", Description: "13-step grayscale bars (Y 64..940) with moving square"},
kernelSource: mustReadKernel("dynamic/yBars.wgsl"),
dynamic: true,
},
"gray-ramp": {
PatternInfo: PatternInfo{Name: "gray-ramp", Description: "Y gradient (black -> 100% white)"},
kernelSource: mustReadKernel("static/yRamp.wgsl"),
},
"gray-ramp-move": {
PatternInfo: PatternInfo{Name: "gray-ramp-move", Description: "Y gradient with moving square"},
kernelSource: mustReadKernel("dynamic/yRamp.wgsl"),
dynamic: true,
},
}
func mustReadKernel(name string) string {
source, err := kernels.Read(name)
if err != nil {
panic(fmt.Sprintf("read embedded video kernel %q: %v", name, err))
}
return string(source)
}
func HasPattern(name string) bool {
_, ok := patterns[name]
return ok
}
func Patterns() []PatternInfo {
result := make([]PatternInfo, 0, len(patterns))
for _, pattern := range patterns {
result = append(result, pattern.PatternInfo)
}
sort.Slice(result, func(i, j int) bool {
return result[i].Name < result[j].Name
})
return result
}