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(); } }