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

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

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

Сообщение blackstrip » Ср июн 25, 2025 9:19 pm

Решение проблем 1 и 2 окна BevelSetup - Черная точка выбора и закраска фона в радиокнопке

Посмотрев исходники - видно, что закраска (включая градиентную из кучи закрашенных кругов) идет ровно по тому же радиусу, что и окантовка радиокнопки =)

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

Изображение

Можно было бы уменьшить окантовку. А лучше наоборот - закраску сделаем шире на один реальный пиксель по горизонтали и вертикали, чтоб она достала до окантовки и перестала оставлять ряд пустых пикселей. На андроидовском шрифте и на PCF-шрифте получается:

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

Поближе выглядит так:

Изображение

Изображение

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

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

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

Поближе выглядит так:

Изображение

Изображение

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

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

2 - RugGear RG310

Изображение

Изображение

3 - Xiaomi Duoqin F22 Pro

Изображение

Изображение

4 - Nokia N90

Изображение

Изображение

5 - Xiaomi Redmi Turbo 3 (Poco F6)

Изображение

Изображение

Теперь точка везде стоит более-менее ровно. И закраска фона закрашивает всю радиокнопку полностью.

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

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

Сообщение blackstrip » Пт июн 27, 2025 1:53 am

Решение проблемы 3 окна BevelSetup - Исправление сдвига шрифта в заголовке окна на Nokia N90

Когда паинткад был портирован под Android - шрифты поплыли. Строчки текста в интерфейсе слишком плотно ложились друг к другу. Пришлось ввести виртуальные отступы сверху и снизу строк.

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

Но Нокии N90 это не подходит. И вообще явовской версии паинткада не подходит.

И вот теперь для паинткада, запущенного не под андроидом, проводится честный расчет высоты шрифта. И вылезание строк вверх прекратилось) И в заголовке окна. И у радиокнопок. Ура!

Было:

Изображение

Стало:

Изображение

(а для Андроида пока оставим отрисовку строк как было, с этим костылем, задирающим строки вверх, а то еще под Андроидом поплывет опять)

Все три проблемы решены. Теперь окошко BevelSetup и в Nokia N90 выглядит хорошо.

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

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

Сообщение blackstrip » Сб июн 28, 2025 2:25 pm

blackstrip писал(а): Пт июн 27, 2025 1:53 am Все три проблемы решены. Теперь окошко BevelSetup и в Nokia N90 выглядит хорошо.
Не все. Есть четвертая проблема - настроив высоту шрифта на j2me стал присматриваться в андроид-версии - ну шрифт андроида хотя бы по большим буквам явно мимо центра радиокнопки идет:

Изображение

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

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

Изображение

Видно что текст справа от радиокнопки сдвинут вниз просто. Т.е. проблема в коде отрисовки радиокнопки с текстом (не надо так низко рисовать текст), а не в каких-то сдвигах по вертикали в функции отрисовки шрифта.

По исходникам стало ясно что размер радиокнопки уменьшен по сравнению со строкой на 2 виртуальных пикселя. Простым уменьшением размера без сдвигов куда-либо. Вот ее центр и съехал вверх (влево-вверх).

Опускаем радиокнопку на 1 виртуальный пиксель вниз. Все выравнивается:

Изображение

Без красных подкладок:

Изображение

Все стало ровно.

А что на Нокии на чистом j2me?

Там шрифт попадает в целом на середину красных подкладок. Кажется, он сдвинулся на 1 пиксель вверх относительно предыдущих снимков:

Изображение

Без красных подкладок:

Изображение

Вот теперь решена и четвертая проблема.

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

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

Сообщение blackstrip » Сб июн 28, 2025 3:45 pm

Пятая проблема окошка BevelSetup - отрисовка самой радиокнопки без масштабирования.

На старых устройствах задумывалось что радиокнопка обрисована кружком. На мелких экранах это кружок толщиной 1 пиксель.

Изображение

На большом экране обрисовка заголовка, линия над подписями к софт-клавишам - все масштабировано. А обрисовка радиокнопок - вообще не видна:

Изображение

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

Получаем с выключенной настройкой "Настройки"-"3D-интерфейс":

Изображение

И с включенной:

Изображение

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

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

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

Сообщение blackstrip » Сб июн 28, 2025 4:05 pm

Финальное сравнение окна BevelSetup: старого из версии 2.7.24 beta 1 ( viewtopic.php?f=4&t=110&p=3452#p3452 ) с получившимся после масштабирования.

1 - Joy's S15

Было:

Изображение

Стало:

Изображение

2 - RugGear RG310

Было:

Изображение

Стало:

Изображение

3 - Xiaomi Duoqin F22 Pro

Было:

Изображение

Стало:

Изображение

4 - Nokia N90

Было:

Изображение

Стало:

Изображение

5 - Xiaomi Redmi Turbo 3 (Poco F6)

Было:

Изображение

Стало:

Изображение

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

Вот как версия 2.4.17 выглядела на Siemens C65, почти такое же как на современном смартфоне выше квадратное окошко:

Изображение

Изображение

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

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

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

Сообщение blackstrip » Вс июн 29, 2025 12:37 pm

Следующее окно по списку - BlurForce:

Изображение

Масштабирование окна BlurForce

Это окно создавалось первоначально для эффекта "Сглаживание". Предназначено для выбора силы сглаживания (поэтому blur force) с помощью слайдера, похожего на полосу прогресса. Потом было использовано для указания настроек во многих других эффектах там, где нужно указать число-параметр в пределах какого-то диапазона или проценты от 0 до 100%.

На Siemens C65 выглядело так:

Изображение

Приводим андроид-версию к чему-то подобному.

В версии 2.7.24 beta 1 ( viewtopic.php?f=4&t=110&p=3452#p3452 ) на самом большом экране из тестовых телефонов окошко выглядело так:

Изображение

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

Изображение

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

Изображение

Он действительно не центрирован относительно слайдера. В исходниках видно, что искусственный сдвиг вниз на 1 виртуальный пиксель. Плюс неправильно считается высота строки (на 1 реальный пиксель ошибка), из которой рассчитывается середина слайдера по высоте, куда становится строка. На больших разрешениях незаметно, а на мелких будет заметно, поэтому было это уравновешивание ошибки другим уравновешиванием на 1 пиксель (теперь большой, виртуальный после масштабирования). Большой пиксель не уравновешивается ошибкой на 1 реальный пиксель, отсюда и сдвиг вниз.

Убираем лишний сдвиг, убираем ошибку на пиксель. Опять проверка, после правки строка выравнивается:

Изображение

Без проверочных подкладок:

Изображение

Окно теперь похоже на сименсовское и с ровным расположением текста на слайдере.

Дополнительная проверка окна с включенной отрисовкой растровым PCF-шрифтом ("Настройки" - "Шрифт окон"), вдруг что-нибудь вылезло куда:

Изображение

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

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

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

Сообщение blackstrip » Вс июн 29, 2025 10:12 pm

Добавим еще один тестовый телефон, шестой.

Тестовый телефон 6 - Soyes XS13
Экран 240 х 432 пикселей, сенсорный
Android 9

Изображение

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

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

Сообщение blackstrip » Пн июн 30, 2025 8:23 pm

Финальное сравнение окна BlurForce: старого из версии 2.7.24 beta 1 ( viewtopic.php?f=4&t=110&p=3452#p3452 ) с получившимся после масштабирования.

1 - Joy's S15

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

2 - RugGear RG310

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

3 - Soyes XS13

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

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

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

В исходниках масштабирование значков включается если ширина экрана больше 170 пикселей (фильтр для всяких 132х176, 130х130), если в настройках включен "Автомасштаб" и если шрифт меньше 32 пикселей по высоте, потом масштабируется еще раз если меньше 64, потом если меньше 128 и т.д. По высоте никакого условия нет.

Получается, писался код больше под вертикальные или квадратные экраны. Добавим сравнение для вертикального размера. Например, 132х176 это в пропорциях 1 х 1,3333...

170 * 1.3333... = 226,6666... Тогда пусть будет если высота больше 227 пикселей, и ширина больше 170 пикселей, то тогда масштабирование включаем. Если же нет, то выключаем. На этом телефоне высота 432 пикселя, половина занята вирт.клавиатурой, остается 216 пикселей. Это как раз меньше 227, поэтому масштабирование будет выключено, значки станут не такие огромные.

Для экранов 240x320 если включить вирт.клавиатуру нажатием на сенсор - тоже станет 240х160, высота меньше 227, масштабирование выключится. По прикидке вроде бы будет хорошо. Попробуем...

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

Теперь кисть не увеличивается в два раза и не залезает под слайдер.

4 - Xiaomi Duoqin F22 Pro

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

5 - Nokia N90

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

6 - Xiaomi Redmi Turbo 3 (Poco F6)

Было:

Изображение

Стало со шрифтом андроида / с растровым PCF-шрифтом:

Изображение

Изображение

Ну вот, теперь окно BlurForce нормально рисуется на всех тестовых телефонах.

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

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

Сообщение blackstrip » Ср июл 02, 2025 4:17 pm

Следующее окно по списку - Camera:

Изображение

Проблемы окна Camera

Это окно - для съемки фото с телефона и затаскивания полученного фото в паинткад для редактирования. Но на андроиде функция "Фото" не работает, т.к. в microemu (портировщике из j2me в apk) нет классов, работающих с камерой =) Вместо этого классы рисуют фальшивую картинку и делают вид что она - фото с камеры.

Поэтому тут надо заставить это окно работать под андроидом бы тоже.

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

Изображение

Простой вариант работы с камерой под android - через стороннее приложение камеры.

При запросе фото - вместо явовской съемки вызываем андроидовскую. Запрос нумеруем цифрой "ноль":

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

Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, 0);
Этот код параллельно работе паинткада запускает камеру в отдельном окошке (паинткад в это время работает и по таймеру каждые 150 мс спрашивает андроида "готово фото?"). Будем фотать зеленый эспандер на фиолетовой подложке:

Изображение

После фотографирования оно показывает замороженное фото и надо нажать "да" или "нет":

Изображение

После нажатия согласия или несогласия - улетаем в обработку результата вызова камеры андроидом, для этого в Activity пишем метод onActivityResult с пометкой @Override о переписывании поверх старого пустого метода. Если нажали "да", то resultCode приходит в виде RESULT_OK. Ну и номер запроса requestCode сравниваем с цифрой "ноль". Вытаскиваем данные, делаем из них Bitmap, пакуем его в JPEG и превращаем данные JPEG в байтовый массив. Этот массив - получается прямо как байтовый массив в j2me VideoControl.getSnapshot() при получении фото с камеры, это как раз что нужно паинткаду:

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

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
	   super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
	   Bundle extras = imageReturnedIntent.getExtras();
        if((requestCode == 0) && (resultCode == RESULT_OK)){  
			if(extras.containsKey("data")) {
				Bitmap bmp = (Bitmap) extras.get("data");
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
				camphoto = baos.toByteArray();
			} 
        } else if (requestCode == 0)
		{
			camphoto = null;
		};
	}
	
