From c4e060665c95b4d20913bb22c28a118f19468bfc Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 17 Feb 2012 10:33:23 -0500 Subject: [PATCH] (Part 5) Move overrides and abstract/interface implementations up from GeckoGLLayerClient into GeckoLayerClient --- .../android/base/gfx/GeckoGLLayerClient.java | 141 +----------------- mobile/android/base/gfx/GeckoLayerClient.java | 137 +++++++++++++---- 2 files changed, 113 insertions(+), 165 deletions(-) diff --git a/mobile/android/base/gfx/GeckoGLLayerClient.java b/mobile/android/base/gfx/GeckoGLLayerClient.java index e7b3f7bbeca..19f5c8d0b71 100644 --- a/mobile/android/base/gfx/GeckoGLLayerClient.java +++ b/mobile/android/base/gfx/GeckoGLLayerClient.java @@ -48,132 +48,15 @@ import android.graphics.RectF; import android.util.Log; import android.view.View; -public class GeckoGLLayerClient extends GeckoLayerClient - implements FlexibleGLSurfaceView.Listener, VirtualLayer.Listener { +public class GeckoGLLayerClient extends GeckoLayerClient { private static final String LOGTAG = "GeckoGLLayerClient"; - private LayerRenderer mLayerRenderer; private boolean mLayerRendererInitialized; public GeckoGLLayerClient(Context context) { super(context); } - @Override - public Rect beginDrawing(int width, int height, int tileWidth, int tileHeight, - String metadata, boolean hasDirectTexture) { - Rect bufferRect = super.beginDrawing(width, height, tileWidth, tileHeight, - metadata, hasDirectTexture); - if (bufferRect == null) { - return null; - } - - // Be sure to adjust the buffer size; if it's not at least as large as the viewport size, - // ViewportMetrics.getOptimumViewportOffset() gets awfully confused and severe display - // corruption results! - if (mBufferSize.width != width || mBufferSize.height != height) { - mBufferSize = new IntSize(width, height); - } - - return bufferRect; - } - - @Override - protected boolean handleDirectTextureChange(boolean hasDirectTexture) { - Log.e(LOGTAG, "### handleDirectTextureChange"); - if (mTileLayer != null) { - return false; - } - - Log.e(LOGTAG, "### Creating virtual layer"); - VirtualLayer virtualLayer = new VirtualLayer(); - virtualLayer.setListener(this); - virtualLayer.setSize(getBufferSize()); - mLayerController.setRoot(virtualLayer); - mTileLayer = virtualLayer; - - sendResizeEventIfNecessary(true); - return true; - } - - @Override - public void setLayerController(LayerController layerController) { - super.setLayerController(layerController); - - LayerView view = layerController.getView(); - view.setListener(this); - - mLayerRenderer = new LayerRenderer(view); - } - - @Override - protected boolean shouldDrawProceed(int tileWidth, int tileHeight) { - Log.e(LOGTAG, "### shouldDrawProceed"); - // Always draw. - return true; - } - - @Override - protected void updateLayerAfterDraw(Rect updatedRect) { - Log.e(LOGTAG, "### updateLayerAfterDraw"); - // Nothing to do. - } - - @Override - protected IntSize getBufferSize() { - View view = mLayerController.getView(); - IntSize size = new IntSize(view.getWidth(), view.getHeight()); - Log.e(LOGTAG, "### getBufferSize " + size); - return size; - } - - @Override - protected IntSize getTileSize() { - Log.e(LOGTAG, "### getTileSize " + getBufferSize()); - return getBufferSize(); - } - - @Override - protected void tileLayerUpdated() { - // Set the new origin and resolution instantly. - mTileLayer.performUpdates(null); - } - - @Override - public Bitmap getBitmap() { - Log.e(LOGTAG, "### getBitmap"); - IntSize size = getBufferSize(); - try { - return Bitmap.createBitmap(size.width, size.height, Bitmap.Config.RGB_565); - } catch (OutOfMemoryError oom) { - Log.e(LOGTAG, "Unable to create bitmap", oom); - return null; - } - } - - public void dimensionsChanged(Point newOrigin, float newResolution) { - Log.e(LOGTAG, "### dimensionsChanged " + newOrigin + " " + newResolution); - } - - /* Informs Gecko that the screen size has changed. */ - @Override - protected void sendResizeEventIfNecessary(boolean force) { - Log.e(LOGTAG, "### sendResizeEventIfNecessary " + force); - - IntSize newSize = getBufferSize(); - if (!force && mScreenSize != null && mScreenSize.equals(newSize)) { - return; - } - - mScreenSize = newSize; - - Log.e(LOGTAG, "### Screen-size changed to " + mScreenSize); - GeckoEvent event = GeckoEvent.createSizeChangedEvent(mScreenSize.width, mScreenSize.height, - mScreenSize.width, mScreenSize.height, - mScreenSize.width, mScreenSize.height); - GeckoAppShell.sendEventToGecko(event); - } - /** This function is invoked by Gecko via JNI; be careful when modifying signature. */ public ViewTransform getViewTransform() { Log.e(LOGTAG, "### getViewTransform()"); @@ -194,28 +77,6 @@ public class GeckoGLLayerClient extends GeckoLayerClient } } - public void renderRequested() { - Log.e(LOGTAG, "### Render requested, scheduling composite"); - GeckoAppShell.scheduleComposite(); - } - - public void compositionPauseRequested() { - Log.e(LOGTAG, "### Scheduling PauseComposition"); - GeckoAppShell.schedulePauseComposition(); - } - - public void compositionResumeRequested() { - Log.e(LOGTAG, "### Scheduling ResumeComposition"); - GeckoAppShell.scheduleResumeComposition(); - } - - public void surfaceChanged(int width, int height) { - compositionPauseRequested(); - mLayerController.setViewportSize(new FloatSize(width, height)); - compositionResumeRequested(); - renderRequested(); - } - /** This function is invoked by Gecko via JNI; be careful when modifying signature. */ public LayerRenderer.Frame createFrame() { // Create the shaders and textures if necessary. diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index 685a66846ea..cc964380c9e 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -48,19 +48,24 @@ import org.json.JSONObject; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; +import android.view.View; import java.util.regex.Matcher; import java.util.regex.Pattern; -public abstract class GeckoLayerClient implements GeckoEventListener { +public abstract class GeckoLayerClient implements GeckoEventListener, + FlexibleGLSurfaceView.Listener, + VirtualLayer.Listener { private static final String LOGTAG = "GeckoLayerClient"; protected LayerController mLayerController; + protected LayerRenderer mLayerRenderer; protected IntSize mScreenSize; protected IntSize mBufferSize; @@ -92,14 +97,6 @@ public abstract class GeckoLayerClient implements GeckoEventListener { /* Used by robocop for testing purposes */ private DrawListener mDrawListener; - protected abstract boolean handleDirectTextureChange(boolean hasDirectTexture); - protected abstract boolean shouldDrawProceed(int tileWidth, int tileHeight); - protected abstract void updateLayerAfterDraw(Rect updatedRect); - protected abstract IntSize getBufferSize(); - protected abstract IntSize getTileSize(); - protected abstract void tileLayerUpdated(); - public abstract Bitmap getBitmap(); - public GeckoLayerClient(Context context) { mScreenSize = new IntSize(0, 0); mBufferSize = new IntSize(0, 0); @@ -118,6 +115,11 @@ public abstract class GeckoLayerClient implements GeckoEventListener { GeckoAppShell.registerGeckoEventListener("Viewport:UpdateLater", this); sendResizeEventIfNecessary(); + + LayerView view = layerController.getView(); + view.setListener(this); + + mLayerRenderer = new LayerRenderer(view); } /** This function is invoked by Gecko via JNI; be careful when modifying signature. */ @@ -194,6 +196,14 @@ public abstract class GeckoLayerClient implements GeckoEventListener { } mTileLayer.beginTransaction(mLayerController.getView()); + + // Be sure to adjust the buffer size; if it's not at least as large as the viewport size, + // ViewportMetrics.getOptimumViewportOffset() gets awfully confused and severe display + // corruption results! + if (mBufferSize.width != width || mBufferSize.height != height) { + mBufferSize = new IntSize(width, height); + } + return bufferRect; } @@ -255,27 +265,17 @@ public abstract class GeckoLayerClient implements GeckoEventListener { protected void sendResizeEventIfNecessary(boolean force) { Log.e(LOGTAG, "### sendResizeEventIfNecessary " + force); - DisplayMetrics metrics = new DisplayMetrics(); - GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics); - - // Return immediately if the screen size hasn't changed or the viewport - // size is zero (which indicates that the rendering surface hasn't been - // allocated yet). - boolean screenSizeChanged = (metrics.widthPixels != mScreenSize.width || - metrics.heightPixels != mScreenSize.height); - boolean viewportSizeValid = (mLayerController != null && - mLayerController.getViewportSize().isPositive()); - if (!(force || (screenSizeChanged && viewportSizeValid))) { + IntSize newSize = getBufferSize(); + if (!force && mScreenSize != null && mScreenSize.equals(newSize)) { return; } - mScreenSize = new IntSize(metrics.widthPixels, metrics.heightPixels); - IntSize bufferSize = getBufferSize(), tileSize = getTileSize(); + mScreenSize = newSize; Log.e(LOGTAG, "### Screen-size changed to " + mScreenSize); - GeckoEvent event = GeckoEvent.createSizeChangedEvent(bufferSize.width, bufferSize.height, - metrics.widthPixels, metrics.heightPixels, - tileSize.width, tileSize.height); + GeckoEvent event = GeckoEvent.createSizeChangedEvent(mScreenSize.width, mScreenSize.height, + mScreenSize.width, mScreenSize.height, + mScreenSize.width, mScreenSize.height); GeckoAppShell.sendEventToGecko(event); } @@ -297,6 +297,62 @@ public abstract class GeckoLayerClient implements GeckoEventListener { return Color.rgb(r, g, b); } + protected boolean handleDirectTextureChange(boolean hasDirectTexture) { + Log.e(LOGTAG, "### handleDirectTextureChange"); + if (mTileLayer != null) { + return false; + } + + Log.e(LOGTAG, "### Creating virtual layer"); + VirtualLayer virtualLayer = new VirtualLayer(); + virtualLayer.setListener(this); + virtualLayer.setSize(getBufferSize()); + mLayerController.setRoot(virtualLayer); + mTileLayer = virtualLayer; + + sendResizeEventIfNecessary(true); + return true; + } + + protected boolean shouldDrawProceed(int tileWidth, int tileHeight) { + Log.e(LOGTAG, "### shouldDrawProceed"); + // Always draw. + return true; + } + + protected void updateLayerAfterDraw(Rect updatedRect) { + Log.e(LOGTAG, "### updateLayerAfterDraw"); + // Nothing to do. + } + + protected IntSize getBufferSize() { + View view = mLayerController.getView(); + IntSize size = new IntSize(view.getWidth(), view.getHeight()); + Log.e(LOGTAG, "### getBufferSize " + size); + return size; + } + + protected IntSize getTileSize() { + Log.e(LOGTAG, "### getTileSize " + getBufferSize()); + return getBufferSize(); + } + + protected void tileLayerUpdated() { + // Set the new origin and resolution instantly. + mTileLayer.performUpdates(null); + } + + public Bitmap getBitmap() { + Log.e(LOGTAG, "### getBitmap"); + IntSize size = getBufferSize(); + try { + return Bitmap.createBitmap(size.width, size.height, Bitmap.Config.RGB_565); + } catch (OutOfMemoryError oom) { + Log.e(LOGTAG, "Unable to create bitmap", oom); + return null; + } + } + public void render() { adjustViewportWithThrottling(); } @@ -384,6 +440,37 @@ public abstract class GeckoLayerClient implements GeckoEventListener { sendResizeEventIfNecessary(false); } + /** Implementation of FlexibleGLSurfaceView.Listener */ + public void renderRequested() { + Log.e(LOGTAG, "### Render requested, scheduling composite"); + GeckoAppShell.scheduleComposite(); + } + + /** Implementation of FlexibleGLSurfaceView.Listener */ + public void compositionPauseRequested() { + Log.e(LOGTAG, "### Scheduling PauseComposition"); + GeckoAppShell.schedulePauseComposition(); + } + + /** Implementation of FlexibleGLSurfaceView.Listener */ + public void compositionResumeRequested() { + Log.e(LOGTAG, "### Scheduling ResumeComposition"); + GeckoAppShell.scheduleResumeComposition(); + } + + /** Implementation of FlexibleGLSurfaceView.Listener */ + public void surfaceChanged(int width, int height) { + compositionPauseRequested(); + mLayerController.setViewportSize(new FloatSize(width, height)); + compositionResumeRequested(); + renderRequested(); + } + + /** Implementation of VirtualLayer.Listener */ + public void dimensionsChanged(Point newOrigin, float newResolution) { + Log.e(LOGTAG, "### dimensionsChanged " + newOrigin + " " + newResolution); + } + /** Used by robocop for testing purposes. Not for production use! This is called via reflection by robocop. */ public void setDrawListener(DrawListener listener) { mDrawListener = listener;