/*
* Copyright 2010, 2011, 2012, 2013 mapsforge.org
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mapsforge.map.layer.renderer;
import java.util.List;
import org.mapsforge.core.model.Point;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
class CanvasRasterer {
private final Canvas canvas;
private final Path path;
private final Matrix symbolMatrix;
private final Paint bitmapPaint;
CanvasRasterer() {
this.canvas = new Canvas();
this.symbolMatrix = new Matrix();
this.path = new Path();
this.bitmapPaint = new Paint();
this.bitmapPaint.setAntiAlias(true);
this.bitmapPaint.setFilterBitmap(true);
}
void drawNodes(List<PointTextContainer> pointTextContainers) {
for (int index = pointTextContainers.size() - 1; index >= 0; --index) {
PointTextContainer pointTextContainer = pointTextContainers.get(index);
if (pointTextContainer.paintBack != null) {
this.canvas.drawText(pointTextContainer.text, (int) pointTextContainer.x, (int) pointTextContainer.y,
pointTextContainer.paintBack);
}
this.canvas.drawText(pointTextContainer.text, (int) pointTextContainer.x, (int) pointTextContainer.y,
pointTextContainer.paintFront);
}
}
void drawSymbols(List<SymbolContainer> symbolContainers) {
for (int index = symbolContainers.size() - 1; index >= 0; --index) {
SymbolContainer symbolContainer = symbolContainers.get(index);
Point point = symbolContainer.point;
this.symbolMatrix.reset();
if (symbolContainer.alignCenter) {
int pivotX = symbolContainer.symbol.getWidth() / 2;
int pivotY = symbolContainer.symbol.getHeight() / 2;
this.symbolMatrix.preTranslate((float) (point.x - pivotX), (float) (point.y - pivotY));
this.symbolMatrix.preRotate((float)Math.toDegrees(symbolContainer.theta), pivotX, pivotY);
} else {
this.symbolMatrix.preTranslate((float) point.x, (float) point.y);
this.symbolMatrix.preRotate((float)Math.toDegrees(symbolContainer.theta));
}
this.canvas.drawBitmap(symbolContainer.symbol, this.symbolMatrix,bitmapPaint);
}
}
void drawWayNames(List<WayTextContainer> wayTextContainers) {
for (int index = wayTextContainers.size() - 1; index >= 0; --index) {
WayTextContainer wayTextContainer = wayTextContainers.get(index);
Path path = new Path();
path.moveTo(wayTextContainer.x1, wayTextContainer.y1);
path.lineTo(wayTextContainer.x2, wayTextContainer.y2);
this.canvas.drawTextOnPath(wayTextContainer.text, path, 0, 3,wayTextContainer.paint);
}
}
void drawWays(List<List<List<ShapePaintContainer>>> drawWays) {
int levelsPerLayer = drawWays.get(0).size();
for (int layer = 0, layers = drawWays.size(); layer < layers; ++layer) {
List<List<ShapePaintContainer>> shapePaintContainers = drawWays.get(layer);
for (int level = 0; level < levelsPerLayer; ++level) {
List<ShapePaintContainer> wayList = shapePaintContainers.get(level);
for (int index = wayList.size() - 1; index >= 0; --index) {
drawShapePaintContainer(wayList.get(index));
}
}
}
}
void fill(int color) {
this.canvas.drawColor(color);
}
void setCanvasBitmap(Bitmap bitmap) {
this.canvas.setBitmap(bitmap);
}
private void drawCircleContainer(ShapePaintContainer shapePaintContainer) {
CircleContainer circleContainer = (CircleContainer) shapePaintContainer.shapeContainer;
Point point = circleContainer.point;
this.canvas.drawCircle((int) point.x, (int) point.y, (int) circleContainer.radius, shapePaintContainer.paint);
}
private void drawPath(ShapePaintContainer shapePaintContainer, Point[][] coordinates) {
this.path.rewind();
for (int j = 0; j < coordinates.length; ++j) {
Point[] points = coordinates[j];
if (points.length >= 2) {
Point point = points[0];
this.path.moveTo((int) point.x, (int) point.y);
for (int i = 1; i < points.length; ++i) {
point = points[i];
this.path.lineTo((int) point.x, (int) point.y);
}
}
}
this.canvas.drawPath(this.path, shapePaintContainer.paint);
}
private void drawShapePaintContainer(ShapePaintContainer shapePaintContainer) {
ShapeType shapeType = shapePaintContainer.shapeContainer.getShapeType();
switch (shapeType) {
case CIRCLE:
drawCircleContainer(shapePaintContainer);
return;
case POLYLINE:
PolylineContainer polylineContainer = (PolylineContainer) shapePaintContainer.shapeContainer;
drawPath(shapePaintContainer, polylineContainer.coordinates);
return;
}
}
}