На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> Работа со своими шрифтами, , Доступ к массиву - проблема
    Заморочка при доступе к массиву n_w_char в методе DrawStr на телефоне...
    -------------------------------------------------------------------------------
    ExpandedWrap disabled
      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 {
                        [B]  x0 = n_w_char[key][1];
                          w0 = n_w_char[key][0];[/B]                } 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 тоже - чегой то я не понимаю
    n_w_char инициализируется в конструкторе
    DrawStr вызывается в методе paint Canvas-а
    может массив не видится :(
    Сообщение отредактировано: shomer -

    Прикреплённый файлПрикреплённый файлStd_Canvas.jar (8.83 Кбайт, скачиваний: 28)
      на телефоне постоянно выдает ArrayIndexOutOfBoundsException :huh:

      Добавлено
      Похоже отрисовка начинается раньше отработки коструктора :blink:
        Цитата shomer @
        Похоже отрисовка начинается раньше отработки коструктора

        Для данного класса это невозможно. Покажите первую строчку stacktrace'а, что ли.
          Судя по всему так и есть. (Телефонная оптимизированная реализация JVM :wacko: ).
          Решил проблему булевым флагом в конце конструктора "шрифт_загружен"=true;
          тогда и разрешаю отрисовку строк. 8-)
          Долго тупил однако :wall:
          ---------------------------------------------------------------------------------
          если кому нужно выложу исходник со шрифтом :whistle:
          Сообщение отредактировано: shomer -
            Исходник реализации класса для работы со своим шрифтом.
            работает медленно - нужна подсказка.
            -----------------
            ExpandedWrap disabled
              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];
                          }
                      }
                  }
              }
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0293 ]   [ 15 queries used ]   [ Generated: 2.05.24, 20:56 GMT ]