Pull to refresh

JetCat: микроQt для тех, кому попроще

Reading time3 min
Views14K
Я люблю Qt. Честно-честно. Я начал изучать его на грузовом пароме из Травемюнде в Хельсинки в компании пьяных дальнобойщиков, их полупьяных подруг, автоперегонщиков и просто забулдыг, которым суточное путешествие по морю позволяет эффективно бороться с суровостью финских антиалкогольных правил. Каюты у меня не было, Интернета тоже, так что к концу поездки я уже довольно бодро тасовал QML-теги и даже необходимость использовать QString не вызывала былой икоты. Нет-нет, я в самом деле люблю Qt.

Но еще сильнее я люблю Turbo Vision. Для меня он — привет из молодости, когда мир был проще, когда люди не таскали туда-сюда могучие фреймворки, задачи на четыре строчки решались четырьмя строчками и никому не приходило в голову рисовать тривиальные картинки с помощью HTML, CSS и джаваскрипта. Когда кнопку можно было поставить в точку X и быть уверенным, что она останется там в любую погоду. Когда задачи не решались методами “скачать” и “установить”, а также “подобрать” и “сконфигурировать”. Когда запрещалось использовать код, у которого “неизвестно, что там внутри”, а любую проблему можно было отладить за конечное число шагов. Когда документация представляла собой книжку, а не распечатку с форума.

Посему, когда у нас однажды встала задача “рисовать на чем угодно”, включая разные ЖК-мониторы, электронную бумагу, удаленные экраны и даже файлы во флэше, и все это из нескольких разных операционных систем, у меня зачесались руки.

Рисовать UI для нас — задача непрофильная и всегда решалась по остаточному принципу, не барское это дело — кнопочки по экрану расставлять. Но, раз приперло, надо делать.
Вы понимаете, о чем я? Да, мы написали свой Qt. Вернее, конечно, не его, поскольку нет смысла переписывать уже написанное.

Мы написали библиотеку для рисования графических интерфейсов, заточенную на горячо любимые нами встраиваемые системы. С условием:

— Чистый С++, никаких фреймворков, никаких зависимостей, сторонних библиотек и подгружаемых модулей, STL в ограниченных количествах, чтобы не изобретать велосипед,
— Никаких “языков конфигурирования” и прочей магии, требующей сотни часов для первичного освоения,
— Минимальная привязка к операционной системе: потоки, мьютексы и sleep, чтобы портировать куда угодно,
— “Память зря не жрать”, ее всегда меньше, чем хочется,
— Рисовать на всем, что умеет выводить пиксель. Цветной, или черно-белый.

За полгода “библиотека рисования котиков”, сначала называвшаяся просто Componentality Graphics, а затем получившая более благозвучное имя JetCat (не путать с производителем авиационных моторов) обросла мясом. Сначала графические примитивы, прозрачность и спрайты. Затем — ViewPort’ы и скроллеры. Потом — растровые шрифты, антиалиасинг и генератор этих самых шрифтов из TrueType (тащить честную растеризацию TTF на встраиваемые платформы ради того, чтобы, зачастую, нарисовать несколько надписей — это как-раз то, что категорически хотелось избежать), затем надписи, рамки, поля ввода, окошки, меню… В феврале мы выпустили первый продукт с JetCat внутри и взялись за работу с удаленными экранами. Благо, ISurface, на котором, собственно, происходит рисование — это интерфейс с двумя методами: plot и peek.

И, когда в дополнение к нескольким разным целевым Линуксам, а также к Windows, под которой так удобно отлаживаться, к Raspberry PI, AllWinner A13 и FreeScale iMX6 JetCat без проблем запустился на OS X, мы решили выложить его в открытый доступ.

Во-первых, наверняка кому-нибудь пригодится.

Во-вторых, возможно найдутся те, кто выявит и исправит ошибки быстрее, чем это сделаем мы, а нам и кроме этого есть, чем заняться.

В-третьих, нам категорически не хватает времени написать документацию.

А главное — хорошая получилась штука.

Разумеется, не Qt. Меньше. Проще. Слабее, пока по-крайней мере. Намного слабее. Зато дешевле, собирается без бубна и заводится с полпинка. Что еще надо для счастья embedded-разработчику, которому поручили расставлять кнопочки по экрану?

Брать и пользоваться можно здесь: https://bitbucket.org/componentality-admin/jetcat
Рядом надо не забыть клонировать https://bitbucket.org/componentality-admin/common-libs, он обеспечивает переносимость.

Примеры на подходе, какая-никакая документация — тоже. Пока можно изучать тесткод… Ну, и там все просто.

Это не реклама. Лицензия MIT. На здоровье, пользуйтесь.

image

image

image

Примечание 1: Дорогое, бесценное Community! Мы очень ценим Вашу критику и Вашу помощь. И мы прекрасно понимаем, как вы хотите иметь примеры, описание, вычищенный код с длинной историей использования и много ASSERT'ов с внятной диагностикой, покрывающих и Вашу конкретную проблему тоже. Все это будет, рано или поздно. Проблема в том, что когда оно будет, Вы уже не будете нам нужны. Вы нам нужны сейчас, когда всего этого нет. Чтобы оно появилось. В обмен мы отдаем Вам большой и довольно ценный (оценки могут различаться) продукт своего труда. Это, в нашем понимании, честный размен.
И еще.
Всем, кто сказал «спасибо» наша огромная благодарность. А тем, кто помогает делать JetCat лучше — благодарность в квадрате. И за нами обычно не ржавеет.
Tags:
Hubs:
+43
Comments83

Articles