package com.akjava.gwt.lib.client.experimental.cifar10;
import static com.google.common.base.Preconditions.checkState;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.collect.Lists;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.ImageData;
public class Cifar10Parser {
public static Canvas sharedCanvas;
private static Canvas getSharedCanvas(){
if(sharedCanvas==null){
sharedCanvas=Canvas.createIfSupported();
}
return sharedCanvas;
}
public List<Cifar10Data> parse(byte[] bytes,@Nullable String name){
List<Cifar10Data> datas=Lists.newArrayList();
checkState(bytes.length==30730000," invalid byte-data:length="+bytes.length);
for(int i=0;i<1000;i++){
//LogUtils.log("making:"+i);
Cifar10Data data=new Cifar10Data();
data.setName(name);
int index=3073*i;
data.setClassNumber(bytes[index]);
ImageData imageData=create(getSharedCanvas(),32,32);
//red
for(int ry=0;ry<32;ry++){
for(int rx=0;rx<32;rx++){
int redIndex=(index+1)+ry*32+rx;
int red=toInt(bytes[redIndex]);
imageData.setRedAt(red, rx, ry);
imageData.setAlphaAt(255, rx, ry);
}
}
//green
for(int gy=0;gy<32;gy++){
for(int gx=0;gx<32;gx++){
int greenIndex=(index+1)+1024+gy*32+gx;
imageData.setGreenAt(toInt(bytes[greenIndex]), gx, gy);
}
}
//blue
for(int by=0;by<32;by++){
for(int bx=0;bx<32;bx++){
int blueIndex=(index+1)+1024+1024+by*32+bx;
imageData.setBlueAt(toInt(bytes[blueIndex]), bx, by);
}
}
data.setImageData(imageData);
//cat only test
datas.add(data);
}
return datas;
}
public static ImageData create(Canvas canvas,int w,int h){
if(canvas==null){
canvas=getSharedCanvas();
}
return canvas.getContext2d().createImageData(w, h);
}
private static final int UNSIGNED_MASK = 0xFF;
public static int toInt(byte value) {
return value & UNSIGNED_MASK;
}
}