Release v0.6.7: add DPI-aware cursors for screenshot tools
This commit is contained in:
@@ -31,6 +31,48 @@ int main()
|
||||
if(info.hbmColor) DeleteObject(info.hbmColor);
|
||||
DestroyCursor(cursor);
|
||||
}
|
||||
ks::Surface cursorPreview(784,448);
|
||||
PatBlt(cursorPreview.dc,0,0,784,448,WHITENESS);
|
||||
int row=0;
|
||||
for(int size:{32,48,64,96}) {
|
||||
int column=0;
|
||||
for(int tool:ks::CursorTools) {
|
||||
auto cursor=ks::makeToolCursor(tool,size); ICONINFO info{};
|
||||
require(cursor && GetIconInfo(cursor,&info) && !info.fIcon,"tool cursors support standard and high DPI");
|
||||
require(info.xHotspot==UINT(MulDiv(7,size,32)) && info.yHotspot==info.xHotspot,"tool cursor hotspot stays on crosshair center");
|
||||
BITMAP mask{}; GetObjectW(info.hbmMask,sizeof(mask),&mask);
|
||||
require(mask.bmWidth==size && mask.bmHeight==size*2,"cursor transparency mask matches requested DPI");
|
||||
if(column%2) {
|
||||
RECT tile{column*112,row*112,(column+1)*112,(row+1)*112};
|
||||
auto dark=CreateSolidBrush(RGB(40,40,40)); FillRect(cursorPreview.dc,&tile,dark); DeleteObject(dark);
|
||||
}
|
||||
DrawIconEx(cursorPreview.dc,column*112,row*112,cursor,size,size,0,nullptr,DI_NORMAL);
|
||||
if(info.hbmMask) DeleteObject(info.hbmMask);
|
||||
if(info.hbmColor) DeleteObject(info.hbmColor);
|
||||
DestroyCursor(cursor); ++column;
|
||||
}
|
||||
++row;
|
||||
}
|
||||
auto dib=ks::screenshotClip(cursorPreview.dc,784,448,{}).formats[0].data;
|
||||
BITMAPFILEHEADER bmp{}; bmp.bfType=0x4d42; bmp.bfOffBits=sizeof(bmp)+sizeof(BITMAPINFOHEADER); bmp.bfSize=DWORD(sizeof(bmp)+dib.size());
|
||||
ks::Bytes preview(sizeof(bmp)); memcpy(preview.data(),&bmp,sizeof(bmp)); preview.insert(preview.end(),dib.begin(),dib.end());
|
||||
ks::atomicWrite(L"build/cursor-preview.bmp",preview);
|
||||
for(int tool:{27,26,21,10,11,22,23,24,25,19}) {
|
||||
SendMessageW(window,WM_COMMAND,tool,0);
|
||||
HCURSOR expected=nullptr;
|
||||
if(tool==27) expected=LoadCursorW(nullptr,IDC_ARROW);
|
||||
else if(tool==26) expected=LoadCursorW(nullptr,IDC_IBEAM);
|
||||
else if(tool==21) expected=c.pencilCursor;
|
||||
else for(size_t i=0;i<std::size(ks::CursorTools);++i) if(ks::CursorTools[i]==tool) expected=c.drawingCursors[i];
|
||||
require(expected && ks::actionCursor(c,{-1,ks::MarkPart::None},true)==expected,"each tool uses its own drawing cursor");
|
||||
require(ks::actionCursor(c,{-1,ks::MarkPart::None},false)==LoadCursorW(nullptr,IDC_ARROW),"outside canvas uses normal pointer");
|
||||
c.marks={{{20,20},{120,20},0}};
|
||||
require(ks::actionCursor(c,{0,ks::MarkPart::Body},true)==LoadCursorW(nullptr,IDC_SIZEALL),"move cursor overrides drawing tool");
|
||||
require(ks::actionCursor(c,{0,ks::MarkPart::Rotation},true)==LoadCursorW(nullptr,IDC_HAND),"rotation cursor overrides drawing tool");
|
||||
require(ks::actionCursor(c,{0,ks::MarkPart::End},true)==LoadCursorW(nullptr,IDC_SIZEWE),"endpoint resize overrides drawing tool");
|
||||
require(ks::actionCursor(c,{0,ks::MarkPart::Thickness},true)==LoadCursorW(nullptr,IDC_SIZENS),"thickness resize is perpendicular to line");
|
||||
}
|
||||
c.marks.clear(); SendMessageW(window,WM_COMMAND,27,0);
|
||||
wchar_t windowTitle[128]{}; GetWindowTextW(window,windowTitle,128);
|
||||
require(std::wstring(windowTitle)==L"KSwitcher — Screenshot #1","title includes editor index without usage hints");
|
||||
RECT client{}; GetClientRect(window,&client);
|
||||
|
||||
Reference in New Issue
Block a user