package com.akjava.gwt.lib.client.experimental.opencv;
import java.util.List;
import com.akjava.lib.common.graphics.IntRect;
import com.akjava.lib.common.utils.ValuesUtils;
import com.google.common.base.CharMatcher;
import com.google.common.base.Converter;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
public class CVImageDataConverter extends Converter<String, CVImageData>{
private static Splitter splitter=Splitter.on(CharMatcher.WHITESPACE);
private static Joiner joiner=Joiner.on(" ");
@Override
protected CVImageData doForward(String a) {
if(a.isEmpty()){
CVImageData data=new CVImageData();
data.setFileName("");
return data;
}
List<String> values=splitter.omitEmptyStrings().splitToList(a);
CVImageData data=new CVImageData();
data.setFileName(values.get(0));
if(values.size()>1){
//int rectNumber=Objects.firstNonNull(Ints.tryParse(values.get(1)), 0);
int rectNumber=ValuesUtils.toInt(values.get(1), 0);
//set number on final
for(int i=0;i<rectNumber;i++){
int findex=2+i*4;
if(values.size()>1+(i+1)*4){
int x=ValuesUtils.toInt(values.get(findex), 0);
int y=ValuesUtils.toInt(values.get(findex+1), 0);
int w=ValuesUtils.toInt(values.get(findex+2), 0);
int h=ValuesUtils.toInt(values.get(findex+3), 0);
if(x>=0 && y>=0 && w>0 && h>0){
data.getRects().add(new IntRect(x,y,w,h));
}
}
}
//contain invalid rect,clear all
if(rectNumber!=data.getRects().size()){
data.getRects().clear();
}
}
return data;
}
@Override
protected String doBackward(CVImageData data) {
List<String> vs=Lists.newArrayList();
vs.add(data.getFileName());
if(data.getRects().size()>0){
vs.add(String.valueOf(data.getRects().size()));
}
for(IntRect r:data.getRects()){
//sadly some case throw double value
String x=String.valueOf(r.getX());
if(x.indexOf(".")!=-1){
x=x.substring(0,(x.indexOf(".")));
}
String y=String.valueOf(r.getY());
if(y.indexOf(".")!=-1){
y=y.substring(0,(y.indexOf(".")));
}
String w=String.valueOf(r.getWidth());
if(w.indexOf(".")!=-1){
w=w.substring(0,(w.indexOf(".")));
}
String h=String.valueOf(r.getHeight());
if(h.indexOf(".")!=-1){
h=h.substring(0,(h.indexOf(".")));
}
vs.add(x);
vs.add(y);
vs.add(w);
vs.add(h);
}
return joiner.join(vs);
}
}