PaintCAD Mobile - журнал разработки

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Ср фев 11, 2026 8:20 pm

Исправляем подвисания дальше

Подвисание главного окна рисования при вызове функции "Выделение и буфер" (кнопка "#") - "Обратить всё"

Этот "эффект" в 8-битном режиме просто инвертирует все цвета в палитре (если она была UNI, то станет не UNI). Это, во-первых, быстро. А, во-вторых, можно открыть любой 256-цветный GIF или BMP, у которого будет неизвестно какая палитра - и гарантированно инвертировать такую картинку целиком, не приводя палитру к UNI и не рассчитывая обращенные цвета для каждого пикселя)

А потом в 8-битном режиме паинткад перерисовывает рисунок с этой новой обращенной палитрой. Буфер обмена должен тоже перерисовать, но опять это пропущено в коде. Исправим это, добавив еще и перерисовку буфера обмена.

А в 24-битном режиме попиксельно инвертирует весь рисунок, причем даже без индикатора.

Добавим для 24-битного режима нормальный индикатор, бегущий от 0 до 100% в процессе "обращения".

А для 8-битном добавим индикаторы, стоящие на 100% с подписями "В рисунок..." и "В буфер...".

Получилось в 24-битном режиме:

Изображение

И получилось в 8-битном режиме:

Изображение

Изображение

Подвисание функции пачечного превращения BMP-файлов в GIFы в меню "Обработка" - "BMPs->GIFs"

В самом конце конвертации в конце финально перерисовывается рисунок и буфер. И делается это в основном потоке прямо в главном окне рисования.

Выносим это в отдельный поток и снабжаем статичным индикатором, показывающим 100% пока перерисовывает рисунок/буфер. Получаем вот такое:

1) Вызываем функцию пачечной конвертации bmp в gif:

Изображение

2) Выбираем один из файлов и смотрим сколько исходных BMP паинткад нашел для конвертации:

Изображение

3) Потом идет поочередное открытие BMP и пересохранение их в GIF. А вот потом финальная перерисовка рисунка:

Изображение

4) И если был буфер - то и перерисовка буфера:

Изображение

5) И в конце сообщение об успешной конвертации:

Изображение

Всё. Теперь в главном окне рисования никто из модулей никогда не устанавливает флажок перерисовки рисунка в основном потоке при рисовании окна на экране. Удаляем этот флажок.

Подвисание клавиатуры в модулях Gate и Rend при обработках и загрузке/сохранении файлов

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

В Rend уже было сделано в прошлом посте управление, т.к. на эффект "Цвета из буфера" был поставлен перехват левого софта с функцией "Прервать".

Теперь и в Gate тоже управление поставлено. Можно прямо во время обработки или загрузки/сохранения файлов нажатием на большую синюю клавишу вирт.клавиатуры переключать ее типы цифровая клавиатура/джойстик.

Подвисание эффектов Контраст, Яркость, Цвет, Цветность, Гамма в конце если в буфере обмена что-то есть

Если палитра не UNI, то эти эффекты воздействуют на палитру, а не на пиксели. А потом перерисовывают рисунок (и это отображается на экран), а вот потом могут встать замертво на долгое время - это если был буфер обмена, то они перерисовывают его (т.к. палитра сменилась).

Поставим окошко с надписью "В буфер..." и статичным индикатором 100% чтобы было видно почему все так подвисло.

Получилось:

Изображение

Изображение

Изображение

Изображение

Изображение

Подвисание при создании нового файла в 8-битном режиме (особенно если уже лежал какой-то рисунок в буфере обмена)

В 8-битном режиме обнуляется весь массив рисунка попиксельно. А если был буфер обмена - то он перерисовывается еще.

Поэтому для 8-битного режима в главном окне рисования на это время выведем "Подготовку" со статичным 100% индикатором:

Изображение

Как только окно пропадает и появляется главное окно рисования - точно можно двигать курсор и рисовать.

Для 24-бит просто зарисовывается рисунок большим прямоугольником фонового цвета. И буфер не перерисовывается, поэтому в 24-битах сразу быстро вызываем в основном потоке эту подготовку, не показывая никаких окошек и тут же мгновенно можно рисовать в главном окне рисования.

Подвисание при работе инструментов

Инструменты рисуют всякие линии, круги и т.п. на отдельном двухцветном рисунке. А потом нарисованное переносится в текущий рисунок/массив рисунка уже пикселями цвета ПЦ, с учетом выбранной прозрачности и т.д. Этот перенос может занять длительное время если текущий рисунок большой (и двухцветный рисунок, с которого переносятся нарисованные примитивы тоже большой).

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

Убираем подвисание инструментов

Текст после ввода текста и выбора текста расположения на рисунке подвисал.

Т.к. здесь возвращаемся из другого окна, то нарисуем заголовок окна с песочными часами вместо значка, а остальной экран замажем пустым окном. Получается:

