138 lines
3.8 KiB
Java
138 lines
3.8 KiB
Java
|
import com.s3d.Matrix3D;
|
|||
|
import com.s3d.Mesh;
|
|||
|
import javax.microedition.lcdui.Font;
|
|||
|
import javax.microedition.lcdui.Graphics;
|
|||
|
import javax.microedition.lcdui.Image;
|
|||
|
|
|||
|
/*
|
|||
|
* aNNiMON 2012
|
|||
|
* For more info visit http://annimon.com/
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Создание и отрисовка 3D текста
|
|||
|
* @author aNNiMON
|
|||
|
*/
|
|||
|
public class Text3D {
|
|||
|
private Mesh[][] mesh;
|
|||
|
|
|||
|
/**
|
|||
|
* Установить текст для отображения в виде 3D
|
|||
|
* @param text текст
|
|||
|
*/
|
|||
|
public void setText(String text) {
|
|||
|
Image img = getImageFromText(text, 0x00, 0xFFFFFF);
|
|||
|
int w = img.getWidth();
|
|||
|
int h = img.getHeight();
|
|||
|
int[] pix = new int[w * h];
|
|||
|
|
|||
|
img.getRGB(pix, 0, w, 0, 0, w, h);
|
|||
|
img = null;
|
|||
|
createMeshes(pix, w, h);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Отрисовка 3D текста
|
|||
|
* @param g контекст графики
|
|||
|
* @param matrix матрица преобразований
|
|||
|
*/
|
|||
|
public void paint(Graphics g, Matrix3D matrix) {
|
|||
|
for (int i = 0; i < mesh.length; i++) {
|
|||
|
for (int j = 0; j < mesh[i].length; j++) {
|
|||
|
if (mesh[i][j] == null) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
mesh[i][j].paint(g, matrix);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Создать набор моделей в виде текста
|
|||
|
* @param pix массив цветов
|
|||
|
* @param w ширина массива
|
|||
|
* @param h высота
|
|||
|
*/
|
|||
|
private void createMeshes(int[] pix, int w, int h) {
|
|||
|
mesh = new Mesh[h][w];
|
|||
|
|
|||
|
boolean[] medianColor = getMedian(pix);
|
|||
|
|
|||
|
for (int i = 0; i < h; i++) {
|
|||
|
|
|||
|
// mesh[i] = new Mesh[h];
|
|||
|
for (int j = 0; j < w; j++) {
|
|||
|
|
|||
|
// Пропускаем фоновые пиксели
|
|||
|
if (!medianColor[i * w + j]) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
int meshColor = Main.COLORS[Util.random(0, Main.MAX_COLORS)];
|
|||
|
|
|||
|
mesh[i][j] = new Box(Main.BOX_SIZE).getBox(meshColor);
|
|||
|
|
|||
|
int x = (j - w / 2) * Main.BOX_SIZE;
|
|||
|
int y = (i - h / 2) * Main.BOX_SIZE;
|
|||
|
|
|||
|
mesh[i][j].move(x, -y, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Получить картинку с текстом
|
|||
|
* @param text текст
|
|||
|
* @param bgcolor цвет фона
|
|||
|
* @param textcolor цвет текста
|
|||
|
* @return картинка с текстом
|
|||
|
*/
|
|||
|
private Image getImageFromText(String text, int bgcolor, int textcolor) {
|
|||
|
Font smallFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
|
|||
|
int width = smallFont.stringWidth(text);
|
|||
|
int height = smallFont.getHeight();
|
|||
|
Image out = Image.createImage(width, height);
|
|||
|
Graphics g = out.getGraphics();
|
|||
|
|
|||
|
g.setColor(bgcolor);
|
|||
|
g.fillRect(0, 0, width, height);
|
|||
|
g.setFont(smallFont);
|
|||
|
g.setColor(textcolor);
|
|||
|
g.drawString(text, 0, 0, 20);
|
|||
|
|
|||
|
return out;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Получить черно-белую матрицу по усреднённому цвету
|
|||
|
* @param pix массив цветов
|
|||
|
* @return усреднённый цвет
|
|||
|
*/
|
|||
|
private boolean[] getMedian(int[] pix) {
|
|||
|
float size = pix.length;
|
|||
|
float mr = 0;
|
|||
|
|
|||
|
for (int i = 0; i < pix.length; i++) {
|
|||
|
float r = ((pix[i] >> 16) & 0xFF);
|
|||
|
|
|||
|
r = r + ((pix[i] >> 8) & 0xFF);
|
|||
|
r = r + (pix[i] & 0xFF);
|
|||
|
r /= 3;
|
|||
|
mr = mr + (r / size);
|
|||
|
}
|
|||
|
|
|||
|
boolean[] out = new boolean[pix.length];
|
|||
|
|
|||
|
for (int i = 0; i < pix.length; i++) {
|
|||
|
float r = ((pix[i] >> 16) & 0xFF);
|
|||
|
|
|||
|
r = r + ((pix[i] >> 8) & 0xFF);
|
|||
|
r = r + (pix[i] & 0xFF);
|
|||
|
r /= 3;
|
|||
|
out[i] = (r > mr);
|
|||
|
}
|
|||
|
|
|||
|
return out;
|
|||
|
}
|
|||
|
}
|