Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fce18d9 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Revert "Add ninePatch support to Canvas.h""

parents 69ca9960 773bbe03
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
@@ -221,6 +221,29 @@ public class DisplayListCanvas extends Canvas {
    // Drawing
    // Drawing
    ///////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////


    // TODO: move to Canvas.java
    @Override
    public void drawPatch(NinePatch patch, Rect dst, Paint paint) {
        Bitmap bitmap = patch.getBitmap();
        throwIfCannotDraw(bitmap);
        final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
        nDrawPatch(mNativeCanvasWrapper, bitmap, patch.mNativeChunk,
                dst.left, dst.top, dst.right, dst.bottom, nativePaint);
    }

    // TODO: move to Canvas.java
    @Override
    public void drawPatch(NinePatch patch, RectF dst, Paint paint) {
        Bitmap bitmap = patch.getBitmap();
        throwIfCannotDraw(bitmap);
        final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
        nDrawPatch(mNativeCanvasWrapper, bitmap, patch.mNativeChunk,
                dst.left, dst.top, dst.right, dst.bottom, nativePaint);
    }

    private static native void nDrawPatch(long renderer, Bitmap bitmap, long chunk,
            float left, float top, float right, float bottom, long paint);

    public void drawCircle(CanvasProperty<Float> cx, CanvasProperty<Float> cy,
    public void drawCircle(CanvasProperty<Float> cx, CanvasProperty<Float> cy,
            CanvasProperty<Float> radius, CanvasProperty<Paint> paint) {
            CanvasProperty<Float> radius, CanvasProperty<Paint> paint) {
        nDrawCircle(mNativeCanvasWrapper, cx.getNativeContainer(), cy.getNativeContainer(),
        nDrawCircle(mNativeCanvasWrapper, cx.getNativeContainer(), cy.getNativeContainer(),
+1 −0
Original line number Original line Diff line number Diff line
@@ -114,6 +114,7 @@ LOCAL_SRC_FILES:= \
    android/graphics/MinikinUtils.cpp \
    android/graphics/MinikinUtils.cpp \
    android/graphics/Movie.cpp \
    android/graphics/Movie.cpp \
    android/graphics/NinePatch.cpp \
    android/graphics/NinePatch.cpp \
    android/graphics/NinePatchImpl.cpp \
    android/graphics/NinePatchPeeker.cpp \
    android/graphics/NinePatchPeeker.cpp \
    android/graphics/Paint.cpp \
    android/graphics/Paint.cpp \
    android/graphics/PaintImpl.cpp \
    android/graphics/PaintImpl.cpp \
+74 −3
Original line number Original line Diff line number Diff line
@@ -29,11 +29,12 @@
#include "SkRegion.h"
#include "SkRegion.h"
#include "GraphicsJNI.h"
#include "GraphicsJNI.h"


#include "utils/NinePatch.h"

#include "JNIHelp.h"
#include "JNIHelp.h"
#include "core_jni_helpers.h"
#include "core_jni_helpers.h"


extern void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, const SkBitmap& bitmap,
        const android::Res_png_9patch& chunk, const SkPaint* paint, SkRegion** outRegion);

using namespace android;
using namespace android;


/**
/**
@@ -87,6 +88,72 @@ public:
        }
        }
    }
    }


    static void draw(JNIEnv* env, SkCanvas* canvas, SkRect& bounds, const SkBitmap& bitmap,
            Res_png_9patch* chunk, const SkPaint* paint, jint destDensity, jint srcDensity) {
        if (destDensity == srcDensity || destDensity == 0 || srcDensity == 0) {
            ALOGV("Drawing unscaled 9-patch: (%g,%g)-(%g,%g)",
                    SkScalarToFloat(bounds.fLeft), SkScalarToFloat(bounds.fTop),
                    SkScalarToFloat(bounds.fRight), SkScalarToFloat(bounds.fBottom));
            NinePatch_Draw(canvas, bounds, bitmap, *chunk, paint, NULL);
        } else {
            canvas->save();

            SkScalar scale = destDensity / (float)srcDensity;
            canvas->translate(bounds.fLeft, bounds.fTop);
            canvas->scale(scale, scale);

            bounds.fRight = (bounds.fRight-bounds.fLeft) / scale;
            bounds.fBottom = (bounds.fBottom-bounds.fTop) / scale;
            bounds.fLeft = bounds.fTop = 0;

            ALOGV("Drawing scaled 9-patch: (%g,%g)-(%g,%g) srcDensity=%d destDensity=%d",
                    SkScalarToFloat(bounds.fLeft), SkScalarToFloat(bounds.fTop),
                    SkScalarToFloat(bounds.fRight), SkScalarToFloat(bounds.fBottom),
                    srcDensity, destDensity);

            NinePatch_Draw(canvas, bounds, bitmap, *chunk, paint, NULL);

            canvas->restore();
        }
    }

    static void drawF(JNIEnv* env, jobject, jlong canvasHandle, jobject boundsRectF,
            jobject jbitmap, jlong chunkHandle, jlong paintHandle,
            jint destDensity, jint srcDensity) {
        SkCanvas* canvas       = reinterpret_cast<Canvas*>(canvasHandle)->asSkCanvas();
        Res_png_9patch* chunk  = reinterpret_cast<Res_png_9patch*>(chunkHandle);
        const Paint* paint     = reinterpret_cast<Paint*>(paintHandle);
        SkASSERT(canvas);
        SkASSERT(boundsRectF);
        SkASSERT(chunk);
        // paint is optional

        SkBitmap bitmap;
        GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
        SkRect bounds;
        GraphicsJNI::jrectf_to_rect(env, boundsRectF, &bounds);

        draw(env, canvas, bounds, bitmap, chunk, paint, destDensity, srcDensity);
    }

    static void drawI(JNIEnv* env, jobject, jlong canvasHandle, jobject boundsRect,
            jobject jbitmap, jlong chunkHandle, jlong paintHandle,
            jint destDensity, jint srcDensity) {
        SkCanvas* canvas       = reinterpret_cast<Canvas*>(canvasHandle)->asSkCanvas();
        Res_png_9patch* chunk  = reinterpret_cast<Res_png_9patch*>(chunkHandle);
        const Paint* paint     = reinterpret_cast<Paint*>(paintHandle);
        SkASSERT(canvas);
        SkASSERT(boundsRect);
        SkASSERT(chunk);
        // paint is optional

        SkBitmap bitmap;
        GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
        SkRect bounds;
        GraphicsJNI::jrect_to_rect(env, boundsRect, &bounds);
        draw(env, canvas, bounds, bitmap, chunk, paint, destDensity, srcDensity);
    }

    static jlong getTransparentRegion(JNIEnv* env, jobject, jobject jbitmap,
    static jlong getTransparentRegion(JNIEnv* env, jobject, jobject jbitmap,
            jlong chunkHandle, jobject boundsRect) {
            jlong chunkHandle, jobject boundsRect) {
        Res_png_9patch* chunk = reinterpret_cast<Res_png_9patch*>(chunkHandle);
        Res_png_9patch* chunk = reinterpret_cast<Res_png_9patch*>(chunkHandle);
@@ -99,7 +166,7 @@ public:
        GraphicsJNI::jrect_to_rect(env, boundsRect, &bounds);
        GraphicsJNI::jrect_to_rect(env, boundsRect, &bounds);


        SkRegion* region = NULL;
        SkRegion* region = NULL;
        NinePatch::Draw(NULL, bounds, bitmap, *chunk, NULL, &region);
        NinePatch_Draw(NULL, bounds, bitmap, *chunk, NULL, &region);


        return reinterpret_cast<jlong>(region);
        return reinterpret_cast<jlong>(region);
    }
    }
@@ -113,6 +180,10 @@ static JNINativeMethod gNinePatchMethods[] = {
    { "validateNinePatchChunk", "([B)J",
    { "validateNinePatchChunk", "([B)J",
            (void*) SkNinePatchGlue::validateNinePatchChunk },
            (void*) SkNinePatchGlue::validateNinePatchChunk },
    { "nativeFinalize", "(J)V", (void*) SkNinePatchGlue::finalize },
    { "nativeFinalize", "(J)V", (void*) SkNinePatchGlue::finalize },
    { "nativeDraw", "(JLandroid/graphics/RectF;Landroid/graphics/Bitmap;JJII)V",
            (void*) SkNinePatchGlue::drawF },
    { "nativeDraw", "(JLandroid/graphics/Rect;Landroid/graphics/Bitmap;JJII)V",
            (void*) SkNinePatchGlue::drawI },
    { "nativeGetTransparentRegion", "(Landroid/graphics/Bitmap;JLandroid/graphics/Rect;)J",
    { "nativeGetTransparentRegion", "(Landroid/graphics/Bitmap;JLandroid/graphics/Rect;)J",
            (void*) SkNinePatchGlue::getTransparentRegion }
            (void*) SkNinePatchGlue::getTransparentRegion }
};
};
+8 −8
Original line number Original line Diff line number Diff line
@@ -15,7 +15,11 @@
** limitations under the License.
** limitations under the License.
*/
*/


#include "utils/NinePatch.h"
#define LOG_TAG "NinePatch"
#define LOG_NDEBUG 1

#include <androidfw/ResourceTypes.h>
#include <utils/Log.h>


#include "SkBitmap.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkCanvas.h"
@@ -26,8 +30,6 @@


#include <utils/Log.h>
#include <utils/Log.h>


namespace android {

static const bool kUseTrace = true;
static const bool kUseTrace = true;
static bool gTrace = false;
static bool gTrace = false;


@@ -95,8 +97,8 @@ SkScalar calculateStretch(SkScalar boundsLimit, SkScalar startingPoint,
    return srcSpace * stretchySpaceRemaining / numStrechyPixelsRemaining;
    return srcSpace * stretchySpaceRemaining / numStrechyPixelsRemaining;
}
}


void NinePatch::Draw(SkCanvas* canvas, const SkRect& bounds,
void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds,
                     const SkBitmap& bitmap, const Res_png_9patch& chunk,
                       const SkBitmap& bitmap, const android::Res_png_9patch& chunk,
                       const SkPaint* paint, SkRegion** outRegion) {
                       const SkPaint* paint, SkRegion** outRegion) {
    if (canvas && canvas->quickReject(bounds)) {
    if (canvas && canvas->quickReject(bounds)) {
        return;
        return;
@@ -322,5 +324,3 @@ nextDiv:
        dstRightsHaveBeenCached = true;
        dstRightsHaveBeenCached = true;
    }
    }
}
}

} // namespace android
+0 −38
Original line number Original line Diff line number Diff line
@@ -18,8 +18,6 @@
#include "GraphicsJNI.h"
#include "GraphicsJNI.h"
#include "core_jni_helpers.h"
#include "core_jni_helpers.h"


#include <androidfw/ResourceTypes.h>

#include <Canvas.h>
#include <Canvas.h>
#include "SkDrawFilter.h"
#include "SkDrawFilter.h"
#include "SkGraphics.h"
#include "SkGraphics.h"
@@ -332,41 +330,6 @@ static void drawVertices(JNIEnv* env, jobject, jlong canvasHandle,
                                           indices, indexCount, *paint);
                                           indices, indexCount, *paint);
}
}


