Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55f149c7 authored by Diego Perez's avatar Diego Perez Committed by Android (Google) Code Review
Browse files

Merge "Avoid caching mImage on the main render loop and use clipping."

parents 1cee9c8b 2c5e85b3
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ public final class SessionParamsFlags {

    public static final SessionParams.Key<String> FLAG_KEY_ROOT_TAG =
            new SessionParams.Key<String>("rootTag", String.class);
    public static final SessionParams.Key<Boolean> FLAG_KEY_DISABLE_BITMAP_CACHING =
            new SessionParams.Key<Boolean>("disableBitmapCaching", Boolean.class);

    // Disallow instances.
    private SessionParamsFlags() {}
+17 −2
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
@@ -615,8 +616,22 @@ public class GcSnapshot {
                return;
            }

            int width = layer.getImage().getWidth();
            int height = layer.getImage().getHeight();
            int width;
            int height;
            Rectangle clipBounds = originalGraphics.getClipBounds();
            if (clipBounds != null) {
                if (clipBounds.width == 0 || clipBounds.height == 0) {
                    // Clip is 0 so no need to paint anything.
                    return;
                }
                // If we have clipBounds available, use them as they will always be
                // smaller than the full layer size.
                width = clipBounds.width;
                height = clipBounds.height;
            } else {
                width = layer.getImage().getWidth();
                height = layer.getImage().getHeight();
            }

            // Create a temporary image to which the color filter will be applied.
            BufferedImage image = new BufferedImage(width, height,
+14 −3
Original line number Diff line number Diff line
@@ -551,7 +551,14 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
                // draw the views
                // create the BufferedImage into which the layout will be rendered.
                boolean newImage = false;
                if (newRenderSize || mCanvas == null) {

                // When disableBitmapCaching is true, we do not reuse mImage and
                // we create a new one in every render.
                // This is useful when mImage is just a wrapper of Graphics2D so
                // it doesn't get cached.
                boolean disableBitmapCaching = Boolean.TRUE.equals(params.getFlag(
                    SessionParamsFlags.FLAG_KEY_DISABLE_BITMAP_CACHING));
                if (newRenderSize || mCanvas == null || disableBitmapCaching) {
                    if (params.getImageFactory() != null) {
                        mImage = params.getImageFactory().getImage(
                                mMeasuredScreenWidth,
@@ -578,8 +585,12 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
                    Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage,
                            true /*isMutable*/, hardwareConfig.getDensity());

                    if (mCanvas == null) {
                        // create a Canvas around the Android bitmap
                        mCanvas = new Canvas(bitmap);
                    } else {
                        mCanvas.setBitmap(bitmap);
                    }
                    mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue());
                }