Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
fe64ff3
Initial stroke recognition implementation
PallidVeil Jul 29, 2026
d4d5d80
Implement shape decision logic and fix resampling
PallidVeil Jul 29, 2026
43b1939
Add circle recognition algorithm
PallidVeil Jul 29, 2026
f93ad1e
Improve circle scoring and reduce triangle and square detection noise
PallidVeil Jul 29, 2026
3293938
Improve square edge parallelism and shape replacement
PallidVeil Jul 29, 2026
1470cbe
Fix recognized stroke size mismatch
PallidVeil Jul 29, 2026
573a527
Fix shape replacement and adjust line score penalty
PallidVeil Jul 29, 2026
7339bc0
Refactor stroke recognition into context structs
PallidVeil Jul 29, 2026
e01c1c6
Clean up stroke recognition and improve debugging
PallidVeil Jul 29, 2026
7137e70
Implement distance-based resampling
PallidVeil Jul 29, 2026
e87cc54
Add stroke recognition toggle
PallidVeil Jul 29, 2026
06ff52a
Add stroke recognition documentation
PallidVeil Jul 29, 2026
fd87730
Rename stroke recognition files
PallidVeil Jul 29, 2026
7e7bb62
deleted unused files
PallidVeil Jul 31, 2026
ff24e80
made angle treshold 12 and add a penalty for corner points in circle …
PallidVeil Jul 31, 2026
be856fc
Move recognized shape drawing to Geometry
PallidVeil Jul 31, 2026
ac4a76b
Resolve cppcheck warnings in stroke recognition
PallidVeil Jul 31, 2026
b5b59a5
Reformat StrokeRecognition functions to K&R style
PallidVeil Jul 31, 2026
7c42306
moved functions to geometry.cpp
PallidVeil Jul 31, 2026
3cd2ac8
fixed some cppcheck errors
PallidVeil Jul 31, 2026
4b6ec29
made shape-recognition false by default
PallidVeil Jul 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ debian/pardus-pen
debian/files
debian/debhelper-build-stamp
debian/pardus-pen.substvars
debian/pardus-pen.debhelper.log
debian/pardus-pen.debhelper.log
1 change: 1 addition & 0 deletions data/tr.org.pardus.pen.default.conf
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ fuar=false
xwayland=false
eraser-mode=true
dbus_init=false
shape-recognition=false
82 changes: 82 additions & 0 deletions include/utils/StrokeRecognition.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#pragma once

#include <array>
#include <cmath>
#include <QMap>
#include <QPointF>
#include <QVector>
#include <algorithm>

namespace StrokeRecognitionConstants {
constexpr int RESAMPLE_POINTS = 64;
constexpr float MIN_CHANGE_DEGREE = 12.0f;
constexpr float STRONG_REGION_TURN = 60.0f;
constexpr float ANGLE_THRESHOLD = 45.0f;
constexpr float MIN_SCORE = 75.0f;
constexpr int TOTAL_GROUP = 8;
constexpr float ERROR_SCALE = 2.0f;
constexpr float CIRCLE_ANGLE_THRESHOLD = 60.0f;
} // namespace StrokeRecognitionConstants

inline constexpr int RESAMPLE_POINTS = StrokeRecognitionConstants::RESAMPLE_POINTS;
inline constexpr float MIN_CHANGE_DEGREE = StrokeRecognitionConstants::MIN_CHANGE_DEGREE;
inline constexpr float STRONG_REGION_TURN = StrokeRecognitionConstants::STRONG_REGION_TURN;
inline constexpr float ANGLE_THRESHOLD = StrokeRecognitionConstants::ANGLE_THRESHOLD;
inline constexpr float MIN_SCORE = StrokeRecognitionConstants::MIN_SCORE;
inline constexpr int TOTAL_GROUP = StrokeRecognitionConstants::TOTAL_GROUP;
inline constexpr float ERROR_SCALE = StrokeRecognitionConstants::ERROR_SCALE;
inline constexpr float CIRCLE_ANGLE_THRESHOLD = StrokeRecognitionConstants::CIRCLE_ANGLE_THRESHOLD;