Изображение

Аналогичные часы в заголовке окна примотаем к рисованию примитивов (линий, кругов), а также двух заливок. Но уже будем рисовать только заголовок с часами, а окно трогать не будем:

Изображение

При рисовании пальцем на рисунке чтобы не вызывались множественные потоки - будем блокировать вызов нового потока пока не закончится старый. Вообще поставим при "часах" в заголовке главного окна рисования полную блокировку нажатия кнопок, удержания кнопок, отпускания кнопок, нажатий стилуса, перемещений стилуса. А по отпусканию стилуса и "часах" будем только сбрасывать "полилинию" в первый шаг. Чтобы можно было рисовать новые полилинии всегда после отпускания пальца и последующего нажатия в другом месте рисунка, а старую полилинию прервать, даже если в момент отпускания пальца паинткад был занят и были "часы" в значке главного окна рисования.

Убираем лишнее окно при отмене последнего действия

Хоть отмена и может иногда перерисовывать и буфер, и тогда перерисовка рисунка и буфера занимают длительное время, и хорошо бы их, как было сделано в прошлом посте, наблюдать в отдельном окошке в виде шагов "В рисунок..." и "В буфер...". НО отмена последнего действия часто позволяет сравнить рисунок До и После какого-нибудь эффекта, и хорошо бы лишними окошками не отвлекать никого чтоб сравнивать было проще.

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

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Пн фев 16, 2026 8:59 pm

Еще кое-что исправляем

Нажимающиеся однократно и повторяющиеся кнопки экранной клавиатуры

Т.к. в паинткаде появилась настройка клавиш, то теперь клавиши 0-9 могут иметь не явовские коды 48-57, а вообще любые. А во многих местах по этим кодам выбирается как будет работать клавиша экранной клавиатуры, например, клавиши с 1 по 9 кроме 5 будут "повторять" нажатия при удерживании, а остальные - нажиматься однократно.

Изменим эти сравнения, добавив функцию, превращающую клавиши из настройки клавиш в обычные коды явы. И вот их уже можно сравнивать а ля "если (код > 48) и (код <= 57) и (код != 53) - то пусть повторяет нажатия при удерживании"

Теперь при любой настройке клавиш в редакторе сенсорная клавиатура во всех окнах будет нормально работать и делать часть своих клавиш повторяющими нажатия при удерживании

Исправляем недорисовку окон при повороте экрана

В целях экономии многие окна рисуются один раз. А потом перерисовываются только меняющиеся элементы.

При изменении поворота экрана паинткад ловит во всех окнах события что поменялась ширина и/или высота экрана, и тогда может перерисовать окно целиком. Но во многих окнах перерисовка не прописана.

Проверим все окна, найдем "чернеющие" при повороте экрана и починим их:

AddText - переворачивается и перерисовывается успешно, но положение текста при повороте сбрасывается на стартовую позицию. Теперь это исправлено, позиция не сбрасывается

BevelSetup - переворачивается и перерисовывается успешно, ничего делать не нужно

BlurForce - переворачивается и перерисовывается успешно, ничего делать не нужно

Camera, Camera2 - в них показывается видеопоток, он сам вращается в зависимости от поворота, ничего делать не нужно

CheckUpdate - переворачивается и перерисовывается успешно, ничего делать не нужно

Curtype - переворачивается и перерисовывается успешно, ничего делать не нужно

EditColor - переворачивается и перерисовывается успешно, ничего делать не нужно

Exchan - переворачивается и перерисовывается успешно, ничего делать не нужно

Explorer - в режиме показа списка файлов переворачивается и перерисовывается успешно, но положение курсора при повороте сбрасывается на стартовую позицию. А в режиме предпросмотра - всё плохо, предпросматриваемый рисунок чернеет.

Запомним позицию курсора и будем ее вспоминать после поворота. Если курсор для нового положения слишком низко (было в списке 10 пунктов по высоте нарисовано, а стало только 7, например), то будем проматывать список на нужное количество пунктов чтоб курсор оказался на экране.

Получилось в режиме списка (как раз список промотался при повороте, чтоб выделенный пункт был на экране даже при укороченном при повороте экрана списке):

Изображение

Изображение

Получилось в режиме предпросмотра - после поворота файл заново грузится и рисуется в режиме предпросмотра:

Изображение

Изображение

FontBrowser - переворачивается и перерисовывается успешно, ничего делать не нужно

Gallery - переворачивается и перерисовывается успешно, ничего делать не нужно

getco - переворачивается и перерисовывается успешно, но сбрасывает позицию в 0 и состояние окна в начальное. Исправляем это. Теперь при повороте экрана окно продолжает работу с того момента, когда произошел поворот экрана.

gtc - модуль такой же как getco, но выбирает прозрачный цвет буфера обмена. Тоже сбрасывается при повороте экрана. Тоже исправляем.

