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

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

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

Сообщение blackstrip » Вс сен 21, 2025 2:22 pm

Добавляем улучшенную область увеличения 11х11 (с метками и выделением) в окно AddText

Возвращаемся назад, к модулю AddText - окошку для:
- вставки текста инструментом "Текст",
- вставки символов PCF-шрифта функцией "0" - "Шрифты" - "Обзор шрифта",
- выбора параметров (размера, жирности и т.д.) сливаемого с телефона шрифта в растровый PCF-шрифт функцией "0" - "Шрифты" - "Разбор МобШрифта"

Добавляем туда для двух из трех функций (инструмента "Текст" и вставки символов "Обзором шрифта") полноценный режим "прицеливания" по "*" - доработанную область увеличения 11х11 и толстые линии меток/выделения на рисунке. Для третьей функции ничего не добавляем, т.к. там просто выбираются размеры для слива шрифта мобильного телефона в PCF-файл, а позиционирования текста на картинке не происходит.

И смотрим что получилось.

В процессе тестирования было обнаружено, что текст в окне AddText текст обрезается в пределах выделения - и сразу видно какой его кусок будет размещен на картинке. НО при размещении на картинке выделение не учитывалось вообще и шрифт всегда ляпался на картинку целиком (как мобильный шрифт, так и загруженный PCF-шрифт). Теперь это исправлено - теперь текст при вставке на рисунок честно обрезается до текущего выделения (как и другие инструменты типа линий или кругов всяких), теперь можно нарисовать надпись, например, торчащую наполовину из-за забора, если предварительно выделить фрагмент картинки до границы забора =)

Итак, возьмем текст "test":

Изображение

Вставка текста с обычным мобильным шрифтом

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

Изображение

С включенной областью 11х11 - толстые линии выделения и крестовой метки на рисунке, полноэкранная крестовина курсора:

Изображение

В итоге в главном окне на рисунке срезанный выделением фрагмент вставляемого текста:

В масштабе х1:

Изображение

С увеличением:

Изображение

Вставка текста с PCF-шрифтом

Без включенной области 11х11:

Изображение

С включенной областью 11х11:

Изображение

Срезанный выделением фрагмент вставляемого текста PCF-шрифтом в главном окне:

В масштабе х1:

Изображение

С увеличением:

Изображение

Вставка символа из PCF-шрифта

Запускаем обзор шрифта:

Изображение

Выберем символ потолще чтоб посмотреть как он срезается исправленным выделением:

Изображение

Вставка без включенной области 11х11:

Изображение

Вставка с включенной областью 11х11:

Изображение

Срезанный выделением фрагмент вставляемого текста PCF-шрифтом в главном окне:

В масштабе х1:

Изображение

С увеличением:

Изображение

В итоге:
- теперь в окне AddText при вставке текста и символов можно включить по "*" область увеличения 11х11 (доработанную - с метками и выделением) и толстые линии меток и выделения на самом рисунке,
- теперь текст и вставка символов через "Обзор шрифта", как и другие инструменты, нормально обрезаются выделением и на рисунок вставляется только их часть, попавшая в выделение.

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

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

Сообщение blackstrip » Пн сен 22, 2025 7:49 pm

Правка мелочей

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

1) в окне файлового менеджера "Обзор..." (Explorer) сделаем как в других окнах - по "*" режим масштабирования предпросмотра, а по "9" скрытие тестовой информации информации. До этого было наоборот - звездочка скрывала текст, а "9" включала масштабирование предпросмотра.

2) в окне "Обзор шрифта" масштабирование текущего выбранного символа кроме кнопки "Джойстика" продублируем на кнопку "*".

3) в окне AddText (вставка текста инструментом "Текст", вставка символов функцией "Обзор шрифта", выбор стиля разбираемого мобильного шрифта через "0"-"Шрифты"-"Разбор МобШрифта"), когда оно используется для разборки шрифта на BMP-символы ("Разбор МобШрифта") - если передумать и нажать отмену (левый софт), то при вызове этого же окна инструментом "Текст" начинаются чудеса - оно спрашивает "Выбери стиль", как будто все еще хочет разбирать мобильный шрифт на символы, а для текста показывает введенным "ABCabc" и "АБВабв". Поправим эту ошибку, если отмена идет в режиме выбора стиля - выключим режим выбора стиля и очистим текст (раньше он выключался только если нажмешь "Ок", а не "Отмену").

4) виртуальная клавиатура отходит от "виртуального экрана" на лишний пиксель =) "виртуальный экран" - полэкрана, причем по странной формуле прописан "r/2-1", где r - размер экрана, вероятно, какая-то защита от нечетного количества пикселей, хотя проще было просто поделить размер экрана на 2, в яве целочисленное деление int чисел, например, 11/2=5. Из-за этого на экране высотой 480 пикселей окошки рисуются высотой не 240, а 239, потом идет пустая строчка пикселей, закрашиваемая непонятно чем (например, строчкой пикселей большей чем виртуальный экран по высоте картинки, которая кидается на экран через drawImage и торчит ниже добавленной "области увеличения 11х11" одной строчкой пикселей), а потом уже начинается виртуальная клавиатура. Исправим это, поправив размеры и координаты виртуального экрана и виртуальной клавиатуры.

Обведем клавиатуру красной рамкой толщиной 1 пиксель чтоб убедиться что она пристыковалась к окошку вплотную:

Изображение

Посмотрим как дела с торчанием рисунка из под "области увеличения 11х11":

Изображение

Изображение

Не торчит - кончилась "область", началась клавиатура. Без красной рамки тоже не торчит:

Изображение

И "виртуальный экран", в котором отрисовываются окошки, теперь равен ровно половине экрана.

5) окошко по "ДжойВправо" - "Лупа" не ожидало что в нем будут такие большие коэффициенты масштаба (а теперь максимальный коэффициент в паинткаде увеличен до 100). Предпросмотр пикселей вылезает далеко за область окна:

Изображение

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

Изображение

Остальное масштабирование (значки и текст в нужное место положить, как минимум) будем делать когда ревизия окон дойдет до этого ZoomBrowser окошка.

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

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

Сообщение blackstrip » Вт сен 23, 2025 7:16 pm

Следующее окно - Gtc:

Изображение

Ревизия окна Gtc

Gtc - от слов "get transparent color", используется чтобы указать прозрачный цвет с любого пикселя в буфере обмена. Нужен для Спецвставки (вставка из буфера на рисунок с прозрачным цветом, пиксели которого не вставляются) и Мозаики (закраска/текстурирование зацикленным изображением из буфера). Окно похоже на Getco, но работает с буфером, а не с рисунком.

В последней beta-версии оно было таким:

Изображение

Как и с Getco - сначала добавляем масштабирование интерфейса, раскладываем надписи по координатам в виртуальных пикселях, толстый маркер на курсоре по кнопке "#" (на скриншоте маркер не показан):

Изображение

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

Изображение

Вроде бы всё. Теперь в окошке выбора прозрачного цвета Gtc для Спецвставки и Мозаики есть масштабированный интерфейс, включаемые по "*" область увеличения 11х11 пикселей и большая крестовина вместо мелкого курсора.

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

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

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

Сообщение blackstrip » Ср сен 24, 2025 7:23 pm

Дальше по алфавиту окошко Help:

Изображение

Ревизия окна Help

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

В последней beta-версии оно было таким:

Индекс (все разделы):

Изображение

Индекс, почему-то, залезает на софт-клавиши)

Одна из статей помощи:

Изображение

Статьи помощи - уже не залезают.

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

Смотрим, что получилось - индекс и статья:

Изображение

Изображение

Слишком много пустого места. Посмотрим где лежат строчки в индексе и в статье и почему так пусто вокруг:

Изображение

Изображение

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

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

И еще в окошке отдельно выделен режим "Совет дня" (который используется при выводе советов дня на старте паинткада). Поэтому проверим все три режима - Совет дня, Индекс, Статья.

Смотрим, что получилось - Совет дня, Индекс, Статья:

Изображение

Изображение

Изображение

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

И без маркеров - Совет дня, Индекс, Статья:

Изображение

Изображение

Изображение

Вроде бы всё ровно. Теперь проверим это окно на всех тестовых телефонах с разнообразными размерами экранов и виртуальных пикселей.

Проверка окна Help на тестовых телефонах в трех режимах - Совет дня, Индекс, Статья

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

Изображение

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

Изображение

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

Изображение

Изображение

4 - Android 9 - Soyes XS13

Изображение

Изображение

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

Изображение

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

Изображение

Изображение

7 - Java 2 Microedition - Nokia N90

Изображение

Изображение

Изображение

8 - Java 2 Microedition - Nokia 7900 Prism

Изображение

Изображение

Изображение

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

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

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

Сообщение blackstrip » Чт сен 25, 2025 7:49 pm

Следующие модули по списку - IBMX1664, IGIF, IWBMP, IXZ - модули с интерфейсом в виде форм (окошки импорта BMX16x64 анимации, GIF-файла, WBMP-чернобелой картинки, XZ - любого файла через функцию "Открыть ???"). Их масштабировать не нужно.

Следующий графический модуль - JoySetup:

Изображение

Ревизия окна JoySetup

JoySetup - от слов "joystick setup", т.е. "настройка джойстика". Окошко вызывается в меню "0" - "Настройки" - "Чем рисуем...", спрашивает "Чем рисуем?", и если выбираешь что рисуешь джойстиком - будут кнопки джойстика работать как 2,4,6,8 и 5 клавиши. А эти цифровые клавиши, наоборот, будут выполнять функции джойстиковых кнопок.

В последней beta-версии оно было таким:

Изображение

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

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

Изображение

Вроде бы и всё.

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

Какие клавиши контролирует PaintCAD

В паинткаде используются следующие клавиши:
Джойстик: KEY_JOYSTICK, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT
Цифровые клавиши: KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9
Звездочка и решетка: KEY_STAR, KEY_POUND
Софт-клавиши: KEY_LSOFT, KEY_RSOFT
Снять трубку и положить трубку: KEY_GREEN, KEY_RED
Клавиши громкости:
KEY_PLUS - клавиша "+" громкости на Siemens-телефонах, вызывает функцию "Фото"
KEY_MINUS - клавиша "-" громкости, вызывает/закрывает функцию "Предпросмотр" в главном окне (аналогично кнопке "Положить трубку")
Спец.клавиши:
KEY_FOTO - клавиша "Фото" на Siemens-телефонах, вызывает функцию "Фото"
KEY_MOTO - клавиша на Motorola-телефонах, вызывает/закрывает функцию "Предпросмотр" в главном окне (аналогично кнопке "Положить трубку")

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

