Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пример работы со шрифтами, Свои шрифты( цвет, фон, прозрачность) 
:(
    Опции темы
shomer
Дата 12.11.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 7.11.2007

Репутация: нет
Всего: нет



Выкладываю вариант отрисовки своих шрифтов.
-------------------------------------------
Шрифт - png файл - белые буквы на прозрачной основе вида
для примера символы О и Р
где о-прозрачный пиксел х-белый

OOOOOOOOOO
OOXOOXXXOO
OXOXOXOOXO
OXOXOXXXOO
OOXOOXOOOO
OOOOOOOOOO
OOOXOOOOXO  линия меток конца символа

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

пример мидлета на моем TS2050 выдает 7 fps.

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  FontGameCanvas.rar 28,47 Kb
PM MAIL   Вверх
javastic
Дата 13.11.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Эмулятор от SE закрывается намертво после запуска мидлета.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
eugine_s
Дата 14.11.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Запустилось на эмуляторе K700.

Давай разбирать ошибки:

1. Бросается в глаза Demo.java 
Метод run(): 
            try{ Thread.sleep(20);}
            catch (Exception ex) {};

Зачем поток усыплять? 

2. Зачем используешь float ? Это далеко не тот случай когда нужно использовать флоат (вычисления с плавающей точкой занимают больше времени чем целочисленое исчисление).

3. Сам фпс как-то кривова-то считается, лучше в run() делать вот так:

засек время()
отрисовал экран: DrawScreen();
опять засек время и вывел фпс;

4. Собственно пункты 1-3 это лирическое отступление, а по теме вопроса:
Скажи, зачем тебе getRGB() от твоего шрифта? точнее доступ к каждой точке твоего шрифта? Это не правильно решение, если тебе нужно использовать в программе несколько шрифтов, то лучше в джарник закинуть два(или сколько надо) шрифтов. 
Соотвественно не нужно будет потом делать g.drawRGB() когда потребуется отрисовка буквы.

Что тебе нужно сделать, чтобы быстро работала отрисовка своего шрифта:
1. Сделать описание для каждой буквы(точнее каждого символа из твоего шрифта) в таком формате
(x,y,w), где х - х-координата, у - у-координата символа на картинке, w - ширина символа
а также для всех символов достаточно одной h = высоты (у всех же одинаковая высота?)
Это описание занеси в файл и в конструкторе твоего шрифта считай из файла в массив(ы), или создай 
final массивы в коде Font.java.

2. Конструктор шрифта делает: 
 - загружает картинку
 - если требуется инициализирует массив(ы) координат и размеров символов шрифта

3. Теперь твой DrawStr(String str, int x, int y) превращается в:
находим координаты символа, который нужно отрисовать и методом
g.drawRegion() рисуем твой символ. 
(вместо drawRegion можно использовать setClip + drawImage)



PM MAIL   Вверх
shomer
Дата 14.11.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 7.11.2007

Репутация: нет
Всего: нет



javastic-у
Пример запускал на Wireless Toolkit 2.5.1 эмуляторе. Работает почему то медленней чем на реальном телефоне раза в три четыре. 

eugine_s-у
1. без Thread.sleep(20) на тефоне не обрабатывает клавиатуру (реакция на нажатия отсутствует, пришлось вытаскивать аккумулятор). 
2. float для точности  
3. FPS кривой - точно.
4. в данном случае дань универсальности ( имеем потерю в скорости)
    получая меньший размер мидлета получаем больший расход памяти

Есть одна задумка   smile ( возможно изобретение колеса smile )...
нужно опробовать с   замером fPs... на разных телефонах

setClip + drawImage и drawRegion, пока не интересно.
Надо немного время размышлять однако


Это сообщение отредактировал(а) shomer - 14.11.2007, 19:28
PM MAIL   Вверх
Samuil
Дата 15.11.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в(Job)ываю
**


Профиль
Группа: Участник
Сообщений: 705
Регистрация: 26.4.2006
Где: Uzbekistan.Tashke nt

Репутация: 5
Всего: 6



Прозрачные пикселы на старых телефонах будут?


--------------------
Выбор уже сделан, остается его только осознать   
smile    smile 
      smile  

user posted image
PM MAIL ICQ   Вверх
eugine_s
Дата 15.11.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(shomer @  14.11.2007,  19:27 Найти цитируемый пост)
4. в данном случае дань универсальности ( имеем потерю в скорости)


Нет, нет тут никакой универсальности и не нужна она вообще в этом случае.
Сколько нужно будет шрифтов в программе? 


Цитата(shomer @  14.11.2007,  19:27 Найти цитируемый пост)
setClip + drawImage и drawRegion, пока не интересно.


А как же тогда картинки рисовать? 

Цитата(shomer @  14.11.2007,  19:27 Найти цитируемый пост)
нужно опробовать с   замером fPs... на разных телефонах


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

Проблема в вашей "дани универсальности". Убрать getRGB() и drawRGB() + оптимизировать саму картинку шрифта (не нужно делать для каждого символа одинаковые отступы, если символ "."(точка) занимает 1 пиксель в ширину, то и нужно оставлять 1 пиксель а не 6.


PM MAIL   Вверх
shomer
Дата 15.11.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 7.11.2007

Репутация: нет
Всего: нет



Samuil-у:
прозрачность от староватости телефона имеет нелинейную зависимость smile
лучше пользовать int numAlphaLevels() для любопытства

eugine_s-у:
setClip + drawImage и drawRegion - бью им челом
Интересно почему на Wireless Toolkit 2.5.1 эмуляторе fps в счетыре раза ниже чем на телефоне
а Sjboy Emulator вообще мидлет не берет.
Точка - пиксел, а сможет и нет  smile - масштабированием шрифта еще не занималсся 

Имхо drawImage и drawRGB равнозначны ( хотя реализации не видел ( как посмотреть smile ) JAD нам в помощь).
Есть желание сформировать растровый массив строки для последующей обработки
альфа_цветом с одной отрисовкой а не посимвольно как сейчас. Угнетает мысль о new и таймингах массива... 
PM MAIL   Вверх
shomer
Дата 15.11.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 7.11.2007

Репутация: нет
Всего: нет



Старый метод
Код

 // отрисовка строки цветом - f_acolor на фоне - b_acolor с учетом прозрачности, формат AARRGGBB
    public void DrawStr( Graphics g, String str, int x, int y, int f_acolor, int b_acolor )
    {
        if ( f_load)
        {
            int key;
            int l = str.length();
            int z = w_font * font_height;
            int[] color_f = new int[z];
            java.lang.System.arraycopy( obr_f, 0, color_f, 0, z);
            for ( int i=0; i<z; i++)
                if ( color_f[i] != blanc)
                    color_f[i] = f_acolor;
                else
                    color_f[i] = b_acolor;                
            for (int i=0; i<l; i++)
            { 
                key = (int)str.charAt(i);
                if ( key >= 1000) 
                    key -= 880;
                else 
                    key -= 32;
                g.drawRGB( color_f, of_sym[key], w_font, x, y, w_sym[key], font_height,  true);
                x += w_sym[key]; 
            }
        }
    }


Новый метод
Код

    public void DrawStr_A( Graphics g, String str, int x, int y, int f_acolor, int b_acolor )
    {
        if ( f_load)
        {
            int key = 0;
            int l = str.length();
            int size = w_font * font_height; // тут недоработочка w_font
            int wy = 0;
            int wx = 0;
            int width = 0;
            int[] color_f = new int[size];
            for ( int j=0; j<font_height; j++)
            {
                wx = 0;
                for (int i=0; i<l; i++)
                {
                    key = (int)str.charAt(i);
                    if ( key >= 1000) 
                        key -= 880;
                    else 
                        key -= 32;
                    java.lang.System.arraycopy( obr_f, of_sym[key] + w_font*j, color_f, wx + wy*j, w_sym[key]);
                    wx += w_sym[key];
                }
                wy = wx;
            }
            size = wx * font_height;
            for ( int i=0; i<size; i++)
                if ( color_f[i] != blanc)
                    color_f[i] = f_acolor;
                else
                    color_f[i] = b_acolor;                
            g.drawRGB( color_f, 0, wx, x, y, wx, font_height,  true);
        }
    }
    

Скорость вывода выросла и даже в .. раз. А я боялась smile 
Оказывается посимвольная отрисовка хорошо подтормаживает smile 
Особенно заметно при многострочном выводе ( хотя может и открыл Америку)

Это сообщение отредактировал(а) shomer - 15.11.2007, 23:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0731 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.