Цветные буквы

Темы о Java и ее разновидностях типа J2me
Ответить
Romanzes
Новичок
Сообщения: 2
Зарегистрирован: Сб янв 10, 2009 9:17 pm

Цветные буквы

Сообщение Romanzes » Сб янв 10, 2009 9:48 pm

Думаю, ни для кого не секрет, как использовать собственные шрифты в программах на java: берем картинку со шрифтом, вырезаем и подставляем нужные буквы в нужных местах. Передо мной стоит более сложная задача: нужно сделать программу, в которой на экране будет отображаться некий текст. Использоваться будут не родные шрифты телефона, а собственные. При этом шрифт должен различаться по цвету, причем заранее неизвестно, какие цвета будут использоваться (как в Опере мини). Я попытался реализовать это следующим образом: сначала создавал массив, в котором будет храниться изображение строки, с помощью функции getRGB записывал в него данные, а затем заменял все пиксели черного цвета на цвет, который мне нужен. На эмуляторах это дало прекрасные результаты и фпс=20. Однако, когда я запустил прогу на сименсе C72, фпс стало 2 :( . Есть подозрение, что тормозит дело функция getRGB. Есть такая идея: при загрузке шрифта сразу представлять его в виде массива integer, а потом вставлять нужные куски куда надо... Может кто-нибудь знает способ попроще?
Вот сама прога: ColorFont

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

Re: Цветные буквы

Сообщение blackstrip » Вс янв 11, 2009 4:46 pm

Через getRGB конечно быстроты не получишь. Советую придумать вообще собственный формат. Если бушь использовать одноцветные шрифты (т.е. каждая точка в изображении или прозрачная, или какого то выбранного цвета), то бери битовое представление. Т.е. каждые 8 точек в строке - это 1 байт.

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


11111111|111111ХХ <= тут первый и второй байт
10000000|000001ХХ <= тут третий и четвертый байт
10000000|000001ХХ
10000000|000001ХХ
10000000|000001ХХ
10000000|000001ХХ
10000000|000001ХХ
10000000|000001ХХ
10000000|000001ХХ
11111111|111111ХХ <= тут 19ый и 20ый байт

Неиспользуемые X - сделаем нулевыми например.
Итого буква будет 20 байтная. Вот ее код записанный в файл FF FС 80 04 80 04 80 04 80 04 80 04 80 04 80 04 80 04 FF FC
И в файл пиши для каждой буквы:
Код юникодовский буквы, Ширина (по горизонтали) в точках, Высота (по вертикали) в точках, дальше эту приведенную последовательность байтов.

А процедуру загрузки делай как нить так, чтоб удобней эти буквы в память положить было (ну или возьми не юникодовский код, а ASCII там как никак только 256 символов, русские и английские и еще там всякая графика по мелочи).

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

Romanzes
Новичок
Сообщения: 2
Зарегистрирован: Сб янв 10, 2009 9:17 pm

Re: Цветные буквы

Сообщение Romanzes » Вс янв 11, 2009 8:22 pm

PbICb, огромное тебе спасибо за ответ! Однако, я уже пробовал похожий метод, т.е. работал без getRGB, чисто с массивами. И на телефоне fps<1 :( .

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

Re: Цветные буквы

Сообщение blackstrip » Ср янв 14, 2009 9:54 pm

Ну тада конечно надо как-то выводить картинки сразу. Тока конечно массив байтов с битовым изображением это тебе не картинка (по размеру). Например та же 14х10 занимающая 20 байт - это много меньше чем картинка 14х10х4(четыре - это байт на точку в яве, когда картинка уже загружена в Image) = 560 байт =) Вот даже один такой шрифт в памяти из 256 символов - это 560*256 = 140 килобайт (ну эт расчет для того случая, когда все буквы будут 10х14 точек, конечно в реально не так будет, ну для примера сойдет). А в твоем С72 всегото от силы при загруженной проге будет 600-700 килобайт свободно. Т.е. загрузкой в оперативку одного такого картиночного шрифта ты забьешь сразу пятую часть оперативки. А загрузив пять различных шрифтов - вообще забьешь всю оперативу и будет аут-оф-мэмори. А если ты собрался какую нить игру делать - то это еще графика в оперативе должна быть и всё остальное. Короч трудно будет с картиночным шрифтов развернуться в проге.

Да и почему у тя 1 фпс? ты чо весь экран чтоли забиваешь текстом?)) если просто писать пару тройку строк - ну я думаю ну 100 мс уйдет на это, кадров 10 в секунду получится. Мож конечно сам С72 такой приторможенный, я честно говоря никогда С72 не использовал и проги на нем запускать не пробовал. Но пробовал на СХ75 - помню меню делал в паинткаде с внешними шрифтами, ну когда пунктов 10 в высоту меню (т.е. 10 пунктов по 10-20 символов) - тогда конечно гдето секунду рисовался такой список из строк. Ну а если строки две-три - вполне приемлемо отрисовывает такой метод, и достаточно быстро.

Phantom
Обсуждатель
Сообщения: 179
Зарегистрирован: Сб янв 05, 2008 12:01 pm
Контактная информация:

Re: Цветные буквы

Сообщение Phantom » Чт янв 15, 2009 1:04 am

Да нам нужно сделать что-то вроде оперы мини. В смысле чтобы страницы с цветными текстом и фоном, с картинками и с возможностью ставить на фон рисунок могли отображаться. Это не для игры. Графики не будет много. Нам главное - скорость.

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

Re: Цветные буквы

Сообщение blackstrip » Пт янв 16, 2009 3:43 pm

Мона тада наверное сделать некий симбиоз двух описанных методов. Хранить шрифты в виде двоичных последовательностей, а не pngшек (т.е. каждая точка в массиве для буквы - прозрачная или нет). И сделать процедуру которая будет конструировать шрифт в виде набора Image-ей из этих последовательностей. Т.е. пробегает по всем буквам и единожды при загрузке проги например делает для буквы А её Image, где нарисована эта "А" конкретным цветом, для буквы Б аналогично, и т.д.. Ну правда тогда опять получаются ограничения по оперативе, и придется например выбрать 16 цветов стандартных, и для них сделать наборы Image-ей из int-шрифта. Вопрос в том влезут ли они в оперативу.

Ответить

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

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