static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, int offset, int stride, int width, int height, SkBitmap::Config config, jboolean isMutable) { if (NULL != jColors) { size_t n = env->GetArrayLength(jColors); if (n < SkAbs32(stride) * (size_t)height) { doThrowAIOOBE(env); return NULL; } } SkBitmap bitmap; bitmap.setConfig(config, width, height); jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL); if (NULL == buff) { return NULL; } if (jColors != NULL) { GraphicsJNI::SetPixels(env, jColors, offset, stride, 0, 0, width, height, bitmap); } return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, isMutable, NULL); }
static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, jint offset, jint stride, jint width, jint height, jint configHandle, jboolean isMutable) { SkColorType colorType = GraphicsJNI::legacyBitmapConfigToColorType(configHandle); if (NULL != jColors) { size_t n = env->GetArrayLength(jColors); if (n < SkAbs32(stride) * (size_t)height) { doThrowAIOOBE(env); return NULL; } } // ARGB_4444 is a deprecated format, convert automatically to 8888 if (colorType == kARGB_4444_SkColorType) { colorType = kN32_SkColorType; } SkBitmap bitmap; bitmap.setInfo(SkImageInfo::Make(width, height, colorType, kPremul_SkAlphaType)); jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL); if (NULL == buff) { return NULL; } if (jColors != NULL) { GraphicsJNI::SetPixels(env, jColors, offset, stride, 0, 0, width, height, bitmap); } return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, getPremulBitmapCreateFlags(isMutable), NULL, NULL); }
static void doPoints(JNIEnv* env, jobject jcanvas, jfloatArray jptsArray, jint offset, jint count, jobject jpaint, SkCanvas::PointMode mode) { NPE_CHECK_RETURN_VOID(env, jcanvas); NPE_CHECK_RETURN_VOID(env, jptsArray); NPE_CHECK_RETURN_VOID(env, jpaint); SkCanvas* canvas = GraphicsJNI::getNativeCanvas(env, jcanvas); const SkPaint& paint = *GraphicsJNI::getNativePaint(env, jpaint); AutoJavaFloatArray autoPts(env, jptsArray); float* floats = autoPts.ptr(); const int length = autoPts.length(); if ((offset | count) < 0 || offset + count > length) { doThrowAIOOBE(env); return; } // now convert the floats into SkPoints count >>= 1; // now it is the number of points SkAutoSTMalloc<32, SkPoint> storage(count); SkPoint* pts = storage.get(); const float* src = floats + offset; for (int i = 0; i < count; i++) { pts[i].set(SkFloatToScalar(src[0]), SkFloatToScalar(src[1])); src += 2; } canvas->drawPoints(mode, count, pts, paint); }
static jobject Bitmap_creator(JNIEnv* env, jobject, jintArray jColors, jint offset, jint stride, jint width, jint height, jint configHandle, jboolean isMutable) { SkBitmap::Config config = static_cast<SkBitmap::Config>(configHandle); if (NULL != jColors) { size_t n = env->GetArrayLength(jColors); if (n < SkAbs32(stride) * (size_t)height) { doThrowAIOOBE(env); return NULL; } } // ARGB_4444 is a deprecated format, convert automatically to 8888 if (config == SkBitmap::kARGB_4444_Config) { config = SkBitmap::kARGB_8888_Config; } SkBitmap bitmap; bitmap.setConfig(config, width, height); jbyteArray buff = GraphicsJNI::allocateJavaPixelRef(env, &bitmap, NULL); if (NULL == buff) { return NULL; } if (jColors != NULL) { GraphicsJNI::SetPixels(env, jColors, offset, stride, 0, 0, width, height, bitmap, true); } return GraphicsJNI::createBitmap(env, new SkBitmap(bitmap), buff, getPremulBitmapCreateFlags(isMutable), NULL, NULL); }
static void drawLines(JNIEnv* env, jobject, jlong canvasHandle, jfloatArray jptsArray, jint offset, jint count, jlong paintHandle) { NPE_CHECK_RETURN_VOID(env, jptsArray); AutoJavaFloatArray autoPts(env, jptsArray); float* floats = autoPts.ptr(); const int length = autoPts.length(); if ((offset | count) < 0 || offset + count > length) { doThrowAIOOBE(env); return; } const Paint* paint = reinterpret_cast<Paint*>(paintHandle); get_canvas(canvasHandle)->drawLines(floats + offset, count, *paint); }
static jobject movie_decodeByteArray(JNIEnv* env, jobject clazz, jbyteArray byteArray, jint offset, jint length) { NPE_CHECK_RETURN_ZERO(env, byteArray); int totalLength = env->GetArrayLength(byteArray); if ((offset | length) < 0 || offset + length > totalLength) { doThrowAIOOBE(env); return 0; } AutoJavaByteArray ar(env, byteArray); SkMovie* moov = SkMovie::DecodeMemory(ar.ptr() + offset, length); return create_jmovie(env, moov); }