package com.akjava.gwt.lib.client.experimental;
import static com.google.common.base.Preconditions.checkNotNull;
import com.akjava.gwt.html5.client.file.Blob;
import com.akjava.gwt.lib.client.CanvasUtils;
import com.akjava.gwt.lib.client.ImageElementUtils;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.lib.common.io.FileType;
import com.google.common.base.Optional;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.dom.client.ImageElement;
public class ImageBuilder {
public static Canvas sharedCanvas;
public static Canvas getSharedCanvas() {
if(sharedCanvas==null){
//LogUtils.log("initialized-shared-canvas");
sharedCanvas=Canvas.createIfSupported();
}
return sharedCanvas;
}
public static class WebPBuilder extends ImageBuilder{
public static WebPBuilder from(String dataUrl){
checkNotNull(dataUrl);
return new WebPBuilder(dataUrl);
}
public static WebPBuilder from(Canvas canvas){
checkNotNull(canvas);
return new WebPBuilder(canvas);
}
/* need wait to load use ImageElement
public static WebPBuilder from(Blob blob){
checkNotNull(blob);
return new WebPBuilder(blob);
}
*/
public static WebPBuilder from(ImageElement imageElement){
checkNotNull(imageElement);
return new WebPBuilder(imageElement);
}
private WebPBuilder(String dataUrl){
super(dataUrl);
super.onWeebp();
}
private WebPBuilder(Canvas canvas){
super(canvas);
super.onWeebp();
}
/*
private WebPBuilder(Blob blob){
super(blob);
super.onWeebp();
}
*/
private WebPBuilder(ImageElement imageElement){
super(imageElement);
super.onWeebp();
}
@Override
public ImageBuilder onWeebp(){
throw new UnsupportedOperationException();
}
@Override
public ImageBuilder onPng(){
throw new UnsupportedOperationException();
}
@Override
public ImageBuilder onJpeg(){
throw new UnsupportedOperationException();
}
}
public static void setSharedCanvas(Canvas sharedCanvas) {
ImageBuilder.sharedCanvas = sharedCanvas;
}
private Canvas canvas;
private String dataUrl;
//private Blob blob;
private ImageElement imageElement;
protected FileType fileType=FileType.PNG;
public static ImageBuilder from(String dataUrl){
checkNotNull(dataUrl);
return new ImageBuilder(dataUrl);
}
/*
public static ImageBuilder from(Blob blob){
checkNotNull(blob);
return new ImageBuilder(blob);
}
*/
public static ImageBuilder from(Canvas canvas){
checkNotNull(canvas);
return new ImageBuilder(canvas);
}
/*
public static ImageBuilder from(ImageData imageData){
checkNotNull(imageData);
//need own canvas
return new ImageBuilder(CanvasUtils.createCanvas(getSharedCanvas(), imageData));
}
*/
public static ImageBuilder from(ImageElement imageElement){
checkNotNull(imageElement);
return new ImageBuilder(imageElement);
}
private ImageBuilder(String dataUrl){
this.dataUrl=dataUrl;
}
private ImageBuilder(Canvas canvas){
this.canvas=canvas;
}
/*
private ImageBuilder(Blob blob){
this.blob=blob;
}
*/
private ImageBuilder(ImageElement imageElement){
this.imageElement=imageElement;
}
public ImageBuilder onWeebp(){
this.fileType=FileType.WEBP;
return this;
}
public ImageBuilder onPng(){
this.fileType=FileType.PNG;
return this;
}
public ImageBuilder onJpeg(){
this.fileType=FileType.JPEG;
return this;
}
public ImageBuilder on(FileType fileType){
this.fileType=fileType;
return this;
}
public ImageBuilder onFileName(String fileName){
Optional<FileType> type=FileType.getFileTypeFromFileName(fileName);
FileType fileType;
if(type.isPresent()){
fileType=type.get();
}else{
fileType=FileType.PNG;
}
return this.on(fileType);
}
//for write FileSystem API
public Blob toBlob(){
String dataUrl=toDataUrl();
return Blob.createBase64Blob(dataUrl, fileType.getMimeType());
}
public String toDataUrl(){
//need resize?
Canvas shareCanvas=getSharedCanvas();
if(shareCanvas==null){
LogUtils.log("invalidlly create-shared-canvas");
shareCanvas=Canvas.createIfSupported();
setSharedCanvas(shareCanvas);
}
if(dataUrl!=null){
ImageElementUtils.copytoCanvas(dataUrl, shareCanvas);
return shareCanvas.toDataUrl(fileType.getMimeType());
}
/*
if(blob!=null){
ImageElementUtils.copytoCanvas(blob, shareCanvas);
return shareCanvas.toDataUrl(fileType.getMimeType());
}
*/
if(imageElement!=null){
ImageElementUtils.copytoCanvas(imageElement, shareCanvas);
return shareCanvas.toDataUrl(fileType.getMimeType());
}
if(canvas!=null){
CanvasUtils.copyTo(canvas, shareCanvas,true);
return shareCanvas.toDataUrl(fileType.getMimeType());
}
return null;//other type
}
}