package com.akjava.gwt.lib.client; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.ImageData; import com.google.gwt.dom.client.ImageElement; /** * @deprecated * * do resize canvas with CanvasUtils * on converting image use ImageBuilder. * @author aki * */ public class CanvasResizer { private CanvasResizer(Canvas canvas) { super(); this.canvas = canvas; } private Canvas canvas; private ImageElement image; private int dx; private int dy; private int dw; private int dh; private boolean useDownScale; public static CanvasResizer on(Canvas canvas){//need canvas for reduce re-create canvas. return new CanvasResizer(canvas); } public CanvasResizer image(ImageElement element){ canvas.setCoordinateSpaceWidth(element.getWidth()); canvas.setCoordinateSpaceHeight(element.getHeight()); //canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); //canvas.getContext2d().drawImage(element, 0, 0);//TODO fix draw twice this.image=element; return this; } public CanvasResizer width(int width){ int w=canvas.getCoordinateSpaceWidth(); int h=canvas.getCoordinateSpaceHeight(); double wr=(double)w/width; int newHeight=(int)(h/wr); canvas.setCoordinateSpaceWidth(width); canvas.setCoordinateSpaceHeight(newHeight); dx=0; dy=0; dw=width; dh=newHeight; return this; } public CanvasResizer downscale(boolean downscale){ this.useDownScale=downscale; return this; } public CanvasResizer height(int size){ int w=canvas.getCoordinateSpaceWidth(); int h=canvas.getCoordinateSpaceHeight(); double hr=(double)h/size; int newWidth=(int)(w/hr); canvas.setCoordinateSpaceWidth(newWidth); canvas.setCoordinateSpaceHeight(size); dx=0; dy=0; dw=newWidth; dh=size; return this; } private void drawImage(){ boolean needDownscale=false; if(useDownScale){ if(image!=null && image.getWidth()>dw){ needDownscale=true; } } if(needDownscale){ double scale=(double)dw/image.getWidth(); ImageData data=JSDownScale.downScaleCanvas(ImageElementUtils.copytoCanvas(image, null).getCanvasElement(), scale); canvas.getContext2d().putImageData(data, dx, dy); //TODO //how to keep alpha? //simple draw & get alpha from original and recopy it? }else{ canvas.getContext2d().drawImage(image, dx, dy,dw,dh); } } public Canvas toCanvas(){ canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); drawImage(); return canvas; } public String toPngDataUrl(){ canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); drawImage(); return canvas.toDataUrl(); } public String toJpegDataUrl(){ canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); drawImage(); return canvas.toDataUrl("image/jpeg"); } public String toWebpDataUrl(){ canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); drawImage(); return canvas.toDataUrl("image/webp"); } }