1e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka/* 2e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Copyright (C) 2010 The Android Open Source Project 3e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 4e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Licensed under the Apache License, Version 2.0 (the "License"); 5e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * you may not use this file except in compliance with the License. 6e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * You may obtain a copy of the License at 7e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 8e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * http://www.apache.org/licenses/LICENSE-2.0 9e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 10e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Unless required by applicable law or agreed to in writing, software 11e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * distributed under the License is distributed on an "AS IS" BASIS, 12e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * See the License for the specific language governing permissions and 14e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * limitations under the License. 15e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 16e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 17e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkapackage com.android.gallery3d.glrenderer; 18e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 19e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkaimport android.graphics.Bitmap; 20e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkaimport android.graphics.Rect; 21e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkaimport android.graphics.RectF; 22e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 23e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkaimport javax.microedition.khronos.opengles.GL11; 24e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 25e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// 26e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// GLCanvas gives a convenient interface to draw using OpenGL. 27e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// 28e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// When a rectangle is specified in this interface, it means the region 29e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// [x, x+width) * [y, y+height) 30e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka// 31e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurkapublic interface GLCanvas { 32e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 33e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public GLId getGLId(); 34e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 35e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Tells GLCanvas the size of the underlying GL surface. This should be 36e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // called before first drawing and when the size of GL surface is changed. 37e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // This is called by GLRoot and should not be called by the clients 38e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // who only want to draw on the GLCanvas. Both width and height must be 39e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // nonnegative. 40e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void setSize(int width, int height); 41e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 42e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Clear the drawing buffers. This should only be used by GLRoot. 43e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void clearBuffer(); 44e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 45e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void clearBuffer(float[] argb); 46e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 47e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Sets and gets the current alpha, alpha must be in [0, 1]. 48e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void setAlpha(float alpha); 49e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 50e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract float getAlpha(); 51e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 52e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // (current alpha) = (current alpha) * alpha 53e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void multiplyAlpha(float alpha); 54e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 55e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Change the current transform matrix. 56e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void translate(float x, float y, float z); 57e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 58e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void translate(float x, float y); 59e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 60e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void scale(float sx, float sy, float sz); 61e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 62e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void rotate(float angle, float x, float y, float z); 63e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 64e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void multiplyMatrix(float[] mMatrix, int offset); 65e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 66e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Pushes the configuration state (matrix, and alpha) onto 67e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // a private stack. 68e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void save(); 69e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 70e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Same as save(), but only save those specified in saveFlags. 71e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void save(int saveFlags); 72e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 73e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public static final int SAVE_FLAG_ALL = 0xFFFFFFFF; 74e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public static final int SAVE_FLAG_ALPHA = 0x01; 75e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public static final int SAVE_FLAG_MATRIX = 0x02; 76e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 77e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Pops from the top of the stack as current configuration state (matrix, 78e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // alpha, and clip). This call balances a previous call to save(), and is 79e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // used to remove all modifications to the configuration state since the 80e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // last save call. 81e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void restore(); 82e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 83e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draws a line using the specified paint from (x1, y1) to (x2, y2). 84e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // (Both end points are included). 85e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawLine(float x1, float y1, float x2, float y2, GLPaint paint); 86e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 87e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draws a rectangle using the specified paint from (x1, y1) to (x2, y2). 88e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // (Both end points are included). 89e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawRect(float x1, float y1, float x2, float y2, GLPaint paint); 90e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 91e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Fills the specified rectangle with the specified color. 92e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void fillRect(float x, float y, float width, float height, int color); 93e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 94e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draws a texture to the specified rectangle. 95e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawTexture( 96e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka BasicTexture texture, int x, int y, int width, int height); 97e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 98e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawMesh(BasicTexture tex, int x, int y, int xyBuffer, 99e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka int uvBuffer, int indexBuffer, int indexCount); 100e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 101e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draws the source rectangle part of the texture to the target rectangle. 102e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawTexture(BasicTexture texture, RectF source, RectF target); 103e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 104e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draw a texture with a specified texture transform. 105e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawTexture(BasicTexture texture, float[] mTextureTransform, 106e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka int x, int y, int w, int h); 107e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 108e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draw two textures to the specified rectangle. The actual texture used is 109e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // from * (1 - ratio) + to * ratio 110e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // The two textures must have the same size. 111e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawMixed(BasicTexture from, int toColor, 112e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka float ratio, int x, int y, int w, int h); 113e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 114e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Draw a region of a texture and a specified color to the specified 115e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // rectangle. The actual color used is from * (1 - ratio) + to * ratio. 116e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // The region of the texture is defined by parameter "src". The target 117e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // rectangle is specified by parameter "target". 118e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void drawMixed(BasicTexture from, int toColor, 119e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka float ratio, RectF src, RectF target); 120e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 121e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Unloads the specified texture from the canvas. The resource allocated 122e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // to draw the texture will be released. The specified texture will return 123e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // to the unloaded state. This function should be called only from 124e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // BasicTexture or its descendant 125e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract boolean unloadTexture(BasicTexture texture); 126e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 127e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Delete the specified buffer object, similar to unloadTexture. 128e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void deleteBuffer(int bufferId); 129e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 130e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Delete the textures and buffers in GL side. This function should only be 131e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // called in the GL thread. 132e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void deleteRecycledResources(); 133e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 134e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka // Dump statistics information and clear the counters. For debug only. 135e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void dumpStatisticsAndClear(); 136e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 137e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void beginRenderTarget(RawTexture texture); 138e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 139e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void endRenderTarget(); 140e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 141e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 142e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Sets texture parameters to use GL_CLAMP_TO_EDGE for both 143e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * GL_TEXTURE_WRAP_S and GL_TEXTURE_WRAP_T. Sets texture parameters to be 144e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * GL_LINEAR for GL_TEXTURE_MIN_FILTER and GL_TEXTURE_MAG_FILTER. 145e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * bindTexture() must be called prior to this. 146e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 147e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param texture The texture to set parameters on. 148e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 149e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void setTextureParameters(BasicTexture texture); 150e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 151e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 152e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Initializes the texture to a size by calling texImage2D on it. 153e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 154e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param texture The texture to initialize the size. 155e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param format The texture format (e.g. GL_RGBA) 156e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param type The texture type (e.g. GL_UNSIGNED_BYTE) 157e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 158e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void initializeTextureSize(BasicTexture texture, int format, int type); 159e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 160e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 161e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Initializes the texture to a size by calling texImage2D on it. 162e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 163e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param texture The texture to initialize the size. 164e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param bitmap The bitmap to initialize the bitmap with. 165e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 166e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void initializeTexture(BasicTexture texture, Bitmap bitmap); 167e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 168e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 169e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Calls glTexSubImage2D to upload a bitmap to the texture. 170e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 171e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param texture The target texture to write to. 172e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param xOffset Specifies a texel offset in the x direction within the 173e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * texture array. 174e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param yOffset Specifies a texel offset in the y direction within the 175e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * texture array. 176e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param format The texture format (e.g. GL_RGBA) 177e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param type The texture type (e.g. GL_UNSIGNED_BYTE) 178e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 179e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void texSubImage2D(BasicTexture texture, int xOffset, int yOffset, 180e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka Bitmap bitmap, 181e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka int format, int type); 182e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 183e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 184e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Generates buffers and uploads the buffer data. 185e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 186e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param buffer The buffer to upload 187e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @return The buffer ID that was generated. 188e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 189e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract int uploadBuffer(java.nio.FloatBuffer buffer); 190e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 191e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 192e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Generates buffers and uploads the element array buffer data. 193e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 194e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param buffer The buffer to upload 195e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @return The buffer ID that was generated. 196e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 197e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract int uploadBuffer(java.nio.ByteBuffer buffer); 198e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 199e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 200e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * After LightCycle makes GL calls, this method is called to restore the GL 201e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * configuration to the one expected by GLCanvas. 202e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 203e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void recoverFromLightCycle(); 204e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka 205e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka /** 206e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * Gets the bounds given by x, y, width, and height as well as the internal 207e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * matrix state. There is no special handling for non-90-degree rotations. 208e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * It only considers the lower-left and upper-right corners as the bounds. 209e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * 210e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param bounds The output bounds to write to. 211e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param x The left side of the input rectangle. 212e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param y The bottom of the input rectangle. 213e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param width The width of the input rectangle. 214e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka * @param height The height of the input rectangle. 215e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka */ 216e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka public abstract void getBounds(Rect bounds, int x, int y, int width, int height); 217e8d1bf7a439450b9979701909164a6baffbe8baeMichael Jurka} 218