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 ...@@ -142,9 +142,12 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nAllocPixelsRowBytes
return instance->tryAllocPixels(imageInfo, rowBytes); return instance->tryAllocPixels(imageInfo, rowBytes);
} }
void deletePixelsBytes(void* addr, void*) {
free(addr);
}
SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nInstallPixels 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); SkBitmap* instance = reinterpret_cast<SkBitmap*>(ptr);
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(colorSpacePtr); SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(colorSpacePtr);
SkImageInfo imageInfo = SkImageInfo::Make(width, SkImageInfo imageInfo = SkImageInfo::Make(width,
...@@ -152,7 +155,11 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nInstallPixels ...@@ -152,7 +155,11 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nInstallPixels
static_cast<SkColorType>(colorType), static_cast<SkColorType>(colorType),
static_cast<SkAlphaType>(alphaType), static_cast<SkAlphaType>(alphaType),
sk_ref_sp<SkColorSpace>(colorSpace)); 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 SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nAllocPixels
......
...@@ -571,7 +571,8 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -571,7 +571,8 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
info.colorInfo.alphaType.ordinal, info.colorInfo.alphaType.ordinal,
getPtr(info.colorInfo.colorSpace), getPtr(info.colorInfo.colorSpace),
toInterop(pixels), toInterop(pixels),
rowBytes rowBytes,
pixels?.size ?: 0
) )
} }
} finally { } finally {
...@@ -1128,7 +1129,8 @@ private external fun _nInstallPixels( ...@@ -1128,7 +1129,8 @@ private external fun _nInstallPixels(
alphaType: Int, alphaType: Int,
colorSpacePtr: NativePointer, colorSpacePtr: NativePointer,
pixels: InteropPointer, pixels: InteropPointer,
rowBytes: Int rowBytes: Int,
pixelsLen: Int
): Boolean ): Boolean
......
...@@ -69,6 +69,23 @@ class BitmapTest { ...@@ -69,6 +69,23 @@ class BitmapTest {
assertEquals(5 * bitmap.rowBytes, result.size) 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 @Test
fun canInstallPixels() = runTest { fun canInstallPixels() = runTest {
val bitmap = Bitmap() val bitmap = Bitmap()
...@@ -79,7 +96,7 @@ class BitmapTest { ...@@ -79,7 +96,7 @@ class BitmapTest {
val result = bitmap.readPixels()!! val result = bitmap.readPixels()!!
assertTrue(bitmap.rowBytes > 0) assertTrue(bitmap.rowBytes > 0)
assertEquals(16, result.size) assertEquals(setArray.size, result.size)
assertContentEquals(setArray, result) assertContentEquals(setArray, result)
} }
} }
...@@ -133,7 +133,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nAllocP ...@@ -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 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)); SkBitmap* instance = reinterpret_cast<SkBitmap*>(static_cast<uintptr_t>(ptr));
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(static_cast<uintptr_t>(colorSpacePtr)); SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(static_cast<uintptr_t>(colorSpacePtr));
SkImageInfo imageInfo = SkImageInfo::Make(width, SkImageInfo imageInfo = SkImageInfo::Make(width,
...@@ -142,9 +142,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nInstal ...@@ -142,9 +142,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nInstal
static_cast<SkAlphaType>(alphaType), static_cast<SkAlphaType>(alphaType),
sk_ref_sp<SkColorSpace>(colorSpace)); sk_ref_sp<SkColorSpace>(colorSpace));
jsize len = env->GetArrayLength(pixelsArr); jbyte* pixels = new jbyte[pixelsLen];
jbyte* pixels = new jbyte[len]; env->GetByteArrayRegion(pixelsArr, 0, pixelsLen, pixels);
env->GetByteArrayRegion(pixelsArr, 0, len, pixels);
return instance->installPixels(imageInfo, pixels, rowBytes, deleteJBytes, nullptr); 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