72 lines
3.3 KiB
C++
72 lines
3.3 KiB
C++
#pragma once
|
|
#include "platform.h"
|
|
namespace ks
|
|
{
|
|
// Only the on-demand screenshot process owns this state; no resident App dependency.
|
|
struct ScreenshotHost {
|
|
HINSTANCE instance{};
|
|
HWND window{};
|
|
unsigned windows{};
|
|
bool (*notify)(const Clip &){};
|
|
bool autoOpenEditor = false;
|
|
};
|
|
inline constexpr UINT ScreenshotRequest=WM_APP+71, ScreenshotIdle=WM_APP+72;
|
|
void showScreenshot(ScreenshotHost &);
|
|
void showScreenshotEditor(ScreenshotHost &,const Clip &);
|
|
enum class LineStyle { Solid, Dotted, Dashed, DashDot };
|
|
enum class LineEnds { End, Start, Both, None };
|
|
enum class ScreenshotShape { None, Rectangle, Circle, Ellipse };
|
|
struct ScreenshotOffset { double x, y; };
|
|
struct ScreenshotLink {
|
|
unsigned long long target{};
|
|
double u{}, v{}; // Relative boundary position, or fractional position along a path.
|
|
};
|
|
struct ScreenshotMark {
|
|
POINT from, to; int number; int radius = 15; int thickness = 3;
|
|
int fromNumber = 0, toNumber = 0;
|
|
std::vector<POINT> points;
|
|
COLORREF color = RGB(225,42,50);
|
|
bool freehand = false;
|
|
LineStyle style = LineStyle::Solid;
|
|
LineEnds ends = LineEnds::End;
|
|
ScreenshotShape shape = ScreenshotShape::None;
|
|
std::wstring text, fontName=L"Segoe UI";
|
|
int fontSize=24, fontWeight=FW_NORMAL;
|
|
bool fontItalic=false;
|
|
double rotation=0;
|
|
std::wstring label;
|
|
ScreenshotOffset labelOffset{0,-24}; // Along the line and perpendicular to it, in image pixels.
|
|
bool labelRotationManual=false;
|
|
unsigned long long id{};
|
|
ScreenshotLink fromLink, toLink;
|
|
bool isText() const { return !text.empty(); }
|
|
bool isHighlight() const { return !points.empty() && !freehand; }
|
|
bool isLine() const { return !number && !isText() && !isHighlight() && shape==ScreenshotShape::None; }
|
|
};
|
|
class ScreenshotHistory {
|
|
std::deque<std::vector<ScreenshotMark>> past, future;
|
|
public:
|
|
void remember(const std::vector<ScreenshotMark> &);
|
|
bool undo(std::vector<ScreenshotMark> &);
|
|
bool redo(std::vector<ScreenshotMark> &);
|
|
bool canUndo() const { return !past.empty(); }
|
|
bool canRedo() const { return !future.empty(); }
|
|
};
|
|
void resolveScreenshotLinks(std::vector<ScreenshotMark> &);
|
|
void linkScreenshotEndpoint(ScreenshotMark &, bool start, POINT drop,
|
|
std::vector<ScreenshotMark> &, double tolerance);
|
|
enum class MarkPart { None, Body, Start, End, Radius, Thickness, Rotation, Label };
|
|
POINT screenshotThicknessHandle(const ScreenshotMark &, double clearance = 16);
|
|
ScreenshotMark cloneScreenshotMark(const ScreenshotMark &, const std::vector<ScreenshotMark> &, int width, int height);
|
|
int nextScreenshotNumber(const std::vector<ScreenshotMark> &);
|
|
MarkPart hitScreenshotMark(const ScreenshotMark &, POINT, double tolerance);
|
|
ScreenshotMark dragScreenshotMark(const ScreenshotMark &, MarkPart, POINT origin, POINT position,
|
|
int width, int height, bool snapRotation=false);
|
|
POINT constrainScreenshotShape(ScreenshotShape, POINT anchor, POINT position, int width, int height);
|
|
RECT screenshotTextBounds(const ScreenshotMark &);
|
|
POINT screenshotTextRotationHandle(const ScreenshotMark &, double clearance=24);
|
|
ScreenshotMark screenshotArrowLabel(const ScreenshotMark &);
|
|
// Render at source resolution; never reads or writes the system clipboard.
|
|
Clip screenshotClip(HDC source, int width, int height, const std::vector<ScreenshotMark> &marks);
|
|
}
|