Release v0.6.52: add Arc tool to screenshot editor

This commit is contained in:
agrynco committed 2026-11-06 12:32:27 +02:00
1 parent 3b8b8f26fe
commit ede4ce47c0
10 files changed
+79 -31

No files matched your search

+32
View File
@@ -141,6 +141,38 @@ int main(int argc, char **argv)
SendMessageW(window,WM_COMMAND,12,0); require(c.marks.empty(),"undo trapezoid creation");
SendMessageW(window,WM_COMMAND,18,0); require(c.marks[0].shape==ks::ScreenshotShape::Trapezoid,"redo trapezoid creation");
c.marks.clear(); c.selected=-1; c.history=ks::ScreenshotHistory{};
require(GetDlgItem(window,38)!=nullptr,"arc has a dedicated toolbar button");
SendMessageW(window,WM_KEYDOWN,'U',0);
require(c.shape==ks::ScreenshotShape::Arc && c.arrow && !c.freehand,"U selects arc tool");
mouse(WM_LBUTTONDOWN,{60,70}); mouse(WM_LBUTTONUP,{240,180});
require(c.marks.size()==1 && c.marks[0].shape==ks::ScreenshotShape::Arc && !c.marks[0].isHighlight(),
"arc tool creates an editable shape");
auto arc=c.marks[0];
require(ks::hitScreenshotMark(arc,{150,70},3)==ks::MarkPart::Body &&
ks::hitScreenshotMark(arc,{150,180},3)==ks::MarkPart::None,
"arc selects its curve but has no closing chord");
ks::Surface rendered(320,240); PatBlt(rendered.dc,0,0,320,240,WHITENESS);
ks::drawMarks(rendered.dc,{arc});
require(GetPixel(rendered.dc,150,70)==arc.color && GetPixel(rendered.dc,150,180)==RGB(255,255,255),
"arc renders an open curve without a closing chord");
auto exported=ks::decodeImage(ks::screenshotClip(c.image->dc,320,240,{arc}));
auto channel=[&](int x,int y,int component){return exported.bgra[(y*exported.width+x)*4+component];};
require(channel(150,70,2)==GetRValue(arc.color) && channel(150,70,1)==GetGValue(arc.color) &&
channel(150,180,0)==255 && channel(150,180,1)==255 && channel(150,180,2)==255,
"PNG export preserves the arc and its open chord");
mouse(WM_LBUTTONDOWN,arc.to); mouse(WM_LBUTTONUP,{260,200});
require(c.marks[0].to.x==260 && c.marks[0].points.back().y==200,"arc resizes with its bounds");
auto arcGrip=ks::screenshotShapeRotationHandle(arc);
auto turned=ks::dragScreenshotMark(arc,ks::MarkPart::Rotation,arcGrip,{280,135},320,240);
require(turned.rotation!=0 && ks::hitScreenshotMark(turned,ks::rotateShapePoint(turned,{150,70}),3)==ks::MarkPart::Body,
"rotated arc remains selectable");
std::vector<ks::Mark> linked{arc}; ks::Mark connector{{10,10},{150,70},0};
ks::linkScreenshotEndpoint(connector,false,{150,70},linked,4);
require(connector.toLink.target!=0,"connector can attach to the arc curve");
SendMessageW(window,WM_COMMAND,12,0); require(c.marks[0].to.x==240,"undo arc resize");
SendMessageW(window,WM_COMMAND,12,0); require(c.marks.empty(),"undo arc creation");
SendMessageW(window,WM_COMMAND,18,0); require(c.marks[0].shape==ks::ScreenshotShape::Arc,"redo arc creation");
c.marks.clear(); c.selected=-1; c.history=ks::ScreenshotHistory{};
SendMessageW(window,WM_COMMAND,21,0);
}
{