feat: add line and arrow annotations

This commit is contained in:
2026-07-12 21:09:23 +08:00
parent b82108db38
commit 50551de105
4 changed files with 220 additions and 23 deletions
+49
View File
@@ -229,3 +229,52 @@ func TestApplyAnnotationsPixelatesOnlyMosaicBrushStroke(t *testing.T) {
t.Fatalf("expected pixels outside brush path to remain unchanged")
}
}
func TestApplyAnnotationsDrawsStraightLine(t *testing.T) {
src := image.NewRGBA(image.Rect(0, 0, 60, 40))
draw.Draw(src, src.Bounds(), &image.Uniform{C: color.White}, image.Point{}, draw.Src)
var buf bytes.Buffer
if err := png.Encode(&buf, src); err != nil {
t.Fatalf("encode source: %v", err)
}
out, err := ApplyAnnotations(buf.Bytes(), []Annotation{{
Tool: "line", Color: "#ef4444", StrokeWidth: 4,
Points: []Point{{X: 5, Y: 20}, {X: 50, Y: 20}},
}}, 1)
if err != nil {
t.Fatalf("apply annotations: %v", err)
}
img, err := png.Decode(bytes.NewReader(out))
if err != nil {
t.Fatalf("decode output: %v", err)
}
got := color.RGBAModel.Convert(img.At(30, 20)).(color.RGBA)
if got.R < 180 || got.G > 180 || got.B > 180 {
t.Fatalf("expected red line at center, got %#v", got)
}
}
func TestApplyAnnotationsDrawsArrowHead(t *testing.T) {
src := image.NewRGBA(image.Rect(0, 0, 80, 60))
draw.Draw(src, src.Bounds(), &image.Uniform{C: color.White}, image.Point{}, draw.Src)
var buf bytes.Buffer
if err := png.Encode(&buf, src); err != nil {
t.Fatalf("encode source: %v", err)
}
out, err := ApplyAnnotations(buf.Bytes(), []Annotation{{
Tool: "arrow", Color: "#3b82f6", StrokeWidth: 3,
Points: []Point{{X: 10, Y: 30}, {X: 60, Y: 30}},
}}, 1)
if err != nil {
t.Fatalf("apply annotations: %v", err)
}
img, err := png.Decode(bytes.NewReader(out))
if err != nil {
t.Fatalf("decode output: %v", err)
}
shaft := color.RGBAModel.Convert(img.At(35, 30)).(color.RGBA)
head := color.RGBAModel.Convert(img.At(52, 25)).(color.RGBA)
if shaft.B < 180 || shaft.R > 140 || head.B < 180 || head.R > 140 {
t.Fatalf("expected blue arrow shaft and head, got shaft=%#v head=%#v", shaft, head)
}
}