struct StrokeVariables {
std::array<QPointF, RESAMPLE_POINTS> points{};
std::array<float, RESAMPLE_POINTS - 1> theta{};
std::array<float, RESAMPLE_POINTS - 2> deltaTheta{};
std::array<int, RESAMPLE_POINTS - 2> turnRegionStart{};
std::array<int, RESAMPLE_POINTS - 2> turnRegionEnd{};
std::array<float, RESAMPLE_POINTS - 2> turnRegionSum{};

int pointCount = 0;
int turnRegionCount = 0;
};

struct StrokeFeatures {
float totalTurnDegree = 0.0f;
float totalAbsTurnDegree = 0.0f;
float straightnessScore = 0.0f;
float totalLength = 0.0f;
float noise = 0.0f;
int directionChangeCount = 0;
int turnRegionCount = 0;
};

struct StrokeResult {
std::array<QPointF, 4> idealCorners{};
QPointF circleCenter{};
float circleRadius = 0.0f;
};

struct StrokeScore {
float closureScore = 0.0f;
float lineScore = 0.0f;
float triangleScore = 0.0f;
float squareScore = 0.0f;
float circleScore = 0.0f;

float circleRadiusScore = 0.0f;
float squareShapeFit = 0.0f;
float triangleShapeFit = 0.0f;

int decision = 0;
};

int stroke_recognition(const QMap<long long, QPointF> &points, StrokeVariables &variables,
StrokeResult &result);

#define RECOG_UNKNOWN 0
#define RECOG_LINE 1
#define RECOG_CIRCLE 2
#define RECOG_TRIANGLE 3
#define RECOG_SQUARE 4
#define RECOG_DISTANCE_ERROR 6
#define RECOG_LENGTH_ERROR 7
#define RECOG_START_ERROR 8
4 changes: 4 additions & 0 deletions include/widgets/Button.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@
#include "../constants.h"

class QSlider;
class QCheckBox;

extern QMap<qint64, QPushButton*> penButtons;
extern QMap<qint64, QPushButton*> toolButtons;
extern QCheckBox *recognitionToggle;

void updateRecognitionToggleColor();
extern QSlider *thicknessSlider;
extern char* get_icon_by_id(int id);
extern QString get_overlay_by_id(int id);
Expand Down
14 changes: 13 additions & 1 deletion include/widgets/DrawingWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "../utils/Selection.h"
#include "../utils/Storage.h"
#include "FloatingSettings.h"
#include "../utils/StrokeRecognition.h"

