coil-kt/coil

Consider adding workaround for U + gainmap + hardware bitmap bug

Open

#2,094 建立於 2024年1月31日

在 GitHub 查看
 (2 留言) (0 反應) (0 負責人)Kotlin (757 fork)batch import
help wanted

倉庫指標

Star
 (11,779 star)
PR 合併指標
 (平均合併 20小時 14分鐘) (30 天內合併 28 個 PR)

描述

Prior to Android V there exists a bug where when:

  1. A decode to Config.HARDWARE is requested
  2. The image format is A8 / gray8
  3. The device supports A8 hardware buffers
  4. The device is using OpenGL

Then the decode fails. As A8 images are extremely rare, this hadn't come up before. However, with the addition of gainmap images the usage of A8 "images" became much more common as a common space/quality tradeoff for the gainmap is to use a8 and provide only luminance modulation as a result. In this scenario it becomes quite possible for all 4 of the above conditions to be hit.

However, it is rather easy to both detect the presence of the bug (simply try to copy an A8 bitmap to Config.HARDWARE - if null is returned the bug is present) and to workaround it in a decently efficient means by simply decoding to non-hardware first, converting the A8 gainmap to 8888, and then copying the result to HARDWARE and returning that. This is not dissimilar to how decoding directly to HARDWARE works, so performance impact should be minimal. See the Glide implementation of both here: https://github.com/bumptech/glide/pull/5357

If nothing is done about this then the failure mode is simply that the decoding of the gainmap portion fails, but the primary image is still successfully returned. As in, the behavior simply matches what Android T did, prior to the introduction of gainmaps. So the failure mode is quite forgiving.

貢獻者指南