Skip to content

Latest commit

 

History

44 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Paint для Linux

Аналог Microsoft Paint (вид современной версии из Windows 11) на C++ и Qt 6. Нативное приложение: собирается в один исполняемый файл, без питона и рантаймов.

Сборка

Нужны компилятор с поддержкой C++17, CMake ≥ 3.16 и Qt 6 (модули Widgets и PrintSupport).

Debian / Ubuntu / Mint

sudo apt install build-essential cmake qt6-base-dev libqt6printsupport6 qt6-base-dev-tools

Fedora

sudo dnf install gcc-c++ cmake qt6-qtbase-devel

Arch / Manjaro

sudo pacman -S base-devel cmake qt6-base

openSUSE

sudo zypper install gcc-c++ cmake qt6-base-devel

Затем:

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
./build/linux-paint

Установка в систему (появится в меню приложений):

sudo cmake --install build

Сборка deb-пакета

Дополнительно нужен dpkg-dev — из него берётся расчёт зависимостей:

sudo apt install dpkg-dev

Собрать пакет из готовой сборки:

cd build && cpack -G DEB

Получится linux-paint_1.0.0_amd64.deb. Установка:

sudo apt install ./linux-paint_1.0.0_amd64.deb

После этого LinuxPaint появится в меню приложений со своим значком, а изображения можно будет открывать через «Открыть с помощью». Удаление:

sudo apt remove linux-paint

Важно: .deb связан с той версией Qt, что стояла на машине сборки. Пакет, собранный на системе с Qt 6.10, не запустится там, где Qt 6.4. Поэтому пакет собирают на том же дистрибутиве, где он будет ставиться, — либо используют AppImage.

Сборка AppImage

Один файл, работающий на любом дистрибутиве: библиотеки Qt лежат внутри него, поэтому системная версия Qt значения не имеет.

cmake --build build --target appimage

Инструменты сборки скачиваются автоматически при первом запуске. Результат — build/LinuxPaint-x86_64.AppImage, около 50 МБ. Запуск:

chmod +x LinuxPaint-x86_64.AppImage && ./LinuxPaint-x86_64.AppImage

Собирать AppImage следует на старом дистрибутиве (обычно Ubuntu 22.04): файл потянет за собой системную библиотеку C той машины, где собран, и на более старых системах уже не запустится. Обратная совместимость работает только в одну сторону.

Проще всего сделать это в контейнере, не заводя отдельную машину:

sudo docker run --rm -v $PWD:/src -w /src ubuntu:22.04 bash -c "apt update && apt install -y build-essential cmake qt6-base-dev qt6-base-dev-tools libqt6svg6 libgl1-mesa-dev libvulkan-dev libxkbcommon-dev wget file && (apt install -y qt6-svg-plugins || true) && cmake -S . -B /tmp/b -DCMAKE_BUILD_TYPE=Release && cmake --build /tmp/b --target appimage -j\$(nproc) && cp /tmp/b/LinuxPaint-x86_64.AppImage /src/"

Два пакета в этом списке нужны по неочевидным причинам.

libgl1-mesa-dev и соседи: на Ubuntu 22.04 пакет qt6-base-dev не тянет заголовки OpenGL, и без них CMake не находит Qt6Gui, а следом Widgets и PrintSupport — хотя файлы настройки этих модулей лежат на месте и сообщение об ошибке выглядит загадочно.

libqt6svg6: логотип вшит в программу текстом SVG, и превращает его в картинку отдельный модуль Qt. В AppImage он укладывается явно (см. EXTRA_QT_PLUGINS в packaging/appimage.cmake), но взять его сборщику неоткуда, если модуль не установлен в самой системе сборки.

Что умеет

Инструменты — карандаш, заливка с настраиваемым допуском (насколько близкие оттенки считать одной областью), текст, ластик (правой кнопкой работает как «цветной ластик»: заменяет только Цвет 1), пипетка, лупа.

Текст — набирается прямо на холсте, с курсором, выделением и переносом строк. Пока идёт набор, в ленте появляется группа «Текст»: шрифт, кегль, полужирный, курсив, подчёркивание и непрозрачная подложка Цветом 2. Текст остаётся редактируемым, пока не кликнуть мимо рамки.

Кисти — обычная, каллиграфические 1 и 2, аэрограф (продолжает распылять при удержании кнопки), масляная, мелок, маркер, карандаш, акварель. Каждая кисть имеет собственную фактуру, а не просто разную толщину.

Толщина и прозрачность задаются двумя вертикальными ползунками слева от холста. Прозрачность честная: штрих сначала целиком копится в отдельном слое и лишь потом ложится на холст, поэтому самоперекрытия внутри одного мазка не уплотняют цвет — полупрозрачная линия остаётся равномерной. Действует на карандаш, кисти и фигуры (контур и заливка ложатся одной фигурой).

