Unverified Commit 5d78bcc8 authored by Ivan Matkov's avatar Ivan Matkov Committed by GitHub

`Blender` fixes (#1162 followup) (#1175)

Fixes from #1168 extracted as a followup patch for #1162
parent e2abdf1a
...@@ -3,14 +3,23 @@ package org.jetbrains.skia ...@@ -3,14 +3,23 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.RefCnt import org.jetbrains.skia.impl.RefCnt
import org.jetbrains.skia.impl.Stats import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.interopScope import org.jetbrains.skia.impl.interopScope
/** /**
* Blender represents a custom blend function in the Skia pipeline. A blender combines a source * Blender represents a custom blend function in the Skia pipeline. A blender combines a source
* color (the result of our paint) and destination color (from the canvas) into a final color. * color (the result of our paint) and destination color (from the canvas) into a final color.
*/ */
class Blender internal constructor(ptr: NativePointer) : RefCnt(ptr) { class Blender internal constructor(ptr: NativePointer) : RefCnt(ptr) {
companion object { companion object {
init {
staticLoad()
}
fun makeMode(mode: BlendMode): Blender {
Stats.onNativeCall()
return Blender(_nMakeMode(mode.ordinal))
}
fun makeArithmetic( fun makeArithmetic(
k1: Float, k1: Float,
...@@ -19,20 +28,18 @@ class Blender internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -19,20 +28,18 @@ class Blender internal constructor(ptr: NativePointer) : RefCnt(ptr) {
k4: Float, k4: Float,
enforcePMColor: Boolean, enforcePMColor: Boolean,
): Blender { ): Blender {
return try {
Stats.onNativeCall() Stats.onNativeCall()
interopScope { return interopScope {
Blender( Blender(
_nMakeArithmetic( _nMakeArithmetic(
k1, k1,
k2, k2,
k3, k3,
k4, k4,
enforcePMColor) enforcePMColor,
),
) )
} }
} finally {
}
} }
} }
} }
...@@ -45,3 +52,6 @@ private external fun _nMakeArithmetic( ...@@ -45,3 +52,6 @@ private external fun _nMakeArithmetic(
k4: Float, k4: Float,
enforcePMColor: Boolean enforcePMColor: Boolean
): NativePointer ): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Blender__1nMakeMode")
private external fun _nMakeMode(mode: Int): NativePointer
...@@ -448,14 +448,17 @@ class Paint : Managed { ...@@ -448,14 +448,17 @@ class Paint : Managed {
} }
/** /**
* @param blender how geometry is filled with color; if null, color is used instead * Returns the user-supplied blend function, if one has been set.
* *
* @see [https://fiddle.skia.org/c/@Color_Filter_Methods](https://fiddle.skia.org/c/@Color_Filter_Methods) * A null blender signifies the default SrcOver behavior.
* *
* @see [https://fiddle.skia.org/c/@Paint_setShader](https://fiddle.skia.org/c/@Paint_setShader) * For convenience, you can call [blendMode] if the blend effect can be expressed
* as one of those values.
* *
* @return [Shader] or null * @see [https://fiddle.skia.org/c/@Paint_setBlender](https://fiddle.skia.org/c/@Paint_setBlender)
* @see [https://fiddle.skia.org/c/@Paint_refShader](https://fiddle.skia.org/c/@Paint_refShader) * @see [https://fiddle.skia.org/c/@Paint_refBlender](https://fiddle.skia.org/c/@Paint_refBlender)
*
* @return the [Blender] assigned to this paint, otherwise null
*/ */
var blender: Blender? var blender: Blender?
get() = try { get() = try {
...@@ -695,7 +698,7 @@ private external fun _nSetImageFilter(ptr: NativePointer, filterPtr: NativePoint ...@@ -695,7 +698,7 @@ private external fun _nSetImageFilter(ptr: NativePointer, filterPtr: NativePoint
private external fun _nGetBlender(ptr: NativePointer): NativePointer private external fun _nGetBlender(ptr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Paint__1nSetBlender") @ExternalSymbolName("org_jetbrains_skia_Paint__1nSetBlender")
private external fun _nSetBlender(ptr: NativePointer, shaderPtr: NativePointer) private external fun _nSetBlender(ptr: NativePointer, blenderPtr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_Paint__1nHasNothingToDraw") @ExternalSymbolName("org_jetbrains_skia_Paint__1nHasNothingToDraw")
private external fun _nHasNothingToDraw(ptr: NativePointer): Boolean private external fun _nHasNothingToDraw(ptr: NativePointer): Boolean
...@@ -58,6 +58,7 @@ class RuntimeEffect internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -58,6 +58,7 @@ class RuntimeEffect internal constructor(ptr: NativePointer) : RefCnt(ptr) {
} }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(uniforms)
} }
} }
} }
......
...@@ -51,10 +51,15 @@ class BlenderTest { ...@@ -51,10 +51,15 @@ class BlenderTest {
runtimeEffect.makeBlender(null) runtimeEffect.makeBlender(null)
} }
// @Test @Test
// fun arithmetic() = blenderTest { fun arithmetic() = blenderTest {
// Blender.makeArithmetic( Blender.makeArithmetic(
// k1 = 0.5f, k2 = 0.5f, k3 = 0.5f, k4 = 0.5f, enforcePMColor = true k1 = 0.5f, k2 = 0.5f, k3 = 0.5f, k4 = 0.5f, enforcePMColor = true
// ) )
// } }
@Test
fun mode() = blenderTest {
Blender.makeMode(BlendMode.CLEAR)
}
} }
#include <iostream>
#include <jni.h> #include <jni.h>
#include "interop.hh" #include "interop.hh"
#include "SkBlender.h" #include "SkBlender.h"
...@@ -10,3 +9,8 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BlenderKt__1nMakeArit ...@@ -10,3 +9,8 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BlenderKt__1nMakeArit
return reinterpret_cast<jlong>(ptr); return reinterpret_cast<jlong>(ptr);
} }
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_BlenderKt__1nMakeMode
(JNIEnv* env, jclass jclass, jint mode) {
SkBlender* ptr = SkBlender::Mode(static_cast<SkBlendMode>(mode)).release();
return reinterpret_cast<jlong>(ptr);
}
...@@ -185,15 +185,15 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_PaintKt__1nSetImageFil ...@@ -185,15 +185,15 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_PaintKt__1nSetImageFil
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_PaintKt__1nGetBlender extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_PaintKt__1nGetBlender
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
SkPaint* instance = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(ptr)); SkPaint* instance = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(ptr));
return reinterpret_cast<jlong>(instance->refBlender().release()); return reinterpret_cast<jlong>(instance->refBlender().release());
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_PaintKt__1nSetBlender extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_PaintKt__1nSetBlender
(JNIEnv* env, jclass jclass, jlong ptr, jlong filterPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jlong blenderPtr) {
SkPaint* instance = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(ptr)); SkPaint* instance = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(ptr));
SkBlender* filter = reinterpret_cast<SkBlender*>(static_cast<uintptr_t>(filterPtr)); SkBlender* blender = reinterpret_cast<SkBlender*>(static_cast<uintptr_t>(blenderPtr));
instance->setBlender(sk_ref_sp<SkBlender>(filter)); instance->setBlender(sk_ref_sp<SkBlender>(blender));
} }
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_PaintKt__1nGetBlendMode extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_PaintKt__1nGetBlendMode
......
#include <iostream>
#include "SkBlender.h" #include "SkBlender.h"
#include "SkBlenders.h" #include "SkBlenders.h"
#include "common.h" #include "common.h"
...@@ -8,3 +7,9 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Blender__1nMakeArithmetic ...@@ -8,3 +7,9 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Blender__1nMakeArithmetic
SkBlender* ptr = SkBlenders::Arithmetic(k1, k2, k3, k4, enforcePMColor).release(); SkBlender* ptr = SkBlenders::Arithmetic(k1, k2, k3, k4, enforcePMColor).release();
return reinterpret_cast<KNativePointer>(ptr); return reinterpret_cast<KNativePointer>(ptr);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Blender__1nMakeMode
(KInt mode) {
SkBlender* ptr = SkBlender::Mode(static_cast<SkBlendMode>(mode)).release();
return reinterpret_cast<KNativePointer>(ptr);
}
...@@ -187,16 +187,16 @@ SKIKO_EXPORT void org_jetbrains_skia_Paint__1nSetImageFilter ...@@ -187,16 +187,16 @@ SKIKO_EXPORT void org_jetbrains_skia_Paint__1nSetImageFilter
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Paint__1nGetBlender SKIKO_EXPORT KNativePointer org_jetbrains_skia_Paint__1nGetBlender
(KNativePointer ptr) { (KNativePointer ptr) {
SkPaint* instance = reinterpret_cast<SkPaint*>((ptr)); SkPaint* instance = reinterpret_cast<SkPaint*>((ptr));
return reinterpret_cast<KNativePointer>(instance->refBlender().release()); return reinterpret_cast<KNativePointer>(instance->refBlender().release());
} }
SKIKO_EXPORT void org_jetbrains_skia_Paint__1nSetBlender SKIKO_EXPORT void org_jetbrains_skia_Paint__1nSetBlender
(KNativePointer ptr, KNativePointer filterPtr) { (KNativePointer ptr, KNativePointer blenderPtr) {
SkPaint* instance = reinterpret_cast<SkPaint*>((ptr)); SkPaint* instance = reinterpret_cast<SkPaint*>((ptr));
SkBlender* filter = reinterpret_cast<SkBlender*>((filterPtr)); SkBlender* blender = reinterpret_cast<SkBlender*>((blenderPtr));
instance->setBlender(sk_ref_sp<SkBlender>(filter)); instance->setBlender(sk_ref_sp<SkBlender>(blender));
} }
SKIKO_EXPORT KInt org_jetbrains_skia_Paint__1nGetBlendMode SKIKO_EXPORT KInt org_jetbrains_skia_Paint__1nGetBlendMode
......
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