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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со шрифтами, Доступ к массиву - проблема 
:(
    Опции темы
shomer
Дата 8.11.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Заморочка при доступе к массиву n_w_char в методе DrawStr на телефоне...
-------------------------------------------------------------------------------
Код

import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.game.Sprite;

public class font {
    public  Image im_font;          // шрифт
    public  int w_font;             // ширина 
    public  int h_font;             // высота
    public  int[][] n_w_char;       // параметры отображения
    public  int n_char;             // число символов в шрифте
    public  int font_hight = 14;    // высота символа
    public  Display disp;

    public font( String font_name) 
    {
        try {
            im_font = Image.createImage("/" + font_name);       // загруз шрифта
        } catch( Exception eio){ info( "font load error"); };
        w_font = im_font.getWidth();
        h_font = im_font.getHeight();
        font_hight = h_font - 1;
        int[] n = new int[w_font * h_font];
        im_font.getRGB( n, 0, w_font, 0, 0, w_font, h_font);    // в массив
        int adr = w_font * (h_font - 1);
        n_char = 0;
        for ( int i=0; i<w_font; i++)                           // число символов
            if ( n [adr+i] == -1)                               // ? метка конца символа 
                n_char++;
        n_w_char = new int[n_char + 1][2];                      // 
        int k = adr - 1;
        int m;
        int ni = 0;
        int ni_adr = 1;
        n_w_char[0][1] = 0;
        for ( int i=0; i<w_font; i++)               // запись параметров символов
            if (  n[adr+i] == -1)
            {
                m = adr+i;
                n_w_char[ni][0] = m - k;            // запись ширины символа
                if ( ni_adr < n_char)
                    n_w_char[ni_adr][1] = i + 1;    // запись адреса начала отображения символа
                k = m;
                ni++;
                ni_adr++;
            }
     }
    
    public void DrawStr( Graphics g, String str, int x, int y)
    {
        int key;
        int x1 = x;
        int x0 = 0;
        int w0 = 0;
        int l = str.length();
 
        for (int i=0; i<l; i++)
        { 
            key = (int)str.charAt(i);
            if ( key >= 1000) 
                key -= 880;
            else 
                key -= 32;
            try {
                    x0 = n_w_char[key][1];
                    w0 = n_w_char[key][0];
                } catch (Exception ex) {        // на телефоне Excception, на симуляторах нет
                    info( "key "+ key); }
                g.drawRegion( im_font, x0, 0, w0, font_hight, Sprite.TRANS_NONE, x1, y, Graphics.TOP | Graphics.LEFT);
                x1 = x1 + w0; 
         }
    }
    
    public void info(String s)
    {
        Alert al = new Alert( "Exception", s, null, null);
        disp.setCurrent(al);
    }
}
-------------------------------------------------------------------------------------------------
На симуляторах все работает в NetBeans тоже - чегой то я не понимаю 


Это сообщение отредактировал(а) shomer - 8.11.2007, 16:19

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Std_Canvas.jar 8,83 Kb
PM MAIL   Вверх
shomer
Дата 9.11.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на телефоне постоянно выдает ArrayIndexOutOfBoundsException  smile 
PM MAIL   Вверх
shomer
Дата 9.11.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Похоже отрисовка начинается раньше отработки коструктора smile  
PM MAIL   Вверх
shomer
Дата 9.11.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решил проблему булевым флагом в конце конструктора "шрифт_загружен"=true;
тогда и разрешаю отрисовку строк.  
Долго тупил однако 
---------------------------------------------------------------------------------
если кому нужно выложу исходник со шрифтом 
PM MAIL   Вверх
shomer
Дата 10.11.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Исходник реализации класса для работы со своим шрифтом.
работает медленно - нужна подсказка.
-----------------
Код

import javax.microedition.lcdui.*;


public class font {
    private int[] obr_f;            // образ шрифта
    public  int w_font;             // ширина 
    public  int h_font;             // высота
    protected  int[] w_sym;         // ширина символа в фонте
    protected  int[] of_sym;        // смещение символа в фонте    
    public  int n_sym;              // число символов в шрифте
    public  int font_height;        // высота символа
    public boolean f_load = false;  // загрузка шрифта закончена
    private int blanc;              // пустой пиксел
    
    // контруктор загрузчик font, font_name - имя файла шрифта
    public font( String font_name) 
    {  
        Image im_font = null;
        try { im_font = Image.createImage("/" + font_name);     // загруз шрифта
        w_font = im_font.getWidth();                                
        h_font = im_font.getHeight();} 
    catch( Exception eio){  };
        font_height = h_font - 2;                // реально высота шрифт меньше
        obr_f = new int[w_font * h_font];
        im_font.getRGB( obr_f, 0, w_font, 0, 0, w_font, h_font);// в массив
        im_font = null;                                         // кирдык  image
    // определяем число символов в шрифте                                
        int adr = w_font * (h_font - 1);                        // начало меток
        blanc = obr_f[0];                    // прозрачный пиксел
        n_sym = 0;
        for ( int i=0; i<w_font; i++)                           
            if ( obr_f [adr+i] != blanc)                        // ? метка конца символа 
                n_sym++;
        w_sym  = new int[n_sym + 1];
        of_sym = new int[n_sym + 1];         
        int k = adr - 1;
        int m;
        int ni = 0;
        int ni_adr = 1;
        of_sym[0] = 0; 
    // запись параметров каждого символа в массив параметров шрифта
        for ( int j=0; j<w_font; j++)              
            if (  obr_f[adr+j] != blanc)
            {
                m = adr+j;
                w_sym[ni] = m - k;                  // запись ширины символа
                if ( ni_adr < n_sym)
                    of_sym[ni_adr] = j + 1;         // запись адреса начала отображения символа
                k = m;
                ni++;
                ni_adr++;
            }
        f_load = true;    // шрифт загружен                    
     }
    // простая отрисовка строки
    public void DrawStr( Graphics g, String str, int x, int y)
    {
        if ( f_load)
        {
            int key;
            int l = str.length();
            for (int i=0; i<l; i++)
            { 
                key = (int)str.charAt(i);
                if ( key >= 1000) 
                    key -= 880;
                else 
                    key -= 32;
                g.drawRGB( obr_f, of_sym[key], w_font, x, y, w_sym[key], font_height,  true);
                x += w_sym[key]; 
            }
        }
    }
    // отрисовка строки цветом - 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]; 
            }
        }
    }
}


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  src.rar 6,78 Kb
PM MAIL   Вверх
VOS
Дата 12.11.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Типа того:

Код

if (!isDoubleBuffered())  {

  if (BufferImage == null)    
      BufferImage = Image.createImage(screenWidth , screenHeight);
  curGraph = BufferImage.getGraphics();

  //Тут все отрисовываете
   paintAll(curGraph);
  //Скопировать 
   g.drawImage(BufferImage, 0, 0, Graphics.LEFT | Graphics.TOP);
}
else
 paintAll(g);


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


Новичок



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

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



Проблема определилась - 
медленный метод DrawStr класса font ( расплата за универсальность) smile - 
надо менять реализацию

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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