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