Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
skiko
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liuqiang
skiko
Commits
0745140f
Unverified
Commit
0745140f
authored
Oct 25, 2021
by
Aleksandr Veselov
Committed by
GitHub
Oct 25, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement native Bitmap::peekPixels, add test (#306)
parent
8a392951
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
40 additions
and
38 deletions
+40
-38
Bitmap.kt
skiko/src/commonMain/kotlin/org/jetbrains/skia/Bitmap.kt
+10
-6
BitmapTest.kt
skiko/src/commonTest/kotlin/org/jetbrains/skia/BitmapTest.kt
+14
-0
Bitmap.cc
skiko/src/jvmMain/cpp/common/Bitmap.cc
+8
-6
Convertors.kt
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/Convertors.kt
+0
-25
Bitmap.cc
skiko/src/nativeJsMain/cpp/Bitmap.cc
+8
-1
No files found.
skiko/src/commonMain/kotlin/org/jetbrains/skia/Bitmap.kt
View file @
0745140f
...
@@ -975,17 +975,21 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
...
@@ -975,17 +975,21 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
}
}
/**
/**
* If pixel address is available, return ByteBuffer wrapping it.
* Create a pixmap and copy buffer contents into it
* If pixel address is not available, return null.
*
*
* @return
ByteBuffer with direct access to
pixels, or null
* @return
Pixamp with copied
pixels, or null
*
*
* @see [https://fiddle.skia.org/c/@Bitmap_peekPixels](https://fiddle.skia.org/c/@Bitmap_peekPixels)
* @see [https://fiddle.skia.org/c/@Bitmap_peekPixels](https://fiddle.skia.org/c/@Bitmap_peekPixels)
*/
*/
fun
peekPixels
():
ByteBuffer
?
{
fun
peekPixels
():
Pixmap
?
{
return
try
{
return
try
{
Stats
.
onNativeCall
()
Stats
.
onNativeCall
()
_nPeekPixels
(
_ptr
)
val
res
=
_nPeekPixels
(
_ptr
)
if
(
res
==
NullPointer
)
{
null
}
else
{
Pixmap
(
res
,
true
)
}
}
finally
{
}
finally
{
reachabilityBarrier
(
this
)
reachabilityBarrier
(
this
)
}
}
...
@@ -1189,7 +1193,7 @@ private external fun _nReadPixels(
...
@@ -1189,7 +1193,7 @@ private external fun _nReadPixels(
private
external
fun
_nExtractAlpha
(
ptr
:
NativePointer
,
dstPtr
:
NativePointer
,
paintPtr
:
NativePointer
,
iPointResultIntArray
:
InteropPointer
):
Boolean
private
external
fun
_nExtractAlpha
(
ptr
:
NativePointer
,
dstPtr
:
NativePointer
,
paintPtr
:
NativePointer
,
iPointResultIntArray
:
InteropPointer
):
Boolean
@ExternalSymbolName
(
"org_jetbrains_skia_Bitmap__1nPeekPixels"
)
@ExternalSymbolName
(
"org_jetbrains_skia_Bitmap__1nPeekPixels"
)
private
external
fun
_nPeekPixels
(
ptr
:
NativePointer
):
ByteBuffer
?
private
external
fun
_nPeekPixels
(
ptr
:
NativePointer
):
NativePointer
@ExternalSymbolName
(
"org_jetbrains_skia_Bitmap__1nMakeShader"
)
@ExternalSymbolName
(
"org_jetbrains_skia_Bitmap__1nMakeShader"
)
private
external
fun
_nMakeShader
(
ptr
:
NativePointer
,
tmx
:
Int
,
tmy
:
Int
,
samplingMode
:
Long
,
localMatrix
:
InteropPointer
):
NativePointer
private
external
fun
_nMakeShader
(
ptr
:
NativePointer
,
tmx
:
Int
,
tmy
:
Int
,
samplingMode
:
Long
,
localMatrix
:
InteropPointer
):
NativePointer
skiko/src/commonTest/kotlin/org/jetbrains/skia/BitmapTest.kt
View file @
0745140f
package
org.jetbrains.skia
package
org.jetbrains.skia
import
org.jetbrains.skiko.KotlinBackend
import
org.jetbrains.skiko.kotlinBackend
import
org.jetbrains.skiko.tests.runTest
import
org.jetbrains.skiko.tests.runTest
import
kotlin.test.*
import
kotlin.test.*
...
@@ -68,6 +70,18 @@ class BitmapTest {
...
@@ -68,6 +70,18 @@ class BitmapTest {
assertTrue
(
bitmap
.
rowBytes
>
0
)
assertTrue
(
bitmap
.
rowBytes
>
0
)
assertEquals
(
5
*
bitmap
.
rowBytes
,
result
.
size
)
assertEquals
(
5
*
bitmap
.
rowBytes
,
result
.
size
)
}
}
@Test
fun
canPeekPixels
()
=
runTest
{
val
bitmap
=
Bitmap
()
bitmap
.
allocPixels
(
ImageInfo
.
makeS32
(
10
,
10
,
ColorAlphaType
.
OPAQUE
))
val
result
=
bitmap
.
peekPixels
()
!!
assertEquals
(
10
*
4
,
result
.
rowBytes
)
assertEquals
(
10
*
10
*
4
,
result
.
computeByteSize
())
if
(
kotlinBackend
==
KotlinBackend
.
JVM
)
{
assertEquals
(
bitmap
.
imageInfo
,
result
.
info
)
}
}
@Test
//fixed bug https://github.com/JetBrains/skiko/pull/266
@Test
//fixed bug https://github.com/JetBrains/skiko/pull/266
fun
canReadPixelsWithGivenRowBytes
()
=
runTest
{
fun
canReadPixelsWithGivenRowBytes
()
=
runTest
{
...
...
skiko/src/jvmMain/cpp/common/Bitmap.cc
View file @
0745140f
...
@@ -259,14 +259,16 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nExtrac
...
@@ -259,14 +259,16 @@ extern "C" JNIEXPORT jboolean JNICALL Java_org_jetbrains_skia_BitmapKt__1nExtrac
return
result
;
return
result
;
}
}
extern
"C"
JNIEXPORT
j
object
JNICALL
Java_org_jetbrains_skia_BitmapKt__1nPeekPixels
extern
"C"
JNIEXPORT
j
long
JNICALL
Java_org_jetbrains_skia_BitmapKt__1nPeekPixels
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
)
{
(
JNIEnv
*
env
,
jclass
jclass
,
jlong
ptr
)
{
SkBitmap
*
instance
=
reinterpret_cast
<
SkBitmap
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
SkBitmap
*
instance
=
reinterpret_cast
<
SkBitmap
*>
(
static_cast
<
uintptr_t
>
(
ptr
));
SkPixmap
pixmap
;
SkPixmap
*
pixmap
=
new
SkPixmap
();
if
(
instance
->
peekPixels
(
&
pixmap
))
if
(
instance
->
peekPixels
(
pixmap
))
return
env
->
NewDirectByteBuffer
(
pixmap
.
writable_addr
(),
pixmap
.
rowBytes
()
*
pixmap
.
height
());
return
ptrToJlong
(
pixmap
);
else
else
{
return
nullptr
;
delete
pixmap
;
return
0
;
}
}
}
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skia_BitmapKt__1nMakeShader
extern
"C"
JNIEXPORT
jlong
JNICALL
Java_org_jetbrains_skia_BitmapKt__1nMakeShader
...
...
skiko/src/jvmMain/kotlin/org/jetbrains/skiko/Convertors.kt
View file @
0745140f
...
@@ -19,31 +19,6 @@ private class DirectDataBuffer(val backing: ByteBuffer): DataBuffer(TYPE_BYTE, b
...
@@ -19,31 +19,6 @@ private class DirectDataBuffer(val backing: ByteBuffer): DataBuffer(TYPE_BYTE, b
}
}
}
}
fun
Bitmap
.
toBufferedImage
():
BufferedImage
{
val
pixels
=
this
.
peekPixels
()
val
order
=
when
(
this
.
colorInfo
.
colorType
)
{
ColorType
.
RGB_888X
->
intArrayOf
(
0
,
1
,
2
,
3
)
ColorType
.
BGRA_8888
->
intArrayOf
(
2
,
1
,
0
,
3
)
else
->
throw
UnsupportedOperationException
(
"unsupported color type ${this.colorInfo.colorType}"
)
}
val
raster
=
Raster
.
createInterleavedRaster
(
DirectDataBuffer
(
pixels
!!
),
this
.
width
,
this
.
height
,
this
.
width
*
4
,
4
,
order
,
null
)
val
colorModel
=
ComponentColorModel
(
ColorSpace
.
getInstance
(
ColorSpace
.
CS_sRGB
),
true
,
false
,
Transparency
.
TRANSLUCENT
,
DataBuffer
.
TYPE_BYTE
)
return
BufferedImage
(
colorModel
,
raster
!!
,
false
,
null
)
}
fun
BufferedImage
.
toBitmap
():
Bitmap
{
fun
BufferedImage
.
toBitmap
():
Bitmap
{
val
bytesPerPixel
=
4
val
bytesPerPixel
=
4
...
...
skiko/src/nativeJsMain/cpp/Bitmap.cc
View file @
0745140f
...
@@ -279,7 +279,14 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nExtractAlpha
...
@@ -279,7 +279,14 @@ SKIKO_EXPORT KBoolean org_jetbrains_skia_Bitmap__1nExtractAlpha
SKIKO_EXPORT
KInteropPointer
org_jetbrains_skia_Bitmap__1nPeekPixels
SKIKO_EXPORT
KInteropPointer
org_jetbrains_skia_Bitmap__1nPeekPixels
(
KNativePointer
ptr
)
{
(
KNativePointer
ptr
)
{
TODO
(
"implement org_jetbrains_skia_Bitmap__1nPeekPixels"
);
SkBitmap
*
instance
=
reinterpret_cast
<
SkBitmap
*>
(
ptr
);
SkPixmap
*
pixmap
=
new
SkPixmap
();
if
(
instance
->
peekPixels
(
pixmap
))
{
return
reinterpret_cast
<
KNativePointer
>
(
pixmap
);
}
else
{
delete
pixmap
;
return
nullptr
;
}
}
}
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Bitmap__1nMakeShader
SKIKO_EXPORT
KNativePointer
org_jetbrains_skia_Bitmap__1nMakeShader
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment