From e44c4f499f8f5ac5aa4c8aa08ee456b4716469a9 Mon Sep 17 00:00:00 2001 From: Jim Chen Date: Wed, 10 Jun 2015 00:25:01 -0400 Subject: [PATCH] Bug 1166309 - Move gfx mozglue dependency to after Gecko starts; r=snorp --- mobile/android/base/gfx/BufferedImage.java | 21 ++++++++++++----- mobile/android/base/gfx/LayerRenderer.java | 27 ++++++++++++---------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/mobile/android/base/gfx/BufferedImage.java b/mobile/android/base/gfx/BufferedImage.java index 9e63e3e59b9..4dbcf61bbcd 100644 --- a/mobile/android/base/gfx/BufferedImage.java +++ b/mobile/android/base/gfx/BufferedImage.java @@ -15,6 +15,7 @@ import java.nio.ByteBuffer; /** A buffered image that simply saves a buffer of pixel data. */ public class BufferedImage { private ByteBuffer mBuffer; + private Bitmap mBitmap; private IntSize mSize; private int mFormat; @@ -29,14 +30,13 @@ public class BufferedImage { public BufferedImage(Bitmap bitmap) { mFormat = bitmapConfigToFormat(bitmap.getConfig()); mSize = new IntSize(bitmap.getWidth(), bitmap.getHeight()); - - int bpp = bitsPerPixelForFormat(mFormat); - mBuffer = DirectBufferAllocator.allocate(mSize.getArea() * bpp); - bitmap.copyPixelsToBuffer(mBuffer.asIntBuffer()); + mBitmap = bitmap; } private synchronized void freeBuffer() { - mBuffer = DirectBufferAllocator.free(mBuffer); + if (mBuffer != null) { + mBuffer = DirectBufferAllocator.free(mBuffer); + } } public void destroy() { @@ -47,7 +47,16 @@ public class BufferedImage { } } - public ByteBuffer getBuffer() { return mBuffer; } + public ByteBuffer getBuffer() { + if (mBuffer == null) { + int bpp = bitsPerPixelForFormat(mFormat); + mBuffer = DirectBufferAllocator.allocate(mSize.getArea() * bpp); + mBitmap.copyPixelsToBuffer(mBuffer.asIntBuffer()); + mBitmap = null; + } + return mBuffer; + } + public IntSize getSize() { return mSize; } public int getFormat() { return mFormat; } diff --git a/mobile/android/base/gfx/LayerRenderer.java b/mobile/android/base/gfx/LayerRenderer.java index 24aa2f02357..5c932996b34 100644 --- a/mobile/android/base/gfx/LayerRenderer.java +++ b/mobile/android/base/gfx/LayerRenderer.java @@ -161,12 +161,6 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { mFrameTimings = new int[60]; mCurrentFrame = mFrameTimingsSum = mDroppedFrames = 0; - // Initialize the FloatBuffer that will be used to store all vertices and texture - // coordinates in draw() commands. - mCoordByteBuffer = DirectBufferAllocator.allocate(COORD_BUFFER_SIZE * 4); - mCoordByteBuffer.order(ByteOrder.nativeOrder()); - mCoordBuffer = mCoordByteBuffer.asFloatBuffer(); - Tabs.registerOnTabsChangedListener(this); mZoomedViewListeners = new ArrayList(); } @@ -190,9 +184,11 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { } public void destroy() { - DirectBufferAllocator.free(mCoordByteBuffer); - mCoordByteBuffer = null; - mCoordBuffer = null; + if (mCoordByteBuffer != null) { + DirectBufferAllocator.free(mCoordByteBuffer); + mCoordByteBuffer = null; + mCoordBuffer = null; + } mHorizScrollLayer.destroy(); mVertScrollLayer.destroy(); Tabs.unregisterOnTabsChangedListener(this); @@ -348,10 +344,17 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { private RenderContext createContext(RectF viewport, RectF pageRect, float zoomFactor, PointF offset) { if (mCoordBuffer == null) { - throw new IllegalStateException(); + // Initialize the FloatBuffer that will be used to store all vertices and texture + // coordinates in draw() commands. + mCoordByteBuffer = DirectBufferAllocator.allocate(COORD_BUFFER_SIZE * 4); + mCoordByteBuffer.order(ByteOrder.nativeOrder()); + mCoordBuffer = mCoordByteBuffer.asFloatBuffer(); + if (mCoordBuffer == null) { + throw new IllegalStateException(); + } } - return new RenderContext(viewport, pageRect, zoomFactor, offset, mPositionHandle, mTextureHandle, - mCoordBuffer); + return new RenderContext(viewport, pageRect, zoomFactor, offset, + mPositionHandle, mTextureHandle, mCoordBuffer); } private void updateDroppedFrames(long frameStartTime) {