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