diff options
| -rw-r--r-- | api/current.txt | 6 | ||||
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 10 | ||||
| -rw-r--r-- | core/jni/android/graphics/Canvas.cpp | 22 | ||||
| -rw-r--r-- | core/jni/android/graphics/Path.cpp | 99 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Canvas.java | 52 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Path.java | 105 |
6 files changed, 189 insertions, 105 deletions
diff --git a/api/current.txt b/api/current.txt index fe636c9..56ed5e4 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10212,6 +10212,7 @@ package android.graphics { method public void concat(android.graphics.Matrix); method public void drawARGB(int, int, int, int); method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint); + method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint); method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint); method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint); method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint); @@ -10226,6 +10227,7 @@ package android.graphics { method public void drawLines(float[], int, int, android.graphics.Paint); method public void drawLines(float[], android.graphics.Paint); method public void drawOval(android.graphics.RectF, android.graphics.Paint); + method public void drawOval(float, float, float, float, android.graphics.Paint); method public void drawPaint(android.graphics.Paint); method public void drawPath(android.graphics.Path, android.graphics.Paint); method public void drawPicture(android.graphics.Picture); @@ -10735,6 +10737,7 @@ package android.graphics { ctor public Path(); ctor public Path(android.graphics.Path); method public void addArc(android.graphics.RectF, float, float); + method public void addArc(float, float, float, float, float, float); method public void addCircle(float, float, float, android.graphics.Path.Direction); method public void addOval(android.graphics.RectF, android.graphics.Path.Direction); method public void addOval(float, float, float, float, android.graphics.Path.Direction); @@ -10744,9 +10747,12 @@ package android.graphics { method public void addRect(android.graphics.RectF, android.graphics.Path.Direction); method public void addRect(float, float, float, float, android.graphics.Path.Direction); method public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path.Direction); + method public void addRoundRect(float, float, float, float, float, float, android.graphics.Path.Direction); method public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction); + method public void addRoundRect(float, float, float, float, float[], android.graphics.Path.Direction); method public void arcTo(android.graphics.RectF, float, float, boolean); method public void arcTo(android.graphics.RectF, float, float); + method public void arcTo(float, float, float, float, float, float, boolean); method public void close(); method public void computeBounds(android.graphics.RectF, boolean); method public void cubicTo(float, float, float, float, float, float); diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 832d67a..5b10bb0 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -544,9 +544,9 @@ class GLES20Canvas extends HardwareCanvas { /////////////////////////////////////////////////////////////////////////// @Override - public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, - Paint paint) { - nDrawArc(mRenderer, oval.left, oval.top, oval.right, oval.bottom, + public void drawArc(float left, float top, float right, float bottom, + float startAngle, float sweepAngle, boolean useCenter, Paint paint) { + nDrawArc(mRenderer, left, top, right, bottom, startAngle, sweepAngle, useCenter, paint.mNativePaint); } @@ -771,8 +771,8 @@ class GLES20Canvas extends HardwareCanvas { } @Override - public void drawOval(RectF oval, Paint paint) { - nDrawOval(mRenderer, oval.left, oval.top, oval.right, oval.bottom, paint.mNativePaint); + public void drawOval(float left, float top, float right, float bottom, Paint paint) { + nDrawOval(mRenderer, left, top, right, bottom, paint.mNativePaint); } private static native void nDrawOval(long renderer, float left, float top, diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index a5964c8..4584c46 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -569,12 +569,11 @@ public: canvas->drawRectCoords(left, top, right, bottom, *paint); } - static void drawOval(JNIEnv* env, jobject, jlong canvasHandle, jobject joval, - jlong paintHandle) { + static void drawOval(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jlong paintHandle) { SkCanvas* canvas = getNativeCanvas(canvasHandle); SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle); - SkRect oval; - GraphicsJNI::jrectf_to_rect(env, joval, &oval); + SkRect oval = SkRect::MakeLTRB(left, top, right, bottom); canvas->drawOval(oval, *paint); } @@ -585,13 +584,12 @@ public: canvas->drawCircle(cx, cy, radius, *paint); } - static void drawArc(JNIEnv* env, jobject, jlong canvasHandle, jobject joval, - jfloat startAngle, jfloat sweepAngle, - jboolean useCenter, jlong paintHandle) { + static void drawArc(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle, jboolean useCenter, + jlong paintHandle) { SkCanvas* canvas = getNativeCanvas(canvasHandle); SkPaint* paint = reinterpret_cast<SkPaint*>(paintHandle); - SkRect oval; - GraphicsJNI::jrectf_to_rect(env, joval, &oval); + SkRect oval = SkRect::MakeLTRB(left, top, right, bottom); canvas->drawArc(oval, startAngle, sweepAngle, useCenter, *paint); } @@ -1241,11 +1239,9 @@ static JNINativeMethod gCanvasMethods[] = { {"native_drawLines", "(J[FIIJ)V", (void*) SkCanvasGlue::drawLines}, {"native_drawLine","(JFFFFJ)V", (void*) SkCanvasGlue::drawLine__FFFFPaint}, {"native_drawRect","(JFFFFJ)V", (void*) SkCanvasGlue::drawRect__FFFFPaint}, - {"native_drawOval","(JLandroid/graphics/RectF;J)V", - (void*) SkCanvasGlue::drawOval}, + {"native_drawOval","(JFFFFJ)V", (void*) SkCanvasGlue::drawOval}, {"native_drawCircle","(JFFFJ)V", (void*) SkCanvasGlue::drawCircle}, - {"native_drawArc","(JLandroid/graphics/RectF;FFZJ)V", - (void*) SkCanvasGlue::drawArc}, + {"native_drawArc","(JFFFFFFZJ)V", (void*) SkCanvasGlue::drawArc}, {"native_drawRoundRect","(JFFFFFFJ)V", (void*) SkCanvasGlue::drawRoundRect}, {"native_drawPath","(JJJ)V", (void*) SkCanvasGlue::drawPath}, diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp index 420a17f..6ef1d2c 100644 --- a/core/jni/android/graphics/Path.cpp +++ b/core/jni/android/graphics/Path.cpp @@ -2,22 +2,22 @@ ** ** Copyright 2006, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at ** -** http://www.apache.org/licenses/LICENSE-2.0 +** http://www.apache.org/licenses/LICENSE-2.0 ** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and ** limitations under the License. */ // This file was generated from the C++ include file: SkPath.h // Any changes made to this file will be discarded by the build. -// To change this file, either edit the include, or device/tools/gluemaker/main.cpp, +// To change this file, either edit the include, or device/tools/gluemaker/main.cpp, // or one of the auxilary file specifications in device/tools/gluemaker. #include "jni.h" @@ -92,7 +92,7 @@ public: SkPath* obj = reinterpret_cast<SkPath*>(objHandle); return obj->isEmpty(); } - + static jboolean isRect(JNIEnv* env, jobject clazz, jlong objHandle, jobject jrect) { SkRect rect; SkPath* obj = reinterpret_cast<SkPath*>(objHandle); @@ -100,65 +100,66 @@ public: GraphicsJNI::rect_to_jrectf(rect, env, jrect); return result; } - + static void computeBounds(JNIEnv* env, jobject clazz, jlong objHandle, jobject jbounds) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); const SkRect& bounds = obj->getBounds(); GraphicsJNI::rect_to_jrectf(bounds, env, jbounds); } - + static void incReserve(JNIEnv* env, jobject clazz, jlong objHandle, jint extraPtCount) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->incReserve(extraPtCount); } - + static void moveTo__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat x, jfloat y) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->moveTo(x, y); } - + static void rMoveTo(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->rMoveTo(dx, dy); } - + static void lineTo__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat x, jfloat y) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->lineTo(x, y); } - + static void rLineTo(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->rLineTo(dx, dy); } - + static void quadTo__FFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat x1, jfloat y1, jfloat x2, jfloat y2) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->quadTo(x1, y1, x2, y2); } - + static void rQuadTo(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx1, jfloat dy1, jfloat dx2, jfloat dy2) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->rQuadTo(dx1, dy1, dx2, dy2); } - + static void cubicTo__FFFFFF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat x1, jfloat y1, jfloat x2, jfloat y2, jfloat x3, jfloat y3) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->cubicTo(x1, y1, x2, y2, x3, y3); } - + static void rCubicTo(JNIEnv* env, jobject clazz, jlong objHandle, jfloat x1, jfloat y1, jfloat x2, jfloat y2, jfloat x3, jfloat y3) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->rCubicTo(x1, y1, x2, y2, x3, y3); } - - static void arcTo(JNIEnv* env, jobject clazz, jlong objHandle, jobject oval, jfloat startAngle, jfloat sweepAngle, jboolean forceMoveTo) { + + static void arcTo(JNIEnv* env, jobject clazz, jlong objHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle, + jboolean forceMoveTo) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); - SkRect oval_; - GraphicsJNI::jrectf_to_rect(env, oval, &oval_); - obj->arcTo(oval_, startAngle, sweepAngle, forceMoveTo); + SkRect oval = SkRect::MakeLTRB(left, top, right, bottom); + obj->arcTo(oval, startAngle, sweepAngle, forceMoveTo); } - + static void close(JNIEnv* env, jobject clazz, jlong objHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->close(); @@ -185,28 +186,26 @@ public: obj->addCircle(x, y, radius, dir); } - static void addArc(JNIEnv* env, jobject clazz, jlong objHandle, jobject oval, jfloat startAngle, jfloat sweepAngle) { - SkRect oval_; + static void addArc(JNIEnv* env, jobject clazz, jlong objHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle) { + SkRect oval = SkRect::MakeLTRB(left, top, right, bottom); SkPath* obj = reinterpret_cast<SkPath*>(objHandle); - GraphicsJNI::jrectf_to_rect(env, oval, &oval_); - obj->addArc(oval_, startAngle, sweepAngle); + obj->addArc(oval, startAngle, sweepAngle); } - static void addRoundRectXY(JNIEnv* env, jobject clazz, jlong objHandle, jobject jrect, - jfloat rx, jfloat ry, jint dirHandle) { - SkRect rect; + static void addRoundRectXY(JNIEnv* env, jobject clazz, jlong objHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jfloat rx, jfloat ry, jint dirHandle) { + SkRect rect = SkRect::MakeLTRB(left, top, right, bottom); SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath::Direction dir = static_cast<SkPath::Direction>(dirHandle); - GraphicsJNI::jrectf_to_rect(env, jrect, &rect); obj->addRoundRect(rect, rx, ry, dir); } - - static void addRoundRect8(JNIEnv* env, jobject, jlong objHandle, jobject jrect, - jfloatArray array, jint dirHandle) { - SkRect rect; + + static void addRoundRect8(JNIEnv* env, jobject, jlong objHandle, jfloat left, jfloat top, + jfloat right, jfloat bottom, jfloatArray array, jint dirHandle) { + SkRect rect = SkRect::MakeLTRB(left, top, right, bottom); SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath::Direction dir = static_cast<SkPath::Direction>(dirHandle); - GraphicsJNI::jrectf_to_rect(env, jrect, &rect); AutoJavaFloatArray afa(env, array, 8); #ifdef SK_SCALAR_IS_FLOAT const float* src = afa.ptr(); @@ -215,32 +214,32 @@ public: #endif obj->addRoundRect(rect, src, dir); } - + static void addPath__PathFF(JNIEnv* env, jobject clazz, jlong objHandle, jlong srcHandle, jfloat dx, jfloat dy) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath* src = reinterpret_cast<SkPath*>(srcHandle); obj->addPath(*src, dx, dy); } - + static void addPath__Path(JNIEnv* env, jobject clazz, jlong objHandle, jlong srcHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath* src = reinterpret_cast<SkPath*>(srcHandle); obj->addPath(*src); } - + static void addPath__PathMatrix(JNIEnv* env, jobject clazz, jlong objHandle, jlong srcHandle, jlong matrixHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath* src = reinterpret_cast<SkPath*>(srcHandle); SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); obj->addPath(*src, *matrix); } - + static void offset__FFPath(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy, jlong dstHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkPath* dst = reinterpret_cast<SkPath*>(dstHandle); obj->offset(dx, dy, dst); } - + static void offset__FF(JNIEnv* env, jobject clazz, jlong objHandle, jfloat dx, jfloat dy) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->offset(dx, dy); @@ -250,14 +249,14 @@ public: SkPath* obj = reinterpret_cast<SkPath*>(objHandle); obj->setLastPt(dx, dy); } - + static void transform__MatrixPath(JNIEnv* env, jobject clazz, jlong objHandle, jlong matrixHandle, jlong dstHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); SkPath* dst = reinterpret_cast<SkPath*>(dstHandle); obj->transform(*matrix, dst); } - + static void transform__Matrix(JNIEnv* env, jobject clazz, jlong objHandle, jlong matrixHandle) { SkPath* obj = reinterpret_cast<SkPath*>(objHandle); SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); @@ -487,14 +486,14 @@ static JNINativeMethod methods[] = { {"native_rQuadTo","(JFFFF)V", (void*) SkPathGlue::rQuadTo}, {"native_cubicTo","(JFFFFFF)V", (void*) SkPathGlue::cubicTo__FFFFFF}, {"native_rCubicTo","(JFFFFFF)V", (void*) SkPathGlue::rCubicTo}, - {"native_arcTo","(JLandroid/graphics/RectF;FFZ)V", (void*) SkPathGlue::arcTo}, + {"native_arcTo","(JFFFFFFZ)V", (void*) SkPathGlue::arcTo}, {"native_close","(J)V", (void*) SkPathGlue::close}, {"native_addRect","(JFFFFI)V", (void*) SkPathGlue::addRect}, {"native_addOval","(JFFFFI)V", (void*) SkPathGlue::addOval}, {"native_addCircle","(JFFFI)V", (void*) SkPathGlue::addCircle}, - {"native_addArc","(JLandroid/graphics/RectF;FF)V", (void*) SkPathGlue::addArc}, - {"native_addRoundRect","(JLandroid/graphics/RectF;FFI)V", (void*) SkPathGlue::addRoundRectXY}, - {"native_addRoundRect","(JLandroid/graphics/RectF;[FI)V", (void*) SkPathGlue::addRoundRect8}, + {"native_addArc","(JFFFFFF)V", (void*) SkPathGlue::addArc}, + {"native_addRoundRect","(JFFFFFFI)V", (void*) SkPathGlue::addRoundRectXY}, + {"native_addRoundRect","(JFFFF[FI)V", (void*) SkPathGlue::addRoundRect8}, {"native_addPath","(JJFF)V", (void*) SkPathGlue::addPath__PathFF}, {"native_addPath","(JJ)V", (void*) SkPathGlue::addPath__Path}, {"native_addPath","(JJJ)V", (void*) SkPathGlue::addPath__PathMatrix}, diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 2b36016..158801c 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -1091,7 +1091,15 @@ public class Canvas { if (oval == null) { throw new NullPointerException(); } - native_drawOval(mNativeCanvasWrapper, oval, paint.mNativePaint); + drawOval(oval.left, oval.top, oval.right, oval.bottom, paint); + } + + /** + * Draw the specified oval using the specified paint. The oval will be + * filled or framed based on the Style in the paint. + */ + public void drawOval(float left, float top, float right, float bottom, @NonNull Paint paint) { + native_drawOval(mNativeCanvasWrapper, left, top, right, bottom, paint.mNativePaint); } /** @@ -1133,10 +1141,34 @@ public class Canvas { */ public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint) { - if (oval == null) { - throw new NullPointerException(); - } - native_drawArc(mNativeCanvasWrapper, oval, startAngle, sweepAngle, + drawArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, useCenter, + paint); + } + + /** + * <p>Draw the specified arc, which will be scaled to fit inside the + * specified oval.</p> + * + * <p>If the start angle is negative or >= 360, the start angle is treated + * as start angle modulo 360.</p> + * + * <p>If the sweep angle is >= 360, then the oval is drawn + * completely. Note that this differs slightly from SkPath::arcTo, which + * treats the sweep angle modulo 360. If the sweep angle is negative, + * the sweep angle is treated as sweep angle modulo 360</p> + * + * <p>The arc is drawn clockwise. An angle of 0 degrees correspond to the + * geometric angle of 0 degrees (3 o'clock on a watch.)</p> + * + * @param startAngle Starting angle (in degrees) where the arc begins + * @param sweepAngle Sweep angle (in degrees) measured clockwise + * @param useCenter If true, include the center of the oval in the arc, and + close it if it is being stroked. This will draw a wedge + * @param paint The paint used to draw the arc + */ + public void drawArc(float left, float top, float right, float bottom, float startAngle, + float sweepAngle, boolean useCenter, @NonNull Paint paint) { + native_drawArc(mNativeCanvasWrapper, left, top, right, bottom, startAngle, sweepAngle, useCenter, paint.mNativePaint); } @@ -1908,14 +1940,14 @@ public class Canvas { float top, float right, float bottom, long nativePaint); - private static native void native_drawOval(long nativeCanvas, RectF oval, - long nativePaint); + private static native void native_drawOval(long nativeCanvas, float left, float top, + float right, float bottom, long nativePaint); private static native void native_drawCircle(long nativeCanvas, float cx, float cy, float radius, long nativePaint); - private static native void native_drawArc(long nativeCanvas, RectF oval, - float startAngle, float sweep, - boolean useCenter, + private static native void native_drawArc(long nativeCanvas, float left, float top, + float right, float bottom, + float startAngle, float sweep, boolean useCenter, long nativePaint); private static native void native_drawRoundRect(long nativeCanvas, float left, float top, float right, float bottom, diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java index c600f47..c40a66d 100644 --- a/graphics/java/android/graphics/Path.java +++ b/graphics/java/android/graphics/Path.java @@ -62,7 +62,7 @@ public class Path { } mNativePath = init2(valNative); } - + /** * Clear any lines and curves from the path, making it empty. * This does NOT change the fill-type setting. @@ -205,7 +205,7 @@ public class Path { * Same as {@link #EVEN_ODD}, but draws outside of the path, rather than inside. */ INVERSE_EVEN_ODD(3); - + FillType(int ni) { nativeInt = ni; } @@ -425,7 +425,7 @@ public class Path { * the path is different from the path's current last point, then an * automatic lineTo() is added to connect the current contour to the * start of the arc. However, if the path is empty, then we call moveTo() - * with the first point of the arc. The sweep angle is tread mod 360. + * with the first point of the arc. * * @param oval The bounds of oval defining shape and size of the arc * @param startAngle Starting angle (in degrees) where the arc begins @@ -435,10 +435,9 @@ public class Path { */ public void arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) { - isSimplePath = false; - native_arcTo(mNativePath, oval, startAngle, sweepAngle, forceMoveTo); + arcTo(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, forceMoveTo); } - + /** * Append the specified arc to the path as a new contour. If the start of * the path is different from the path's current last point, then an @@ -451,10 +450,27 @@ public class Path { * @param sweepAngle Sweep angle (in degrees) measured clockwise */ public void arcTo(RectF oval, float startAngle, float sweepAngle) { + arcTo(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle, false); + } + + /** + * Append the specified arc to the path as a new contour. If the start of + * the path is different from the path's current last point, then an + * automatic lineTo() is added to connect the current contour to the + * start of the arc. However, if the path is empty, then we call moveTo() + * with the first point of the arc. + * + * @param startAngle Starting angle (in degrees) where the arc begins + * @param sweepAngle Sweep angle (in degrees) measured clockwise, treated + * mod 360. + * @param forceMoveTo If true, always begin a new contour with the arc + */ + public void arcTo(float left, float top, float right, float bottom, float startAngle, + float sweepAngle, boolean forceMoveTo) { isSimplePath = false; - native_arcTo(mNativePath, oval, startAngle, sweepAngle, false); + native_arcTo(mNativePath, left, top, right, bottom, startAngle, sweepAngle, forceMoveTo); } - + /** * Close the current contour. If the current point is not equal to the * first point of the contour, a line segment is automatically added. @@ -473,13 +489,13 @@ public class Path { CW (1), // must match enum in SkPath.h /** counter-clockwise */ CCW (2); // must match enum in SkPath.h - + Direction(int ni) { nativeInt = ni; } final int nativeInt; } - + private void detectSimplePath(float left, float top, float right, float bottom, Direction dir) { if (mLastDirection == null) { mLastDirection = dir; @@ -557,11 +573,19 @@ public class Path { * @param sweepAngle Sweep angle (in degrees) measured clockwise */ public void addArc(RectF oval, float startAngle, float sweepAngle) { - if (oval == null) { - throw new NullPointerException("need oval parameter"); - } + addArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle); + } + + /** + * Add the specified arc to the path as a new contour. + * + * @param startAngle Starting angle (in degrees) where the arc begins + * @param sweepAngle Sweep angle (in degrees) measured clockwise + */ + public void addArc(float left, float top, float right, float bottom, float startAngle, + float sweepAngle) { isSimplePath = false; - native_addArc(mNativePath, oval, startAngle, sweepAngle); + native_addArc(mNativePath, left, top, right, bottom, startAngle, sweepAngle); } /** @@ -573,13 +597,22 @@ public class Path { * @param dir The direction to wind the round-rectangle's contour */ public void addRoundRect(RectF rect, float rx, float ry, Direction dir) { - if (rect == null) { - throw new NullPointerException("need rect parameter"); - } + addRoundRect(rect.left, rect.top, rect.right, rect.bottom, rx, ry, dir); + } + + /** + * Add a closed round-rectangle contour to the path + * + * @param rx The x-radius of the rounded corners on the round-rectangle + * @param ry The y-radius of the rounded corners on the round-rectangle + * @param dir The direction to wind the round-rectangle's contour + */ + public void addRoundRect(float left, float top, float right, float bottom, float rx, float ry, + Direction dir) { isSimplePath = false; - native_addRoundRect(mNativePath, rect, rx, ry, dir.nativeInt); + native_addRoundRect(mNativePath, left, top, right, bottom, rx, ry, dir.nativeInt); } - + /** * Add a closed round-rectangle contour to the path. Each corner receives * two radius values [X, Y]. The corners are ordered top-left, top-right, @@ -593,13 +626,26 @@ public class Path { if (rect == null) { throw new NullPointerException("need rect parameter"); } + addRoundRect(rect.left, rect.top, rect.right, rect.bottom, radii, dir); + } + + /** + * Add a closed round-rectangle contour to the path. Each corner receives + * two radius values [X, Y]. The corners are ordered top-left, top-right, + * bottom-right, bottom-left + * + * @param radii Array of 8 values, 4 pairs of [X,Y] radii + * @param dir The direction to wind the round-rectangle's contour + */ + public void addRoundRect(float left, float top, float right, float bottom, float[] radii, + Direction dir) { if (radii.length < 8) { throw new ArrayIndexOutOfBoundsException("radii[] needs 8 values"); } isSimplePath = false; - native_addRoundRect(mNativePath, rect, radii, dir.nativeInt); + native_addRoundRect(mNativePath, left, top, right, bottom, radii, dir.nativeInt); } - + /** * Add a copy of src to the path, offset by (dx,dy) * @@ -755,19 +801,24 @@ public class Path { float x2, float y2, float x3, float y3); private static native void native_rCubicTo(long nPath, float x1, float y1, float x2, float y2, float x3, float y3); - private static native void native_arcTo(long nPath, RectF oval, - float startAngle, float sweepAngle, boolean forceMoveTo); + private static native void native_arcTo(long nPath, float left, float top, + float right, float bottom, float startAngle, + float sweepAngle, boolean forceMoveTo); private static native void native_close(long nPath); private static native void native_addRect(long nPath, float left, float top, float right, float bottom, int dir); private static native void native_addOval(long nPath, float left, float top, float right, float bottom, int dir); private static native void native_addCircle(long nPath, float x, float y, float radius, int dir); - private static native void native_addArc(long nPath, RectF oval, - float startAngle, float sweepAngle); - private static native void native_addRoundRect(long nPath, RectF rect, + private static native void native_addArc(long nPath, float left, float top, + float right, float bottom, + float startAngle, float sweepAngle); + private static native void native_addRoundRect(long nPath, float left, float top, + float right, float bottom, float rx, float ry, int dir); - private static native void native_addRoundRect(long nPath, RectF r, float[] radii, int dir); + private static native void native_addRoundRect(long nPath, float left, float top, + float right, float bottom, + float[] radii, int dir); private static native void native_addPath(long nPath, long src, float dx, float dy); private static native void native_addPath(long nPath, long src); private static native void native_addPath(long nPath, long src, long matrix); |
