aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hoisie <hoisie@google.com>2024-04-14 11:27:42 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-14 11:29:55 -0700
commitc0c8e9869dcfeaa08b33d8ff2119e7b92ffd5006 (patch)
tree9c77e998a944275b261ba7097b0b414818f17998
parentf53137893e98825871903d4144037e806261d5fb (diff)
downloadrobolectric-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.java16
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();
}
}