История с клавишами, дублирующими другие, такая:
Раньше, на цветных Siemens первых моделей, краткое нажатие кнопки "Положить трубку" срабатывало как обычная другая клавиша и передавало в j2me-программы код кнопки "Положить трубку". В те времена на эту клавишу был назначен "Предпросмотр" в главном окне - просмотр рисунка на пустом экране в масштабе х1: чтобы из рисования с большим масштабом не выходить, а просто посмотреть на рисунок "издалека", увидеть что получается, и по такому же нажатию "Положить трубку" вернуться обратно к рисованию.

На более новых сименсах придумали что краткое нажатие клавиши "Положить трубку" закрывает активное приложение и в яве она стала недоступна. Пришлось придумывать что делать. Соседняя клавиша "Снять трубку" была уже занята - назначена на выбор "Тип линии" (сплошная линия или пунктир), отображаемый даже в главном окне рисования рядом со значком инструмента.

Пользуясь сименсом хотелось хотя бы на сименсах облегчить пользование и вернуть "Предпросмотр".

У некоторых сименсов была клавиша "Фото" сбоку корпуса. У меня был Siemens CX75 с такой клавишей:

Изображение

Ее в паинткаде назначил чисто на вызов съемки "Фото" чтобы быстро вызвать съемку, снять фотку и продолжить ее дорисовывать в паинткаде. Хотя можно было бы ее и назначить на "Предпросмотр", но в телефоне Siemens CX75, насколько помню, красная "Положить трубку" еще работала в яве.

Потом я перешел на Benq-Siemens E71, в нем красная кнопка "Положить трубку" гарантированно закрывала паинткад, с концами стирая все нарисованное =) Вот тут пришлось думать куда назначить предпросмотр.

Но к тому времени на Benq-Siemens E71 и других телефонах были клавиши "Плюс" и "Минус" для регулировки громкости в музыкальных плеерах или просто в оболочке телефона. И их можно было использовать в яве!

Изображение

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

На "плюс" было назначен вызов "Фото". На "минус" был назначен "Предпросмотр".

И стал паинткад вызывать фото и вызывать предпросмотр:
- и на новых Benq-Siemens (плюсом-минусом громкости),
- и на постарей Siemens x75 (кнопкой фото - кнопкой "Положить трубку"),
- и на совсем старых Siemens без боковых кнопок (просто "Положить трубку" для предпросмотра, а для фото "ДжойВправо"-"Фото" в меню команд).

Для других телефонов (не-сименсов) с неработающей "Положить трубку" предпросмотр стало можно вызвать в главном окне последовательностью "ДжойВправо" (откроется меню команд) и нажатием "#" - а потом выход из предпросмотра по повторной "#". Тоже более-менее удобно.

А у телефонов Motorola была еще дополнительная клавиша, которая была в паинткаде персонально отслежена, обозвана KEY_MOTO с кодом "-23", и назначена на "Предпросмотр" (т.к. клавиша "положить трубку" на этих телефонах тоже закрывала паинткад).

Какие клавиши будем назначать

Цифровые: 1,2,3,4,5,6,7,8,9,0 и *, #
Джойстик: вверх, вниз, влево, вправо, кнопка джойстика
Стандартные доп.клавиши: левый софт, правый софт, поднять трубку, опустить трубку.
Специальная клавиша: фото.

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

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

Процесс настройки с нуля

Допустим, запускается паинткад на неизвестном устройстве. Устройство не опознано по стандартным классам, устройства нет в базе наборов кодов клавиш, выбираемых в окне выбора языка по клавишам 1-9. Это не сименс, не нокия, не моторола, не сониэриксон, не андроид. Сенсорного экрана у него тоже нет. Управлять невозможно. Есть только клавиатура, но коды клавиш полностью неизвестны.

Тогда в самом первом окне (эмблемка на черном экране с надписью "Жми клаву/экран!") надо дать возможность сразу перейти в настройку управления клавиатурой. Окно принимает касание экрана - и тогда паинткад включает виртуальную клавиатуру для управления. Еще окно принимает нажатие клавиши - и тогда паинткад не включает виртуальную клавиатуру, а ждет управления с физической клавиатуры (сенсорное управление на самих окнах при этом работает).

Остается долгое нажатие любой клавиши - назначим на него переход в настройку неизвестных кодов неизвестного устройства (новое окно "Чем рисуем?") и напишем об этом сверху и снизу эмблемы рядом со старыми надписями. Если у устройства есть хоть одна кнопка - жмем ее и долго не отпускаем и паинткад сразу переходит в настройку ввода с клавиатуры. Заодно кратно отмасштабируем эмблему под экран, а то она была маленькая:

Изображение

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

Изображение

Нажимаем любую клавишу и не отпускаем ее. Как сработает первое событие "keyRepeated" - запомним текущее время системы и будем рисовать индикатор, который будет показывать прогресс удерживания клавиши)

Изображение

Как пройдет 1 секунда при зажатой клавише - индикатор дойдет до 100% и появятся надписи что пора отпускать клавишу:

Изображение

После отпускания клавиши прыгаем в окошко JoySetup. А если отпустить клавишу раньше чем индикатор дойдет до 100% или вообще нажать и отпустить сразу, не удерживая - то паинткад как раньше перейдет на стартовое окно с выбором языка интерфейса, загрузкой ресурсов и т.д.

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

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

Изображение

Кратко нажимая клавиши - можно просто посмотреть коды разных клавиш, проверить выдают ли они какие-то коды или сломаны, или вызывают оболочкой телефона какие-то функции (например Joy's S15 имеет дополнительные клавиши типа Whats App, Wi-Fi и т.д., они сначала передают в приложение код клавиши, но потом перехватываются оболочкой, паинткад сворачивается и открывается Whats app). Вверху отображается текущая настраиваемая клавиша и ее полученный код.

Изображение

Долго удерживая подходящую клавишу (1 секунд) - смотрим как за надписью с кодом бежит синяя полоска.

Изображение

Ждем пока она добежит до конца за секунду - надпись меняется на "Отпусти/Release":

Изображение

Отпускаем клавишу - код устанавливается на клавишу и на соответствующей кнопке нарисованного на экране телефона появляется вместо "J" надпись "J:-4" (проверка на этих скриншотах была по клавише "Назад", поэтому и код "-4", у настоящей клавиши джойстика другой код).

Изображение

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

Изображение

Назначить одну и ту же клавишу физической клавиатуры телефона на разные кнопки управления паинткад не даст, будет писать "Код занят":

Изображение

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

Изображение

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

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

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

Рисуем его в той же цветовой гамме что и клавиатуру телефона, выбранная кнопка пусть будет тоже фиолетовой. Свежевведенными кнопками Вверх, Вниз выбираем язык. Центральной кнопкой джойстика Джой нажимаем на кнопку чтобы выбрать язык:

Изображение

В горизонтальной ориентации тоже все должно влезть в экран:

Изображение

Возвращаемся к нарисованному телефону для назначения остальных клавиш. Теперь окошко с телефоном рисуется в выбранном языке.

Кое-что проверим насчет отрисовки. Клавиатура по вертикали делит экран на 9 частей. А шрифт в паинткаде как раз рассчитан так чтобы занять 9-10 строк по самому маленькому размеру (ширине или высоте, смотря какая ориентация экрана и что из них меньше). Поэтому все кнопки с надписями должны влезть при любой ориентации экрана. Разве что, может быть, кнопки сделать пошире, без таких зазоров между ними если текст кнопок будет вылезать за их границы.

Посмотрим как выглядит клавиатура на горизонтальной ориентации в этом же эмуляторе на экране 480x320:

Изображение

Средняя кнопка джойстика с надписью J вообще налезает на бока кнопки. Да и остальные только-только влезают. Уменьшим зазоры между кнопками.

Три варианта зазоров - старый зазор 2 виртуальных пикселя сбоку от клавиши (итого 4 виртуальных пикселя между соседними клавишами - 2 пикселя у бока одной и 2 пикселя у бока соседней другой), зазор поуже 1 виртуальный пиксель (2 виртуальных пикселя между соседними клавишами), и самый узкий зазор 1/2 виртуального пикселя (1 виртуальный пиксель между соседними клавишами, в случае если виртуальный пиксель делится на 2 ровно):

Изображение

Пожалуй 1/2 пикселя самый подходящий, т.к. 9 строк и так еле влезают в экран, и текст еле влезает в кнопки (были бы на кнопках буквы, свисающие вниз, типа p или y - они бы достали до нижней границы кнопки как большая J). Оставим его.

На этом разрешении виртуальный пиксель равен двум реальным. На телефонах с меньшим экраном, где виртуальный пиксель равен одному реальному - деленный пополам пиксель превратится в 0. Поэтому поставим ограничение - если деленный пополам виртуальный пиксель равен 0 - то принудительно ставим его в 1 реальный пиксель, чтоб зазоры, хотя бы минимальные, все-таки остались, и клавиши не стояли бы вплотную =)

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

Изображение

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

Изображение
Кстати, встречались раньше некоторых телефоны, у которых был двунаправленный джойстик. Вот, например, Siemens MC60, у него нет клавиш ДжойВлево и ДжойВправо. Вместо них - две софт-клавиши. Да и центральной клавиши джойстика у него нет:

Изображение

