feat(photos): добавить пресеты кривой и починить переключение фото
- PCHIP для предпросмотра и серверного рендера - пресеты всех каналов в профиле, импорт и экспорт - мерж настроек auth без потери разделов - сохранение вкладки и правок текущего фото при переключении
This commit is contained in:
@@ -91,6 +91,70 @@ func TestCurveLUTSteepens(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// The client builds the same 256-entry LUT (frontend/src/lib/edit.ts). The
|
||||
// hard-coded samples keep the Go and TypeScript implementations in sync.
|
||||
func TestCurveLUTMatchesClient(t *testing.T) {
|
||||
samples := []int{0, 32, 64, 128, 192, 224, 255}
|
||||
cases := []struct {
|
||||
name string
|
||||
points []CurvePoint
|
||||
want []int
|
||||
}{
|
||||
{"linear", []CurvePoint{{0, 0}, {1, 1}}, []int{0, 32, 64, 128, 192, 224, 255}},
|
||||
{
|
||||
"medium",
|
||||
[]CurvePoint{{0, 0}, {0.25, 0.2}, {0.5, 0.5}, {0.75, 0.8}, {1, 1}},
|
||||
[]int{0, 23, 51, 128, 205, 233, 255},
|
||||
},
|
||||
{
|
||||
"strong",
|
||||
[]CurvePoint{{0, 0}, {0.2, 0.12}, {0.5, 0.5}, {0.8, 0.88}, {1, 1}},
|
||||
[]int{0, 17, 43, 128, 213, 239, 255},
|
||||
},
|
||||
{
|
||||
"inner",
|
||||
[]CurvePoint{{0.1, 0.05}, {0.4, 0.3}, {0.9, 0.95}},
|
||||
[]int{13, 17, 42, 104, 186, 234, 242},
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
lut := curveLUT(tc.points)
|
||||
for i, index := range samples {
|
||||
if int(lut[index]) != tc.want[i] {
|
||||
t.Fatalf("%s lut[%d] = %d, want %d", tc.name, index, lut[index], tc.want[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCurveLUTIsMonotone(t *testing.T) {
|
||||
for _, points := range [][]CurvePoint{
|
||||
{{0, 0}, {0.25, 0.2}, {0.5, 0.5}, {0.75, 0.8}, {1, 1}},
|
||||
{{0, 0}, {0.2, 0.12}, {0.5, 0.5}, {0.8, 0.88}, {1, 1}},
|
||||
} {
|
||||
lut := curveLUT(points)
|
||||
for i := 1; i < len(lut); i++ {
|
||||
if lut[i] < lut[i-1] {
|
||||
t.Fatalf("lut[%d] = %d < lut[%d] = %d", i, lut[i], i-1, lut[i-1])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCurveLUTFlatOutsideEndpoints(t *testing.T) {
|
||||
lut := curveLUT([]CurvePoint{{0.1, 0.05}, {0.4, 0.3}, {0.9, 0.95}})
|
||||
for i := 0; i <= int(math.Floor(0.1*255)); i++ {
|
||||
if lut[i] != 13 {
|
||||
t.Fatalf("lut[%d] = %d, want flat 13", i, lut[i])
|
||||
}
|
||||
}
|
||||
for i := 230; i < len(lut); i++ {
|
||||
if lut[i] != 242 {
|
||||
t.Fatalf("lut[%d] = %d, want flat 242", i, lut[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyLightBrightensAndKeepsSource(t *testing.T) {
|
||||
src := image.NewNRGBA(image.Rect(0, 0, 2, 2))
|
||||
for i := range src.Pix {
|
||||
|
||||
Reference in New Issue
Block a user