static void drawNinePatch(JNIEnv* env, jlong canvasHandle, jobject jbitmap, jlong chunkHandle,
        jfloat left, jfloat top, jfloat right, jfloat bottom,
        jlong paintHandle, jint dstDensity, jint srcDensity) {

    Canvas* canvas = get_canvas(canvasHandle);
    SkBitmap bitmap;
    GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
    const android::Res_png_9patch* chunk = reinterpret_cast<android::Res_png_9patch*>(chunkHandle);
    const Paint* paint = reinterpret_cast<Paint*>(paintHandle);

    if (CC_LIKELY(dstDensity == srcDensity || dstDensity == 0 || srcDensity == 0)) {
        ALOGV("Drawing unscaled 9-patch: (%g,%g)-(%g,%g)", left, top, right, bottom);
        canvas->drawNinePatch(bitmap, *chunk, left, top, right, bottom, paint);
    } else {
        canvas->save(SkCanvas::kMatrixClip_SaveFlag);

        SkScalar scale = dstDensity / (float)srcDensity;
        canvas->translate(left, top);
        canvas->scale(scale, scale);

        Paint filteredPaint;
        if (paint) {
            filteredPaint = *paint;
        }
        filteredPaint.setFilterQuality(kLow_SkFilterQuality);

        ALOGV("Drawing scaled 9-patch: (0,0)-(%g,%g) srcDensity=%d destDensity=%d",
                (right-left)/scale, (bottom-top)/scale, srcDensity, dstDensity);
        canvas->drawNinePatch(bitmap, *chunk, 0, 0, (right-left)/scale, (bottom-top)/scale,
                &filteredPaint);

        canvas->restore();
    }
}