Фигуры — линия, кривая Безье с двумя изгибами, овал, прямоугольник, скруглённый прямоугольник, многоугольник, треугольники, ромб, пяти- и шестиугольник, четыре стрелки, звёзды на 4/5/6 лучей, три выноски (включая облако), сердце, молния. После отпускания мыши фигура остаётся редактируемой: её можно двигать и тянуть за восемь маркеров, пока она не зафиксирована (Enter, клик мимо или смена инструмента). Контур и заливка независимо переключаются между сплошным цветом и фактурами мелка, маркера, масла, карандаша и акварели.

Выделение — прямоугольное и произвольное, перемещение, масштабирование за маркеры, вырезание, копирование, вставка (в том числе из файла), удаление, обрезка по выделению, обратить выделение, прозрачное выделение (Цвет 2 становится прозрачным), повороты и отражения только выделенной области.

Слои — панель справа (кнопка «Слои» в ленте или Ctrl+L): добавление, дублирование, удаление, перемещение по стопке, объединение с нижним и включение видимости. Инструменты рисуют в активный слой, на экран и в файл идёт склейка видимых. Прозрачные места показываются шахматкой. Слои живут только в текущем сеансе: обычные растровые форматы их не хранят, при сохранении картинка сводится в одно изображение.

Изображение — изменение размера в процентах или пикселях с сохранением пропорций, наклон по обеим осям, повороты на 90/180/270°, отражения, обращение цветов, свойства холста в пикселях, сантиметрах или дюймах. Размер холста меняется и мышью — за маркеры на правом и нижнем краях листа.

Файлы — PNG, JPEG, BMP, GIF, TIFF, WebP и всё остальное, что поддерживает сборка Qt. Есть печать, список последних файлов, открытие перетаскиванием.

Вид — масштаб от 12,5 % до 3200 % (ползунок в строке состояния, Ctrl+колесо удерживает точку под курсором), линейки, попиксельная сетка на крупном масштабе, полноэкранный режим, светлая и тёмная темы.

Горячие клавиши

Клавиши Действие
Ctrl+N / Ctrl+O / Ctrl+S Создать / открыть / сохранить
Ctrl+Shift+S / Ctrl+P Сохранить как / печать
Ctrl+Z / Ctrl+Y Отменить / вернуть
Ctrl+X / Ctrl+C / Ctrl+V Вырезать / копировать / вставить
Ctrl+A / Ctrl+Shift+A Выделить всё / обратить выделение
Ctrl+Shift+X / Ctrl+W Обрезать / изменить размер и наклон
Ctrl+Shift+I / Ctrl+Shift+N Обратить цвета / очистить холст
Ctrl++ / Ctrl+- / Ctrl+0 / Ctrl+9 Масштаб: больше, меньше, 100 %, по окну
Ctrl+R / Ctrl+G / F11 Линейки / сетка / во весь экран
P B F T E K M S Карандаш, кисть, заливка, текст, ластик, пипетка, лупа, выделение
Esc / Enter Отменить / зафиксировать построение
Стрелки Сдвинуть выделение на пиксель (с Ctrl — на 10)

Во всех инструментах левая кнопка мыши рисует Цветом 1, правая — Цветом 2. Shift держит линию под углом, кратным 45°, а прочие фигуры делает правильными (круг, квадрат).

Устройство

Файл Назначение
src/Document.* Изображение, история отмен, операции над холстом, заливка
src/Canvas.* Виджет холста: масштаб, выделение, ввод мышью
src/tools/Tool.* Базовый инструмент и общая механика штрихов и фактур
src/tools/PaintTools.* Карандаш, кисти, ластик, заливка, пипетка, лупа
src/tools/ShapeTool.* Фигуры и их редактирование маркерами
src/tools/SelectTool.* Прямоугольное и произвольное выделение
src/tools/TextTool.* Ввод текста поверх холста
src/Ribbon.*, src/ColorArea.* Лента, галереи, палитра
src/Icons.* Значки, рисуемые кодом (бинарных ресурсов в проекте нет)
src/Theme.* Светлое и тёмное оформление
src/MainWindow.* Сборка окна, меню, действия, линейки, строка состояния

Лицензия

GNU General Public License, версия 3 или новее — полный текст в файле LICENSE. Брать код можно кому угодно и на что угодно, но с двумя условиями.

Исходники производной работы должны быть открыты под той же лицензией. Это суть GPL: программа остаётся свободной у всех, кто её продолжит.

Изменённые сборки должны быть помечены как изменённые и не выдаваться за официальные. Это дополнительное условие по разделу 7(c) лицензии; имена InoMotion и LinuxPaint и логотип проекта на изменённые версии не распространяются. Форкать можно свободно — просто дай форку своё имя.

Значки взяты из набора Fluent UI System Icons корпорации Microsoft под лицензией MIT. Её текст и остальные сторонние составляющие — в файле NOTICE.

About

LinuxPaint is a program for drawing and editing files on Linux (AppImage)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages