toImageBitmap

Android path. createBitmap(IntArray, …) takes non-premultiplied ARGB color ints, exactly KiteBitmap's layout, and premultiplies internally.

Convert a decoded KiteBitmap (non-premultiplied ARGB_8888 in an IntArray) to a Compose ImageBitmap.

Android goes through android.graphics.Bitmap; every other target goes through one shared Skiko path (an UNPREMUL RGBA_8888 raster: straight alpha, exactly what KiteBitmap holds).

Fidelity contract (both paths: Compose's backing store premultiplies): opaque pixels are bit-exact, semi-transparent channels may wobble ±1 from the premultiply round-trip, and RGB under alpha 0 is not preserved. None of the three is visible.

Skiko path (JVM, iOS, macOS, JS, WASM). UNPREMUL, not OPAQUE/PREMUL: the core hands over straight (non-premultiplied) alpha, and Skia premultiplies on draw; same choice KitePDF's compose viewer landed on after transparent PDF logos rendered on grey boxes.