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


// style: tabs, tabsize=4, style=ANSI 
//+----------------------------------------------------------------------+ 
// Copyright (c) 2006 Company Name 
// Made by Andrew and Zahar 
//+----------------------------------------------------------------------+ 
// Filename: FontManager.java 
//+----------------------------------------------------------------------+ 
// Comment: Manager of fonts. Load any only once and deletes when not needed more. 
//+----------------------------------------------------------------------+ 
 
package fonts; 
 
import app.MainCanvas; 
 
import java.io.*; 
import javax.microedition.lcdui.*; 
import javax.microedition.lcdui.game.*; 
 
public class FontManager 
{ 
    public final static int BIG=		0; 
    public final static int SMALL=		1; 
    public final static int TOTAL=		2; 
 
	 
	PngFont mFonts[]; 
	int		mUseFonts[]; // Хранит сколько классов используют объект. 
 
    public MainCanvas mMainCanvas;  // Link to shared MainCanvas 
 
	 
    public FontManager(MainCanvas m) 
    { 
		mMainCanvas = m; 
		 
		mFonts = new PngFont[TOTAL]; 
		for (int i=0; i= TOTAL) 
			return; 
		if (mUseFonts[ifont] >0 ) 
		{ 
			// Шрифт уже загружен. 
			mUseFonts[ifont]++; 
			return; 
		} 
		 
		if (mFonts[ifont]==null) 
			mFonts[ifont] = new PngFont(); 
		 
		try 
		{ 
			switch (ifont) 
			{ 
				case BIG:	mFonts[ifont].Init(null, "fonts/font_big_normal.png", "fonts/font_big_selected.png", 8, 12); break; 
				case SMALL:	mFonts[ifont].Init("fonts/font_small_color.png", "fonts/font_small_normal.png", "fonts/font_small_selected.png", 6, 8); break; 
				default : break; // can't be 
			} 
		} 
		catch(Throwable e) 
		{ 
			mMainCanvas.mMIDlet.mErrorReporter.ShowError("FontManager.LoadFont()", e.toString()); 
		} 
		mUseFonts[ifont]++; 
	} 
	 
    public void UnLoadFont(int ifont) 
    { 
		if (ifont<0 || ifont >= TOTAL) 
			return; 
		mUseFonts[ifont]--; 
		if (mUseFonts[ifont] <= 0 ) 
		{ 
			// Шрифт уже не используется и нужно выгрузить. 
			if (mFonts[ifont] != null) 
			{ 
				mFonts[ifont].Destroy(); 
				mFonts[ifont] = null; 
			} 
		} 
	} 
	 
    public void Print(int ifont, Graphics g, String s, int x, int y) 
    { 
		Print(ifont, g, s, x, y, -1, -1, -1, false, 0); 
	} 
	// Вывод текста. 
	// x_wrap - перенос символов после той позиции по x 
	// х_max - максимальная возомжная позиция по х ( кол-во символов до обрезания ) 
	// y_max - максимальная возомжная позиция по y 
	// -1 для этих значений значит неативные параметры 
	// enters позволять ли переносить строки через \n и \r. Иначе просто игнорировать 
	// skip - сколько строк пропустить перед выводом 
    public void Print(int ifont, Graphics g, String s, int x, int y, int x_max, int y_max, int x_wrap, boolean enters, int skip) 
    { 
		if (ifont<0 || ifont >= TOTAL) 
			return; 
		if (mUseFonts[ifont] <=0 ) 
			return; // Шрифт не загружен. 
		if (mFonts[ifont] == null ) 
			return; // Шрифт не загружен. 
		 
		mFonts[ifont].Print(g,  s, x, y, x_max, y_max, x_wrap, enters, skip); 
	} 
	// Подсчитывает сколько строк займет вывод, параметры одинаковые с 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) 
	{ 
		return PngFont.CountLines(s, x, y, x_max, y_max, x_wrap, enters); 
	} 
	// Подсчитывает количество символов в одной строке без переносов, пропуская цвета 
    public static int GetStringLength( String s ) 
	{ 
		return PngFont.GetStringLength( s ); 
	}	 
}