Help - при повороте экрана окно пропадает, перерисовывается только список с текстом помощи или разделов помощи. Тут три режима: Индекс, Статья помощи и Совет дня. Починим их так:
- Индекс всегда имеет конкретное число пунктов (разделов помощи), поэтому при повороте экрана будем не только перерисовывать все, но и вспоминать какой пункт был выбран до поворота и выставлять его снова
- Статья помощи и Совет дня разрубаются паинткадом на строчки, влезающие по ширине в список, и при разных ориентациях список будет содержать разное количество таких строчек. Поэтому будем просто все перерисовывать, а курсор устанавливать в самый верх статьи/совета (т.к. глупо восстанавливать позицию курсора если на новой повернутой ширине в 2 раза большей чем бывшая неповернутая ширина все строчки все равно лягут в новые места и продолжить чтение статьи с момента до поворота уже будет нельзя)

Теперь окно помощи исправлено и перерисовывается корректно при повороте экрана во всех трех своих режимах.

JoySetup - переворачивается и перерисовывается успешно, ничего делать не нужно

Loading - переворачивается и перерисовывается успешно, ничего делать не нужно

MainForm+MainForm2 - переворачивается и перерисовывается успешно, ничего делать не нужно

Moving - переворачивается и перерисовывается, но сбрасывает координаты в стартовые и выключает на стартовые значения все переключатели (пока текста информации, показ размещаемого объекта). Теперь это исправлено - при повороте ничего не сбрасывается.

NewFile - переворачивается и перерисовывается успешно, ничего делать не нужно

Options - переворачивается и перерисовывается, но положение курсора сбрасывается на стартовое и больше курсор двигать и подменю переключать не получается.

Внутри этого окна эти меню:
1) главное меню с несколькими подменю (по кнопке "0" в главном окне рисования),
2) меню команд (по ДжойВправо в главном окне рисования),
3) меню 16х64 (по ДжойВлево в главном окне рисования в 8-битном режиме при ч/б рисунке размером 32х32),
4) меню "Доп.эффекты",
5) меню "Открыть" (форматы файлов),
6) меню "Сохранить" (форматы файлов),
7) меню "Базовый диск",
8) меню меток,
9) меню выбора альфа канала для PNG при сохранении (нет/указать цвет/альфа в буфере),
10) меню выбора цвета/текстуры фона для команды "Наложить альфу"

Каждое из этих десяти меню теперь исправлено: при повороте корректно перерисовывается окно и "вспоминается" и устанавливает положение курсора на том пункте, на котором курсор был до поворота. Ну и курсор после поворота двигается как обычно.

Palete - переворачивается и перерисовывается успешно, ничего делать не нужно

PngEncoder - показывает индикатор сохранения в PNG, переворачивается и перерисовывается успешно, ничего делать не нужно

Razbor - переворачивается и перерисовывается успешно, ничего делать не нужно

Rend - переворачивается и перерисовывается успешно, ничего делать не нужно

RGBForce - переворачивается и перерисовывается успешно, ничего делать не нужно

SelectMode - переворачивается и перерисовывается успешно, ничего делать не нужно

SelectType - чернеет при перевороте, оставляя только три переключателя на экране (это для оптимизации было, чтоб каждый раз при выборе другого типа рисунка кнопками Вверх/Вниз не перерисовывать все окно)

Изображение

Оставляем оптимизацию, но при повороте дорисовываем окошко и софт-клавиши:

Изображение

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

ShadowDist - переворачивается и перерисовывается успешно, ничего делать не нужно

Support - переворачивается и перерисовывается успешно, ничего делать не нужно

Sysinfo - переворачивается и перерисовывается, но высоты списков остаются старыми, как до переворота. Теперь это исправлено - список с информацией о платформе и список с информацией про диски и их заполнение после поворота меняют свои размеры и список про платформу переразбивает текст на строки под новую ширину списка.

Tools - при повороте окно вообще черное, виден только заголовок и рамка курсора, и если курсор встает в первоначальное положение. Теперь это исправлено, окно перерисовывается со значками, курсор остается там где был до поворота.

Video3GP/Video3GP2 - переворачивается и перерисовывается успешно, ничего делать не нужно

VideoBMP - окно для функции превращения набора BMP файлов в набор GIF файлов. При повороте экрана список найденных файлов не меняет свой размер. Теперь это исправлено - список файлов масштабируется под размер окна.

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

ViewBMX - переворачивается и перерисовывается успешно, ничего делать не нужно

Wizard - переворачивается и перерисовывается успешно, ничего делать не нужно. Но в процессе тестов было обнаружено, что в стартовом мастере варианты сборки и разборки анимированных GIF указывают на старые команды, которые в паинткаде давно были переименованы. Поэтому вызвать из мастера сборку и разборку анимированных гифов было нельзя, программа вылетала на главное окно рисования и все. Теперь это исправлено.

