Я люблю 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. На здоров'я, користуйтеся.
Примітка 1: Дороге, безцінне Community! Ми дуже цінуємо Вашу критику і Вашу допомогу. І ми прекрасно розуміємо, як ви хочете мати приклади, опис, вичищений код з довгою історією використання і багато ASSERT'ів з виразною діагностикою, що покривають і Вашу конкретну проблему теж. Все це буде, рано чи пізно. Проблема в тому, що коли воно буде, Ви вже не будете нам потрібні. Ви нам потрібні зараз, коли всього цього немає. Щоб воно з'явилося. В обмін ми віддаємо Вам великий і досить цінний (оцінки можуть відрізнятися) продукт своєї праці. Це, в нашому розумінні, чесний розмін.
І ще.
Всім, хто сказав «спасибі» наша величезна подяка. А тим, хто допомагає робити JetCat краще - подяка в квадраті. І за нами зазвичай не іржавіє.