static void drawBitmap(JNIEnv* env, jobject jcanvas, jlong canvasHandle, jobject jbitmap,
static void drawBitmap(JNIEnv* env, jobject jcanvas, jlong canvasHandle, jobject jbitmap,
                       jfloat left, jfloat top, jlong paintHandle, jint canvasDensity,
                       jfloat left, jfloat top, jlong paintHandle, jint canvasDensity,
                       jint screenDensity, jint bitmapDensity) {
                       jint screenDensity, jint bitmapDensity) {
@@ -788,7 +751,6 @@ static JNINativeMethod gMethods[] = {
    {"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc},
    {"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc},
    {"native_drawPath","(JJJ)V", (void*) CanvasJNI::drawPath},
    {"native_drawPath","(JJJ)V", (void*) CanvasJNI::drawPath},
    {"nativeDrawVertices", "(JII[FI[FI[II[SIIJ)V", (void*)CanvasJNI::drawVertices},
    {"nativeDrawVertices", "(JII[FI[FI[II[SIIJ)V", (void*)CanvasJNI::drawVertices},
    {"native_drawNinePatch", "(JLandroid/graphics/Bitmap;JFFFFJII)V", (void*)CanvasJNI::drawNinePatch},
    {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFJIII)V", (void*) CanvasJNI::drawBitmap},
    {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFJIII)V", (void*) CanvasJNI::drawBitmap},
    {"nativeDrawBitmapMatrix", "(JLandroid/graphics/Bitmap;JJ)V", (void*)CanvasJNI::drawBitmapMatrix},
    {"nativeDrawBitmapMatrix", "(JLandroid/graphics/Bitmap;JJ)V", (void*)CanvasJNI::drawBitmapMatrix},
    {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect},
    {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect},
Loading