package com.glview.hwui;
import com.glview.graphics.Bitmap;
import com.glview.libgdx.graphics.opengl.GL20;
/**
* HardwareLayer
* @author lijing.lj
*/
public final class Layer {
public final static int LAYER_TYPE_NONE = 0;
public final static int LAYER_TYPE_SOFTWARE = 1;
public final static int LAYER_TYPE_HARDWARE = 2;
Layer mNextUpdate;
boolean mLayerValid = false;
Texture mTexture;
LayerRenderer mLayerRenderer;
int mWidth, mHeight;
public Layer(int width, int height) {
mWidth = width;
mHeight = height;
mTexture = new Texture();
mTexture.setWidth(width);
mTexture.setHeight(height);
mTexture.setFormat(GL20.GL_RGBA);
mTexture.setType(GL20.GL_UNSIGNED_BYTE);
}
public int getWidth() {
return mWidth;
}
public int getHeight() {
return mHeight;
}
public boolean resize(int w, int h) {
if (w > 0 && h > 0) {
mWidth = w;
mHeight = h;
mTexture.setWidth(w);
mTexture.setHeight(h);
Caches.getInstance().textureCache.generateTexture(mTexture);
invalidate();
return true;
}
return false;
}
public boolean isValid() {
return mLayerValid;
}
void ensureLayerRenderer(GLCanvas canvas) {
if (mLayerRenderer == null) {
mLayerRenderer = (canvas instanceof GL20Canvas) ? new LayerRenderer((GL20Canvas) canvas) : null;
}
}
public void invalidate() {
mLayerValid = false;
}
public void destroy() {
invalidate();
Caches.getInstance().deleteTexture(mTexture);
}
public void destroyHardwareResource() {
mLayerValid = false;
if (mTexture != null) {
Caches.getInstance().deleteTexture(mTexture);
}
}
boolean render(GLCanvas canvas, RenderNode renderNode) {
if (!isValid()) {
updateLayer(canvas, renderNode);
}
if (isValid() && canvas instanceof GL20Canvas) {
((GL20Canvas) canvas).drawTexture(mTexture, 0, 0, mWidth, mHeight, null);
return true;
}
return false;
}
void updateLayer(GLCanvas canvas, RenderNode renderNode) {
ensureLayerRenderer(canvas);
if (mLayerRenderer == null) return;
canvas.save();
((StatefullBaseCanvas) canvas).saveViewport();
if (mTexture.mId <= 0) {
Caches.getInstance().textureCache.generateTexture(mTexture);
}
Caches.getInstance().bindTexture(mTexture);
mLayerRenderer.setSize(mWidth, mHeight);
mLayerValid = mLayerRenderer.updateTextureLayer(this, mTexture, renderNode);
canvas.restore();
}
Bitmap buildDrawingCache(GLCanvas canvas, RenderNode renderNode) {
ensureLayerRenderer(canvas);
if (mLayerRenderer == null) return null;
canvas.save();
((StatefullBaseCanvas) canvas).saveViewport();
if (mTexture.mId <= 0) {
Caches.getInstance().textureCache.generateTexture(mTexture);
}
Caches.getInstance().bindTexture(mTexture);
mLayerRenderer.setSize(mWidth, mHeight);
Bitmap bitmap = mLayerRenderer.buildDrawingCache(this, mTexture, renderNode);
canvas.restore();
return bitmap;
}
}