package cgeo.geocaching.utils; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import java.util.ArrayList; /** * Utility class to enhance the {@link Canvas}. */ public class CanvasUtils { private CanvasUtils() { // utility } /** * Render a path by actually drawing line segments instead. When using a real {@link Path}, then it is first painted * into a temporary bitmap by the CPU, before being rendered by the GPU. That simply fails for large paths, * therefore we use a synthesis from line segments, since lines are drawn entirely by the GPU. */ public static void drawPath(final ArrayList<Point> pixelPoints, final Canvas canvas, final Paint paint) { final float[] pointData = new float[(pixelPoints.size() - 1) * 4]; for (int i = 1; i < pixelPoints.size(); i++) { final Point last = pixelPoints.get(i - 1); final Point current = pixelPoints.get(i); final int index = (i - 1) * 4; // start point pointData[index] = last.x; pointData[index + 1] = last.y; // end point pointData[index + 2] = current.x; pointData[index + 3] = current.y; } canvas.drawLines(pointData, paint); } }