/**
* Copyright 2008 - 2015 The Loon Game Engine Authors
*
* 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.
*
* @project loon
* @author cping
* @email:javachenpeng@yahoo.com
* @version 0.5
*/
package loon.android;
import loon.Graphics;
import loon.LTexture;
import loon.canvas.Image;
import loon.canvas.ImageImpl;
import loon.canvas.LColor;
import loon.canvas.Pattern;
import loon.opengl.GL20;
import loon.utils.Scale;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.opengl.GLUtils;
public class AndroidImage extends ImageImpl {
protected Bitmap bitmap;
public AndroidImage(Graphics gfx, Scale scale, Bitmap bitmap, String source) {
super(gfx, scale, bitmap.getWidth(), bitmap.getHeight(), source, bitmap);
}
public AndroidImage(AndroidGame game, boolean async, int preWidth,
int preHeight, String source) {
super(game, async, Scale.ONE, preWidth, preHeight, source);
if (this.bitmap != null) {
AndroidRuntime.get().trackFree(bitSize(this.bitmap));
}
}
public Bitmap bitmap() {
return bitmap;
}
@Override
public Pattern createPattern(boolean repeatX, boolean repeatY) {
return new AndroidPattern(repeatX, repeatY, bitmap);
}
@Override
public void getRGB(int startX, int startY, int width, int height,
int[] rgbArray, int offset, int scanSize) {
if (width <= 0 || height <= 0){
return;
}
bitmap.getPixels(rgbArray, offset, scanSize, startX, startY, width,
height);
}
@Override
public void setRGB(int startX, int startY, int width, int height,
int[] rgbArray, int offset, int scanSize) {
if (width <= 0 || height <= 0){
return;
}
bitmap.setPixels(rgbArray, offset, scanSize, startX, startY, width,
height);
}
@Override
public Image transform(BitmapTransformer xform) {
Bitmap nbitmap = ((AndroidTransformer) xform).transform(bitmap);
return new AndroidImage(gfx, scale, nbitmap, source);
}
@Override
public void draw(Object ctx, float x, float y, float w, float h) {
draw(ctx, x, y, w, h, 0, 0, width(), height());
}
@Override
public void draw(Object ctx, float dx, float dy, float dw, float dh,
float sx, float sy, float sw, float sh) {
sx *= scale.factor;
sy *= scale.factor;
sw *= scale.factor;
sh *= scale.factor;
AndroidCanvas canvas = ((AndroidCanvas) ctx);
canvas.draw(bitmap, dx, dy, dw, dh, sx, sy, sw, sh);
}
@Override
public String toString() {
return "Image[src=" + source + ", bitmap=" + bitmap + "]";
}
@Override
public void upload(Graphics gfx, LTexture tex) {
gfx.gl.glBindTexture(GL20.GL_TEXTURE_2D, tex.getID());
GLUtils.texImage2D(GL20.GL_TEXTURE_2D, 0, bitmap, 0);
gfx.gl.checkError("updateTexture end");
}
@Override
protected void setBitmap(Object bitmap) {
this.bitmap = (Bitmap) bitmap;
if (this.bitmap != null) {
AndroidRuntime.get().trackFree(bitSize(this.bitmap));
}
}
@Override
protected Object createErrorBitmap(int pixelWidth, int pixelHeight) {
Bitmap bitmap = Bitmap.createBitmap(pixelWidth, pixelHeight,
Bitmap.Config.ARGB_4444);
android.graphics.Canvas c = new android.graphics.Canvas(bitmap);
android.graphics.Paint p = new android.graphics.Paint();
p.setColor(android.graphics.Color.RED);
for (int yy = 0; yy <= pixelHeight / 15; yy++) {
for (int xx = 0; xx <= pixelWidth / 45; xx++) {
c.drawText("ERROR", xx * 45, yy * 15, p);
}
}
return bitmap;
}
private int bitSize(Bitmap b) {
return b.getRowBytes() * b.getHeight();
}
public void getLight(Image buffer, int v) {
int width = (int) buffer.width();
int height = (int) buffer.height();
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
int rgbValue = buffer.getRGB(x, y);
if (rgbValue != 0) {
int color = getLight(rgbValue, v);
buffer.setRGB(color, x, y);
}
}
}
}
public int getLight(int color, int v) {
int red = LColor.getRed(color);
int green = LColor.getGreen(color);
int blue = LColor.getBlue(color);
red += v;
green += v;
blue += v;
blue = blue > 255 ? 255 : blue;
red = red > 255 ? 255 : red;
green = green > 255 ? 255 : green;
red = red < 0 ? 0 : red;
green = green < 0 ? 0 : green;
blue = blue < 0 ? 0 : blue;
return LColor.getRGB(red, green, blue);
}
@Override
public int[] getPixels() {
int w = (int) width();
int h = (int) height();
int pixels[] = new int[w * h];
bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
return pixels;
}
@Override
public int[] getPixels(int[] pixels) {
int w = (int) width();
int h = (int) height();
bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
return pixels;
}
@Override
public int[] getPixels(int x, int y, int w, int h) {
int[] pixels = new int[w * h];
bitmap.getPixels(pixels, 0, w, x, y, w, h);
return pixels;
}
@Override
public int[] getPixels(int offset, int stride, int x, int y, int w, int h) {
int pixels[] = new int[w * h];
bitmap.getPixels(pixels, offset, stride, x, y, w, h);
return pixels;
}
@Override
public int[] getPixels(int pixels[], int offset, int stride, int x, int y,
int width, int height) {
bitmap.getPixels(pixels, offset, stride, x, y, width, height);
return pixels;
}
@Override
public void setPixels(int[] pixels, int w, int h) {
bitmap.setPixels(pixels, 0, w, 0, 0, w, h);
}
@Override
public void setPixels(int[] pixels, int offset, int stride, int x, int y,
int width, int height) {
bitmap.setPixels(pixels, offset, stride, x, y, width, height);
}
@Override
public int[] setPixels(int[] pixels, int x, int y, int w, int h) {
bitmap.setPixels(pixels, 0, w, x, y, w, h);
return pixels;
}
@Override
public void setPixel(LColor c, int x, int y) {
bitmap.setPixel(x, y, c.getRGB());
}
@Override
public void setPixel(int rgb, int x, int y) {
bitmap.setPixel(x, y, rgb);
}
@Override
public int getPixel(int x, int y) {
return bitmap.getPixel(x, y);
}
@Override
public int getRGB(int x, int y) {
return bitmap.getPixel(x, y);
}
@Override
public void setRGB(int rgb, int x, int y) {
bitmap.setPixel(x, y, rgb);
}
@Override
public Image getSubImage(int x, int y, int w, int h) {
return AndroidGraphicsUtils.drawClipImage(this, w, h, x, y,
bitmap.getConfig());
}
@Override
public boolean hasAlpha() {
if (bitmap == null) {
return false;
}
if (bitmap.getConfig() == Config.RGB_565) {
return false;
}
return bitmap.hasAlpha();
}
@Override
protected void closeImpl() {
if (this.bitmap != null) {
AndroidRuntime.get().trackAlloc(bitSize(this.bitmap));
this.bitmap.recycle();
this.bitmap = null;
}
}
}