Смотрим что пришло. Маленькая фотка =) (главное окно рисования пока что где-то масштабировано, где-то нет, т.к. до него еще ревизия окон не дошла):

Изображение

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

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

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

Сообщение blackstrip » Сб июл 12, 2025 11:26 pm

Запуск паинткада на телефонах со старым андроидом (4.2, 4.4, и даже 2.3.3) показал что окно со съемкой камерой не появляется вообще. А в андроиде 12 или 15 все отлично работает.

adb logcat (вывод всех событий, ошибок) в паре с эмулятором 2.3.3 показал что у старых андроидов есть preverifier, который проверяет все строки в классе. ВСЕ.

И если в классе камеры стоит "Если флажок "под андроидом" - делай то-то, а если не под андроидом - то вызывай старые классы j2me", то несмотря на флажок preverifier проверит все вызовы методов в классе. И наткнувшись на кривую реализацию работы с камерой microemulator-а (которая под андроидом вообще никогда не была бы вызвана) он совсем не пускает паинткад в класс. При переходе на этот displayable - сыпет ошибками и все (того метода нет, этого нет).

У микроэмулятора часть явовских классов сделаны как "интерфейс" - пустышка с заголовками методов, которой потом назначается определенный класс, потом он расширяется еще одним, потом еще одним и т.д.. Получившийся бутерброд и является финальным классом, с которым работает микроэмулятор. Модули j2me для работы с камерой, музыкой и видео Manager, Player, VideoControl и другие не доделаны до конца, и, видимо, из них не собирается такой бутерброд или собирается частично. Preverifier боится несобранного бутерброда, у которого каких-то методов нет. В Android 12 или 15 такой preverifier не проверяет ничего, видимо, надеется "когда вызовут несуществующий/неназначенный метод, тогда и будем паниковать".

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

Придется делать дублирующий класс для работы с камерой под андроид. И под явой вызывать старый класс с вызовами фич VideoControl, Manager и т.д.. А под андроидом новый, в котором никаких связей с VideoControl нет. Чтоб preverifier не пугался и дал работать с камерой старым андроидам.

Это же придется проделать с окошком "Снять 3GP/MP4 кадр", вытаскивающим кадры из видео в паинткад, когда до него дойдет ревизия окон. Т.к. оно тоже построено на VideoControl и Player.

Раз такое бывает, что в старом и новом андроидах apk запускается с разными проверками, то в тестовые телефоны добавим еще и старый андроид 2.3.3 - смартфон Samsung Galaxy Ace GT-S5830.
Экран: 320x480, сенсорный

Изображение

Кстати, на этом телефоне съемка скриншотов через ADB не работает. Создаем папку scrs, например. Запускаем adb shell screencap /sdcard/scrs/screenshot1.png - а он отвечает "screencap: permission denied". Чтобы снять скриншот просто с телефона - надо нажать Power (кнопка включения) + Home (физическая кнопка под экраном). И тогда скриншоты в формате PNG размером около 200 килобайт появляются в папке /sdcard/ScreenCapture.

И вот, после создания дублирующего класса Camera2, содержащего только команды андроид-съемки, съемка превью-фото заработала на всех тестовых телефонах. И даже в arm-эмуляторе из android sdk. При съемке эмулятор рисует белый экран, а по запросу снятой фоты - возвращает картинку с андроидом на фоне других андроидов вдалеке.

Изображение

Изображение

Изображение

Изображение

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

Ответить

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

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