diff --git a/OsmAnd/build.xml b/OsmAnd/build.xml index 0df9000fd9..0faf89b34c 100644 --- a/OsmAnd/build.xml +++ b/OsmAnd/build.xml @@ -13,7 +13,7 @@ - + @@ -29,22 +29,22 @@ - + - + - + - + @@ -56,13 +56,6 @@ - - - - - - - diff --git a/OsmAnd/res/drawable-hdpi/mx_amenity_college.png b/OsmAnd/res/drawable-hdpi/mx_amenity_college.png index b435c17d74..ff12f12374 100644 Binary files a/OsmAnd/res/drawable-hdpi/mx_amenity_college.png and b/OsmAnd/res/drawable-hdpi/mx_amenity_college.png differ diff --git a/OsmAnd/res/drawable-hdpi/mx_amenity_kindergarten.png b/OsmAnd/res/drawable-hdpi/mx_amenity_kindergarten.png index f9d5f052e9..e1e55ec38a 100644 Binary files a/OsmAnd/res/drawable-hdpi/mx_amenity_kindergarten.png and b/OsmAnd/res/drawable-hdpi/mx_amenity_kindergarten.png differ diff --git a/OsmAnd/res/drawable-hdpi/mx_amenity_school.png b/OsmAnd/res/drawable-hdpi/mx_amenity_school.png index a6bf647829..2d9653ea7e 100644 Binary files a/OsmAnd/res/drawable-hdpi/mx_amenity_school.png and b/OsmAnd/res/drawable-hdpi/mx_amenity_school.png differ diff --git a/OsmAnd/res/drawable-hdpi/mx_amenity_university.png b/OsmAnd/res/drawable-hdpi/mx_amenity_university.png index 33db3c042a..f234db87f9 100644 Binary files a/OsmAnd/res/drawable-hdpi/mx_amenity_university.png and b/OsmAnd/res/drawable-hdpi/mx_amenity_university.png differ diff --git a/OsmAnd/res/drawable-hdpi/mx_education.png b/OsmAnd/res/drawable-hdpi/mx_education.png index 33db3c042a..f234db87f9 100644 Binary files a/OsmAnd/res/drawable-hdpi/mx_education.png and b/OsmAnd/res/drawable-hdpi/mx_education.png differ diff --git a/OsmAnd/res/drawable-mdpi/mx_amenity_college.png b/OsmAnd/res/drawable-mdpi/mx_amenity_college.png index f909c837f6..f4f813c9ab 100644 Binary files a/OsmAnd/res/drawable-mdpi/mx_amenity_college.png and b/OsmAnd/res/drawable-mdpi/mx_amenity_college.png differ diff --git a/OsmAnd/res/drawable-mdpi/mx_amenity_kindergarten.png b/OsmAnd/res/drawable-mdpi/mx_amenity_kindergarten.png index fb05586a39..7e9b4e9b2e 100644 Binary files a/OsmAnd/res/drawable-mdpi/mx_amenity_kindergarten.png and b/OsmAnd/res/drawable-mdpi/mx_amenity_kindergarten.png differ diff --git a/OsmAnd/res/drawable-mdpi/mx_amenity_school.png b/OsmAnd/res/drawable-mdpi/mx_amenity_school.png index dc45f5fe19..3c42cc14d9 100644 Binary files a/OsmAnd/res/drawable-mdpi/mx_amenity_school.png and b/OsmAnd/res/drawable-mdpi/mx_amenity_school.png differ diff --git a/OsmAnd/res/drawable-mdpi/mx_amenity_university.png b/OsmAnd/res/drawable-mdpi/mx_amenity_university.png index c49808b0f1..25872ea58d 100644 Binary files a/OsmAnd/res/drawable-mdpi/mx_amenity_university.png and b/OsmAnd/res/drawable-mdpi/mx_amenity_university.png differ diff --git a/OsmAnd/res/drawable-mdpi/mx_education.png b/OsmAnd/res/drawable-mdpi/mx_education.png index c49808b0f1..25872ea58d 100644 Binary files a/OsmAnd/res/drawable-mdpi/mx_education.png and b/OsmAnd/res/drawable-mdpi/mx_education.png differ diff --git a/OsmAnd/res/drawable-xhdpi/mx_amenity_college.png b/OsmAnd/res/drawable-xhdpi/mx_amenity_college.png index 93e926bbeb..1fda995cba 100644 Binary files a/OsmAnd/res/drawable-xhdpi/mx_amenity_college.png and b/OsmAnd/res/drawable-xhdpi/mx_amenity_college.png differ diff --git a/OsmAnd/res/drawable-xhdpi/mx_amenity_kindergarten.png b/OsmAnd/res/drawable-xhdpi/mx_amenity_kindergarten.png index e0cdbde375..0bfdf3ccd2 100644 Binary files a/OsmAnd/res/drawable-xhdpi/mx_amenity_kindergarten.png and b/OsmAnd/res/drawable-xhdpi/mx_amenity_kindergarten.png differ diff --git a/OsmAnd/res/drawable-xhdpi/mx_amenity_school.png b/OsmAnd/res/drawable-xhdpi/mx_amenity_school.png index f4be7e8671..3f34e6d76a 100644 Binary files a/OsmAnd/res/drawable-xhdpi/mx_amenity_school.png and b/OsmAnd/res/drawable-xhdpi/mx_amenity_school.png differ diff --git a/OsmAnd/res/drawable-xhdpi/mx_amenity_university.png b/OsmAnd/res/drawable-xhdpi/mx_amenity_university.png index 19c604cf4a..ba02c2778c 100644 Binary files a/OsmAnd/res/drawable-xhdpi/mx_amenity_university.png and b/OsmAnd/res/drawable-xhdpi/mx_amenity_university.png differ diff --git a/OsmAnd/res/drawable-xhdpi/mx_education.png b/OsmAnd/res/drawable-xhdpi/mx_education.png index 19c604cf4a..ba02c2778c 100644 Binary files a/OsmAnd/res/drawable-xhdpi/mx_education.png and b/OsmAnd/res/drawable-xhdpi/mx_education.png differ diff --git a/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java b/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java index 56f0e4709d..a9b6ad51cf 100644 --- a/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java +++ b/OsmAnd/src/net/osmand/plus/render/RendererRegistry.java @@ -75,6 +75,9 @@ public class RendererRegistry { private RenderingRulesStorage loadRenderer(String name, final Map loadedRenderers, final Map renderingConstants) throws IOException, XmlPullParserException { InputStream is = getInputStream(name); + if(is == null) { + return null; + } try { XmlPullParser parser = PlatformUtil.newXMLPullParser(); parser.setInput(is, "UTF-8"); diff --git a/OsmAnd/src/net/osmand/plus/render/TextRenderer.java.bak b/OsmAnd/src/net/osmand/plus/render/TextRenderer.java.bak deleted file mode 100644 index 6935dd9173..0000000000 --- a/OsmAnd/src/net/osmand/plus/render/TextRenderer.java.bak +++ /dev/null @@ -1,494 +0,0 @@ -package net.osmand.plus.render; - - -import gnu.trove.map.hash.TIntObjectHashMap; -import gnu.trove.procedure.TIntObjectProcedure; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import net.osmand.FloatMath; -import net.osmand.QuadRect; -import net.osmand.RenderingContext; -import net.osmand.binary.BinaryMapDataObject; -import net.osmand.binary.BinaryMapIndexReader.TagValuePair; -import net.osmand.data.QuadTree; -import net.osmand.plus.ClientContext; -import net.osmand.plus.api.render.Canvas; -import net.osmand.plus.api.render.Color; -import net.osmand.plus.api.render.Paint; -import net.osmand.plus.api.render.Paint.Align; -import net.osmand.plus.api.render.Paint.Style; -import net.osmand.plus.api.render.Path; -import net.osmand.plus.api.render.Typeface; -import net.osmand.render.RenderingRuleSearchRequest; -import net.osmand.render.RenderingRulesStorage; -import net.sf.junidecode.Junidecode; - -import org.w3c.dom.css.Rect; - - -public class TextRenderer { - - private Paint paintText; - private final ClientContext context; - private Paint paintIcon; - - static class TextDrawInfo { - - public TextDrawInfo(String text) { - this.text = text; - } - - String text = null; - Path drawOnPath = null; - QuadRect bounds = null; - float vOffset = 0; - float centerX = 0; - float pathRotate = 0; - float centerY = 0; - float textSize = 0; - float minDistance = 0; - int textColor = Color.BLACK; - int textShadow = 0; - int textWrap = 0; - boolean bold = false; - String shieldRes = null; - int textOrder = 100; - - public void fillProperties(RenderingRuleSearchRequest render, float centerX, float centerY) { - this.centerX = centerX; - this.centerY = centerY + render.getIntPropertyValue(render.ALL.R_TEXT_DY, 0); - // used only for draw on path where centerY doesn't play role - this.vOffset = render.getIntPropertyValue(render.ALL.R_TEXT_DY, 0); - textColor = render.getIntPropertyValue(render.ALL.R_TEXT_COLOR); - if (textColor == 0) { - textColor = Color.BLACK; - } - textSize = render.getIntPropertyValue(render.ALL.R_TEXT_SIZE); - textShadow = render.getIntPropertyValue(render.ALL.R_TEXT_HALO_RADIUS, 0); - textWrap = render.getIntPropertyValue(render.ALL.R_TEXT_WRAP_WIDTH, 0); - bold = render.getIntPropertyValue(render.ALL.R_TEXT_BOLD, 0) > 0; - minDistance = render.getIntPropertyValue(render.ALL.R_TEXT_MIN_DISTANCE, 0); - if (render.isSpecified(render.ALL.R_TEXT_SHIELD)) { - shieldRes = render.getStringPropertyValue(render.ALL.R_TEXT_SHIELD); - } - textOrder = render.getIntPropertyValue(render.ALL.R_TEXT_ORDER, 100); - } - } - - public TextRenderer(ClientContext context) { - this.context = context; - paintText = context.getRendererAPI().newPaint(); - paintText.setStyle(Style.FILL); - paintText.setStrokeWidth(1); - paintText.setColor(Color.BLACK); - paintText.setTextAlign(Align.CENTER); - paintText.setTypeface(Typeface.create("Droid Serif", Typeface.NORMAL)); //$NON-NLS-1$ - paintText.setAntiAlias(true); - - paintIcon = context.getRendererAPI().newPaint(); - paintIcon.setStyle(Style.STROKE); - } - - public Paint getPaintText() { - return paintText; - } - - private float sqr(float a) { - return a * a; - } - - boolean intersects(QuadRect tRect, float tRot, QuadRect sRect, float sRot) { - if (FloatMath.abs(tRot) < FloatMath.PI / 15 && FloatMath.abs(sRot) < FloatMath.PI / 15) { - return QuadRect.intersects(tRect, sRect); - } - double dist = FloatMath.sqrt(sqr(tRect.centerX() - sRect.centerX()) + sqr(tRect.centerY() - sRect.centerY())); - if (dist < 3) { - return true; - } - - // difference close to 90/270 degrees - if (FloatMath.abs(FloatMath.cos(tRot - sRot)) < 0.3) { - // rotate one rectangle to 90 degrees - tRot += FloatMath.PI / 2; - float l = tRect.centerX() - tRect.height() / 2; - float t = tRect.centerY() - tRect.width() / 2; - tRect = new QuadRect(l, t, l + tRect.height(), t + tRect.width()); - } - - // determine difference close to 180/0 degrees - if (FloatMath.abs(FloatMath.sin(tRot - sRot)) < 0.3) { - // rotate t box - // (calculate offset for t center suppose we rotate around s center) - float diff = (float) (-FloatMath.atan2(tRect.centerX() - sRect.centerX(), tRect.centerY() - sRect.centerY()) + Math.PI / 2); - diff -= sRot; - float left = sRect.centerX() + dist * FloatMath.cos(diff) - tRect.width() / 2f; - float top = sRect.centerY() - dist * FloatMath.sin(diff) - tRect.height() / 2f; - QuadRect nRect = new QuadRect(left, top, left + tRect.width(), top + tRect.height()); - return QuadRect.intersects(nRect, sRect); - } - - // TODO other cases not covered - return QuadRect.intersects(tRect, sRect); - } - - void drawTestBox(Canvas cv, RectF r, float rot, String text) { - cv.save(); - cv.translate(r.centerX(), r.centerY()); - cv.rotate((float) (rot * 180 / Math.PI)); - RectF rs = new RectF(-r.width() / 2, -r.height() / 2, r.width() / 2, r.height() / 2); - cv.drawRect(rs, paintIcon); - if (text != null) { - paintText.setTextSize(paintText.getTextSize() - 4); - cv.drawText(text, rs.centerX(), rs.centerY(), paintText); - paintText.setTextSize(paintText.getTextSize() + 4); - } - cv.restore(); - } - - List tempSearch = new ArrayList(); - - private boolean findTextIntersection(Canvas cv, RenderingContext rc, QuadTree boundIntersections, TextDrawInfo text) { - // for test purposes -// drawTestBox(cv, text.bounds, text.pathRotate, text.text); - boundIntersections.queryInBox(text.bounds, tempSearch); - for (int i = 0; i < tempSearch.size(); i++) { - TextDrawInfo t = tempSearch.get(i); - if (intersects(text.bounds, text.pathRotate, t.bounds, t.pathRotate)) { - return true; - } - } - if (text.minDistance > 0) { - QuadRect boundsSearch = new QuadRect(text.bounds); - boundsSearch.inset(-rc.getDensityValue(FloatMath.max(5.0f, text.minDistance)), -rc.getDensityValue(15)); - boundIntersections.queryInBox(boundsSearch, tempSearch); - // drawTestBox(cv, &boundsSearch, text.pathRotate, paintIcon, text.text, NULL/*paintText*/); - for (int i = 0; i < tempSearch.size(); i++) { - TextDrawInfo t = tempSearch.get(i); - if (t.minDistance > 0 && t.text.equals(text.text) && - intersects(boundsSearch, text.pathRotate, t.bounds, t.pathRotate)) { - return true; - } - } - } - boundIntersections.insert(text, text.bounds); - return false; - } - - private void drawTextOnCanvas(Canvas cv, String text, float centerX, float centerY, Paint paint, float textShadow) { - if (textShadow > 0) { - int c = paintText.getColor(); - paintText.setStyle(Style.STROKE); - paintText.setColor(Color.WHITE); - paintText.setStrokeWidth(2 + textShadow); - cv.drawText(text, centerX, centerY, paint); - // reset - paintText.setStrokeWidth(2); - paintText.setStyle(Style.FILL); - paintText.setColor(c); - } - cv.drawText(text, centerX, centerY, paint); - } - - public void drawTextOverCanvas(RenderingContext rc, Canvas cv, boolean useEnglishNames) { - int size = rc.textToDraw.size(); - - // 1. Sort text using text order - Collections.sort(rc.textToDraw, new Comparator() { - @Override - public int compare(TextDrawInfo object1, TextDrawInfo object2) { - return object1.textOrder - object2.textOrder; - } - }); - QuadRect r = new QuadRect(0, 0, rc.width, rc.height); - r.inset(-100, -100); - QuadTree nonIntersectedBounds = new QuadTree(r, 4, 0.6f); - - for (int i = 0; i < size; i++) { - TextDrawInfo text = rc.textToDraw.get(i); - if (text.text != null && text.text.length() > 0) { - if (useEnglishNames) { - text.text = Junidecode.unidecode(text.text); - } - - // sest text size before finding intersection (it is used there) - float textSize = rc.getDensityValue(text.textSize); - paintText.setTextSize(textSize); - paintText.setFakeBoldText(text.bold); - paintText.setColor(text.textColor); - // align center y - text.centerY += (-paintText.ascent()); - - // calculate if there is intersection - boolean intersects = findTextIntersection(cv, rc, nonIntersectedBounds, text); - if (!intersects) { - if (text.drawOnPath != null) { - if (text.textShadow > 0) { - paintText.setColor(Color.WHITE); - paintText.setStyle(Style.STROKE); - paintText.setStrokeWidth(2 + text.textShadow); - cv.drawTextOnPath(text.text, text.drawOnPath, 0, text.vOffset, paintText); - // reset - paintText.setStyle(Style.FILL); - paintText.setStrokeWidth(2); - paintText.setColor(text.textColor); - } - cv.drawTextOnPath(text.text, text.drawOnPath, 0, text.vOffset, paintText); - } else { - if (text.shieldRes != null) { - Bitmap ico = RenderingIcons.getIcon(context, text.shieldRes); - if (ico != null) { - if (rc.getDensityValue(1) != 1) { - float left = text.centerX - rc.getDensityValue(ico.getWidth() / 2) - 0.5f; - float top = text.centerY - rc.getDensityValue(ico.getHeight() / 2) - rc.getDensityValue(4.5f); - Rect rec = new Rect(0, 0, ico.getWidth(), ico.getHeight()); - cv.drawBitmap(ico, rec, - new RectF(left, top, left + rc.getDensityValue(ico.getWidth()), top - + rc.getDensityValue(ico.getHeight())), paintIcon); - } else { - float left = text.centerX - ico.getWidth() / 2 - 0.5f; - float top = text.centerY - ico.getHeight() / 2 - rc.getDensityValue(4.5f); - cv.drawBitmap(ico, left, top, paintIcon); - } - } - } - - drawWrappedText(cv, text, textSize); - } - } - } - } - } - - private void drawWrappedText(Canvas cv, TextDrawInfo text, float textSize) { - if (text.textWrap == 0) { - // set maximum for all text - text.textWrap = 40; - } - - if (text.text.length() > text.textWrap) { - int start = 0; - int end = text.text.length(); - int lastSpace = -1; - int line = 0; - int pos = 0; - int limit = 0; - while (pos < end) { - lastSpace = -1; - limit += text.textWrap; - while (pos < limit && pos < end) { - if (!Character.isLetterOrDigit(text.text.charAt(pos))) { - lastSpace = pos; - } - pos++; - } - if (lastSpace == -1 || pos == end) { - drawTextOnCanvas(cv, text.text.substring(start, pos), text.centerX, text.centerY + line * (textSize + 2), paintText, - text.textShadow); - start = pos; - } else { - drawTextOnCanvas(cv, text.text.substring(start, lastSpace), text.centerX, text.centerY + line * (textSize + 2), - paintText, text.textShadow); - start = lastSpace + 1; - limit += (start - pos) - 1; - } - line++; - - } - } else { - drawTextOnCanvas(cv, text.text, text.centerX, text.centerY, paintText, text.textShadow); - } - } - - private void createTextDrawInfo(BinaryMapDataObject o, RenderingRuleSearchRequest render, RenderingContext rc, TagValuePair pair, float xMid, float yMid, - Path path, PointF[] points, String name, String tagName) { - render.setInitialTagValueZoom(pair.tag, pair.value, rc.zoom, o); - render.setIntFilter(render.ALL.R_TEXT_LENGTH, name.length()); - render.setStringFilter(render.ALL.R_NAME_TAG, tagName); - if(render.search(RenderingRulesStorage.TEXT_RULES)){ - if(render.getIntPropertyValue(render.ALL.R_TEXT_SIZE) > 0){ - TextDrawInfo text = new TextDrawInfo(name); - text.fillProperties(render, xMid, yMid); - paintText.setTextSize(rc.getDensityValue(text.textSize)); - Rect bs = new Rect(); - paintText.getTextBounds(name, 0, name.length(), bs); - text.bounds = new QuadRect(bs.left, bs.top, bs.right, bs.bottom); - text.bounds.inset(-rc.getDensityValue(3), -rc.getDensityValue(10)); - boolean display = true; - if(path != null) { - text.drawOnPath = path; - display = calculatePathToRotate(rc, text, points, - render.getIntPropertyValue(render.ALL.R_TEXT_ON_PATH, 0) != 0); - } - if(text.drawOnPath == null) { - text.bounds.offset(text.centerX, text.centerY); - // shift to match alignment - text.bounds.offset(-text.bounds.width()/2, 0); - } else { - text.bounds.offset(text.centerX - text.bounds.width()/2, text.centerY - text.bounds.height()/2); - } - if(display) { - rc.textToDraw.add(text); - } - } - } - } - - public void renderText(final BinaryMapDataObject obj, final RenderingRuleSearchRequest render, final RenderingContext rc, - final TagValuePair pair, final float xMid, final float yMid, final Path path, final PointF[] points) { - TIntObjectHashMap map = obj.getObjectNames(); - if (map != null) { - map.forEachEntry(new TIntObjectProcedure() { - @Override - public boolean execute(int tag, String name) { - if (name != null && name.trim().length() > 0) { - createTextDrawInfo(obj, render, rc, pair, xMid, yMid, path, points, name, tag == obj.getMapIndex().nameEncodingType ? "" - : obj.getMapIndex().decodeType(tag).tag); - } - return true; - } - }); - } - } - - - boolean calculatePathToRotate(RenderingContext rc, TextDrawInfo p, PointF[] points, boolean drawOnPath) { - int len = points.length; - if (!drawOnPath) { - p.drawOnPath = null; - // simply calculate rotation of path used for shields - float px = 0; - float py = 0; - for (int i = 1; i < len; i++) { - px += points[i].x - points[i - 1].x; - py += points[i].y - points[i - 1].y; - } - if (px != 0 || py != 0) { - p.pathRotate = (float) (-FloatMath.atan2(px, py) + FloatMath.PI / 2); - } - return true; - } - - boolean inverse = false; - float roadLength = 0; - boolean prevInside = false; - float visibleRoadLength = 0; - float textw = p.bounds.width(); - int last = 0; - int startVisible = 0; - float[] distances = new float[points.length - 1]; - - float normalTextLen = 1.5f * textw; - for (int i = 0; i < len; i++, last++) { - boolean inside = points[i].x >= 0 && points[i].x <= rc.width && - points[i].x >= 0 && points[i].y <= rc.height; - if (i > 0) { - float d = FloatMath.sqrt(sqr(points[i].x - points[i - 1].x) + - sqr(points[i].y - points[i - 1].y)); - distances[i-1]= d; - roadLength += d; - if(inside) { - visibleRoadLength += d; - if(!prevInside) { - startVisible = i - 1; - } - } else if(prevInside) { - if(visibleRoadLength >= normalTextLen) { - break; - } - visibleRoadLength = 0; - } - - } - prevInside = inside; - } - if (textw >= roadLength) { - return false; - } - int startInd = 0; - int endInd = len; - - if(textw < visibleRoadLength && last - startVisible > 1) { - startInd = startVisible; - endInd = last; - // display long road name in center - if (visibleRoadLength > 3 * textw) { - boolean ch ; - do { - ch = false; - if(endInd - startInd > 2 && visibleRoadLength - distances[startInd] > normalTextLen){ - visibleRoadLength -= distances[startInd]; - startInd++; - ch = true; - } - if(endInd - startInd > 2 && visibleRoadLength - distances[endInd - 2] > normalTextLen){ - visibleRoadLength -= distances[endInd - 2]; - endInd--; - ch = true; - } - } while(ch); - } - } - // shrink path to display more text - if (startInd > 0 || endInd < len) { - // find subpath - Path path = new Path(); - for (int i = startInd; i < endInd; i++) { - if (i == startInd) { - path.moveTo(points[i].x, points[i].y); - } else { - path.lineTo(points[i].x, points[i].y); - } - } - p.drawOnPath = path; - } - // calculate vector of the road (px, py) to proper rotate it - float px = 0; - float py = 0; - for (int i = startInd + 1; i < endInd; i++) { - px += points[i].x - points[i - 1].x; - py += points[i].y - points[i - 1].y; - } - float scale = 0.5f; - float plen = (float) FloatMath.sqrt(px * px + py * py); - // vector ox,oy orthogonal to px,py to measure height - float ox = -py; - float oy = px; - if(plen > 0) { - float rot = (float) (-FloatMath.atan2(px, py) + FloatMath.PI / 2); - if (rot < 0) rot += FloatMath.PI * 2; - if (rot > FloatMath.PI / 2f && rot < 3 * FloatMath.PI / 2f) { - rot += FloatMath.PI; - inverse = true; - ox = -ox; - oy = -oy; - } - p.pathRotate = rot; - ox *= (p.bounds.height() / plen) / 2; - oy *= (p.bounds.height() / plen) / 2; - } - - p.centerX = points[startInd].x + scale * px + ox; - p.centerY = points[startInd].y + scale * py + oy; - p.vOffset += p.textSize / 2 - 1; -// p.hOffset = 0; - - if (inverse) { - Path path = new Path(); - for (int i = endInd - 1; i >= startInd; i--) { - if (i == endInd - 1) { - path.moveTo(points[i].x, points[i].y); - } else { - path.lineTo(points[i].x, points[i].y); - } - } - p.drawOnPath = path; - } - return true; - } - - -}