fix: decode bitmaps off main thread in ImageElement
Fix: Avoid decoding bitmaps on the main thread
Summary
This PR updates ImageElement to decode bitmaps off the main thread. Previously, bitmap decoding happened inside a remember block during composition, which could cause jank or dropped frames — especially with larger assets.
The fix moves the decoding logic into a background coroutine (Dispatchers.Default), keeping everything else (alignment, scaling, tint) intact. This change improves performance and helps keep the UI thread smooth.
Why it matters
Decoding on the main thread is risky, particularly on lower-end devices or when rendering paywalls with high-res assets. This update keeps composition lightweight and improves responsiveness across the board.
Implementation Notes
- Decoding now runs on a background thread using
withContext(Dispatchers.Default). - No changes to the existing
getBitmaplogic or behavior.
Suggestion: Consider moving to Coil
As a future improvement, I’d recommend exploring Coil. It’s designed for Compose, handles background decoding out of the box, and brings built-in caching, lifecycle awareness, and error handling.
That said, I realize migrating away from getBitmap may be tricky since it's used in other places like Modifiers — but it could be worth considering long term.
I forgot to mention. Fixes #30
Hi @frankjoshua, thank you for your contribution! We’ll review it and I’ll get back to you soon.
Rebased to 3.10.0. This keeps test integration StrictMode-safe (prevents false positives) with no runtime/API changes. Resubmitting since last release didn’t merge—would appreciate inclusion this time.