Вместо клавиши на этом телефоне можно было в паинткаде использовать "5" как обычно. А вот ДжойВлево можно вызвать как "0" (Меню") и потом "*". А ДжойВправо можно вызвать как "0" (Меню) и потом "#". Эти сочетания для вызова ДжойВлево (обмен ПЦ и ЗЦ) и ДжойВправо (Меню команд) работают в паинткаде до сих пор. Хоть сам телефон и был с MIDP1, поэтому современный паинткад, требующий MIDP2, на нем не пойдет никак.
Как-то надо будет управлять этим окном когда настроим все клавиши. Добавим в окно еще кнопку "..." для вызова меню, чтобы в нем, например, сохранить все введенные коды клавиш и перейти в паинткад.

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

Изображение

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

Изображение

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

Полностью настроенные клавиши android-телефона Xiaomi Duoqin F22 Pro (без кнопок Положить трубку и Фото, т.к. положить трубку даже по краткому нажатию сворачивает всё, а клавиши Фото в этом телефоне нет):

Изображение

Меню сделаем не на стандартном интерфейсе паинткада (типа главного меню), а на этих же кнопках, т.к. оно будет небольшое.

Возьмем за основу меню выбора языка (уменьшим заодно и в меню выбора языка кнопки):

Изображение

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

Сделаем так:
Назад - возврат в окно назначения клавиш
Авто-выбор кодов - вызывает подменю авто-настройки кодов клавиш
Стереть код - просто выдаст подсказку, что при выборе клавиши, которую будем назначать - короткое нажатие Джоя вызовет ожидание кода для назначения, а долгое нажатие Джоя вызовет стирание кода с клавиши. После этого перейдет к окну с настройкой клавиш, чтоб долгим нажатием Джоя стирать коды.
Стереть все коды - спрашивает подтверждение, и если "Да" - то стирает все назначенные коды со всех клавиш. При этом Вверх, Вниз и Джой, назначенные в самом начале автоматически, продолжат работать (они сохранены в отдельные дополнительные переменные)
Назначать Vol.+/- - под Андроидом позволит паинткаду начать перехватывать кнопки громкости, тогда в паинткаде нельзя будет настроить громкость (например, для фоновой музыки из другой проги-плеера пока рисуешь), но зато две этих клавиши можно будет использовать (например, на Фото и Предпросмотр, которых не хватило на скриншоте Xiaomi Duoqin F22 Pro выше, или даже Предпросмотр назначить на Поднять трубку, а Стиль линий и Фото - на Громкость+ и Громкость-)
Тест клавиш - попробовать назначенные коды, нажатые физические кнопки будут на экране перекрашиваться в другой цвет и можно будет проверить всё ли правильно настроено
Сохранить и выйти - сохраняем все коды в настройки и выходим на стартовое окошко паинткада
Отменить и выйти - оставляем старые коды и выходим на стартовое окошко паинткада

Подменю "Авто-выбор кодов" будет такое:
Назад - возврат назад в меню
Стандартные 0-9,*,# - назначает на эти кнопки стандартные явовские коды. Обычно они везде одинаковые если только это не какое-то экзотическое или самодельное устройство
Автоопределить всё - определяет по вспомогательным классам модель телефона (сименс, моторола, сонерик и т.д.) и показывает, например, "Телефон определен как Sony Ericsson. Установить его коды клавиш?".
- если "Отменить" - то возврат обратно в меню
- если "Да, установить" - то ставит коды и возвращается в окно настройки клавиш
- если "Нет, выбрать другой" - показывает на выбор все доступные модели и их наборы кодов, выбираем вручную
Выбор по модели - делает то же, что и выше "Автоопределить всё" при выборе "Нет, выбрать другой"

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

Получается в портретной ориентации:

Изображение

И в альбомной ориентации:

Изображение

Меню-подобные окна в портретной ориентации:

Изображение

В альбомной ориентации:

Изображение

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

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

Сообщение blackstrip » Ср окт 08, 2025 10:10 pm

Собираем из кнопок первое меню, показываемое по клавише "...":

В вертикальной ориентации:

Изображение

В горизонтальной ориентации:

Изображение

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

В англ.варианте тоже должны быть короткие тексты чтоб влезать в узкие экраны:

Изображение

Изображение

Теперь собираем второе меню - подменю "Авто-выбор кодов" (вызывается по второму пункту меню "Меню настройки"):

На русском:

Изображение

Изображение

На английском:

Изображение

Изображение

Делаем выборочное стирание кодов с клавиш

Стирание кодов с клавиш сделаем двумя путями - оба пути по долгому удерживанию клавиши:
1) выбирая клавишу для назначения - на текущей выбранной ДОЛГО жмем джойстик и потом отпускаем - и назначенный код с нее стирается;
2) выбрав уже клавишу для назначения - вместо нажатия требуемой клавиши ДОЛГО жмем любую клавишу - и назначенный код с нее стирается (своего рода отмена назначения, если передумал назначать).

Выглядит это так:

1) долго держим клавишу - начинает бежать односекундная полоска:

Изображение

Если в этот момент отпустить - то паинткад сработает на нее как на краткое нажатие.

2) А если дождаться этой одной секунды - полоска добежит до конца и появится надпись с просьбой отпустить клавишу:

Изображение

3) После отпускания клавиша будет очищена и надпись об этом появится сверху:

Изображение

Делаем функции меню/подменю

Меню настройки - Стандарт 0-9,*,#

Заходим в меню и вызываем этот пункт:

Изображение

Изображение

Изображение

В итоге коды назначены на цифры и звездочку с решеткой:

Изображение

Если сначала были уже назначены эти коды для 0-9,*,# на другие клавиши:

Изображение

То они будут стерты:

Изображение

Делаем назначение клавиш громкости (для Android-устройств)

Если во время назначения нажать клавишу увеличения или уменьшения громкости - то она будет регулировать громкость и не будет назначаться:

Изображение

Выбираем в меню "Назначать Vol+/-"

Изображение

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

Изображение

После выбора "Да" клавиши громкости больше не регулируют громкость при активном запущенном паинткаде, но могут быть назначены (у них коды -24 и -25). Если паинткад свернуть - то, конечно, громкость регулируется кнопками как обычно:

Изображение

Английский вариант окна с вопросом:

Изображение

Т.к. эта функция только для андроида - под явой эту кнопку просто исключим из меню настройки:

Изображение

Авто-определение кодов клавиш по модели телефона

Раньше эта функция была в ручном режиме в стартовом окне паинткада - кнопками 1-8 выбиралась модель телефона, и коды клавиш выставлялись в соответствии с выбранной моделью.

Теперь аналогичная функция - в меню настройки клавиш. Под андроидом проверим на Xiaomi Duoqin F22 Pro:

Изображение

Выбираем пункт "Авто-выбор кодов":

Изображение

И там выбираем "Авто-определить":

Изображение

Под андроидом определяется Android. Смысла выбирать "другую модель" под андроидом нет. Поэтому тут на выбор дается установка кодов с использованием кнопок громкости (тогда они перестанут регулировать громкость фоновой музыки) или без использования кнопок громкости:

Изображение

С использованием кнопок громкости - устанавливаются все кнопки. Клавиша "поднять трубку", доступная для обработки в приложениях на многих кнопочных андроидах - назначается на "Предпросмотр" (красную), чтоб была поближе, т.к. ее чаще всего нажимаешь. Клавиша "Громкость+" на "Фото", Клавиша "Громкость-" на "Стиль линий" (зеленую):

Изображение

Если же выбрать "Без кнопок Vol+/-":

Изображение

То коды те же, но кнопка "Тип линии" (Зеленая) и кнопка "Фото" (Бирюзовая) остаются не назначены.

Изображение

Тогда громкость будет работать как громкость. А эти неназначенные клавиши можно просто вызывать как пункты "Меню команд" (меню по "ДжойВправо" в главном окне). Тип линий еще можно вызвать в главном окне как "ДжойВправо" - откроется меню команд, а потом в меню команд нажать "Звездочку".

Под явой проверим на Nokia N90:

Вызываем авто-определение телефона и его кодов в меню:

Изображение

Изображение

Изображение

Телефон определяется как Nokia/Alcatel. На выбор согласиться с авто-определением модели телефона и установить ее коды, выбрать другой телефон из списка или вообще отменить установку кодов:

Изображение

После согласия на установку нокиевских кодов - они станут видны в основном окне настройки клавиш:

Изображение

На этой Nokia N90 красная кнопка просто закрывает приложение. Поэтому физическую кнопку "Снять трубку" (Answer call) с кодом -10 паинткад будет назначать на "Предпросмотр" (красную клавишу на экране). Аналогично прописано для Motorola (старой) и для Siemens (т.к. в новых сименсах положить трубку тоже закрывала приложение). В любом случае, после автоустановки клавиши можно будет переназначить вручную на свой вкус.

У каких-то нокий, вероятно, физическая кнопка "Положить трубку" не закрывает приложение (у нее в паинткаде записан код -11), ее закинем для этих нокий на зеленую кнопку на экране (будет вызывать "Тип линий"). В общем, в итоге функции кнопок "Снять трубку" и "Положить трубку" поменяются местами. "Снять трубку" будет для Предпросмотра, а "Положить трубку" (если не будет закрывать паинткад) - будет для "Типа линий".

Ручной выбор модели телефона и назначение кодов

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

Изображение

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

Изображение

В меню можно отменить выбор модели вообще или выбрать одну из известных паинткаду:

Изображение

Выбираем, например, сименс:

Изображение

И появляются его коды в окне настройки клавиш (для сименса прописаны клавиши как для самых последних моделей Benq-Siemens, предпросмотр по физической "Взять трубку", тип линий по "Громкость-", фото по "Громкость+", а физическая "Положить трубку" не используется, т.к. она закрывает паинткад. На более старый сименс x65/75 потребуется дополнительная настройка вручную. Но там, на сименсах, и так сейчас от слишком толстых классов паинткада при запуске сразу исключение OutOfMemorу и вылет. Эту проблему надо будет попробовать решить позже):

Изображение

Кнопка меню "Стереть код"

Кнопка в меню настройки:

Изображение

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

Эта простыня текста выводится здесь кратко (чтоб влезла в экран):

Изображение

И английская похожая, влезает еще легче т.к. слова короче:

Изображение

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

Кнопка меню "Стереть все коды"

Было много назначенных кодов:

Изображение

Если решили стереть все вообще - ищем в меню этот пункт:

Изображение

Он спрашивает подтверждение:

Изображение

И все коды стерты:

Изображение

Английский вариант подтверждения:

Изображение

Кнопка меню "Тест клавиш"

Назначили все коды и хотим проверить их:

Изображение

Вызываем в меню "Тест клавиш":

Изображение

Окно переходит в режим теста, наверху напоминание что чтобы завершить тест - нужно зажать любую клавишу и держать:

