diff options
| -rw-r--r-- | core/java/android/view/GLES20Canvas.java | 10 | ||||
| -rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 29 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Canvas.java | 15 | ||||
| -rw-r--r-- | graphics/java/android/graphics/NinePatch.java | 47 | ||||
| -rw-r--r-- | graphics/java/android/graphics/drawable/NinePatchDrawable.java | 7 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 8 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.h | 3 |
7 files changed, 95 insertions, 24 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index b46091081c96..00dc12897da3 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -360,6 +360,16 @@ class GLES20Canvas extends Canvas { } @Override + public void drawPatch(Bitmap bitmap, byte[] chunks, RectF dst, Paint paint) { + final int nativePaint = paint == null ? 0 : paint.mNativePaint; + nDrawPatch(mRenderer, bitmap.mNativeBitmap, chunks, dst.left, dst.top, dst.right, + dst.bottom, nativePaint, bitmap.getDensity(), mDensity, mScreenDensity); + } + + private native void nDrawPatch(int renderer, int bitmap, byte[] chunks, float left, float top, + float right, float bottom, int paint, int bitmapDensity, int canvasDensity, int screenDensity); + + @Override public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) { final int nativePaint = paint == null ? 0 : paint.mNativePaint; nDrawBitmap(mRenderer, bitmap.mNativeBitmap, left, top, nativePaint, diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 89ad53418a24..47f5bfc59380 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -17,6 +17,7 @@ #include "jni.h" #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> +#include <utils/ResourceTypes.h> #include <SkBitmap.h> #include <SkCanvas.h> @@ -214,6 +215,33 @@ static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject canv } } +static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas, + OpenGLRenderer* renderer, SkBitmap* bitmap, jbyteArray chunks, + float left, float top, float right, float bottom, SkPaint* paint, + jint bitmapDensity, jint canvasDensity,jint screenDensity) { + + jbyte* storage = env->GetByteArrayElements(chunks, NULL); + Res_png_9patch* patch = reinterpret_cast<Res_png_9patch*>(storage); + Res_png_9patch::deserialize(patch); + + if (canvasDensity == bitmapDensity || canvasDensity == 0 || bitmapDensity == 0) { + renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); + } else { + renderer->save(0); + const float scale = canvasDensity / float(bitmapDensity); + renderer->translate(left, top); + renderer->scale(scale, scale); + left = top = 0.0f; + right = (right - left) / scale; + bottom = (bottom - top) / scale; + renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint); + renderer->restore(); + } + + // TODO: make sure that 0 is correct for the flags + env->ReleaseByteArrayElements(chunks, storage, 0); +} + static void android_view_GLES20Canvas_drawColor(JNIEnv* env, jobject canvas, OpenGLRenderer* renderer, jint color, SkXfermode::Mode mode) { renderer->drawColor(color, mode); @@ -260,6 +288,7 @@ static JNINativeMethod gMethods[] = { { "nDrawBitmap", "(IIFFIIII)V", (void*) android_view_GLES20Canvas_drawBitmap }, { "nDrawBitmap", "(IIFFFFFFFFIIII)V", (void*) android_view_GLES20Canvas_drawBitmapRect }, { "nDrawBitmap", "(IIIIIII)V", (void*) android_view_GLES20Canvas_drawBitmapMatrix }, + { "nDrawPatch", "(II[BFFFFIIII)V", (void*) android_view_GLES20Canvas_drawPatch }, { "nDrawColor", "(III)V", (void*) android_view_GLES20Canvas_drawColor }, { "nDrawRect", "(IFFFFI)V", (void*) android_view_GLES20Canvas_drawRect }, diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 1b3792df7bc0..a4df80cc3e9d 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -1000,6 +1000,21 @@ public class Canvas { } /** + * Draws the specified bitmap as an N-patch (most often, a 9-patches.) + * + * Note: Only supported by hardware accelerated canvas at the moment. + * + * @param bitmap The bitmap to draw as an N-patch + * @param chunks The patches information (matches the native struct Res_png_9patch) + * @param dst The destination rectangle. + * @param paint The paint to draw the bitmap with. may be null + * + * @hide + */ + public void drawPatch(Bitmap bitmap, byte[] chunks, RectF dst, Paint paint) { + } + + /** * Draw the specified bitmap, with its top/left corner at (x,y), using * the specified paint, transformed by the current matrix. * diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java index 88dfd6790f3a..df6feba47de9 100644 --- a/graphics/java/android/graphics/NinePatch.java +++ b/graphics/java/android/graphics/NinePatch.java @@ -35,6 +35,12 @@ package android.graphics; * </p> */ public class NinePatch { + private final Bitmap mBitmap; + private final byte[] mChunk; + private Paint mPaint; + private String mSrcName; // Useful for debugging + private final RectF mRect = new RectF(); + /** * Create a drawable projection from a bitmap to nine patches. * @@ -74,10 +80,14 @@ public class NinePatch { * @param location Where to draw the bitmap. */ public void draw(Canvas canvas, RectF location) { - nativeDraw(canvas.mNativeCanvas, location, - mBitmap.ni(), mChunk, - mPaint != null ? mPaint.mNativePaint : 0, - canvas.mDensity, mBitmap.mDensity); + if (!canvas.isHardwareAccelerated()) { + nativeDraw(canvas.mNativeCanvas, location, + mBitmap.ni(), mChunk, + mPaint != null ? mPaint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); + } else { + canvas.drawPatch(mBitmap, mChunk, location, null); + } } /** @@ -87,10 +97,15 @@ public class NinePatch { * @param location Where to draw the bitmap. */ public void draw(Canvas canvas, Rect location) { - nativeDraw(canvas.mNativeCanvas, location, - mBitmap.ni(), mChunk, - mPaint != null ? mPaint.mNativePaint : 0, - canvas.mDensity, mBitmap.mDensity); + if (!canvas.isHardwareAccelerated()) { + nativeDraw(canvas.mNativeCanvas, location, + mBitmap.ni(), mChunk, + mPaint != null ? mPaint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); + } else { + mRect.set(location); + canvas.drawPatch(mBitmap, mChunk, mRect, null); + } } /** @@ -101,9 +116,14 @@ public class NinePatch { * @param paint The Paint to draw through. */ public void draw(Canvas canvas, Rect location, Paint paint) { - nativeDraw(canvas.mNativeCanvas, location, - mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0, - canvas.mDensity, mBitmap.mDensity); + if (!canvas.isHardwareAccelerated()) { + nativeDraw(canvas.mNativeCanvas, location, + mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0, + canvas.mDensity, mBitmap.mDensity); + } else { + mRect.set(location); + canvas.drawPatch(mBitmap, mChunk, mRect, paint); + } } /** @@ -133,11 +153,6 @@ public class NinePatch { public native static boolean isNinePatchChunk(byte[] chunk); - private final Bitmap mBitmap; - private final byte[] mChunk; - private Paint mPaint; - private String mSrcName; // Useful for debugging - private static native void validateNinePatchChunk(int bitmap, byte[] chunk); private static native void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance, byte[] c, int paint_instance_or_null, diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index bad94fb771d0..9a98d5395309 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -175,16 +175,9 @@ public class NinePatchDrawable extends Drawable { dest.bottom = Bitmap.scaleFromDensity(src.bottom, sdensity, tdensity); } } - - // overrides @Override public void draw(Canvas canvas) { - if (false) { - float[] pts = new float[2]; - canvas.getMatrix().mapPoints(pts); - Log.v("9patch", "Drawing 9-patch @ " + pts[0] + "," + pts[1] + ": " + getBounds()); - } mNinePatch.draw(canvas, getBounds(), mPaint); } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 304af2eeeecd..ae7719c45cd5 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -35,7 +35,7 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// // Debug -#define DEBUG_LAYERS 1 +#define DEBUG_LAYERS 0 // These properties are defined in mega-bytes #define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size" @@ -521,6 +521,12 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f); } +void OpenGLRenderer::drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, + float left, float top, float right, float bottom, const SkPaint* paint) { + // TODO: Implement + LOGD("Draw 9patch, paddingLeft=%d", patch->paddingLeft); +} + void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { const Rect& clip = mSnapshot->clipRect; drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index fa9592ab03ce..9da4b8e746a2 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -26,6 +26,7 @@ #include <SkXfermode.h> #include <utils/RefBase.h> +#include <utils/ResourceTypes.h> #include "Matrix.h" #include "Program.h" @@ -108,6 +109,8 @@ public: void drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix, const SkPaint* paint); void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, float srcRight, float srcBottom, float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint); + void drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, float left, float top, + float right, float bottom, const SkPaint* paint); void drawColor(int color, SkXfermode::Mode mode); void drawRect(float left, float top, float right, float bottom, const SkPaint* paint); |