/*
* License: source-license.txt
* If this code is used independently, copy the license here.
*/
package wombat.scheme.util;
import java.awt.image.BufferedImage;
import wombat.scheme.libraries.*;
import wombat.scheme.libraries.types.ImageData;
import wombat.scheme.libraries.types.TreeData;
import wombat.util.Base64;
/**
* Helper that stores all of the interop functions for calling Java methods from Scheme.
*/
public class InteropAPI {
public static String SchemeCD = null;
private InteropAPI() {}
/**
* Interop method.
* @param key The method name.
* @param val Any parameters.
* @return Either null to send nothing or a string to send back.
*/
public static String interop(String key, String val) {
key = key.toLowerCase();
try {
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Image API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
if ("read-image".equals(key)) {
ImageData img = null;
if (val == null) {
img = ImageAPI.readImage();
} else {
int split = val.indexOf("\" \"");
String cd = val.substring(1, split);
String fn = val.substring(split + 3, val.length() - 1);
img = ImageAPI.readImage(cd, fn);
}
return "(" + img.Width + " " + img.Height + " \"" + Base64.encodeBytes(Conversion.int2byte(img.Data)) + "\")";
}
// write images to file
else if ("write-image".equals(key)) {
String cd = null;
if (val.startsWith("\"")) {
int split = val.indexOf('"', 2);
cd = val.substring(1, split);
val = val.substring(split + 2, val.length());
}
String[] args = val.split(" ");
ImageData img = new ImageData(
Integer.parseInt(args[0]),
Integer.parseInt(args[1]),
Conversion.byte2int(Base64.decode(args[2]))
);
if (cd == null)
ImageAPI.writeImage(img);
else
ImageAPI.writeImage(cd, img, args[3].substring(1, args[3].length() - 1));
}
// display images to the screen
else if ("draw-image".equals(key)) {
String[] args = val.split(" ");
ImageData img = new ImageData(
Integer.parseInt(args[0]),
Integer.parseInt(args[1]),
Conversion.byte2int(Base64.decode(args[2]))
);
ImageAPI.displayImage(img);
}
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Matrix API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
else if ("draw-matrix".equals(key)) {
MatrixAPI.drawMatrix(val);
}
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Tree API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
else if ("draw-tree".equals(key)) {
TreeAPI.drawTree(TreeData.decode(val));
}
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Trutle API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
else if ("draw-turtle".equals(key)) {
TurtleAPI.drawTurtle(val);
}
else if ("update-live-timer".equals(key)) {
TurtleAPI.Pause = Double.parseDouble(val);
}
else if ("turtle-update".equals(key)) {
String[] parts = val.split(" ", 2);
String[] args = parts[1].substring(1, parts[1].length() - 1).split(" ", 2);
TurtleAPI.updateTurtle(parts[0], args[0], args[1].split(" "));
}
else if ("turtle->image".equals(key)) {
BufferedImage bi = (BufferedImage) TurtleAPI.turtleToImage(val);
int[] imgdata = new int[bi.getWidth() * bi.getHeight()];
bi.getRGB(0, 0, bi.getWidth(), bi.getHeight(), imgdata, 0, bi.getWidth());
ImageData img = new ImageData(bi.getWidth(), bi.getHeight(), imgdata);
return "(" + img.Width + " " + img.Height + " \"" + Base64.encodeBytes(Conversion.int2byte(img.Data)) + "\")";
}
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Meta API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
else if ("set-cd".equals(key)) {
SchemeCD = val;
}
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Test API
// ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
// Test method.
else if ("fact".equals(key)) {
int n = Integer.parseInt(val);
int a = 1;
for (int i = 2; i <= n; i++) a *= i;
return "(" + a + ")";
}
// Unknown method!
else {
throw new Exception("Unknown method: " + key);
}
} catch(Exception e) {
e.printStackTrace();
return "(exception " + key + " \"" + e.getClass().getSimpleName() + ": " + e.getMessage().replace("\\", "\\\\") + "\")";
}
return "()";
}
}