ZoomBrowser - переворачивается и перерисовывается успешно, ничего делать не нужно

Теперь все окна паинткада не должны криво рисоваться или зависать при повороте экрана смарфона/планшета на андроиде.

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт фев 24, 2026 10:36 pm

Еще доработки

Функция "Области"

Теперь еще немного подтащим мобильный паинткад к компьютерному.

В PCW есть в меню команд функция "Области":

Изображение

Туда можно добавлять текущее выделение - и оно появляется в списке:

Изображение

Потом можно выделить что-нибудь еще и уже новое текущее выделение добавить в список областей.

Также можно удалить последнее добавленное выделение из списка областей или вообще очистить список областей.

И потом если выбрать в списке одну из областей - то она выделяется на текущем рисунке.

Это очень удобно если есть, например, много картинок и их надо однобразно обрезать. Или если применить к их одной и той же части какой-нибудь эффект. Просто открываем картинки по очереди и через "Области" выделяем запомненную часть. И потом применяем к этой части что хотели. Сохраняем картинку. Потом открываем следующую и проделываем то же самое. И т.д.

Добавим в PaintCAD Mobile эту функцию.

Вот что получилось:

1) новый пункт в меню команд (ДжойВправо в главном окне рисования):

Изображение

2) выбрав его попадаем в меню "Области", оно похоже на "Метки", но тут есть список текущих областей. Вот, для примера, добавлены через пункт "добавить выделенную область" ("+ Выделенную") две области:

Изображение

3) Выбираем первую в списке и она выделена на рисунке:

Изображение

4) Теперь выбираем вторую в списке:

Изображение

5) И теперь уже она выделена:

Изображение

В PCW кроме координат левого верхнего и правого нижнего угла выделения показывались размеры области. Но если будет область "1000:1000-2999:2999 (1999x1999)" - то это очень много символов, а на телефоне влезает по горизонтали символов 20 в худшем случае. Поэтому срежем размеры и будем показывать только координаты углов выделения ("1000:1000-2999:2999" - уже 19 символов, кооое-как влезет в узкий экран, а может и не влезет и будет обрезано).

Размер области под курсором вынесем в заголовок окна (там как раз есть место):

1) если курсор стоит на первых трех управляющих пунктах - то отображается обычный заголовок окна "Области":

Изображение

2) если курсор стоит на следующих пунктах, т.е. выбрана одна из областей, то ее размер пишется в заголовке окна:

Изображение

Изображение

Теперь в PCM есть функция "Области" из PCW, позволяющая быстро выделить на любом свежеоткрытом рисунке ранее добавленную в список область выделения, и уже делать с ней что хочется (обрезать до размеров выделения, применять эффекты и т.п.). И повторять это с несколькими рисунками, открывая их по очереди.

Отображение полного номера версии в окне "Обновление"

Сейчас отображается только версия установленного паинткада, а бета это или нет и какая - не видно:

Изображение

Добавим к номеру версии ту самую приписку с бетой из стартового окна выбора языка. Получилось:

Изображение

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Ср мар 04, 2026 9:28 pm

Перетащим еще несколько эффектов из PaintCAD 4Windows в PaintCAD Mobile

Эффект "Цветная шерсть"

В PCW есть в меню доп.эффектов эффект "Цветная шерсть":

Изображение

Добавляем аналогичный пункт в PaintCAD Mobile:

Изображение

При его вызове спрашивается сила эффекта. Выберем, например, 20%:

Изображение

И на мелкой картинке получим разноцветную шерсть какая бывает в шарфах, связанных из разноцветных ниток, сплетенных друг с другом:

Изображение

Возьмем картинку побольше, а силу эффекта выберем поменьше, 8%:

Изображение

Получаем такую картинку:

Изображение

Эффект рисует по левому и верхнему краю затравку из разноцветных пикселей. А потом размазывает их по диагонали вправо-вниз. Если сила эффекта маленькая, то изменения цветов будут маленькие, стартовые "нитки" будут длинные и не особо болтающиеся по цветам. А если сила большая, то нитки от затравки будут короткие и быстро свалятся в "шерсть", из которой будут торчать мелкие нитки разных цветов.

Можно выделить несколько областей и в каждую применить "цветную шерсть". Цвета будут разные, т.к. выбираются случайно при расстановке затравки:

Изображение

На эмуляторе сименса SL75 (в 8-битном режиме, с зернистостью uni-палитры) тоже работает:

Изображение

Эффект был написан давно, когда шли эксперименты с алгоритмом рисования огня, еще просто в мини-программах на ассемблере. Нормальный алгоритм перешел в дельфи и в паинткаде он в доп.эффекте "Пламя" (и еще перетянутый по яркости чтобы было много огоньков - в эффекте "Адский огонь"), а этот кривой шерстяной - был добавлен в паинткад как "Цветная шерсть".

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Чт мар 05, 2026 8:30 pm

