package com.akjava.gwt.lib.client.canvas; import com.akjava.gwt.lib.client.CanvasUtils; import com.akjava.lib.common.graphics.IntRect; import com.akjava.lib.common.utils.ValuesUtils; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.TextMetrics; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; public class IntRectCanvasTextUtils { //TODO Test public static void drawCenterInRect(Canvas canvas,String text,IntRect rect){ canvas.getContext2d().save(); TextMetrics metrix=canvas.getContext2d().measureText(text); int dx=(int) ((rect.getWidth()-metrix.getWidth())/2); int dy=rect.getHeight()/2; //int size=parseFontSize(canvas.getContext2d().getFont()); //double descentOffset=(double)size/4; offset no need anymore canvas.getContext2d().setTextBaseline("middle"); canvas.getContext2d().fillText(text, rect.getX()+dx, rect.getY()+dy); canvas.getContext2d().restore(); } static RegExp nums=RegExp.compile("(\\d+)px"); public static int parseFontSize(String text){ MatchResult result=nums.exec(text); if(result.getGroupCount()>1){ //LogUtils.log(result.getGroupCount()+","+result.getGroup(0)+","+result.getGroup(1)); return ValuesUtils.toInt(result.getGroup(1), 0); } return 0; } public static IntRect getAlignRect(Canvas canvas,int cw,int ch,String text,int align,int valign){ TextMetrics metrix=canvas.getContext2d().measureText(text); double width=metrix.getWidth(); int size=parseFontSize(canvas.getContext2d().getFont()); double descentOffset=(double)size/4; int height=size-(int) (descentOffset/2); double dx=0; //ALIGN_LEFT double dy=0; if(align==CanvasUtils.ALIGN_CENTER){ dx=(cw-width)/2; }else if(align==CanvasUtils.ALIGN_RIGHT){ dx=cw-width; } if(valign==CanvasUtils.VALIGN_MIDDLE){ dy=(ch-height)/2; }else if(valign==CanvasUtils.VALIGN_BOTTOM){ dy=ch-height; } return new IntRect((int)dx,(int)dy,(int)width,size); } public static IntRect getAlignRect(Canvas canvas,String text,int align,int valign){ int cw=canvas.getCoordinateSpaceWidth(); int ch=canvas.getCoordinateSpaceHeight(); return getAlignRect(canvas,cw,ch,text,align,valign); } }