#define PRESS 0
#define MOVE 1
Expand Down Expand Up @@ -89,6 +90,11 @@ class DrawingWidget : public QWidget {
void goNextPage();
void clear();
void clearAll();
void drawRecognizedShape(int decision,
const StrokeVariables &variables,
const StrokeResult &result);
int performStrokeRecognition();
void applyRecognitionResult(int decision , QImage &backgroundImage);
#ifdef LIBARCHIVE
void saveAll(QString filename);
void loadArchive(const QString& filename);
Expand All @@ -107,11 +113,14 @@ class DrawingWidget : public QWidget {
int getPenStyle();
void setLineStyle(int type);
int getLineStyle();
void setRecognitionEnabled(bool enabled) { recognitionEnabled = enabled; }
bool isRecognitionEnabled() const { return recognitionEnabled; }
void drawArrow(QPainter& painter, QPointF start, QPointF end);
void eventHandler(int source, int type, int id, QPointF pos, float pressure);
void setOverlay(QImage img, int page);
QImage getOverlay(int page);
void commitText();

#ifdef QPRINTER
QString pdfPath;
#endif
Expand All @@ -134,6 +143,10 @@ class DrawingWidget : public QWidget {
int penStyle;
int lineStyle;
GeometryStorage geo;
QMap<long long, QPointF> recognitionPoints;
StrokeVariables recognitionVariables;
StrokeResult recognitionResult;
bool recognitionEnabled = true;
QPainter painter;
QPointF textPos;
QString textBuffer;
Expand All @@ -146,4 +159,3 @@ void qImageToFile(const QImage& image, const QString& filename);
QString generateRandomString(int length);

#endif // DRAWINGWIDGET_H

1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ src = [
'src/utils/misc.c',
'src/utils/eta-keyboard.cpp',
'src/utils/Storage.cpp',
'src/utils/StrokeRecognition.cpp',
]

version = '0.0.0'
Expand Down
82 changes: 81 additions & 1 deletion src/SetupWidgets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,45 @@ QWidget *penTypeDialog;
QWidget *modeDialog;
QVBoxLayout *closeMenuLayout;
QWidget *bgMenu;
QCheckBox *recognitionToggle;


static QVBoxLayout *penSettingsLayout;
static QVBoxLayout *pageSettingsLayout;

extern void clearCache();

void updateRecognitionToggleColor()
{
if (recognitionToggle == nullptr)
{
return;
}

const QString penColor = drawing->pen.color().name();
recognitionToggle->setStyleSheet(
"#recognitionToggle {"
"background: transparent;"
"color: #c0c0c0;"
"spacing: 8px;"
"}"
"#recognitionToggle::indicator {"
"width: 20px;"
"height: 20px;"
"border: 2px solid #808080;"
"border-radius: 4px;"
"background-color: transparent;"
"}"
"#recognitionToggle::indicator:hover {"
"border-color: #c0c0c0;"
"}"
"#recognitionToggle::indicator:checked {"
"background-color: " + penColor + ";"
"border-color: " + penColor + ";"
"}"
);
}

void setupWidgets(){
// Pen Settings Menu
QWidget *penSettingsWidget = new QWidget();
Expand Down Expand Up @@ -310,7 +342,6 @@ void setupWidgets(){

penSizeSettingsLayout->addWidget(modeDialog, Qt::AlignCenter);


/********** Color selection options **********/
// color selection

Expand Down Expand Up @@ -473,6 +504,55 @@ void setupWidgets(){

pageSettingsLayout->addWidget(bgMenu);

/********** Shape recognition setting **********/

QWidget *recognitionSettings = new QWidget();
recognitionSettings->setObjectName("recognitionSettings");

QHBoxLayout *recognitionSettingsLayout =
new QHBoxLayout(recognitionSettings);

recognitionToggle = new QCheckBox(_("Shape Recognition"));

recognitionToggle->setObjectName("recognitionToggle");

recognitionSettings->setSizePolicy(
QSizePolicy::Expanding,
QSizePolicy::Fixed);

recognitionSettingsLayout->setContentsMargins(
PADDING,
PADDING / 2,
PADDING,
PADDING / 2);

recognitionSettingsLayout->setSpacing(PADDING);

recognitionSettings->setStyleSheet(
"#recognitionSettings {"
"background-color: #f3232323;"
"border-radius: 8px;"
"}"
);
updateRecognitionToggleColor();

recognitionToggle->setChecked(
drawing->isRecognitionEnabled());

QObject::connect(
recognitionToggle,
&QCheckBox::toggled,
drawing,
[=](bool enabled)
{
drawing->setRecognitionEnabled(enabled);
set_bool("shape-recognition", enabled);
});

recognitionSettingsLayout->addWidget(recognitionToggle);
recognitionSettingsLayout->addStretch();

pageSettingsLayout->addWidget(recognitionSettings);

/********** clear & screenshot **********/

Expand Down
3 changes: 2 additions & 1 deletion src/tools/update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
static int prev_active[5] = {-1, -1, -1, -1, -1};

void updateGui(){
updateRecognitionToggleColor();

int pen = getPen();
int lineStyle = drawing->getLineStyle();
int penStyle = drawing->getPenStyle();
Expand Down Expand Up @@ -67,4 +69,3 @@ void updateGui(){
}



Loading