Изображение

Нажимаем и отпускаем любую из кнопок, на которую назначили код - она пропадает на экране:

Изображение

Нажимаем еще кнопки - они тоже пропадают:

Изображение

Нажимаем все - они все пропали, значит все настроено правильно:

Изображение

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

Изображение

Торчащие тени

Смотрим на тени - они сдвинуты относительно текста на виртуальный пиксель вправо и вниз. Например, на этом скриншоте:

Изображение

в тексте наверху:

Изображение

В среднем, виртуальный пиксель равен толщине линии в символе буквы. НО при сдвиге вправо на пиксель и вниз на пиксель - реально тень по диагонали сдвигается на (корень из 2) * пиксель, т.е. 1.414 пикселя. Отсюда непонятные щели, читать трудновато) При отрисовке текста с тенями была цель сделать их с тенями, и в то же время похожими на объемные (как будто буква уходит вдаль от зрителя, и виден ее бок/тень). Тогда щелей быть не должно.

Сделаем в тенях сдвиг на виртуальный пиксель, деленный на 1.414. Получим:

Изображение

Изображение

Другие окна, в которых тени теперь тоже не торчат (т.к. это исправление во всем интерфейсе паинткада):

Изображение

Изображение

Изображение

Сохранение изменений и Отмена изменений

Последние два пункта меню настройки:

Сохранение изменений:

Изображение

Изображение

После сохранения настроек паинткад переходит к стартовому экрану если заходили в настройку клавиш из него. А если заходили из меню главного окна "Настройки" - "Чем рисуем...", то возвращается в главное окно.

Отмена изменений:

Изображение

Изображение

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

Нужна ли настройка клавиш при использовании виртуальной клавиатуры на сенсорном экране

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

Изображение

Добавим быструю мини-настройку клавиш

Раз уж для андроида есть два варианта настроек - без клавиш громкости и с клавишами громкости (на которые назначены Громкость+ как Фото и Громкость- как Тип линии), то добавим в стартовое окно выбор этих вариантов.

Раньше в стартовом окне были по кнопкам-цифрам доступны раскладки:
1 - Siemens
2 - Motorola(New)
3 - Sony Ericsson
4 - Nokia
5 - Samsung
6 - LG
7 - OLD Motorola
8 - Android

то добавим на кнопку 9 новый вариант - Android&Vol (Андроид и Громкость)

Теперь если нажать в стартовом окне 9 - наверху отобразится этот вариант, клавиши громкости андроида будут заблокированы и будут перехватываться паинткадом (Громкость+ как Фото и Громкость- как Тип линии).

Изображение

Если после этого выйти из паинткада и снова запустить его - наверху стартового окна уже будет написано просто "Android", но т.к. раскладка клавиатуры сохранена вместе с клавишами громкости и с включенным перехватом, то и при этом, и при последующих запусках громкость будет как Фото/Тип линии.

Если захочется отключить перехват громкости - опять же в этом стартовом надо нажать 8 - тогда загрузится авто-раскладка без клавиш громкости, они будут освобождены и снова станут регулировать громкость. И во всех последующих запусках клавиши громкости не будут перехватываться пока пользователь не нажмет в стартовом окне 9, выбрав вариант раскладки Android&Vol.

Вот так кнопками 8 и 9 теперь можно выбрать в стартовом окне оба варианта раскладок для андроида.

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

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

Сообщение blackstrip » Пт окт 17, 2025 6:06 pm

Проблема оперативной памяти
blackstrip писал(а): Ср окт 08, 2025 10:10 pmДля сименса прописаны клавиши как для самых последних моделей Benq-Siemens, предпросмотр по физической "Взять трубку", тип линий по "Громкость-", фото по "Громкость+", а физическая "Положить трубку" не используется, т.к. она закрывает паинткад. На более старый сименс x65/75 потребуется дополнительная настройка вручную. Но там, на сименсах, и так сейчас от слишком толстых классов паинткада при запуске сразу исключение OutOfMemorу и вылет. Эту проблему надо будет попробовать решить позже
Паинткад давно уже не идет на слабых телефонах с MIDP2. Запускаем вот эту последнюю версию с настройкой клавиш и т.п. на Siemens C65 эмуляторе и видим OutOfMemory:

Изображение

Т.е. ява распаковала JAR-архив, взяла главный класс PaintCAD, запустила его, там в самом начале создаются экземпляры класса стартового окна Loading и главного класса MainForm. Потом передается отображение в Loading. И где-то там не хватило памяти и всё, конец)

Когда-то давно такая ошибка стала вылетать - и тогда класс MainForm был поделен на два класса: MainForm и MainForm2. Часть процедур и переменных были перекинуты в MainForm2. И тогда все заработало и OutOfMemory перестал вылетать. Но потом программа росла-росла и вот уже лет пять-десять на старых сименсах она не запускается опять.

Попробуем разобраться из-за чего так происходит. Варианты:
1) если классы и ресурсы (картинки) помещаются в оперативную память и занимают там место, то этого места не хватило и привет. Можно было бы сделать для слабых телефонов версию с мелкой графикой, не занимающей много места
2) предел по размеру класса, как только класс вырастает до некоторого предельного для телефона размера (например, 64 килобайта) - ява больше не хочет грузить его и при загрузке такого большого класса выдает OutOfMemory (тогда понятно почему разделение класса MainForm на два класса помогло - было, например 80 кбайт, а стало 40 и 40, оба класса стали загружаться и запускаться без проблем). Тогда надо снова делить MainForm и делать MainForm3 =)
3) что-нибудь неведомое, что знают только те, кто знает как работает ява (это не я, ха-ха), как она грузит классы и запускает их, на что тратится Java-heap и т.д. Тут бы помог вывод с разблюдовкой по классам - какой класс сколько хочет занять, какой сколько занимает, какой спотыкается на выделении памяти и заваливает всю программу, и в какой момент все это происходит

У эмулятора, кстати, есть output window - выдает всякие сообщения. И он после ошибки OutOfMemory выдает вот что:

Изображение

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

Изображение

Не удается инициализировать класс MainForm. Уберем все создания экземпляров классов и переход на MainForm - эмулятор бесконечно показывает анимацию "Please wait...", видимо чтоб программа загрузила все что надо и наконец-то перешла на первый Displayable-класс:

Изображение

Попробуем передадим отображение на новый класс сохранения 24-битного BMP:

Код: Выделить всё

display = Display.getDisplay(this);
display.setCurrent(new SBMP24());
О, чудо - он показывается:

Изображение

Т.е. загрузить, распаковать куда-то и запустить 600-килобайтовый JAR полностью - у Siemens C65 сил хватает. И начать отображать один из классов-displayabl-ов - тоже хватает. Хорошо. Делать low-версию с урезанным количеством ресурсов не придется.

Попробуем создать только экземпляр Loading, а перейти на SBMP24:

Код: Выделить всё

displayabl = new Loading();
display = Display.getDisplay(this);
display.setCurrent(new SBMP24());
И тоже видим OutOfMemory. Причем в Output window эмулятора - ничего не выводится. Будем отрезать от Loading-а кусочки пока он не станет таким худым что запустится =)

Вырезав все из Loading (включая все обращения к статическим переменным MainForm) - зазапускался паинткад с отображением SBMP24 окошка. Хорошо.

Теперь передадим отображение прямо на Loading, как это обычно и происходит в необрезанном паинткаде:

Код: Выделить всё

displayabl = new Loading();
display = Display.getDisplay(this);
display.setCurrent(displayabl);
В процедуре отрисовки пропишем просто зарисовку экрана черным:

Код: Выделить всё

g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
И оно рисуется:

Изображение

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

Уберем обращение к большому классу MainForm. И проверим, действительно ли, класс не может загрузиться если он большого размера, или это неправда.

Сейчас Loading почти 4 килобайта:

Изображение

А MainForm аж 119 килобайт:

Изображение

Напихаем в Loading от души кода в какую-нибудь фиктивную процедуру так чтобы он разросся до подобного размера. Добавим статичную процедуру:

Код: Выделить всё

  static void Fictive() {
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
  }
Размер увеличился до 3,99 килобайта:

Изображение

Повторим строчку приравнивания 10 раз вместо одного:

Код: Выделить всё

  static void Fictive() {

    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    JoySetup.KEY_FOTO = (int)System.currentTimeMillis();
    
  }
Стало 4,09 килобайта:

Изображение

Loading увеличился на 100 байт. А нам надо нарастить 115 килобайт. Хорошо, вставляем в процедуру 100 таких строчек вместо 10, смотрим линейно ли растет размер (мало ли какая оптимизация явы включится). Видим 5,05 килобайта:

Изображение

Вырос на 1 килобайт примерно. Как раз в 10 раз больше чем 100 байт. Окей, теперь добавим 100 раз по 100 строчек +) Должен быть класс 100 с лишним килобайт.

Теперь Jbuilder помер, пишет что байт-код превышает 65536 байт (64 килобайта):

Изображение

Может ему не нравится одна большая процедура. Хорошо, сделаем 10 маленьких.

10 маленьких preverifier-у понравились. Класс Loading теперь 111 килобайт:

Изображение

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

Изображение

Может быть порог размера класса выше 111 килобайт. Добавим фиктивных процедур и дотянем размер Loading-класса до 118 килобайт и даже выше:

Изображение

122 килобайта и... снова все рисуется. Значит нет никакого "предельного" размера class-файла (по крайней мере при текущем размере проблемного класса MainForm в 118 килобайт) и это не поддельное OutOfMemory, а настоящее. Память явы переполняется при подгрузке и инициализации MainForm.

Добавим в отрисовку помимо черного экрана еще и доступное количество памяти и общее количество памяти в байтах:
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,200,0);
g.drawString(String.valueOf(Runtime.getRuntime().freeMemory()),5,5,Graphics.LEFT|Graphics.TOP);
g.drawString(String.valueOf(Runtime.getRuntime().totalMemory()),5,25,Graphics.LEFT|Graphics.TOP);
При чистом Loading-модуле без запросов к MainForm и другим классам:

Изображение

В этих же условиях, но после обфускации:

Изображение

