www.pudn.com > MobiCraft_src.rar > PngFont.java


// style: tabs, tabsize=4, style=ANSI 
//+----------------------------------------------------------------------+ 
// Copyright (c) 2006 Company Name 
// Made by Andrew and Zahar 
//+----------------------------------------------------------------------+ 
// Filename: PngFont.java 
//+----------------------------------------------------------------------+ 
// Comment: Class to print text using font in png. 
//+----------------------------------------------------------------------+ 
 
package fonts; 
 
import java.io.*; 
import javax.microedition.lcdui.*; 
import javax.microedition.lcdui.game.*; 
 
public class PngFont 
{ 
    public Image[] mFont; 
    public int mWidth; 
    public int mHeight; 
    public int iFont; 
    public int iColor; 
 
	 
	// To allow draw numbers, symbols and letters. All is allowed by default; 
    // Это сделано для того, чтобы можно было грузить картинки только с цифрами и символами для вывода score и т.п. 
    public boolean bNumbers; 
    public boolean bSymbols; 
    public boolean bLetters; 
 
	// Замечение: Тут все мелкие шрифты за раз. 
	public static final int[] FONT_COLORS =  
	{ 
		// Для Color цветов фон всегда черный 
		0xFFFFFF, // &0  - White, белый 
		0x2020FF, // &1  - Blue, синий  
		0x00FF00, // &2  - Green, зелёный  
		0xFF0000, // &3  - Red, красный  
		0x00b0FF, // &4  - Cyan, голубой  
		0xF00090, // &5  - Magenta, розовый  
		0xFFF000, // &6  - Yellow, жёлтый 
		0xFF8000, // &7  - Orange, оранжевый 
		0x8000FF, // &8  - Violet, фиолетовый 
		0xC0C0C0, // &9  - LightGray, светло-серый  
				  // &n - это цвет Normal, т.е. зеленым с прозраным фоном. 
				  // &s - это цвет Select, т.е. ярко зеленым с прозраным фоном. 
	}; 
	 
    public PngFont() 
    { 
		// All is allowed by default; 
		bNumbers = true; 
		bSymbols = true; 
		bLetters = true; 
		mFont = new Image[3]; 
		mFont[0] = null; 
		mFont[1] = null; 
		mFont[2] = null; 
    } 
     
	// s0=Color, s1=Normal, s2=Selected 
    public void Init(String s0, String s1, String s2, int w, int h) throws IOException 
    { 
		if ( s0 == null && s1 == null && s2 == null) 
		{ 
			throw ( new IOException("At least on font needed") ); 
			//return; 
		} 
		if ( s0 != null ) 
			mFont[0] = Image.createImage("/"+s0); 
        if ( s1 != null ) 
			mFont[1] = Image.createImage("/"+s1); 
        if ( s2 != null ) 
			mFont[2] = Image.createImage("/"+s2); 
		mWidth =w; 
		mHeight=h; 
		SetCurrentFont( 'n' ); 
    } 
	 
    public void Destroy() 
    { 
		mFont[0] = null; 
		mFont[1] = null; 
		mFont[2] = null; 
		mFont = null; 
	} 
	 
    private void Putc( Graphics g, int x_src, int y_src, int x_dest, int y_dest ) 
    { 
		if ( iFont == 0 ) // Цветной 
		{ 
			g.setColor(FONT_COLORS[iColor]); 
			g.fillRect( x_dest, y_dest, mWidth, mHeight); 
		} 
		g.drawRegion(mFont[iFont], x_src, y_src, mWidth, mHeight, Sprite.TRANS_NONE, x_dest, y_dest, Graphics.LEFT | Graphics.TOP); 
	} 
    public void SetCurrentFont( char c ) 
    { 
		int f = 0; 
		switch ( c ) 
		{ 
			case '0': iFont = 0; iColor=0; break; 
			case '1': iFont = 0; iColor=1; break; 
			case '2': iFont = 0; iColor=2; break; 
			case '3': iFont = 0; iColor=3; break; 
			case '4': iFont = 0; iColor=4; break; 
			case '5': iFont = 0; iColor=5; break; 
			case '6': iFont = 0; iColor=6; break; 
			case '7': iFont = 0; iColor=7; break; 
			case '8': iFont = 0; iColor=8; break; 
			case '9': iFont = 0; iColor=9; break; 
			case 'n': iFont = 1; iColor=0; break; 
			case 's': iFont = 2; iColor=0; break; 
			default: iFont = 1; iColor=0; break; 
		} 
		 
		for ( int q=0; q<2; q++) // Если после двух переходов не найдется - то ошибка, от нее предохраняет проверка в Init() 
		{ 
			if ( mFont[iFont] == null ) 
				iFont=(iFont+1)%3; 
			else 
				break; 
		} 
		// Тут на выходе корректный iFont, отвечающий не null в mFont[iFont] 
	} 
 
    public void Print(Graphics g, String s, int x, int y) 
    { 
		Print(g, s, x, y, -1, -1, -1, false, 0); 
	} 
	// Вывод текста. 
	// x_wrap - перенос символов после той позиции по x 
	// х_max - максимальная возомжная позиция по х ( кол-во символов до обрезания ) 
	// y_max - максимальная возомжная позиция по y 
	// -1 для этих значений значит неативные параметры 
	// enters позволять ли переносить строки через \n и \r. Иначе просто игнорировать 
	// skip - сколько строк пропустить перед выводом 
    public void Print(Graphics g, String s, int x, int y, int x_max, int y_max, int x_wrap, boolean enters, int skip) 
    { 
		if (s==null) return; 
		int x_pos = 0; 
		int y_pos = 0;		 
		int xnum=0; 
		int ynum=0; 
		SetCurrentFont( 'n' ); 
		for (int i=0; i=x_wrap) 
			{ 
				x_pos = 0; 
				y_pos++; 
			} 
			if (y_max!=-1 && y_pos>=y_max) 
			{ 
				return; // Дальше уже ничего не будет видно из-за обрезания снизу. 
			} 
			if (x_max!=-1 && x_pos>=x_max) 
			{ 
				x_pos++; 
				continue; 
			} 
 
			xnum=0; 
			ynum=0; 
			if (bNumbers) 
			{ 
				switch(s.charAt(i)) 
				{ 
					case ' ': xnum= 1; ynum=0; break; 
					case '1': xnum= 2; ynum=0; break; 
					case '2': xnum= 3; ynum=0; break; 
					case '3': xnum= 4; ynum=0; break; 
					case '4': xnum= 5; ynum=0; break; 
					case '5': xnum= 6; ynum=0; break; 
					case '6': xnum= 7; ynum=0; break; 
					case '7': xnum= 8; ynum=0; break; 
					case '8': xnum= 9; ynum=0; break; 
					case '9': xnum=10; ynum=0; break; 
					case '0': xnum=11; ynum=0; break; 
					default:  xnum=0; ynum=0; break; 
				} 
			} 
			if (bSymbols && xnum==0 && ynum==0) 
			{ 
				switch(s.charAt(i)) 
				{ 
					case '/': xnum=12; ynum=0; break; 
					case '|': xnum=13; ynum=0; break; 
					case '\\': xnum=14; ynum=0; break; 
					case '`': xnum=15; ynum=0; break; 
					case '~': xnum=16; ynum=0; break; 
					case '!': xnum=17; ynum=0; break; 
					case '@': xnum=18; ynum=0; break; 
					case '#': xnum=19; ynum=0; break; 
					case '$': xnum=20; ynum=0; break; 
					case '%': xnum=21; ynum=0; break; 
					case '^': xnum=22; ynum=0; break; 
					case '&': xnum=23; ynum=0; break; 
					case '*': xnum=24; ynum=0; break; 
					case '\'': xnum=25; ynum=0; break; 
					case '"': xnum=26; ynum=0; break; 
					case '-': xnum=27; ynum=0; break; 
					case '_': xnum=28; ynum=0; break; 
					case '=': xnum=29; ynum=0; break; 
					case '+': xnum=30; ynum=0; break; 
					case ';': xnum=26; ynum=1; break; 
					case ':': xnum=27; ynum=1; break; 
					case ',': xnum=28; ynum=1; break; 
					case '.': xnum=29; ynum=1; break; 
					case '?': xnum=30; ynum=1; break; 
					case '(': xnum=31; ynum=0; break; 
					case ')': xnum=32; ynum=0; break; 
					case '[': xnum=31; ynum=1; break; 
					case ']': xnum=32; ynum=1; break; 
					case '<': xnum=29; ynum=2; break; 
					case '>': xnum=30; ynum=2; break; 
					case '{': xnum=31; ynum=2; break; 
					case '}': xnum=32; ynum=2; break; 
					 
					default:  xnum=0; ynum=0; break; 
				} 
			} 
			if (bLetters && xnum==0 && ynum==0) 
			{   
				switch(s.charAt(i)) 
				{ 
					case 'a': xnum= 0; ynum=2; break; 
					case 'b': xnum= 1; ynum=2; break; 
					case 'c': xnum= 2; ynum=2; break; 
					case 'd': xnum= 3; ynum=2; break; 
					case 'e': xnum= 4; ynum=2; break; 
					case 'f': xnum= 5; ynum=2; break; 
					case 'g': xnum= 6; ynum=2; break; 
					case 'h': xnum= 7; ynum=2; break; 
					case 'i': xnum= 8; ynum=2; break; 
					case 'j': xnum= 9; ynum=2; break; 
					case 'k': xnum=10; ynum=2; break; 
					case 'l': xnum=11; ynum=2; break; 
					case 'm': xnum=12; ynum=2; break; 
					case 'n': xnum=13; ynum=2; break; 
					case 'o': xnum=14; ynum=2; break; 
					case 'p': xnum=15; ynum=2; break; 
					case 'q': xnum=16; ynum=2; break; 
					case 'r': xnum=17; ynum=2; break; 
					case 's': xnum=18; ynum=2; break; 
					case 't': xnum=19; ynum=2; break; 
					case 'u': xnum=20; ynum=2; break; 
					case 'v': xnum=21; ynum=2; break; 
					case 'w': xnum=22; ynum=2; break; 
					case 'x': xnum=23; ynum=2; break; 
					case 'y': xnum=24; ynum=2; break; 
					case 'z': xnum=25; ynum=2; break; 
					 
					case 'A': xnum= 0; ynum=1; break; 
					case 'B': xnum= 1; ynum=1; break; 
					case 'C': xnum= 2; ynum=1; break; 
					case 'D': xnum= 3; ynum=1; break; 
					case 'E': xnum= 4; ynum=1; break; 
					case 'F': xnum= 5; ynum=1; break; 
					case 'G': xnum= 6; ynum=1; break; 
					case 'H': xnum= 7; ynum=1; break; 
					case 'I': xnum= 8; ynum=1; break; 
					case 'J': xnum= 9; ynum=1; break; 
					case 'K': xnum=10; ynum=1; break; 
					case 'L': xnum=11; ynum=1; break; 
					case 'M': xnum=12; ynum=1; break; 
					case 'N': xnum=13; ynum=1; break; 
					case 'O': xnum=14; ynum=1; break; 
					case 'P': xnum=15; ynum=1; break; 
					case 'Q': xnum=16; ynum=1; break; 
					case 'R': xnum=17; ynum=1; break; 
					case 'S': xnum=18; ynum=1; break; 
					case 'T': xnum=19; ynum=1; break; 
					case 'U': xnum=20; ynum=1; break; 
					case 'V': xnum=21; ynum=1; break; 
					case 'W': xnum=22; ynum=1; break; 
					case 'X': xnum=23; ynum=1; break; 
					case 'Y': xnum=24; ynum=1; break; 
					case 'Z': xnum=25; ynum=1; break; 
                                         
					case 'А': xnum= 0; ynum=3; break; 
					case 'Б': xnum= 1; ynum=3; break; 
					case 'В': xnum= 2; ynum=3; break; 
					case 'Г': xnum= 3; ynum=3; break; 
					case 'Д': xnum= 4; ynum=3; break; 
					case 'Е': xnum= 5; ynum=3; break; 
					case 'Ё': xnum= 6; ynum=3; break; 
					case 'Ж': xnum= 7; ynum=3; break; 
					case 'З': xnum= 8; ynum=3; break; 
					case 'И': xnum= 9; ynum=3; break; 
					case 'Й': xnum=10; ynum=3; break; 
					case 'К': xnum=11; ynum=3; break; 
					case 'Л': xnum=12; ynum=3; break; 
					case 'М': xnum=13; ynum=3; break; 
					case 'Н': xnum=14; ynum=3; break; 
					case 'О': xnum=15; ynum=3; break; 
					case 'П': xnum=16; ynum=3; break; 
					case 'Р': xnum=17; ynum=3; break; 
					case 'С': xnum=18; ynum=3; break; 
					case 'Т': xnum=19; ynum=3; break; 
					case 'У': xnum=20; ynum=3; break; 
					case 'Ф': xnum=21; ynum=3; break; 
					case 'Х': xnum=22; ynum=3; break; 
					case 'Ц': xnum=23; ynum=3; break; 
					case 'Ч': xnum=24; ynum=3; break; 
					case 'Ш': xnum=25; ynum=3; break; 
					case 'Щ': xnum=26; ynum=3; break; 
					case 'Ъ': xnum=27; ynum=3; break; 
					case 'Ы': xnum=28; ynum=3; break; 
					case 'Ь': xnum=29; ynum=3; break; 
					case 'Э': xnum=30; ynum=3; break; 
					case 'Ю': xnum=31; ynum=3; break; 
					case 'Я': xnum=32; ynum=3; break; 
 
					case 'а': xnum= 0; ynum=4; break; 
					case 'б': xnum= 1; ynum=4; break; 
					case 'в': xnum= 2; ynum=4; break; 
					case 'г': xnum= 3; ynum=4; break; 
					case 'д': xnum= 4; ynum=4; break; 
					case 'е': xnum= 5; ynum=4; break; 
					case 'ё': xnum= 6; ynum=4; break; 
					case 'ж': xnum= 7; ynum=4; break; 
					case 'з': xnum= 8; ynum=4; break; 
					case 'и': xnum= 9; ynum=4; break; 
					case 'й': xnum=10; ynum=4; break; 
					case 'к': xnum=11; ynum=4; break; 
					case 'л': xnum=12; ynum=4; break; 
					case 'м': xnum=13; ynum=4; break; 
					case 'н': xnum=14; ynum=4; break; 
					case 'о': xnum=15; ynum=4; break; 
					case 'п': xnum=16; ynum=4; break; 
					case 'р': xnum=17; ynum=4; break; 
					case 'с': xnum=18; ynum=4; break; 
					case 'т': xnum=19; ynum=4; break; 
					case 'у': xnum=20; ynum=4; break; 
					case 'ф': xnum=21; ynum=4; break; 
					case 'х': xnum=22; ynum=4; break; 
					case 'ц': xnum=23; ynum=4; break; 
					case 'ч': xnum=24; ynum=4; break; 
					case 'ш': xnum=25; ynum=4; break; 
					case 'щ': xnum=26; ynum=4; break; 
					case 'ъ': xnum=27; ynum=4; break; 
					case 'ы': xnum=28; ynum=4; break; 
					case 'ь': xnum=29; ynum=4; break; 
					case 'э': xnum=30; ynum=4; break; 
					case 'ю': xnum=31; ynum=4; break; 
					case 'я': xnum=32; ynum=4; break;		 
					default:  xnum=0; ynum=0; break; 
				} 
			} 
			if (y_pos >= skip) 
				Putc( g, xnum*mWidth, ynum*mHeight, x+x_pos*mWidth, y+y_pos*mHeight ); 
			x_pos++; 
		} 
    }     
	// Подсчитывает соклько строк займет вывод, параметры одинаковые с Print(), кроме отсутствия Graphics g и int skip 
    public static int CountLines(String s, int x, int y, int x_max, int y_max, int x_wrap, boolean enters) 
    { 
		if (s==null) return -1; 
		int x_pos = 0; 
		int y_pos = 0;		 
		int xnum=0; 
		int ynum=0; 
		for (int i=0; i=x_wrap) 
			{ 
				x_pos = 0; 
				y_pos++; 
			} 
			if (y_max!=-1 && y_pos>=y_max) 
			{ 
				return (y_pos-1)+1; // Дальше уже ничего не будет видно из-за обрезания снизу. 
			} 
			if (x_max!=-1 && x_pos>=x_max) 
			{ 
				x_pos++; 
				continue; 
			} 
			x_pos++; 
		} 
		return (y_pos)+1; //TODO: Не совсем корректро если последний будет enter ( \n )? 
    }   
 
	// Подсчитывает количество символов в одной строке без переносов, пропуская цвета 
    public static int GetStringLength( String s ) 
	{ 
		if (s==null) return -1; 
		int len = 0; 
		for (int i=0; i