Skip to content

Commit c87d3a7

Browse files
authored
Micro Optimizations for SkiaBackedCanvas (#2543)
optimizing some functions SkiaBackedCanvas that were creating Paint() objects needlessly (mimicking android functions basically). There is still room for removing unnecessary allocations. See comments below ## Testing (Optional) Describe how you tested your changes (provide a snippet or/and steps) (Optional) This should be tested by QA ## Release Notes N/A
1 parent 84b79f0 commit c87d3a7

File tree

1 file changed

+18
-24
lines changed

1 file changed

+18
-24
lines changed

compose/ui/ui-graphics/src/skikoMain/kotlin/androidx/compose/ui/graphics/SkiaBackedCanvas.skiko.kt

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,7 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
217217
paint: Paint
218218
) {
219219
val bitmap = image.asSkiaBitmap()
220-
// TODO(gorshenev): need to use skiko's .use() rather than jvm one here.
221-
// But can't do that as skiko is jvmTarget=11 for now, so can't inline
222-
// into jvmTarget=8 compose.
223-
// After this issue is resolved use:
224-
// import org.jetbrains.skia.impl.use
220+
225221
Image.makeFromBitmap(bitmap).use { skiaImage ->
226222
skia.drawImageRect(
227223
skiaImage,
@@ -263,11 +259,12 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
263259
override fun disableZ() = Unit
264260

265261
private fun drawPoints(points: List<Offset>, paint: Paint) {
262+
val skiaPaint = paint.skia
266263
points.fastForEach { point ->
267264
skia.drawPoint(
268265
point.x,
269266
point.y,
270-
paint.skia
267+
skiaPaint
271268
)
272269
}
273270
}
@@ -286,16 +283,13 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
286283
*/
287284
private fun drawLines(points: List<Offset>, paint: Paint, stepBy: Int) {
288285
if (points.size >= 2) {
289-
for (i in 0 until points.size - 1 step stepBy) {
286+
val skiaPaint = paint.skia
287+
var i = 0
288+
while (i < points.size - 1) {
290289
val p1 = points[i]
291290
val p2 = points[i + 1]
292-
skia.drawLine(
293-
p1.x,
294-
p1.y,
295-
p2.x,
296-
p2.y,
297-
paint.skia
298-
)
291+
skia.drawLine(p1.x, p1.y, p2.x, p2.y, skiaPaint)
292+
i += stepBy
299293
}
300294
}
301295
}
@@ -316,10 +310,13 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
316310

317311
private fun drawRawPoints(points: FloatArray, paint: Paint, stepBy: Int) {
318312
if (points.size % 2 == 0) {
319-
for (i in 0 until points.size - 1 step stepBy) {
313+
val skiaPaint = paint.skia
314+
var i = 0
315+
while (i < points.size - 1) {
320316
val x = points[i]
321317
val y = points[i + 1]
322-
skia.drawPoint(x, y, paint.skia)
318+
skia.drawPoint(x, y, skiaPaint)
319+
i += stepBy
323320
}
324321
}
325322
}
@@ -341,18 +338,15 @@ internal class SkiaBackedCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
341338
// Float array is treated as alternative set of x and y coordinates
342339
// x1, y1, x2, y2, x3, y3, ... etc.
343340
if (points.size >= 4 && points.size % 2 == 0) {
344-
for (i in 0 until points.size - 3 step stepBy * 2) {
341+
val skiaPaint = paint.skia
342+
var i = 0
343+
while (i < points.size - 3) {
345344
val x1 = points[i]
346345
val y1 = points[i + 1]
347346
val x2 = points[i + 2]
348347
val y2 = points[i + 3]
349-
skia.drawLine(
350-
x1,
351-
y1,
352-
x2,
353-
y2,
354-
paint.skia
355-
)
348+
skia.drawLine(x1, y1, x2, y2, skiaPaint)
349+
i += stepBy * 2
356350
}
357351
}
358352
}

0 commit comments

Comments
 (0)