Этот же JAR, собранный в APK и запущенный под андроидом 2.3.3 на эмуляторе - запустим дважды, цифры могут отличаться, т.к. в яве постоянно garbage collector чистит всякие ненужные вещи в памяти, но примерно количество свободной памяти должно быть одинаково в обоих запусках:

Изображение

Изображение

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

Изображение

Изображение

Всего на 12 килобайт стало меньше. И это сваливает сименс в OutOfMemory... (проверил на всякий случай на этой же версии JAR - да, все еще сваливает +) Очень странно.

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

Допустим, андроид неправильно все делает и при подключении большого класса MainForm толком не выделяет память (неизвестно как сделана ява андроида). Проверим тогда и на обычных J2ME-телефонах.

Nokia N90:

Просто Loading, без связи с большим MainForm - нокия говорит, что у нее всего 1 мегабайт памяти, и свободной всего около 70-100 килобайт (иногда даже 4 килобайта показывает), как будто она все классы паинткада сразу загрузила несмотря на то, есть ли с ними связи или нет:

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

Теперь Loading, дергающий переменную MainForm - у нокии открылось второе дыхание и теперь всего памяти не 1 миллион байт, а 2,5 миллиона, чудеса. И свободной опять около 100 килобайт. Как будто после связи с MainForm (и связью самого класса MainForm со всеми остальными связанными классами) вместо занимаемых 900 килобайт теперь нужно 2300 килобайт - если действительно это так, то здесь сименс и помирает на OutOfMemory со своими доступными 1500 килобайтами, 2300 в него не влезают:

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

Надоело болтающееся число свободных байт. Добавим в код вызов garbage collector через System.gc() - после его вызова лишнее и ненужное в памяти насильно будет удалено, может, число свободных байт станет более стабильным:
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(0,200,0);
System.gc();
g.drawString(String.valueOf(Runtime.getRuntime().freeMemory()),5,5,Graphics.LEFT|Graphics.TOP);
g.drawString(String.valueOf(Runtime.getRuntime().totalMemory()),5,25,Graphics.LEFT|Graphics.TOP);
Проверим поедание памяти при подгрузке MainForm еще на одной яве. Это телефон LG GT540. Вообще это изначально был Android 1.6, потом выходили обновления и он стал Android 2.1. Но в нем есть эмулятор Java от LG. Этот эмулятор прикидывается LG-телефоном на яве и может устанавливать и запускать J2ME-мидлеты в андроиде. Мидлеты появляются в списке программ прямо в том же списке что и андроид-приложения, и их можно даже вытащить на рабочий стол:

Изображение

Изображение

Проверка Loading без связи с MainForm - говорит что паинткад занял около 3 мегабайт (3000 килобайт), а всего доступно аж 20 мегабайт, поэтому 17 мегабайт свободны. Остановка мидлета и повторный запуск - бесконечно показывает одно и то же число свободной памяти:

Изображение

Проверка Loading со связь с MainForm. (на этом телефоне если его повернуть горизонтально-вертикально, то эмулятор перерисовывается и прекращает пытаться натянуть мидлет на экран. Шрифты становятся красивые, точка в точку, без масштабирования кривобокого). С подключенным классом MainForm числа заменялись от запуска к запуску, но совсем не сильно:

Изображение

Изображение

Разница с MainForm и без MainForm - около 10 килобайт. Но тут сразу заняты 3 мегабайта, поэтому, вероятно, он сразу подгрузил все классы, поэтому разницы и нет.

В общем:
- есть явы (Nokia N90), где подключение MainForm подгружает его и увеличивает лимит оперативной памяти чтобы все влезло. И становится нужно паинткаду 2,5 мегабайта памяти.
- есть явы (ява-эмулятор LG GT540, и просто запуск под Android APK), где подключение MainForm никак не влияет, вероятно, там память сразу выделяется на все классы и все их связи и переменные.

Есть еще эмуляторы Siemens в составе Benq-Siemens Mobility Toolkit - мощные эмуляторы для телефонов с большими (по меркам сименсов) экранами типа 240х320 пикселей. И там есть эмулятор слайдера Siemens SL75 - это телефон с экраном 132х176 пикселей как более старые сименсы. У них много оперативной памяти в яве.

Проверка Loading без связи с MainForm в эмуляторе Siemens SL75:

Изображение

Занято сразу под 2 мегабайта, зато всего 3,7 мегабайта. Может быть здесь влезет в такую большую память Loading с MainForm.

От запуску к запуску количество свободной памяти здорово меняется - от 800 килобайт до 2,5 мегабайт)

Изображение

Изображение

Изображение

Изображение

Изображение

Проверка Loading со связью с MainForm в эмуляторе Siemens SL75 - он не выдает OutOfMemory:

Изображение

Изображение

Изображение

Изображение

Изображение

Стабильно остается по 800-850 килобайт. Значит паинткаду нужно 3670-850 = 2,8 мегабайта после подключения MainForm.

Посчитаем разницу памяти до подгрузки MainForm и после подгрузки MainForm на всех вышеописанных устройствах и эмуляторах. Ориентироваться будем на самую большую свободную память (меньшие числа - это просто не доработал garbage collector):

Android-эмулятор 2.3.3
До: 5644 - 2845 = 2799 Кб
После: 5644 - 2833 = 2811 Кб
Разница: 12 Кб

Nokia N90
До: 1000 - 114 = 886 Кб
После: 2441 - 151 = 2290 Кб
Разница: 1404 Кб

Эмулятор явы в LG GT540
До: 20971 - 17937 = 3034 Кб
После: 20971 - 17932 = 3039 Кб
Разница: 5 Кб

Siemens SL75 эмулятор
До: 3670 - 2465 = 1205 Кб
После: 3670 - 852 = 2818 Кб
Разница: 1613 Кб

Выводы:
1) на тех телефонах, где подключение MainForm сильно увеличивало занятую память (Nokia N90, Siemens SL75) - это подключение потребовало 1400-1600 килобайт памяти;
2) после подключения MainForm занимаемая паинткадом память стала равна:
- 2,3 Мбайт на Nokia N90,
- 2,8 Мбайт на Android и на Siemens SL75
- 3 Мбайт на эмуляторе явы в LG GT540

Поэтому текущие "системные требования" паинткада: минимум 2,5 - 3 мегабайта памяти в яве только для загрузки классов. Вот такие дела

Кроме того, при загрузке паинткада выделяется память под различные буферы, загружаются в память и масштабируются значки и графика. Это требует дополнительной памяти.

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

Android-эмулятор 2.3.3

Изображение

Изображение

Изображение

Изображение

Изображение

Изображение

6365 - 3344 = 3021 Кб

Nokia N90

Изображение

Изображение

Изображение

Изображение

Изображение

3051 - 1441 = 1610 Кб

Сначала она модулю Loading давала всего 1000 Кб памяти, потом давала для Loading+MainForm всего 2441 Кб, а сейчас - уже для полного паинткада всего 3051 Кб =) Как она это делает? Динамически растит явовскую память до больших значений +) Это телефон 2005 года, тогда еще были в ходу сименсы с экраном 101х80 точек и 4096-цветным экраном или 132х176. А эта с гигантским экраном и очень большой памятью по сравнению с ними.

Эмулятор явы в LG GT540

Изображение

Изображение

20971 - 17158 = 3813 Кб

Siemens SL75 эмулятор

Раньше паинткад и тут выдавал OutOfMemory. Но сейчас, почему-то работает) Интересно, тогда, посмотреть как тут выглядит настройка клавиш - она тут даже работает и текст влезает во все элементы на экране:

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

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

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

Изображение

Что касается оперативной памяти:

Изображение

Изображение

Изображение

3670 - 848 = 2822 Кб

Теперь можно высчитать сколько занимают буферы и ресурсы в памяти во всех этих устройствах:

Android-эмулятор 2.3.3
Loading: 2799 Кб
Loading+MainForm: 2811 Кб
Полностью PaintCAD: 3021 Кб
Чисто ресурсы: 3021 - 2811 = 210 Кб

Nokia N90
Loading: 886 Кб
Loading+MainForm: 2290 Кб
Полностью PaintCAD: 1610 Кб
Чисто ресурсы: 1610 - 2290 = минус 680 Кб (во бред)

Эмулятор явы в LG GT540
Loading: 3034 Кб
Loading+MainForm: 3039 Кб
Полностью PaintCAD: 3813 Кб
Чисто ресурсы: 3813 - 3039 = 774 Кб

Siemens SL75 эмулятор
Loading: 1205 Кб
Loading+MainForm: 2818 Кб
Полностью PaintCAD: 2822 Кб
Чисто ресурсы: 4 Кб

Ничего не понятно) Почему-то после прохождения полного цикла загрузки по MainForm, создания разных буферов и загрузки картинок в память:
- где-то памяти надо больше на 774 Кб (это нормально),
- где-то на 210 Кб (ну это андроид, он может чудить, ведь это портировщик с явы, что он там показывает хз),
- где-то минус 680 килобайт (Нокия N90 после загрузки ресурсов и создания буферов потребовала меньше памяти),
- где-то около нуля (эмулятор Сименса SL75 тоже, допустим, может чудить, хотя странно)

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

В общем, требуемая для сегодняшней версии память чтоб при запущенном паинткаде рисовать картинку 32х32 пикселя:

Android-эмулятор 2.3.3: 3021 Кб
Nokia N90: 1610 Кб
Эмулятор явы в LG GT540: 3813 Кб
Siemens SL75 эмулятор: 2822 Кб

И требуемая максимальная память (максимальное значение необходимой памяти из двух значений - до загрузки ресурсов и после загрузки ресурсов):

Android-эмулятор 2.3.3: 3021 Кб
Nokia N90: 2290 Кб
Эмулятор явы в LG GT540: 3813 Кб
Siemens SL75 эмулятор: 2822 Кб

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

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

Сообщение blackstrip » Сб окт 18, 2025 10:17 pm

Итак, окно JoySetup доделано до окна, позволяющего назначить любые физические клавиши кнопочного J2ME/Android-телефона на стандартную телефонную клавиатуру. Проверим, все ли влезает в экран на всех моделях и ровно рисуется.

