diff --git a/src/Engine.java b/src/Engine.java
index cb88997..551bbec 100644
--- a/src/Engine.java
+++ b/src/Engine.java
@@ -1,5 +1,5 @@
-//import com.nokia.mid.ui.DeviceControl;
+import com.nokia.mid.ui.DeviceControl;
import java.util.Calendar;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
@@ -8,242 +8,375 @@ import javax.microedition.lcdui.Image;
public class Engine extends Canvas implements Runnable {
- Graphics G;
- Image I, img;
- private int S = Math.abs(VisualME.midlet.Sw);
- private int N = Math.abs(VisualME.midlet.Nw);
- private int K = Math.abs(VisualME.midlet.Kw);
- private float L = (float) 1/VisualME.midlet.Lw;
- private int T = Math.abs(VisualME.midlet.Tw);
- private int U = Math.abs(10-VisualME.midlet.Uw);
+ private static final int MAX_DELTA_COLOR = 20;
- private boolean bl = VisualME.midlet.bl;
- private boolean dl = VisualME.midlet.dl;
- private boolean vl = VisualME.midlet.vl;
- private boolean fl = VisualME.midlet.fl;
- private boolean vbl = VisualME.midlet.vbl;
- public boolean rb, gb, bb;
- public static float x, y, tx, ty, k, d, len;
- public int rc = 0, gc = 0, bc = 0, rgb = 1, fr = 1, ar = 1;
- float[] a = new float[N];
- public Thread thr = new Thread(this);
+ /** Размер экрана */
+ private int width, height;
+
+ /** Полупрозрачные пиксели фона для эффекта Motion-Blur */
+ private int[] backgroundPixels;
- Engine() {
-
+ private Graphics G;
+ private Image I, img;
+
+ // Основные параметры визуализации
+ private int numberOfBranches;
+ private int flexibility;
+ private int transparency;
+ private float screenProportions;
+ private int filterType;
+ private int shapeType;
+ private int speed;
+
+ // Параметры состояний
+ private boolean backlightEnabled;
+ private boolean filtersAutochange;
+ private boolean shapeAutochange;
+ private boolean vibrateEnabled;
+ private boolean visualizationAutochange;
+
+ // Состояния изменения компонент цвета
+ private boolean redChange, greenChange, blueChange;
+
+ private boolean running;
+ private int rc, gc, bc;
+ private int rgbChangeMode, visualMode, colorMode;
+ private int startAngleInt;
+ private float angleDelta;// Угол между ветвями
+ private float len; // Длина одного звена
+ private float[] angles;
+
+ private Random random;
+ private Thread thr;
+
+ public Engine() {
setFullScreenMode(true);
- I = Image.createImage(getWidth(), getHeight());
- G = I.getGraphics();
- thr.start();
+ width = getWidth();
+ height = getHeight();
+ // Инициализация важных объектов и переменных
+ initObjects();
+ // Инициализация переменных
+ initVariables();
}
-
+
+ private void initObjects() {
+ // Заполняем фоновые пиксели
+ backgroundPixels = new int[width * (height / 2)];
+
+ // Двойная буферизация
+ I = Image.createImage(width, height);
+ G = I.getGraphics();
+ G.setColor(0);
+ G.fillRect(0, 0, width, height);
+
+ random = new Random();
+ }
+
+ private void initVariables() {
+ // Цвета (переходы)
+ rc = 0;
+ gc = 0;
+ bc = 0;
+ // Режим изменения цветов (переходов)
+ rgbChangeMode = 1;
+ // Вид визуализации
+ visualMode = 1;
+ // Режим переходов цветов
+ colorMode = 1;
+
+ // Начальный угол поворота ветви
+ startAngleInt = random.nextInt(360);
+ }
+
+ /**
+ * Запуск потока
+ */
+ public void start() {
+ // Вычисляем необходимые параметры
+ if (width > height) {
+ len = height / screenProportions / flexibility;
+ } else {
+ len = width / screenProportions / flexibility;
+ }
+ running = true;
+ if (thr == null) {
+ thr = new Thread(this);
+ thr.start();
+ }
+ }
+
+ //
+ /**
+ * Установка фильтра.
+ * @param filterType
+ */
+ public void setFilterType(int filterType) {
+ this.filterType = filterType;
+ }
+ /**
+ * Установка гибкости ветвей.
+ * @param flexibility значение гибкости.
+ */
+ public void setFlexibility(int flexibility) {
+ this.flexibility = flexibility;
+ angles = new float[flexibility];
+ }
+
+ /**
+ * Установка количества ветвей.
+ * @param numberOfBranches
+ */
+ public void setNumberOfBranches(int numberOfBranches) {
+ this.numberOfBranches = numberOfBranches;
+ // Угол между ветвями
+ angleDelta = (float) (2 * Math.PI / numberOfBranches);
+ }
+
+ /**
+ * Установка пропорций экрана и визуализации.
+ * @param screenProportions
+ */
+ public void setScreenProportions(int screenProportions) {
+ this.screenProportions = 4f / screenProportions;
+ }
+
+ /**
+ * Установка отображаемых фигур (линия, текст, и т.д.).
+ * @param shapeType
+ */
+ public void setShapeType(int shapeType) {
+ this.shapeType = shapeType;
+ }
+
+ /**
+ * Установка скорости анимации.
+ * @param speed
+ */
+ public void setSpeed(int speed) {
+ this.speed = 10 - speed;
+ }
+
+ /**
+ * Установка коэффициента прозрачности для эффекта Motion-Blur.
+ * @param transparency прозрачность от 0 до 100
+ */
+ public void setTransparency(int transparency) {
+ this.transparency = (100 - transparency);
+ int pixel = (this.transparency << 24);
+ for (int i = 0; i < backgroundPixels.length; i++) {
+ backgroundPixels[i] = pixel;
+ }
+ }
+
+
+ /**
+ * Установка постоянной подсветки.
+ * @param backlightEnabled
+ */
+ public void setBacklightEnabled(boolean backlightEnabled) {
+ this.backlightEnabled = backlightEnabled;
+ }
+
+ /**
+ * Установка автосмены фильтров.
+ * @param filtersAutochange
+ */
+ public void setFiltersAutochange(boolean filtersAutochange) {
+ this.filtersAutochange = filtersAutochange;
+ }
+
+ /**
+ * Установка автосмены фигур.
+ * @param shapeAutochange
+ */
+ public void setShapeAutochange(boolean shapeAutochange) {
+ this.shapeAutochange = shapeAutochange;
+ }
+
+ /**
+ * Установка вибрации.
+ * @param vibrateEnabled
+ */
+ public void setVibrateEnabled(boolean vibrateEnabled) {
+ this.vibrateEnabled = vibrateEnabled;
+ }
+
+ /**
+ * Установка автосмены визуализации.
+ * @param visualizationAutochange
+ */
+ public void setVisualizationAutochange(boolean visualizationAutochange) {
+ this.visualizationAutochange = visualizationAutochange;
+ }
+ //
+
public void paint(Graphics g) {
setFullScreenMode(true);
- filters(g);
- paintQ(G);
- repaint();
- }
- public void paintQ(Graphics grf) {
- //setFullScreenMode(true);
- rgb(grf);
- visual(grf);
+ rgb();
+ visual(G);
+ filters(g);
}
public void keyPressed(int key) {
- if (key == KEY_NUM3 && fr == 6) {
- fr = 1;
- } else if (key == KEY_NUM1 && fr == 1) {
- fr = 6;
- } else if (key == KEY_NUM3 && fr < 6) {
- fr++;
- } else if (key == KEY_NUM1 && fr > 1) {
- fr--;
- } else if (key == KEY_NUM7 && ar == 14) {
- ar = 1;
- } else if (key == KEY_NUM9 && ar == 1) {
- ar = 14;
- } else if (key == KEY_NUM7 && ar < 14) {
- ar++;
- } else if (key == KEY_NUM9 && ar > 1) {
- ar--;
- } else if (key == -7) {
+ if (key == KEY_NUM1) {
+ visualMode--;
+ if (visualMode < 1) visualMode = 6;
+ } else if (key == KEY_NUM3) {
+ visualMode++;
+ if (visualMode > 6) visualMode = 1;
+ }
+ else if (key == KEY_NUM7) {
+ colorMode++;
+ if (colorMode > MAX_DELTA_COLOR) colorMode = 1;
+ } else if (key == KEY_NUM9) {
+ colorMode--;
+ if (colorMode < 1) colorMode = MAX_DELTA_COLOR;
+ }
+ else if (key == -7) {
VisualME.midlet.destroyApp(true);
} else if (key == KEY_NUM0) {
- VisualME.midlet.display.setCurrent(VisualME.midlet.Param);
+ running = false;
+ VisualME.midlet.showSettingsForm();
}
}
public void run() {
while (true) {
- Random PRND = new Random();
- try {
- Thread.sleep((PRND.nextLong() >>> 1) % 30);
- } catch (InterruptedException ex) {}
- int i = (PRND.nextInt() >>> 1) % 256;
- if (dl) {
- if (i>15 && i<18) ar = (PRND.nextInt() >>> 1) % 14;
- if (i>115 && i<118) fr = (PRND.nextInt() >>> 1) % 6+1;
+ if (running) {
+ int i = random.nextInt(256);
+ if (visualizationAutochange) {
+ if (i == 16) colorMode = random.nextInt(MAX_DELTA_COLOR);
+ else if (i == 119) visualMode = random.nextInt(6) + 1;
+ }
+ if (backlightEnabled) DeviceControl.setLights(0, 100);
+ if (filtersAutochange) if (i == 26) filterType = random.nextInt(7);
+ if (shapeAutochange) if (i == 36) shapeType = random.nextInt(4);
+ if (vibrateEnabled) if (i >= 30 && i <= 32) VisualME.midlet.display.vibrate(random.nextInt(200));
+
+ repaint();
}
- if (bl) if (i>165 && i<218) VisualME.midlet.display.flashBacklight(2);
- if (vl) if (i>25 && i<28) VisualME.midlet.Cw = (PRND.nextInt() >>> 1) % 7;
- if (fl) if (i>35 && i<38) T = (PRND.nextInt() >>> 1) % 4;
- if (vbl) if (i>28 && i<34) VisualME.midlet.display.vibrate((PRND.nextInt() >>> 1) % 200);
+
+ try {
+ Thread.sleep(20);
+ } catch (InterruptedException ex) {}
}
}
- public static String time2fileName() {
- String h, m, s;
- Calendar cal = Calendar.getInstance();
- h = String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
- if (h.length() == 1) {
- h = "0" + h;
- }
- m = String.valueOf(cal.get(Calendar.MINUTE));
- if (m.length() == 1) {
- m = "0" + m;
- }
- s = String.valueOf(cal.get(Calendar.SECOND));
- if (s.length() == 1) {
- s = "0" + s;
- }
- return (h+":"+m+":"+s);
- }
-
- public void filters(Graphics g) {
- if (VisualME.midlet.Cw==0) {
- g.drawImage(I, 0, 0, 20); // просто
- }
- if (VisualME.midlet.Cw==1) {
- img = Lib_effects.effect(I, 0);// Обесцветить
- g.drawImage(img, 0, 0, 20);
- }
- if (VisualME.midlet.Cw==2) {
- img = Lib_effects.effect(I, 1);// Негатив
- g.drawImage(img, 0, 0, 20);
- }
- if (VisualME.midlet.Cw==3) {
- img = Lib_effects.effect(I, 5);// Сглаживание
- g.drawImage(img, 0, 0, 20);
- }
- if (VisualME.midlet.Cw==4) {
- img = Lib_effects.effect(I, 4);// Cепия
- g.drawImage(img, 0, 0, 20);
- }
- if (VisualME.midlet.Cw==5) {
- img = Lib_effects.effect(I, 7);// Ч/б
- g.drawImage(img, 0, 0, 20);
- }
- if (VisualME.midlet.Cw==6) {
- img = Lib_effects.contrast(I, 255, 120, 120, 120);// Ч/б
+ private void filters(Graphics g) {
+ if (filterType == 0) {
+ // Без фильтров
+ g.drawImage(I, 0, 0, 20);
+ } else {
+ img = Lib_effects.effect(I, filterType);
g.drawImage(img, 0, 0, 20);
}
}
- public void rgb(Graphics grf) {
- if (rgb == 1) {
+ private void rgb() {
+ if (rgbChangeMode == 1) {
rc++;
if (rc > 253) {
rc--;
- rb = true;
+ redChange = true;
}
- if (rb == true) {
+ if (redChange == true) {
rc = rc - 2;
}
- if (rc < 18 && rb == true) {
+ if (rc < 18 && redChange == true) {
rc = 0;
- rb = false;
- rgb++;
+ redChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 2) {
+ else if (rgbChangeMode == 2) {
gc++;
if (gc > 253) {
gc--;
- gb = true;
+ greenChange = true;
}
- if (gb == true) {
+ if (greenChange == true) {
gc = gc - 2;
}
- if (gc < 18 && gb == true) {
+ if (gc < 18 && greenChange == true) {
gc = 0;
- gb = false;
- rgb++;
+ greenChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 3) {
+ else if (rgbChangeMode == 3) {
bc++;
if (bc > 253) {
bc--;
- bb = true;
+ blueChange = true;
}
- if (bb == true) {
+ if (blueChange == true) {
bc = bc - 2;
}
- if (bc < 18 && bb == true) {
+ if (bc < 18 && blueChange == true) {
bc = 0;
- bb = false;
- rgb++;
+ blueChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 4) {
- //System.out.println("rc="+rc+" gc= "+gc);
+ else if (rgbChangeMode == 4) {
rc++;
gc++;
if (rc > 253) {
rc--;
gc--;
- rb = true;
+ redChange = true;
}
- if (rb == true) {
+ if (redChange == true) {
rc = rc - 2;
gc = gc - 2;
}
- if (rc < 18 && rb == true) {
+ if (rc < 18 && redChange == true) {
rc = 0;
gc = 0;
- rb = false;
- rgb++;
+ redChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 5) {
+ else if (rgbChangeMode == 5) {
rc++;
bc++;
if (rc > 253) {
rc--;
bc--;
- rb = true;
+ redChange = true;
}
- if (rb == true) {
+ if (redChange == true) {
rc = rc - 2;
bc = bc - 2;
}
- if (rc < 18 && rb == true) {
+ if (rc < 18 && redChange == true) {
rc = 0;
bc = 0;
- rb = false;
- rgb++;
+ redChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 6) {
+ else if (rgbChangeMode == 6) {
gc++;
bc++;
if (gc > 253) {
gc--;
bc--;
- gb = true;
+ greenChange = true;
}
- if (gb == true) {
+ if (greenChange == true) {
gc = gc - 2;
bc = bc - 2;
}
- if (gc < 18 && gb == true) {
+ if (gc < 18 && greenChange == true) {
gc = 0;
bc = 0;
- gb = false;
- rgb++;
+ greenChange = false;
+ rgbChangeMode++;
}
}
- if (rgb == 7) {
+ else if (rgbChangeMode == 7) {
rc++;
gc++;
bc++;
@@ -251,134 +384,143 @@ public class Engine extends Canvas implements Runnable {
rc--;
gc--;
bc--;
- gb = true;
+ greenChange = true;
}
- if (gb == true) {
+ if (greenChange == true) {
rc = rc - 2;
gc = gc - 2;
bc = bc - 2;
}
- if (gc < 18 && gb == true) {
+ if (gc < 18 && greenChange == true) {
rc = 0;
gc = 0;
bc = 0;
- gb = false;
- rgb = 1;
+ greenChange = false;
+ rgbChangeMode = 1;
}
}
}
- public void visual(Graphics grf) {
- int width = grf.getClipWidth();
- int height = grf.getClipHeight();
- if (width > height) {
- len = (float) (height / L / N);
- } else {
- len = (float) (width / L / N);
+ private void visual(Graphics grf) {
+ if (random.nextInt(20) == 5) startAngleInt = random.nextInt(360);
+
+ // Начальный угол
+ float startAngle = (float) (startAngleInt * Math.PI / 180);
+
+ // Интерполяция углов между щупальцами
+ angles[0] = (float) (angles[0] + Math.sin(startAngle) / speed);
+ for (int i = 1; i < flexibility; i++) {
+ angles[i] = (float) (angles[i] + (angles[i - 1] - angles[i]) * 0.1);
}
- Random RND = new Random();
- //a[0]=(float) Math.abs(RND.nextFloat()*18);
- k = (float) (Math.abs(RND.nextFloat() * 360) * Math.PI / 180);
- float r50 = (float) (Math.abs(RND.nextFloat()) * 50);
- d = (float) (Math.PI * 2 / S);
- if (r50 < 2) {
- k = (float) (Math.abs(RND.nextFloat() * 1440) * Math.PI / 180);
- }
- a[0] = (float) (a[0] + Math.sin(k)/U);
- for (int i = 1; i < N; i++) {
- a[i] = (float) (a[i] + (a[i - 1] - a[i]) * 0.1);
-
- }
- for (int j = 0; j < S; j++) {
- x = (float) (0.5 * width);
- y = (float) (0.5 * height);
- for (int i = 1; i < N; i++) {
- grf.setColor(rc, gc, bc);
- if (fr == 1) {
- tx = (float) (x + Math.cos(j * d + a[1]) * len);
- ty = (float) (y + Math.sin(j * d + a[i]) * len);
- x = x + (float) (Math.cos(j * d + a[i]) * len);
+
+ String currentTime = "";
+ if (shapeType == 3) currentTime = time2fileName();
+ for (int j = 0; j < numberOfBranches; j++) {
+ float x = 0.5f * width;
+ float y = 0.5f * height;
+ float tx = 0, ty = 0;
+ final float temp1 = j * angleDelta + angles[1];
+ for (int i = 1; i < flexibility; i++) {
+ final float temp2 = j * angleDelta + angles[i];
+ if (visualMode == 1) {
+ tx = (float) (x + Math.cos(temp1) * len);
+ ty = (float) (y + Math.sin(temp2) * len);
+ x = x + (float) (Math.cos(temp2) * len);
}
- if (fr == 2) {
- tx = (float) (x + Math.sin(j * d + a[i]) * len);
- ty = (float) (y + Math.cos(j * d + a[i]) * len);
+ else if (visualMode == 2) {
+ tx = (float) (x + Math.sin(temp2) * len);
+ ty = (float) (y + Math.cos(temp2) * len);
}
- if (fr == 3) {
- tx = (float) (x + Math.tan(j * d + a[1]) * len);
- ty = (float) (y + Math.cos(j * d + a[i]) * len);
- y = y - (float) (Math.sin(j * d + a[i]) * len);
+ else if (visualMode == 3) {
+ tx = (float) (x + Math.tan(temp1) * len);
+ ty = (float) (y + Math.cos(temp2) * len);
+ y = y - (float) (Math.sin(temp2) * len);
}
- if (fr == 4) {
- tx = (float) (x + Math.tan(j * d + a[1]) * len);
- ty = (float) (y + Math.cos(j * d + a[i]) * len);
- x = y - (float) (Math.sin(j * d + a[i]) * len);
+ else if (visualMode == 4) {
+ tx = (float) (x + Math.tan(temp1) * len);
+ ty = (float) (y + Math.cos(temp2) * len);
+ x = y - (float) (Math.sin(temp2) * len);
}
- if (fr == 5) {
- tx = (float) (x + Math.tan(j * d + a[1]) * len);
- ty = (float) (y + Math.cos(j * d + a[i]) * len);
- x = (float) (x * ty * d + a[i] - (float) (Math.sin(j * d + a[i]) * len));
+ else if (visualMode == 5) {
+ tx = (float) (x + Math.tan(temp1) * len);
+ ty = (float) (y + Math.cos(temp2) * len);
+ x = x * ty * angleDelta + angles[i] - (float) (Math.sin(temp2) * len);
}
- if (fr == 6) {
- tx = (float) (x + Math.cos(j * d + a[1]) * len);
- ty = (float) (y + Math.sin(j * d + a[1]) * len);
- x = x + (float) (Math.sin(j * d + a[i]) * len);
- y = y + (float) (Math.cos(j * d + a[i]) * len);
- tx = (float) (x + Math.cos(j * d + a[1]) * len);
- ty = (float) (y + Math.sin(j * d + a[1]) * len);
- x = x + (float) (Math.sin(j * d + a[i]) * len);
- y = y + (float) (Math.cos(j * d + a[i]) * len);
+ else if (visualMode == 6) {
+ x = x + (float) (Math.sin(temp2) * len);
+ y = y + (float) (Math.cos(temp2) * len);
+ tx = (float) (x + Math.cos(temp1) * len);
+ ty = (float) (y + Math.sin(temp1) * len);
+ x = x + (float) (Math.sin(temp2) * len);
+ y = y + (float) (Math.cos(temp2) * len);
}
- if (ar == 2) {
- grf.setColor(255, (255 - 255 * i / N), 0);
+
+ if (colorMode == 1) grf.setColor(rc, gc, bc);
+ else {
+ final int deltaColor = 255 - 255 * i / flexibility;
+ if (colorMode == 2) grf.setColor(deltaColor, 0, 255);
+ else if (colorMode == 3) grf.setColor(deltaColor, 255, 0);
+ else if (colorMode == 4) grf.setColor(deltaColor, 255, 255);
+
+ else if (colorMode == 5) grf.setColor(0, deltaColor, 255);
+ else if (colorMode == 6) grf.setColor(255, deltaColor, 0);
+ else if (colorMode == 7) grf.setColor(255, deltaColor, 255);
+
+ else if (colorMode == 8) grf.setColor(0, 255, deltaColor);
+ else if (colorMode == 9) grf.setColor(255, 0, deltaColor);
+ else if (colorMode == 10) grf.setColor(255, 255, deltaColor);
+
+ else if (colorMode == 11) grf.setColor(deltaColor, deltaColor, 0);
+ else if (colorMode == 12) grf.setColor(deltaColor, deltaColor, 255);
+
+ else if (colorMode == 13) grf.setColor(deltaColor, 0, deltaColor);
+ else if (colorMode == 14) grf.setColor(deltaColor, 255, deltaColor);
+
+ else if (colorMode == 15) grf.setColor(0, deltaColor, deltaColor);
+ else if (colorMode == 16) grf.setColor(255, deltaColor, deltaColor);
+
+ else if (colorMode == 17) grf.setColor(rc, deltaColor, 255);
+ else if (colorMode == 18) grf.setColor(255, gc, deltaColor);
+ else if (colorMode == 19) grf.setColor(255, deltaColor, bc);
+
+ else if (colorMode == 20) grf.setColor(bc, rc, deltaColor);
}
- if (ar == 3) {
- grf.setColor(rc, (255 - 255 * i / N), 255);
- }
- if (ar == 4) {
- grf.setColor((255 - 255 * i / N), 255, 0);
- }
- if (ar == 5) {
- grf.setColor((255 - 255 * i / N), (255 - 255 * i / N), 255);
- }
- if (ar == 6) {
- grf.setColor((255 - 255 * i / N), 255, 255);
- }
- if (ar == 7) {
- grf.setColor(0, 255, (255 - 255 * i / N));
- }
- if (ar == 8) {
- grf.setColor(255, gc, (255 - 255 * i / N));
- }
- if (ar == 9) {
- grf.setColor(255, (255 - 255 * i / N), (255 - 255 * i / N));
- }
- if (ar == 10) {
- grf.setColor(rc, (255 - 255 * i / N), 0);
- }
- if (ar == 11) {
- grf.setColor(255, (255 - 255 * i / N), 255);
- }
- if (ar == 12) {
- grf.setColor((255 - 255 * i / N), 0, 255);
- }
- if (ar == 13) {
- grf.setColor((255 - 255 * i / N), 255 * i / N, 0);
- }
- if (ar == 14) {
- grf.setColor(bc, 255, (255 - 255 * i / N));
- }
- if (T==0) grf.drawLine((int) x, (int) y, (int) tx, (int) ty);
- if (T==1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360);
- if (T==2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y);
- if (T==3) grf.drawString(time2fileName(),(int) x, (int) y, 20);
+
+ if (shapeType == 0) grf.drawLine((int) x, (int) y, (int) tx, (int) ty);
+ else if (shapeType == 1) grf.fillArc((int) tx, (int) ty, (int) x, (int) y, 0, 360);
+ else if (shapeType == 2) grf.fillRect((int) tx, (int) ty, (int) x, (int) y);
+ else if (shapeType == 3) grf.drawString(currentTime,(int) x, (int) y, 20);
+
x = tx;
y = ty;
}
}
- int[] pixelArray = new int[width * height];
- for (int io = 0; io < pixelArray.length; io++) {
- pixelArray[io] = (int) (100-K << 24) | (0 << 16) | (0 << 8) | 0;
- }
- grf.drawRGB(pixelArray, 0, width, 0, 0, width, height, true);
+ // Motion-Blur
+ grf.drawRGB(backgroundPixels, 0, width, 0, 0, width, height/2, true);
+ grf.drawRGB(backgroundPixels, 0, width, 0, height/2, width, height/2, true);
+ }
+
+ private String time2fileName() {
+ Calendar cal = Calendar.getInstance();
+ StringBuffer time = new StringBuffer();
+
+ // Час
+ int value = cal.get(Calendar.HOUR_OF_DAY);
+ if (value < 10) time.append(0);
+ time.append(value);
+ time.append(':');
+
+ // Минута
+ value = cal.get(Calendar.MINUTE);
+ if (value < 10) time.append(0);
+ time.append(value);
+ time.append(':');
+
+ // Секунда
+ value = cal.get(Calendar.SECOND);
+ if (value < 10) time.append(0);
+ time.append(value);
+
+ return time.toString();
}
}
diff --git a/src/Lib_effects.java b/src/Lib_effects.java
index c886107..a76bee0 100644
--- a/src/Lib_effects.java
+++ b/src/Lib_effects.java
@@ -1,568 +1,140 @@
+import javax.microedition.lcdui.Image;
-import java.util.Random;
-import javax.microedition.lcdui.*;
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
/**
*
* @author aNNiMON
*/
public class Lib_effects {
- private final static int CALPHA = 0, CRED = 1, CGREEN = 2, CBLUE = 3;
- private static int[] cshift = {24, 16, 8, 0};
- private static int[] cmask = {~((1 << 24) - 1), (1 << 24) - (1 << 16), (1 << 16) - 256, 255};
+ private static final int SEPIA_DEPTH = 40;
+ private static final int BLUR_VALUE = 10;
- public static int red(int v) {return (v&cmask[CRED])>>>cshift[CRED];}
- public static int green(int v) {return (v&cmask[CGREEN])>>>cshift[CGREEN];}
- public static int blue(int v) {return (v&cmask[CBLUE])>>>cshift[CBLUE];}
- public static int alpha(int v) {return (v&cmask[CALPHA])>>>cshift[CALPHA];}
+ private static final int
+ DECOLOR = 1,
+ NEGATIVE = 2,
+ SEPIA = 3,
+ BLACK_N_WHITE = 4,
+ DRUGS = 5,
+ SOLARIZE = 6,
+ BASIC_EFFECTS_END = 6,
+
+ BLUR = 7;
- public static int avg(int v, int r, int g, int b, int s) {
- return (r * red(v) + g * green(v) + b * blue(v)) / s;
- }
-
- public static int avg(int v) {
- return avg(v, 299, 587, 114, 1000);
- }
-
- public static Image band(Image img, int[] colors) {
- int l = colors.length;
- int[] data = new int[img.getWidth() * img.getHeight()];
- img.getRGB(data, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- for (int i = 0; i < data.length; i++) {
- data[i] = colors[(avg(data[i]) * l) / 256];
- }
- return Image.createRGBImage(data, img.getWidth(), img.getHeight(), true);
- }
-
- public static int[][] Array2d(int[] d1, int w, int h) {
- int[][] d2 = new int[h][w];
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- d2[i][j]=d1[i*h+j];
- }
- }
- return d2;
- }
-
- public static int[] Array1d(int[][] d1, int w, int h) {
- int[] d2 = new int[h*w];
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- d2[i*h+j]=d1[i][j];
- }
- }
- return d2;
- }
-
-
- public static Image fill(Image img, int x, int y, int r, int g, int b) {
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- int[][] ar2 = new int[img.getHeight()][img.getWidth()]; // фракталы еще добавить
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
- }
-
- public static int color(int alpha, int r, int g, int b) {
- int result = (alpha << 24) + (r << 16) + (g << 8) + b;
- return result;
- }
-
public static Image effect(Image img, int mode) {
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- if (mode == 5) { // Сглаживание
- int imwi = img.getWidth();
- for (int io = 1 + imwi; io < pixel.length - 1 - imwi; io++) {
- int qa = (pixel[io] >> 24) & 0xff;
-
- int qr00 = (pixel[io - 1 - imwi] >> 16) & 0xff;
- int qg00 = (pixel[io - 1 - imwi] >> 8) & 0xff;
- int qb00 = pixel[io - 1 - imwi] & 0xff;
-
- int qr01 = (pixel[io - imwi] >> 16) & 0xff;
- int qg01 = (pixel[io - imwi] >> 8) & 0xff;
- int qb01 = pixel[io - imwi] & 0xff;
-
- int qr02 = (pixel[io + 1 - imwi] >> 16) & 0xff;
- int qg02 = (pixel[io + 1 - imwi] >> 8) & 0xff;
- int qb02 = pixel[io + 1 - imwi] & 0xff;
-
- int qr10 = (pixel[io - 1] >> 16) & 0xff;
- int qg10 = (pixel[io - 1] >> 8) & 0xff;
- int qb10 = pixel[io - 1] & 0xff;
-
- int qr11 = (pixel[io] >> 16) & 0xff;
- int qg11 = (pixel[io] >> 8) & 0xff;
- int qb11 = pixel[io] & 0xff;
-
- int qr12 = (pixel[io + 1] >> 16) & 0xff;
- int qg12 = (pixel[io + 1] >> 8) & 0xff;
- int qb12 = pixel[io + 1] & 0xff;
-
- int qr20 = (pixel[io - 1 + imwi] >> 16) & 0xff;
- int qg20 = (pixel[io - 1 + imwi] >> 8) & 0xff;
- int qb20 = pixel[io - 1 + imwi] & 0xff;
-
- int qr21 = (pixel[io + imwi] >> 16) & 0xff;
- int qg21 = (pixel[io + imwi] >> 8) & 0xff;
- int qb21 = pixel[io + imwi] & 0xff;
-
- int qr22 = (pixel[io + 1 + imwi] >> 16) & 0xff;
- int qg22 = (pixel[io + 1 + imwi] >> 8) & 0xff;
- int qb22 = pixel[io + 1 + imwi] & 0xff;
- qr11 = (qr00 + qr01 + qr02 + qr10 + qr11 + qr12 + qr20 + qr21 + qr22) / 9;
- qg11 = (qg00 + qg01 + qg02 + qg10 + qg11 + qg12 + qg20 + qg21 + qg22) / 9;
- qb11 = (qb00 + qb01 + qb02 + qb10 + qb11 + qb12 + qb20 + qb21 + qb22) / 9;
- pixel[io] = (qa << 24) | (qr11 << 16) | (qg11 << 8) | qb11;
- }
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
+ final int width = img.getWidth();
+ final int height = img.getHeight();
+
+ int[] pixel = new int[width * height];
+ int[] lineRGB = new int[width];
+ for (int y = 0; y < height; y++) {
+ img.getRGB(lineRGB, 0, width, 0, y, width, 1);
+ System.arraycopy(lineRGB, 0, pixel, y*width, lineRGB.length);
}
+ lineRGB = null;
+ System.gc();
+
+
+
+ if (mode <= BASIC_EFFECTS_END) pixel = basicEffects(pixel, mode);
+ else if (mode == BLUR) pixel = boxBlurEffect(pixel, width, height);
+
+ return Image.createRGBImage(pixel, width, height, false);
+ }
+
+ private static int[] basicEffects(int[] pixel, int mode) {
for (int io = 0; io < pixel.length; io++) {
- int qa = (pixel[io] >> 24) & 0xff;
int qr = (pixel[io] >> 16) & 0xff;
int qg = (pixel[io] >> 8) & 0xff;
int qb = pixel[io] & 0xff;
- if (mode == 0) { // обесцвеч
- int qs = qr + qg + qb;
- qr = qs / 3;
- qg = qs / 3;
- qb = qs / 3;
- }
- if (mode == 1) { // негатив
+ if (mode == DECOLOR) { // обесцвеч
+ qr = (qr + qg + qb) / 3;
+ qb = qg = qr;
+ } else if (mode == NEGATIVE) { // негатив
qr = 255 - qr;
qg = 255 - qg;
qb = 255 - qb;
- }
- if (mode == 2) { // затемнение
- qr = qr - 20 < 0 ? 0 : qr - 20;
- qg = qg - 20 < 0 ? 0 : qg - 20;
- qb = qb - 20 < 0 ? 0 : qb - 20;
- }
- if (mode == 3) { // осветление
- qr = qr + 20 > 255 ? 255 : qr + 20;
- qg = qg + 20 > 255 ? 255 : qg + 20;
- qb = qb + 20 > 255 ? 255 : qb + 20;
- }
- if (mode == 4) { // сепия
- int depth = 40;
+ } else if (mode == SEPIA) { // сепия
qb = (qr + qg + qb) / 3;
- qr = qb + depth * 2;
- qg = qb + depth;
- if (qr > 255) {
- qr = 255;
- }
- if (qg > 255) {
- qg = 255;
- }
- }
- if (mode == 6) { // Искажение
- Random rnd = new Random();
- if (((rnd.nextInt() >>> 1) % 10) < 4 && io > 0) {
- pixel[io-1] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
- qa = (pixel[io - 1] >> 24) & 0xff;
- qr = (pixel[io - 1] >> 16) & 0xff;
- qg = (pixel[io - 1] >> 8) & 0xff;
- qb = pixel[io - 1] & 0xff;
- }
- }
- if (mode == 7) { // ч/б
+ qr = qb + SEPIA_DEPTH * 2;
+ qg = qb + SEPIA_DEPTH;
+ if (qr > 255) qr = 255;
+ if (qg > 255) qg = 255;
+ } else if (mode == BLACK_N_WHITE) { // ч/б
if ((qr+qg+qb)/3 > 128) {
qr=qg=qb=255;
}else {
qr=qg=qb=0;
}
+ } else if (mode == DRUGS) {
+ int gray = 255 - (qr + qg + qb)/3;
+ qr += gray;
+ qg += gray;
+ qb += gray;
+ } else if (mode == SOLARIZE) {
+ qr = (qr > 127) ? (2 * (qr - 128)) : (2 * (127 - qr));
+ qg = (qg > 127) ? (2 * (qg - 128)) : (2 * (127 - qg));
+ qb = (qb > 127) ? (2 * (qb - 128)) : (2 * (127 - qb));
}
- pixel[io] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
+ pixel[io] = (/*pixel[io] & */0xFF000000) |
+ (qr << 16) | (qg << 8) | qb;
}
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
+ return pixel;
}
-
- public static Image change(Image img, int ch, int val) {
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- for (int io = 0; io < pixel.length; io++) {
- int qa = (pixel[io] >> 24) & 0xff;
- int qr = (pixel[io] >> 16) & 0xff;
- int qg = (pixel[io] >> 8) & 0xff;
- int qb = pixel[io] & 0xff;
-
- if (ch == 0) { // alpha
- qa = qa + val;
- if (qa > 255) {
- qa = 255;
- }
- if (qa < 0) {
- qa = 0;
- }
+
+ private static int[] boxBlurEffect(int[] pix, int w, int h) {
+ int[] pixel = new int[pix.length];
+ pixel = BoxBlur(pix, pixel, w, h, BLUR_VALUE);
+ pix = BoxBlur(pixel, pix, h, w, BLUR_VALUE);
+ return pix;
+ }
+
+ private static int[] BoxBlur(int[] in, int[] out, int width, int height, int radius) {
+ if(radius<=0) return in;
+ int widthMinus1 = width - 1;
+ int tableSize = 2 * radius + 1;
+ int divideLength = 256 * tableSize;
+ int[] divide = new int[divideLength];
+ for (int i = 0; i < divideLength; i++) {
+ divide[i] = i / tableSize;
+ }
+ int inIndex = 0;
+ for (int y = 0; y < height; y++) {
+ int outIndex = y;
+ int ta = 0, tr = 0, tg = 0, tb = 0;
+ for (int i = -radius; i <= radius; i++) {
+ int rgb = in[inIndex + clamp(i, 0, widthMinus1)];
+ ta += (rgb >> 24) & 0xff;
+ tr += (rgb >> 16) & 0xff;
+ tg += (rgb >> 8) & 0xff;
+ tb += rgb & 0xff;
}
+ for (int x = 0; x < width; x++) {
+ //try {
+ out[outIndex] = (divide[ta] << 24) | (divide[tr] << 16) | (divide[tg] << 8) | divide[tb];
+ //} catch (Exception e) {
+ // out[outIndex] = 0;
+ //}
+ int i1 = x + radius + 1;
+ if (i1 > widthMinus1) i1 = widthMinus1;
+ int i2 = x - radius;
+ if (i2 < 0) i2 = 0;
+ int rgb1 = in[inIndex + i1];
+ int rgb2 = in[inIndex + i2];
- if (ch == 1) { // red
- qr = qr + val;
- if (qr > 255) {
- qr = 255;
- }
- if (qr < 0) {
- qr = 0;
- }
+ ta += ((rgb1 >> 24) & 0xff) - ((rgb2 >> 24) & 0xff);
+ tr += ((rgb1 & 0xff0000) - (rgb2 & 0xff0000)) >> 16;
+ tg += ((rgb1 & 0xff00) - (rgb2 & 0xff00)) >> 8;
+ tb += (rgb1 & 0xff) - (rgb2 & 0xff);
+ outIndex += height;
}
-
- if (ch == 2) { // green
- qg = qg + val;
- if (qg > 255) {
- qg = 255;
- }
- if (qg < 0) {
- qg = 0;
- }
- }
-
- if (ch == 3) { // blue
- qb = qb + val;
- if (qb > 255) {
- qb = 255;
- }
- if (qb < 0) {
- qb = 0;
- }
- }
-
- pixel[io] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
+ inIndex += width;
}
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
- }
-
- public static int get(Image img, int x, int y, int ch) {
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
-
- int qa = (pixel[y * img.getWidth() + x] >> 24) & 0xff;
- int qr = (pixel[y * img.getWidth() + x] >> 16) & 0xff;
- int qg = (pixel[y * img.getWidth() + x] >> 8) & 0xff;
- int qb = pixel[y * img.getWidth() + x] & 0xff;
-
- if (ch == 0) { // alpha
- return qa;
- }
-
- if (ch == 1) { // red
- return qr;
- }
-
- if (ch == 2) { // green
- return qg;
- }
-
- if (ch == 3) { // blue
- return qb;
- }
- return 0;
- }
-
- public static Image saturation(Image img, int ch) {
- int[] pixelArray = new int[img.getWidth() * img.getHeight()];
- int Amount = ch;
- img.getRGB(pixelArray, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- for (int io = 0; io < pixelArray.length; io++) {
- int qa = (pixelArray[io] >> 24) & 0xff;
- int qr = (pixelArray[io] >> 16) & 0xff;
- int qg = (pixelArray[io] >> 8) & 0xff;
- int qb = pixelArray[io] & 0xff;
- int gray = (qr + qg + qb) / 3;
- qr = (gray + (((qr - gray) * Amount) / 255));
- qg = (gray + (((qg - gray) * Amount) / 255));
- qb = (gray + (((qb - gray) * Amount) / 255));
- pixelArray[io] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
- }
- return Image.createRGBImage(pixelArray, img.getWidth(), img.getHeight(), true);
+ return out;
}
- public static Image changecolor(Image img, int r1, int g1, int b1, int a2, int r2, int g2, int b2) {
- int[] pixelArray = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixelArray, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- for (int io = 0; io < pixelArray.length; io++) {
- int qa = (pixelArray[io] >> 24) & 0xff;
- int qr = (pixelArray[io] >> 16) & 0xff;
- int qg = (pixelArray[io] >> 8) & 0xff;
- int qb = pixelArray[io] & 0xff;
- if (qr==r1 && qg==g1 && qb==b1 && qa!=0) {
- qa=a2; qr=r2; qg=g2; qb=b2;
- }
- pixelArray[io] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
- }
- return Image.createRGBImage(pixelArray, img.getWidth(), img.getHeight(), true);
+ private static int clamp(int x, int a, int b) {
+ return (x < a) ? a : (x > b) ? b : x;
}
-
-
-
- public static Image brightness(Image img, int difa, int difr, int difg, int difb) {
- return linear(img, 1, difr, 1, difg, 1, difb, 1, difa);
- }
-
- public static Image contrast(Image img, double sr,double sg,double sb,double sa) {
- return linear(img, sr,128-128*sr,sg,128-128*sg,sb,128-128*sb,sa,128-128*sa);
- }
-
- public static Image gamma(Image img, double ga, double gr, double gg, double gb) {
- int v, r, g, b, a;
- gr=1/gr;gg=1/gg;gb=1/gb;ga=1/ga;
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- for (int i = 0; i < pixel.length; i++) {
- v = pixel[i];
- r = range(0, 256, 255 * pow((red(v) / 255.0), gr));
- g = range(0, 256, 255 * pow((green(v) / 255.0), gg));
- b = range(0, 256, 255 * pow((blue(v) / 255.0), gb));
- a = range(0, 256, 255 * pow((alpha(v) / 255.0), ga));
- pixel[i] = color(a, r, g, b);
- }
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
- }
-
- private static Image linear(Image img, double sr, double dr, double sg, double dg,
- double sb, double db, double sa, double da) {
- int[] pixel = new int[img.getWidth() * img.getHeight()];
- img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
- int v, r, g, b, a;
- for (int i = 0; i < pixel.length; i++) {
- v = pixel[i];
- r = range(0, 256, red(v) * sr + dr);
- g = range(0, 256, green(v) * sg + dg);
- b = range(0, 256, blue(v) * sb + db);
- a = range(0, 256, alpha(v) * sa + da);
- pixel[i] = color(a, r, g, b);
- }
- return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
- }
-
- private static int range(int min, int max, double dv) {
- int v = (int) dv;
- if (v < min) {
- return min;
- }
- return (v >= max) ? max - 1 : (int) v;
- }
-
- /** Square root from 3 */
- final static public double SQRT3 = 1.732050807568877294;
- /** Log10 constant */
- final static public double LOG10 = 2.302585092994045684;
- /** ln(0.5) constant */
- final static public double LOGdiv2 = -0.6931471805599453094;
- //
- static public double acos(double x)
- {
- double f=asin(x);
- if(f==Double.NaN)
- return f;
- return Math.PI/2-f;
- }
-
- static public double asin(double x)
- {
- if( x<-1. || x>1. ) return Double.NaN;
- if( x==-1. ) return -Math.PI/2;
- if( x==1 ) return Math.PI/2;
- return atan(x/Math.sqrt(1-x*x));
- }
-
- static public double atan(double x)
- {
- boolean signChange=false;
- boolean Invert=false;
- int sp=0;
- double x2, a;
- // check up the sign change
- if(x<0.)
- {
- x=-x;
- signChange=true;
- }
- // check up the invertation
- if(x>1.)
- {
- x=1/x;
- Invert=true;
- }
- // process shrinking the domain until xMath.PI/12)
- {
- sp++;
- a=x+SQRT3;
- a=1/a;
- x=x*SQRT3;
- x=x-1;
- x=x*a;
- }
- // calculation core
- x2=x*x;
- a=x2+1.4087812;
- a=0.55913709/a;
- a=a+0.60310579;
- a=a-(x2*0.05160454);
- a=a*x;
- // process until sp=0
- while(sp>0)
- {
- a=a+Math.PI/6;
- sp--;
- }
- // invertation took place
- if(Invert) a=Math.PI/2-a;
- // sign change took place
- if(signChange) a=-a;
- //
- return a;
- }
-
- static public double atan2(double y, double x)
- {
- // if x=y=0
- if(y==0. && x==0.)
- return 0.;
- // if x>0 atan(y/x)
- if(x>0.)
- return atan(y/x);
- // if x<0 sign(y)*(pi - atan(|y/x|))
- if(x<0.)
- {
- if(y<0.)
- return -(Math.PI-atan(y/x));
- else
- return Math.PI-atan(-y/x);
- }
- // if x=0 y!=0 sign(y)*pi/2
- if(y<0.)
- return -Math.PI/2.;
- else
- return Math.PI/2.;
- }
-
- static public double exp(double x)
- {
- if(x==0.)
- return 1.;
- //
- double f=1;
- long d=1;
- double k;
- boolean isless=(x<0.);
- if(isless)
- x=-x;
- k=x/d;
- //
- for(long i=2; i<50; i++)
- {
- f=f+k;
- k=k*x/i;
- }
- //
- if(isless)
- return 1/f;
- else
- return f;
- }
-
- static private double _log(double x)
- {
- if(!(x>0.))
- return Double.NaN;
- //
- double f=0.0;
- //
- int appendix=0;
- while(x>0.0 && x<=1.0)
- {
- x*=2.0;
- appendix++;
- }
- //
- x/=2.0;
- appendix--;
- //
- double y1=x-1.;
- double y2=x+1.;
- double y=y1/y2;
- //
- double k=y;
- y2=k*y;
- //
- for(long i=1; i<50; i+=2)
- {
- f+=k/i;
- k*=y2;
- }
- //
- f*=2.0;
- for(int i=0; i0.))
- return Double.NaN;
- //
- if(x==1.0)
- return 0.0;
- // Argument of _log must be (0; 1]
- if (x>1.)
- {
- x=1/x;
- return -_log(x);
- };
- //
- return _log(x);
- }
-
- static public double log10(double x)
- {
- return log(x)/LOG10;
- }
-
-
- static public double pow(double x, double y)
- {
- if(y==0.)
- return 1.;
- if(y==1.)
- return x;
- if(x==0.)
- return 0.;
- if(x==1.)
- return 1.;
- //
- long l=(long)Math.floor(y);
- boolean integerValue=(y==(double)l);
- //
- if(integerValue)
- {
- boolean neg=false;
- if(y<0.)
- neg=true;
- //
- double result=x;
- for(long i=1; i<(neg?-l:l); i++)
- result=result*x;
- //
- if(neg)
- return 1./result;
- else
- return result;
- }
- else
- {
- if(x>0.)
- return exp(y*log(x));
- else
- return Double.NaN;
- }
- }
+
}
diff --git a/src/Rms.java b/src/Rms.java
deleted file mode 100644
index a599df9..0000000
--- a/src/Rms.java
+++ /dev/null
@@ -1,61 +0,0 @@
-import java.io.*;
-import javax.microedition.rms.*;
-
-/**
- *
- * @author aNNiMON
- */
-public class Rms {
-
- private static final String rmsName = "VisualME";
- private static RecordStore rmsStore;
- public static boolean firstStart = true;
- public static String language = "en";
-
- public static void saveOptions() {
- if (rmsStore != null) {
- byte[] options = null;
- try {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(baos);
- dos.writeBoolean(firstStart);
- dos.writeUTF (language);
- dos.flush();
- options = baos.toByteArray();
- dos.close();
- rmsStore.setRecord(1, options, 0, options.length);
- } catch (InvalidRecordIDException ridex) {
- try {
- rmsStore.addRecord(options, 0, options.length);
- } catch (RecordStoreException ex) {
- }
- } catch (Exception ex) {
- }
- }
- if (rmsStore != null) {
- try {
- rmsStore.closeRecordStore();
- rmsStore = null;
- } catch (RecordStoreException ex) {
- }
- }
- }
-
- public static void restoreOptions() {
- try {
- rmsStore = RecordStore.openRecordStore(rmsName, true);
- } catch (RecordStoreException ex) {
- rmsStore = null;
- }
- if (rmsStore != null) {
- try {
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(rmsStore.getRecord(1)));
- firstStart = dis.readBoolean();
- language = dis.readUTF ();
- dis.close();
- } catch (Exception ex) {
- }
- }
- }
-}
-
diff --git a/src/VisualME.java b/src/VisualME.java
index 44388a9..22b4dc9 100644
--- a/src/VisualME.java
+++ b/src/VisualME.java
@@ -1,94 +1,141 @@
-
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class VisualME extends MIDlet implements CommandListener {
+ private static final String TITLE = "VisualME 2.1";
+
public Display display;
public static VisualME midlet;
- private TextField tf1 = new TextField("Кол-во веток", "15", 3, TextField.NUMERIC);
- private TextField tf2 = new TextField("Кол-во звеньев (гибкость)", "20", 3, TextField.NUMERIC);
- private TextField tf3 = new TextField("Размытие", "60", 2, TextField.NUMERIC);
- private TextField tf4 = new TextField("Пропорции экрана", "1", 1, TextField.NUMERIC);
- private TextField tf5 = new TextField("Скорость", "1", 1, TextField.NUMERIC);
- private ChoiceGroup ch1 = new ChoiceGroup("", Choice.MULTIPLE);
- private ChoiceGroup ch2 = new ChoiceGroup("Фильтры", Choice.POPUP);
- private ChoiceGroup ch3 = new ChoiceGroup("Фигуры", Choice.POPUP);
- private Command okCommand = new Command("Ok", Command.OK, 0);
- public Form Param;
- public static int cd, ii;
- public int Sw, Nw, Kw, Lw, Cw, Tw, Uw;
- public boolean bl, dl, vl, fl, vbl;
+
+ private Engine visual;
+ private Form settingsForm;
+
+ private TextField branchesTF, flexibilityTF, transparencyTF, screenProportionsTF, speedTF;
+ private ChoiceGroup parametersCG, filtersCG, shapesCG;
+ private Command okCommand;
public VisualME() {
+ init();
+ visual = new Engine();
+ }
+
+ private void init() {
midlet = this;
+ display = Display.getDisplay(this);
+
+ okCommand = new Command("Ok", Command.OK, 0);
+ initTextFields();
+ initParametersChoiceGroup();
+ initFiltersChoiceGroup();
+ initShapesChoiceGroup();
+ initSettingsForm();
+ }
+
+ public void startApp() {
+ display.setCurrent(settingsForm);
}
- public void pauseApp() {
- Rms.saveOptions();
- }
+ public void pauseApp() {}
public void destroyApp(boolean unconditional) {
- if(Rms.firstStart) Rms.firstStart=false;
- Rms.saveOptions();
notifyDestroyed();
}
- public void startApp() {
- Rms.restoreOptions();
- Param = new Form("Visual by aNNiMON");
- Param.append(tf1);
- Param.append(tf2);
- Param.append(tf3);
- Param.append(tf4);
- Param.append(tf5);
- ch1.append("Подсветка", null);
- ch1.append("Автосмена визуализации", null);
- ch1.append("Автосмена эффектов", null);
- ch1.append("Автосмена фигур", null);
- ch1.append("Вибрация", null);
- ch1.setSelectedIndex(0, false);
- ch1.setSelectedIndex(1, false);
- ch1.setSelectedIndex(2, false);
- ch1.setSelectedIndex(3, false);
- ch1.setSelectedIndex(4, false);
- ch2.append("Нет", null);
- ch2.append("Обесцветить", null);
- ch2.append("Негатив", null);
- ch2.append("Сглаживание", null);
- ch2.append("Cепия", null);
- ch2.append("Черно-белый", null);
- ch2.append("Яркость", null);
- ch3.append("Линии", null);
- ch3.append("Эллипсы", null);
- ch3.append("Квадраты", null);
- ch3.append("Время", null);
- Param.append(ch1);
- Param.append(ch2);
- Param.append(ch3);
- Param.addCommand(okCommand);
- Param.setCommandListener(this);
- display = Display.getDisplay(this);
- display.setCurrent(Param);
- }
-
- public void commandAction(Command c, Displayable d) {
- if (d == Param && c == okCommand) {
- Cw = ((ChoiceGroup) ch2).getSelectedIndex();
- Tw = ((ChoiceGroup) ch3).getSelectedIndex();
- bl = ch1.isSelected(0);
- dl = ch1.isSelected(1);
- vl = ch1.isSelected(2);
- fl = ch1.isSelected(3);
- vbl = ch1.isSelected(4);
- Sw = (int) Integer.parseInt(tf1.getString());
- Nw = (int) Integer.parseInt(tf2.getString());
- Kw = (int) Integer.parseInt(tf3.getString());
- Lw = (int) Integer.parseInt(tf4.getString());
- Uw = (int) Integer.parseInt(tf5.getString());
- Engine visual = new Engine();
- display = Display.getDisplay(this);
+ public void commandAction(Command cmd, Displayable displ) {
+ if ( (displ == settingsForm) && (cmd == okCommand) ) {
+ boolean backlightEnabled = parametersCG.isSelected(0);
+ boolean visualizationAutochange = parametersCG.isSelected(1);
+ boolean filtersAutochange = parametersCG.isSelected(2);
+ boolean shapeAutochange = parametersCG.isSelected(3);
+ boolean vibrateEnabled = parametersCG.isSelected(4);
+
+ int filterType = filtersCG.getSelectedIndex();
+ int shapeType = shapesCG.getSelectedIndex();
+
+ int numberOfBranches = Integer.parseInt(branchesTF.getString());
+ int flexibility = Integer.parseInt(flexibilityTF.getString());
+ int transparency = Integer.parseInt(transparencyTF.getString());
+ int screenProportions = Integer.parseInt(screenProportionsTF.getString());
+ int speed = Integer.parseInt(speedTF.getString());
+
+ visual.setBacklightEnabled(backlightEnabled);
+ visual.setFilterType(filterType);
+ visual.setFiltersAutochange(filtersAutochange);
+ visual.setFlexibility(flexibility);
+ visual.setNumberOfBranches(numberOfBranches);
+ visual.setScreenProportions(screenProportions);
+ visual.setShapeAutochange(shapeAutochange);
+ visual.setShapeType(shapeType);
+ visual.setSpeed(speed);
+ visual.setTransparency(transparency);
+ visual.setVibrateEnabled(vibrateEnabled);
+ visual.setVisualizationAutochange(visualizationAutochange);
+
+ visual.start();
+
display.setCurrent(visual);
}
}
+
+ public void showSettingsForm() {
+ display.setCurrent(settingsForm);
+ }
+
+
+ private void initSettingsForm() {
+ settingsForm = new Form(TITLE);
+ settingsForm.append(branchesTF);
+ settingsForm.append(flexibilityTF);
+ settingsForm.append(transparencyTF);
+ settingsForm.append(screenProportionsTF);
+ settingsForm.append(speedTF);
+ settingsForm.append(parametersCG);
+ settingsForm.append(filtersCG);
+ settingsForm.append(shapesCG);
+ settingsForm.addCommand(okCommand);
+ settingsForm.setCommandListener(this);
+ }
+
+ private void initShapesChoiceGroup() {
+ shapesCG = new ChoiceGroup("Фигуры", Choice.POPUP);
+ shapesCG.append("Линии", null);
+ shapesCG.append("Эллипсы", null);
+ shapesCG.append("Квадраты", null);
+ shapesCG.append("Время", null);
+ }
+
+ private void initFiltersChoiceGroup() {
+ filtersCG = new ChoiceGroup("Фильтры", Choice.POPUP);
+ filtersCG.append("Нет", null);
+ filtersCG.append("Обесцветить", null);
+ filtersCG.append("Негатив", null);
+ filtersCG.append("Cепия", null);
+ filtersCG.append("Черно-белый", null);
+ filtersCG.append("Глюки", null);
+ filtersCG.append("Передержка", null);
+ filtersCG.append("Размытие", null);
+ }
+
+ private void initParametersChoiceGroup() {
+ parametersCG = new ChoiceGroup("", Choice.MULTIPLE);
+ parametersCG.append("Подсветка", null);
+ parametersCG.append("Автосмена визуализации", null);
+ parametersCG.append("Автосмена эффектов", null);
+ parametersCG.append("Автосмена фигур", null);
+ parametersCG.append("Вибрация", null);
+ parametersCG.setSelectedIndex(0, false);
+ parametersCG.setSelectedIndex(1, false);
+ parametersCG.setSelectedIndex(2, false);
+ parametersCG.setSelectedIndex(3, false);
+ parametersCG.setSelectedIndex(4, false);
+ }
+
+ private void initTextFields() {
+ branchesTF = new TextField("Кол-во веток", "15", 3, TextField.NUMERIC);
+ flexibilityTF = new TextField("Кол-во звеньев (гибкость)", "20", 3, TextField.NUMERIC);
+ transparencyTF = new TextField("Размытие", "60", 2, TextField.NUMERIC);
+ screenProportionsTF = new TextField("Пропорции экрана", "4", 1, TextField.NUMERIC);
+ speedTF = new TextField("Скорость", "1", 1, TextField.NUMERIC);
+ }
}
\ No newline at end of file