/** * 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.javase; import java.awt.Graphics2D; import java.awt.TexturePaint; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import loon.Graphics; import loon.LTexture; import loon.canvas.Image; import loon.canvas.ImageImpl; import loon.canvas.LColor; import loon.canvas.Pattern; import loon.utils.MathUtils; import loon.utils.Scale; public class JavaSEImage extends ImageImpl { protected BufferedImage buffer; public JavaSEImage(Graphics gfx, Scale scale, BufferedImage buffer, String source) { super(gfx, scale, buffer.getWidth(), buffer.getHeight(), source, buffer); } public JavaSEImage(JavaSEGame game, boolean async, int preWidth, int preHeight, String source) { super(game, async, Scale.ONE, preWidth, preHeight, source); } public BufferedImage bufferedImage() { return buffer; } @Override public Pattern createPattern(boolean repeatX, boolean repeatY) { assert buffer != null : "Cannot generate a pattern from unready image."; Rectangle2D rect = new Rectangle2D.Float(0, 0, width(), height()); return new JavaSEPattern(repeatX, repeatY, new TexturePaint(buffer, rect)); } @Override public Image transform(BitmapTransformer xform) { return new JavaSEImage(gfx, scale, ((JavaSETransformer) xform).transform(buffer), source); } @Override public void draw(Object ctx, float x, float y, float w, float h) { Graphics2D gfx = (Graphics2D) ctx; gfx.drawImage(buffer, MathUtils.ifloor(x), MathUtils.ifloor(y), MathUtils.ifloor(w), MathUtils.ifloor(h), null); } @Override public void draw(Object ctx, float dx, float dy, float dw, float dh, float sx, float sy, float sw, float sh) { float f = scale().factor; sx *= f; sy *= f; sw *= f; sh *= f; Graphics2D gfx = (Graphics2D) ctx; gfx.drawImage(buffer, MathUtils.ifloor(dx), MathUtils.ifloor(dy), MathUtils.ifloor(dw), MathUtils.ifloor(dh), MathUtils.ifloor(sx), MathUtils.ifloor(sy), MathUtils.ifloor(sw), MathUtils.ifloor(sh), null); } 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); } public int[] getPixels() { int w = (int) width(); int h = (int) height(); int pixels[] = new int[w * h]; buffer.getRGB(0, 0, w, h, pixels, 0, w); return pixels; } public int[] getPixels(int pixels[]) { int w = (int) width(); int h = (int) height(); buffer.getRGB(0, 0, w, h, pixels, 0, w); return pixels; } public int[] getPixels(int x, int y, int w, int h) { int[] pixels = new int[w * h]; buffer.getRGB(x, y, w, h, pixels, 0, w); return pixels; } public int[] getPixels(int offset, int stride, int x, int y, int width, int height) { int pixels[] = new int[width * height]; buffer.getRGB(x, y, width, height, pixels, offset, stride); return pixels; } public int[] getPixels(int pixels[], int offset, int stride, int x, int y, int width, int height) { buffer.getRGB(x, y, width, height, pixels, offset, stride); return pixels; } public void setPixels(int[] pixels, int width, int height) { buffer.setRGB(0, 0, width, height, pixels, 0, width); } public void setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) { buffer.setRGB(x, y, width, height, pixels, offset, stride); } public int[] setPixels(int[] pixels, int x, int y, int w, int h) { buffer.setRGB(x, y, w, h, pixels, 0, w); return pixels; } public void setPixel(LColor c, int x, int y) { buffer.setRGB(x, y, c.getRGB()); } public void setPixel(int rgb, int x, int y) { buffer.setRGB(x, y, rgb); } public int getPixel(int x, int y) { return buffer.getRGB(x, y); } public int getRGB(int x, int y) { return buffer.getRGB(x, y); } public void setRGB(int rgb, int x, int y) { buffer.setRGB(x, y, rgb); } @Override public void getRGB(int startX, int startY, int width, int height, int[] rgbArray, int offset, int scanSize) { if (width <= 0 || height <= 0){ return; } buffer.getRGB(startX, startY, width, height, rgbArray, offset, scanSize); } public void setRGB(int startX, int startY, int width, int height, int[] rgbArray, int offset, int scansize) { if (width <= 0 || height <= 0){ return; } setPixels(rgbArray, offset, scansize, startX, startY, width, height); } @Override public String toString() { return "Image[src=" + source + ", buffer=" + buffer + "]"; } @Override public void upload(Graphics gfx, LTexture tex) { ((JavaSEGraphics) gfx).upload(buffer, tex); } @Override protected void setBitmap(Object bitmap) { buffer = (BufferedImage) bitmap; } @Override protected Object createErrorBitmap(int rawWidth, int rawHeight) { BufferedImage bufferimage = new BufferedImage(rawWidth, rawHeight, BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g = bufferimage.createGraphics(); try { g.setColor(java.awt.Color.red); for (int yy = 0; yy <= rawHeight / 15; yy++) { for (int xx = 0; xx <= rawWidth / 45; xx++) { g.drawString("ERROR", xx * 45, yy * 15); } } } finally { g.dispose(); } return bufferimage; } public boolean hasAlpha() { return buffer.getColorModel().hasAlpha(); } @Override public Image getSubImage(int x, int y, int width, int height) { return new JavaSEImage(gfx, scale, buffer.getSubimage(x, y, width, height), "<canvas>"); } @Override protected void closeImpl() { if (buffer != null) { buffer = null; } } }