И раз уж эмулятор Benq-Siemens Mobility Toolkit запускает паинткад - будем тестировать его кроме того что на 8 реальных устройствах, еще и на двух тестовых виртуальных телефонах: слайдере Siemens SL75 и слайдере Benq-Siemens EL71 чтобы посмотреть как паинткад вмещается в еще пару мобильных яв мелкого разрешения с нестандартными шрифтами.

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

Проверка окна JoySetup на тестовых телефонах в четырех режимах - клавиатура, меню, автоопределение телефона, совет как стереть код

1 - Android 2.3.3 - Samsung Galaxy Ace

Не кнопочный, пропускаем

2 - Android 4.2 - RugGear RG310

Изображение

Изображение

Изображение

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

Изображение

Изображение

Изображение

4 - Android 9 - Soyes XS13

Не кнопочный, пропускаем

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

Изображение

Изображение

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Не кнопочный, пропускаем

7 - Java 2 Microedition - Nokia N90

Изображение

Изображение

Изображение

Изображение

8 - Java 2 Microedition - Nokia 7900 Prism

Изображение

Изображение

Изображение

Изображение

9 - Java 2 Microedition - Siemens SL75 (эмулятор)

Изображение

Изображение

Изображение

Изображение

10 - Java 2 Microedition - Benq-Siemens EL71 (эмулятор)

Изображение

Изображение

Изображение

Изображение

На всех кнопочных телефонах окно JoySetup нарисовалось нормально

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

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

Сообщение blackstrip » Вс окт 19, 2025 3:58 pm

Дальше идет модуль Lg - это модуль с русскими и английскими текстами для отрисовки интерфейса, у него вообще нет окошка, только функции, выдающие по номеру строку на русском или на английском языке.

Потом идет модуль LightSwitcher - модуль для телефонов сименс, использует класс com.siemens.mp.game.Light для включения/выключения подсветки по Light.setLightOn() / Light.setLightOff() чтобы она не гасла во время использования паинткада. У него тоже нет окошка.

Следующий графический модуль - Loading:

Изображение

Ревизия окна Loading

Это первое окошко, появляющееся после запуска паинткада.

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

Если нажали на экран или кратко нажали (менее 1 секунды удерживали и отпустили) физическую кнопку - то появляется стартовое окно выбора языка. Оно проверяет есть ли в телефоне файловая система Siemens или файловая система JSR-75. Если нет ни той, ни другой - то ругается и предлагает выйти из паинткада. А если хоть одна есть - то выбирает ее как используемую и предлагает выбрать язык Русский или English.

В последней beta-версии оно было таким:

Изображение

Изображение

Когда добавляли для JoySetup надпись для зажимания клавиши чтобы перейти в настройки клавиш - там же и отмасштабировали эмблему в кратное количество раз пропорционально размера экрана. Ну и шрифты теперь обрисовываются 8-микратной обрисовкой (вверх, вниз, влево, вправо и по 4 диагоналям). Так что первый режим - уже и так нормально рисуется теперь:

Изображение

А второй режим - обычное окошко. После масштабирования отрисовки окон и софтклавиш по всему паинткаду - и оно теперь тоже масштабировалось само. Тексты после оттаскивания от краев экрана на нужное количество виртуальных пикселей вместо реальных - встали в нужные места. Значок с баллончиком теперь тоже масштабируется.

По внешнему виду уже тоже правилось окно до этого, цвета рыжие убраны. E-mail убран, добавлена ссылка на сайт blackstrip.ru. Под андроидом она сделана кликабельной и при нажатии на нее пальцем - открывается сайт в браузере.

Изображение

Полоски под словом PaintCAD тоже оттащим от экрана на два виртуальных пикселя вместо реальных. Год в дате релиза заменим на 2025, хотя столько модулей еще масштабировать, может там и 2026 потом будет.

Изображение

В заголовке тень слишком сильно сдвинута. Здесь вручную рисуется тень и сдвинута все еще на виртуальный пиксель вправо и вниз. Сдвинем ее, как во всем интерфейсе, на вирт.пиксель/1.414 вправо и вниз, чтобы она по диагонали была сдвинута ровно на виртуальный пиксель:

Изображение

Проверим что будет если файловая система не найдена - тогда окно, как положено, пишет что ее нет и софт-кнопки выбора языка превращаются в Exit и Выход:

Изображение

Окно готово. Проверим его на 10 телефонах и эмуляторах:

Проверка окна Loading на тестовых телефонах

1 - Android 2.3.3 - Samsung Galaxy Ace

Изображение

Изображение

2 - Android 4.2 - RugGear RG310

Изображение

Изображение

3 - Android (Mocor) 4.4.4 - Joy's S15

Изображение

Изображение

4 - Android 9 - Soyes XS13

Изображение

Изображение

5 - Android 12 - Xiaomi Duoqin F22 Pro

Изображение

Изображение

6 - Android 15 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

Изображение

7 - Java 2 Microedition - Nokia N90

Изображение

Изображение

8 - Java 2 Microedition - Nokia 7900 Prism

Изображение

Изображение

9 - Java 2 Microedition - Siemens SL75 (эмулятор)

Изображение

Изображение

10 - Java 2 Microedition - Benq-Siemens EL71 (эмулятор)

Изображение

Изображение

Все на всех телефонах ок

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

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

Сообщение blackstrip » Пн окт 20, 2025 8:07 pm

Следующий модуль с окошком - пара классов MainForm+MainForm2:

Изображение

Ревизия окна MainForm

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

Виды окошек и частей окошек, которые оно рисует:
1) по ДжойВправо открывает меню команд, в котором команда "Широкий экран" (или по нажатию Звездочки и в открывшемся меню эффектов еще раз нажатию Звездочки) меняет три вида раскладки экрана: обычный, сокращенный и полноэкранный (картинка на черном фоне).

В последней бета-версии они выглядели так (тестим на новой пустой картинке 32х32 пикселя) - посмотрим как они натягивались на андроид и как выглядели на среднем сименсе (чтоб увидеть как задумывалась отрисовка изначально):

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

Изображение

Изображение

Сокращенный - в заголовке текущие координаты курсора и текущий масштаб, справа вверху текущие передний и задний цвета (пц/зц):

Изображение

Изображение

Полноэкранный - только картинка на черном фоне и курсор поверх нее:

Изображение

Изображение

2) В 8-битном режиме рисования новая картинка бывает трех видов - 256-цветный BMP, 2-цветный BMP, 2-цветный BMX.

Изображение

BMX это сименсовская черно-белая 4-кадровая BMP-анимация, в которой 4 кадра рисуются друг под другом в единую BMP-картинку. Сименс, видя BMX, режет его на 4 части по вертикали и показывает их по очереди. Сименсы могли даже вставить такую BMX в смску и так можно было переслать нарисованную анимацию кому-то.

В 2-цветном BMP режиме наверху справа рисуется чернобелый значок вместо разноцветного спектра:

Изображение

Изображение

В 2-цветном BMX режиме наверху справа рисуется фотопленка (а ля анимация), а справа пишется в каком из 4 кадров по вертикали находится курсор. А еще по краям рисунка появляются метки - по 4 слева и справа, показывают последний пиксель каждого из 4 кадров по вертикали. А еще какие-то средние по горизонтали, видимо, показывают где начинается вторая половина рисунка по горизонтали (мб это для центровки на глаз при рисовании пикселей, уже не помню):

Изображение

Изображение

Обычная BMX-анимация, влезающая в одну смску, была BMP-картинкой 16х64 пикселя (4 кадра по 16х16 пикселей). Но первые сименсы, на которых паинткад рисовал эти анимации, были с экраном 101х80 точек. Часть от 80 точек съедалась заголовком окна, часть снизу строкой "координаты/цвета/инструмент/тип линий" и 16х64 не влезала без прокрутки на экран. А 32х32 влезала. Поэтому в паинткаде появилось рисование BMX-анимации в виде картинки 32х32 с последующим экспортом в 16х64 (правая половина рисунка 32х32 пикселя сносилась вниз под левую часть, и 32х32 превращался в 16х64).

Поэтому если создать 32х32 пикселя картинку в ч/б режиме, то ДжойВлево работает не как обмен ПЦ/ЗЦ (там всего два цвета - черный и белый, их менять смысла нет, т.к. левый софт вместо палитры просто переключает черный и белый цвета), в как меню работы с черно-белыми картинками размером 16х64.

Изображение

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

Изображение

Изображение

3) В меню команд по ДжойВправо есть пункт "Блокировка"

Изображение

Если его выбрать, то экран и клавиатура блокируется и ждет долгого удерживания решетки для разблокировки (если нужно телефон спратать в карман не боясь нажать на нем что-то):

Изображение

Изображение

4) Еще в MainForm есть режим "Полоса прогресса" - показывает окошко и в нем бежит полоска. Используется, например, при вставке рисунка из буфера на рисунок. НО он так написан, что из метода отрисовки пытается вызвать другую отрисовку, спотыкается (еще старая отрисовка не кончилась, новая не начинается при этом) и в андроиде просто ничего не показывается. Часть этих использований полосы прогресса уехали еще давно в модуль Rend с разными методами обработки картинок. Но те кто остались - ничего вообще не показывают. Видимо раньше какой-то сименс позволял вызывать перерисовку из перерисовки и окно рисовалось) В андроиде это явно не прокатывает. Надо в ходе ревизии MainForm укатить все эти обработки в Rend окончательно, тогда они станут показывать полосу прогресса, а не черный экран, ну и плюс к тому MainForm станет легче по размеру.

Масштабируем MainForm

Часть масштабирований уже была проделана. Но до конца еще далеко. В самой последней версии окно MainForm выглядит так:

Изображение

Изображение

Масштабируем "обычный" режим раскладки экрана

1) окно сделано полностью на весь экран, нет больше выпуклых краев, только серая панель

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

3) левый верхний угол области рисования рисуется:

- по горизонтали по координате x=4 (2 пикселя на бывший выпусклый край, 1 пиксель на зазор, 1 пиксель на фиолетовую рамку вокруг картинки). Новый x должен быть равен 2 виртуальным пикселям (1 виртуальный пиксель на зазор, 1 виртуальный пиксель на толстую фиолетовую рамку вокруг рисунка)

