6package org.mozilla.gecko.gfx;
8import android.graphics.Color;
9import android.graphics.Point;
10import android.graphics.Rect;
11import android.graphics.RectF;
12import android.opengl.GLES20;
13import android.opengl.GLSurfaceView;
14import android.os.SystemClock;
15import android.util.Log;
20import java.nio.ByteBuffer;
21import java.nio.ByteOrder;
22import java.nio.FloatBuffer;
23import java.nio.IntBuffer;
24import java.util.concurrent.CopyOnWriteArrayList;
26import javax.microedition.khronos.egl.EGLConfig;
27import javax.microedition.khronos.opengles.GL10;
53 private CopyOnWriteArrayList<Layer>
mExtraLayers =
new CopyOnWriteArrayList<Layer>();
69 2.0f, 0.0f, 0.0f, 0.0f,
70 0.0f, 2.0f, 0.0f, 0.0f,
71 0.0f, 0.0f, 2.0f, 0.0f,
72 -1.0f, -1.0f, 0.0f, 1.0f
85 "uniform mat4 uTMatrix;\n" +
86 "attribute vec4 vPosition;\n" +
87 "attribute vec2 aTexCoord;\n" +
88 "varying vec2 vTexCoord;\n" +
90 " gl_Position = uTMatrix * vPosition;\n" +
91 " vTexCoord.x = aTexCoord.x;\n" +
92 " vTexCoord.y = 1.0 - aTexCoord.y;\n" +
101 "precision highp float;\n" +
102 "varying vec2 vTexCoord;\n" +
103 "uniform sampler2D sTexture;\n" +
105 " gl_FragColor = texture2D(sTexture, vTexCoord);\n" +
158 mProgram = GLES20.glCreateProgram();
159 GLES20.glAttachShader(
mProgram, vertexShader);
160 GLES20.glAttachShader(
mProgram, fragmentShader);
169 int maxTextureSizeResult[] =
new int[1];
170 GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSizeResult, 0);
197 GLES20.glUseProgram(0);
228 frame.drawRootLayer();
244 return createContext(
new RectF(viewport), pageRect, zoomFactor);
253 GLES20.glViewport(0, 0, width, height);
261 int shader = GLES20.glCreateShader(
type);
262 GLES20.glShaderSource(shader, shaderCode);
263 GLES20.glCompileShader(shader);
268 return new Frame(metrics);
271 class FadeRunnable
implements Runnable {
272 private boolean mStarted;
275 void scheduleStartFade(
long delay) {
276 mRunAt = SystemClock.elapsedRealtime() + delay;
278 mView.postDelayed(
this, delay);
283 void scheduleNextFadeFrame() {
285 Log.e(
LOGTAG,
"scheduleNextFadeFrame() called while scheduled for starting fade");
287 mView.postDelayed(
this, 1000L / 60L);
290 boolean timeToFade() {
295 long timeDelta = mRunAt - SystemClock.elapsedRealtime();
298 mView.postDelayed(
this, timeDelta);
327 GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
328 GLES20.glScissor(scissorRect.left, scissorRect.top,
329 scissorRect.width(), scissorRect.height());
336 int top =
Math.max(0, rect.top);
347 pageRect.offset(-origin.x, -origin.y);
409 if (mask.left <= 2) {
418 if (mask.right >= pageRight - 2) {
419 mask.right = pageRight + 1;
421 if (mask.bottom >= pageBottom - 2) {
422 mask.bottom = pageBottom + 1;
430 GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
442 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT |
443 GLES20.GL_DEPTH_BUFFER_BIT);
450 RectF untransformedPageRect =
new RectF(0.0f, 0.0f,
mPageRect.width(),
462 void drawRootLayer() {
464 if (lowResLayer ==
null) {
470 if (rootLayer ==
null) {
482 if (!layer.usesDefaultProgram())
487 if (!layer.usesDefaultProgram())
509 if (
mUpdated && pixelBuffer !=
null) {
510 synchronized (pixelBuffer) {
511 pixelBuffer.position(0);
514 GLES20.GL_UNSIGNED_BYTE, pixelBuffer);
515 pixelBuffer.notify();
A Cairo image that simply saves a buffer of pixel data.
ImmutableViewportMetrics getViewportMetrics()
Implementation of PanZoomTarget.
ImmutableViewportMetrics are used to store the viewport metrics in way that we can access a version o...
RenderContext mScreenContext
Rect getMaskForLayer(Layer layer)
Retrieves the bounds for the layer, rounded in such a way that it can be used as a mask for something...
void endDrawing()
This function is invoked via JNI; be careful when modifying signature.
void drawBackground()
This function is invoked via JNI; be careful when modifying signature.
ImmutableViewportMetrics mFrameMetrics
Rect transformToScissorRect(Rect rect)
void beginDrawing()
This function is invoked via JNI; be careful when modifying signature.
Frame(ImmutableViewportMetrics metrics)
RenderContext mPageContext
void drawForeground()
This function is invoked via JNI; be careful when modifying signature.
The layer renderer implements the rendering logic for a layer view.
ByteBuffer mCoordByteBuffer
static final float[] DEFAULT_TEXTURE_MATRIX
RenderContext createScreenContext(ImmutableViewportMetrics metrics)
final ScrollbarLayer mHorizScrollLayer
void removeLayer(Layer layer)
void createDefaultProgram()
final SingleTileLayer mBackgroundLayer
static final String LOGTAG
CopyOnWriteArrayList< Layer > mExtraLayers
final ScrollbarLayer mVertScrollLayer
static int loadShader(int type, String shaderCode)
static final int COORD_BUFFER_SIZE
void onDrawFrame(GL10 gl)
Called whenever a new frame is about to be drawn.
void deactivateDefaultProgram()
void onSurfaceCreated(GL10 gl, EGLConfig config)
static final String DEFAULT_VERTEX_SHADER
LayerRenderer(LayerView view)
RenderContext createPageContext(ImmutableViewportMetrics metrics)
final NinePatchTileLayer mShadowLayer
static final String DEFAULT_FRAGMENT_SHADER
void addLayer(Layer layer)
void activateDefaultProgram()
RenderContext createContext(RectF viewport, RectF pageRect, float zoomFactor)
void onSurfaceChanged(GL10 gl, final int width, final int height)
RenderContext mLastPageContext
static final int MAX_FRAME_TIME
final FadeRunnable mFadeRunnable
Frame createFrame(ImmutableViewportMetrics metrics)
A view rendered by the layer compositor.
GeckoLayerClient getLayerClient()
boolean fuzzyEquals(RenderContext other)
abstract void draw(RenderContext context)
Subclasses override this function to draw the layer.
final boolean update(RenderContext context)
Updates the layer.
RectF getBounds(RenderContext context)
Given the intrinsic size of the layer, returns the pixel boundaries of the layer rect.
Encapsulates the logic needed to draw a nine-patch bitmap using OpenGL ES.
void draw(RenderContext context)
Subclasses override this function to draw the layer.
static Point round(PointF point)
static Rect round(RectF rect)
Returns the nearest integer rect of the given rect.
static RectF contract(RectF rect, float lessWidth, float lessHeight)
static Rect roundIn(RectF rect)
Encapsulates the logic needed to draw a single textured tile.
void setMask(Rect aMaskRect)
Set an area to mask out when rendering.
void draw(RenderContext context)
Subclasses override this function to draw the layer.
static TextureGenerator get()
Manages a list of dead tiles, so we don't leak resources.
static TextureReaper get()
def run(arg=None, arg2=-1)
const wchar_t *typedef int(__stdcall *DllNativeUnregProc)(int