X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Frenderer%2Fraster%2Ftexture%2FTextureBitmap.java;h=303ab3fb006d82f9d5b4aa455ac86364ce08b4a3;hb=a3ff3683bd0a025061667b26b6fcf56fe20f0afc;hp=2bd5cd65034733d02ebfbea61b22169d94af84ae;hpb=6b39de1e9e80433b78ae731845551e742718d613;p=sixth-3d.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/texture/TextureBitmap.java b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/texture/TextureBitmap.java index 2bd5cd6..303ab3f 100644 --- a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/texture/TextureBitmap.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/texture/TextureBitmap.java @@ -1,12 +1,7 @@ /* - * Sixth 3D engine. Copyright ©2012-2020, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 3 of the GNU Lesser General Public License - * or later as published by the Free Software Foundation. - * + * Sixth 3D engine. Author: Svjatoslav Agejenko. + * This project is released under Creative Commons Zero (CC0) license. */ - package eu.svjatoslav.sixth.e3d.renderer.raster.texture; import eu.svjatoslav.sixth.e3d.renderer.raster.Color; @@ -14,7 +9,7 @@ import eu.svjatoslav.sixth.e3d.renderer.raster.Color; public class TextureBitmap { /** - * Byte order: ABGR + * Byte order: Alpha, Blue, Green, Red */ public final byte[] bytes; @@ -39,47 +34,54 @@ public class TextureBitmap { this(width, height, new byte[width * height * 4], multiplicationFactor); } - public void drawPixel(int textureOffset, - final byte[] targetRenderingAreaBytes, int targetRenderingAreaOffset) { + /** + * Transfer (render) one pixel from current {@link TextureBitmap} to target raster bitmap. + * + * @param sourceBitmapPixelAddress Pixel address within current {@link TextureBitmap} as indicated by its offset. + * @param targetBitmap Bitmap of the target image where pixel should be rendered to. + * @param targetBitmapPixelAddress Pixel location within target image where pixel should be rendered to. + */ + public void drawPixel(int sourceBitmapPixelAddress, + final byte[] targetBitmap, int targetBitmapPixelAddress) { - final int textureAlpha = bytes[textureOffset] & 0xff; + final int textureAlpha = bytes[sourceBitmapPixelAddress] & 0xff; if (textureAlpha == 0) return; if (textureAlpha == 255) { // skip reading of background for fully opaque pixels - targetRenderingAreaBytes[targetRenderingAreaOffset] = (byte) 255; + targetBitmap[targetBitmapPixelAddress] = (byte) 255; - targetRenderingAreaOffset++; - textureOffset++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = bytes[textureOffset]; + targetBitmapPixelAddress++; + sourceBitmapPixelAddress++; + targetBitmap[targetBitmapPixelAddress] = bytes[sourceBitmapPixelAddress]; - targetRenderingAreaOffset++; - textureOffset++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = bytes[textureOffset]; + targetBitmapPixelAddress++; + sourceBitmapPixelAddress++; + targetBitmap[targetBitmapPixelAddress] = bytes[sourceBitmapPixelAddress]; - targetRenderingAreaOffset++; - textureOffset++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = bytes[textureOffset]; + targetBitmapPixelAddress++; + sourceBitmapPixelAddress++; + targetBitmap[targetBitmapPixelAddress] = bytes[sourceBitmapPixelAddress]; return; } final int backgroundAlpha = 255 - textureAlpha; - textureOffset++; + sourceBitmapPixelAddress++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = (byte) 255; - targetRenderingAreaOffset++; + targetBitmap[targetBitmapPixelAddress] = (byte) 255; + targetBitmapPixelAddress++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = (byte) ((((targetRenderingAreaBytes[targetRenderingAreaOffset] & 0xff) * backgroundAlpha) + ((bytes[textureOffset] & 0xff) * textureAlpha)) / 256); - textureOffset++; - targetRenderingAreaOffset++; + targetBitmap[targetBitmapPixelAddress] = (byte) ((((targetBitmap[targetBitmapPixelAddress] & 0xff) * backgroundAlpha) + ((bytes[sourceBitmapPixelAddress] & 0xff) * textureAlpha)) / 256); + sourceBitmapPixelAddress++; + targetBitmapPixelAddress++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = (byte) ((((targetRenderingAreaBytes[targetRenderingAreaOffset] & 0xff) * backgroundAlpha) + ((bytes[textureOffset] & 0xff) * textureAlpha)) / 256); - textureOffset++; - targetRenderingAreaOffset++; + targetBitmap[targetBitmapPixelAddress] = (byte) ((((targetBitmap[targetBitmapPixelAddress] & 0xff) * backgroundAlpha) + ((bytes[sourceBitmapPixelAddress] & 0xff) * textureAlpha)) / 256); + sourceBitmapPixelAddress++; + targetBitmapPixelAddress++; - targetRenderingAreaBytes[targetRenderingAreaOffset] = (byte) ((((targetRenderingAreaBytes[targetRenderingAreaOffset] & 0xff) * backgroundAlpha) + ((bytes[textureOffset] & 0xff) * textureAlpha)) / 256); + targetBitmap[targetBitmapPixelAddress] = (byte) ((((targetBitmap[targetBitmapPixelAddress] & 0xff) * backgroundAlpha) + ((bytes[sourceBitmapPixelAddress] & 0xff) * textureAlpha)) / 256); } public void drawPixel(final int x, final int y, final Color color) {