// // Latex Project Public Licence (lppl1.3) applies // Originally written by Kwanleung Tse // First Release : 1st July, 2014 // Last Update : 25th September, 2014 // // package worker4math.hktex2; import java.util.ArrayList; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.SparseBooleanArray; public class Parsegraphics { public static volatile SparseArray thisypos = new SparseArray(); public static volatile SparseBooleanArray error = new SparseBooleanArray(); public static volatile SparseArray errormessage = new SparseArray(); public void parsegraphics(Canvas canvas, Block block, ParagraphBlock paragraphblock, Integer tid, Integer containerwidth, Integer containerheight, Integer tablelinenumber, ArrayList tablehlinecounter, Integer superblocknumber, SuperBlock superblock ,SparseArray> superblockline,SparseIntArray superblocknumline, SparseIntArray superblockstartline, SparseIntArray superblockendline, ArrayList tf , Float ypos, String attribute2, String attribute) { int i,j; int tid2=tid*1000; int captionnumline=-1; int viewportwidth=containerwidth-Header.leftsidemargin-Header.rightsidemargin; float adjusty=ypos; float adjustx=0.0f; float thisypos2=0; String currentline=""; String bitmapname=""; ArrayList captionline = new ArrayList(); error.put(tid,false); errormessage.put(tid,""); Paint textpaint = new Paint(); Rect textbounds = new Rect(); textpaint.setTextSize(Integer.parseInt(attribute.substring(1,4))); textpaint.setTypeface(tf.get(Integer.parseInt(attribute.substring(4,7)))); textpaint.getTextBounds("Aj",0,"Aj".length(),textbounds); Boolean captionattop=false; int tablefirstline=superblockstartline.get(superblocknumber); int lastline=superblockendline.get(superblocknumber)-superblockstartline.get(superblocknumber); String sfontsize; for (i=0;i<=lastline;i++){ currentline=superblockline.get(superblocknumber).get(i); String line=currentline.trim(); if (line.length() >=15 && line.substring(0,15).equals("!begin{caption}")){ if (i==0){captionattop=true;} else {captionattop=false;}; Boolean caption=true; i++; currentline=superblockline.get(superblocknumber).get(i); line=currentline.trim(); if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;captionnumline++;} while(caption){ j=line.indexOf("!!"); line=line.substring(0,j); captionline.add(line); i++;captionnumline++; currentline=superblockline.get(superblocknumber).get(i); line=currentline.trim(); if (line.length() >=13 && line.substring(0,13).equals("!end{caption}")){caption=false;i++;} } tablelinenumber=tablelinenumber-captionnumline-1; if(captionattop){tablefirstline=i+tablefirstline; currentline=superblockline.get(superblocknumber).get(i);} } } // Add top caption SuperBlock.tablestartline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)+1); if (captionattop){ Parsetext caption = new Parsetext(); for (i=0;i<=captionnumline;i++){ sfontsize=Integer.toString(Header.fontsize); if (sfontsize.length()==1){ attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); } else if (sfontsize.length()==2){ attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); } else if (sfontsize.length()==3){ attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); } caption.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , adjusty, tf, attribute2, attribute, false, 0.0f); thisypos2=Parsetext.thisypos.get(tid); error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); } adjusty=Parsetext.thisypos.get(tid); thisypos.put(tid,adjusty); }} if (!captionattop){ currentline=superblockline.get(superblocknumber).get(0); } else { currentline=superblockline.get(superblocknumber).get(i+captionnumline+1); } currentline=currentline.trim(); j=currentline.indexOf("!!"); bitmapname=currentline.substring(0,j); if (!DocumentBitmap.usedbitmap.contains(bitmapname)){ DocumentBitmap.usedbitmap.add(bitmapname);} ArrayList tsubblock = new ArrayList(); ArrayList tsubblockxpos = new ArrayList(); ArrayList tsubblockypos = new ArrayList(); ArrayList tsubblockattribute = new ArrayList(); tsubblock.add(bitmapname); tsubblockxpos.add((containerwidth-DocumentBitmap.bitmapwidth.get(bitmapname))/2); tsubblockypos.add(adjusty); tsubblockattribute.add("g"); synchronized(this){ superblock.create(tid); superblock.add(tid,tsubblock,tsubblockxpos,tsubblockypos,tsubblockattribute,DocumentBitmap.bitmapwidth.get(bitmapname) , DocumentBitmap.bitmapheight.get(bitmapname), 0.0f,'t',0); } thisypos2 = adjusty+DocumentBitmap.bitmapheight.get(bitmapname)+Header.linegap; thisypos.put(tid,thisypos2); if (!captionattop){ Parsetext caption = new Parsetext(); for (i=0;i<=captionnumline;i++){ sfontsize=Integer.toString(Header.fontsize); if (sfontsize.length()==1){ attribute2 = "100"+sfontsize+"002"+attribute2.substring(7); } else if (sfontsize.length()==2){ attribute2 = "10"+sfontsize+"002"+attribute2.substring(7); } else if (sfontsize.length()==3){ attribute2 = "1"+sfontsize+"002"+attribute2.substring(7); } caption.parsetext(canvas, block, paragraphblock, tid, containerwidth, containerheight, superblocknumber, superblock, captionline.get(i), Header.leftsidemargin , thisypos2, tf, attribute2, attribute, false, 0.0f); thisypos2=Parsetext.thisypos.get(tid); error.put(tid, Parsetext.error.get(tid)); if (error.get(tid)){errormessage.put(tid, Parsetext.errormessage.get(tid)); return;}; adjustx=(viewportwidth-SuperBlock.superblocklinewidth.get(tid).get(SuperBlock.superblocklinewidth.get(tid).size()-1))/2; for (int ij=0;ij<=SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).size()-1;ij++){ SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).set(ij,SuperBlock.blockxpos.get(SuperBlock.superblocklinenumber.get(tid)+tid2).get(ij)+adjustx); } thisypos.put(tid,Parsetext.thisypos.get(tid)); }} SuperBlock.tableendline.put(tid2+SuperBlock.tablenumber.get(tid), SuperBlock.superblocklinenumber.get(tid)); SuperBlock.tableheight.put(tid2+SuperBlock.tablenumber.get(tid),thisypos.get(tid)-ypos); }}