のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

android canvas drawbitmap

Canvas | Android Developers
android/platform_frameworks_base/graphics/java/android/graphics/Canvas.java

public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
       throwIfRecycled(bitmap);
       native_drawBitmap(
           mNativeCanvas,                          // I
           bitmap.ni(),                            // I
           left,                                   // F
           top,                                    // F
           paint != null ? paint.mNativePaint : 0, // I
           mDensity,                               // I
           mScreenDensity,                         // I
           bitmap.mDensity);                       // I
    }

    ↓
android/platform_frameworks_base/core/jni/android/graphics/Canvas.cpp

   {"native_drawBitmap","(IIFFIIII)V",
        (void*) SkCanvasGlue::drawBitmap__BitmapFFPaint},
public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
        if (dst == null) {
            throw new NullPointerException();
        }
        throwIfRecycled(bitmap);
        native_drawBitmap(
            mNativeCanvas,                            // I
            bitmap.ni(),                              // I
            src,                                      // Rect
            dst,                                      // RectF
            paint != null ? paint.mNativePaint : 0,   // I
            mScreenDensity,                           // I
            bitmap.mDensity);                         // I
    }
    ↓
  {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/RectF;III)V",
        (void*) SkCanvasGlue::drawBitmapRF},

③   public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {
       if (dst == null) {
           throw new NullPointerException();
        }
        throwIfRecycled(bitmap);
        native_drawBitmap(
            mNativeCanvas,                          // I
            bitmap.ni(),                            // I
            src,                                    // Rect
            dst,                                    // Rect
            paint != null ? paint.mNativePaint : 0, // I
            mScreenDensity,                         // I
            bitmap.mDensity);                       // I
    }
    ↓
  {"native_drawBitmap","(IILandroid/graphics/Rect;Landroid/graphics/Rect;III)V",
        (void*) SkCanvasGlue::drawBitmapRR},

④  public void drawBitmap(int[] colors, int offset, int stride,
        float x, float y, int width, int height,
        boolean hasAlpha, Paint paint) {
        (略)
    // punch down to native for the actual draw
        native_drawBitmap(
            mNativeCanvas,                            // I
            colors,                                   // [I
            offset,                                   // I
            stride,                                   // I
            x,                                        // F
            y,                                        // F
            width,                                    // I
            height,                                   // I
            hasAlpha,                                 // Z
            paint != null ? paint.mNativePaint : 0);  // I
    }
    ↓
    {"native_drawBitmap", "(I[IIIFFIIZI)V",
    (void*)SkCanvasGlue::drawBitmapArray},||<

  上と同じ
    public void drawBitmap(int[] colors, int offset, int stride,
        int x, int y, int width, int height,
        boolean hasAlpha, Paint paint) {
        // call through to the common float version
        drawBitmap(
            colors, offset, stride, (float)x, (float)y, 
            width, height, hasAlpha, paint);
    }

⑤  public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {
        nativeDrawBitmapMatrix(
            mNativeCanvas,                           // I
            bitmap.ni(),                             // I
            matrix.ni(),                             // I
            paint != null ? paint.mNativePaint : 0); // I
    }
    ↓
  {"nativeDrawBitmapMatrix", "(IIII)V",
        (void*)SkCanvasGlue::drawBitmapMatrix},


android/platform_frameworks_base/core/jni/android/graphics/Canvas.cpp

    static void drawBitmap__BitmapFFPaint(JNIEnv* env, jobject jcanvas,
                                          SkCanvas* canvas, SkBitmap* bitmap,
                                          jfloat left, jfloat top,
                                          SkPaint* paint, jint canvasDensity,
                                          jint screenDensity, jint bitmapDensity) {
        SkScalar left_ = SkFloatToScalar(left);
        SkScalar top_ = SkFloatToScalar(top);

        if (canvasDensity == bitmapDensity || canvasDensity == 0
                || bitmapDensity == 0) {
            if (screenDensity != 0 && screenDensity != bitmapDensity) {
                SkPaint filteredPaint;
                if (paint) {
                    filteredPaint = *paint;
                }
                filteredPaint.setFilterBitmap(true);
                canvas->drawBitmap(*bitmap, left_, top_, &filteredPaint);
            } else {
                canvas->drawBitmap(*bitmap, left_, top_, paint);
            }
        } else {
            canvas->save();
            SkScalar scale = SkFloatToScalar(canvasDensity / (float)bitmapDensity);
            canvas->translate(left_, top_);
            canvas->scale(scale, scale);

            SkPaint filteredPaint;
            if (paint) {
                filteredPaint = *paint;
            }
            filteredPaint.setFilterBitmap(true);

            canvas->drawBitmap(*bitmap, 0, 0, &filteredPaint);

            canvas->restore();
        }
    }