Делаем набор функций для работы с фотками:

1) бывает фотка с заваленным горизонтом. Надо ее повернуть на угол поворота горизонта, чтобы горизонт встал горизонтально. Для этого нужно сделать в PaintCAD Mobile:

а) измерение угла наклона линий (а заодно и длины линий). Как в PaintCAD 4Windows будут отображаться (пусть в заголовке окна) при рисовании линий и полининий два параметра: длина линии и угол ее наклона в градусах. Проводим линию по горизонту и узнаем его наклон в градусах (можно даже начать ее рисовать, но не заканчивать рисование, т.к. уже в процессе прокладывания линии будет виден угол наклона);

б) поворот не на 90 градусов как сейчас, а на любое произвольное количество градусов с точностью до 0,1 градуса (как в PaintCAD 4Windows)
Поворот как в PCW сделаем трех видов - Обычный, Умный (подсчитывающий куда съехали пиксели после поворота и какой пиксель нужно поставить в ту или иную точку смотря сколько в него поместилось старых пикселей разных цветов, и каких из них больше - тот и цвет будет у финального пикселя), Сглаженный (поворот со сглаживанием, суммирующий старые пиксели, перемещенные в новый пиксель с весами, соответствующими занимаемыми этими пикселями площадями).

2) иногда еще хочется изменить размер фотки или рисунка качественно. Поэтому расширим функцию Размер растра чтобы она спрашивала вид - Обычный, Умный (для малоцветных изображений и пиксель-арта) или Сглаженный (для фоток). В PaintCAD 4Windows это все есть, остается перетащить все это в PaintCAD Mobile.

Длина и угол линии

В PaintCAD 4Windows при рисовании линии на нижней панели отображаются параметры этой линии:

Изображение

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

Перенесем в PCM два последних параметра - длину линии в пикселях и угол ее наклона.

Получится в худшем случае для самой длинной строки что-то типа "9999; 89,999°"- 13 символов, скорее всего, влезет в узкий экран типа сименса со значком окна слева и значком цветности картинки справа.

Получилось - при рисовании линий и полилиний в заголовке окна вместо "PaintCAD" показывается вот что:

Изображение

Положительный угол считается в направлении по часовой стрелке (как в PCW). Теперь можно от конкретной точки отсчитать расстояние и понять под каким углом будет линия.

Углы для разных положений курсора:

Изображение

Если выдерживая эту длину 4 пикселя рисовать линию за линией во все стороны - то получается круг из этих линий с расстоянием от центра до края в 4 пикселя:

Изображение

На яве (эмулятор сименса) тоже все работает аналогично андроиду:

Изображение

При большом рисунке и большой длине линии строчка в заголовок влезает. Если бы даже там был угол 90 - это еще один лишний символ, влезает хорошо, до значка цветности в правом верхнем углу окна не достанет:

Изображение

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Ср мар 18, 2026 9:11 pm

Вторая часть из предыдущего поста - поворот на произвольный угол.

Что было

Сейчас есть поворот на 90 градусов и только для квадратного выделения - спрашивает куда повернуть и поворачивает:

Изображение

Что в PCW

В PaintCAD 4Windows вместо этого есть поворот выделения любых пропорций на произвольный угол. После вызова поворота показывается окно, где можно вращать тестовую картинку как захочется и выбирать угол поворота. Внизу пишется угол поворота любых значений (хоть 360, хоть 720 если два оборота сделали и т.д.), а в скобках он же, но ограниченный до значений от 0 до 359,9 градусов:

Изображение

Делаем новое окошко RotAngle, спрашивающее угол поворота

Перетаскиваем процедуры отрисовки этой тестовой картинки в PaintCAD Mobile. Получилось:

Изображение

Виртуальную клавиатуру частично снабдим кнопками с видеоплееров.

Управление будет такое:

Кнопка джойстика (и для нее подпись на панели софт клавиш), кнопка 5 и кнопка 0 - сбросить угол поворота в 0 градусов.

Кнопки 4 и 6, кнопки ДжойВправо и ДжойВлево - увеличить/уменьшить угол поворота на 0,1 градус:

Изображение

Кнопки 1 и 3 - увеличить/уменьшить угол поворота на 1 градус:

Изображение

Кнопки 7 и 9 - увеличить/уменьшить угол поворота на 15 градусов:

Изображение

Кнопки 2 и 8, кнопки ДжойВверх и ДжойВниз - увеличить/уменьшить угол поворота на 90 градусов:

Изображение

На сименсовской яве с вертикальным экраном тоже все крутится:

Изображение

На виртуальной клавиатуре тогда на клавише "2" надо нарисовать значок поворота на 90 градусов по часовой стрелке, а на клавише "8" значок поворота на 90 градусов против часовой стрелки.

Получилось:

Изображение

И на мелком экране 320х480:

Изображение

