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 }