Updates to graphic engines and incognites options

This commit is contained in:
Andrea Cavalli 2017-05-05 22:27:11 +02:00
parent 6e17aa4660
commit 72e151b1e4
35 changed files with 2096 additions and 551 deletions

View File

@ -1,4 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/java/org/warp/picalculator/gui/expression/blocks/BlockParenthesis.java=UTF-8
encoding//src/main/java/org/warp/picalculator/math/MathematicalSymbols.java=UTF-8
encoding/<project>=UTF-8

View File

@ -34,6 +34,11 @@
<artifactId>pi4j-core</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>1.15</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>

View File

@ -344,6 +344,41 @@ public class Keyboard {
Keyboard.keyPressed(Key.NONE);
}
break;
case com.jogamp.newt.event.KeyEvent.VK_UP:
case KeyEvent.VK_UP:
//UP
row = 1;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = true;
if (!Keyboard.shift && !Keyboard.alpha) {
Keyboard.keyPressed(Key.UP);
} else {
Keyboard.keyPressed(Key.NONE);
}
break;
case com.jogamp.newt.event.KeyEvent.VK_DOWN:
case KeyEvent.VK_DOWN:
//DOWN
row = 3;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = true;
if (!Keyboard.shift && !Keyboard.alpha) {
Keyboard.keyPressed(Key.DOWN);
} else {
Keyboard.keyPressed(Key.NONE);
}
break;
case (short) 12:
//DOWN
row = 2;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = true;
if (!Keyboard.shift && !Keyboard.alpha) {
Keyboard.keyPressed(Key.OK);
} else {
Keyboard.keyPressed(Key.NONE);
}
break;
case com.jogamp.newt.event.KeyEvent.VK_NUMPAD4:
case KeyEvent.VK_NUMPAD4:
if (!Keyboard.shift && !Keyboard.alpha) {
@ -608,6 +643,30 @@ public class Keyboard {
} else {
keyPressed(Key.RIGHT);
}
} else if (row == 1 && col == 4) {
if (shift) {
keyPressed(Key.NONE);
} else if (alpha) {
keyPressed(Key.NONE);
} else {
keyPressed(Key.UP);
}
} else if (row == 2 && col == 4) {
if (shift) {
keyPressed(Key.NONE);
} else if (alpha) {
keyPressed(Key.NONE);
} else {
keyPressed(Key.OK);
}
} else if (row == 3 && col == 4) {
if (shift) {
keyPressed(Key.NONE);
} else if (alpha) {
keyPressed(Key.NONE);
} else {
keyPressed(Key.DOWN);
}
} else if (row == 3 && col == 4) {
if (shift) {
keyPressed(Key.NONE);

View File

@ -3,11 +3,7 @@ package org.warp.picalculator.device;
import org.warp.picalculator.device.Keyboard.Key;
public interface KeyboardEventListener {
public default boolean keyPressed(Key k) {
return false;
}
public abstract boolean keyPressed(Key k);
public default boolean keyReleased(Key k) {
return false;
}
public abstract boolean keyReleased(Key k);
}

View File

@ -12,7 +12,8 @@ import org.warp.picalculator.gui.graphicengine.RenderingLoop;
import org.warp.picalculator.gui.graphicengine.Renderer;
import org.warp.picalculator.gui.graphicengine.cpu.CPUEngine;
import org.warp.picalculator.gui.graphicengine.gpu.GPUEngine;
import org.warp.picalculator.gui.graphicengine.headless.HeadlessEngine;
import org.warp.picalculator.gui.graphicengine.headless256.Headless8Engine;
import org.warp.picalculator.gui.graphicengine.headless8.Headless256Engine;
import org.warp.picalculator.gui.graphicengine.BinaryFont;
import org.warp.picalculator.gui.graphicengine.Skin;
import org.warp.picalculator.gui.screens.Screen;
@ -84,9 +85,14 @@ public final class DisplayManager implements RenderingLoop {
Utils.debug.println("Using CPU Graphic Engine");
return d;
}
d = new HeadlessEngine();
d = new Headless256Engine();
if (d.isSupported()) {
System.err.println("Using Headless Engine! This is a problem! No other graphic engines are available.");
System.err.println("Using Headless 256 Engine! This is a problem! No other graphic engines are available.");
return d;
}
d = new Headless8Engine();
if (d.isSupported()) {
System.err.println("Using Headless basic Engine! This is a problem! No other graphic engines are available.");
return d;
}
throw new UnsupportedOperationException("No graphic engines available.");

View File

@ -5,13 +5,21 @@ public class Caret {
private int pos;
private int remaining;
private CaretState state;
private int[] lastSize;
private int[] lastLocation;
public Caret(CaretState state, int pos) {
this(state, pos, new int[]{0, 0}, new int[]{2, 5});
}
public Caret(CaretState state, int pos, int[] lastLocation, int[] lastSize) {
this.state = state;
this.pos = pos;
remaining = pos;
this.lastLocation = lastLocation;
this.lastSize = lastSize;
}
public void skip(int i) {
remaining -= i;
}
@ -49,4 +57,23 @@ public class Caret {
public void resetRemaining() {
remaining = pos;
}
public void setLastLocation(int x, int y) {
lastLocation[0]=x;
lastLocation[1]=y;
}
public int[] getLastLocation() {
return new int[]{lastLocation[0],lastLocation[1]};
}
public void setLastSize(int w, int h) {
lastSize[0]=w;
lastSize[1]=h;
}
public int[] getLastSize() {
return new int[]{lastSize[0],lastSize[1]};
}
}

View File

@ -0,0 +1,41 @@
package org.warp.picalculator.gui.expression;
import java.io.Serializable;
import org.warp.picalculator.device.KeyboardEventListener;
import org.warp.picalculator.gui.GraphicalElement;
import org.warp.picalculator.gui.expression.blocks.Block;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Renderer;
public abstract class ExtraMenu<T extends Block> implements Serializable, KeyboardEventListener {
private static final long serialVersionUID = -6944683477814944299L;
public ExtraMenu(T block) {
this.block = block;
this.location = new int[]{0,0};
this.width = 0;
this.height = 0;
}
public final T block;
protected int width;
protected int height;
protected int[] location;
public abstract void draw(GraphicEngine ge, Renderer r, Caret caret);
public abstract void open();
public abstract void close();
public boolean beforeRender(float delta, Caret caret) {
int[] l = caret.getLastLocation();
int[] cs = caret.getLastSize();
location[0]=l[0]-block.getWidth()/2-width/2;
location[1]=l[1]+cs[1];
return false;
}
}

View File

@ -2,6 +2,7 @@ package org.warp.picalculator.gui.expression.blocks;
import org.warp.picalculator.gui.GraphicalElement;
import org.warp.picalculator.gui.expression.Caret;
import org.warp.picalculator.gui.expression.ExtraMenu;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Renderer;
@ -28,6 +29,8 @@ public abstract class Block implements GraphicalElement {
public abstract boolean delBlock(Caret caret);
public abstract Block getBlock(Caret caret);
@Override
public abstract void recomputeDimensions();
@ -55,4 +58,8 @@ public abstract class Block implements GraphicalElement {
public abstract void setSmall(boolean small);
public abstract int getClassID();
public ExtraMenu getExtraMenu() {
return null;
}
}

View File

@ -32,6 +32,11 @@ public class BlockChar extends Block {
return false;
}
@Override
public Block getBlock(Caret caret) {
return null;
}
@Override
public void recomputeDimensions() {
width = BlockContainer.getDefaultCharWidth(small);

View File

@ -125,6 +125,7 @@ public class BlockContainer implements GraphicalElement {
}
if (withBorder && content.size() == 0) {
r.glColor(BlockContainer.getDefaultColor());
r.glDrawLine(x + paddingX, y, x + paddingX + width - 1, y);
r.glDrawLine(x + paddingX, y, x + paddingX, y + height - 1);
r.glDrawLine(x + paddingX + width - 1, y, x + paddingX + width - 1, y + height - 1);
@ -190,6 +191,28 @@ public class BlockContainer implements GraphicalElement {
return removed;
}
public Block getBlock(Caret caret) {
boolean found = false;
Block block = null;
int pos = 0;
for (final Block b : content) {
caret.skip(1);
pos++;
final int deltaCaret = caret.getRemaining();
block= b.getBlock(caret);
found = found | (block != null);
if (caret.getRemaining() == 0 || (found == false && deltaCaret >= 0 && caret.getRemaining() < 0)) {
block = getBlockAt(pos - 1);
found = true;
return block;
}
}
caret.skip(1);
return block;
}
@Override
public void recomputeDimensions() {
int l = 0; //Line
@ -282,6 +305,8 @@ public class BlockContainer implements GraphicalElement {
if (caret.getState() == CaretState.VISIBLE_ON) {
r.glColor(getDefaultColor());
r.glFillColor(x, y, small?2:3, height);
caret.setLastLocation(x, y);
caret.setLastSize(small?2:3, height);
}
}

View File

@ -26,6 +26,7 @@ public class BlockDivision extends Block {
BlockContainer.getDefaultFont(small).use(ge);
r.glColor(BlockContainer.getDefaultColor());
containerUp.draw(ge, r, x + 1 + paddingLeftUpper, y, caret);
r.glColor(BlockContainer.getDefaultColor());
r.glDrawLine(x, y + h1 + 1, x + width - 1, y + h1 + 1);
containerDown.draw(ge, r, x + 1 + paddingLeftLower, y + h1 + 3, caret);
}
@ -52,6 +53,17 @@ public class BlockDivision extends Block {
return removed;
}
@Override
public Block getBlock(Caret caret) {
Block bl = null;
bl = containerUp.getBlock(caret);
if (bl != null) {
return bl;
}
bl = containerDown.getBlock(caret);
return bl;
}
@Override
public void recomputeDimensions() {
final int w1 = containerUp.getWidth();

View File

@ -7,6 +7,8 @@ import org.warp.picalculator.gui.graphicengine.Renderer;
public class BlockExponentialNotation extends BlockPower {
private int bw;
private int bh;
public static final int CLASS_ID = 0x00000006;
@Override
public void draw(GraphicEngine ge, Renderer r, int x, int y, Caret caret) {
@ -23,4 +25,9 @@ public class BlockExponentialNotation extends BlockPower {
bh = BlockContainer.getDefaultCharHeight(small);
this.width+=bw;
}
@Override
public int getClassID() {
return CLASS_ID;
}
}

View File

@ -52,6 +52,11 @@ public class BlockParenthesis extends Block {
return removed;
}
@Override
public Block getBlock(Caret caret) {
return containerNumber.getBlock(caret);
}
@Override
public void recomputeDimensions() {
chw = BlockContainer.getDefaultCharWidth(small);

View File

@ -43,6 +43,11 @@ public class BlockPower extends Block {
}
return removed;
}
@Override
public Block getBlock(Caret caret) {
return containerExponent.getBlock(caret);
}
@Override
public void recomputeDimensions() {

View File

@ -51,6 +51,11 @@ public class BlockSquareRoot extends Block {
}
return removed;
}
@Override
public Block getBlock(Caret caret) {
return containerNumber.getBlock(caret);
}
@Override
public void recomputeDimensions() {

View File

@ -0,0 +1,190 @@
package org.warp.picalculator.gui.expression.blocks;
import org.warp.picalculator.device.Keyboard.Key;
import org.warp.picalculator.gui.DisplayManager;
import org.warp.picalculator.gui.expression.Caret;
import org.warp.picalculator.gui.expression.ExtraMenu;
import org.warp.picalculator.gui.graphicengine.BinaryFont;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Renderer;
import org.warp.picalculator.math.functions.Variable;
import org.warp.picalculator.math.functions.Variable.V_TYPE;
public class BlockVariable extends Block {
public static final int CLASS_ID = 0x00000007;
private final char ch;
private final VariableMenu menu;
private V_TYPE type;
private int color;
public BlockVariable(char ch) {
this.ch = ch;
this.menu = new VariableMenu(this);
this.type = V_TYPE.UNKNOWN;
this.color = 0xFF304ffe;
recomputeDimensions();
}
@Override
public void draw(GraphicEngine ge, Renderer r, int x, int y, Caret caret) {
BlockContainer.getDefaultFont(small).use(ge);
r.glColor(color);
r.glDrawCharLeft(x, y, ch);
}
@Override
public boolean putBlock(Caret caret, Block newBlock) {
return false;
}
@Override
public boolean delBlock(Caret caret) {
return false;
}
@Override
public Block getBlock(Caret caret) {
return null;
}
@Override
public void recomputeDimensions() {
width = BlockContainer.getDefaultCharWidth(small);
height = BlockContainer.getDefaultCharHeight(small);
line = height / 2;
}
@Override
public void setSmall(boolean small) {
this.small = small;
recomputeDimensions();
}
public char getChar() {
return ch;
}
@Override
public int getClassID() {
return CLASS_ID;
}
@Override
public int computeCaretMaxBound() {
return 0;
}
@Override
public ExtraMenu<?> getExtraMenu() {
return menu;
}
public class VariableMenu extends ExtraMenu<BlockVariable> {
boolean mustRefresh = true;
String text = "";
private int color;
public VariableMenu(BlockVariable var) {
super(var);
}
private static final long serialVersionUID = 3941994107852212764L;
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public boolean keyPressed(Key k) {
switch (k) {
case LEFT:
case UP:
switch (block.type) {
case UNKNOWN:
block.type = V_TYPE.SOLUTION;
break;
case COEFFICIENT:
block.type = V_TYPE.UNKNOWN;
break;
case SOLUTION:
default:
block.type = V_TYPE.COEFFICIENT;
break;
}
break;
case RIGHT:
case DOWN:
case EQUAL:
case SIMPLIFY:
switch (block.type) {
case UNKNOWN:
block.type = V_TYPE.COEFFICIENT;
break;
case COEFFICIENT:
block.type = V_TYPE.SOLUTION;
break;
case SOLUTION:
default:
block.type = V_TYPE.UNKNOWN;
break;
}
break;
default:
return false;
}
mustRefresh = true;
return true;
}
@Override
public boolean keyReleased(Key k) {
return false;
}
@Override
public boolean beforeRender(float delta, Caret caret) {
if (super.beforeRender(delta, caret)||mustRefresh) {
mustRefresh = false;
switch (block.type) {
case UNKNOWN:
color = 0xFF304ffe;
break;
case COEFFICIENT:
color = 0xFFf50057;
break;
case SOLUTION:
default:
color = 0xFF64dd17;
break;
}
block.color = color;
text = block.type.toString();
BinaryFont f = BlockContainer.getDefaultFont(true);
width = 2+f.getStringWidth(text)+2;
height = 2+f.getCharacterHeight()+2;
return true;
}
return false;
}
@Override
public void draw(GraphicEngine ge, Renderer r, Caret caret) {
BlockContainer.getDefaultFont(true).use(ge);
r.glColor3f(1.0f, 1.0f, 1.0f);
r.glFillColor(location[0], location[1], width, height);
r.glColor(color);
r.glDrawStringCenter(location[0]+width/2, location[1]+2, text);
}
}
}

View File

@ -3,9 +3,11 @@ package org.warp.picalculator.gui.expression.containers;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.warp.picalculator.device.KeyboardEventListener;
import org.warp.picalculator.gui.GraphicalElement;
import org.warp.picalculator.gui.expression.Caret;
import org.warp.picalculator.gui.expression.CaretState;
import org.warp.picalculator.gui.expression.ExtraMenu;
import org.warp.picalculator.gui.expression.blocks.Block;
import org.warp.picalculator.gui.expression.blocks.BlockContainer;
import org.warp.picalculator.gui.expression.layouts.InputLayout;
@ -23,6 +25,7 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
private float caretTime;
private int maxPosition = 0;
private boolean parsed = false;
private ExtraMenu<?> extra;
public InputContainer() {
caret = new Caret(CaretState.VISIBLE_ON, 0);
@ -51,12 +54,13 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
}
caretTime = 0;
caret.turnOn();
closeExtra();
}
public void typeChar(String c) {
typeChar(c.charAt(0));
}
public void del() {
caret.resetRemaining();
if (root.delBlock(caret)) {
@ -68,6 +72,13 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
}
caret.turnOn();
caretTime = 0;
closeExtra();
}
public Block getSelectedBlock() {
caret.resetRemaining();
return root.getBlock(caret);
}
public void moveLeft() {
@ -79,6 +90,7 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
}
caret.turnOn();
caretTime = 0;
closeExtra();
}
public void moveRight() {
@ -90,6 +102,7 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
}
caret.turnOn();
caretTime = 0;
closeExtra();
}
@Override
@ -128,6 +141,10 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
somethingChanged = true;
}
}
if (extra != null) {
somethingChanged = somethingChanged|extra.beforeRender(delta, caret);
}
return somethingChanged;
}
@ -146,6 +163,9 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
public void draw(GraphicEngine ge, Renderer r, int x, int y) {
caret.resetRemaining();
root.draw(ge, r, x, y, caret);
if (extra != null) {
extra.draw(ge, r, caret);
}
}
public void clear() {
@ -169,6 +189,7 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
}
caret.turnOn();
caretTime = 0;
closeExtra();
}
public void setParsed(boolean parsed) {
@ -187,4 +208,33 @@ public abstract class InputContainer implements GraphicalElement, InputLayout, S
public ObjectArrayList<Block> getContent() {
return root.getContent();
}
public void toggleExtra() {
if (extra == null) {
Block selectedBlock = getSelectedBlock();
if (selectedBlock != null) {
extra = selectedBlock.getExtraMenu();
extra.open();
}
} else {
extra.close();
extra = null;
}
}
public void closeExtra() {
if (extra != null) {
extra.close();
extra = null;
}
}
public boolean isExtraOpened() {
return extra != null;
}
public KeyboardEventListener getExtraKeyboardEventListener() {
return extra;
}
}

View File

@ -6,6 +6,7 @@ import org.warp.picalculator.gui.expression.blocks.BlockDivision;
import org.warp.picalculator.gui.expression.blocks.BlockParenthesis;
import org.warp.picalculator.gui.expression.blocks.BlockPower;
import org.warp.picalculator.gui.expression.blocks.BlockSquareRoot;
import org.warp.picalculator.gui.expression.blocks.BlockVariable;
import org.warp.picalculator.math.MathematicalSymbols;
public class NormalInputContainer extends InputContainer {
@ -52,6 +53,11 @@ public class NormalInputContainer extends InputContainer {
case '9':
return new BlockChar(c);
default:
for (char v : MathematicalSymbols.variables) {
if (c == v) {
return new BlockVariable(c);
}
}
return new BlockChar(c);
}
}

View File

@ -471,7 +471,6 @@ public class CPUEngine implements GraphicEngine {
@Override
public boolean isSupported() {
if (true) return false;
return GraphicsEnvironment.isHeadless() == false;
}

View File

@ -125,7 +125,6 @@ public class GPUEngine implements org.warp.picalculator.gui.graphicengine.Graphi
@Override
public boolean isSupported() {
if (true) return false;
boolean available = false;
boolean errored = false;
try {

View File

@ -242,11 +242,31 @@ class NEWTWindow implements GLEventListener {
row = 2;
col = 3;
Keyboard.debugKeysDown[row - 1][col - 1] = false;
break;
case KeyEvent.VK_RIGHT:
//RIGHT
row = 2;
col = 5;
Keyboard.debugKeysDown[row - 1][col - 1] = false;
break;
case KeyEvent.VK_UP:
//UP
row = 1;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = false;
break;
case KeyEvent.VK_DOWN:
//Down
row = 3;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = false;
break;
case (short) 12:
//Down
row = 2;
col = 4;
Keyboard.debugKeysDown[row - 1][col - 1] = false;
break;
}
}
});

View File

@ -1,115 +0,0 @@
package org.warp.picalculator.gui.graphicengine.headless;
import java.io.IOException;
import org.warp.picalculator.gui.graphicengine.Renderer;
import org.warp.picalculator.gui.graphicengine.RenderingLoop;
import org.warp.picalculator.gui.graphicengine.Skin;
public class HeadlessEngine implements org.warp.picalculator.gui.graphicengine.GraphicEngine {
private HeadlessRenderer r = new HeadlessRenderer();
private boolean stopped;
@Override
public int[] getSize() {
return new int[]{480, 320};
}
@Override
public boolean isInitialized() {
return true;
}
@Override
public void setTitle(String title) {
// TODO Auto-generated method stub
}
@Override
public void setResizable(boolean r) {
// TODO Auto-generated method stub
}
@Override
public void setDisplayMode(int ww, int wh) {
// TODO Auto-generated method stub
}
@Override
public void create() {
// TODO Auto-generated method stub
}
@Override
public boolean wasResized() {
return false;
}
@Override
public int getWidth() {
return 480;
}
@Override
public int getHeight() {
return 320;
}
@Override
public void destroy() {
stopped = true;
}
@Override
public void start(RenderingLoop d) {
// TODO Auto-generated method stub
}
@Override
public void repaint() {
// TODO Auto-generated method stub
}
@Override
public Renderer getRenderer() {
return r;
}
@Override
public HeadlessFont loadFont(String file) throws IOException {
return new HeadlessFont();
}
@Override
public HeadlessSkin loadSkin(String file) throws IOException {
return new HeadlessSkin();
}
@Override
public void waitUntilExit() {
try {
do {
Thread.sleep(500);
} while (stopped==false);
} catch (final InterruptedException e) {
}
}
@Override
public boolean isSupported() {
return true;
}
@Override
public boolean doesRefreshPauses() {
return false;
}
}

View File

@ -1,135 +0,0 @@
package org.warp.picalculator.gui.graphicengine.headless;
import org.warp.picalculator.gui.graphicengine.Renderer;
public class HeadlessRenderer implements Renderer {
HeadlessFont currentFont;
@Override
public void glColor3i(int r, int gg, int b) {
// TODO Auto-generated method stub
}
@Override
public void glColor(int c) {
// TODO Auto-generated method stub
}
@Override
public void glColor4i(int red, int green, int blue, int alpha) {
// TODO Auto-generated method stub
}
@Override
public void glColor3f(float red, float green, float blue) {
// TODO Auto-generated method stub
}
@Override
public void glColor4f(float red, float green, float blue, float alpha) {
// TODO Auto-generated method stub
}
@Override
public void glClearColor4i(int red, int green, int blue, int alpha) {
// TODO Auto-generated method stub
}
@Override
public void glClearColor4f(float red, float green, float blue, float alpha) {
// TODO Auto-generated method stub
}
@Override
public int glGetClearColor() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void glClearColor(int c) {
// TODO Auto-generated method stub
}
@Override
public void glClear(int screenWidth, int screenHeight) {
// TODO Auto-generated method stub
}
@Override
public void glDrawLine(float x0, float y0, float x1, float y1) {
// TODO Auto-generated method stub
}
@Override
public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth,
float uvHeight) {
// TODO Auto-generated method stub
}
@Override
public void glFillColor(float x, float y, float width, float height) {
// TODO Auto-generated method stub
}
@Override
public void glDrawCharLeft(int x, int y, char ch) {
// TODO Auto-generated method stub
}
@Override
public void glDrawCharCenter(int x, int y, char ch) {
// TODO Auto-generated method stub
}
@Override
public void glDrawCharRight(int x, int y, char ch) {
// TODO Auto-generated method stub
}
@Override
public void glDrawStringLeft(float x, float y, String text) {
// TODO Auto-generated method stub
}
@Override
public void glDrawStringCenter(float x, float y, String text) {
// TODO Auto-generated method stub
}
@Override
public void glDrawStringRight(float x, float y, String text) {
// TODO Auto-generated method stub
}
@Override
public void glClearSkin() {
// TODO Auto-generated method stub
}
@Override
public HeadlessFont getCurrentFont() {
return currentFont;
}
}

View File

@ -1,28 +0,0 @@
package org.warp.picalculator.gui.graphicengine.headless;
import java.io.IOException;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Skin;
public class HeadlessSkin implements Skin {
@Override
public void load(String file) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void initialize(GraphicEngine d) {
// TODO Auto-generated method stub
}
@Override
public void use(GraphicEngine d) {
// TODO Auto-generated method stub
}
}

View File

@ -0,0 +1,174 @@
package org.warp.picalculator.gui.graphicengine.headless256;
import java.io.IOException;
import java.util.Arrays;
import java.util.logging.ConsoleHandler;
import org.fusesource.jansi.AnsiConsole;
import org.warp.picalculator.Main;
import org.warp.picalculator.gui.graphicengine.Renderer;
import org.warp.picalculator.gui.graphicengine.RenderingLoop;
import org.warp.picalculator.gui.graphicengine.Skin;
public class Headless8Engine implements org.warp.picalculator.gui.graphicengine.GraphicEngine {
private Headless8Renderer r = new Headless8Renderer();
private boolean stopped = true;
private RenderingLoop renderLoop;
protected static final int C_WIDTH = Main.screenSize[0]/2;//;60;
protected static final int C_HEIGHT = Main.screenSize[1]/3;//;40;
public static final int C_MUL_X = 2;//8;
public static final int C_MUL_Y = 3;//8;
private String title = Main.calculatorName;
@Override
public int[] getSize() {
ConsoleHandler ch = new ConsoleHandler();
return new int[]{C_WIDTH, C_HEIGHT};
}
@Override
public boolean isInitialized() {
return !stopped;
}
@Override
public void setTitle(String title) {
this.title = title;
}
@Override
public void setResizable(boolean r) {
// TODO Auto-generated method stub
}
@Override
public void setDisplayMode(int ww, int wh) {
// TODO Auto-generated method stub
}
@Override
public void create() {
AnsiConsole.systemInstall();
AnsiConsole.out.print(Headless8Renderer.ANSI_PREFIX+"?25l");
stopped = false;
}
@Override
public boolean wasResized() {
return false;
}
@Override
public int getWidth() {
return C_WIDTH*C_MUL_X;
}
@Override
public int getHeight() {
return C_HEIGHT*C_MUL_Y;
}
@Override
public void destroy() {
stopped = true;
}
@Override
public void start(RenderingLoop d) {
this.renderLoop = d;
final Thread th = new Thread(() -> {
try {
double extratime = 0;
while (!stopped) {
final long start = System.currentTimeMillis();
repaint();
final long end = System.currentTimeMillis();
final double delta = (end - start) / 1000d;
final int deltaInt = (int) Math.floor(delta);
final int extraTimeInt = (int) Math.floor(extratime);
if (extraTimeInt + deltaInt < 200) {
Thread.sleep(200 - (extraTimeInt + deltaInt));
extratime = 0;
} else {
extratime += delta - 200d;
}
}
} catch (final InterruptedException e) {
e.printStackTrace();
}
});
th.setName("Console rendering thread");
th.setDaemon(true);
th.start();
}
@Override
public void repaint() {
renderLoop.refresh();
r.curColor = 0x1C;
r.glDrawStringCenter((C_WIDTH*C_MUL_X)/2, 0, title);
AnsiConsole.out.print(Headless8Renderer.ANSI_PREFIX+"1;1H");
for (int y = 0; y < C_HEIGHT; y++) {
int precBgColor = -1;
int precFgColor = -1;
int curBgColor = -1;
int curFgColor = -1;
for (int x = 0; x < C_WIDTH; x++) {
curBgColor = (r.colorMatrix[x+y*C_WIDTH]&0xF0)>>4;
curFgColor = r.colorMatrix[x+y*C_WIDTH]&0x0F;
if (precBgColor != curBgColor) {
AnsiConsole.out.print(Headless8Renderer.ANSI_PREFIX+Headless8Renderer.ansiBgColorPrefix+Headless8Renderer.colorANSI[curBgColor]+Headless8Renderer.ansiColorSuffix);
}
if (precFgColor != curFgColor) {
AnsiConsole.out.print(Headless8Renderer.ANSI_PREFIX+Headless8Renderer.ansiFgColorPrefix+Headless8Renderer.colorANSI[curFgColor]+Headless8Renderer.ansiColorSuffix);
}
AnsiConsole.out.print(r.charmatrix[x+y*C_WIDTH]);
precBgColor = curBgColor;
precFgColor = curFgColor;
}
AnsiConsole.out.println();
}
}
@Override
public Renderer getRenderer() {
return r;
}
@Override
public Headless8Font loadFont(String file) throws IOException {
return new Headless8Font();
}
@Override
public Headless8Skin loadSkin(String file) throws IOException {
return new Headless8Skin(file);
}
@Override
public void waitUntilExit() {
try {
do {
Thread.sleep(500);
} while (stopped==false);
} catch (final InterruptedException e) {
}
}
@Override
public boolean isSupported() {
return true;
}
@Override
public boolean doesRefreshPauses() {
return true;
}
}

View File

@ -1,11 +1,11 @@
package org.warp.picalculator.gui.graphicengine.headless;
package org.warp.picalculator.gui.graphicengine.headless256;
import java.io.IOException;
import org.warp.picalculator.gui.graphicengine.BinaryFont;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
public class HeadlessFont implements BinaryFont {
public class Headless8Font implements BinaryFont {
@Override
public void load(String file) throws IOException {

View File

@ -0,0 +1,470 @@
package org.warp.picalculator.gui.graphicengine.headless256;
import org.warp.picalculator.Main;
import org.warp.picalculator.gui.graphicengine.Renderer;
public class Headless8Renderer implements Renderer {
Headless8Font currentFont;
protected char[] charmatrix = new char[Headless8Engine.C_WIDTH*Headless8Engine.C_HEIGHT];
protected int[] colorMatrix = new int[Headless8Engine.C_WIDTH*Headless8Engine.C_HEIGHT];
protected int clearColor = hexColor(0xc5, 0xc2, 0xaf);
protected int curColor = clearColor;
public Headless8Skin currentSkin;
public static final String ANSI_PREFIX = "\u001B[";
public static final String ansiFgColorPrefix = "3";
public static final String ansiBgColorPrefix = "4";
public static final String ansiColorSuffix = "m";
public static final String[] colorANSI = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "0;1", "1;1", "2;1", "3;1", "4;1", "5;1", "6;1", "7;1"};
public static final String ANSI_RESET = "\u001B[0m";
public static final char FILL = 0xDB;
private int hexColor(int red, int green, int blue) {
int r1=red, r2, g1=green, g2, b1=blue, b2;
float[] match = new float[16];
// COLOR
r2 = 0;
g2 = 0;
b2 = 0;
match[0]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 205;
g2 = 0;
b2 = 0;
match[1]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 0;
g2 = 205;
b2 = 0;
match[2]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 205;
g2 = 205;
b2 = 0;
match[3]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 0;
g2 = 0;
b2 = 238;
match[4]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 205;
g2 = 0;
b2 = 205;
match[5]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 0;
g2 = 205;
b2 = 205;
match[6]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 229;
g2 = 229;
b2 = 229;
match[7]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 127;
g2 = 127;
b2 = 127;
match[8]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 255;
g2 = 0;
b2 = 0;
match[9]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 0;
g2 = 255;
b2 = 0;
match[0xa]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 255;
g2 = 255;
b2 = 0;
match[0xb]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 92;
g2 = 92;
b2 = 255;
match[0xc]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 255;
g2 = 0;
b2 = 255;
match[0xd]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 0;
g2 = 255;
b2 = 255;
match[0xe]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
// COLOR
r2 = 255;
g2 = 255;
b2 = 255;
match[0xf]=(r2-r1)*(r2-r1)+(g2-g1)*(g2-g1)+(b2-b1)*(b2-b1);
int minIndex = 0;
for (int i = 1; i < match.length; i++) {
float newnumber = match[i];
if ((newnumber < match[minIndex])) {
minIndex = i;
}
}
return minIndex;
}
private int[] hexColorReverse(int i) {
switch (i) {
case 0x0:
return new int[]{0,0,0};
case 0x1:
return new int[]{205,0,0};
case 0x2:
return new int[]{0,205,0};
case 0x3:
return new int[]{205,205,0};
case 0x4:
return new int[]{0,0,238};
case 0x5:
return new int[]{205,0,205};
case 0x6:
return new int[]{0,205,205};
case 0x7:
return new int[]{229,229,229};
case 0x8:
return new int[]{127,127,127};
case 0x9:
return new int[]{255,0,0};
case 0xa:
return new int[]{0,255,0};
case 0xb:
return new int[]{255,255,0};
case 0xc:
return new int[]{92,92,255};
case 0xd:
return new int[]{255,0,255};
case 0xe:
return new int[]{0,255,255};
default:
return new int[]{255,255,255};
}
}
private int colorUnion(int[] col) {
return 0xFF<<24|col[0]<<16|col[1]<<8|col[2];
}
@Override
public void glColor3i(int r, int gg, int b) {
curColor = hexColor(r, gg, b);
}
@Override
public void glColor(int c) {
curColor = hexColor(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF);
}
@Override
public void glColor4i(int red, int green, int blue, int alpha) {
curColor = hexColor(red, green, blue);
}
@Override
public void glColor3f(float red, float green, float blue) {
curColor = hexColor((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public void glColor4f(float red, float green, float blue, float alpha) {
curColor = hexColor((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public void glClearColor4i(int red, int green, int blue, int alpha) {
clearColor = hexColor(red, green, blue);
}
@Override
public void glClearColor4f(float red, float green, float blue, float alpha) {
clearColor = hexColor((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public int glGetClearColor() {
return clearColor;
}
@Override
public void glClearColor(int c) {
clearColor = hexColor(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF);
}
@Override
public void glClear(int screenWidth, int screenHeight) {
clearAll();
}
@Override
public void glDrawLine(float x1, float y1, float x2, float y2) {
x1/=Headless8Engine.C_MUL_X;
x2/=Headless8Engine.C_MUL_X;
y1/=Headless8Engine.C_MUL_Y;
y2/=Headless8Engine.C_MUL_Y;
int dx = (int) Math.abs(x2 - x1);
int dy = (int) Math.abs(y2 - y1);
int sx = (x1 < x2) ? 1 : -1;
int sy = (y1 < y2) ? 1 : -1;
int err = dx - dy;
while (true) {
if (((int)x1) >= Headless8Engine.C_WIDTH || ((int)y1) >= Headless8Engine.C_HEIGHT ||
((int)x2) >= Headless8Engine.C_WIDTH || ((int)y2) >= Headless8Engine.C_HEIGHT) {
break;
}
int precBG = colorMatrix[((int)x1) + ((int)y1) * Headless8Engine.C_WIDTH]&0xF0;
colorMatrix[((int)x1) + ((int)y1) * Headless8Engine.C_WIDTH] = precBG|curColor;
charmatrix[((int)x1) + ((int)y1) * Headless8Engine.C_WIDTH] = FILL;
if (x1 == x2 && y1 == y2) {
break;
}
int e2 = 2 * err;
if (e2 > -dy) {
err = err - dy;
x1 = x1 + sx;
}
if (e2 < dx) {
err = err + dx;
y1 = y1 + sy;
}
}
}
@Override
public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) {
if (currentSkin != null) {
glDrawSkin((int) (x/Headless8Engine.C_MUL_X), (int) (y/Headless8Engine.C_MUL_Y), (int) (uvX/Headless8Engine.C_MUL_X), (int) (uvY/Headless8Engine.C_MUL_Y), (int) ((uvWidth + uvX)/Headless8Engine.C_MUL_X), (int) ((uvHeight + uvY)/Headless8Engine.C_MUL_Y), true);
} else {
glFillColor(x, y, width, height);
}
}
@Override
public void glFillColor(float x, float y, float width, float height) {
glFillColor(x, y, width, height, FILL, curColor);
}
private void glFillColor(float x, float y, float width, float height, char character, int color) {
final int ix = (int) x/Headless8Engine.C_MUL_X;
final int iy = (int) y/Headless8Engine.C_MUL_Y;
final int iw = (int) width/Headless8Engine.C_MUL_X;
final int ih = (int) height/Headless8Engine.C_MUL_Y;
int x1 = ix + iw;
int y1 = iy + ih;
if (ix >= Headless8Engine.C_WIDTH || iy >= Headless8Engine.C_WIDTH) {
return;
}
if (x1 >= Headless8Engine.C_WIDTH) {
x1 = Headless8Engine.C_WIDTH;
}
if (y1 >= Headless8Engine.C_HEIGHT) {
y1 = Headless8Engine.C_HEIGHT;
}
final int sizeW = Headless8Engine.C_WIDTH;
for (int px = ix; px < x1; px++) {
for (int py = iy; py < y1; py++) {
int precBG = colorMatrix[(px) + (py) * sizeW]&0xF0;
colorMatrix[(px) + (py) * sizeW] = precBG|color;
charmatrix[(px) + (py) * sizeW] = character;
}
}
}
@Override
public void glDrawCharLeft(int x, int y, char ch) {
final int cx = ((int)x)/Headless8Engine.C_MUL_X;
final int cy = ((int)y)/Headless8Engine.C_MUL_Y;
if (cx >= Headless8Engine.C_WIDTH || cy >= Headless8Engine.C_HEIGHT) {
return;
}
charmatrix[cx+cy*Headless8Engine.C_WIDTH] = ch;
int precBG = colorMatrix[cx+cy*Headless8Engine.C_WIDTH]&0xF0;
colorMatrix[cx+cy*Headless8Engine.C_WIDTH] = precBG|curColor;
}
@Override
public void glDrawCharCenter(int x, int y, char ch) {
glDrawCharLeft(x,y,ch);
}
@Override
public void glDrawCharRight(int x, int y, char ch) {
final int cx = ((int)x)/Headless8Engine.C_MUL_X-1;
final int cy = ((int)y)/Headless8Engine.C_MUL_Y;
if (cx >= Headless8Engine.C_WIDTH || cy >= Headless8Engine.C_HEIGHT) {
return;
}
charmatrix[cx+cy*Headless8Engine.C_WIDTH] = ch;
int precBG = colorMatrix[cx+cy*Headless8Engine.C_WIDTH]&0xF0;
colorMatrix[cx+cy*Headless8Engine.C_WIDTH] = precBG|curColor;
}
@Override
public void glDrawStringLeft(float x, float y, String text) {
final int cx = ((int)x)/Headless8Engine.C_MUL_X;
final int cy = ((int)y)/Headless8Engine.C_MUL_Y;
int i = 0;
for (char c : text.toCharArray()) {
if (cx+i >= Headless8Engine.C_WIDTH || cy >= Headless8Engine.C_HEIGHT) {
break;
}
charmatrix[cx+i+cy*Headless8Engine.C_WIDTH] = c;
int precBG = colorMatrix[cx+i+cy*Headless8Engine.C_WIDTH]&0xF0;
colorMatrix[cx+i+cy*Headless8Engine.C_WIDTH] = precBG|curColor;
i++;
}
}
@Override
public void glDrawStringCenter(float x, float y, String text) {
final int cx = ((int)x)/Headless8Engine.C_MUL_X-text.length()/2;
final int cy = ((int)y)/Headless8Engine.C_MUL_Y;
int i = 0;
for (char c : text.toCharArray()) {
if (cx+i >= Headless8Engine.C_WIDTH || cy >= Headless8Engine.C_HEIGHT) {
break;
}
charmatrix[cx+i+cy*Headless8Engine.C_WIDTH] = c;
int precBG = colorMatrix[cx+i+cy*Headless8Engine.C_WIDTH]&0xF0;
colorMatrix[cx+i+cy*Headless8Engine.C_WIDTH] = precBG|curColor;
i++;
}
}
@Override
public void glDrawStringRight(float x, float y, String text) {
// TODO Auto-generated method stub
}
private void glDrawSkin(int x0, int y0, int s0, int t0, int s1, int t1, boolean transparent) {
int oldColor;
int newColor;
final int onex = s0 <= s1 ? 1 : -1;
final int oney = t0 <= t1 ? 1 : -1;
int width = 0;
int height = 0;
if (onex == -1) {
final int s00 = s0;
s0 = s1;
s1 = s00;
width = s1 - s0;
}
if (oney == -1) {
final int t00 = t0;
t0 = t1;
t1 = t00;
height = t1 - t0;
}
if (x0 >= Headless8Engine.C_WIDTH || y0 >= Headless8Engine.C_WIDTH) {
return;
}
if (x0 + width >= Headless8Engine.C_WIDTH) {
s1 = Headless8Engine.C_WIDTH - x0 + s0;
}
if (y0 + height >= Headless8Engine.C_HEIGHT) {
t1 = Headless8Engine.C_HEIGHT - y0 + t0;
}
if (x0 < 0) {
if (onex == -1) {
width += x0;
s1 += x0 + 1;
} else {
s0 -= x0;
}
x0 = 0;
}
if (y0 < 0) {
if (oney == -1) {
height += y0;
t1 += y0 + 1;
} else {
t0 -= y0;
}
y0 = 0;
}
int pixelX;
int pixelY;
for (int texx = 0; texx < s1 - s0; texx++) {
for (int texy = 0; texy < t1 - t0; texy++) {
pixelX = (x0 + texx * onex + width);
pixelY = (y0 + texy * oney + height);
if (pixelY < Headless8Engine.C_HEIGHT) {
if (pixelX - (pixelX % Headless8Engine.C_WIDTH) == 0) {
newColor = currentSkin.skinData[(s0 + texx) + (t0 + texy) * currentSkin.skinSize[0]];
if (transparent) {
oldColor = colorUnion(hexColorReverse((colorMatrix[pixelX + pixelY * Headless8Engine.C_WIDTH]&0xF0)>>4));
final float a2 = (newColor >> 24 & 0xFF) / 255f;
final float a1 = 1f - a2;
final int r = (int) ((oldColor >> 16 & 0xFF) * a1 + (newColor >> 16 & 0xFF) * a2);
final int g = (int) ((oldColor >> 8 & 0xFF) * a1 + (newColor >> 8 & 0xFF) * a2);
final int b = (int) ((oldColor & 0xFF) * a1 + (newColor & 0xFF) * a2);
newColor = 0xFF000000 | r << 16 | g << 8 | b;
}
int bgColor = colorMatrix[pixelX + pixelY * Headless8Engine.C_WIDTH] & 0xF0;
colorMatrix[pixelX + pixelY * Headless8Engine.C_WIDTH] = bgColor|hexColor(newColor >> 16 & 0xFF, newColor >> 8 & 0xFF, newColor & 0xFF);
charmatrix[pixelX + pixelY * Headless8Engine.C_WIDTH] = FILL;
}
}
}
}
}
@Override
public void glClearSkin() {
currentSkin = null;
}
protected void clearAll() {
for (int i = 0; i < Headless8Engine.C_WIDTH*Headless8Engine.C_HEIGHT; i++) {
charmatrix[i]=' ';
colorMatrix[i] = clearColor<<4;
}
}
@Override
public Headless8Font getCurrentFont() {
return currentFont;
}
}

View File

@ -0,0 +1,62 @@
package org.warp.picalculator.gui.graphicengine.headless256;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Skin;
import org.warp.picalculator.gui.graphicengine.cpu.CPUEngine.CPURenderer;
public class Headless8Skin implements Skin {
public int[] skinData;
public int[] skinSize;
Headless8Skin(String file) throws IOException {
load(file);
}
@Override
public void load(String file) throws IOException {
final BufferedImage img = ImageIO.read(this.getClass().getResource("/" + file));
skinData = getMatrixOfImage(img);
skinSize = new int[] { img.getWidth(), img.getHeight() };
}
public static int[] getMatrixOfImage(BufferedImage bufferedImage) {
BufferedImage after = new BufferedImage(bufferedImage.getWidth(null), bufferedImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale(1f/((float)Headless8Engine.C_MUL_X), 1f/((float)Headless8Engine.C_MUL_Y));
AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(bufferedImage, after);
final int width = after.getWidth(null);
final int height = after.getHeight(null);
final int[] pixels = new int[width * height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
pixels[i + j * width] = after.getRGB(i, j);
}
}
return pixels;
}
@Override
public void initialize(GraphicEngine d) {
}
@Override
public void use(GraphicEngine d) {
((Headless8Renderer) d.getRenderer()).currentSkin = this;
}
}

View File

@ -0,0 +1,174 @@
package org.warp.picalculator.gui.graphicengine.headless8;
import java.io.IOException;
import java.util.Arrays;
import java.util.logging.ConsoleHandler;
import org.fusesource.jansi.AnsiConsole;
import org.warp.picalculator.Main;
import org.warp.picalculator.gui.graphicengine.Renderer;
import org.warp.picalculator.gui.graphicengine.RenderingLoop;
import org.warp.picalculator.gui.graphicengine.Skin;
public class Headless256Engine implements org.warp.picalculator.gui.graphicengine.GraphicEngine {
private Headless256Renderer r = new Headless256Renderer();
private boolean stopped = true;
private RenderingLoop renderLoop;
protected static final int C_WIDTH = Main.screenSize[0]/2;//;60;
protected static final int C_HEIGHT = Main.screenSize[1]/3;//;40;
public static final int C_MUL_X = 2;//8;
public static final int C_MUL_Y = 3;//8;
private String title = Main.calculatorName;
@Override
public int[] getSize() {
ConsoleHandler ch = new ConsoleHandler();
return new int[]{C_WIDTH, C_HEIGHT};
}
@Override
public boolean isInitialized() {
return !stopped;
}
@Override
public void setTitle(String title) {
this.title = title;
}
@Override
public void setResizable(boolean r) {
// TODO Auto-generated method stub
}
@Override
public void setDisplayMode(int ww, int wh) {
// TODO Auto-generated method stub
}
@Override
public void create() {
AnsiConsole.systemInstall();
AnsiConsole.out.print(Headless256Renderer.ANSI_PREFIX+"?25l");
stopped = false;
}
@Override
public boolean wasResized() {
return false;
}
@Override
public int getWidth() {
return C_WIDTH*C_MUL_X;
}
@Override
public int getHeight() {
return C_HEIGHT*C_MUL_Y;
}
@Override
public void destroy() {
stopped = true;
}
@Override
public void start(RenderingLoop d) {
this.renderLoop = d;
final Thread th = new Thread(() -> {
try {
double extratime = 0;
while (!stopped) {
final long start = System.currentTimeMillis();
repaint();
final long end = System.currentTimeMillis();
final double delta = (end - start) / 1000d;
final int deltaInt = (int) Math.floor(delta);
final int extraTimeInt = (int) Math.floor(extratime);
if (extraTimeInt + deltaInt < 200) {
Thread.sleep(200 - (extraTimeInt + deltaInt));
extratime = 0;
} else {
extratime += delta - 200d;
}
}
} catch (final InterruptedException e) {
e.printStackTrace();
}
});
th.setName("Console rendering thread");
th.setDaemon(true);
th.start();
}
@Override
public void repaint() {
renderLoop.refresh();
r.curColor = 0x1C;
r.glDrawStringCenter((C_WIDTH*C_MUL_X)/2, 0, title);
AnsiConsole.out.print(Headless256Renderer.ANSI_PREFIX+"1;1H");
for (int y = 0; y < C_HEIGHT; y++) {
int precBgColor = -1;
int precFgColor = -1;
int curBgColor = -1;
int curFgColor = -1;
for (int x = 0; x < C_WIDTH; x++) {
curBgColor = r.bgColorMatrix[x+y*C_WIDTH];
curFgColor = r.fgColorMatrix[x+y*C_WIDTH];
if (precBgColor != curBgColor) {
AnsiConsole.out.print(Headless256Renderer.ANSI_PREFIX+Headless256Renderer.ansiBgColorPrefix+curBgColor+Headless256Renderer.ansiColorSuffix);
}
if (precFgColor != curFgColor) {
AnsiConsole.out.print(Headless256Renderer.ANSI_PREFIX+Headless256Renderer.ansiFgColorPrefix+curFgColor+Headless256Renderer.ansiColorSuffix);
}
AnsiConsole.out.print(r.charmatrix[x+y*C_WIDTH]);
precBgColor = curBgColor;
precFgColor = curFgColor;
}
AnsiConsole.out.println();
}
}
@Override
public Renderer getRenderer() {
return r;
}
@Override
public Headless256Font loadFont(String file) throws IOException {
return new Headless256Font();
}
@Override
public Headless256Skin loadSkin(String file) throws IOException {
return new Headless256Skin(file);
}
@Override
public void waitUntilExit() {
try {
do {
Thread.sleep(500);
} while (stopped==false);
} catch (final InterruptedException e) {
}
}
@Override
public boolean isSupported() {
return true;
}
@Override
public boolean doesRefreshPauses() {
return true;
}
}

View File

@ -0,0 +1,42 @@
package org.warp.picalculator.gui.graphicengine.headless8;
import java.io.IOException;
import org.warp.picalculator.gui.graphicengine.BinaryFont;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
public class Headless256Font implements BinaryFont {
@Override
public void load(String file) throws IOException {
}
@Override
public void initialize(GraphicEngine d) {
// TODO Auto-generated method stub
}
@Override
public void use(GraphicEngine d) {
// TODO Auto-generated method stub
}
@Override
public int getStringWidth(String text) {
return 5*text.length();
}
@Override
public int getCharacterWidth() {
return 5;
}
@Override
public int getCharacterHeight() {
return 5;
}
}

View File

@ -0,0 +1,339 @@
package org.warp.picalculator.gui.graphicengine.headless8;
import org.warp.picalculator.Main;
import org.warp.picalculator.gui.graphicengine.Renderer;
public class Headless256Renderer implements Renderer {
Headless256Font currentFont;
protected char[] charmatrix = new char[Headless256Engine.C_WIDTH*Headless256Engine.C_HEIGHT];
protected int[] fgColorMatrix = new int[Headless256Engine.C_WIDTH*Headless256Engine.C_HEIGHT];
protected int[] bgColorMatrix = new int[Headless256Engine.C_WIDTH*Headless256Engine.C_HEIGHT];
protected int clearColor = rgbToX256(0xc5, 0xc2, 0xaf);
protected int curColor = clearColor;
public Headless256Skin currentSkin;
public static final String ANSI_PREFIX = "\u001B[";
public static final String ansiFgColorPrefix = "38;5;";
public static final String ansiBgColorPrefix = "48;5;";
public static final String ansiColorSuffix = "m";
public static final String ANSI_RESET = "\u001B[0m";
public static final char FILL = 0xDB;
public static final int TRANSPARENT = 0xF0000;
public static int v2ci(int v_U) {
return v_U < 48 ? 0 : v_U < 115 ? 1 : (v_U - 35) / 40;
}
public static int colorIndex(int ir, int ig, int ib) {
return 36 * ir + 6 * ig + ib;
}
public static int distSquare(int a, int b, int c, int a_U, int b_U, int c_U) {
return (a - a_U) * (a - a_U) + (b - b_U) * (b - b_U) + (c - c_U) * (c - c_U);
}
/**
* Calculate the represented colors back from the index
*/
public static int[] i2cv = {0, 0x5f, 0x87, 0xaf, 0xd7, 0xff};
public static int rgbToX256(int r_U, int g_U, int b_U) {
// Calculate the nearest 0-based color index at 16 .. 231
int ir = v2ci(r_U), ig = v2ci(g_U), ib = v2ci(b_U); // 0..5 each
/* 0..215, lazy evaluation */
// Calculate the nearest 0-based gray index at 232 .. 255
int average = (r_U + g_U + b_U) / 3;
int grayIndex = average > 238 ? 23 : (average - 3) / 10; // 0..23
int cr = i2cv[ir], cg = i2cv[ig], cb = i2cv[ib]; // r/g/b, 0..255 each
int gv = 8 + 10 * grayIndex; // same value for r/g/b, 0..255
// Return the one which is nearer to the original input rgb value
int colorErr = distSquare(cr, cg, cb, r_U, g_U, b_U);
int grayErr = distSquare(gv, gv, gv, r_U, g_U, b_U);
return colorErr <= grayErr ? 16 + colorIndex(ir, ig, ib) : 232 + grayIndex;
}
@Override
public void glColor3i(int r, int gg, int b) {
curColor = rgbToX256(r, gg, b);
}
@Override
public void glColor(int c) {
curColor = rgbToX256(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF);
}
@Override
public void glColor4i(int red, int green, int blue, int alpha) {
curColor = rgbToX256(red, green, blue);
}
@Override
public void glColor3f(float red, float green, float blue) {
curColor = rgbToX256((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public void glColor4f(float red, float green, float blue, float alpha) {
curColor = rgbToX256((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public void glClearColor4i(int red, int green, int blue, int alpha) {
clearColor = rgbToX256(red, green, blue);
}
@Override
public void glClearColor4f(float red, float green, float blue, float alpha) {
clearColor = rgbToX256((int)(red*255), (int)(green*255), (int)(blue*255));
}
@Override
public int glGetClearColor() {
return clearColor;
}
@Override
public void glClearColor(int c) {
clearColor = rgbToX256(c >> 16 & 0xFF, c >> 8 & 0xFF, c & 0xFF);
}
@Override
public void glClear(int screenWidth, int screenHeight) {
clearAll();
}
@Override
public void glDrawLine(float x1, float y1, float x2, float y2) {
x1/=Headless256Engine.C_MUL_X;
x2/=Headless256Engine.C_MUL_X;
y1/=Headless256Engine.C_MUL_Y;
y2/=Headless256Engine.C_MUL_Y;
int dx = (int) Math.abs(x2 - x1);
int dy = (int) Math.abs(y2 - y1);
int sx = (x1 < x2) ? 1 : -1;
int sy = (y1 < y2) ? 1 : -1;
int err = dx - dy;
while (true) {
if (((int)x1) >= Headless256Engine.C_WIDTH || ((int)y1) >= Headless256Engine.C_HEIGHT ||
((int)x2) >= Headless256Engine.C_WIDTH || ((int)y2) >= Headless256Engine.C_HEIGHT) {
break;
}
bgColorMatrix[((int)x1) + ((int)y1) * Headless256Engine.C_WIDTH] = curColor;
charmatrix[((int)x1) + ((int)y1) * Headless256Engine.C_WIDTH] = ' ';
if (x1 == x2 && y1 == y2) {
break;
}
int e2 = 2 * err;
if (e2 > -dy) {
err = err - dy;
x1 = x1 + sx;
}
if (e2 < dx) {
err = err + dx;
y1 = y1 + sy;
}
}
}
@Override
public void glFillRect(float x, float y, float width, float height, float uvX, float uvY, float uvWidth, float uvHeight) {
if (currentSkin != null) {
glDrawSkin((int) (x/Headless256Engine.C_MUL_X), (int) (y/Headless256Engine.C_MUL_Y), (int) (uvX/Headless256Engine.C_MUL_X), (int) (uvY/Headless256Engine.C_MUL_Y), (int) ((uvWidth + uvX)/Headless256Engine.C_MUL_X), (int) ((uvHeight + uvY)/Headless256Engine.C_MUL_Y), true);
} else {
glFillColor(x, y, width, height);
}
}
@Override
public void glFillColor(float x, float y, float width, float height) {
final int ix = (int) x/Headless256Engine.C_MUL_X;
final int iy = (int) y/Headless256Engine.C_MUL_Y;
final int iw = (int) width/Headless256Engine.C_MUL_X;
final int ih = (int) height/Headless256Engine.C_MUL_Y;
int x1 = ix + iw;
int y1 = iy + ih;
if (ix >= Headless256Engine.C_WIDTH || iy >= Headless256Engine.C_WIDTH) {
return;
}
if (x1 >= Headless256Engine.C_WIDTH) {
x1 = Headless256Engine.C_WIDTH;
}
if (y1 >= Headless256Engine.C_HEIGHT) {
y1 = Headless256Engine.C_HEIGHT;
}
final int sizeW = Headless256Engine.C_WIDTH;
for (int px = ix; px < x1; px++) {
for (int py = iy; py < y1; py++) {
bgColorMatrix[(px) + (py) * sizeW] = curColor;
charmatrix[(px) + (py) * sizeW] = ' ';
}
}
}
@Override
public void glDrawCharLeft(int x, int y, char ch) {
final int cx = ((int)x)/Headless256Engine.C_MUL_X;
final int cy = ((int)y)/Headless256Engine.C_MUL_Y;
if (cx >= Headless256Engine.C_WIDTH || cy >= Headless256Engine.C_HEIGHT) {
return;
}
charmatrix[cx+cy*Headless256Engine.C_WIDTH] = ch;
fgColorMatrix[cx+cy*Headless256Engine.C_WIDTH] = curColor;
}
@Override
public void glDrawCharCenter(int x, int y, char ch) {
glDrawCharLeft(x,y,ch);
}
@Override
public void glDrawCharRight(int x, int y, char ch) {
final int cx = ((int)x)/Headless256Engine.C_MUL_X-1;
final int cy = ((int)y)/Headless256Engine.C_MUL_Y;
if (cx >= Headless256Engine.C_WIDTH || cy >= Headless256Engine.C_HEIGHT) {
return;
}
charmatrix[cx+cy*Headless256Engine.C_WIDTH] = ch;
fgColorMatrix[cx+cy*Headless256Engine.C_WIDTH] = curColor;
}
@Override
public void glDrawStringLeft(float x, float y, String text) {
final int cx = ((int)x)/Headless256Engine.C_MUL_X;
final int cy = ((int)y)/Headless256Engine.C_MUL_Y;
int i = 0;
for (char c : text.toCharArray()) {
if (cx+i >= Headless256Engine.C_WIDTH || cy >= Headless256Engine.C_HEIGHT) {
break;
}
charmatrix[cx+i+cy*Headless256Engine.C_WIDTH] = c;
fgColorMatrix[cx+i+cy*Headless256Engine.C_WIDTH] = curColor;
i++;
}
}
@Override
public void glDrawStringCenter(float x, float y, String text) {
final int cx = ((int)x)/Headless256Engine.C_MUL_X-text.length()/2;
final int cy = ((int)y)/Headless256Engine.C_MUL_Y;
int i = 0;
for (char c : text.toCharArray()) {
if (cx+i >= Headless256Engine.C_WIDTH || cy >= Headless256Engine.C_HEIGHT) {
break;
}
charmatrix[cx+i+cy*Headless256Engine.C_WIDTH] = c;
fgColorMatrix[cx+i+cy*Headless256Engine.C_WIDTH] = curColor;
i++;
}
}
@Override
public void glDrawStringRight(float x, float y, String text) {
// TODO Auto-generated method stub
}
private void glDrawSkin(int x0, int y0, int s0, int t0, int s1, int t1, boolean transparent) {
int oldColor;
int newColor;
final int onex = s0 <= s1 ? 1 : -1;
final int oney = t0 <= t1 ? 1 : -1;
int width = 0;
int height = 0;
if (onex == -1) {
final int s00 = s0;
s0 = s1;
s1 = s00;
width = s1 - s0;
}
if (oney == -1) {
final int t00 = t0;
t0 = t1;
t1 = t00;
height = t1 - t0;
}
if (x0 >= Headless256Engine.C_WIDTH || y0 >= Headless256Engine.C_WIDTH) {
return;
}
if (x0 + width >= Headless256Engine.C_WIDTH) {
s1 = Headless256Engine.C_WIDTH - x0 + s0;
}
if (y0 + height >= Headless256Engine.C_HEIGHT) {
t1 = Headless256Engine.C_HEIGHT - y0 + t0;
}
if (x0 < 0) {
if (onex == -1) {
width += x0;
s1 += x0 + 1;
} else {
s0 -= x0;
}
x0 = 0;
}
if (y0 < 0) {
if (oney == -1) {
height += y0;
t1 += y0 + 1;
} else {
t0 -= y0;
}
y0 = 0;
}
int pixelX;
int pixelY;
for (int texx = 0; texx < s1 - s0; texx++) {
for (int texy = 0; texy < t1 - t0; texy++) {
pixelX = (x0 + texx * onex + width);
pixelY = (y0 + texy * oney + height);
if (pixelY < Headless256Engine.C_HEIGHT) {
if (pixelX - (pixelX % Headless256Engine.C_WIDTH) == 0) {
int bgColor = bgColorMatrix[pixelX + pixelY * Headless256Engine.C_WIDTH];
newColor = currentSkin.skinData[(s0 + texx) + (t0 + texy) * currentSkin.skinSize[0]];
if (transparent && !((newColor&TRANSPARENT) == TRANSPARENT)) {
charmatrix[pixelX + pixelY * Headless256Engine.C_WIDTH] = ' ';
bgColorMatrix[pixelX + pixelY * Headless256Engine.C_WIDTH] = newColor;
}
}
}
}
}
}
@Override
public void glClearSkin() {
currentSkin = null;
}
protected void clearAll() {
for (int i = 0; i < Headless256Engine.C_WIDTH*Headless256Engine.C_HEIGHT; i++) {
charmatrix[i]=' ';
bgColorMatrix[i] = clearColor;
fgColorMatrix[i] = 0;
}
}
@Override
public Headless256Font getCurrentFont() {
return currentFont;
}
}

View File

@ -0,0 +1,67 @@
package org.warp.picalculator.gui.graphicengine.headless8;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.warp.picalculator.gui.graphicengine.GraphicEngine;
import org.warp.picalculator.gui.graphicengine.Skin;
import org.warp.picalculator.gui.graphicengine.cpu.CPUEngine.CPURenderer;
public class Headless256Skin implements Skin {
public int[] skinData;
public int[] skinSize;
Headless256Skin(String file) throws IOException {
load(file);
}
@Override
public void load(String file) throws IOException {
final BufferedImage img = ImageIO.read(this.getClass().getResource("/" + file));
skinData = getMatrixOfImage(img);
skinSize = new int[] { img.getWidth(), img.getHeight() };
}
public static int[] getMatrixOfImage(BufferedImage bufferedImage) {
BufferedImage after = new BufferedImage(bufferedImage.getWidth(null), bufferedImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale(1f/((float)Headless256Engine.C_MUL_X), 1f/((float)Headless256Engine.C_MUL_Y));
AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(bufferedImage, after);
final int width = after.getWidth(null);
final int height = after.getHeight(null);
final int[] pixels = new int[width * height];
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = after.getRGB(i, j);
int r = (rgb >> 16) &0xFF;
int g = (rgb >> 8) &0xFF;
int b = rgb &0xFF;
boolean transparent = ((rgb >> 24) & 0xFF) <= 128;
pixels[i + j * width] = Headless256Renderer.rgbToX256(r, g, b)|(transparent?Headless256Renderer.TRANSPARENT:0);
}
}
return pixels;
}
@Override
public void initialize(GraphicEngine d) {
}
@Override
public void use(GraphicEngine d) {
((Headless256Renderer) d.getRenderer()).currentSkin = this;
}
}

View File

@ -132,260 +132,278 @@ public class MathInputScreen extends Screen {
public boolean keyPressed(Key k) {
Utils.debug.println(k.toString());
switch (k) {
case STEP:
// if (newExpression.length() > 0) {
// if (firstStep) {
// try {
// try {
// interpreta(true);
// showVariablesDialog(() -> {
// currentExpression = newExpression;
// calc.f2 = calc.f;
// firstStep = false;
// step();
// });
// } catch (final Exception ex) {
// if (Utils.debugOn) {
// ex.printStackTrace();
// }
// throw new Error(Errors.SYNTAX_ERROR);
// }
// } catch (final Error e) {
// final StringWriter sw = new StringWriter();
// final PrintWriter pw = new PrintWriter(sw);
// e.printStackTrace(pw);
// d.errorStackTrace = sw.toString().toUpperCase().replace("\t", " ").replace("\r", "").split("\n");
// DisplayManager.error = e.id.toString();
// System.err.println(e.id);
// }
// } else {
// step();
// }
// }
// return true;
case SIMPLIFY:
if (DisplayManager.error != null) {
//TODO: make the error management a global API rather than being relegated to this screen.
Utils.debug.println("Resetting after error...");
DisplayManager.error = null;
calc.f = null;
calc.f2 = null;
calc.resultsCount = 0;
return true;
} else {
try {
try {
if (!userInput.isAlreadyParsed() && !userInput.isEmpty()) {
Expression expr = MathParser.parseInput(calc, userInput);
if (calc.f == null | calc.f2 == null) {
calc.f = new ObjectArrayList<>();
calc.f2 = new ObjectArrayList<>();
} else {
calc.f.clear();
calc.f2.clear();
}
calc.f.add(expr);
ObjectArrayList<Function> resultExpression = expr.solve();
ObjectArrayList<Block> resultBlocks = MathParser.parseOutput(calc, resultExpression);
result.setContent(resultBlocks);
// showVariablesDialog(() -> {
// currentExpression = newExpression;
// simplify();
// });
}
} catch (final Exception ex) {
if (Utils.debugOn) {
ex.printStackTrace();
}
throw new Error(Errors.SYNTAX_ERROR);
}
} catch (final Error e) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
d.errorStackTrace = sw.toString().toUpperCase().replace("\t", " ").replace("\r", "").split("\n");
DisplayManager.error = e.id.toString();
System.err.println(e.id);
}
return true;
}
case NUM0:
typeChar('0');
return true;
case NUM1:
typeChar('1');
return true;
case NUM2:
typeChar('2');
return true;
case NUM3:
typeChar('3');
return true;
case NUM4:
typeChar('4');
return true;
case NUM5:
typeChar('5');
return true;
case NUM6:
typeChar('6');
return true;
case NUM7:
typeChar('7');
return true;
case NUM8:
typeChar('8');
return true;
case NUM9:
typeChar('9');
return true;
case PLUS:
typeChar('+');
return true;
case MINUS:
typeChar('-');
return true;
case PLUS_MINUS:
typeChar('±');
return true;
case MULTIPLY:
typeChar('*');
return true;
case DIVIDE:
typeChar('/');
return true;
case PARENTHESIS_OPEN:
typeChar('(');
return true;
case PARENTHESIS_CLOSE:
typeChar(')');
return true;
case DOT:
typeChar('.');
return true;
case EQUAL:
typeChar('=');
return true;
case SQRT:
typeChar('Ⓐ');
return true;
case ROOT:
typeChar('√');
return true;
case POWER_OF_2:
typeChar(MathematicalSymbols.POWER_OF_TWO);
return true;
case POWER_OF_x:
typeChar(MathematicalSymbols.POWER);
return true;
case PI:
typeChar(MathematicalSymbols.PI);
return true;
case LETTER_X:
typeChar(MathematicalSymbols.variables[23]);
return true;
case LETTER_Y:
typeChar(MathematicalSymbols.variables[24]);
return true;
case SINE:
typeChar(MathematicalSymbols.SINE);
return true;
case COSINE:
typeChar(MathematicalSymbols.COSINE);
return true;
case TANGENT:
typeChar(MathematicalSymbols.TANGENT);
return true;
case ARCSINE:
typeChar(MathematicalSymbols.ARC_SINE);
return true;
case ARCCOSINE:
typeChar(MathematicalSymbols.ARC_COSINE);
return true;
case ARCTANGENT:
typeChar(MathematicalSymbols.ARC_TANGENT);
return true;
case DELETE:
userInput.del();
case OK:
userInput.toggleExtra();
mustRefresh = true;
return true;
case LEFT:
userInput.moveLeft();
mustRefresh = true;
return true;
case RIGHT:
userInput.moveRight();
mustRefresh = true;
return true;
case RESET:
userInput.clear();
result.clear();
if (DisplayManager.error != null) {
Utils.debug.println("Resetting after error...");
DisplayManager.error = null;
}
return true;
case SURD_MODE:
calc.exactMode = !calc.exactMode;
if (calc.exactMode == false) {
calc.f2 = solveExpression(calc.f2);
} else {
result.clear();
Keyboard.keyPressed(Key.SIMPLIFY);
}
return true;
case debug1:
DisplayManager.INSTANCE.setScreen(new EmptyScreen());
return true;
case HISTORY_BACK:
// if (DisplayManager.INSTANCE.canGoBack()) {
// if (currentExpression != null && currentExpression.length() > 0 & DisplayManager.sessions[DisplayManager.currentSession + 1] instanceof MathInputScreen) {
// newExpression = currentExpression;
// try {
// interpreta(true);
// } catch (final Error e) {}
// }
// }
return false;
case HISTORY_FORWARD:
// if (DisplayManager.INSTANCE.canGoForward()) {
// if (currentExpression != null && currentExpression.length() > 0 & DisplayManager.sessions[DisplayManager.currentSession - 1] instanceof MathInputScreen) {
// newExpression = currentExpression;
// try {
// interpreta(true);
// } catch (final Error e) {}
// }
// }
return false;
case debug_DEG:
if (calc.angleMode.equals(AngleMode.DEG) == false) {
calc.angleMode = AngleMode.DEG;
if (userInput.isExtraOpened()) {
userInput.closeExtra();
mustRefresh = true;
return true;
}
return false;
case debug_RAD:
if (calc.angleMode.equals(AngleMode.RAD) == false) {
calc.angleMode = AngleMode.RAD;
return true;
}
return false;
case debug_GRA:
if (calc.angleMode.equals(AngleMode.GRA) == false) {
calc.angleMode = AngleMode.GRA;
return true;
}
return false;
case DRG_CYCLE:
if (calc.angleMode.equals(AngleMode.DEG) == true) {
calc.angleMode = AngleMode.RAD;
} else if (calc.angleMode.equals(AngleMode.RAD) == true) {
calc.angleMode = AngleMode.GRA;
} else {
calc.angleMode = AngleMode.DEG;
}
return true;
default:
return false;
if (userInput.isExtraOpened() && userInput.getExtraKeyboardEventListener().keyPressed(k)) {
return true;
} else {
switch (k) {
case STEP:
// if (newExpression.length() > 0) {
// if (firstStep) {
// try {
// try {
// interpreta(true);
// showVariablesDialog(() -> {
// currentExpression = newExpression;
// calc.f2 = calc.f;
// firstStep = false;
// step();
// });
// } catch (final Exception ex) {
// if (Utils.debugOn) {
// ex.printStackTrace();
// }
// throw new Error(Errors.SYNTAX_ERROR);
// }
// } catch (final Error e) {
// final StringWriter sw = new StringWriter();
// final PrintWriter pw = new PrintWriter(sw);
// e.printStackTrace(pw);
// d.errorStackTrace = sw.toString().toUpperCase().replace("\t", " ").replace("\r", "").split("\n");
// DisplayManager.error = e.id.toString();
// System.err.println(e.id);
// }
// } else {
// step();
// }
// }
// return true;
case SIMPLIFY:
if (DisplayManager.error != null) {
//TODO: make the error management a global API rather than being relegated to this screen.
Utils.debug.println("Resetting after error...");
DisplayManager.error = null;
calc.f = null;
calc.f2 = null;
calc.resultsCount = 0;
return true;
} else {
try {
try {
if (!userInput.isAlreadyParsed() && !userInput.isEmpty()) {
Expression expr = MathParser.parseInput(calc, userInput);
if (calc.f == null | calc.f2 == null) {
calc.f = new ObjectArrayList<>();
calc.f2 = new ObjectArrayList<>();
} else {
calc.f.clear();
calc.f2.clear();
}
calc.f.add(expr);
ObjectArrayList<Function> resultExpression = expr.solve();
ObjectArrayList<Block> resultBlocks = MathParser.parseOutput(calc, resultExpression);
result.setContent(resultBlocks);
// showVariablesDialog(() -> {
// currentExpression = newExpression;
// simplify();
// });
}
} catch (final Exception ex) {
if (Utils.debugOn) {
ex.printStackTrace();
}
throw new Error(Errors.SYNTAX_ERROR);
}
} catch (final Error e) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
d.errorStackTrace = sw.toString().toUpperCase().replace("\t", " ").replace("\r", "").split("\n");
DisplayManager.error = e.id.toString();
System.err.println(e.id);
}
return true;
}
case NUM0:
typeChar('0');
return true;
case NUM1:
typeChar('1');
return true;
case NUM2:
typeChar('2');
return true;
case NUM3:
typeChar('3');
return true;
case NUM4:
typeChar('4');
return true;
case NUM5:
typeChar('5');
return true;
case NUM6:
typeChar('6');
return true;
case NUM7:
typeChar('7');
return true;
case NUM8:
typeChar('8');
return true;
case NUM9:
typeChar('9');
return true;
case PLUS:
typeChar('+');
return true;
case MINUS:
typeChar('-');
return true;
case PLUS_MINUS:
typeChar('±');
return true;
case MULTIPLY:
typeChar('*');
return true;
case DIVIDE:
typeChar('/');
return true;
case PARENTHESIS_OPEN:
typeChar('(');
return true;
case PARENTHESIS_CLOSE:
typeChar(')');
return true;
case DOT:
typeChar('.');
return true;
case EQUAL:
typeChar('=');
return true;
case SQRT:
typeChar('Ⓐ');
return true;
case ROOT:
typeChar('√');
return true;
case POWER_OF_2:
typeChar(MathematicalSymbols.POWER_OF_TWO);
return true;
case POWER_OF_x:
typeChar(MathematicalSymbols.POWER);
return true;
case PI:
typeChar(MathematicalSymbols.PI);
return true;
case LETTER_X:
typeChar(MathematicalSymbols.variables[23]);
return true;
case LETTER_Y:
typeChar(MathematicalSymbols.variables[24]);
return true;
case SINE:
typeChar(MathematicalSymbols.SINE);
return true;
case COSINE:
typeChar(MathematicalSymbols.COSINE);
return true;
case TANGENT:
typeChar(MathematicalSymbols.TANGENT);
return true;
case ARCSINE:
typeChar(MathematicalSymbols.ARC_SINE);
return true;
case ARCCOSINE:
typeChar(MathematicalSymbols.ARC_COSINE);
return true;
case ARCTANGENT:
typeChar(MathematicalSymbols.ARC_TANGENT);
return true;
case DELETE:
userInput.del();
mustRefresh = true;
return true;
case LEFT:
userInput.moveLeft();
mustRefresh = true;
return true;
case RIGHT:
userInput.moveRight();
mustRefresh = true;
return true;
case RESET:
userInput.clear();
result.clear();
if (DisplayManager.error != null) {
Utils.debug.println("Resetting after error...");
DisplayManager.error = null;
}
return true;
case SURD_MODE:
calc.exactMode = !calc.exactMode;
if (calc.exactMode == false) {
calc.f2 = solveExpression(calc.f2);
} else {
result.clear();
Keyboard.keyPressed(Key.SIMPLIFY);
}
return true;
case debug1:
DisplayManager.INSTANCE.setScreen(new EmptyScreen());
return true;
case HISTORY_BACK:
// if (DisplayManager.INSTANCE.canGoBack()) {
// if (currentExpression != null && currentExpression.length() > 0 & DisplayManager.sessions[DisplayManager.currentSession + 1] instanceof MathInputScreen) {
// newExpression = currentExpression;
// try {
// interpreta(true);
// } catch (final Error e) {}
// }
// }
return false;
case HISTORY_FORWARD:
// if (DisplayManager.INSTANCE.canGoForward()) {
// if (currentExpression != null && currentExpression.length() > 0 & DisplayManager.sessions[DisplayManager.currentSession - 1] instanceof MathInputScreen) {
// newExpression = currentExpression;
// try {
// interpreta(true);
// } catch (final Error e) {}
// }
// }
return false;
case debug_DEG:
if (calc.angleMode.equals(AngleMode.DEG) == false) {
calc.angleMode = AngleMode.DEG;
return true;
}
return false;
case debug_RAD:
if (calc.angleMode.equals(AngleMode.RAD) == false) {
calc.angleMode = AngleMode.RAD;
return true;
}
return false;
case debug_GRA:
if (calc.angleMode.equals(AngleMode.GRA) == false) {
calc.angleMode = AngleMode.GRA;
return true;
}
return false;
case DRG_CYCLE:
if (calc.angleMode.equals(AngleMode.DEG) == true) {
calc.angleMode = AngleMode.RAD;
} else if (calc.angleMode.equals(AngleMode.RAD) == true) {
calc.angleMode = AngleMode.GRA;
} else {
calc.angleMode = AngleMode.DEG;
}
return true;
default:
return false;
}
}
}
}
@ -524,7 +542,18 @@ public class MathInputScreen extends Screen {
@Override
public boolean keyReleased(Key k) {
return false;
if (k == Key.OK) {
return true;
} else {
if (userInput.isExtraOpened() && userInput.getExtraKeyboardEventListener().keyReleased(k)) {
return true;
} else {
switch (k) {
default:
return false;
}
}
}
}
public void showVariablesDialog() {
@ -585,7 +614,7 @@ public class MathInputScreen extends Screen {
} else if (f instanceof FunctionSingle) {
res.addAll(getKnownVariables(new Function[] { ((FunctionSingle) f).getParameter() }));
} else if (f instanceof Variable) {
if (((Variable) f).getType() == Variable.V_TYPE.KNOWN) {
if (((Variable) f).getType() == Variable.V_TYPE.COEFFICIENT) {
if (!res.contains(f)) {
res.add(f);
}

View File

@ -1,9 +1,10 @@
package org.warp.picalculator.gui.screens;
import org.warp.picalculator.device.KeyboardEventListener;
import org.warp.picalculator.device.Keyboard.Key;
import org.warp.picalculator.gui.DisplayManager;
public abstract class Screen {
public abstract class Screen implements KeyboardEventListener {
public DisplayManager d;
public boolean created = false;
public boolean initialized = false;
@ -38,8 +39,4 @@ public abstract class Screen {
public abstract void beforeRender(float dt);
public abstract boolean mustBeRefreshed();
public abstract boolean keyPressed(Key k);
public abstract boolean keyReleased(Key k);
}

View File

@ -11,7 +11,7 @@ public class Variable implements Function {
protected char var;
protected final MathContext root;
protected V_TYPE type = V_TYPE.KNOWN;
protected V_TYPE type = V_TYPE.COEFFICIENT;
public Variable(MathContext root, char val, V_TYPE type) {
this.root = root;
@ -90,7 +90,7 @@ public class Variable implements Function {
}
public static enum V_TYPE {
KNOWN, UNKNOWN, SOLUTION
COEFFICIENT, UNKNOWN, SOLUTION
}
@Override