- по вертикали по координате y=высота текста+5. Из 5 пикселей 2 на бывшую выпуклость сверху заголовка окна, 2 на зазор снизу окна, 1 на фиолетовую рамку, А высота текста - ровно заголовок. После убирания выпуклостей и натягивания окна на весь экран 2+2=4 пикселя столпились под заголовком, потом 1 пиксель - фиолетовая рамка, потом начинается рисунок. Новый y сделаем равный высоте текста+2 виртуальных пикселя - 1 на зазор, 1 на фиолетовую рамку.

4) длина области рисования рисуется при большой картинке (когда скроллы появляются):

- по горизонтали равная по максимуму такому количеству пикселей рисуемой картинки: (ширина экрана - 8)/масштаб. Масштаб ДжойВправо-Лупа который. Чтобы отцентрировать ее на экране - раз 4 пикселя слева, то и 4 пикселя справа в лучшем случае (или больше).

Новая длина по горизонтали будет такая: (ширина экрана - 6 виртуальных пикселей)/масштаб, где 6 виртуальных это:
- зазор 1 виртуальный пиксель + рамка слева от области рисования 1 виртуальный пиксель
- и справа от области рисования рамка 1 виртуальный пиксель + скроллбар 2 виртуальных пикселя + зазор 1 виртуальный пиксель

- по вертикали равная по максимуму такому количеству пикселей рисуемой картинки: (высота экрана - высота текста - 12 - максимум из высоты текста и значка инструмента)/масштаб. Сверху над областью рисования оставалась высота текста+5 пикселей, значит внизу 7 пикселей+максимум из высоты текста и значка инструмента.

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

5) элементы в нижней части окна при обычном режиме растащим на 1 виртуальный пиксель. С правой в левую сторону:
- справа 1 виртуальный пиксель зазор
- потом 3 виртуальных пикселя - тип линий (полоска типа линий 1 виртуальный пиксель в окантовке шириной 1+1=2 виртуальных пикселя)
- потом 1 виртуальный пиксель зазор
- потом icw обычных пикселей значок инструмента (пунктир зеленый/красный, обозначающий нахождение курсора в выделенной области рисуется прямо поверх значка, наружу не торчит, сделаем его линию толщиной 1 виртуальный пиксель), кратный 16 пикселям, т.к. масштабируется
- потом 1 виртуальный пиксель зазор
- потом icw обычных пикселей прямоугольники ПЦ/ЗЦ цветов (окантовка рисуется внутри прямоугольников, наружу не торчит, линия окантовки толщиной 1 виртуальный пиксель)
- потом 1 виртуальный пиксель зазор
- потом еще 1 виртуальный пиксель - зазор под тень шрифта координат, которые будут печататься левее
- потом оставшаяся часть окна - по правому краю текущие координаты курсора, по левому краю размер рисунка (выводится если позволяет размер окна)
- потом 1 виртуальный пиксель - последний зазор между левым краем экрана и размером рисунка

6) значок режима в коричневой окантовке на фоне синего заголовка перерисуем. Уберем окантовку.

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

Изображение

Изображение

Т.к. на этом большом экране устанавливается масштаб x9, равный виртуальному пикселю, то поле рисования чуть сжимается, чтобы уместить целое количество пикселей рисунка размером 9х9 пикселей экрана. На масштабе х1 оно не сжимается и точно показывает установленные зазоры - везде 1 виртуальный пиксель:

Изображение

Также масштабируем под размер виртуального пикселя:

- крест на кисти, показывающий что она отключена:

Изображение

- квадрат вокруг значка инструмента, показывающий где сейчас курсор - в выделении или вне его (если что-то выделено):

Изображение

- индикатор текущего "типа линий" - сплошная или пунктир:

Изображение

Значок черно-белого режима:

Изображение

Значок режима BMX-анимации:

Изображение

Масштабируем "сокращенный" режим раскладки экрана

Посмотрим на него еще раз из прошлой беты 1:

Изображение

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

По горизонтали сделаем при максимальном размере рисунка:
- 1 виртуальный пиксель зазор;
- 1 виртуальный пиксель окантовка;
- рисунок;
- 1 виртуальный пиксель окантовка;
- 2 виртуальных пикселя скроллбар;
- 1 виртуальный пиксель зазор

По вертикали сделаем при максимальном размере рисунка:
- сверху заголовок окна;
- 1 виртуальный пиксель зазор;
- 1 виртуальный пиксель окантовка рисунка;
- рисунок;
- 1 виртуальный пиксель окантовка рисунка;
- 2 виртуальных пикселя скроллбар;
- 1 виртуальный пиксель зазор

Заголовок поправим:
Два цвета ПЦ и ЗЦ в длину - слишком жирно. Если экран узкий, то могут не влезть значок, текст "9999; 9999 xN". А еще и непонятно - почему в обычной раскладке клавиатуры цвета ПЦ/ЗЦ друг над другом, а в сокращенном - слева направо, мозг сломается где какой цвет. Поставим цвета друг над другом как в обычном режиме снизу такие же были. С окантовкой 1 виртуальный пиксель, с перемычкой между ними 1 виртуальный пиксель при нечетном количестве пикселей по высоте в заголовке или 2 виртуальных пикселя при четном количестве.

Получаем:

Изображение

Изображение

Заодно, как в обычной раскладке, проверим на масштабе х1 что зазоры равны 1 виртуальному пикселю:

Изображение

Масштабируем "полноэкранный" режим раскладки экрана

Вот он какой был:

Изображение

На черном фоне рисуется изображение и окантовка. И больше ничего. Остается только увеличить окантовку до 1 виртуального пикселя.

Получаем:

Изображение

Изображение

Масштабируем отрисовку дополнительных элементов в 8-битном режиме при создании BMX-анимации

Вот что было:

Изображение

Надпись "Кадр: N" висит прямо посреди экрана. Если сделать большую картинку, то надпись на сером фоне ложится поверх картинки. Уберем надпись вниз. В режиме BMX-анимации будем отображать номер кадра вместо размера рисунка в левом нижнем углу экрана. И если размер рисунка может быть длинный по количеству символов (типа "9999х9999") - поэтому он скрывается если экран узкий (как на скриншоте выше), то надпись "Кадр: 4" всегда короткая, ее скрывать не будем.

После анализа исходников 20-летней давности стало ясно что это за метки:
- метки по вертикали находятся в конце каждого кадра (на последней строке пикселей). Предназначены для визуального разделения рисунка BMX-анимации на 4 кадра. Надо их сделать вписанными в окантовку толщиной 1 виртуальный пиксель. При этом второй их размер (высота) должна быть равна текущему масштабу. Алгоритм отрисовки был какой-то кривой, пришлось его подправить. И поставим метки посередине между пикселями. Последние метки удалим (в самом низу), и так понятно где кончается последний кадр) И нарисуем полупрозрачные линии (цветами, отличными от обычных меток и выделения - рыжим 255,128,0 и сине-голубым 0,128,255)

- метки по горизонтали показываются только при размере рисунка 32х32 и показывают где начинается вторая половина рисунка по горизонтали. Сделаем их по аналогии с вертикальными метками - пусть стоят посередине между половинами рисунка и показывают где кончилась первая половина рисунка (также как вертикальные показывают где кончился кадр) и началась вторая. Полупрозрачные вертикальные линии рисовать не будем, они будут показывать в режиме "Разбить" ниже, когда пользователь явно намерен рисовать 4 кадра на рисунке 32х32. Деление рисунка пополам было нужно для ориентировании при рисовании 4 кадров 16х16 пикселей в одном рисунке 32х32 пикселя в порядке:
1 3
2 4

И по кнопке ДжойВлево можно командой "Экспорт" экспортировать такой рисунок 32х32 в 16х64 BMX-анимацию (на самом деле BMX это обычный черно-белый BMP-файл). Эта команда превращает рисунок в такой:
1
2
3
4

отрывая правую половину рисунка и подкладывая ее вниз. В общем, это все было из-за мелких экранов 101х80 первых сименсов, на которых 16х64 было нельзя рисовать без прокрутки рисунка по экрану (а прокрутка - это отсутствие обзора всех 4 нарисованных кадров одновременно, что было неудобно).

Есть и обратная функция - в 8-битном режиме можно открыть BM 16/64 - и он будет загружен как
1
2
3
4

Потом сложится в
1 3
2 4

И появится в главном окне как рисунок 32х32 пикселя (чтоб его дорисовать и снова экспортировать в 16x64 через меню по ДжойВлево).

В общем, после масштабирования меток, добавления полупрозрачных линий-границ между кадрами и перемещения надписи "Кадр: N" вниз получаем:

При рисунке 32х32 с отображением горизонтальных и вертикальных меток и горизонтальных полупрозрачных линий - метки между кадрами при масштабе x1 невозможно нарисовать между пикселями (на полпикселя сдвинуть), поэтому они съезжают в начало кадра. Но если масштаб выбрать побольше (например, x2) - то они уже центрируются между пикселями:

Изображение

Изображение

Изображение

При рисунке другого размера, например, 16х64 с отображением только вертикальных меток на краях рисунка и полупрозрачных линий на рисунке:

Изображение

Изображение

Изображение

Масштабируем отрисовку разбитого на 4 части рисунка 32х32 пикселя в 8-битном режиме при создании BMX-анимации

При рисовании BMX-анимации и при размере рисунка 32х32 пикселя жмем ДжойВлево и выбираем "Разбить" - рисунок превращается в 4 мини-рисунка, каждый из которых - отдельный кадр анимации. Выглядело это раньше так:

Изображение

Надпись "Кадр: N" уже сдвинули в левый нижний угол окна.

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

Просмотр кода показал что этот режим вообще не умеет прокручивать картинку влево-вверх при больших масштабах. Да и рисует он ее без ограничений по области просмотра. Как будто был предназначен для мелких экранов и мелких масштабов и не исправлялся на большие масштабы. Типа включаешь x1 масштаб и на экранчике 101х80 точек рисуешь в нем без всяких прокруток. А на большом масштабе он вылезает и сквозь полосы прокрутки и сквозь нижнюю панель со значками:

Изображение

Не будем рисовать 4 отдельных части рисунка. Его цель была показать где кончается одна часть и начинается другая. Уберем это разбиение и вместо этого просто разделим кадры ровно посередине полупрозрачными горизонтальной и вертикальной линиями-метками как в предыдущем режиме. Получаем на большом экране, на мелком в масштабе х1 (линии и метки съезжают в начало кадров), на мелком в масштабе х2 (метки ровно по центру между кадрами):