Проблемы значка "градус" при включенной функции "Шрифт окон"

Функция "Шрифт окон" включает отрисовку текста на окнах встроенным в паинткад PCF-шрифтом вместо стандартного шрифта телефона.

И если ее включить - то в окне выбора поворота, оказалось, пропадают символы "градус". И даже в главном окне рисования при отображении наклона рисуемой линии в градусах (см. предыдущий пост) - тоже символ "градус" не отображается.

PCF-шрифт использует DOS-кодировку, точнее, "псевдо-DOS", т.к. она не полностью эквивалентна досовской. Когда выбиралось чтоб будет лежать в символах с кодом 128-255, то было ясно что там будут лежать русские большие и маленькие буквы. Но в символах DOS есть еще последние 16 символов кодировки с 240-255, там всякие знаки, в т.ч. "градус". У PCF-шрифтов эти символы немного не те, и не в том порядке.

Добавим в список символов, превращаемых из нормальной кодировки в PCF-кодировку, вот эти:
Ї°±ґµ¶·№є

Теперь если их указать инструменту "Текст", то он сможет их отрисовать на картинке. Ну и "Шрифт окон" теперь сможет отображать все эти символы в тексте интерфейса на окошках.

Получилось:

1) Значок "градус" теперь отображается в интерфейсе при включенном "Шрифте окон":

Изображение

Изображение

2) Инструмент "Текст" теперь может писать этими символами на картинках при загруженном PCF-шрифте:

Изображение

Изображение

Изображение

Следующие шаги поворота на произвольный угол из PCW

Добавляем после выбора угла поворота остальные шаги из PaintCAD 4Windows:
- выбор прозрачного цвета, который после поворота не будем добавлять на рисунок (если у поворачиваемого объекта был одноцветный фон, и его цвет выбрали - то тогда этот цвет не вставится в повернутое изображение. Это похоже на "Спецвставку", когда выбираем пиксели прозрачного цвета и они не вставляются)
- выбор метода поворота: Обычный, Умный или Сглаженный
- выбор метода закручивания: Нет (обычный поворот без закручивания) или разные методы (закручивание по линейному или гауссовому закону, закручиванием можно сделать как будто повернутый объект видно через какой-то портал, сильно искажающий изображение)

Проверять получившееся будем вот на таком образце:

Изображение

Это малоцветный значок bat-файла из старого виндоуса. У него есть тонкие линии (границы "окошка") и толстая линия (заголовок "окошка"). Дорисуем к нему по бокам линии разных толщин и углов наклона и пару скругленных объектов сверху (уши). И будем все это крутить.

Функция "Повернуть" вращает текущее выделение относительно центра выделения. Поэтому выделим на рисунке значок и дорисованные линии. Фон выделения зальем рыжим цветом и будем указывать его как прозрачный чтобы функция "Повернуть" его пропускала. И, таким образом, сразу проверим повороты разных линий и пропуск прозрачного фона.

Обычный поворот

1 шаг - выбираем поворот 15 градусов:

Изображение

2 шаг - выбираем рыжий цвет как прозрачный:

Изображение

3 шаг - выбираем "Обычный" метод поворота - это метод "какой пиксель попался, тот и переносим". А есть еще "Умный", он проверяет еще пиксель справа, снизу и справа-снизу, и каких больше - тот и вставляет. Выбираем пока "Обычный":

Изображение

4 шаг - выбираем поворот без закручивания:

Изображение

Получаем поворот на 15 градусов по часовой стрелке, с пропуском рыжего фона, "Обычным" методом, без закручивания:

Изображение

Это нормально что повернутая картинка вылезает за границы выделения, т.к. выделение тут не ограничивает отрисовку, а только указывает откуда взять исходный объект.

Умный поворот

Все те же параметры, на 15 градусов по часовой стрелке, с пропуском рыжего фона, но "Умным" методом, без закручивания:

Изображение

Изображение

Сглаженный поворот

Опять все те же параметры, но "Сглаженным" методом:

Изображение

Изображение

Методы "Обычный", "Умный" и "Сглаженный" в сравнении:

Изображение

Умный метод более "умно" нарисовал повернутую шестеренку, там нет пиксельного мусора. И еще он убрал часть торчащих после поворота пикселей.

А вот линия толщиной 1 пиксель справа на изломе при повороте разорвана во всех трех методах) Чтобы разрыва не было - надо бы увеличить изображение каким-нибудь advMame алгоритмом, но в PaintCAD Mobile пока что нет этих методов увеличения из PaintCAD 4Windows. Надо бы позже их добавить.

Закручивание

Эту же картинку дополнительно исказим "закручиванием".

1 шаг - поворот на 90 градусов по часовой стрелке:

Изображение

2 шаг - выбираем этот же рыжий прозрачный цвет

3 шаг - выбираем "Сглаженный" метод поворота:

Изображение

