blob: 82ea7420c73e2eb08284cb1a537c7443ddc2c7a6 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.replica.replicaisland;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11Ext;
/**
* Draws a screen-aligned bitmap to the screen.
*/
public class DrawableBitmap extends DrawableObject {
private Texture mTexture;
private int mWidth;
private int mHeight;
private int mCrop[];
private int mViewWidth;
private int mViewHeight;
private float mOpacity;
DrawableBitmap(Texture texture, int width, int height) {
super();
mTexture = texture;
mWidth = width;
mHeight = height;
mCrop = new int[4];
mViewWidth = 0;
mViewHeight = 0;
mOpacity = 1.0f;
setCrop(0, height, width, height);
}
public void reset() {
mTexture = null;
mViewWidth = 0;
mViewHeight = 0;
mOpacity = 1.0f;
}
public void setViewSize(int width, int height) {
mViewHeight = height;
mViewWidth = width;
}
public void setOpacity(float opacity) {
mOpacity = opacity;
}
/**
* Begins drawing bitmaps. Sets the OpenGL state for rapid drawing.
*
* @param gl A pointer to the OpenGL context.
* @param viewWidth The width of the screen.
* @param viewHeight The height of the screen.
*/
public static void beginDrawing(GL10 gl, float viewWidth, float viewHeight) {
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glOrthof(0.0f, viewWidth, 0.0f, viewHeight, 0.0f, 1.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glEnable(GL10.GL_TEXTURE_2D);
}
/**
* Draw the bitmap at a given x,y position, expressed in pixels, with the
* lower-left-hand-corner of the view being (0,0).
*
* @param gl A pointer to the OpenGL context
* @param x The number of pixels to offset this drawable's origin in the x-axis.
* @param y The number of pixels to offset this drawable's origin in the y-axis
* @param scaleX The horizontal scale factor between the bitmap resolution and the display resolution.
* @param scaleY The vertical scale factor between the bitmap resolution and the display resolution.
*/
@Override
public void draw(float x, float y, float scaleX, float scaleY) {
GL10 gl = OpenGLSystem.getGL();
final Texture texture = mTexture;
if (gl != null && texture != null) {
assert texture.loaded;
final float snappedX = (int) x;
final float snappedY = (int) y;
final float opacity = mOpacity;
final float width = mWidth;
final float height = mHeight;
final float viewWidth = mViewWidth;
final float viewHeight = mViewHeight;
boolean cull = false;
if (viewWidth > 0) {
if (snappedX + width < 0.0f
|| snappedX > viewWidth
|| snappedY + height < 0.0f
|| snappedY > viewHeight
|| opacity == 0.0f
|| !texture.loaded) {
cull = true;
}
}
if (!cull) {
OpenGLSystem.bindTexture(GL10.GL_TEXTURE_2D, texture.name);
// This is necessary because we could be drawing the same texture with different
// crop (say, flipped horizontally) on the same frame.
OpenGLSystem.setTextureCrop(mCrop);
if (opacity < 1.0f) {
gl.glColor4f(opacity, opacity, opacity, opacity);
}
((GL11Ext) gl).glDrawTexfOES(snappedX * scaleX, snappedY * scaleY,
getPriority(), width * scaleX, height * scaleY);
if (opacity < 1.0f) {
gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
}
}
}
/**
* Ends the drawing and restores the OpenGL state.
*
* @param gl A pointer to the OpenGL context.
*/
public static void endDrawing(GL10 gl) {
gl.glDisable(GL10.GL_BLEND);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
}
public void resize(int width, int height) {
mWidth = width;
mHeight = height;
setCrop(0, height, width, height);
}
public int getWidth() {
return mWidth;
}
public void setWidth(int width) {
mWidth = width;
}
public int getHeight() {
return mHeight;
}
public void setHeight(int height) {
mHeight = height;
}
/**
* Changes the crop parameters of this bitmap. Note that the underlying OpenGL texture's
* parameters are not changed immediately The crop is updated on the
* next call to draw(). Note that the image may be flipped by providing a negative width or
* height.
*
* @param left
* @param bottom
* @param width
* @param height
*/
public void setCrop(int left, int bottom, int width, int height) {
// Negative width and height values will flip the image.
mCrop[0] = left;
mCrop[1] = bottom;
mCrop[2] = width;
mCrop[3] = -height;
}
public int[] getCrop() {
return mCrop;
}
public void setTexture(Texture texture) {
mTexture = texture;
}
@Override
public Texture getTexture() {
return mTexture;
}
@Override
public boolean visibleAtPosition(Vector2 position) {
boolean cull = false;
if (mViewWidth > 0) {
if (position.x + mWidth < 0 || position.x > mViewWidth
|| position.y + mHeight < 0 || position.y > mViewHeight) {
cull = true;
}
}
return !cull;
}
protected final void setFlip(boolean horzFlip, boolean vertFlip) {
setCrop(horzFlip ? mWidth : 0,
vertFlip ? 0 : mHeight,
horzFlip ? -mWidth : mWidth,
vertFlip ? -mHeight : mHeight);
}
}