package com.iwedia.gui.osd.curleffect; import android.graphics.PointF; import android.graphics.RectF; import android.opengl.GLSurfaceView; import android.opengl.GLU; import android.util.Log; import com.iwedia.gui.config_handler.ConfigHandler; import java.util.Vector; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; /** * Open GL renderer class. */ public class CurlRenderer implements GLSurfaceView.Renderer { private final String TAG = "CurlRenderer"; /** Background fill color. */ private int mBackgroundColor; /** Curl meshes used for static and dynamic rendering. */ private Vector<CurlMesh> mCurlMeshes; private CurlRenderer.Observer mObserver; /** Page rectangle. */ private RectF mPageRect; /** Screen size. */ private int mViewportWidth, mViewportHeight; /** Rect for render area. */ private RectF mViewRect = new RectF(); /** Constructor */ public CurlRenderer(CurlRenderer.Observer observer) { mObserver = observer; mCurlMeshes = new Vector<CurlMesh>(); mPageRect = new RectF(); } /** Adds CurlMesh to this renderer. */ public synchronized void addCurlMesh(CurlMesh mesh) { removeCurlMesh(mesh); mCurlMeshes.add(mesh); } public RectF getPageRect() { return mPageRect; } public synchronized void onDrawFrame(GL10 gl) { mObserver.onDrawFrame(); gl.glLoadIdentity(); for (int i = 0; i < mCurlMeshes.size(); ++i) { mCurlMeshes.get(i).onDrawFrame(gl); } } public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glViewport(0, 0, width, height); mViewportWidth = width; mViewportHeight = height; float ratio = (float) width / height; mViewRect.top = 1.0f; mViewRect.bottom = -1.0f; mViewRect.left = -ratio; mViewRect.right = ratio; updatePageRects(); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); GLU.gluOrtho2D(gl, mViewRect.left, mViewRect.right, mViewRect.bottom, mViewRect.top); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(0f, 0f, 0f, 1f); gl.glShadeModel(GL10.GL_SMOOTH); if (ConfigHandler.CURL_GRAPHIC_QUALITY) { /** With MultisampleConfigChooser */ gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST); gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST); } gl.glEnable(GL10.GL_LINE_SMOOTH); gl.glDisable(GL10.GL_DEPTH_TEST); gl.glDisable(GL10.GL_CULL_FACE); mObserver.onSurfaceCreated(); } /** Removes CurlMesh from this renderer. */ public synchronized void removeCurlMesh(CurlMesh mesh) { while (mCurlMeshes.remove(mesh)) { Log.i(TAG, "Removing Curl Mesh."); } } /** Change background/clear color. */ public void setBackgroundColor(int color) { mBackgroundColor = color; } /** Translates screen coordinates into view coordinates. */ public void translate(PointF pt) { pt.x = mViewRect.left + (mViewRect.width() * pt.x / mViewportWidth); pt.y = mViewRect.top - (-mViewRect.height() * pt.y / mViewportHeight); } /** Recalculates page rectangles. */ private void updatePageRects() { if (0 == mViewRect.width() || 0 == mViewRect.height()) { return; } else { mPageRect.set(mViewRect); int bitmapW = (int) ((mPageRect.width() * mViewportWidth) / mViewRect .width()); int bitmapH = (int) ((mPageRect.height() * mViewportHeight) / mViewRect .height()); mObserver.onPageSizeChanged(bitmapW, bitmapH); } } /** Observer for waiting render engine/state updates. */ public interface Observer { /** * Called from onDrawFrame called before rendering is started. This is * intended to be used for animation purposes. */ public void onDrawFrame(); /** * Called once page size is changed. Width and height tell the page size * in pixels making it possible to update textures accordingly. */ public void onPageSizeChanged(int width, int height); public void onSurfaceCreated(); } }