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

+ Added a session flag that avoids caching mImage. This is useful when
mImage is just a Graphics2D wrapper that might change at any time.
+ Make GcSnapshot aware of the clipping so it doesn't need to render the
whole area if not needed.

Change-Id: Ie0134c2bc2741b5fa6648313864c851bbac066cf
(cherry picked from commit 2c5e85b303)
This commit is contained in:
Diego Perez
2015-02-16 17:14:16 +00:00
parent 220f360e02
commit f3cb4ba213
2 changed files with 31 additions and 5 deletions

View File

@@ -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,

View File

@@ -554,7 +554,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(
RenderParamsFlags.FLAG_KEY_DISABLE_BITMAP_CACHING));
if (newRenderSize || mCanvas == null || disableBitmapCaching) {
if (params.getImageFactory() != null) {
mImage = params.getImageFactory().getImage(
mMeasuredScreenWidth,
@@ -581,8 +588,12 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
Bitmap bitmap = Bitmap_Delegate.createBitmap(mImage,
true /*isMutable*/, hardwareConfig.getDensity());
// create a Canvas around the Android bitmap
mCanvas = new Canvas(bitmap);
if (mCanvas == null) {
// create a Canvas around the Android bitmap
mCanvas = new Canvas(bitmap);
} else {
mCanvas.setBitmap(bitmap);
}
mCanvas.setDensity(hardwareConfig.getDensity().getDpiValue());
}