Unverified Commit 5a47afa5 authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Implement native methods of Region, add test (#319)

parent 81cbf367
......@@ -52,7 +52,10 @@ class Region : Managed(Region_nMake(), _FinalizerHolder.PTR) {
val bounds: IRect
get() = try {
Stats.onNativeCall()
Region_nGetBounds(_ptr)
val ltrb = withResult(IntArray(4)) {
Region_nGetBounds(_ptr, it)
}
IRect(ltrb[0], ltrb[1], ltrb[2], ltrb[3])
} finally {
reachabilityBarrier(this)
}
......@@ -108,7 +111,7 @@ class Region : Managed(Region_nMake(), _FinalizerHolder.PTR) {
}
Stats.onNativeCall()
interopScope {
Region_nSetRects(_ptr, toInterop(arr))
Region_nSetRects(_ptr, toInterop(arr), rects.size)
}
} finally {
reachabilityBarrier(this)
......@@ -335,7 +338,7 @@ private external fun Region_nIsEmpty(ptr: NativePointer): Boolean
private external fun Region_nIsRect(ptr: NativePointer): Boolean
@ExternalSymbolName("org_jetbrains_skia_Region__1nGetBounds")
private external fun Region_nGetBounds(ptr: NativePointer): IRect
private external fun Region_nGetBounds(ptr: NativePointer, ltrb: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Region__1nSet")
private external fun Region_nSet(ptr: NativePointer, regoinPtr: NativePointer): Boolean
......@@ -356,7 +359,7 @@ private external fun Region_nSetEmpty(ptr: NativePointer): Boolean
private external fun Region_nSetRect(ptr: NativePointer, left: Int, top: Int, right: Int, bottom: Int): Boolean
@ExternalSymbolName("org_jetbrains_skia_Region__1nSetRects")
private external fun Region_nSetRects(ptr: NativePointer, rects: InteropPointer): Boolean
private external fun Region_nSetRects(ptr: NativePointer, rects: InteropPointer, count: Int): Boolean
@ExternalSymbolName("org_jetbrains_skia_Region__1nSetRegion")
private external fun Region_nSetRegion(ptr: NativePointer, regionPtr: NativePointer): Boolean
......
package org.jetbrains.skia
import kotlin.test.Test
import kotlin.test.assertEquals
class RegionTest {
@Test
fun canGetBounds() {
val bounds = IRect(10, 10, 30, 30)
val region = Region().apply { setRect(bounds) }
assertEquals(bounds, region.bounds)
}
@Test
fun canSetRects() {
val bounds = IRect(10, 10, 30, 30)
val region = Region().apply {
setRects(arrayOf(
IRect(10, 10, 25, 25),
IRect(15, 15, 30, 30),
))
}
assertEquals(bounds, region.bounds)
}
}
\ No newline at end of file
......@@ -38,9 +38,11 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_RegionKt_Region_1n
return instance->isComplex();
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_RegionKt_Region_1nGetBounds(JNIEnv* env, jclass jclass, jlong ptr) {
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_RegionKt_Region_1nGetBounds(JNIEnv* env, jclass jclass, jlong ptr, jintArray ltrbArray) {
SkRegion* instance = reinterpret_cast<SkRegion*>(static_cast<uintptr_t>(ptr));
return skija::IRect::fromSkIRect(env, instance->getBounds());
SkIRect bounds = instance->getBounds();
jint ltrb[4] { bounds.left(), bounds.top(), bounds.right(), bounds.bottom() };
env->SetIntArrayRegion(ltrbArray, 0, 4, ltrb);
}
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_RegionKt_Region_1nComputeRegionComplexity(JNIEnv* env, jclass jclass, jlong ptr) {
......@@ -64,7 +66,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_RegionKt_Region_1n
return instance->setRect({left, top, right, bottom});
}
extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_RegionKt_Region_1nSetRects(JNIEnv* env, jclass jclass, jlong ptr, jintArray coords) {
extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_RegionKt_Region_1nSetRects(JNIEnv* env, jclass jclass, jlong ptr, jintArray coords, jint _count) {
SkRegion* instance = reinterpret_cast<SkRegion*>(static_cast<uintptr_t>(ptr));
int len = env->GetArrayLength(coords);
std::vector<SkIRect> rects(len / 4);
......
......@@ -41,16 +41,15 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nIsComplex(KNativePointer ptr)
}
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Region__1nGetBounds(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_Region__1nGetBounds(KInteropPointer");
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Region__1nGetBounds(KNativePointer ptr) {
SKIKO_EXPORT void org_jetbrains_skia_Region__1nGetBounds(KNativePointer ptr, KInteropPointer ltrbArray) {
SkRegion* instance = reinterpret_cast<SkRegion*>((ptr));
return skija::IRect::fromSkIRect(env, instance->getBounds());
int* ltrb = reinterpret_cast<int*>(ltrbArray);
SkIRect bounds = instance->getBounds();
ltrb[0] = bounds.left();
ltrb[1] = bounds.top();
ltrb[2] = bounds.right();
ltrb[3] = bounds.bottom();
}
#endif
SKIKO_EXPORT KInt org_jetbrains_skia_Region__1nComputeRegionComplexity(KNativePointer ptr) {
......@@ -74,24 +73,13 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nSetRect(KNativePointer ptr, K
return instance->setRect({left, top, right, bottom});
}
SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nSetRects(KNativePointer ptr, KInt* coords) {
TODO("implement org_jetbrains_skia_Region__1nSetRects(KInteropPointer");
}
#if 0
SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nSetRects(KNativePointer ptr, KInt* coords) {
SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nSetRects(KNativePointer ptr, KInt* coords, KInt count) {
SkRegion* instance = reinterpret_cast<SkRegion*>((ptr));
int len = env->GetArrayLength(coords);
std::vector<SkIRect> rects(len / 4);
KInt* arr = env->GetIntArrayElements(coords, 0);
for (int i = 0; i < len; i += 4)
rects[i / 4] = {arr[i], arr[i+1], arr[i+2], arr[i+3]};
env->ReleaseIntArrayElements(coords, arr, 0);
return instance->setRects(rects.data(), len / 4);
std::vector<SkIRect> rects(count);
for (int i = 0, off = 0; i < count; i++, off += 4)
rects[i] = {coords[off], coords[off+1], coords[off+2], coords[off+3]};
return instance->setRects(rects.data(), count);
}
#endif
SKIKO_EXPORT KBoolean org_jetbrains_skia_Region__1nSetRegion(KNativePointer ptr, KNativePointer regionPtr) {
SkRegion* instance = reinterpret_cast<SkRegion*>((ptr));
......
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