package com.glview.hwui; import java.util.ArrayList; import java.util.List; import com.glview.graphics.Path; import com.glview.graphics.PointF; import com.glview.graphics.Path.Verb; public class PathTessellator { final static int MAX_POOL_SIZE = 10000; static ThreadLocal<List<PointF>> sThreadLocal = new ThreadLocal<List<PointF>>() { @Override protected List<PointF> initialValue() { return new ArrayList<PointF>(); } }; public static void tessellatePath(Path path, GLPaint paint) { boolean forceClose = paint.getStyle() != GLPaint.Style.STROKE; } static boolean approximatePathOutlineVertices(Path path, boolean forceClose, float sqrInvScaleX, float sqrInvScaleY, float thresholdSquared, List<PointF> outputVertices) { PointF lastPoint = obtainPoint(); int srcPts = 0; PointF fMoveTo = new PointF(); PointF pt; for (Verb verb : path.fVerbs()) { switch (verb) { case kMove_Verb: pt = obtainPoint(); pt.set(path.fPointFs().get(srcPts)); lastPoint.set(pt); fMoveTo.set(lastPoint); srcPts += 1; pushToVector(outputVertices, pt.x, pt.y); break; case kLine_Verb: pt = obtainPoint(); pt.set(path.fPointFs().get(srcPts)); lastPoint.set(pt); srcPts += 1; pushToVector(outputVertices, pt.x, pt.y); break; case kQuad_Verb: srcPts += 2; break; case kCubic_Verb: srcPts += 3; break; case kClose_Verb: lastPoint.set(fMoveTo); break; default: break; } } return false; } static void pushToVector(List<PointF> vertices, float x, float y) { PointF pt = obtainPoint(); pt.set(x, y); vertices.add(pt); } static PointF obtainPoint() { List<PointF> pts = sThreadLocal.get(); int size = pts.size(); if (size > 0) { return pts.remove(size - 1); } return new PointF(); } static void recyclePoint(PointF pt) { List<PointF> pts = sThreadLocal.get(); if (pts.size() >= MAX_POOL_SIZE) { return; } pts.add(pt); } }