Kaydet (Commit) 842d8fb5 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

LOAndroid3: Add and use DirectBufferAllocator

Change-Id: I20a1de3a18deab6b978192d1d8a54278addbb083
üst e7b401d9
package org.libreoffice;
import java.nio.ByteBuffer;
public class DirectBufferAllocator {
public static ByteBuffer allocate(int size) {
if (size <= 0) {
throw new IllegalArgumentException("Invalid size " + size);
}
ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);
//ByteBuffer directBuffer = nativeAllocateDirectBuffer(size);
if (directBuffer == null) {
throw new OutOfMemoryError("allocateDirectBuffer() returned null");
} else if (!directBuffer.isDirect()) {
throw new AssertionError("allocateDirectBuffer() did not return a direct buffer");
}
return directBuffer;
}
public static ByteBuffer free(ByteBuffer buffer) {
if (buffer == null) {
return null;
}
if (!buffer.isDirect()) {
throw new IllegalArgumentException("buffer must be direct");
}
//nativeFreeDirectBuffer(buffer);
return buffer;
}
}
...@@ -3,15 +3,6 @@ package org.libreoffice; ...@@ -3,15 +3,6 @@ package org.libreoffice;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import org.mozilla.gecko.gfx.GeckoSoftwareLayerClient;
import org.mozilla.gecko.gfx.IntSize;
import org.mozilla.gecko.gfx.LayerController;
import org.mozilla.gecko.gfx.LayerView;
import java.nio.ByteBuffer;
public class LOKitShell { public class LOKitShell {
private static final String LOGTAG = LOKitShell.class.getSimpleName(); private static final String LOGTAG = LOKitShell.class.getSimpleName();
...@@ -21,39 +12,13 @@ public class LOKitShell { ...@@ -21,39 +12,13 @@ public class LOKitShell {
return (int) metrics.density * 160; return (int) metrics.density * 160;
} }
public static ByteBuffer allocateDirectBuffer(int size) {
if (size <= 0) {
throw new IllegalArgumentException("Invalid size " + size);
}
ByteBuffer directBuffer = ByteBuffer.allocateDirect(size);
//ByteBuffer directBuffer = nativeAllocateDirectBuffer(size);
if (directBuffer == null) {
throw new OutOfMemoryError("allocateDirectBuffer() returned null");
} else if (!directBuffer.isDirect()) {
throw new AssertionError("allocateDirectBuffer() did not return a direct buffer");
}
return directBuffer;
}
public static void freeDirectBuffer(ByteBuffer buffer) {
if (buffer == null) {
return;
}
if (!buffer.isDirect()) {
throw new IllegalArgumentException("buffer must be direct");
}
//nativeFreeDirectBuffer(buffer);
return ;
}
public static void bindWidgetTexture() { public static void bindWidgetTexture() {
} }
public static void sendEvent(LOEvent event) { public static void sendEvent(LOEvent event) {
Log.i(LOGTAG, "Event: " + event.getTypeString()); if (LibreOfficeMainActivity.mAppContext != null && LibreOfficeMainActivity.mAppContext.getLOKitThread() != null) {
LibreOfficeMainActivity.mAppContext.getLOKitThread().queueEvent(event);
}
} }
public static void runGecko(String apkPath, String args, String url, boolean restoreSession) { public static void runGecko(String apkPath, String args, String url, boolean restoreSession) {
...@@ -85,27 +50,10 @@ public class LOKitShell { ...@@ -85,27 +50,10 @@ public class LOKitShell {
geckoLoaded(); geckoLoaded();
} }
}); });
//LOKitShell.nativeRun(combinedArgs);
} }
// Called on the UI thread after Gecko loads. // Called on the UI thread after Gecko loads.
private static void geckoLoaded() { private static void geckoLoaded() {
/*final LayerController layerController = LibreOfficeMainActivity.mAppContext.getLayerController();
LayerView v = layerController.getView();
mInputConnection = GeckoInputConnection.create(v);
v.setInputConnectionHandler(mInputConnection);
layerController.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
if (event == null)
return true;
GeckoAppShell.sendEventToGecko(new GeckoEvent(event));
return true;
}
});
layerController.notifyLayerClientOfGeometryChange();*/
} }
public static void viewSizeChanged() { public static void viewSizeChanged() {
......
...@@ -39,7 +39,7 @@ package org.mozilla.gecko.gfx; ...@@ -39,7 +39,7 @@ package org.mozilla.gecko.gfx;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import org.libreoffice.LOKitShell; import org.libreoffice.DirectBufferAllocator;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
...@@ -71,15 +71,16 @@ public class BufferedCairoImage extends CairoImage { ...@@ -71,15 +71,16 @@ public class BufferedCairoImage extends CairoImage {
mSize = new IntSize(bitmap.getWidth(), bitmap.getHeight()); mSize = new IntSize(bitmap.getWidth(), bitmap.getHeight());
mNeedToFreeBuffer = true; mNeedToFreeBuffer = true;
// XXX Why is this * 4? Shouldn't it depend on mFormat? // XXX Why is this * 4? Shouldn't it depend on mFormat?
mBuffer = LOKitShell.allocateDirectBuffer(mSize.getArea() * 4); mBuffer = DirectBufferAllocator.allocate(mSize.getArea() * 4);
bitmap.copyPixelsToBuffer(mBuffer.asIntBuffer()); bitmap.copyPixelsToBuffer(mBuffer.asIntBuffer());
} }
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
try { try {
if (mNeedToFreeBuffer && mBuffer != null) if (mNeedToFreeBuffer && mBuffer != null) {
LOKitShell.freeDirectBuffer(mBuffer); DirectBufferAllocator.free(mBuffer);
}
mNeedToFreeBuffer = false; mNeedToFreeBuffer = false;
mBuffer = null; mBuffer = null;
} finally { } finally {
......
...@@ -37,8 +37,10 @@ ...@@ -37,8 +37,10 @@
package org.mozilla.gecko.gfx; package org.mozilla.gecko.gfx;
import org.libreoffice.LOKitShell;
import android.graphics.Color; import android.graphics.Color;
import org.libreoffice.DirectBufferAllocator;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import java.util.Arrays; import java.util.Arrays;
...@@ -61,7 +63,7 @@ public class CheckerboardImage extends CairoImage { ...@@ -61,7 +63,7 @@ public class CheckerboardImage extends CairoImage {
/** Creates a new checkerboard image. */ /** Creates a new checkerboard image. */
public CheckerboardImage() { public CheckerboardImage() {
int bpp = CairoUtils.bitsPerPixelForCairoFormat(FORMAT); int bpp = CairoUtils.bitsPerPixelForCairoFormat(FORMAT);
mBuffer = LOKitShell.allocateDirectBuffer(SIZE * SIZE * bpp / 8); mBuffer = DirectBufferAllocator.allocate(SIZE * SIZE * bpp / 8);
update(true, Color.WHITE); update(true, Color.WHITE);
} }
...@@ -145,7 +147,7 @@ public class CheckerboardImage extends CairoImage { ...@@ -145,7 +147,7 @@ public class CheckerboardImage extends CairoImage {
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
try { try {
if (mBuffer != null) { if (mBuffer != null) {
LOKitShell.freeDirectBuffer(mBuffer); DirectBufferAllocator.free(mBuffer);
} }
} finally { } finally {
super.finalize(); super.finalize();
......
...@@ -64,6 +64,7 @@ public abstract class GeckoLayerClient implements GeckoEventListener { ...@@ -64,6 +64,7 @@ public abstract class GeckoLayerClient implements GeckoEventListener {
protected ViewportMetrics mGeckoViewport; protected ViewportMetrics mGeckoViewport;
/* The viewport that Gecko will display when drawing is finished */ /* The viewport that Gecko will display when drawing is finished */
protected ViewportMetrics mNewGeckoViewport; protected ViewportMetrics mNewGeckoViewport;
protected LayerController mLayerController;
private long mLastViewportChangeTime; private long mLastViewportChangeTime;
private boolean mPendingViewportAdjust; private boolean mPendingViewportAdjust;
private boolean mViewportSizeChanged; private boolean mViewportSizeChanged;
......
...@@ -39,21 +39,9 @@ ...@@ -39,21 +39,9 @@
package org.mozilla.gecko.gfx; package org.mozilla.gecko.gfx;
import org.libreoffice.LOKitShell;
import org.mozilla.gecko.gfx.BufferedCairoImage;
import org.mozilla.gecko.gfx.IntSize;
import org.mozilla.gecko.gfx.Layer.RenderContext;
import org.mozilla.gecko.gfx.LayerController;
import org.mozilla.gecko.gfx.NinePatchTileLayer;
import org.mozilla.gecko.gfx.SingleTileLayer;
import org.mozilla.gecko.gfx.TextureReaper;
import org.mozilla.gecko.gfx.TextureGenerator;
import org.mozilla.gecko.gfx.TextLayer;
import org.mozilla.gecko.gfx.TileLayer;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Region; import android.graphics.Region;
...@@ -61,17 +49,20 @@ import android.graphics.RegionIterator; ...@@ -61,17 +49,20 @@ import android.graphics.RegionIterator;
import android.opengl.GLES20; import android.opengl.GLES20;
import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.WindowManager;
import javax.microedition.khronos.egl.EGLConfig; import org.libreoffice.DirectBufferAllocator;
import javax.microedition.khronos.opengles.GL10; import org.mozilla.gecko.gfx.Layer.RenderContext;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
/** /**
* The layer renderer implements the rendering logic for a layer view. * The layer renderer implements the rendering logic for a layer view.
*/ */
...@@ -186,7 +177,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer { ...@@ -186,7 +177,7 @@ public class LayerRenderer implements GLSurfaceView.Renderer {
// Initialize the FloatBuffer that will be used to store all vertices and texture // Initialize the FloatBuffer that will be used to store all vertices and texture
// coordinates in draw() commands. // coordinates in draw() commands.
ByteBuffer byteBuffer = LOKitShell.allocateDirectBuffer(COORD_BUFFER_SIZE * 4); ByteBuffer byteBuffer = DirectBufferAllocator.allocate(COORD_BUFFER_SIZE * 4);
byteBuffer.order(ByteOrder.nativeOrder()); byteBuffer.order(ByteOrder.nativeOrder());
mCoordBuffer = byteBuffer.asFloatBuffer(); mCoordBuffer = byteBuffer.asFloatBuffer();
} }
......
...@@ -47,7 +47,7 @@ import android.graphics.Rect; ...@@ -47,7 +47,7 @@ import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.opengl.GLES20; import android.opengl.GLES20;
import org.libreoffice.LOKitShell; import org.libreoffice.DirectBufferAllocator;
import org.mozilla.gecko.util.FloatUtils; import org.mozilla.gecko.util.FloatUtils;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
...@@ -128,7 +128,7 @@ public class ScrollbarLayer extends TileLayer { ...@@ -128,7 +128,7 @@ public class ScrollbarLayer extends TileLayer {
// just create an empty image for now, it will get drawn // just create an empty image for now, it will get drawn
// on demand anyway // on demand anyway
int imageSize = IntSize.nextPowerOfTwo(BAR_SIZE); int imageSize = IntSize.nextPowerOfTwo(BAR_SIZE);
ByteBuffer buffer = LOKitShell.allocateDirectBuffer(imageSize * imageSize * 4); ByteBuffer buffer = DirectBufferAllocator.allocate(imageSize * imageSize * 4);
CairoImage image = new BufferedCairoImage(buffer, imageSize, imageSize, CairoImage image = new BufferedCairoImage(buffer, imageSize, imageSize,
CairoImage.FORMAT_ARGB32); CairoImage.FORMAT_ARGB32);
return new ScrollbarLayer(image, vertical, buffer); return new ScrollbarLayer(image, vertical, buffer);
...@@ -136,8 +136,9 @@ public class ScrollbarLayer extends TileLayer { ...@@ -136,8 +136,9 @@ public class ScrollbarLayer extends TileLayer {
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
try { try {
if (!mFinalized && mBuffer != null) if (!mFinalized && mBuffer != null) {
LOKitShell.freeDirectBuffer(mBuffer); DirectBufferAllocator.free(mBuffer);
}
mFinalized = true; mFinalized = true;
} finally { } finally {
super.finalize(); super.finalize();
......
...@@ -38,19 +38,15 @@ ...@@ -38,19 +38,15 @@
package org.mozilla.gecko.gfx; package org.mozilla.gecko.gfx;
//import org.mozilla.gecko.GeckoAppShell; //import org.mozilla.gecko.GeckoAppShell;
import org.libreoffice.LOKitShell;
import org.mozilla.gecko.gfx.BufferedCairoImage;
import org.mozilla.gecko.gfx.CairoImage;
import org.mozilla.gecko.gfx.IntSize;
import org.mozilla.gecko.gfx.SingleTileLayer;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.util.Log;
import org.libreoffice.DirectBufferAllocator;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.IntBuffer;
/** /**
* Draws text on a layer. This is used for the frame rate meter. * Draws text on a layer. This is used for the frame rate meter.
...@@ -73,8 +69,9 @@ public class TextLayer extends SingleTileLayer { ...@@ -73,8 +69,9 @@ public class TextLayer extends SingleTileLayer {
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
try { try {
if (!mFinalized && mBuffer != null) if (!mFinalized && mBuffer != null) {
/*GeckoAppShell*/ LOKitShell.freeDirectBuffer(mBuffer); DirectBufferAllocator.free(mBuffer);
}
mFinalized = true; mFinalized = true;
} finally { } finally {
super.finalize(); super.finalize();
...@@ -82,9 +79,8 @@ public class TextLayer extends SingleTileLayer { ...@@ -82,9 +79,8 @@ public class TextLayer extends SingleTileLayer {
} }
public static TextLayer create(IntSize size, String text) { public static TextLayer create(IntSize size, String text) {
ByteBuffer buffer = /*GeckoAppShell*/LOKitShell.allocateDirectBuffer(size.width * size.height * 4); ByteBuffer buffer = DirectBufferAllocator.allocate(size.width * size.height * 4);
BufferedCairoImage image = new BufferedCairoImage(buffer, size.width, size.height, BufferedCairoImage image = new BufferedCairoImage(buffer, size.width, size.height, CairoImage.FORMAT_ARGB32);
CairoImage.FORMAT_ARGB32);
return new TextLayer(buffer, image, size, text); return new TextLayer(buffer, image, size, text);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment