package net.npe.imagecanvastest.client;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.CanvasPixelArray;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.canvas.dom.client.ImageData;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.typedarrays.client.Uint8ArrayNative;
import com.google.gwt.typedarrays.shared.ArrayBuffer;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.xhr.client.ReadyStateChangeHandler;
import com.google.gwt.xhr.client.XMLHttpRequest;
import com.google.gwt.xhr.client.XMLHttpRequest.ResponseType;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class ImageCanvasTest implements EntryPoint {
private static String [] TGA_FILES = {
"grayscale_a_LL.tga",
"grayscale_a_LR.tga",
"grayscale_a_rle_LL.tga",
"grayscale_a_rle_LR.tga",
"grayscale_a_rle_UL.tga",
"grayscale_a_rle_UR.tga",
"grayscale_a_UL.tga",
"grayscale_a_UR.tga",
"grayscale_LL.tga",
"grayscale_LR.tga",
"grayscale_rle_LL.tga",
"grayscale_rle_LR.tga",
"grayscale_rle_UL.tga",
"grayscale_rle_UR.tga",
"grayscale_UL.tga",
"grayscale_UR.tga",
"indexed_a_LL.tga",
"indexed_a_LR.tga",
"indexed_a_rle_LL.tga",
"indexed_a_rle_LR.tga",
"indexed_a_rle_UL.tga",
"indexed_a_rle_UR.tga",
"indexed_a_UL.tga",
"indexed_a_UR.tga",
"indexed_LL.tga",
"indexed_LR.tga",
"indexed_rle_LL.tga",
"indexed_rle_LR.tga",
"indexed_rle_UL.tga",
"indexed_rle_UR.tga",
"indexed_UL.tga",
"indexed_UR.tga",
"rgb_a_LL.tga",
"rgb_a_LR.tga",
"rgb_a_rle_LL.tga",
"rgb_a_rle_LR.tga",
"rgb_a_rle_UL.tga",
"rgb_a_rle_UR.tga",
"rgb_a_UL.tga",
"rgb_a_UR.tga",
"rgb_LL.tga",
"rgb_LR.tga",
"rgb_rle_LL.tga",
"rgb_rle_LR.tga",
"rgb_rle_UL.tga",
"rgb_rle_UR.tga",
"rgb_UL.tga",
"rgb_UR.tga",
};
public void onModuleLoad() {
panel = new FlowPanel();
panel.getElement().getStyle().setBackgroundColor("orange");
for(int i=0; i<TGA_FILES.length; i++) {
addTGACanvas("images/"+TGA_FILES[i]);
}
RootLayoutPanel.get().add(new ScrollPanel(panel));
}
private FlowPanel panel;
private void addTGACanvas(String url) {
XMLHttpRequest request = XMLHttpRequest.create();
request.open("GET", url);
request.setResponseType(ResponseType.ArrayBuffer);
request.setOnReadyStateChange(new ReadyStateChangeHandler() {
@Override
public void onReadyStateChange(XMLHttpRequest xhr) {
if(xhr.getReadyState() == XMLHttpRequest.DONE) {
if(xhr.getStatus() >= 400) {
// error
System.out.println("Error");
}
else {
try {
ArrayBuffer arrayBuffer = xhr.getResponseArrayBuffer();
Uint8ArrayNative u8array = Uint8ArrayNative.create(arrayBuffer);
byte [] buffer = new byte[u8array.length()];
for(int i=0; i<buffer.length; i++) {
buffer[i] = (byte)u8array.get(i);
}
int pixels [] = TGAReader.read(buffer, TGAReader.ABGR);
int width = TGAReader.getWidth(buffer);
int height = TGAReader.getHeight(buffer);
Canvas canvas = createImageCanvas(pixels, width, height);
panel.add(canvas);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
});
request.send();
}
private Canvas createImageCanvas(int [] pixels, int width, int height) {
Canvas canvas = Canvas.createIfSupported();
canvas.setCoordinateSpaceWidth(width);
canvas.setCoordinateSpaceHeight(height);
Context2d context = canvas.getContext2d();
ImageData data = context.createImageData(width, height);
CanvasPixelArray array = data.getData();
for(int i=0; i<width*height; i++) { // ABGR
array.set(4*i+0, pixels[i] & 0xFF);
array.set(4*i+1, (pixels[i] >> 8) & 0xFF);
array.set(4*i+2, (pixels[i] >> 16) & 0xFF);
array.set(4*i+3, (pixels[i] >> 24) & 0xFF);
}
context.putImageData(data, 0, 0);
canvas.getElement().getStyle().setMargin(4, Unit.PX);
return canvas;
}
}