package com.akjava.gwt.hangout.test2.client;
import com.akjava.gwt.lib.hangouts.client.XYPoint;
import com.akjava.gwt.lib.hangouts.client.av.effects.Effects;
import com.akjava.gwt.lib.hangouts.client.av.effects.FaceTrackingOverlay;
import com.akjava.gwt.lib.hangouts.client.av.effects.FaceTrackingOverlayParameter;
import com.akjava.gwt.lib.hangouts.client.av.effects.ImageResource;
import com.akjava.gwt.lib.hangouts.client.av.effects.OnFaceTrackingDataChanged;
import com.akjava.gwt.lib.hangouts.client.av.effects.events.FaceTrackingData;
import com.akjava.gwt.lib.hangouts.client.av.effects.listeners.FaceTrackingDataChangedListener;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
public class ImageTest extends VerticalPanel{
private VerticalPanel container;
private FaceTrackingOverlay face;
public ImageTest(){
HorizontalPanel panels=new HorizontalPanel();
add(panels);
VerticalPanel editor=new VerticalPanel();
editor.setWidth("500px");
panels.add(editor);
test();
final TextBox imageUrl=new TextBox();
imageUrl.setText("http://www.xucker.jpn.org/test/cross.png");
imageUrl.setWidth("500px");
editor.add(imageUrl);
HorizontalPanel offsetInput=new HorizontalPanel();
editor.add(offsetInput);
offsetInput.setVerticalAlignment(VerticalPanel.ALIGN_MIDDLE);
offsetInput.add(new Label("offset-X:"));
final TextBox offsetX=new TextBox();
offsetInput.add(offsetX);
offsetInput.add(new Label("offset-Y:"));
final TextBox offsetY=new TextBox();
offsetInput.add(offsetY);
final CheckBox rotateWithFace=new CheckBox("RotateWithFace");
editor.add(rotateWithFace);
HorizontalPanel rotationInput=new HorizontalPanel();
editor.add(rotationInput);
rotationInput.add(new Label("Rotation:"));
final TextBox rotation=new TextBox();
rotationInput.add(rotation);
HorizontalPanel scaleInput=new HorizontalPanel();
editor.add(scaleInput);
scaleInput.add(new Label("Scale:"));
final TextBox scale=new TextBox();
scale.setValue("1");
scaleInput.add(scale);
final CheckBox scaleWithFace=new CheckBox("scaleWithFace");
editor.add(scaleWithFace);
HorizontalPanel featureInput=new HorizontalPanel();
editor.add(featureInput);
featureInput.add(new Label("TrackingFeature:"));
final ListBox feature=new ListBox();
feature.addItem(Effects.FaceTrackingFeature.NOSE_TIP);
feature.addItem(Effects.FaceTrackingFeature.LEFT_EYEBROW_LEFT);
feature.addItem(Effects.FaceTrackingFeature.LEFT_EYEBROW_RIGHT);
feature.addItem(Effects.FaceTrackingFeature.LEFT_EYE);
feature.addItem(Effects.FaceTrackingFeature.LOWER_LIP);
feature.addItem(Effects.FaceTrackingFeature.MOUTH_CENTER);
feature.addItem(Effects.FaceTrackingFeature.MOUTH_LEFT);
feature.addItem(Effects.FaceTrackingFeature.MOUTH_RIGHT);
feature.addItem(Effects.FaceTrackingFeature.NOSE_ROOT);
feature.addItem(Effects.FaceTrackingFeature.RIGHT_EYE);
feature.addItem(Effects.FaceTrackingFeature.RIGHT_EYEBROW_LEFT);
feature.addItem(Effects.FaceTrackingFeature.RIGHT_EYEBROW_RIGHT);
feature.addItem(Effects.FaceTrackingFeature.UPPER_LIP);
featureInput.add(feature);
feature.setSelectedIndex(0);
Button update=new Button("set image");
editor.add(update);
update.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(face!=null){
face.setVisible(false);
}
ImageResource resource=Effects.creatImageResource(imageUrl.getText());
FaceTrackingOverlayParameter params=FaceTrackingOverlayParameter.create().offset(toDouble(offsetX.getValue()),toDouble(offsetY.getValue())).
rotateWithFace(rotateWithFace.getValue()).
rotation(toDouble(rotation.getValue())).
scale(toDouble(scale.getValue())).scaleWithFace(scaleWithFace.getValue()).
trackingFeature(feature.getValue(feature.getSelectedIndex()));
//ImageResourceParameter params=ImageResource.params();
Test2.log(params);
face=resource.showFaceTrackingOverlay(params);
updateList();
}
});
container=new VerticalPanel();
panels.add(container);
//event
add(new Label("[Events]"));
HorizontalPanel monitors=new HorizontalPanel();
add(monitors);
canvas = Canvas.createIfSupported();
canvas.setSize(canvasW+"px",canvasH+"px");
canvas.setCoordinateSpaceHeight(canvasH);
canvas.setCoordinateSpaceWidth(canvasW);
add(canvas);
Button startBt=new Button("start monitor face-tracking");
monitors.add(startBt);
startBt.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(monitoring){
return;
}
monitoring=true;
listener=new FaceTrackingDataChangedListener() {
@Override
public void onFaceTrackingDataChanged(FaceTrackingData event) {
updateFace(event);
}
};
test2();
OnFaceTrackingDataChanged.add(listener);
Test2.log("add listener");
canvas.setFocus(true);
}
});
Button stopBt=new Button("stop monitor face-tracking");
monitors.add(stopBt);
stopBt.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
OnFaceTrackingDataChanged.remove(listener);
monitoring=false;
Test2.log("remove listener");
}
});
}
private FaceTrackingDataChangedListener listener;
private boolean monitoring;
private Canvas canvas;
final int canvasW=160;
final int canvasH=90;
private void updateFace(FaceTrackingData event){
Test2.log("event-called");
String debug="init";
XYPoint rightE=null;
XYPoint mouse=null;
XYPoint nose=null;
XYPoint leftE=null;
try{
leftE=event.getLeftEye();
rightE=event.getRightEye();
mouse=event.getMouthCenter();
nose=event.getNoseTip();
if(leftE==null){
Test2.log("left-eye:null");//sometime null
return;
}
canvas.getContext2d().fillRect(80, 45, 10, 10);
canvas.getContext2d().clearRect(0, 0, canvasW, canvasH);
canvas.getContext2d().setFillStyle("#ff0000");
//canvas.getContext2d().fillRect(80, 45, 10, 10);
int cx=canvasW/2;
int cy=canvasH/2;
debug="left";
double lx=leftE.getX()*canvasW;
double ly=leftE.getY()*canvasH;
Test2.log(lx+","+ly);
canvas.getContext2d().fillRect(lx+cx,ly+cy, 5, 5);
debug="right";
canvas.getContext2d().fillRect(rightE.getX()*canvasW+cx, rightE.getY()*canvasH+cy, 5, 5);
debug="nose";
canvas.getContext2d().fillRect(nose.getX()*canvasW+cx, nose.getY()*canvasH+cy, 5, 5);
debug="mouse";
canvas.getContext2d().fillRect(mouse.getX()*canvasW+cx, mouse.getY()*canvasH+cy, 5, 5);
}catch(Exception e){
Test2.log(debug+","+e.getMessage());
Test2.log(leftE);
Test2.log(rightE);
Test2.log(mouse);
Test2.log(nose);
}
}
private double toDouble(String value){
double ret=0;
try{
ret=Double.parseDouble(value);
}catch (Exception e) {
}
return ret;
}
public final native String test() /*-{
console.log($wnd.gapi.hangout.av.effects.FaceTrackingFeature);
}-*/;
public final native String test2() /*-{
console.log("onFaceTrackingDataChanged");
console.log($wnd.gapi.hangout.av.onFaceTrackingDataChanged);
}-*/;
protected void updateList() {
container.clear();
String url=face.getImageResource().getUrl();
container.add(new Label(url));
Image img=new Image(url);
img.setWidth("100px");
container.add(img);
XYPoint offset=face.getOffset();
container.add(new Label("offset:"+offset.getX()+","+offset.getY()));
container.add(new Label("rotationWithFace:"+face.getRotateWithFace()));
container.add(new Label("rotation:"+face.getRotation()));
container.add(new Label("scale:"+face.getScale()));
container.add(new Label("scaleWithFace:"+face.getScaleWithFace()));
container.add(new Label("trackingFeature:"+face.getTrackingFeature()));
container.add(new Label("visible:"+face.isVisible()));
}
}