Шрифты в j2me

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _MegaBit_, 1 Aug 2009.

  1. _MegaBit_

    _MegaBit_ New Member

    Joined:
    17 Mar 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Проблема вообщем такая не могу считать шрифт с картинки, код компилируется отлично но при запуске появляется ошибка: java.lang.ArrayIndexOutOfBoundsException
    at FontClass.drawChar(FontClass.java:52)
    at FontClass.drawString(FontClass.java:83)
    at MIDPCanvas.paint(MIDPCanvas.java:44)


    Вот исходник:

    Файл MyFont.java:
    Code:
    import java.io.InputStream;
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    
    /**
     *
     * @author perlovskii
     */
    public class MyFont extends MIDlet {
        
        /** Creates a new instance of MyFont */
        public MyFont() {
            initialize();
        }
        
    //GEN-LINE:MVDFields
        
    //GEN-LINE:MVDMethods
    
        /** This method initializes UI of the application.//GEN-BEGIN:MVDInitBegin
         */
        private void initialize() {//GEN-END:MVDInitBegin
            // Insert pre-init code here
    //GEN-LINE:MVDInitInit
            // Insert post-init code here
        }//GEN-LINE:MVDInitEnd
        
        /**
         * This method should return an instance of the display.
         */
        public Display getDisplay() {//GEN-FIRST:MVDGetDisplay
            return Display.getDisplay(this);
        }//GEN-LAST:MVDGetDisplay
        
        /**
         * This method should exit the midlet.
         */
        public void exitMIDlet() {//GEN-FIRST:MVDExitMidlet
            getDisplay().setCurrent(null);
            destroyApp(true);
            notifyDestroyed();
        }//GEN-LAST:MVDExitMidlet
        
        public void startApp() {
            
            MIDPCanvas C = new MIDPCanvas();
            C.M=this;
            getDisplay().setCurrent(C);
     
        }
        
        public void pauseApp() {
        }
        
        public void destroyApp(boolean unconditional) {
            
        }
    
     
        
    }
    
    Файл FontClass.java:
    Code:
    import java.io.InputStream;
    import javax.microedition.lcdui.Graphics;
    import javax.microedition.lcdui.Image;
    import java.io.IOException;
    
    public class 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()
        { }
    
        //Возвращает значение цвета из составляющих a-фльфа, RGB
        private int toBGR(int a, int r, int g, int b){
            return (b|(g<<8)|(r<<16)|(a<<24));
        }
    
        //Устанавливает текущий цвет отображения букв по составляющим  a-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] & 0x00ff)<<8;//старший байт
    
                len=(buff[ind] & 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] &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 знакоместо
    //System.out.println(n_buf);
           buf = new int[n_buf];
    
        }
    
        //Удаление объектов
        public void Destroy(){
            buff = null;
            buf = null;
            fontImage = null;
        }
    
    
    
    
    
    }
    
    Файл MIDPCanvas.java:
    Code:
    import javax.microedition.lcdui.*;
    import javax.microedition.midlet.MIDlet;
    
    
    public class MIDPCanvas extends Canvas implements CommandListener {
        private Command ExitCommand;
        public MIDlet M;
        public Displayable D;
    
    
    
        /**
         * constructor
         */
        public MIDPCanvas() {
            try {
                setFullScreenMode(true);
                // Set up this canvas to listen to command events
                setCommandListener(this);
                // Add the Exit command
                ExitCommand=new Command("Exit", Command.EXIT, 0);
                addCommand(ExitCommand);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * paint
         */
        public void paint(Graphics g) {
            g.setColor(200,200,200);
            g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());
    
            FontClass MFont=new FontClass();
            MFont.Init("TimesNewRoman10");
            MFont.setColor(255,0,0,0);
            MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",0,20);
            MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",0,100);
             MFont.setColor(120,255,255,255);
             MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",1,21);
             MFont.drawString(g,"ПРОБА прозрачных шрифтов на MIDL 2.0",1,101);
            MFont.setColor(255,255,255,255);
            MFont.drawString(g,"Выход:",g.getClipWidth()-60,g.getClipHeight()-20);
            System.gc();
          //  MFont.Destroy();
            MFont.Init("ArialBlack36");
    MFont.setColor(255,0,0,250);
    MFont.drawString(g,"MobiLab",0,25);
    MFont.setColor(100,100,100,100);
    MFont.drawString(g,"MobiLab",3,28);
    MFont.setColor(50,0,0,255);
    
    
            MFont.setColor(100,100,100,100);
            MFont.drawString(g,"MagDelphi",5,65);
            MFont.setColor(30,100,100,100);
            MFont.drawString(g,"MagDelphi",8,68);
     //       MFont.setColor(50,0,0,255);
    
    //MFont.drawString(g,"Выход121:-)",g.getClipWidth()-100,g.getClipHeight()-40);
    MFont.Destroy();
    
        }
    
        /**
         * Called when a key is pressed.
         */
        protected  void keyPressed(int keyCode) {
        }
    
        /**
         * Called when a key is released.
         */
        protected  void keyReleased(int keyCode) {
        }
    
        /**
         * Called when a key is repeated (held down).
         */
        protected  void keyRepeated(int keyCode) {
        }
    
        /**
         * Called when the pointer is dragged.
         */
        protected  void pointerDragged(int x, int y) {
        }
    
        /**
         * Called when the pointer is pressed.
         */
        protected  void pointerPressed(int x, int y) {
        }
    
        /**
         * Called when the pointer is released.
         */
        protected  void pointerReleased(int x, int y) {
        }
    
        /**
         * Called when action should be handled
         */
        public void commandAction(Command command, Displayable displayable) {
            if(command==ExitCommand){
                Display.getDisplay(M).setCurrent(null);
                M.notifyDestroyed();
            }
    
        }
    
    }
    
    Исходник взят с сайта: http://www.mobilab.ru/articles/100/