Использование Windows шрифтов в J2ME


Предоставляемые возможности вывода текста в MIDP не позволяют в полной возможности воплотить задуманные решения. Столкнувшись в очередной раз с этим ограничением и не найдя готового решения написал небольшое приложение на Delphi и java класс позволяющий использовать всё многообразие шрифтов Windows.

Утилита FontGen.exe позволяет создать образы шрифтов с учётом размеров и стилей который сохраняется в файлеfont.png. Также создается файлfont.dat с описанием расположения символов и служебной информацией.


Рассмотрим формат файла font.dat Первые 3 байта служебная информация

  1. высота символов (в пикселах)
  2. флаг равен 1 если шрифт italic
  3. зарезервирован

      Дальше каждый символ описывает 3 байта

      1. старший байт смешения(в пикселах) нахождения символа в image созданной из font.png
      2. ширина символа

      Дальше поместив эти файлы в папку res j2me приложения используйте класс FontClass

      /*
      * FontClass.java
      *
      * created June 16 2008
      * author magdelphi
      *
      <script language='JavaScript' type='text/javascript'>
      <!--
      var prefix = 'm&#97;&#105;lt&#111;:';
      var suffix = '';
      var attribs = '';
      var path = 'hr' + 'ef' + '=';
      var addy99262 = 'm&#97;gd&#101;lph&#105;' + '&#64;';
      addy99262 = addy99262 + 'r&#97;mbl&#101;r' + '&#46;' + 'r&#117;';
      document.write( '<a ' + path + '\'' + prefix + addy99262 + suffix + '\'' + attribs + '>' );
      document.write( addy99262 );
      document.write( '<\/a>' );
      //-->
      </script><script language='JavaScript' type='text/javascript'>
      <!--
      document.write( '<span style=\'display: none;\'>' );
      //-->
      </script>Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
      <script language='JavaScript' type='text/javascript'>
      <!--
      document.write( '</' );
      document.write( 'span>' );
      //-->
      </script>
      *
      */
       
      import java.io.InputStream;
      import javax.microedition.lcdui.Graphics;
      import javax.microedition.lcdui.Image;
      import java.io.IOException;
       
      publicclass FontClass{
      private byte buff[]=new byte[768];//данные таблицы символов из файла xxxxx.dat
      private static Image fontImage=null;
      private static int[] buf;//данные одного символа
      private int width=0;
      private int Color=0;
      int h_char;//высота символов
      int italic=0;//флаг стиля символов italic
       
      /** конструктор FontClass */
      public FontClass()
      {}
       
      //Возвращает значение цвета из составляющих alpha-фльфа, RGB
      private int toBGR(int a, int r, int g, int b){
      return(b|(g<<8)|(r<<16)|(a<<24));
      }
       
      //Устанавливает текущий цвет отображения букв по составляющим alpha-aфльфа, RGB
      public void setColor(int a, int r, int g, int b){
      Color=toBGR(a,r,g,b);
      }
       
       
      //******************* Выводит на экран один символ *************************
       
      public int drawChar(Graphics g, char c, int left, int top){
      int result=0;
      if(fontImage!=null){
      String s=String.valueOf(c);
      /* unicode to ansi */
      int ch= s.charAt(0);
      ch= ch==0x400 ?0xa7: ch==0x450 ?0xb7: ch;
      ch= ch>0x400 ? ch-0x350: ch;
       
      int ind=((int)(ch)-0x20)*3;//смещение данных в таблице xxxxx.dat
      int len=0;//смещение в таблице xxxxx.png
      int hlen=(buff[ind+1]&amp;0x00ff)<<8;//старший байт
      len=(buff[ind]&amp;0x00ff)+hlen;//смещение в таблице xxxxx.png
      int width_char= buff[ind+2]+italic;//ширина символа
       
      fontImage.getRGB(buf,0, width_char, len-2,0,width_char, h_char);//считать в буфер
      for(int i=0;i<buf.length;i++)
      {
      int color=(buf[i]&amp;0x00ffffff);//читаем только RGB
      if(color==0) color= Color;//если черный красим в цвет
      buf[i]= color;
      }
      g.drawRGB(buf,0, width_char, left, top, width_char, h_char,true);
      if(c==' '){width_char=h_char>>2;}//если пробел
      result=width_char;
      }
      return result;
      }
       
      //***** Выводит строку символов **********************************************
       
      public void drawString(Graphics g, String s, int left, int top){
      int len= left;
      int w=0;
      int max_width=g.getClipWidth();
      for(int i=0; i< s.length(); i++){
      // if s.charAt(i) == " "
      w=drawChar(g, s.charAt(i), len, top);
      len=len+w;
      // if (len >= max_width-1) return;
      }
      width=len;
      }
       
      //************** Инициализация, создание объектов и буферов ****************
      public void Init(String name_font){
      try{//----- загрузка image символов ---------------
      fontImage= Image.createImage("/"+name_font+".png");
      } catch(IOException ioe){
      ioe.printStackTrace();
      }
       
      //************* загрузка таблицы расположения символов *********************
       
      InputStream is= getClass().getResourceAsStream("/"+name_font+".dat");
      //System.out.println("f2s8.dat загружено");
      int off=0;
      int readBytes=0;
      int n_buf;
      try
      {
      while((readBytes= is.read(buff, off, buff.length))>-1){}//копируем в буфер
      h_char=buff[0];//высота символов
      if(buff[1]==1){italic=h_char/4;}//если fontstyle = [italic] увеличиваем ширину символа
      }
      catch(Exception e)
      {
      System.out.println("Exception: "+ e.toString());
      }
       
      n_buf=h_char*h_char;// кол-во байт 1 знакоместо
      buf=new int[n_buf];
      }
       
      //Удаление объектов
      public void Destroy(){
      buff=null;
      buf=null;
      fontImage=null;
      }
      }

      Пример использования


      Архив с FontGen.exe, FontClass и примером прилагаю


      Автор:Альберт.




    Наши соцсети

    Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

    Популярное

    Ссылки

    Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

    Рейтинг@Mail.ru Яндекс.Метрика
    MobiLab.ru © 2005-2018
    При использовании материалов сайта ссылка на www.mobilab.ru обязательна