diff options
author | Michael Hoisie <hoisie@google.com> | 2024-04-14 11:27:42 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-04-14 11:29:55 -0700 |
commit | c0c8e9869dcfeaa08b33d8ff2119e7b92ffd5006 (patch) | |
tree | 9c77e998a944275b261ba7097b0b414818f17998 | |
parent | f53137893e98825871903d4144037e806261d5fb (diff) | |
download | robolectric-c0c8e9869dcfeaa08b33d8ff2119e7b92ffd5006.tar.gz |
Use Bitmap.copyPixelsFromBuffer to copy image data ImageReader in HW rendering
When HardwareRenderer is used, the underlying Bitmap data is stored as
premultiplied alpha. Previously, when that data is copied to an Android Bitmap
object, Bitmap.setPixels was used, which assumed the int array passed was
un-premultiplied data. Update to use Bitmap.copyPixelsFromBuffer, which does
not make any assumptions about the underlying data. By default Android bitmaps
are stored as premultiplied alpha.
This fixes an issue with alpha blending in HW rendering.
PiperOrigin-RevId: 624739361
-rw-r--r-- | shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java | 16 |
1 files changed, 1 insertions, 15 deletions
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java b/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java index fea0a9a97..fbbe12385 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/HardwareRenderingScreenshot.java @@ -16,7 +16,6 @@ import android.util.DisplayMetrics; import android.view.Surface; import android.view.View; import com.android.internal.R; -import java.nio.IntBuffer; import org.robolectric.annotation.GraphicsMode; import org.robolectric.util.ReflectionHelpers; @@ -71,21 +70,8 @@ public final class HardwareRenderingScreenshot { renderer.setContentRoot(node); renderer.createRenderRequest().syncAndDraw(); - - int[] renderPixels = new int[width * height]; - Plane[] planes = nativeImage.getPlanes(); - IntBuffer srcBuff = planes[0].getBuffer().asIntBuffer(); - srcBuff.get(renderPixels); - - destBitmap.setPixels( - renderPixels, - /* offset= */ 0, - /* stride= */ width, - /* x= */ 0, - /* y= */ 0, - width, - height); + destBitmap.copyPixelsFromBuffer(planes[0].getBuffer()); surface.release(); } } |