package com.akjava.gwt.lib.client.experimental; import static com.google.common.base.Preconditions.checkNotNull; import javax.annotation.Nullable; import com.akjava.gwt.lib.client.CanvasUtils; import com.akjava.gwt.lib.client.ImageElementUtils; import com.akjava.lib.common.graphics.IntRect; import com.akjava.lib.common.graphics.Rect; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.dom.client.ImageElement; public class RectCanvasUtils { private static Canvas sharedCanvas=Canvas.createIfSupported();//TODO delay public static Canvas crop(String dataUrl,IntRect rect,@Nullable Canvas retCanvas){ checkNotNull(dataUrl); checkNotNull(rect); Canvas imageCanvas=ImageElementUtils.copytoCanvas(dataUrl, sharedCanvas); if(retCanvas==null){ retCanvas=Canvas.createIfSupported(); } CanvasUtils.createCanvas(retCanvas, rect.getWidth(),rect.getHeight()); retCanvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), -rect.getX(), -rect.getY()); return retCanvas; } public static Canvas crop(Canvas canvas,IntRect rect,@Nullable Canvas retCanvas){ checkNotNull(rect); return crop(canvas,rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight(),retCanvas); } public static Canvas crop(Canvas canvas,int x,int y,int w,int h,@Nullable Canvas retCanvas){ checkNotNull(canvas); if(retCanvas==null){ retCanvas=Canvas.createIfSupported(); } //use imagedata style can't crop over pos CanvasUtils.createCanvas(retCanvas, w,h); //retCanvas.getContext2d().drawImage(canvas.getCanvasElement(), -x, -y); retCanvas.getContext2d().drawImage(canvas.getCanvasElement(), x,y,w,h,0,0,w,h); return retCanvas; } public static IntRect createRectFromCanvasSize(Canvas canvas){ return new IntRect(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } public static Canvas crop(ImageElement image,IntRect rect,@Nullable Canvas retCanvas){ checkNotNull(image); checkNotNull(rect); if(retCanvas==null){ retCanvas=Canvas.createIfSupported(); } //use imagedata style can't crop over pos CanvasUtils.createCanvas(retCanvas, rect.getWidth(),rect.getHeight()); retCanvas.getContext2d().drawImage(image, -rect.getX(), -rect.getY()); return retCanvas; } public static void fill(IntRect r, Canvas canvas, String style) { canvas.getContext2d().setFillStyle(style); canvas.getContext2d().fillRect(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } public static void stroke(IntRect r, Canvas canvas, @Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().strokeRect(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } public static void stroke(Rect r, Canvas canvas, @Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().strokeRect(r.getX(), r.getY(), r.getWidth(), r.getHeight()); } public static void fillCircle(IntRect rect,Canvas canvas,boolean inbox){ fillCircle(canvas,rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight(),inbox); } public static void fillCircle(Canvas canvas,int x,int y,int width,int height,boolean inbox){ drawCircle(canvas,x,y,width,height,inbox,false); } public static void strokeCircle(IntRect rect,Canvas canvas,boolean inbox){ strokeCircle(canvas,rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight(),inbox); } public static void strokeCircle(Canvas canvas,int x,int y,int width,int height,boolean inbox){ drawCircle(canvas,x,y,width,height,inbox,true); } private static void drawCircle(Canvas canvas,int x,int y,int width,int height,boolean inbox,boolean stroke){ int cx=x+width/2; int cy=y+height/2; double rad; if(inbox){ rad=width>height?height/2:width/2; }else{ double longer=width>height?width/2:height/2; rad=Math.sqrt(Math.pow(longer, 2)*2); } Context2d context=canvas.getContext2d(); context.beginPath(); canvas.getContext2d().arc(cx, cy, rad, 0, Math.PI*2); context.closePath(); if(stroke){ context.stroke(); }else{ context.fill(); } } public static void strokeOval(IntRect rect,Canvas canvas,boolean inbox){ strokeOval(canvas,rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight(),inbox); } public static void strokeOval(Canvas canvas,int x,int y,int width,int height,boolean inbox){ int cx=x+width/2; int cy=y+height/2; double rad; double wscale=1; double hscale=1; if(inbox){ if(width>height){ rad=height/2; wscale=(double)width/height; }else{ rad=width/2;; hscale=(double)height/width; } }else{ double longer; if(width>height){ longer=height/2; wscale=(double)width/height; }else{ longer=width/2;; hscale=(double)height/width; } rad=Math.sqrt(Math.pow(longer, 2)*2); } Context2d context=canvas.getContext2d(); context.save(); context.translate(cx, cy); context.scale(wscale, hscale); context.beginPath(); canvas.getContext2d().arc(0, 0, rad, 0, Math.PI*2); context.closePath(); context.restore(); context.stroke(); } public static void fill(Rect rect, Canvas canvas, String rectColor) { canvas.getContext2d().setFillStyle(rectColor); canvas.getContext2d().fillRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); } public static void clear(Canvas canvas, Rect r) { canvas.getContext2d().clearRect(r.getX(), r.getY(), r.getWidth(),r.getHeight()); } }