Unverified Commit a15632cd authored by Pavel's avatar Pavel Committed by GitHub

Fix shaper segfault (#633)

* `managedString` might be inlined and garbage collected before the beginning of JNI call

* add other missed `reachabilityBarrier`s
parent c62037f1
...@@ -70,11 +70,14 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -70,11 +70,14 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
*/ */
fun swap(other: Bitmap) { fun swap(other: Bitmap) {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nSwap(_ptr, getPtr(other)) _nSwap(_ptr, getPtr(other))
_imageInfo = null _imageInfo = null
} finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(other) reachabilityBarrier(other)
} }
}
override val imageInfo: ImageInfo override val imageInfo: ImageInfo
get() = try { get() = try {
...@@ -685,6 +688,7 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -685,6 +688,7 @@ class Bitmap internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(pixelRef) reachabilityBarrier(pixelRef)
} }
} }
......
...@@ -57,8 +57,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -57,8 +57,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
fun drawPoint(x: Float, y: Float, paint: Paint): Canvas { fun drawPoint(x: Float, y: Float, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawPoint(_ptr, x, y, getPtr(paint)) _nDrawPoint(_ptr, x, y, getPtr(paint))
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -118,10 +122,14 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -118,10 +122,14 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
*/ */
fun drawPoints(coords: FloatArray, paint: Paint): Canvas { fun drawPoints(coords: FloatArray, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawPoints(_ptr, 0 /* SkCanvas::PointMode::kPoints_PointMode */, coords.size, toInterop(coords), getPtr(paint)) _nDrawPoints(_ptr, 0 /* SkCanvas::PointMode::kPoints_PointMode */, coords.size, toInterop(coords), getPtr(paint))
} }
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -177,10 +185,14 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -177,10 +185,14 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
*/ */
fun drawLines(coords: FloatArray, paint: Paint): Canvas { fun drawLines(coords: FloatArray, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawPoints(_ptr, 1 /* SkCanvas::PointMode::kLines_PointMode */, coords.size, toInterop(coords),getPtr(paint)) _nDrawPoints(_ptr, 1 /* SkCanvas::PointMode::kLines_PointMode */, coords.size, toInterop(coords),getPtr(paint))
} }
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -234,17 +246,25 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -234,17 +246,25 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
*/ */
fun drawPolygon(coords: FloatArray, paint: Paint): Canvas { fun drawPolygon(coords: FloatArray, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawPoints(_ptr, 2 /* SkCanvas::PointMode::kPolygon_PointMode */, coords.size, toInterop(coords), getPtr(paint)) _nDrawPoints(_ptr, 2 /* SkCanvas::PointMode::kPolygon_PointMode */, coords.size, toInterop(coords), getPtr(paint))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawLine(x0: Float, y0: Float, x1: Float, y1: Float, paint: Paint): Canvas { fun drawLine(x0: Float, y0: Float, x1: Float, y1: Float, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawLine(_ptr, x0, y0, x1, y1, getPtr(paint)) _nDrawLine(_ptr, x0, y0, x1, y1, getPtr(paint))
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -259,43 +279,64 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -259,43 +279,64 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
paint: Paint paint: Paint
): Canvas { ): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawArc(_ptr, left, top, right, bottom, startAngle, sweepAngle, includeCenter, getPtr(paint)) _nDrawArc(_ptr, left, top, right, bottom, startAngle, sweepAngle, includeCenter, getPtr(paint))
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawRect(r: Rect, paint: Paint): Canvas { fun drawRect(r: Rect, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawRect(_ptr, r.left, r.top, r.right, r.bottom, getPtr(paint)) _nDrawRect(_ptr, r.left, r.top, r.right, r.bottom, getPtr(paint))
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawOval(r: Rect, paint: Paint): Canvas { fun drawOval(r: Rect, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawOval(_ptr, r.left, r.top, r.right, r.bottom, getPtr(paint)) _nDrawOval(_ptr, r.left, r.top, r.right, r.bottom, getPtr(paint))
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
fun drawCircle(x: Float, y: Float, radius: Float, paint: Paint): Canvas { fun drawCircle(x: Float, y: Float, radius: Float, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawOval(_ptr, x - radius, y - radius, x + radius, y + radius, getPtr(paint)) _nDrawOval(_ptr, x - radius, y - radius, x + radius, y + radius, getPtr(paint))
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
fun drawRRect(r: RRect, paint: Paint): Canvas { fun drawRRect(r: RRect, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawRRect(_ptr, r.left, r.top, r.right, r.bottom, toInterop(r.radii), r.radii.size, getPtr(paint)) _nDrawRRect(_ptr, r.left, r.top, r.right, r.bottom, toInterop(r.radii), r.radii.size, getPtr(paint))
} }
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
fun drawDRRect(outer: RRect, inner: RRect, paint: Paint): Canvas { fun drawDRRect(outer: RRect, inner: RRect, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawDRRect( _nDrawDRRect(
_ptr, _ptr,
...@@ -314,7 +355,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -314,7 +355,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -346,9 +390,13 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -346,9 +390,13 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
fun drawPath(path: Path, paint: Paint): Canvas { fun drawPath(path: Path, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawPath(_ptr, getPtr(path), getPtr(paint)) _nDrawPath(_ptr, getPtr(path), getPtr(paint))
} finally {
reachabilityBarrier(this)
reachabilityBarrier(path) reachabilityBarrier(path)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -417,6 +465,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -417,6 +465,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
strict: Boolean strict: Boolean
): Canvas { ): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawImageRect( _nDrawImageRect(
_ptr, _ptr,
getPtr(image), getPtr(image),
...@@ -433,13 +482,17 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -433,13 +482,17 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint), getPtr(paint),
strict strict
) )
} finally {
reachabilityBarrier(image) reachabilityBarrier(image)
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
fun drawImageNine(image: Image, center: IRect, dst: Rect, filterMode: FilterMode, paint: Paint?): Canvas { fun drawImageNine(image: Image, center: IRect, dst: Rect, filterMode: FilterMode, paint: Paint?): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawImageNine( _nDrawImageNine(
_ptr, _ptr,
getPtr(image), getPtr(image),
...@@ -454,34 +507,49 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -454,34 +507,49 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
filterMode.ordinal, filterMode.ordinal,
getPtr(paint) getPtr(paint)
) )
} finally {
reachabilityBarrier(this)
reachabilityBarrier(image) reachabilityBarrier(image)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawRegion(r: Region, paint: Paint): Canvas { fun drawRegion(r: Region, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawRegion(_ptr, getPtr(r), getPtr(paint)) _nDrawRegion(_ptr, getPtr(r), getPtr(paint))
} finally {
reachabilityBarrier(this)
reachabilityBarrier(r) reachabilityBarrier(r)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawString(s: String, x: Float, y: Float, font: Font?, paint: Paint): Canvas { fun drawString(s: String, x: Float, y: Float, font: Font?, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawString(_ptr, toInterop(s), x, y, getPtr(font), getPtr(paint)) _nDrawString(_ptr, toInterop(s), x, y, getPtr(font), getPtr(paint))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
fun drawTextBlob(blob: TextBlob, x: Float, y: Float, paint: Paint): Canvas { fun drawTextBlob(blob: TextBlob, x: Float, y: Float, paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawTextBlob(_ptr, getPtr(blob), x, y, getPtr(paint)) _nDrawTextBlob(_ptr, getPtr(blob), x, y, getPtr(paint))
} finally {
reachabilityBarrier(blob) reachabilityBarrier(blob)
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -492,8 +560,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -492,8 +560,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
fun drawPicture(picture: Picture, matrix: Matrix33? = null, paint: Paint? = null): Canvas { fun drawPicture(picture: Picture, matrix: Matrix33? = null, paint: Paint? = null): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawPicture(_ptr, getPtr(picture), toInterop(matrix?.mat), getPtr(paint)) _nDrawPicture(_ptr, getPtr(picture), toInterop(matrix?.mat), getPtr(paint))
}
} finally {
reachabilityBarrier(this)
reachabilityBarrier(picture) reachabilityBarrier(picture)
reachabilityBarrier(paint) reachabilityBarrier(paint)
} }
...@@ -535,6 +607,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -535,6 +607,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size } require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size }
require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size } require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size }
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawVertices( _nDrawVertices(
_ptr, _ptr,
...@@ -549,7 +622,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -549,7 +622,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -587,6 +663,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -587,6 +663,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size } require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size }
require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size } require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size }
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawVertices( _nDrawVertices(
_ptr, _ptr,
...@@ -601,7 +678,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -601,7 +678,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -639,6 +719,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -639,6 +719,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size } require(colors == null || colors.size == positions.size) { "Expected colors.length == positions.length, got: " + colors!!.size + " != " + positions.size }
require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size } require(texCoords == null || texCoords.size == positions.size) { "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size }
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawVertices( _nDrawVertices(
_ptr, _ptr,
...@@ -653,7 +734,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -653,7 +734,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -702,6 +786,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -702,6 +786,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
"Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size "Expected texCoords.length == positions.length, got: " + texCoords!!.size + " != " + positions.size
} }
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawVertices( _nDrawVertices(
_ptr, _ptr,
...@@ -716,7 +801,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -716,7 +801,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
}
return this return this
} }
...@@ -766,6 +854,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -766,6 +854,7 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
require(colors.size == 4) { "Expected colors.length == 4, got: " + colors.size } require(colors.size == 4) { "Expected colors.length == 4, got: " + colors.size }
require(texCoords == null || texCoords.size == 4) { "Expected texCoords.length == 4, got: " + texCoords!!.size } require(texCoords == null || texCoords.size == 4) { "Expected texCoords.length == 4, got: " + texCoords!!.size }
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawPatch( _nDrawPatch(
_ptr, _ptr,
...@@ -776,7 +865,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -776,7 +865,10 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
getPtr(paint) getPtr(paint)
) )
} }
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -837,23 +929,35 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -837,23 +929,35 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
*/ */
fun drawDrawable(drawable: Drawable, matrix: Matrix33?): Canvas { fun drawDrawable(drawable: Drawable, matrix: Matrix33?): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nDrawDrawable(_ptr, getPtr(drawable), toInterop(matrix?.mat)) _nDrawDrawable(_ptr, getPtr(drawable), toInterop(matrix?.mat))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(drawable) reachabilityBarrier(drawable)
}
return this return this
} }
fun clear(color: Int): Canvas { fun clear(color: Int): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nClear(_ptr, color) _nClear(_ptr, color)
} finally {
reachabilityBarrier(this)
}
return this return this
} }
fun drawPaint(paint: Paint): Canvas { fun drawPaint(paint: Paint): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nDrawPaint(_ptr, getPtr(paint)) _nDrawPaint(_ptr, getPtr(paint))
} finally {
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -939,8 +1043,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -939,8 +1043,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
fun clipPath(p: Path, mode: ClipMode, antiAlias: Boolean): Canvas { fun clipPath(p: Path, mode: ClipMode, antiAlias: Boolean): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nClipPath(_ptr, getPtr(p), mode.ordinal, antiAlias) _nClipPath(_ptr, getPtr(p), mode.ordinal, antiAlias)
} finally {
reachabilityBarrier(p) reachabilityBarrier(p)
reachabilityBarrier(this)
}
return this return this
} }
...@@ -958,8 +1066,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int ...@@ -958,8 +1066,12 @@ open class Canvas internal constructor(ptr: NativePointer, managed: Boolean, int
fun clipRegion(r: Region, mode: ClipMode): Canvas { fun clipRegion(r: Region, mode: ClipMode): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nClipRegion(_ptr, getPtr(r), mode.ordinal) _nClipRegion(_ptr, getPtr(r), mode.ordinal)
} finally {
reachabilityBarrier(r) reachabilityBarrier(r)
reachabilityBarrier(this)
}
return this return this
} }
......
...@@ -141,6 +141,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo ...@@ -141,6 +141,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(bitmap) reachabilityBarrier(bitmap)
} }
} }
...@@ -198,6 +199,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo ...@@ -198,6 +199,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(bitmap) reachabilityBarrier(bitmap)
} }
} }
...@@ -256,6 +258,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo ...@@ -256,6 +258,7 @@ class Codec internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHo
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(bitmap) reachabilityBarrier(bitmap)
} }
} }
......
...@@ -58,6 +58,7 @@ abstract class Drawable : Managed(Drawable_nMake(), _FinalizerHolder.PTR) { ...@@ -58,6 +58,7 @@ abstract class Drawable : Managed(Drawable_nMake(), _FinalizerHolder.PTR) {
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
......
...@@ -315,6 +315,7 @@ class Font : Managed { ...@@ -315,6 +315,7 @@ class Font : Managed {
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(typeface) reachabilityBarrier(typeface)
} }
} }
......
...@@ -110,8 +110,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf ...@@ -110,8 +110,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
fun makeFromBitmap(bitmap: Bitmap): Image { fun makeFromBitmap(bitmap: Bitmap): Image {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = val ptr = _nMakeFromBitmap(getPtr(bitmap))
_nMakeFromBitmap(getPtr(bitmap))
if (ptr == NullPointer) throw RuntimeException("Failed to Image::makeFromBitmap $bitmap") if (ptr == NullPointer) throw RuntimeException("Failed to Image::makeFromBitmap $bitmap")
Image(ptr) Image(ptr)
} finally { } finally {
...@@ -122,8 +121,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf ...@@ -122,8 +121,7 @@ class Image internal constructor(ptr: NativePointer) : RefCnt(ptr), IHasImageInf
fun makeFromPixmap(pixmap: Pixmap): Image { fun makeFromPixmap(pixmap: Pixmap): Image {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = val ptr = _nMakeFromPixmap(getPtr(pixmap))
_nMakeFromPixmap(getPtr(pixmap))
if (ptr == NullPointer) throw RuntimeException("Failed to Image::makeFromRaster $pixmap") if (ptr == NullPointer) throw RuntimeException("Failed to Image::makeFromRaster $pixmap")
Image(ptr) Image(ptr)
} finally { } finally {
......
...@@ -128,9 +128,7 @@ class ImageFilter internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -128,9 +128,7 @@ class ImageFilter internal constructor(ptr: NativePointer) : RefCnt(ptr) {
Stats.onNativeCall() Stats.onNativeCall()
ImageFilter( ImageFilter(
_nMakeCompose( _nMakeCompose(
getPtr( getPtr(outer), getPtr(inner)
outer
), getPtr(inner)
) )
) )
} finally { } finally {
......
...@@ -215,6 +215,7 @@ class Paint : Managed { ...@@ -215,6 +215,7 @@ class Paint : Managed {
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(colorSpace) reachabilityBarrier(colorSpace)
} }
} }
......
...@@ -7,7 +7,7 @@ import org.jetbrains.skia.impl.Library.Companion.staticLoad ...@@ -7,7 +7,7 @@ import org.jetbrains.skia.impl.Library.Companion.staticLoad
* A utility proxy base class for implementing draw/paint filters. * A utility proxy base class for implementing draw/paint filters.
*/ */
abstract class PaintFilterCanvas(private val canvas: Canvas, unrollDrawable: Boolean) : abstract class PaintFilterCanvas(private val canvas: Canvas, unrollDrawable: Boolean) :
Canvas(PaintFilterCanvas_nMake(getPtr(canvas), unrollDrawable), true, canvas) { Canvas(makePaintFilterCanvas(canvas, unrollDrawable), true, canvas) {
companion object { companion object {
init { init {
staticLoad() staticLoad()
...@@ -34,8 +34,19 @@ abstract class PaintFilterCanvas(private val canvas: Canvas, unrollDrawable: Boo ...@@ -34,8 +34,19 @@ abstract class PaintFilterCanvas(private val canvas: Canvas, unrollDrawable: Boo
*/ */
init { init {
Stats.onNativeCall() Stats.onNativeCall()
try {
doInit(_ptr) doInit(_ptr)
} finally {
reachabilityBarrier(this)
}
}
}
private fun makePaintFilterCanvas(canvas: Canvas, unrollDrawable: Boolean): NativePointer {
Stats.onNativeCall() Stats.onNativeCall()
return try {
PaintFilterCanvas_nMake(getPtr(canvas), unrollDrawable)
} finally {
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
......
...@@ -724,6 +724,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -724,6 +724,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
Path_nSwap(_ptr, getPtr(other)) Path_nSwap(_ptr, getPtr(other))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(other) reachabilityBarrier(other)
} }
} }
...@@ -1751,6 +1752,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1751,6 +1752,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(src) reachabilityBarrier(src)
} }
} }
...@@ -1794,6 +1796,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1794,6 +1796,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(src) reachabilityBarrier(src)
} }
} }
...@@ -1838,6 +1841,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1838,6 +1841,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(src) reachabilityBarrier(src)
} }
} }
...@@ -1857,6 +1861,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1857,6 +1861,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
_nReverseAddPath(_ptr, getPtr(src)) _nReverseAddPath(_ptr, getPtr(src))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(src) reachabilityBarrier(src)
} }
} }
...@@ -1884,6 +1889,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1884,6 +1889,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
_nOffset(_ptr, dx, dy, getPtr(dst)) _nOffset(_ptr, dx, dy, getPtr(dst))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(dst) reachabilityBarrier(dst)
} }
} }
...@@ -1946,6 +1952,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -1946,6 +1952,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(dst) reachabilityBarrier(dst)
} }
} }
......
...@@ -3,6 +3,20 @@ package org.jetbrains.skia ...@@ -3,6 +3,20 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.* import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
private fun makePath(
path: Path?,
forceClosed: Boolean,
resScale: Float
): NativePointer {
Stats.onNativeCall()
return try {
_nMakePath(getPtr(path), forceClosed, resScale)
} finally {
Stats.onNativeCall()
reachabilityBarrier(path)
}
}
class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object { companion object {
init { init {
...@@ -10,9 +24,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final ...@@ -10,9 +24,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final
} }
} }
constructor() : this(PathMeasure_nMake()) { constructor() : this(PathMeasure_nMake())
Stats.onNativeCall()
}
/** /**
* *
* Initialize the pathmeasure with the specified path. The parts of the path that are needed * Initialize the pathmeasure with the specified path. The parts of the path that are needed
...@@ -34,10 +46,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final ...@@ -34,10 +46,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final
path: Path?, path: Path?,
forceClosed: Boolean = false, forceClosed: Boolean = false,
resScale: Float = 1f resScale: Float = 1f
) : this(_nMakePath(getPtr(path), forceClosed, resScale)) { ) : this(makePath(path, forceClosed, resScale))
Stats.onNativeCall()
reachabilityBarrier(path)
}
/** /**
* Reset the pathmeasure with the specified path. The parts of the path that are needed * Reset the pathmeasure with the specified path. The parts of the path that are needed
...@@ -49,6 +58,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final ...@@ -49,6 +58,7 @@ class PathMeasure internal constructor(ptr: NativePointer) : Managed(ptr, _Final
_nSetPath(_ptr, getPtr(path), forceClosed) _nSetPath(_ptr, getPtr(path), forceClosed)
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(path) reachabilityBarrier(path)
} }
} }
......
...@@ -81,6 +81,7 @@ class Picture internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -81,6 +81,7 @@ class Picture internal constructor(ptr: NativePointer) : RefCnt(ptr) {
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
......
...@@ -32,9 +32,15 @@ class RuntimeEffect internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -32,9 +32,15 @@ class RuntimeEffect internal constructor(ptr: NativePointer) : RefCnt(ptr) {
val childrenPtrs = NativePointerArray(childCount) val childrenPtrs = NativePointerArray(childCount)
for (i in 0 until childCount) childrenPtrs[i] = getPtr(children!![i]) for (i in 0 until childCount) childrenPtrs[i] = getPtr(children!![i])
val matrix = localMatrix?.mat val matrix = localMatrix?.mat
return interopScope { return try {
interopScope {
Shader(_nMakeShader(_ptr, getPtr(uniforms), toInterop(childrenPtrs), childCount, toInterop(matrix))) Shader(_nMakeShader(_ptr, getPtr(uniforms), toInterop(childrenPtrs), childCount, toInterop(matrix)))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(uniforms)
reachabilityBarrier(children)
}
} }
} }
......
...@@ -103,16 +103,26 @@ class RuntimeShaderBuilder internal constructor(ptr: NativePointer) : Managed(pt ...@@ -103,16 +103,26 @@ class RuntimeShaderBuilder internal constructor(ptr: NativePointer) : Managed(pt
fun child(name: String, shader: Shader) { fun child(name: String, shader: Shader) {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nChildShader(_ptr, toInterop(name), getPtr(shader)) _nChildShader(_ptr, toInterop(name), getPtr(shader))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(shader)
}
} }
fun child(name: String, colorFilter: ColorFilter) { fun child(name: String, colorFilter: ColorFilter) {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nChildColorFilter(_ptr, toInterop(name), getPtr(colorFilter)) _nChildColorFilter(_ptr, toInterop(name), getPtr(colorFilter))
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(colorFilter)
}
} }
} }
......
...@@ -4,6 +4,7 @@ import org.jetbrains.skia.impl.Library.Companion.staticLoad ...@@ -4,6 +4,7 @@ import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.Stats import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.reachabilityBarrier
object ShadowUtils { object ShadowUtils {
/** /**
...@@ -39,6 +40,7 @@ object ShadowUtils { ...@@ -39,6 +40,7 @@ object ShadowUtils {
var flags = 0 var flags = 0
if (transparentOccluder) flags = flags or 1 if (transparentOccluder) flags = flags or 1
if (geometricOnly) flags = flags or 2 if (geometricOnly) flags = flags or 2
try {
_nDrawShadow( _nDrawShadow(
getPtr(canvas), getPtr(canvas),
getPtr(path), getPtr(path),
...@@ -53,6 +55,10 @@ object ShadowUtils { ...@@ -53,6 +55,10 @@ object ShadowUtils {
spotColor, spotColor,
flags flags
) )
} finally {
reachabilityBarrier(canvas)
reachabilityBarrier(path)
}
} }
/** /**
......
...@@ -689,6 +689,7 @@ class Surface : RefCnt { ...@@ -689,6 +689,7 @@ class Surface : RefCnt {
Surface(ptr) Surface(ptr)
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(imageInfo.colorInfo.colorSpace)
} }
} }
......
...@@ -91,6 +91,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F ...@@ -91,6 +91,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
} }
} }
...@@ -143,6 +144,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F ...@@ -143,6 +144,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
} }
} }
...@@ -191,6 +193,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F ...@@ -191,6 +193,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
} }
} }
...@@ -217,6 +220,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F ...@@ -217,6 +220,7 @@ class TextBlobBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _F
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
} }
} }
......
...@@ -30,6 +30,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -30,6 +30,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
_nSetAssetFontManager(_ptr, getPtr(fontMgr), NullPointer) _nSetAssetFontManager(_ptr, getPtr(fontMgr), NullPointer)
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
} }
} }
...@@ -44,6 +45,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -44,6 +45,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
} }
} }
...@@ -54,6 +56,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -54,6 +56,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
_nSetTestFontManager(_ptr, getPtr(fontMgr), NullPointer) _nSetTestFontManager(_ptr, getPtr(fontMgr), NullPointer)
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
} }
} }
...@@ -74,6 +77,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -74,6 +77,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
} }
} }
......
...@@ -91,6 +91,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -91,6 +91,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
_nPaint(_ptr, getPtr(canvas), x, y) _nPaint(_ptr, getPtr(canvas), x, y)
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
...@@ -213,6 +214,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -213,6 +214,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(_text) reachabilityBarrier(_text)
} }
} }
...@@ -231,6 +233,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -231,6 +233,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(_text) reachabilityBarrier(_text)
} }
...@@ -250,6 +253,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -250,6 +253,7 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
reachabilityBarrier(_text) reachabilityBarrier(_text)
} }
......
...@@ -6,7 +6,7 @@ import org.jetbrains.skia.ExternalSymbolName ...@@ -6,7 +6,7 @@ import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.* import org.jetbrains.skia.impl.*
class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) : class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
Managed(_nMake(getPtr(style), getPtr(fc)), _FinalizerHolder.PTR) { Managed(makeParagraphBuilder(style, fc), _FinalizerHolder.PTR) {
companion object { companion object {
init { init {
staticLoad() staticLoad()
...@@ -26,15 +26,23 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) : ...@@ -26,15 +26,23 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
fun popStyle(): ParagraphBuilder { fun popStyle(): ParagraphBuilder {
Stats.onNativeCall() Stats.onNativeCall()
try {
_nPopStyle(_ptr, NullPointer) _nPopStyle(_ptr, NullPointer)
} finally {
reachabilityBarrier(this)
}
return this return this
} }
fun addText(text: String): ParagraphBuilder { fun addText(text: String): ParagraphBuilder {
Stats.onNativeCall() Stats.onNativeCall()
try {
interopScope { interopScope {
_nAddText(_ptr, toInterop(text)) _nAddText(_ptr, toInterop(text))
} }
} finally {
reachabilityBarrier(this)
}
if (_text == null) _text = ManagedString(text) else _text!!.append(text) if (_text == null) _text = ManagedString(text) else _text!!.append(text)
return this return this
} }
...@@ -66,9 +74,16 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) : ...@@ -66,9 +74,16 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
internal object _FinalizerHolder { internal object _FinalizerHolder {
val PTR = ParagraphBuilder_nGetFinalizer() val PTR = ParagraphBuilder_nGetFinalizer()
} }
}
init { private fun makeParagraphBuilder(
style: ParagraphStyle?,
fc: FontCollection?
): NativePointer {
Stats.onNativeCall() Stats.onNativeCall()
return try {
_nMake(getPtr(style), getPtr(fc))
} finally {
reachabilityBarrier(style) reachabilityBarrier(style)
reachabilityBarrier(fc) reachabilityBarrier(fc)
} }
......
...@@ -80,6 +80,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -80,6 +80,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
} }
} }
...@@ -105,6 +106,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -105,6 +106,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(paint) reachabilityBarrier(paint)
} }
} }
...@@ -363,6 +365,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -363,6 +365,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
) )
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(typeface) reachabilityBarrier(typeface)
} }
} }
......
...@@ -30,6 +30,7 @@ class TypefaceFontProvider : FontMgr(TypefaceFontProvider_nMake()) { ...@@ -30,6 +30,7 @@ class TypefaceFontProvider : FontMgr(TypefaceFontProvider_nMake()) {
} }
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(typeface) reachabilityBarrier(typeface)
} }
} }
......
...@@ -11,9 +11,24 @@ import org.jetbrains.skia.impl.Stats ...@@ -11,9 +11,24 @@ import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.reachabilityBarrier import org.jetbrains.skia.impl.reachabilityBarrier
private fun makeHbIcuScriptRunIterator(
text: ManagedString,
font: Font,
opts: ShapingOptions
): NativePointer {
Stats.onNativeCall()
return try {
_nMake(getPtr(text), getPtr(font), getPtr(opts.fontMgr), opts._booleanPropsToInt())
} finally {
reachabilityBarrier(text)
reachabilityBarrier(font)
reachabilityBarrier(opts.fontMgr)
}
}
class FontMgrRunIterator(text: ManagedString, manageText: Boolean, font: Font, opts: ShapingOptions) : class FontMgrRunIterator(text: ManagedString, manageText: Boolean, font: Font, opts: ShapingOptions) :
ManagedRunIterator<FontRun?>( ManagedRunIterator<FontRun?>(
_nMake(getPtr(text), getPtr(font), getPtr(opts.fontMgr), opts._booleanPropsToInt()), text, manageText makeHbIcuScriptRunIterator(text, font, opts), text, manageText
) { ) {
companion object { companion object {
init { init {
...@@ -36,13 +51,6 @@ class FontMgrRunIterator(text: ManagedString, manageText: Boolean, font: Font, o ...@@ -36,13 +51,6 @@ class FontMgrRunIterator(text: ManagedString, manageText: Boolean, font: Font, o
} }
} }
init {
Stats.onNativeCall()
reachabilityBarrier(text)
reachabilityBarrier(font)
reachabilityBarrier(opts)
}
override fun remove() { override fun remove() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
......
...@@ -10,9 +10,7 @@ import org.jetbrains.skia.impl.getPtr ...@@ -10,9 +10,7 @@ import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.reachabilityBarrier import org.jetbrains.skia.impl.reachabilityBarrier
class HbIcuScriptRunIterator(text: ManagedString, manageText: Boolean) : ManagedRunIterator<ScriptRun?>( class HbIcuScriptRunIterator(text: ManagedString, manageText: Boolean) : ManagedRunIterator<ScriptRun?>(
_nMake( makeHbIcuScriptRunIterator(text), text, manageText
getPtr(text)
), text, manageText
) { ) {
companion object { companion object {
init { init {
...@@ -31,16 +29,19 @@ class HbIcuScriptRunIterator(text: ManagedString, manageText: Boolean) : Managed ...@@ -31,16 +29,19 @@ class HbIcuScriptRunIterator(text: ManagedString, manageText: Boolean) : Managed
} }
} }
init {
Stats.onNativeCall()
reachabilityBarrier(text)
}
override fun remove() { override fun remove() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
} }
private fun makeHbIcuScriptRunIterator(text: ManagedString): NativePointer {
Stats.onNativeCall()
return try {
_nMake(getPtr(text))
} finally {
reachabilityBarrier(text)
}
}
@ExternalSymbolName("org_jetbrains_skia_shaper_HbIcuScriptRunIterator__1nMake") @ExternalSymbolName("org_jetbrains_skia_shaper_HbIcuScriptRunIterator__1nMake")
private external fun _nMake(textPtr: NativePointer): NativePointer private external fun _nMake(textPtr: NativePointer): NativePointer
......
...@@ -9,8 +9,18 @@ import org.jetbrains.skia.impl.Stats ...@@ -9,8 +9,18 @@ import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.reachabilityBarrier import org.jetbrains.skia.impl.reachabilityBarrier
private fun makeIcuBidiRunIterator(text: ManagedString, bidiLevel: Int): NativePointer {
Stats.onNativeCall()
return try {
_nMake(getPtr(text), bidiLevel)
} finally {
reachabilityBarrier(text)
}
}
class IcuBidiRunIterator(text: ManagedString, manageText: Boolean, bidiLevel: Int) : ManagedRunIterator<BidiRun?>( class IcuBidiRunIterator(text: ManagedString, manageText: Boolean, bidiLevel: Int) : ManagedRunIterator<BidiRun?>(
_nMake(getPtr(text), bidiLevel), text, manageText makeIcuBidiRunIterator(text, bidiLevel), text, manageText
) { ) {
companion object { companion object {
init { init {
...@@ -29,11 +39,6 @@ class IcuBidiRunIterator(text: ManagedString, manageText: Boolean, bidiLevel: In ...@@ -29,11 +39,6 @@ class IcuBidiRunIterator(text: ManagedString, manageText: Boolean, bidiLevel: In
} }
} }
init {
Stats.onNativeCall()
reachabilityBarrier(text)
}
override fun remove() { override fun remove() {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
......
...@@ -193,7 +193,7 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -193,7 +193,7 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
fun shapeLine(text: String?, font: Font?, opts: ShapingOptions): TextLine { fun shapeLine(text: String?, font: Font?, opts: ShapingOptions): TextLine {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val managedString = ManagedString(text) ManagedString(text).use { managedString ->
interopScope { interopScope {
TextLine( TextLine(
_nShapeLine( _nShapeLine(
...@@ -206,6 +206,8 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH ...@@ -206,6 +206,8 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
) )
) )
} }
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(font) reachabilityBarrier(font)
......
...@@ -73,6 +73,7 @@ class TextBlobBuilderRunHandler<T> internal constructor( ...@@ -73,6 +73,7 @@ class TextBlobBuilderRunHandler<T> internal constructor(
} }
init { init {
// TODO [pavel.sergeev] what `manageText` == false is actually mean?
_text = if (manageText) text else null _text = if (manageText) text else null
reachabilityBarrier(text) reachabilityBarrier(text)
} }
......
...@@ -20,7 +20,11 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -20,7 +20,11 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
fun makeFromData(data: Data): Animation { fun makeFromData(data: Data): Animation {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = _nMakeFromData(getPtr(data)) val ptr = try {
_nMakeFromData(getPtr(data))
} finally {
reachabilityBarrier(data)
}
require(ptr != NullPointer) { "Failed to create Animation from data." } require(ptr != NullPointer) { "Failed to create Animation from data." }
return Animation(ptr) return Animation(ptr)
} }
...@@ -103,6 +107,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -103,6 +107,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
_nRender(_ptr, getPtr(canvas), dst.left, dst.top, dst.right, dst.bottom, flags) _nRender(_ptr, getPtr(canvas), dst.left, dst.top, dst.right, dst.bottom, flags)
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
...@@ -132,6 +137,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -132,6 +137,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
_nSeek(_ptr, t, getPtr(ic)) _nSeek(_ptr, t, getPtr(ic))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(ic) reachabilityBarrier(ic)
} }
} }
...@@ -171,6 +177,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -171,6 +177,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
_nSeekFrame(_ptr, t, getPtr(ic)) _nSeekFrame(_ptr, t, getPtr(ic))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(ic) reachabilityBarrier(ic)
} }
} }
...@@ -202,6 +209,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -202,6 +209,7 @@ class Animation internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
_nSeekFrameTime(_ptr, t, getPtr(ic)) _nSeekFrameTime(_ptr, t, getPtr(ic))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(ic) reachabilityBarrier(ic)
} }
} }
......
...@@ -39,6 +39,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _ ...@@ -39,6 +39,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _
_nSetFontManager(_ptr, getPtr(fontMgr)) _nSetFontManager(_ptr, getPtr(fontMgr))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
} }
} }
...@@ -53,6 +54,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _ ...@@ -53,6 +54,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _
_nSetLogger(_ptr, getPtr(logger)) _nSetLogger(_ptr, getPtr(logger))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(logger) reachabilityBarrier(logger)
} }
} }
...@@ -76,6 +78,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _ ...@@ -76,6 +78,7 @@ class AnimationBuilder internal constructor(ptr: NativePointer) : Managed(ptr, _
require(ptr != NullPointer) { "Failed to create Animation from data" } require(ptr != NullPointer) { "Failed to create Animation from data" }
Animation(ptr) Animation(ptr)
} finally { } finally {
reachabilityBarrier(data)
reachabilityBarrier(this) reachabilityBarrier(this)
} }
} }
......
...@@ -6,6 +6,7 @@ import org.jetbrains.skia.impl.Stats ...@@ -6,6 +6,7 @@ import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.ExternalSymbolName import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.reachabilityBarrier
object SVGCanvas { object SVGCanvas {
/** /**
...@@ -40,7 +41,8 @@ object SVGCanvas { ...@@ -40,7 +41,8 @@ object SVGCanvas {
*/ */
fun make(bounds: Rect, out: WStream, convertTextToPaths: Boolean, prettyXML: Boolean): Canvas { fun make(bounds: Rect, out: WStream, convertTextToPaths: Boolean, prettyXML: Boolean): Canvas {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = SVGCanvas_nMake( val ptr = try {
SVGCanvas_nMake(
bounds.left, bounds.left,
bounds.top, bounds.top,
bounds.right, bounds.right,
...@@ -48,6 +50,9 @@ object SVGCanvas { ...@@ -48,6 +50,9 @@ object SVGCanvas {
getPtr(out), getPtr(out),
0 or (if (convertTextToPaths) 1 else 0) or if (prettyXML) 0 else 2 0 or (if (convertTextToPaths) 1 else 0) or if (prettyXML) 0 else 2
) )
} finally {
reachabilityBarrier(out)
}
return Canvas(ptr, true, out) return Canvas(ptr, true, out)
} }
......
...@@ -5,6 +5,15 @@ import org.jetbrains.skia.* ...@@ -5,6 +5,15 @@ import org.jetbrains.skia.*
import org.jetbrains.skia.ExternalSymbolName import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.* import org.jetbrains.skia.impl.*
private fun makeSVGDOM(data: Data): NativePointer {
Stats.onNativeCall()
return try {
SVGDOM_nMakeFromData(getPtr(data))
} finally {
reachabilityBarrier(data)
}
}
class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) { class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) {
companion object { companion object {
init { init {
...@@ -12,10 +21,7 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -12,10 +21,7 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) {
} }
} }
constructor(data: Data) : this(SVGDOM_nMakeFromData(getPtr(data))) { constructor(data: Data) : this(makeSVGDOM(data))
Stats.onNativeCall()
reachabilityBarrier(data)
}
val root: SVGSVG? val root: SVGSVG?
get() = try { get() = try {
...@@ -54,6 +60,7 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -54,6 +60,7 @@ class SVGDOM internal constructor(ptr: NativePointer) : RefCnt(ptr) {
SVGDOM_nRender(_ptr, getPtr(canvas)) SVGDOM_nRender(_ptr, getPtr(canvas))
this this
} finally { } finally {
reachabilityBarrier(this)
reachabilityBarrier(canvas) reachabilityBarrier(canvas)
} }
} }
......
...@@ -5,6 +5,7 @@ import org.jetbrains.skia.ManagedString ...@@ -5,6 +5,7 @@ import org.jetbrains.skia.ManagedString
import org.jetbrains.skia.impl.InteropPointer import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.interopScope import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.reachabilityBarrier
internal actual fun Shaper.doShape( internal actual fun Shaper.doShape(
textUtf8: ManagedString, textUtf8: ManagedString,
...@@ -16,6 +17,7 @@ internal actual fun Shaper.doShape( ...@@ -16,6 +17,7 @@ internal actual fun Shaper.doShape(
width: Float, width: Float,
runHandler: RunHandler runHandler: RunHandler
) { ) {
try {
interopScope { interopScope {
Shaper_nShape( Shaper_nShape(
_ptr, _ptr,
...@@ -31,4 +33,8 @@ internal actual fun Shaper.doShape( ...@@ -31,4 +33,8 @@ internal actual fun Shaper.doShape(
runHandler = runHandler as InteropPointer runHandler = runHandler as InteropPointer
) )
} }
} finally {
reachabilityBarrier(this)
reachabilityBarrier(textUtf8)
}
} }
\ 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