4 шаг - выбираем простое закручивание по линейному закону (чем дальше пиксель от центра, тем больше закручивание):

Изображение

Получаем:

Изображение

Закручивание фотографии

Берем фотографию:

Изображение

1 шаг - крутим посильней, на 195 градусов:

Изображение

2 шаг - прозрачный цвет не выбираем, просто жмем "Ок".

3 шаг - "Сглаженный" метод поворота:

Изображение

4 шаг - метод закручивания "2x гаусс-цикл" - это закручивание по нелинейному закону, "цикл" означает что пиксели по мере удаления от центра сначала искажаются сильнее, а потом наоборот слабее, стараясь вернуться к изначальному углу поворота.

Изображение

Получаем:

Изображение

Методы поворота работают полностью аналогично таким же из PaintCAD 4Windows, повернутые картинки получаются, вроде как, пиксель в пиксель такие же.

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

Теперь в PaintCAD Mobile есть поворот на любой угол с дополнительными фичами типа прозрачного цвета и закручивания как в PaintCAD 4Windows.

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Сб апр 11, 2026 5:39 pm

Последняя добавляемая функция из поста на два выше - продвинутый Размер растра:
blackstrip писал(а): Чт мар 05, 2026 8:30 pm Делаем набор функций для работы с фотками:...

2) иногда еще хочется изменить размер фотки или рисунка качественно. Поэтому расширим функцию Размер растра чтобы она спрашивала вид - Обычный, Умный (для малоцветных изображений и пиксель-арта) или Сглаженный (для фоток). В PaintCAD 4Windows это все есть, остается перетащить все это в PaintCAD Mobile.
Итак, теперь PaintCAD Mobile после вызова меню команд в главном окне по кнопке ДжойВправо и выбора там функции "Размер растра" спрашивает метод масштабирования.

Протестируем получившуюся доработку на той же картинке, на которой тестировался поворот:

Изображение

Эта исходная картинка размером 64х48 пикселей. Уменьшим ее до 40 пикселей по горизонтали и одновременно увеличим до 60 пикселей по вертикали. Вызываем размер растра и задаем новый размер 40х60 пикселей:

Изображение

Потом появляется новое окно "Метод масштаба" - в нем, как при повороте, три метода - Обычный, Умный и Сглаженный.

Обычный метод масштабирования

Сначала выберем Обычный:

Изображение

Получилось:

Изображение

Это тот метод, который был раньше в PaintCAD Mobile при изменении размера растра. Берутся пиксели по порядку и стаскиваются в новое изображение.

Умный метод масштабирования

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

Получилось:

Изображение

Изображение

Здесь кнопки на нарисованном окошке уже не смешаны в кучу.

Сглаженный метод масштабирования

Третий метод - Сглаженный. Это линейная интерполяция картинки при масштабировании. Хорошо подходит для масштабирования фотографий. Т.к. при сглаживании на рисунке получаются новые цвета, то в 8-битном режиме он работает только при рисунке с UNI-палитрой, если же палитра не UNI - то он выдает сообщение о том, что нужна UNI-палитра, и выходит в главное окно рисования.

Получилось:

Изображение

Изображение

Сравнение трех методов

Результаты все трех методов друг за другом:

Изображение

Проверка на Java-телефоне (эмулятор Siemens SL75)

Все работает точно как на андроиде:

Изображение Изображение Изображение Изображение

Теперь в PaintCAD Mobile есть изменение размеров картинки через функцию "Размер растра" с выбором метода масштабирования как в PaintCAD 4Windows.

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Пн апр 13, 2026 9:20 pm

Доработка индикаторов функции "Размер растра"

Раньше был один индикатор:

Изображение

В конце обработки при большом рисунке паинткад останавливал индикацию и без вывода индикатора перерисовывал результат из временного буфера на текущий рисунок.

Добавим для этой перерисовки отдельный второй индикатор - вместо остановки индикации будет показываться процесс перерисовки чтоб было ясно что происходит и сколько это будет продолжаться:

Изображение

Улучшаем "Мозаику" до ее версии из PaintCAD 4Windows

Мозаика в PaintCAD Mobile сейчас умеет текстурировать выделение картинкой из буфера:

1) Если есть большая картинка с выделенным на ней фрагментом:

Изображение

А в буфере уже лежит мелкая картинка, которой будем текстурировать эту большую

2) То вызываем "Мозаику":

Изображение

3) Выбираем прозрачный цвет картинки в буфере (можно не выбирать, тогда затекстурируется прямоугольными картинками из буфера с фоном по углам. Но сейчас выберем фоновый цвет чтобы он не вошел в текстуру):

Изображение

4) По запросу "Куда льем?" выбираем "Указать цвет":

Изображение

5) И указываем цвет на рисунке, на котором будет нарисована текстура:

Изображение

6) Получается текстура красными шариками из буфера в пределах выделения и только на указанном цвете, изображения шариков располагаются вплотную друг к другу по горизонтали и вертикали, с шагом, равным ширине/высоте картинке шарика в буфере:

Изображение

Добавляем дополнительные шаги настроек мозаики

В PaintCAD 4Windows можно эти шарики нарисовать "Мозаикой" не только вплотную друг к другу, но и случайно в разных местах выделения.

Первый новый шаг - запрос как же располагать элементы текстуры - друг за другом (по сетке, как было раньше)

Изображение

или случайно (новый вариант):

Изображение

Если выбрать "Случайно" - то вылезет еще одно новое окошко с выбором силы эффекта "Мозаики". Выбирается она от 0 до 100000 (в PCW так было, и сюда переносим так же). Чем выше - тем больше картинок буфера будет раскидано случайно в пределах выделения. По сути, это плотность текстурирования. В отличие от диапазона "0-100", как у других эффектов, позволяет точно выбирать эту плотность (может слишком точно). Скорее всего, сначала в PCW был сделан диапазон от 0 до 100, но сила 1 для какого-то размера выделения рисовала, к примеру, 20 картинок, а сила 2 уже 50 картинок. А как нарисовать 30 или 40? Чтобы можно было аккуратно выбрать нужное количество картинок была сделана такая точная регулировка плотности их размещения на рисунке, аж от 0 до 100000.

Выбираем вариант "Случайно", вылезает запрос силы эффекта - выбираем плотность, например, 30 тысяч с лишним из 100 тысяч максимально возможных:

Изображение

Получаем на картинке:

Изображение

Эффект "Мозаика" в случайном варианте похож на "Спрей", но спрей рисует точками, а мозаика - картинками из буфера:

Изображение

Если затекстуривать изображение случайным вариантом "Мозаики" с большой плотностью, то может потребоваться больше времени чем для обычной мозаики по сетке, т.к. в каждой точке рисуется не пиксель из буфера, а целый буфер:

Изображение

Если еще и исходное изображение большое - то будет долгая обработка. Но вручную раскидать столько объектов через "Вставку" или "Спецвставку" было бы еще труднее, а с мозаикой - запустить и просто ждать результата:

Изображение

Теперь в PaintCAD Mobile улучшенный эффект "Мозаика" в двух вариантах раскидывания изображений буфера по текущему выделению - по сетке и случайно, как в PaintCAD 4Windows.

Аватара пользователя
blackstrip
Админ
Сообщения: 1315
Зарегистрирован: Ср янв 02, 2008 1:42 pm
Откуда: Подольск
Контактная информация:

Re: PaintCAD Mobile - журнал разработки

Сообщение blackstrip » Вт апр 21, 2026 9:22 pm

Доработка распределения вставляемых буферов по рисунку при случайной мозаике

В PCW было сделано, что случайная мозаика в каждом из пикселей выделения случайно решает "нужно сюда вставить буфер или нет" (вероятность в зависимости от силы эффекта), и если нужно - то вставляет его центром на этот пиксель.

В итоге все эти "случайные" шарики из предыдущего поста почти всегда целиком попадают в выделение. Ну, как минимум, половина каждого шарика точно торчит в выделении:

Изображение

Хотелось бы чтобы иногда изображение буфера вставлялось при случайной мозаике так, чтобы оно почти все было за границей выделения, а в выделение попадал (и рисовался), например, 1 пиксель.

Вместо центрирования вставляемого буфера (т.е. его сдвига влево-вверх на половину ширины/высоты буфера) выберем случайные сдвиги от 0 до (ширины/высоты буфера - 1) по горизонтали/вертикали для каждого вставляемого буфера. Получаем, на примере верхнего случая, шарики, торчащие иногда всего на 1 пиксель (тут они четко видны на нижней границе выделения):

Изображение

Расширитель вместо Сканлайна (из PaintCAD 4Windows)

В мобильном паинткаде по "*" открывается меню эффектов и там есть отдельный эффект "Сканлайн" - увеличивает рисунок ровно в 2 раза по ширине/высоте, дополняя каждую его строку пикселей точно такой же, но затемненной. Из-за этого кажется что рисунок не с крупными пикселями 2х2, а с чем-то таким зернистым (как будто не так сильно потерял в качестве при увеличении).

В PaintCAD 4Windows на этом месте (и с такой же иконкой с изображением сканлайна) стоит "Расширитель":

Изображение

Внутри целая куча способов увеличить рисунок в N-ное количество раз разными алгоритмами, на самом первом месте в списке - тот самый сканлайн:

Изображение

Сделаем то же самое в мобильном паинткаде. В меню эффектов теперь на значке сканлайна будет подпись "Расширитель":

Изображение

И при его вызове будет открываться меню, в котором можно будет выбрать алгоритм увеличения. Добавим туда первым сканлайн:

Изображение

А теперь добавим и все остальные алгоритмы увеличения Расширителя из PCW.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость