Unverified Commit c806b16f authored by igoriakovlev's avatar igoriakovlev Committed by GitHub

Fixes for CMP-7405 (#1060)

This fixed
[issue](https://youtrack.jetbrains.com/issue/CMP-7405/Invalid-imports-in-skiko-to-skia-API)
for non-JVM targets.

Some of this fixes overlapped by
[this](https://github.com/JetBrains/skiko/pull/1050) and
[this](https://github.com/JetBrains/skiko/pull/1049) MR's. We could drop
then here or close that MR's at the discretion of the reviewer.
parent e81310fc
...@@ -1098,10 +1098,6 @@ private external fun _nMakeClone(ptr: NativePointer): NativePointer ...@@ -1098,10 +1098,6 @@ private external fun _nMakeClone(ptr: NativePointer): NativePointer
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nSwap") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nSwap")
private external fun _nSwap(ptr: NativePointer, otherPtr: NativePointer) private external fun _nSwap(ptr: NativePointer, otherPtr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_Bitmap__1nGetPixmap")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nGetPixmap")
private external fun _nGetPixmap(ptr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Bitmap__1nGetImageInfo") @ExternalSymbolName("org_jetbrains_skia_Bitmap__1nGetImageInfo")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nGetImageInfo") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nGetImageInfo")
private external fun _nGetImageInfo(ptr: NativePointer, imageInfo: InteropPointer, colorSpacePtrs: InteropPointer) private external fun _nGetImageInfo(ptr: NativePointer, imageInfo: InteropPointer, colorSpacePtrs: InteropPointer)
...@@ -1134,14 +1130,6 @@ private external fun _nIsImmutable(ptr: NativePointer): Boolean ...@@ -1134,14 +1130,6 @@ private external fun _nIsImmutable(ptr: NativePointer): Boolean
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nSetImmutable") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nSetImmutable")
private external fun _nSetImmutable(ptr: NativePointer) private external fun _nSetImmutable(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_Bitmap__1nIsVolatile")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nIsVolatile")
private external fun _nIsVolatile(ptr: NativePointer): Boolean
@ExternalSymbolName("org_jetbrains_skia_Bitmap__1nSetVolatile")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nSetVolatile")
private external fun _nSetVolatile(ptr: NativePointer, value: Boolean)
@ExternalSymbolName("org_jetbrains_skia_Bitmap__1nReset") @ExternalSymbolName("org_jetbrains_skia_Bitmap__1nReset")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nReset") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_Bitmap__1nReset")
private external fun _nReset(ptr: NativePointer) private external fun _nReset(ptr: NativePointer)
......
package org.jetbrains.skia
import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.reachabilityBarrier
class DynamicMemoryWStream() : WStream(DynamicMemoryWStream_nMake(), _FinalizerHolder.PTR) {
companion object {
init {
staticLoad()
}
}
private object _FinalizerHolder {
val PTR = DynamicMemoryWStream_nGetFinalizer()
}
fun bytesWritten(): Int = _nBytesWritten(_ptr)
fun read(buffer: ByteArray, offset: Int, size: Int): Boolean {
check(buffer.size >= size) {
"byteArray is not properly allocated. Use bytesWritten"
}
try {
Stats.onNativeCall()
interopScope {
val byteArrayHandle = toInteropForResult(buffer)
val successfulRead = _nRead(_ptr, byteArrayHandle, offset, size)
if (successfulRead) {
byteArrayHandle.fromInterop(buffer)
}
return successfulRead
}
} finally {
reachabilityBarrier(this)
}
}
init {
Stats.onNativeCall()
}
}
@ExternalSymbolName("org_jetbrains_skia_DynamicMemoryWStream__1nMake")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_DynamicMemoryWStream__1nMake")
private external fun DynamicMemoryWStream_nMake(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_DynamicMemoryWStream__1nGetFinalizer")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_DynamicMemoryWStream__1nGetFinalizer")
private external fun DynamicMemoryWStream_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_DynamicMemoryWStream__1nBytesWritten")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_DynamicMemoryWStream__1nBytesWritten")
private external fun _nBytesWritten(stream: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_DynamicMemoryWStream__1nRead")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_DynamicMemoryWStream__1nRead")
private external fun _nRead(stream: NativePointer, buffer: InteropPointer, offset: Int, size: Int): Boolean
\ No newline at end of file
@file:Suppress("NESTED_EXTERNAL_DECLARATION")
package org.jetbrains.skia.shaper package org.jetbrains.skia.shaper
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
...@@ -11,7 +10,7 @@ import org.jetbrains.skia.ModuleImport ...@@ -11,7 +10,7 @@ import org.jetbrains.skia.ModuleImport
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
class TextBlobBuilderRunHandler<T> internal constructor( class TextBlobBuilderRunHandler internal constructor(
text: ManagedString?, text: ManagedString?,
manageText: Boolean, manageText: Boolean,
offsetX: Float, offsetX: Float,
...@@ -80,14 +79,14 @@ class TextBlobBuilderRunHandler<T> internal constructor( ...@@ -80,14 +79,14 @@ class TextBlobBuilderRunHandler<T> internal constructor(
} }
} }
@ExternalSymbolName("org_jetbrains_skia_TextBlobBuilderRunHandler__1nGetFinalizer") @ExternalSymbolName("org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nGetFinalizer")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_TextBlobBuilderRunHandler__1nGetFinalizer") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nGetFinalizer")
private external fun TextBlobBuilderRunHandler_nGetFinalizer(): NativePointer private external fun TextBlobBuilderRunHandler_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_TextBlobBuilderRunHandler__1nMake") @ExternalSymbolName("org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nMake")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_TextBlobBuilderRunHandler__1nMake") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nMake")
private external fun TextBlobBuilderRunHandler_nMake(textPtr: NativePointer, offsetX: Float, offsetY: Float): NativePointer private external fun TextBlobBuilderRunHandler_nMake(textPtr: NativePointer, offsetX: Float, offsetY: Float): NativePointer
@ExternalSymbolName("org_jetbrains_skia_TextBlobBuilderRunHandler__1nMakeBlob") @ExternalSymbolName("org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nMakeBlob")
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_TextBlobBuilderRunHandler__1nMakeBlob") @ModuleImport("./skiko.mjs", "org_jetbrains_skia_shaper_TextBlobBuilderRunHandler__1nMakeBlob")
private external fun _nMakeBlob(ptr: NativePointer): NativePointer private external fun _nMakeBlob(ptr: NativePointer): NativePointer
package org.jetbrains.skia package org.jetbrains.skia
import org.jetbrains.skia.shaper.TextBlobBuilderRunHandler
import org.jetbrains.skia.tests.assertCloseEnough import org.jetbrains.skia.tests.assertCloseEnough
import org.jetbrains.skia.tests.assertContentCloseEnough import org.jetbrains.skia.tests.assertContentCloseEnough
import org.jetbrains.skia.tests.makeFromResource import org.jetbrains.skia.tests.makeFromResource
...@@ -122,6 +123,14 @@ class TextBlobBuilderTest { ...@@ -122,6 +123,14 @@ class TextBlobBuilderTest {
) )
} }
@Test
fun simpleTextBlobBuilderRunHandler() {
val handler = TextBlobBuilderRunHandler("Some text")
handler.makeBlob()
handler.close()
require(handler.isClosed)
}
@Test @Test
fun canAppendRunWithRSXform() = runTest { fun canAppendRunWithRSXform() = runTest {
val font = inter36() val font = inter36()
......
package org.jetbrains.skiko.tests.org.jetbrains.skia.svg package org.jetbrains.skiko.tests.org.jetbrains.skia.svg
import org.jetbrains.skia.Data import org.jetbrains.skia.Data
import org.jetbrains.skia.OutputWStream import org.jetbrains.skia.DynamicMemoryWStream
import org.jetbrains.skia.Point import org.jetbrains.skia.Point
import org.jetbrains.skia.Rect import org.jetbrains.skia.Rect
import org.jetbrains.skia.WStream
import org.jetbrains.skia.svg.* import org.jetbrains.skia.svg.*
import java.io.ByteArrayOutputStream
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
class SVGCanvasTest { class SVGCanvasTestWithDynamicMemoryWStream {
@Test
fun svgCanvasSmoke() {
svgCanvasSmokeWithCustomWStream { doWithStream ->
val outputStream = DynamicMemoryWStream()
doWithStream(outputStream)
val streamBytes = ByteArray(outputStream.bytesWritten())
require(outputStream.read(streamBytes, 0, streamBytes.size))
streamBytes
}
}
}
val svgText = """ private val svgText = """
<svg version="1.1" <svg version="1.1"
width="300" height="200" width="300" height="200"
xmlns="http://www.w3.org/2000/svg"> xmlns="http://www.w3.org/2000/svg">
...@@ -25,38 +36,37 @@ class SVGCanvasTest { ...@@ -25,38 +36,37 @@ class SVGCanvasTest {
</svg> </svg>
""".trimIndent() """.trimIndent()
@Test fun svgCanvasSmokeWithCustomWStream(withStream: ((WStream) -> Unit) -> ByteArray) {
fun svgCanvasSmoke() { val data = Data.makeFromBytes(svgText.encodeToByteArray())
val data = Data.makeFromBytes(svgText.encodeToByteArray()) val inputDom = SVGDOM(data)
val inputDom = SVGDOM(data)
val baos = ByteArrayOutputStream() val streamBytes = withStream { outputStream ->
val svgCanvas = SVGCanvas.make(Rect.Companion.makeWH(300f, 200f), OutputWStream(baos)) val svgCanvas = SVGCanvas.make(Rect.Companion.makeWH(300f, 200f), outputStream)
inputDom.render(svgCanvas) inputDom.render(svgCanvas)
svgCanvas.close() svgCanvas.close()
val svgCanvasData = Data.makeFromBytes(baos.toByteArray())
val dom = SVGDOM(svgCanvasData)
require(!dom.isClosed)
dom.setContainerSize(Point(100f, 100f))
dom.setContainerSize(101f, 101f)
require(dom.root != null)
val e = dom.root!!
require(e.x.unit == SVGLengthUnit.NUMBER)
require(e.y.unit == SVGLengthUnit.NUMBER)
require(e.width.unit == SVGLengthUnit.NUMBER)
require(e.height.unit == SVGLengthUnit.NUMBER)
require(e.viewBox == null)
require(e.tag == SVGTag.SVG)
e.viewBox = Rect(0f, 1f, 100f, 200f)
val aspectRatio =
SVGPreserveAspectRatio(SVGPreserveAspectRatioAlign.XMIN_YMIN, SVGPreserveAspectRatioScale.MEET)
e.preserveAspectRatio = aspectRatio
assertEquals(aspectRatio, e.preserveAspectRatio)
require(e.getIntrinsicSize(SVGLengthContext(100f, 100f)).x == 300f)
e.viewBox = Rect.makeXYWH(0f, 1f, 2f, 3f)
require(e.viewBox == Rect.makeXYWH(0f, 1f, 2f, 3f))
} }
}
val svgCanvasData = Data.makeFromBytes(streamBytes)
val dom = SVGDOM(svgCanvasData)
require(!dom.isClosed)
dom.setContainerSize(Point(100f, 100f))
dom.setContainerSize(101f, 101f)
require(dom.root != null)
val e = dom.root!!
require(e.x.unit == SVGLengthUnit.NUMBER)
require(e.y.unit == SVGLengthUnit.NUMBER)
require(e.width.unit == SVGLengthUnit.NUMBER)
require(e.height.unit == SVGLengthUnit.NUMBER)
require(e.viewBox == null)
require(e.tag == SVGTag.SVG)
e.viewBox = Rect(0f, 1f, 100f, 200f)
val aspectRatio =
SVGPreserveAspectRatio(SVGPreserveAspectRatioAlign.XMIN_YMIN, SVGPreserveAspectRatioScale.MEET)
e.preserveAspectRatio = aspectRatio
assertEquals(aspectRatio, e.preserveAspectRatio)
require(e.getIntrinsicSize(SVGLengthContext(100f, 100f)).x == 300f)
e.viewBox = Rect.makeXYWH(0f, 1f, 2f, 3f)
require(e.viewBox == Rect.makeXYWH(0f, 1f, 2f, 3f))
}
\ No newline at end of file
#include <jni.h>
#include "interop.hh"
#include "SkStream.h"
static void deleteDynamicMemoryWStream(SkDynamicMemoryWStream* out) {
delete out;
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_DynamicMemoryWStreamKt_DynamicMemoryWStream_1nGetFinalizer
(JNIEnv* env, jclass jclass) {
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&deleteDynamicMemoryWStream));
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_DynamicMemoryWStreamKt_DynamicMemoryWStream_1nMake
(JNIEnv* env, jclass jclass) {
return reinterpret_cast<jlong>(new SkDynamicMemoryWStream());
}
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_DynamicMemoryWStreamKt__1nBytesWritten
(JNIEnv* env, jclass jclass, jlong stream) {
SkDynamicMemoryWStream* sk_stream = jlongToPtr<SkDynamicMemoryWStream*>(stream);
size_t result = sk_stream->bytesWritten();
return static_cast<jlong>(result);
}
extern "C" JNIEXPORT int8_t JNICALL Java_org_jetbrains_skia_DynamicMemoryWStreamKt__1nRead
(JNIEnv* env, jclass jclass, jlong stream, jbyteArray buffer, jint offset, jint size) {
SkDynamicMemoryWStream* sk_stream = jlongToPtr<SkDynamicMemoryWStream*>(stream);
jbyte* rawArray = env->GetByteArrayElements(buffer, 0);
bool result = sk_stream->read(rawArray, offset, size);
env->ReleaseByteArrayElements(buffer, rawArray, 0);
if (result) {
return true;
} else {
return false;
}
}
\ No newline at end of file
package org.jetbrains.skiko.tests.org.jetbrains.skia.svg
import org.jetbrains.skia.OutputWStream
import java.io.ByteArrayOutputStream
import kotlin.test.Test
class SVGCanvasTestWithOutputWStream {
@Test
fun svgCanvasSmoke() {
svgCanvasSmokeWithCustomWStream { doWithStream ->
ByteArrayOutputStream().use { baos ->
doWithStream(OutputWStream(baos))
baos.toByteArray()
}
}
}
}
#include "common.h"
#include "SkStream.h"
static void deleteDynamicMemoryWStream(SkDynamicMemoryWStream* out) {
delete out;
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_DynamicMemoryWStream__1nGetFinalizer
() {
return reinterpret_cast<KNativePointer>((&deleteDynamicMemoryWStream));
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_DynamicMemoryWStream__1nMake
() {
return reinterpret_cast<KNativePointer>(new SkDynamicMemoryWStream());
}
SKIKO_EXPORT KInt org_jetbrains_skia_DynamicMemoryWStream__1nBytesWritten
(KNativePointer stream) {
SkDynamicMemoryWStream* sk_stream = reinterpret_cast<SkDynamicMemoryWStream*>(stream);
size_t result = sk_stream->bytesWritten();
return static_cast<KInt>(result);
}
SKIKO_EXPORT KBoolean org_jetbrains_skia_DynamicMemoryWStream__1nRead
(KNativePointer stream, KByte* buffer, KInt offset, KInt size) {
SkDynamicMemoryWStream* sk_stream = reinterpret_cast<SkDynamicMemoryWStream*>(stream);
return sk_stream->read(buffer, offset, size);
}
\ No newline at end of file
#include "common.h"
#include "SkRect.h"
#include "SkCanvas.h"
#include "SkSVGCanvas.h"
#include "SkStream.h"
SKIKO_EXPORT KNativePointer org_jetbrains_skia_svg_SVGCanvasKt__1nMake
(KFloat left, KFloat top, KFloat right, KFloat bottom, KNativePointer wstreamPtr, KInt flags) {
SkWStream* wstream = reinterpret_cast<SkWStream*>(wstreamPtr);
SkRect bounds {left, top, right, bottom};
SkCanvas* instance = SkSVGCanvas::Make(bounds, wstream, flags).release();
return reinterpret_cast<KNativePointer>(instance);
}
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