Unverified Commit 2cc6a787 authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

add test for Bitmap readPixels and fix installPixels (#271)

Co-authored-by: 's avatarOleksandr Karpovich <oleksandr.karpovich@jetbrains.com>
parent 2ef9b920
......@@ -142,9 +142,12 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nAllocPixelsRowBytes
return instance->tryAllocPixels(imageInfo, rowBytes);
}
void deletePixelsBytes(void* addr, void*) {
free(addr);
}
SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nInstallPixels
(KNativePointer ptr, KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr, KByte* pixelsArr, KInt rowBytes) {
(KNativePointer ptr, KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr, KByte* pixelsArr, KInt rowBytes, KInt pixelsLen) {
SkBitmap* instance = reinterpret_cast<SkBitmap*>(ptr);
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(colorSpacePtr);
SkImageInfo imageInfo = SkImageInfo::Make(width,
......@@ -152,7 +155,11 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nInstallPixels
static_cast<SkColorType>(colorType),
static_cast<SkAlphaType>(alphaType),
sk_ref_sp<SkColorSpace>(colorSpace));
return instance->installPixels(imageInfo, pixelsArr, rowBytes, nullptr, nullptr);
KNativePointer copyPtr = malloc(pixelsLen);
void* copy = memcpy(copyPtr, pixelsArr, pixelsLen);
return instance->installPixels(imageInfo, copy, rowBytes, deletePixelsBytes, nullptr);
}
SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nAllocPixels
......
......@@ -571,7 +571,8 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
info.colorInfo.alphaType.ordinal,
getPtr(info.colorInfo.colorSpace),
toInterop(pixels),
rowBytes
rowBytes,
pixels?.size ?: 0
)
}
} finally {
......@@ -1128,7 +1129,8 @@ private external fun _nInstallPixels(
alphaType: Int,
colorSpacePtr: NativePointer,
pixels: InteropPointer,
rowBytes: Int
rowBytes: Int,
pixelsLen: Int
): Boolean
......
......@@ -69,6 +69,23 @@ class BitmapTest {
assertEquals(5 * bitmap.rowBytes, result.size)
}
@Test //fixed bug https://github.com/JetBrains/skiko/pull/266
fun canReadPixelsWithGivenRowBytes() = runTest {
val bitmap = Bitmap()
bitmap.allocPixels(ImageInfo.makeS32(15, 15, ColorAlphaType.OPAQUE))
val newImageInfo = ImageInfo.makeS32(5, 5, ColorAlphaType.OPAQUE)
val result = bitmap.readPixels(
srcY = 1, srcX = 1,
dstInfo = newImageInfo,
dstRowBytes = newImageInfo.minRowBytes
)!!
assertTrue(newImageInfo.minRowBytes > 0 && newImageInfo.minRowBytes < bitmap.rowBytes)
assertEquals(newImageInfo.minRowBytes * 5, result.size)
}
@Test
fun canInstallPixels() = runTest {
val bitmap = Bitmap()
......@@ -79,7 +96,7 @@ class BitmapTest {
val result = bitmap.readPixels()!!
assertTrue(bitmap.rowBytes > 0)
assertEquals(16, result.size)
assertEquals(setArray.size, result.size)
assertContentEquals(setArray, result)
}
}
......@@ -133,7 +133,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nAllocP
}
extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nInstallPixels
(JNIEnv* env, jclass jclass, jlong ptr, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jbyteArray pixelsArr, jint rowBytes) {
(JNIEnv* env, jclass jclass, jlong ptr, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jbyteArray pixelsArr, jint rowBytes, jint pixelsLen) {
SkBitmap* instance = reinterpret_cast<SkBitmap*>(static_cast<uintptr_t>(ptr));
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(static_cast<uintptr_t>(colorSpacePtr));
SkImageInfo imageInfo = SkImageInfo::Make(width,
......@@ -142,9 +142,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nInstal
static_cast<SkAlphaType>(alphaType),
sk_ref_sp<SkColorSpace>(colorSpace));
jsize len = env->GetArrayLength(pixelsArr);
jbyte* pixels = new jbyte[len];
env->GetByteArrayRegion(pixelsArr, 0, len, pixels);
jbyte* pixels = new jbyte[pixelsLen];
env->GetByteArrayRegion(pixelsArr, 0, pixelsLen, pixels);
return instance->installPixels(imageInfo, pixels, rowBytes, deleteJBytes, nullptr);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment