package com.libsvg;
/**
*
* @author Pavel.B.Chernov - minor improvements
* @author kushnarev - original implementation
*
*/
import android.graphics.Matrix;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.BitmapShader;
import android.graphics.LinearGradient;
import android.graphics.RadialGradient;
import android.graphics.Typeface;
import android.util.Log;
public class SvgRaster {
public native static long svgAndroidCreate();
public native static void svgAndroidDestroy(long id);
public native static int svgAndroidParseBuffer(long id, String bfr);
public native static int svgAndroidParseChunkBegin(long id);
public native static int svgAndroidParseChunk(long id, String bfr);
public native static int svgAndroidParseChunkEnd(long id);
public native static int svgAndroidSetAntialiasing(long id, boolean doIt);
public native static int svgAndroidRender(long id, Canvas target);
// Pavel.B.Chernov: I've changed this function to make scaling without saving aspect ratio
public native static int svgAndroidRenderToArea(long id, Canvas target, int x, int y, int w, int h);
// Pavel.B.Chernov: I've added this function for uniform scaling, preserving aspect ration
public native static int svgAndroidRenderToAreaUniform(long id, Canvas target, int x, int y, int w, int h);
public native static int svgAndroidGetWidth(long id);
public native static int svgAndroidGetHeight(long id);
public static void debugMatrix(Matrix m) {
Log.v("Kamoflage", m.toString());
}
public static void setTypeface(
Paint p, String family, int weight_n_slant, float textSize, int talign) {
int style = android.graphics.Typeface.NORMAL;
Paint.Align al = Paint.Align.LEFT;
switch(weight_n_slant) {
case 0: // italic, bold
style = android.graphics.Typeface.BOLD_ITALIC;
break;
case 1: // italic, no bold
style = android.graphics.Typeface.ITALIC;
break;
case 2: // normal, bold
style = android.graphics.Typeface.BOLD;
break;
default:
case 3: // normal, no bold
style = android.graphics.Typeface.NORMAL;
break;
}
switch(talign) {
default:
case 0:
al = Paint.Align.LEFT;
break;
case 1:
al = Paint.Align.CENTER;
break;
case 2:
al = Paint.Align.RIGHT;
break;
}
Typeface tf = Typeface.create(family, style);
p.setTypeface(tf);
p.setTextSize(textSize);
p.setTextAlign(al);
}
public static Matrix matrixInvert(Matrix m) {
Matrix r = new Matrix();
if(m.invert(r)) return r;
return null;
}
public static Shader createBitmapShader(Bitmap b) {
return new BitmapShader(b, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
}
public static Shader createLinearGradient(float x1, float y1, float x2, float y2,
int[] colors, float[] offsets, int spreadType) {
if (colors == null || colors.length <= 0 || offsets == null || offsets.length <= 0) {
return null;
}
Shader.TileMode tm = Shader.TileMode.REPEAT;
switch(spreadType) {
case 0:
tm = Shader.TileMode.REPEAT;
break;
case 1:
tm = Shader.TileMode.MIRROR;
break;
case 2:
tm = Shader.TileMode.CLAMP;
break;
}
return new LinearGradient(x1, y1, x2, y2, colors, offsets, tm);
}
public static Shader createRadialGradient(float x, float y, float r,
int[] colors, float[] offsets, int spreadType) {
if (colors == null || colors.length <= 0 || offsets == null || offsets.length <= 0) {
return null;
}
Shader.TileMode tm = Shader.TileMode.REPEAT;
switch(spreadType) {
case 0:
tm = Shader.TileMode.REPEAT;
break;
case 1:
tm = Shader.TileMode.MIRROR;
break;
case 2:
tm = Shader.TileMode.CLAMP;
break;
}
return new RadialGradient(x, y, r, colors, offsets, tm);
}
public static float[] getBounds(Path p) {
float[] rv = {(float)0.0, (float)0.0, (float)0.0, (float)0.0};
RectF r = new RectF();
p.computeBounds(r, false);
rv[0] = r.left;
rv[1] = r.top;
rv[2] = r.right;
rv[3] = r.bottom;
return rv;
}
public static Matrix matrixInit(float xx, float yx, float xy, float yy, float x0, float y0) {
android.graphics.Matrix x = new android.graphics.Matrix();
float[] val = {
(float)xx, (float)xy, (float)x0,
(float)yx, (float)yy, (float)y0,
(float)0.0, (float)0.0, (float)1.0
};
x.setValues(val);
return x;
}
public static void setPaintStyle(Paint p, boolean isStroke) {
p.setStyle(isStroke ? Paint.Style.STROKE : Paint.Style.FILL);
}
public static void setStrokeCap(Paint p, int cap) {
switch(cap) {
case 0:
p.setStrokeCap(android.graphics.Paint.Cap.BUTT);
break;
case 1:
p.setStrokeCap(android.graphics.Paint.Cap.ROUND);
break;
case 2:
default:
p.setStrokeCap(android.graphics.Paint.Cap.SQUARE);
break;
}
}
public static void setStrokeJoin(Paint p, int cap) {
switch(cap) {
case 0:
p.setStrokeJoin(android.graphics.Paint.Join.MITER);
break;
case 1:
p.setStrokeJoin(android.graphics.Paint.Join.ROUND);
break;
case 2:
default:
p.setStrokeJoin(android.graphics.Paint.Join.BEVEL);
break;
}
}
public static void setFillRule(Path p, boolean even_odd) {
if(even_odd)
p.setFillType(Path.FillType.EVEN_ODD);
else
p.setFillType(Path.FillType.WINDING);
}
public static void drawEllipse(Canvas c, Paint p, float cx, float cy, float rx, float ry) {
float l, t, r, b;
l = cx - rx;
t = cy - ry;
r = cx + rx;
b = cy + ry;
RectF rct = new RectF(l, t, r, b);
c.drawOval(rct, p);
}
public static Bitmap data2bitmap(int w, int h, int[] data) {
return Bitmap.createBitmap(data, w, h, Bitmap.Config.ARGB_8888);
}
public static Bitmap createBitmap(int w, int h) {
return Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
}
}