Unverified Commit aa7ae5bb authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

commonize ImageTest.kt and SurfaceTest.kt (#261)

parent c9381093
......@@ -55,6 +55,10 @@ namespace skija {
SkFontStyle fromKotlin(KInt style);
KInt toKotlin(const SkFontStyle& fs);
}
namespace ImageInfo {
void writeImageInfoForInterop(SkImageInfo imageInfo, KInt* imageInfoResult, KNativePointer* colorSpacePtrsArray);
}
}
std::unique_ptr<SkMatrix> skMatrix(KFloat* matrixArray);
......
#include "common.h"
#include "src/utils/SkUTF.h"
#include "include/core/SkImageInfo.h"
#include <stdio.h>
KLong packTwoInts(int32_t a, int32_t b) {
......@@ -145,4 +146,15 @@ namespace skija {
return (static_cast<int>(fs.slant()) << 24)| (fs.width() << 16) | fs.weight();
}
}
namespace ImageInfo {
void writeImageInfoForInterop(SkImageInfo imageInfo, KInt* imageInfoResult, KNativePointer* colorSpacePtrsArray) {
imageInfoResult[0] = imageInfo.width();
imageInfoResult[1] = imageInfo.height();
imageInfoResult[2] = static_cast<int>(imageInfo.colorType());
imageInfoResult[3] = static_cast<int>(imageInfo.alphaType());
colorSpacePtrsArray[0] = imageInfo.refColorSpace().release();
}
}
}
......@@ -40,13 +40,7 @@ SKIKO_EXPORT void org_jetbrains_skia_Bitmap__1nGetImageInfo
SkBitmap* instance = reinterpret_cast<SkBitmap*>(ptr);
SkImageInfo imageInfo = instance->info();
imageInfoResult[0] = instance->width();
imageInfoResult[1] = instance->height();
imageInfoResult[2] = static_cast<int>(imageInfo.colorType());
imageInfoResult[3] = static_cast<int>(imageInfo.alphaType());
colorSpacePtrsArray[0] = imageInfo.refColorSpace().release();
skija::ImageInfo::writeImageInfoForInterop(imageInfo, imageInfoResult, colorSpacePtrsArray);
}
#if 0
......
......@@ -8,25 +8,16 @@
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeRaster
(KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr, KByte* bytesArr, KNativePointer rowBytes) {
TODO("implement org_jetbrains_skia_Image__1nMakeRaster");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeRaster
(KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr, KByte* bytesArr, KNativePointer rowBytes) {
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>((colorSpacePtr));
(KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr, KByte* bytesArr, KInt rowBytes) {
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(colorSpacePtr);
SkImageInfo imageInfo = SkImageInfo::Make(width,
height,
static_cast<SkColorType>(colorType),
static_cast<SkAlphaType>(alphaType),
sk_ref_sp<SkColorSpace>(colorSpace));
void* bytes = env->GetPrimitiveArrayCritical(bytesArr, 0);
sk_sp<SkImage> image = SkImage::MakeRasterCopy(SkPixmap(imageInfo, bytes, rowBytes));
env->ReleasePrimitiveArrayCritical(bytesArr, bytes, 0);
sk_sp<SkImage> image = SkImage::MakeRasterCopy(SkPixmap(imageInfo, bytesArr, rowBytes));
return reinterpret_cast<KNativePointer>(image.release());
}
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeRasterData
......@@ -58,38 +49,18 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeFromPixmap
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeFromEncoded
(KByte* encodedArray) {
TODO("implement org_jetbrains_skia_Image__1nMakeFromEncoded");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeFromEncoded
(KByte* encodedArray) {
jsize encodedLen = env->GetArrayLength(encodedArray);
KByte* encoded = env->GetByteArrayElements(encodedArray, 0);
sk_sp<SkData> encodedData = SkData::MakeWithCopy(encoded, encodedLen);
env->ReleaseByteArrayElements(encodedArray, encoded, 0);
(KByte* encodedArray, KInt encodedLen) {
sk_sp<SkData> encodedData = SkData::MakeWithCopy(encodedArray, encodedLen);
sk_sp<SkImage> image = SkImage::MakeFromEncoded(encodedData);
return reinterpret_cast<KNativePointer>(image.release());
}
#endif
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Image__1nGetImageInfo
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_Image__1nGetImageInfo");
SKIKO_EXPORT void org_jetbrains_skia_Image__1nGetImageInfo
(KNativePointer ptr, KInt* imageInfoResult, KNativePointer* colorSpacePtrsArray) {
SkImage* instance = reinterpret_cast<SkImage*>((ptr));
SkImageInfo imageInfo = instance->imageInfo();
skija::ImageInfo::writeImageInfoForInterop(imageInfo, imageInfoResult, colorSpacePtrsArray);
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Image__1nGetImageInfo
(KNativePointer ptr) {
SkImage* instance = reinterpret_cast<SkImage*>((ptr));
return skija::ImageInfo::toJava(env, instance->imageInfo());
}
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nEncodeToData
......@@ -101,19 +72,17 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nEncodeToData
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeShader
(KNativePointer ptr, KInt tmx, KInt tmy, KNativePointer sampling, KFloat* localMatrixArr) {
TODO("implement org_jetbrains_skia_Image__1nMakeShader");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Image__1nMakeShader
(KNativePointer ptr, KInt tmx, KInt tmy, KNativePointer sampling, KFloat* localMatrixArr) {
SkImage* instance = reinterpret_cast<SkImage*>((ptr));
std::unique_ptr<SkMatrix> localMatrix = skMatrix(env, localMatrixArr);
sk_sp<SkShader> shader = instance->makeShader(static_cast<SkTileMode>(tmx), static_cast<SkTileMode>(tmy), skija::SamplingMode::unpack(sampling), localMatrix.get());
(KNativePointer ptr, KInt tmx, KInt tmy, KLong samplingMode, KFloat* localMatrixArr) {
SkImage* instance = reinterpret_cast<SkImage*>(ptr);
std::unique_ptr<SkMatrix> localMatrix = skMatrix(localMatrixArr);
sk_sp<SkShader> shader = instance->makeShader(
static_cast<SkTileMode>(tmx),
static_cast<SkTileMode>(tmy),
skija::SamplingMode::unpack(samplingMode),
localMatrix.get()
);
return reinterpret_cast<KNativePointer>(shader.release());
}
#endif
......@@ -121,8 +90,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Image__1nPeekPixels
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_Image__1nPeekPixels");
}
#if 0
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Image__1nPeekPixels
(KNativePointer ptr) {
SkImage* instance = reinterpret_cast<SkImage*>((ptr));
......
......@@ -15,8 +15,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRasterDirect
{
TODO("implement org_jetbrains_skia_Surface__1nMakeRasterDirect");
}
#if 0
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRasterDirect
(KInteropPointer __Kinstance,
KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr,
......@@ -48,8 +48,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRasterDirectWithPi
{
TODO("implement org_jetbrains_skia_Surface__1nMakeRasterDirectWithPixmap");
}
#if 0
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRasterDirectWithPixmap
(KInteropPointer __Kinstance,
KNativePointer pixmapPtr, KInteropPointer surfacePropsObj)
......@@ -72,8 +72,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRaster
{
TODO("implement org_jetbrains_skia_Surface__1nMakeRaster");
}
#if 0
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRaster
(KInteropPointer __Kinstance,
KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr,
......@@ -138,8 +138,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeFromMTKView
(KNativePointer contextPtr, KNativePointer mtkViewPtr, KInt surfaceOrigin, KInt sampleCount, KInt colorType, KNativePointer colorSpacePtr, KInteropPointer surfacePropsObj) {
TODO("implement org_jetbrains_skia_Surface__1nMakeFromMTKView");
}
#if 0
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeFromMTKView
(KNativePointer contextPtr, KNativePointer mtkViewPtr, KInt surfaceOrigin, KInt sampleCount, KInt colorType, KNativePointer colorSpacePtr, KInteropPointer surfacePropsObj) {
GrDirectContext* context = reinterpret_cast<GrDirectContext*>((contextPtr));
......@@ -172,8 +172,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRenderTarget
{
TODO("implement org_jetbrains_skia_Surface__1nMakeRenderTarget");
}
#if 0
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeRenderTarget
(KNativePointer contextPtr, KBoolean budgeted,
KInt width, KInt height, KInt colorType, KInt alphaType, KNativePointer colorSpacePtr,
......@@ -290,24 +290,12 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Surface__1nUnique
}
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Surface__1nGetImageInfo
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_Surface__1nGetImageInfo");
SKIKO_EXPORT void org_jetbrains_skia_Surface__1nGetImageInfo
(KNativePointer ptr, KInt* imageInfoResult, KNativePointer* colorSpacePtrsArray) {
SkSurface* surface = reinterpret_cast<SkSurface*>((ptr));
SkImageInfo imageInfo = surface->imageInfo();
skija::ImageInfo::writeImageInfoForInterop(imageInfo, imageInfoResult, colorSpacePtrsArray);
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Surface__1nGetImageInfo
(KNativePointer ptr) {
SkSurface* surface = reinterpret_cast<SkSurface*>((ptr));
const SkImageInfo& info = surface->imageInfo();
return env->NewObject(skija::ImageInfo::cls, skija::ImageInfo::ctor,
info.width(),
info.height(),
static_cast<KInt>(info.colorType()),
static_cast<KInt>(info.alphaType()),
reinterpret_cast<KNativePointer>(info.refColorSpace().release()));
}
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Surface__1nMakeSurface
......
......@@ -70,22 +70,10 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
override val imageInfo: ImageInfo
get() = try {
if (_imageInfo == null) {
Stats.onNativeCall()
var colorSpacePtr: NativePointer? = null
_imageInfo = withResult(IntArray(4)) { intArrayPointer ->
colorSpacePtr = withResult(NativePointerArray(1)) { nativePointerArrayPtr ->
_nGetImageInfo(_ptr, intArrayPointer, nativePointerArrayPtr)
}[0]
}.let {
ImageInfo(
width = it[0],
height = it[1],
colorType = it[2],
alphaType = it[3],
colorSpace = colorSpacePtr!!
)
}
_imageInfo = ImageInfo.createUsing(
_ptr = _ptr,
_nGetImageInfo = ::_nGetImageInfo
)
}
_imageInfo!!
} finally {
......
......@@ -26,7 +26,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
*
* @see [https://fiddle.skia.org/c/@Image_MakeRasterCopy](https://fiddle.skia.org/c/@Image_MakeRasterCopy)
*/
fun makeRaster(imageInfo: ImageInfo, bytes: ByteArray, rowBytes: NativePointer): Image {
fun makeRaster(imageInfo: ImageInfo, bytes: ByteArray, rowBytes: Int): Image {
return try {
Stats.onNativeCall()
val ptr = interopScope {
......@@ -66,7 +66,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
* @param rowBytes how many bytes in a row
* @return Image
*/
fun makeRaster(imageInfo: ImageInfo, data: Data, rowBytes: NativePointer): Image {
fun makeRaster(imageInfo: ImageInfo, data: Data, rowBytes: Int): Image {
return try {
Stats.onNativeCall()
val ptr = _nMakeRasterData(
......@@ -134,7 +134,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
fun makeFromEncoded(bytes: ByteArray?): Image {
Stats.onNativeCall()
val ptr = interopScope {
_nMakeFromEncoded(toInterop(bytes))
_nMakeFromEncoded(toInterop(bytes), bytes?.size ?: 0)
}
require(ptr != NullPointer) { "Failed to Image::makeFromEncoded" }
return Image(ptr)
......@@ -158,8 +158,10 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
if (_imageInfo == null) {
commonSynchronized(this) {
if (_imageInfo == null) {
Stats.onNativeCall()
_imageInfo = Image_nGetImageInfo(_ptr)
_imageInfo = ImageInfo.createUsing(
_ptr = _ptr,
_nGetImageInfo = ::Image_nGetImageInfo
)
}
}
}
......@@ -368,7 +370,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
}
@ExternalSymbolName("org_jetbrains_skia_Image__1nGetImageInfo")
private external fun Image_nGetImageInfo(ptr: NativePointer): ImageInfo?
private external fun Image_nGetImageInfo(ptr: NativePointer, imageInfo: InteropPointer, colorSpacePtrs: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Image__1nMakeShader")
private external fun Image_nMakeShader(ptr: NativePointer, tmx: Int, tmy: Int, samplingMode: Long, localMatrix: InteropPointer): NativePointer
......@@ -384,7 +386,7 @@ private external fun _nMakeRaster(
alphaType: Int,
colorSpacePtr: NativePointer,
pixels: InteropPointer,
rowBytes: NativePointer
rowBytes: Int
): NativePointer
......@@ -396,7 +398,7 @@ private external fun _nMakeRasterData(
alphaType: Int,
colorSpacePtr: NativePointer,
dataPtr: NativePointer,
rowBytes: NativePointer
rowBytes: Int
): NativePointer
......@@ -407,7 +409,7 @@ private external fun _nMakeFromBitmap(bitmapPtr: NativePointer): NativePointer
private external fun _nMakeFromPixmap(pixmapPtr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Image__1nMakeFromEncoded")
private external fun _nMakeFromEncoded(bytes: InteropPointer): NativePointer
private external fun _nMakeFromEncoded(bytes: InteropPointer, encodedLength: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Image__1nEncodeToData")
private external fun _nEncodeToData(ptr: NativePointer, format: Int, quality: Int): NativePointer
......
......@@ -2,6 +2,10 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.NativePointerArray
import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.withResult
/**
*
......@@ -279,5 +283,26 @@ class ImageInfo(val colorInfo: ColorInfo, val width: Int, val height: Int) {
fun makeUnknown(width: Int, height: Int): ImageInfo {
return ImageInfo(ColorInfo(ColorType.UNKNOWN, ColorAlphaType.UNKNOWN, null), width, height)
}
fun createUsing(
_ptr: NativePointer,
_nGetImageInfo: (_ptr: NativePointer, intArrayPointer: InteropPointer, nativePointerArrayPtr: InteropPointer) -> Unit
): ImageInfo {
Stats.onNativeCall()
var colorSpacePtr: NativePointer? = null
return withResult(IntArray(4)) { intArrayPointer ->
colorSpacePtr = withResult(NativePointerArray(1)) { nativePointerArrayPtr ->
_nGetImageInfo(_ptr, intArrayPointer, nativePointerArrayPtr)
}[0]
}.let {
ImageInfo(
width = it[0],
height = it[1],
colorType = it[2],
alphaType = it[3],
colorSpace = colorSpacePtr!!
)
}
}
}
}
package org.jetbrains.skia
import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.RefCnt
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr
class Surface : RefCnt {
companion object {
......@@ -573,8 +569,10 @@ class Surface : RefCnt {
*/
val imageInfo: ImageInfo
get() = try {
Stats.onNativeCall()
Surface_nGetImageInfo(_ptr)
ImageInfo.createUsing(
_ptr = _ptr,
_nGetImageInfo = ::Surface_nGetImageInfo
)
} finally {
reachabilityBarrier(this)
}
......@@ -994,7 +992,7 @@ private external fun Surface_nGetWidth(ptr: NativePointer): Int
private external fun Surface_nGetHeight(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_Surface__1nGetImageInfo")
private external fun Surface_nGetImageInfo(ptr: NativePointer): ImageInfo
private external fun Surface_nGetImageInfo(ptr: NativePointer, imageInfo: InteropPointer, colorSpacePtrs: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Surface__1nReadPixels")
private external fun Surface_nReadPixels(ptr: NativePointer, bitmapPtr: NativePointer, srcX: Int, srcY: Int): Boolean
......
package org.jetbrains.skia
import org.jetbrains.skia.impl.use
import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
class ImageTest {
@Test
fun imageTest() {
imageUnderTest { image ->
assertEquals(100, image.width)
assertEquals(100, image.height)
assertTrue(image.encodeToData()?.bytes!!.isNotEmpty())
assertTrue(image.encodeToData(EncodedImageFormat.JPEG)?.bytes!!.isNotEmpty())
assertTrue(image.encodeToData(EncodedImageFormat.JPEG, 50)?.bytes!!.isNotEmpty())
assertTrue(image.encodeToData(EncodedImageFormat.WEBP)?.bytes!!.isNotEmpty())
assertTrue(image.encodeToData(EncodedImageFormat.WEBP, 50)?.bytes!!.isNotEmpty())
}
}
@Test
fun canGetImageInfo() = runTest {
imageUnderTest { image ->
val info = image.imageInfo
assertEquals(100, image.width)
assertEquals(100, image.height)
}
}
@Test
fun canMakeFromEncodedBytes() = runTest {
val encodedBytes = imageUnderTest { image ->
image.encodeToData()?.bytes!!
}
val image = Image.makeFromEncoded(encodedBytes)
assertEquals(100, image.width)
assertEquals(100, image.height)
}
@Test
fun canMakeShader() = runTest {
val shader = imageUnderTest { image ->
image.makeShader(Matrix33.makeRotate(45f))
}
}
@Test
fun canMakeRaster() = runTest {
// source: https://fiddle.skia.org/c/@Image_MakeRasterCopy
val bytes = intArrayOf(
0xCA, 0xDA, 0xCA, 0xC9, 0xA3,
0xAC, 0xA8, 0x89, 0xA7, 0x87,
0x9B, 0xB5, 0xE5, 0x95, 0x46,
0x90, 0x81, 0xC5, 0x71, 0x33,
0x75, 0x55, 0x44, 0x40, 0x30
).map { it.toByte() }.toByteArray()
val imageInfo = ImageInfo(
width = 5, height = 5,
colorType = ColorType.GRAY_8,
alphaType = ColorAlphaType.OPAQUE
)
val image = Image.makeRaster(imageInfo, bytes, 5)
}
private fun <T> imageUnderTest(block: (Image) -> T): T {
return Surface.makeRasterN32Premul(100, 100).use { surface ->
val paint = Paint()
paint.color = -0x10000
Path().moveTo(20f, 80f)
.lineTo(50f, 20f)
.lineTo(80f, 80f)
.closePath()
.use { path ->
val canvas = surface.canvas
canvas.drawPath(path, paint)
surface.makeImageSnapshot().use { image ->
block(image)
}
}
}
}
}
package org.jetbrains.skiko
package org.jetbrains.skia
import org.jetbrains.skia.Bitmap
import org.jetbrains.skia.ContentChangeMode
import org.jetbrains.skia.IRect
import org.jetbrains.skia.ImageInfo
import org.jetbrains.skia.Surface
import org.jetbrains.skia.impl.use
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
......@@ -12,6 +8,7 @@ import kotlin.test.assertNotEquals
import kotlin.test.assertTrue
class SurfaceTest {
@Test
fun surfaceTest() {
assertFailsWith<IllegalArgumentException> {
......@@ -60,4 +57,4 @@ class SurfaceTest {
assertEquals(context, null)
}
}
}
\ No newline at end of file
}
......@@ -37,16 +37,9 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_BitmapKt__1nGetImageIn
SkBitmap* instance = reinterpret_cast<SkBitmap*>(static_cast<uintptr_t>(ptr));
SkImageInfo imageInfo = instance->info();
jint *result_int = env->GetIntArrayElements(imageInfoResult, NULL);
result_int[0] = instance->width();
result_int[1] = instance->height();
result_int[2] = static_cast<int>(imageInfo.colorType());
result_int[3] = static_cast<int>(imageInfo.alphaType());
env->ReleaseIntArrayElements(imageInfoResult, result_int, 0);
jlong *result_long = env->GetLongArrayElements(colorSpaceResultPtr, NULL);
result_long[0] = reinterpret_cast<jlong>(imageInfo.refColorSpace().release());
env->ReleaseLongArrayElements(colorSpaceResultPtr, result_long, 0);
skija::ImageInfo::writeImageInfoForInterop(
env, imageInfo, imageInfoResult, colorSpaceResultPtr
);
}
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_BitmapKt__1nGetRowBytesAsPixels
......
......@@ -5,7 +5,7 @@
#include "interop.hh"
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeRaster
(JNIEnv* env, jclass jclass, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jbyteArray bytesArr, jlong rowBytes) {
(JNIEnv* env, jclass jclass, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jbyteArray bytesArr, jint rowBytes) {
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(static_cast<uintptr_t>(colorSpacePtr));
SkImageInfo imageInfo = SkImageInfo::Make(width,
height,
......@@ -19,7 +19,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeRaster
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeRasterData
(JNIEnv* env, jclass jclass, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jlong dataPtr, jlong rowBytes) {
(JNIEnv* env, jclass jclass, jint width, jint height, jint colorType, jint alphaType, jlong colorSpacePtr, jlong dataPtr, jint rowBytes) {
SkColorSpace* colorSpace = reinterpret_cast<SkColorSpace*>(static_cast<uintptr_t>(colorSpacePtr));
SkImageInfo imageInfo = SkImageInfo::Make(width,
height,
......@@ -46,8 +46,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeFromPi
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeFromEncoded
(JNIEnv* env, jclass jclass, jbyteArray encodedArray) {
jsize encodedLen = env->GetArrayLength(encodedArray);
(JNIEnv* env, jclass jclass, jbyteArray encodedArray, jint encodedLen) {
jbyte* encoded = env->GetByteArrayElements(encodedArray, 0);
sk_sp<SkData> encodedData = SkData::MakeWithCopy(encoded, encodedLen);
env->ReleaseByteArrayElements(encodedArray, encoded, 0);
......@@ -57,10 +56,14 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nMakeFromEn
return reinterpret_cast<jlong>(image.release());
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_ImageKt_Image_1nGetImageInfo
(JNIEnv* env, jclass jclass, jlong ptr) {
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_ImageKt_Image_1nGetImageInfo
(JNIEnv* env, jclass jclass, jlong ptr, jintArray imageInfoResult, jlongArray colorSpaceResultPtr) {
SkImage* instance = reinterpret_cast<SkImage*>(static_cast<uintptr_t>(ptr));
return skija::ImageInfo::toJava(env, instance->imageInfo());
SkImageInfo imageInfo = instance->imageInfo();
skija::ImageInfo::writeImageInfoForInterop(
env, imageInfo, imageInfoResult, colorSpaceResultPtr
);
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_ImageKt__1nEncodeToData
......
......@@ -224,16 +224,14 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_SurfaceKt__1nUniqu
return surface->unique();
}
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_SurfaceKt_Surface_1nGetImageInfo
(JNIEnv* env, jclass jclass, jlong ptr) {
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_SurfaceKt_Surface_1nGetImageInfo
(JNIEnv* env, jclass jclass, jlong ptr, jintArray imageInfoResult, jlongArray colorSpaceResultPtr) {
SkSurface* surface = reinterpret_cast<SkSurface*>(static_cast<uintptr_t>(ptr));
const SkImageInfo& info = surface->imageInfo();
return env->NewObject(skija::ImageInfo::cls, skija::ImageInfo::ctor,
info.width(),
info.height(),
static_cast<jint>(info.colorType()),
static_cast<jint>(info.alphaType()),
reinterpret_cast<jlong>(info.refColorSpace().release()));
SkImageInfo imageInfo = surface->imageInfo();
skija::ImageInfo::writeImageInfoForInterop(
env, imageInfo, imageInfoResult, colorSpaceResultPtr
);
}
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_SurfaceKt__1nMakeSurface
......@@ -281,4 +279,4 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_SurfaceKt__1nGetRecor
(JNIEnv* env, jclass jclass, jlong ptr) {
SkSurface* surface = reinterpret_cast<SkSurface*>(static_cast<uintptr_t>(ptr));
return reinterpret_cast<jlong>(surface->recordingContext());
}
\ No newline at end of file
}
......@@ -298,7 +298,7 @@ namespace skija {
namespace FontMgr {
jclass cls;
void onLoad(JNIEnv* env) {
jclass local = env->FindClass("org/jetbrains/skia/FontMgr");
cls = static_cast<jclass>(env->NewGlobalRef(local));
......@@ -326,7 +326,7 @@ namespace skija {
jfieldID value;
void onLoad(JNIEnv* env) {
jclass local = env->FindClass("org/jetbrains/skia/FontVariation");
jclass local = env->FindClass("org/jetbrains/skia/FontVariation");
cls = static_cast<jclass>(env->NewGlobalRef(local));
ctor = env->GetMethodID(cls, "<init>", "(IF)V");
tag = env->GetFieldID(cls, "_tag", "I");
......@@ -358,7 +358,7 @@ namespace skija {
jmethodID ctor;
void onLoad(JNIEnv* env) {
jclass local = env->FindClass("org/jetbrains/skia/ImageInfo");
jclass local = env->FindClass("org/jetbrains/skia/ImageInfo");
cls = static_cast<jclass>(env->NewGlobalRef(local));
ctor = env->GetMethodID(cls, "<init>", "(IIIIJ)V");
}
......@@ -375,6 +375,19 @@ namespace skija {
static_cast<jint>(info.alphaType()),
reinterpret_cast<jlong>(info.refColorSpace().release()));
}
void writeImageInfoForInterop(JNIEnv* env, SkImageInfo imageInfo, jintArray imageInfoResult, jlongArray colorSpaceResultPtr) {
jint *result_int = env->GetIntArrayElements(imageInfoResult, NULL);
result_int[0] = imageInfo.width();
result_int[1] = imageInfo.height();
result_int[2] = static_cast<int>(imageInfo.colorType());
result_int[3] = static_cast<int>(imageInfo.alphaType());
env->ReleaseIntArrayElements(imageInfoResult, result_int, 0);
jlong *result_long = env->GetLongArrayElements(colorSpaceResultPtr, NULL);
result_long[0] = reinterpret_cast<jlong>(imageInfo.refColorSpace().release());
env->ReleaseLongArrayElements(colorSpaceResultPtr, result_long, 0);
}
}
namespace IPoint {
......@@ -406,7 +419,7 @@ namespace skija {
jfieldID left;
jfieldID top;
jfieldID right;
jfieldID bottom;
jfieldID bottom;
void onLoad(JNIEnv* env) {
jclass local = env->FindClass("org/jetbrains/skia/IRect");
......@@ -432,9 +445,9 @@ namespace skija {
return std::unique_ptr<SkIRect>(nullptr);
else {
return std::unique_ptr<SkIRect>(new SkIRect{
env->GetIntField(obj, left),
env->GetIntField(obj, top),
env->GetIntField(obj, right),
env->GetIntField(obj, left),
env->GetIntField(obj, top),
env->GetIntField(obj, right),
env->GetIntField(obj, bottom)
});
}
......@@ -577,9 +590,9 @@ namespace skija {
return std::unique_ptr<SkRect>(nullptr);
else {
SkRect* rect = new SkRect();
rect->setLTRB(env->GetFloatField(rectObj, left),
env->GetFloatField(rectObj, top),
env->GetFloatField(rectObj, right),
rect->setLTRB(env->GetFloatField(rectObj, left),
env->GetFloatField(rectObj, top),
env->GetFloatField(rectObj, right),
env->GetFloatField(rectObj, bottom));
if (java::lang::Throwable::exceptionThrown(env))
return std::unique_ptr<SkRect>(nullptr);
......@@ -776,7 +789,7 @@ namespace skija {
RRect::onLoad(env);
RSXform::onLoad(env);
SurfaceProps::onLoad(env);
impl::Native::onLoad(env);
}
......@@ -828,17 +841,17 @@ std::unique_ptr<SkM44> skM44(JNIEnv* env, jfloatArray matrixArray) {
//
// Normal UTF-8:
//
// 1 U+ 0.. 7F 7 0xxxxxxx
// 2 U+ 80.. 7FF 11 110xxxxx 10xxxxxx
// 3 U+ 800.. FFFF 16 1110xxxx 10xxxxxx 10xxxxxx
// 4 U+ 10000..10FFFF 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// 1 U+ 0.. 7F 7 0xxxxxxx
// 2 U+ 80.. 7FF 11 110xxxxx 10xxxxxx
// 3 U+ 800.. FFFF 16 1110xxxx 10xxxxxx 10xxxxxx
// 4 U+ 10000..10FFFF 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
//
// Modified UTF-8 (Java):
//
// 1 U+ 1.. 7F 7 0xxxxxxx
// 2 U+ 0 11000000 10000000
// 2 U+ 80.. 7FF 11 110xxxxx 10xxxxxx
// 3 U+ 800.. FFFF 16 1110xxxx 10xxxxxx 10xxxxxx
// 1 U+ 1.. 7F 7 0xxxxxxx
// 2 U+ 0 11000000 10000000
// 2 U+ 80.. 7FF 11 110xxxxx 10xxxxxx
// 3 U+ 800.. FFFF 16 1110xxxx 10xxxxxx 10xxxxxx
// 6 U+ 10000..10FFFF 20 11101101 1010xxxx 10xxxxxx 11101101 1011xxxx 10xxxxxx (+ 0x10000)
size_t utfToUtf8(unsigned char *data, size_t len) {
......@@ -891,8 +904,8 @@ size_t utfToUtf8(unsigned char *data, size_t len) {
SkASSERT((byte5 & 0b11110000) == 0b10110000);
SkASSERT((byte6 & 0b11000000) == 0b10000000);
uint32_t codepoint = (((byte2 & 0b00001111) << 16) |
((byte3 & 0b00111111) << 10) |
((byte5 & 0b00001111) << 6) |
((byte3 & 0b00111111) << 10) |
((byte5 & 0b00001111) << 6) |
(byte6 & 0b00111111))
+ 0x10000;
// Four-byte UTF-8
......
......@@ -185,6 +185,7 @@ namespace skija {
void onLoad(JNIEnv* env);
void onUnload(JNIEnv* env);
jobject toJava(JNIEnv* env, const SkImageInfo& imageInfo);
void writeImageInfoForInterop(JNIEnv* env, SkImageInfo imageInfo, jintArray imageInfoResult, jlongArray colorSpaceResultPtr);
}
namespace IPoint {
......@@ -375,4 +376,4 @@ static inline jint rawBits(jfloat f) {
} u;
u.f = f;
return u.i;
}
\ No newline at end of file
}
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