Изображение

Изображение

Изображение

Проблема открытия чернобелых BMP/BMX-файлов на Android

Откроем один из сименсовских BMX-файлов на сименсе:

Изображение

Он корректно загружается в паинткад:

Изображение

Хотел потестить на андроиде подобное. Теперь откроем этот же файл под Android (предпросмотр работает прекрасно, т.к. при этом картинка открывается средствами телефона, а не паинткадовскими методами):

Изображение

А вот при загрузке этого файла в паинткад - открывается пустой рисунок, но не выдает ошибок:

Изображение

Открытие других стандартных сименсовских рисунков выдает даже мусор, сдвинутый растр и т.д. Видимо, есть проблема в алгоритме открытия BMP файлов (в его черно-белой части), причем проблема проявляется только на андроиде.

Нарисуем мозаикой в шахматном порядке кучу пикселей на рисунке 32х32:

Изображение

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

Изображение

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

Нарисуем картинку поосмысленнее чтобы понять какая часть загрузилась:

Изображение

Сохраняем и открываем ее:

Изображение

Снизу то, что должно быть сверху. Сначала слева-внизу первые 16 пикселей - вообще лишние, но потом буквы a и b, их там вообще быть не должно)

После проверки оказалось что функция seek перехода на определенный байт в файле при чтении, используемая всего в паре мест в программе, неправильно работала. В итоге чтение перескакивало дважды заголовок BMP-файла и читало растр из середины. На сименсе такой проблемы не было потому что там паинткад использует SiemensFS, у нее seek это просто вызов seek из внутреннего сименсовского ява-класса.

Теперь seek-и в JSR-75 поправлены, часть лишних вызовов вообще удалена, и файл зачитался правильно:

Изображение

Масштабируем сетку

Сетка при ее включении в подменю "Настройки" главного меню - до сих пор рисуется черно-белыми пунктирными линиями толщиной 1 физический пиксель:

Изображение

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

Смотрим что получается. Теперь на чернобелом градиенте видно что в черной части видны белые пунктирные линии, а в белой части видны черные пунктирные линии. Здесь при масштабе x9 толщина линий сетки равна 9/4=2, значит рисуется одна черная и одна белая пунктирные линии, сквозь которые видно рисунок:

Изображение

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

Изображение

На чернобелом градиенте даже при цвете картинки 127,127,127 (среднее между черным и белым) сетка цепляется за глаз и ее более-менее можно увидеть:

Изображение

Масштабируем экран блокировки

Должно быть примерно так (и то не так - год-то срезается в правом верхнем углу):

Изображение

Поделим дату+время пополам и отобразим в две строки. Серый фон можно как-нибудь закрасить, например, шахматными клетками. Цвета клеток плавно менять в зависимости от текущего времени каждую секунду (при перерисовке экрана блокировки). И клетки пусть движутся в такт изменению времени. Сделаем их 60 виртуальных пикселей в ширину и будем двигать каждую секунду на 1 виртуальный пиксель по диагонали, тогда через минуту (60 секунд) они встанут в ту же позицию что и были при нуле секунд и все начнется сначала.

Цвет текста (особенно, алую "Блокировку") можно поменять тоже на цвета, зависящие от текущего времени. Чтобы текст был всегда виден на фоне шахматных клеток - нарисуем текст цветом, обратным цвету клеток 255-r, 255-g, 255-b.

И сгруппируем и переставим строки чтобы они не размазывались по всему экрану.

Получаем слегка анимированную заставку для блокировки вместо статичного переключения времени)

Изображение

На эмуляторе Siemens время не учитывает временную зону GMT+3, поэтому там время на три часа раньше. Т.к. размер квадратов завязан на виртуальные пиксели, то на любом экране любого телефона будет где-то 9-12 таких клеток на экране (в раскладке 3х3 для примерно квадратных экранов или 3х4 для вытянутых), что не должно быть сильно напряжней одной клетки на весь экран (закраска фона серым) в старой версии экрана "Блокировки". Секунды отвечают за синий, минуты за зеленый, а часы за красный, поэтому в течение часа будут и сине-зеленые клетки, и красные (когда секунды и минуты ближе к нулевой отметке):

Изображение

Изображение

Изображение

Масштабируем экран с прогрессом

В окне MainForm оставались три функции - Вставить, Сдвиг и Обратить, которые должны показывать прогресс (все остальные давно уехали в модули Rend, Gate и там показывали свой прогресс применения эффектов, открытия файлов и т.п.). Но они вызывались в процессе отрисовки MainForm, когда из какого-нибудь окна настроек эффекта шел возврат в MainForm, то в начале первой отрисовки paint проверялось зачем мы пришли в MainForm, и если причина - вызов чего-нибудь, то тут же улетали из MainForm на вызов этого чего-нибудь. И, например, при вставке - вызывалась процедура вставки, которая хотела рисовать прогресс вставки на экране и пыталась это делать вызовом перерисовки.

В Siemens с MIDP1 отображение прогресса работало - в процессе отрисовки можно было вызвать другую отрисовку - и оно слушалось, само вызывало новую процедуру paint изнутри недорисованной недовыполненной предыдущей. В Siemens с MIDP2 это уже не работало, все процедуры были вынесены в отдельные рисуемые классы (чтоб облегчить MainForm, а заодно чтоб прогресс рисовался).

И вот теперь для этих трех функций вместо вызова изнутри - просто поставим бесконечно тикающий таймер на 100 мс и флажок окончания отрисовки в конце paint. Таймер будет проверять - и если отрисовка окончена и флажок стоит, то отменять себя и вызывать процедуру вставки или обращения цветов, которая уже будет свободно вызывать новые отрисовки и рисовать окно с прогрессом вставки/обращения цветов.

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

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

Получилось так:

Изображение

Изображение

Раз так хорошо получилось - скопируем этот интерфейс с прогрессом и в ранее масштабированный модуль Gate. Пусть тоже показывает таймер при открытии/сохранении файлов:

Изображение

Отлов багов и добавление улучшений

В процессе тестирования функций открывания черно-белых BMP/BMX файлов поправлено/добавлено следующее:

1) При открытии чернобелого BMP/BMX рисунка как 16x64 с превращением в 32x32 пикселя использовался вспомогательный массив, который не стирался. И при повторном открытии этим же методом все рисунки накладывались в этом буфере друг на друга. А в случае если очередной рисунок имеет в палитре не белый и черный цвета, а наоборот - черный и белый, то буфер еще и инвертировался, получался предыдущий инвертированный рисунок с новым неинвертированным, наложенные друг на друга. Теперь это все исправлено)

2) При открытии черно-белых BMP/BMX файлов устанавливался тип рисунка "2-цветный ч/б BMP". Теперь если открываем BMX - ставится тип "2-цветный ч/б BMX", рисунок сразу делится на кадры и сразу можно рисовать, видя границы кадров как 4 штуки друг под другом.

3) При открытии чернобелого BMP/BMX рисунка как 16x64 с превращением в 32x32 пикселя автоматически включается режим "Разбить" чтобы (в сумме с предыдущим исправлением под цифрой 2) сразу рисовать BMX-анимации, видя границы кадров как крестовину посреди рисунка, а не 4 кадра друг под другом как в обычном BMX рисунке.

4) При открытии/сохранении BMP в 8-битном режиме когда-то был добавлен режим, загружающий BMP в буфер и сохраняющий из буфера в файл. Режимы были добавлены оригинально - просто в цикл вставлено сравнение "если OpenCB, то кладем цвет в буфер, а иначе - на рисунок", и оно вызывается для каждого пикселя. Раздублировал цикл на два, один из которых кладет цвет в буфер, а второй кладет цвет на рисунок, и сравнение ""если OpenCB" теперь только одно вместо миллиона. Может быстрей станут открываться/сохраняться BMP-файлы в 8-битном режиме.

Масштабируем экран предпросмотра

Этот экран появляется когда жмем в главном окне кнопку предпросмотра (обычно это кнопка "Положить трубку" на вирт.клавиатуре или "Взять трубку" на физических телефонных клавиатурах).

В последней версии управление в нем было такое:
1) Звездочка - показать прямоугольный массив из 5x5 текущих рисунков чтобы проверить хорошо ли текущий рисунок ложится как текстура и стыкуется сам с собой
2) Левый софт - переключатель "показать буфер" / "показать рисунок"
3) Кнопка "5" или "Джойстик" - переключатель "показать компаратор" / "убрать компаратор"
4) Кнопки навигации джойстика и кнопки "1"-"9" кроме "5" - перемещать показываемую картинку по экрану
5) Нажать пальцем на область с рисунком - спрятать/показать виртуальную клавиатуру (чтоб она не мешала расматривать, например, рисунок размером с экран)
6) Кнопка вызова Предпросмотра или Решетка - выключить предпросмотр

Т.к. в других окошках по звездочке вызывается масштабирование, то на экране предпросмотра перетащим показ 5x5 рисунков на кнопку "0". А по звездочке сделаем масштабирование.

Масштабирование работает в обе стороны - кратно увеличивает или кратно уменьшает размер текущего рисунка, или буфера (если нажали левый софт), или компаратора (если нажали 5 или Джойстик). На увеличение работает так:

1) загружаем, например, сименсовский стандартный самолет 32x32 пикселя

Изображение

Изображение

2) обычный предпросмотр без масштабирования выглядел вот так

Изображение

Изображение

3) жмем звездочку - включается масштабирование, самолет натягивается кратно до максимального на данном экране размера:

Изображение

Изображение

4) если без масштабирования нажать 0 - включится просмотр текстуры размером 5x5 самолетов:

Изображение

Изображение

На сименсе пять штук картинок 32x32 равны 160x160 пикселей и не влезают в экран 132x176

5) а если масштабирование включить - то покажутся 5x5 масштабированных до экрана самолетов (до размеров экрана подтягивается весь массив 5x5):

Изображение

Изображение

На сименсе массив 5x5 превратился из 160x160 в 80x80, сжавшись в 2 раза чтоб влезть в маленький экран, поэтому часть пикселей исчезла и самолеты превратились во что-то другое)

Ответить

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

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