aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/render/lwjgl/Image.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jake2/render/lwjgl/Image.java')
-rw-r--r--src/jake2/render/lwjgl/Image.java1569
1 files changed, 147 insertions, 1422 deletions
diff --git a/src/jake2/render/lwjgl/Image.java b/src/jake2/render/lwjgl/Image.java
index 0642f96..1bf0e40 100644
--- a/src/jake2/render/lwjgl/Image.java
+++ b/src/jake2/render/lwjgl/Image.java
@@ -2,27 +2,27 @@
* Image.java
* Copyright (C) 2003
*
- * $Id: Image.java,v 1.3 2005-05-07 17:31:37 cawe Exp $
+ * $Id: Image.java,v 1.4 2006-10-31 13:06:33 salomo Exp $
*/
/*
-Copyright (C) 1997-2001 Id Software, Inc.
+ Copyright (C) 1997-2001 Id Software, Inc.
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-See the GNU General Public License for more details.
+ See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
+ */
package jake2.render.lwjgl;
import jake2.Defines;
@@ -31,6 +31,8 @@ import jake2.client.particle_t;
import jake2.game.cvar_t;
import jake2.qcommon.*;
import jake2.render.image_t;
+import jake2.render.common.Image.glmode_t;
+import jake2.render.common.Image.gltmode_t;
import jake2.util.Lib;
import jake2.util.Vargs;
@@ -41,6 +43,8 @@ import java.awt.image.BufferedImage;
import java.nio.*;
import java.util.Arrays;
+import net.java.games.jogl.GL;
+
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.EXTSharedTexturePalette;
import org.lwjgl.opengl.GL11;
@@ -51,981 +55,45 @@ import org.lwjgl.opengl.GL11;
* @author cwei
*/
public abstract class Image extends Main {
-
- image_t draw_chars;
-
- image_t[] gltextures = new image_t[MAX_GLTEXTURES];
- //Map gltextures = new Hashtable(MAX_GLTEXTURES); // image_t
- int numgltextures;
- int base_textureid; // gltextures[i] = base_textureid+i
-
- byte[] intensitytable = new byte[256];
- byte[] gammatable = new byte[256];
-
- cvar_t intensity;
-
- //
- // qboolean GL_Upload8 (byte *data, int width, int height, qboolean mipmap, qboolean is_sky );
- // qboolean GL_Upload32 (unsigned *data, int width, int height, qboolean mipmap);
- //
-
- int gl_solid_format = 3;
- int gl_alpha_format = 4;
-
- int gl_tex_solid_format = 3;
- int gl_tex_alpha_format = 4;
-
- int gl_filter_min = GL11.GL_LINEAR_MIPMAP_NEAREST;
- int gl_filter_max = GL11.GL_LINEAR;
- Image() {
- // init the texture cache
- for (int i = 0; i < gltextures.length; i++)
- {
- gltextures[i] = new image_t(i);
- }
- numgltextures = 0;
+ protected void GL_GetWorldMatrix() {
+ gl.glGetFloat(GL11.GL_MODELVIEW_MATRIX, r_world_matrix_fb);
+ r_world_matrix_fb.clear();
}
- void GL_SetTexturePalette(int[] palette) {
-
- assert(palette != null && palette.length == 256) : "int palette[256] bug";
+ protected void GL_LoadMatrix() {
+ gl.glLoadMatrix(r_world_matrix_fb);
+ }
+
+ protected void GL_SetTexturePalette(int[] palette) {
+
+ assert (palette != null && palette.length == 256) : "int palette[256] bug";
int i;
- //byte[] temptable = new byte[768];
+ // byte[] temptable = new byte[768];
- if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f)
- {
- ByteBuffer temptable=BufferUtils.createByteBuffer(768);
+ if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f) {
+ ByteBuffer temptable = BufferUtils.createByteBuffer(768);
for (i = 0; i < 256; i++) {
temptable.put(i * 3 + 0, (byte) ((palette[i] >> 0) & 0xff));
temptable.put(i * 3 + 1, (byte) ((palette[i] >> 8) & 0xff));
temptable.put(i * 3 + 2, (byte) ((palette[i] >> 16) & 0xff));
}
- gl.glColorTable(EXTSharedTexturePalette.GL_SHARED_TEXTURE_PALETTE_EXT, GL11.GL_RGB, 256, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, temptable);
- }
- }
-
- void GL_EnableMultitexture(boolean enable) {
- if (enable) {
- GL_SelectTexture(GL_TEXTURE1);
- gl.glEnable(GL11.GL_TEXTURE_2D);
- GL_TexEnv(GL11.GL_REPLACE);
- }
- else {
- GL_SelectTexture(GL_TEXTURE1);
- gl.glDisable(GL11.GL_TEXTURE_2D);
- GL_TexEnv(GL11.GL_REPLACE);
- }
- GL_SelectTexture(GL_TEXTURE0);
- GL_TexEnv(GL11.GL_REPLACE);
- }
-
- void GL_SelectTexture(int texture /* GLenum */) {
- int tmu;
-
- tmu = (texture == GL_TEXTURE0) ? 0 : 1;
-
- if (tmu == gl_state.currenttmu) {
- return;
- }
-
- gl_state.currenttmu = tmu;
-
- gl.glActiveTextureARB(texture);
- gl.glClientActiveTextureARB(texture);
- }
-
- int[] lastmodes = { -1, -1 };
-
- void GL_TexEnv(int mode /* GLenum */
- ) {
-
- if (mode != lastmodes[gl_state.currenttmu]) {
- gl.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, mode);
- lastmodes[gl_state.currenttmu] = mode;
- }
- }
-
- void GL_Bind(int texnum) {
-
- if ((gl_nobind.value != 0) && (draw_chars != null)) {
- // performance evaluation option
- texnum = draw_chars.texnum;
- }
- if (gl_state.currenttextures[gl_state.currenttmu] == texnum)
- return;
-
- gl_state.currenttextures[gl_state.currenttmu] = texnum;
- gl.glBindTexture(GL11.GL_TEXTURE_2D, texnum);
- }
-
- void GL_MBind(int target /* GLenum */, int texnum) {
- GL_SelectTexture(target);
- if (target == GL_TEXTURE0) {
- if (gl_state.currenttextures[0] == texnum)
- return;
- }
- else {
- if (gl_state.currenttextures[1] == texnum)
- return;
- }
- GL_Bind(texnum);
- }
-
- // glmode_t
- static class glmode_t {
- String name;
- int minimize, maximize;
-
- glmode_t(String name, int minimize, int maximze) {
- this.name = name;
- this.minimize = minimize;
- this.maximize = maximze;
- }
- }
-
- static final glmode_t modes[] =
- {
- new glmode_t("GL_NEAREST", GL11.GL_NEAREST, GL11.GL_NEAREST),
- new glmode_t("GL_LINEAR", GL11.GL_LINEAR, GL11.GL_LINEAR),
- new glmode_t("GL_NEAREST_MIPMAP_NEAREST", GL11.GL_NEAREST_MIPMAP_NEAREST, GL11.GL_NEAREST),
- new glmode_t("GL_LINEAR_MIPMAP_NEAREST", GL11.GL_LINEAR_MIPMAP_NEAREST, GL11.GL_LINEAR),
- new glmode_t("GL_NEAREST_MIPMAP_LINEAR", GL11.GL_NEAREST_MIPMAP_LINEAR, GL11.GL_NEAREST),
- new glmode_t("GL_LINEAR_MIPMAP_LINEAR", GL11.GL_LINEAR_MIPMAP_LINEAR, GL11.GL_LINEAR)};
-
- static final int NUM_GL_MODES = modes.length;
-
- // gltmode_t
- static class gltmode_t {
- String name;
- int mode;
-
- gltmode_t(String name, int mode) {
- this.name = name;
- this.mode = mode;
- }
- }
-
- static final gltmode_t[] gl_alpha_modes =
- {
- new gltmode_t("default", 4),
- new gltmode_t("GL_RGBA", GL11.GL_RGBA),
- new gltmode_t("GL_RGBA8", GL11.GL_RGBA8),
- new gltmode_t("GL_RGB5_A1", GL11.GL_RGB5_A1),
- new gltmode_t("GL_RGBA4", GL11.GL_RGBA4),
- new gltmode_t("GL_RGBA2", GL11.GL_RGBA2),
- };
-
- static final int NUM_GL_ALPHA_MODES = gl_alpha_modes.length;
-
- static final gltmode_t[] gl_solid_modes =
- {
- new gltmode_t("default", 3),
- new gltmode_t("GL_RGB", GL11.GL_RGB),
- new gltmode_t("GL_RGB8", GL11.GL_RGB8),
- new gltmode_t("GL_RGB5", GL11.GL_RGB5),
- new gltmode_t("GL_RGB4", GL11.GL_RGB4),
- new gltmode_t("GL_R3_G3_B2", GL11.GL_R3_G3_B2),
- // #ifdef GL_RGB2_EXT
- //new gltmode_t("GL_RGB2", GL.GL_RGB2_EXT)
- // #endif
- };
-
- static final int NUM_GL_SOLID_MODES = gl_solid_modes.length;
-
- /*
- ===============
- GL_TextureMode
- ===============
- */
- void GL_TextureMode(String string) {
-
- int i;
- for (i = 0; i < NUM_GL_MODES; i++) {
- if (modes[i].name.equalsIgnoreCase(string))
- break;
- }
-
- if (i == NUM_GL_MODES) {
- VID.Printf(Defines.PRINT_ALL, "bad filter name: [" + string + "]\n");
- return;
- }
-
- gl_filter_min = modes[i].minimize;
- gl_filter_max = modes[i].maximize;
-
- image_t glt;
- // change all the existing mipmap texture objects
- for (i = 0; i < numgltextures; i++) {
- glt = gltextures[i];
-
- if (glt.type != it_pic && glt.type != it_sky) {
- GL_Bind(glt.texnum);
- gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, gl_filter_min);
- gl.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, gl_filter_max);
- }
- }
- }
-
- /*
- ===============
- GL_TextureAlphaMode
- ===============
- */
- void GL_TextureAlphaMode(String string) {
-
- int i;
- for (i = 0; i < NUM_GL_ALPHA_MODES; i++) {
- if (gl_alpha_modes[i].name.equalsIgnoreCase(string))
- break;
- }
-
- if (i == NUM_GL_ALPHA_MODES) {
- VID.Printf(Defines.PRINT_ALL, "bad alpha texture mode name: [" + string + "]\n");
- return;
- }
-
- gl_tex_alpha_format = gl_alpha_modes[i].mode;
- }
-
- /*
- ===============
- GL_TextureSolidMode
- ===============
- */
- void GL_TextureSolidMode(String string) {
- int i;
- for (i = 0; i < NUM_GL_SOLID_MODES; i++) {
- if (gl_solid_modes[i].name.equalsIgnoreCase(string))
- break;
- }
-
- if (i == NUM_GL_SOLID_MODES) {
- VID.Printf(Defines.PRINT_ALL, "bad solid texture mode name: [" + string + "]\n");
- return;
- }
-
- gl_tex_solid_format = gl_solid_modes[i].mode;
- }
-
- /*
- ===============
- GL_ImageList_f
- ===============
- */
- void GL_ImageList_f() {
-
- image_t image;
- int texels;
- final String[] palstrings = { "RGB", "PAL" };
-
- VID.Printf(Defines.PRINT_ALL, "------------------\n");
- texels = 0;
-
- for (int i = 0; i < numgltextures; i++) {
- image = gltextures[i];
- if (image.texnum <= 0)
- continue;
-
- texels += image.upload_width * image.upload_height;
- switch (image.type) {
- case it_skin :
- VID.Printf(Defines.PRINT_ALL, "M");
- break;
- case it_sprite :
- VID.Printf(Defines.PRINT_ALL, "S");
- break;
- case it_wall :
- VID.Printf(Defines.PRINT_ALL, "W");
- break;
- case it_pic :
- VID.Printf(Defines.PRINT_ALL, "P");
- break;
- default :
- VID.Printf(Defines.PRINT_ALL, " ");
- break;
- }
-
- VID.Printf(
- Defines.PRINT_ALL,
- " %3i %3i %s: %s\n",
- new Vargs(4).add(image.upload_width).add(image.upload_height).add(palstrings[(image.paletted) ? 1 : 0]).add(
- image.name));
- }
- VID.Printf(Defines.PRINT_ALL, "Total texel count (not counting mipmaps): " + texels + '\n');
- }
-
- /*
- =============================================================================
-
- scrap allocation
-
- Allocate all the little status bar objects into a single texture
- to crutch up inefficient hardware / drivers
-
- =============================================================================
- */
-
- static final int MAX_SCRAPS = 1;
- static final int BLOCK_WIDTH = 256;
- static final int BLOCK_HEIGHT = 256;
-
- int[][] scrap_allocated = new int[MAX_SCRAPS][BLOCK_WIDTH];
- byte[][] scrap_texels = new byte[MAX_SCRAPS][BLOCK_WIDTH * BLOCK_HEIGHT];
- boolean scrap_dirty;
-
- static class pos_t {
- int x, y;
-
- pos_t(int x, int y) {
- this.x = x;
- this.y = y;
- }
- }
-
- // returns a texture number and the position inside it
- int Scrap_AllocBlock(int w, int h, pos_t pos) {
- int i, j;
- int best, best2;
- int texnum;
-
- for (texnum = 0; texnum < MAX_SCRAPS; texnum++) {
- best = BLOCK_HEIGHT;
-
- for (i = 0; i < BLOCK_WIDTH - w; i++) {
- best2 = 0;
-
- for (j = 0; j < w; j++) {
- if (scrap_allocated[texnum][i + j] >= best)
- break;
- if (scrap_allocated[texnum][i + j] > best2)
- best2 = scrap_allocated[texnum][i + j];
- }
- if (j == w) { // this is a valid spot
- pos.x = i;
- pos.y = best = best2;
- }
- }
-
- if (best + h > BLOCK_HEIGHT)
- continue;
-
- for (i = 0; i < w; i++)
- scrap_allocated[texnum][pos.x + i] = best + h;
-
- return texnum;
- }
-
- return -1;
- // Sys_Error ("Scrap_AllocBlock: full");
- }
-
- int scrap_uploads = 0;
-
- void Scrap_Upload() {
- scrap_uploads++;
- GL_Bind(TEXNUM_SCRAPS);
- GL_Upload8(scrap_texels[0], BLOCK_WIDTH, BLOCK_HEIGHT, false, false);
- scrap_dirty = false;
- }
-
- /*
- =================================================================
-
- PCX LOADING
-
- =================================================================
- */
-
- /*
- ==============
- LoadPCX
- ==============
- */
- byte[] LoadPCX(String filename, byte[][] palette, Dimension dim) {
- qfiles.pcx_t pcx;
-
- //
- // load the file
- //
- byte[] raw = FS.LoadFile(filename);
-
- if (raw == null) {
- VID.Printf(Defines.PRINT_DEVELOPER, "Bad pcx file " + filename + '\n');
- return null;
- }
-
- //
- // parse the PCX file
- //
- pcx = new qfiles.pcx_t(raw);
-
- if (pcx.manufacturer != 0x0a
- || pcx.version != 5
- || pcx.encoding != 1
- || pcx.bits_per_pixel != 8
- || pcx.xmax >= 640
- || pcx.ymax >= 480) {
-
- VID.Printf(Defines.PRINT_ALL, "Bad pcx file " + filename + '\n');
- return null;
- }
-
- int width = pcx.xmax - pcx.xmin + 1;
- int height = pcx.ymax - pcx.ymin + 1;
-
- byte[] pix = new byte[width * height];
-
- if (palette != null) {
- palette[0] = new byte[768];
- System.arraycopy(raw, raw.length - 768, palette[0], 0, 768);
- }
-
- if (dim != null) {
- dim.width = width;
- dim.height = height;
- }
-
- //
- // decode pcx
- //
- int count = 0;
- byte dataByte = 0;
- int runLength = 0;
- int x, y;
-
- for (y = 0; y < height; y++) {
- for (x = 0; x < width;) {
-
- dataByte = pcx.data.get();
-
- if ((dataByte & 0xC0) == 0xC0) {
- runLength = dataByte & 0x3F;
- dataByte = pcx.data.get();
- // write runLength pixel
- while (runLength-- > 0) {
- pix[count++] = dataByte;
- x++;
- }
- }
- else {
- // write one pixel
- pix[count++] = dataByte;
- x++;
- }
- }
- }
- return pix;
- }
-
- private Throwable gotoBreakOut = new Throwable();
- private Throwable gotoDone = gotoBreakOut;
-
- // /*
- // =========================================================
- //
- // TARGA LOADING
- //
- // =========================================================
- // */
- /*
- =============
- LoadTGA
- =============
- */
- byte[] LoadTGA(String name, Dimension dim) {
- int columns, rows, numPixels;
- int pixbuf; // index into pic
- int row, column;
- byte[] raw;
- ByteBuffer buf_p;
- int length;
- qfiles.tga_t targa_header;
- byte[] pic = null;
-
- //
- // load the file
- //
- raw = FS.LoadFile(name);
-
- if (raw == null)
- {
- VID.Printf(Defines.PRINT_DEVELOPER, "Bad tga file "+ name +'\n');
- return null;
- }
-
- targa_header = new qfiles.tga_t(raw);
-
- if (targa_header.image_type != 2 && targa_header.image_type != 10)
- Com.Error(Defines.ERR_DROP, "LoadTGA: Only type 2 and 10 targa RGB images supported\n");
-
- if (targa_header.colormap_type != 0 || (targa_header.pixel_size != 32 && targa_header.pixel_size != 24))
- Com.Error (Defines.ERR_DROP, "LoadTGA: Only 32 or 24 bit images supported (no colormaps)\n");
-
- columns = targa_header.width;
- rows = targa_header.height;
- numPixels = columns * rows;
-
- if (dim != null) {
- dim.width = columns;
- dim.height = rows;
- }
-
- pic = new byte[numPixels * 4]; // targa_rgba;
-
- if (targa_header.id_length != 0)
- targa_header.data.position(targa_header.id_length); // skip TARGA image comment
-
- buf_p = targa_header.data;
-
- byte red,green,blue,alphabyte;
- red = green = blue = alphabyte = 0;
- int packetHeader, packetSize, j;
-
- if (targa_header.image_type==2) { // Uncompressed, RGB images
- for(row=rows-1; row>=0; row--) {
-
- pixbuf = row * columns * 4;
-
- for(column=0; column<columns; column++) {
- switch (targa_header.pixel_size) {
- case 24:
-
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- pic[pixbuf++] = red;
- pic[pixbuf++] = green;
- pic[pixbuf++] = blue;
- pic[pixbuf++] = (byte)255;
- break;
- case 32:
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- alphabyte = buf_p.get();
- pic[pixbuf++] = red;
- pic[pixbuf++] = green;
- pic[pixbuf++] = blue;
- pic[pixbuf++] = alphabyte;
- break;
- }
- }
- }
- }
- else if (targa_header.image_type==10) { // Runlength encoded RGB images
- for(row=rows-1; row>=0; row--) {
-
- pixbuf = row * columns * 4;
- try {
-
- for(column=0; column<columns; ) {
-
- packetHeader= buf_p.get() & 0xFF;
- packetSize = 1 + (packetHeader & 0x7f);
-
- if ((packetHeader & 0x80) != 0) { // run-length packet
- switch (targa_header.pixel_size) {
- case 24:
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- alphabyte = (byte)255;
- break;
- case 32:
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- alphabyte = buf_p.get();
- break;
- }
-
- for(j=0;j<packetSize;j++) {
- pic[pixbuf++]=red;
- pic[pixbuf++]=green;
- pic[pixbuf++]=blue;
- pic[pixbuf++]=alphabyte;
- column++;
- if (column==columns) { // run spans across rows
- column=0;
- if (row>0)
- row--;
- else
- // goto label breakOut;
- throw gotoBreakOut;
-
- pixbuf = row * columns * 4;
- }
- }
- }
- else { // non run-length packet
- for(j=0;j<packetSize;j++) {
- switch (targa_header.pixel_size) {
- case 24:
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- pic[pixbuf++] = red;
- pic[pixbuf++] = green;
- pic[pixbuf++] = blue;
- pic[pixbuf++] = (byte)255;
- break;
- case 32:
- blue = buf_p.get();
- green = buf_p.get();
- red = buf_p.get();
- alphabyte = buf_p.get();
- pic[pixbuf++] = red;
- pic[pixbuf++] = green;
- pic[pixbuf++] = blue;
- pic[pixbuf++] = alphabyte;
- break;
- }
- column++;
- if (column==columns) { // pixel packet run spans across rows
- column=0;
- if (row>0)
- row--;
- else
- // goto label breakOut;
- throw gotoBreakOut;
-
- pixbuf = row * columns * 4;
- }
- }
- }
- }
- } catch (Throwable e){
- // label breakOut:
- }
- }
- }
- return pic;
- }
-
- /*
- ====================================================================
-
- IMAGE FLOOD FILLING
-
- ====================================================================
- */
-
- /*
- =================
- Mod_FloodFillSkin
-
- Fill background pixels so mipmapping doesn't have haloes
- =================
- */
-
- static class floodfill_t {
- short x, y;
- }
-
- // must be a power of 2
- static final int FLOODFILL_FIFO_SIZE = 0x1000;
- static final int FLOODFILL_FIFO_MASK = FLOODFILL_FIFO_SIZE - 1;
- //
- // #define FLOODFILL_STEP( off, dx, dy ) \
- // { \
- // if (pos[off] == fillcolor) \
- // { \
- // pos[off] = 255; \
- // fifo[inpt].x = x + (dx), fifo[inpt].y = y + (dy); \
- // inpt = (inpt + 1) & FLOODFILL_FIFO_MASK; \
- // } \
- // else if (pos[off] != 255) fdc = pos[off]; \
- // }
-
- // void FLOODFILL_STEP( int off, int dx, int dy )
- // {
- // if (pos[off] == fillcolor)
- // {
- // pos[off] = 255;
- // fifo[inpt].x = x + dx; fifo[inpt].y = y + dy;
- // inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
- // }
- // else if (pos[off] != 255) fdc = pos[off];
- // }
- static floodfill_t[] fifo = new floodfill_t[FLOODFILL_FIFO_SIZE];
- static {
- for (int j = 0; j < fifo.length; j++) {
- fifo[j] = new floodfill_t();
- }
- }
- // TODO check this: R_FloodFillSkin( byte[] skin, int skinwidth, int skinheight)
- void R_FloodFillSkin(byte[] skin, int skinwidth, int skinheight) {
- // byte fillcolor = *skin; // assume this is the pixel to fill
- int fillcolor = skin[0] & 0xff;
-// floodfill_t[] fifo = new floodfill_t[FLOODFILL_FIFO_SIZE];
- int inpt = 0, outpt = 0;
- int filledcolor = -1;
- int i;
-
-// for (int j = 0; j < fifo.length; j++) {
-// fifo[j] = new floodfill_t();
-// }
-
- if (filledcolor == -1) {
- filledcolor = 0;
- // attempt to find opaque black
- for (i = 0; i < 256; ++i)
- // TODO check this
- if (d_8to24table[i] == 0xFF000000) { // alpha 1.0
- //if (d_8to24table[i] == (255 << 0)) // alpha 1.0
- filledcolor = i;
- break;
- }
- }
-
- // can't fill to filled color or to transparent color (used as visited marker)
- if ((fillcolor == filledcolor) || (fillcolor == 255)) {
- return;
- }
-
- fifo[inpt].x = 0;
- fifo[inpt].y = 0;
- inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
-
- while (outpt != inpt) {
- int x = fifo[outpt].x;
- int y = fifo[outpt].y;
- int fdc = filledcolor;
- // byte *pos = &skin[x + skinwidth * y];
- int pos = x + skinwidth * y;
- //
- outpt = (outpt + 1) & FLOODFILL_FIFO_MASK;
-
- int off, dx, dy;
-
- if (x > 0) {
- // FLOODFILL_STEP( -1, -1, 0 );
- off = -1;
- dx = -1;
- dy = 0;
- if (skin[pos + off] == (byte) fillcolor) {
- skin[pos + off] = (byte) 255;
- fifo[inpt].x = (short) (x + dx);
- fifo[inpt].y = (short) (y + dy);
- inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
- }
- else if (skin[pos + off] != (byte) 255)
- fdc = skin[pos + off] & 0xff;
- }
-
- if (x < skinwidth - 1) {
- // FLOODFILL_STEP( 1, 1, 0 );
- off = 1;
- dx = 1;
- dy = 0;
- if (skin[pos + off] == (byte) fillcolor) {
- skin[pos + off] = (byte) 255;
- fifo[inpt].x = (short) (x + dx);
- fifo[inpt].y = (short) (y + dy);
- inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
- }
- else if (skin[pos + off] != (byte) 255)
- fdc = skin[pos + off] & 0xff;
- }
-
- if (y > 0) {
- // FLOODFILL_STEP( -skinwidth, 0, -1 );
- off = -skinwidth;
- dx = 0;
- dy = -1;
- if (skin[pos + off] == (byte) fillcolor) {
- skin[pos + off] = (byte) 255;
- fifo[inpt].x = (short) (x + dx);
- fifo[inpt].y = (short) (y + dy);
- inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
- }
- else if (skin[pos + off] != (byte) 255)
- fdc = skin[pos + off] & 0xff;
- }
-
- if (y < skinheight - 1) {
- // FLOODFILL_STEP( skinwidth, 0, 1 );
- off = skinwidth;
- dx = 0;
- dy = 1;
- if (skin[pos + off] == (byte) fillcolor) {
- skin[pos + off] = (byte) 255;
- fifo[inpt].x = (short) (x + dx);
- fifo[inpt].y = (short) (y + dy);
- inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
- }
- else if (skin[pos + off] != (byte) 255)
- fdc = skin[pos + off] & 0xff;
-
- }
-
- skin[x + skinwidth * y] = (byte) fdc;
+ gl.glColorTable(
+ EXTSharedTexturePalette.GL_SHARED_TEXTURE_PALETTE_EXT,
+ GL11.GL_RGB, 256, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE,
+ temptable);
}
}
- // =======================================================
-
- /*
- ================
- GL_ResampleTexture
- ================
- */
- // cwei :-)
- void GL_ResampleTexture(int[] in, int inwidth, int inheight, int[] out, int outwidth, int outheight) {
- // int i, j;
- // unsigned *inrow, *inrow2;
- // int frac, fracstep;
- // int[] p1 = new int[1024];
- // int[] p2 = new int[1024];
- //
-
- // *** this source do the same ***
- BufferedImage image = new BufferedImage(inwidth, inheight, BufferedImage.TYPE_INT_ARGB);
-
- image.setRGB(0, 0, inwidth, inheight, in, 0, inwidth);
-
- AffineTransformOp op =
- new AffineTransformOp(
- AffineTransform.getScaleInstance(outwidth * 1.0 / inwidth, outheight * 1.0 / inheight),
- AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
- BufferedImage tmp = op.filter(image, null);
-
- tmp.getRGB(0, 0, outwidth, outheight, out, 0, outwidth);
-
- // *** end ***
-
- // byte *pix1, *pix2, *pix3, *pix4;
- //
- // fracstep = inwidth*0x10000/outwidth;
- //
- // frac = fracstep>>2;
- // for (i=0 ; i<outwidth ; i++)
- // {
- // p1[i] = 4*(frac>>16);
- // frac += fracstep;
- // }
- // frac = 3*(fracstep>>2);
- // for (i=0 ; i<outwidth ; i++)
- // {
- // p2[i] = 4*(frac>>16);
- // frac += fracstep;
- // }
- //
- // for (i=0 ; i<outheight ; i++, out += outwidth)
- // {
- // inrow = in + inwidth*(int)((i+0.25)*inheight/outheight);
- // inrow2 = in + inwidth*(int)((i+0.75)*inheight/outheight);
- // frac = fracstep >> 1;
- // for (j=0 ; j<outwidth ; j++)
- // {
- // pix1 = (byte *)inrow + p1[j];
- // pix2 = (byte *)inrow + p2[j];
- // pix3 = (byte *)inrow2 + p1[j];
- // pix4 = (byte *)inrow2 + p2[j];
- // ((byte *)(out+j))[0] = (pix1[0] + pix2[0] + pix3[0] + pix4[0])>>2;
- // ((byte *)(out+j))[1] = (pix1[1] + pix2[1] + pix3[1] + pix4[1])>>2;
- // ((byte *)(out+j))[2] = (pix1[2] + pix2[2] + pix3[2] + pix4[2])>>2;
- // ((byte *)(out+j))[3] = (pix1[3] + pix2[3] + pix3[3] + pix4[3])>>2;
- // }
- // }
- }
-
- /*
- ================
- GL_LightScaleTexture
-
- Scale up the pixel values in a texture to increase the
- lighting range
- ================
- */
- void GL_LightScaleTexture(int[] in, int inwidth, int inheight, boolean only_gamma) {
- if (only_gamma) {
- int i, c;
- int r, g, b, color;
-
- c = inwidth * inheight;
- for (i = 0; i < c; i++) {
- color = in[i];
- r = (color >> 0) & 0xFF;
- g = (color >> 8) & 0xFF;
- b = (color >> 16) & 0xFF;
-
- r = gammatable[r] & 0xFF;
- g = gammatable[g] & 0xFF;
- b = gammatable[b] & 0xFF;
-
- in[i] = (r << 0) | (g << 8) | (b << 16) | (color & 0xFF000000);
- }
- }
- else {
- int i, c;
- int r, g, b, color;
-
- c = inwidth * inheight;
- for (i = 0; i < c; i++) {
- color = in[i];
- r = (color >> 0) & 0xFF;
- g = (color >> 8) & 0xFF;
- b = (color >> 16) & 0xFF;
-
- r = gammatable[intensitytable[r] & 0xFF] & 0xFF;
- g = gammatable[intensitytable[g] & 0xFF] & 0xFF;
- b = gammatable[intensitytable[b] & 0xFF] & 0xFF;
-
- in[i] = (r << 0) | (g << 8) | (b << 16) | (color & 0xFF000000);
- }
-
- }
- }
-
- /*
- ================
- GL_MipMap
-
- Operates in place, quartering the size of the texture
- ================
- */
- void GL_MipMap(int[] in, int width, int height) {
- int i, j;
- int[] out;
-
- out = in;
-
- int inIndex = 0;
- int outIndex = 0;
-
- int r, g, b, a;
- int p1, p2, p3, p4;
-
- for (i = 0; i < height; i += 2, inIndex += width) {
- for (j = 0; j < width; j += 2, outIndex += 1, inIndex += 2) {
-
- p1 = in[inIndex + 0];
- p2 = in[inIndex + 1];
- p3 = in[inIndex + width + 0];
- p4 = in[inIndex + width + 1];
-
- r = (((p1 >> 0) & 0xFF) + ((p2 >> 0) & 0xFF) + ((p3 >> 0) & 0xFF) + ((p4 >> 0) & 0xFF)) >> 2;
- g = (((p1 >> 8) & 0xFF) + ((p2 >> 8) & 0xFF) + ((p3 >> 8) & 0xFF) + ((p4 >> 8) & 0xFF)) >> 2;
- b = (((p1 >> 16) & 0xFF) + ((p2 >> 16) & 0xFF) + ((p3 >> 16) & 0xFF) + ((p4 >> 16) & 0xFF)) >> 2;
- a = (((p1 >> 24) & 0xFF) + ((p2 >> 24) & 0xFF) + ((p3 >> 24) & 0xFF) + ((p4 >> 24) & 0xFF)) >> 2;
-
- out[outIndex] = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- }
- }
- }
-
- /*
- ===============
- GL_Upload32
-
- Returns has_alpha
- ===============
- */
- void GL_BuildPalettedTexture(ByteBuffer paletted_texture, int[] scaled, int scaled_width, int scaled_height) {
+ /**
+ * GL_Upload32
+ *
+ * Returns has_alpha
+ */
+ void GL_BuildPalettedTexture(ByteBuffer paletted_texture, int[] scaled,
+ int scaled_width, int scaled_height) {
int r, g, b, c;
int size = scaled_width * scaled_height;
@@ -1042,8 +110,6 @@ public abstract class Image extends Main {
}
}
- int upload_width, upload_height;
- boolean uploaded_paletted;
/*
===============
@@ -1057,7 +123,7 @@ public abstract class Image extends Main {
ByteBuffer paletted_texture=BufferUtils.createByteBuffer(256*256);
IntBuffer tex = Lib.newIntBuffer(512 * 256, ByteOrder.LITTLE_ENDIAN);
- boolean GL_Upload32(int[] data, int width, int height, boolean mipmap) {
+ protected boolean GL_Upload32(int[] data, int width, int height, boolean mipmap) {
int samples;
int scaled_width, scaled_height;
int i, c;
@@ -1066,14 +132,17 @@ public abstract class Image extends Main {
Arrays.fill(scaled, 0);
// Arrays.fill(paletted_texture, (byte)0);
paletted_texture.clear();
- for (int j=0; j<256*256; j++) paletted_texture.put(j,(byte)0);
+ for (int j = 0; j < 256 * 256; j++)
+ paletted_texture.put(j, (byte) 0);
uploaded_paletted = false;
- for (scaled_width = 1; scaled_width < width; scaled_width <<= 1);
+ for (scaled_width = 1; scaled_width < width; scaled_width <<= 1)
+ ;
if (gl_round_down.value > 0.0f && scaled_width > width && mipmap)
scaled_width >>= 1;
- for (scaled_height = 1; scaled_height < height; scaled_height <<= 1);
+ for (scaled_height = 1; scaled_height < height; scaled_height <<= 1)
+ ;
if (gl_round_down.value > 0.0f && scaled_height > height && mipmap)
scaled_height >>= 1;
@@ -1116,7 +185,8 @@ public abstract class Image extends Main {
else if (samples == gl_alpha_format)
comp = gl_tex_alpha_format;
else {
- VID.Printf(Defines.PRINT_ALL, "Unknown number of texture components " + samples + '\n');
+ VID.Printf(Defines.PRINT_ALL,
+ "Unknown number of texture components " + samples + '\n');
comp = samples;
}
@@ -1124,61 +194,50 @@ public abstract class Image extends Main {
try {
if (scaled_width == width && scaled_height == height) {
if (!mipmap) {
- if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f && samples == gl_solid_format) {
+ if (qglColorTableEXT
+ && gl_ext_palettedtexture.value != 0.0f
+ && samples == gl_solid_format) {
uploaded_paletted = true;
- GL_BuildPalettedTexture(paletted_texture, data, scaled_width, scaled_height);
- gl.glTexImage2D(
- GL11.GL_TEXTURE_2D,
- 0,
- GL_COLOR_INDEX8_EXT,
- scaled_width,
- scaled_height,
- 0,
- GL11.GL_COLOR_INDEX,
- GL11.GL_UNSIGNED_BYTE,
- paletted_texture);
- }
- else {
- tex.rewind(); tex.put(data); tex.rewind();
- gl.glTexImage2D(
- GL11.GL_TEXTURE_2D,
- 0,
- comp,
- scaled_width,
- scaled_height,
- 0,
- GL11.GL_RGBA,
- GL11.GL_UNSIGNED_BYTE,
- tex);
+ GL_BuildPalettedTexture(paletted_texture, data,
+ scaled_width, scaled_height);
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0,
+ GL_COLOR_INDEX8_EXT, scaled_width,
+ scaled_height, 0, GL11.GL_COLOR_INDEX,
+ GL11.GL_UNSIGNED_BYTE, paletted_texture);
+ } else {
+ tex.rewind();
+ tex.put(data);
+ tex.rewind();
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, comp,
+ scaled_width, scaled_height, 0, GL11.GL_RGBA,
+ GL11.GL_UNSIGNED_BYTE, tex);
}
- //goto done;
+ // goto done;
throw gotoDone;
}
- //memcpy (scaled, data, width*height*4); were bytes
+ // memcpy (scaled, data, width*height*4); were bytes
System.arraycopy(data, 0, scaled, 0, width * height);
- }
- else
- GL_ResampleTexture(data, width, height, scaled, scaled_width, scaled_height);
+ } else
+ GL_ResampleTexture(data, width, height, scaled, scaled_width,
+ scaled_height);
GL_LightScaleTexture(scaled, scaled_width, scaled_height, !mipmap);
- if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f && (samples == gl_solid_format)) {
+ if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f
+ && (samples == gl_solid_format)) {
uploaded_paletted = true;
- GL_BuildPalettedTexture(paletted_texture, scaled, scaled_width, scaled_height);
- gl.glTexImage2D(
- GL11.GL_TEXTURE_2D,
- 0,
- GL_COLOR_INDEX8_EXT,
- scaled_width,
- scaled_height,
- 0,
- GL11.GL_COLOR_INDEX,
- GL11.GL_UNSIGNED_BYTE,
- paletted_texture);
- }
- else {
- tex.rewind(); tex.put(scaled); tex.rewind();
- gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, comp, scaled_width, scaled_height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, tex);
+ GL_BuildPalettedTexture(paletted_texture, scaled, scaled_width,
+ scaled_height);
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT,
+ scaled_width, scaled_height, 0, GL11.GL_COLOR_INDEX,
+ GL11.GL_UNSIGNED_BYTE, paletted_texture);
+ } else {
+ tex.rewind();
+ tex.put(scaled);
+ tex.rewind();
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, comp, scaled_width,
+ scaled_height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
+ tex);
}
if (mipmap) {
@@ -1194,65 +253,57 @@ public abstract class Image extends Main {
scaled_height = 1;
miplevel++;
- if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f && samples == gl_solid_format) {
+ if (qglColorTableEXT
+ && gl_ext_palettedtexture.value != 0.0f
+ && samples == gl_solid_format) {
uploaded_paletted = true;
- GL_BuildPalettedTexture(paletted_texture, scaled, scaled_width, scaled_height);
- gl.glTexImage2D(
- GL11.GL_TEXTURE_2D,
- miplevel,
- GL_COLOR_INDEX8_EXT,
- scaled_width,
- scaled_height,
- 0,
- GL11.GL_COLOR_INDEX,
- GL11.GL_UNSIGNED_BYTE,
- paletted_texture);
- }
- else {
- tex.rewind(); tex.put(scaled); tex.rewind();
- gl.glTexImage2D(
- GL11.GL_TEXTURE_2D,
- miplevel,
- comp,
- scaled_width,
- scaled_height,
- 0,
- GL11.GL_RGBA,
- GL11.GL_UNSIGNED_BYTE,
- tex);
+ GL_BuildPalettedTexture(paletted_texture, scaled,
+ scaled_width, scaled_height);
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, miplevel,
+ GL_COLOR_INDEX8_EXT, scaled_width,
+ scaled_height, 0, GL11.GL_COLOR_INDEX,
+ GL11.GL_UNSIGNED_BYTE, paletted_texture);
+ } else {
+ tex.rewind();
+ tex.put(scaled);
+ tex.rewind();
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, miplevel, comp,
+ scaled_width, scaled_height, 0, GL11.GL_RGBA,
+ GL11.GL_UNSIGNED_BYTE, tex);
}
}
}
// label done:
- }
- catch (Throwable e) {
+ } catch (Throwable e) {
// replaces label done
}
if (mipmap) {
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, gl_filter_min);
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, gl_filter_max);
- }
- else {
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, gl_filter_max);
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, gl_filter_max);
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
+ gl_filter_min);
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
+ gl_filter_max);
+ } else {
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
+ gl_filter_max);
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
+ gl_filter_max);
}
return (samples == gl_alpha_format);
}
- /*
- ===============
- GL_Upload8
-
- Returns has_alpha
- ===============
- */
+ /**
+ * GL_Upload8
+ *
+ * Returns has_alpha
+ */
int[] trans = new int[512 * 256];
- boolean GL_Upload8(byte[] data, int width, int height, boolean mipmap, boolean is_sky) {
-
+ protected boolean GL_Upload8(byte[] data, int width, int height,
+ boolean mipmap, boolean is_sky) {
+
Arrays.fill(trans, 0);
int s = width * height;
@@ -1261,17 +312,19 @@ public abstract class Image extends Main {
Com.Error(Defines.ERR_DROP, "GL_Upload8: too large");
if (qglColorTableEXT && gl_ext_palettedtexture.value != 0.0f && is_sky) {
- gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, width, height, 0, GL11.GL_COLOR_INDEX, GL11.GL_UNSIGNED_BYTE, ByteBuffer.wrap(data));
+ gl.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, width,
+ height, 0, GL11.GL_COLOR_INDEX, GL11.GL_UNSIGNED_BYTE,
+ ByteBuffer.wrap(data));
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, gl_filter_max);
- gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, gl_filter_max);
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
+ gl_filter_max);
+ gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
+ gl_filter_max);
// TODO check this
return false;
- }
- else {
+ } else {
int p;
- int rgb;
for (int i = 0; i < s; i++) {
p = data[i] & 0xff;
trans[i] = d_8to24table[p];
@@ -1303,253 +356,16 @@ public abstract class Image extends Main {
}
}
- /*
- ================
- GL_LoadPic
-
- This is also used as an entry point for the generated r_notexture
- ================
- */
- image_t GL_LoadPic(String name, byte[] pic, int width, int height, int type, int bits) {
- image_t image;
- int i;
-
- // find a free image_t
- for (i = 0; i<numgltextures ; i++)
- {
- image = gltextures[i];
- if (image.texnum == 0)
- break;
- }
-
- if (i == numgltextures)
- {
- if (numgltextures == MAX_GLTEXTURES)
- Com.Error (Defines.ERR_DROP, "MAX_GLTEXTURES");
-
- numgltextures++;
- }
- image = gltextures[i];
-
- if (name.length() > Defines.MAX_QPATH)
- Com.Error(Defines.ERR_DROP, "Draw_LoadPic: \"" + name + "\" is too long");
-
- image.name = name;
- image.registration_sequence = registration_sequence;
-
- image.width = width;
- image.height = height;
- image.type = type;
-
-
- if (type == it_skin && bits == 8)
- R_FloodFillSkin(pic, width, height);
-
- // load little pics into the scrap
- if (image.type == it_pic && bits == 8 && image.width < 64 && image.height < 64) {
- pos_t pos = new pos_t(0, 0);
- int j, k;
-
- int texnum = Scrap_AllocBlock(image.width, image.height, pos);
-
- if (texnum == -1) {
- // replace goto nonscrap
- image.scrap = false;
-
- image.texnum = TEXNUM_IMAGES + image.getId(); // image pos in array
- GL_Bind(image.texnum);
+ IntBuffer texnumBuffer = BufferUtils.createIntBuffer(1);
- if (bits == 8) {
- image.has_alpha =
- GL_Upload8(pic, width, height, (image.type != it_pic && image.type != it_sky), image.type == it_sky);
- }
- else {
- int[] tmp = new int[pic.length / 4];
-
- for (i = 0; i < tmp.length; i++) {
- tmp[i] = ((pic[4 * i + 0] & 0xFF) << 0); // & 0x000000FF;
- tmp[i] |= ((pic[4 * i + 1] & 0xFF) << 8); // & 0x0000FF00;
- tmp[i] |= ((pic[4 * i + 2] & 0xFF) << 16); // & 0x00FF0000;
- tmp[i] |= ((pic[4 * i + 3] & 0xFF) << 24); // & 0xFF000000;
- }
-
- image.has_alpha = GL_Upload32(tmp, width, height, (image.type != it_pic && image.type != it_sky));
- }
-
- image.upload_width = upload_width; // after power of 2 and scales
- image.upload_height = upload_height;
- image.paletted = uploaded_paletted;
- image.sl = 0;
- image.sh = 1;
- image.tl = 0;
- image.th = 1;
-
- return image;
- }
-
- scrap_dirty = true;
-
- // copy the texels into the scrap block
- k = 0;
- for (i = 0; i < image.height; i++)
- for (j = 0; j < image.width; j++, k++)
- scrap_texels[texnum][(pos.y + i) * BLOCK_WIDTH + pos.x + j] = pic[k];
-
- image.texnum = TEXNUM_SCRAPS + texnum;
- image.scrap = true;
- image.has_alpha = true;
- image.sl = (pos.x + 0.01f) / (float) BLOCK_WIDTH;
- image.sh = (pos.x + image.width - 0.01f) / (float) BLOCK_WIDTH;
- image.tl = (pos.y + 0.01f) / (float) BLOCK_WIDTH;
- image.th = (pos.y + image.height - 0.01f) / (float) BLOCK_WIDTH;
-
- }
- else {
- // this was label nonscrap
-
- image.scrap = false;
-
- image.texnum = TEXNUM_IMAGES + image.getId(); //image pos in array
- GL_Bind(image.texnum);
-
- if (bits == 8) {
- image.has_alpha = GL_Upload8(pic, width, height, (image.type != it_pic && image.type != it_sky), image.type == it_sky);
- }
- else {
- int[] tmp = new int[pic.length / 4];
-
- for (i = 0; i < tmp.length; i++) {
- tmp[i] = ((pic[4 * i + 0] & 0xFF) << 0); // & 0x000000FF;
- tmp[i] |= ((pic[4 * i + 1] & 0xFF) << 8); // & 0x0000FF00;
- tmp[i] |= ((pic[4 * i + 2] & 0xFF) << 16); // & 0x00FF0000;
- tmp[i] |= ((pic[4 * i + 3] & 0xFF) << 24); // & 0xFF000000;
- }
-
- image.has_alpha = GL_Upload32(tmp, width, height, (image.type != it_pic && image.type != it_sky));
- }
- image.upload_width = upload_width; // after power of 2 and scales
- image.upload_height = upload_height;
- image.paletted = uploaded_paletted;
- image.sl = 0;
- image.sh = 1;
- image.tl = 0;
- image.th = 1;
- }
- return image;
- }
-
- /*
- ================
- GL_LoadWal
- ================
- */
- image_t GL_LoadWal(String name) {
-
- image_t image = null;
-
- byte[] raw = FS.LoadFile(name);
- if (raw == null) {
- VID.Printf(Defines.PRINT_ALL, "GL_FindImage: can't load " + name + '\n');
- return r_notexture;
- }
-
- qfiles.miptex_t mt = new qfiles.miptex_t(raw);
-
- byte[] pix = new byte[mt.width * mt.height];
- System.arraycopy(raw, mt.offsets[0], pix, 0, pix.length);
-
- image = GL_LoadPic(name, pix, mt.width, mt.height, it_wall, 8);
-
- return image;
- }
-
- /*
- ===============
- GL_FindImage
-
- Finds or loads the given image
- ===============
- */
- image_t GL_FindImage(String name, int type) {
- image_t image = null;
-
-// // TODO loest das grossschreibungs problem
-// name = name.toLowerCase();
-// // bughack for bad strings (fuck \0)
-// int index = name.indexOf('\0');
-// if (index != -1)
-// name = name.substring(0, index);
-
- if (name == null || name.length() < 5)
- return null; // Com.Error (ERR_DROP, "GL_FindImage: NULL name");
- // Com.Error (ERR_DROP, "GL_FindImage: bad name: %s", name);
-
- // look for it
- for (int i = 0; i < numgltextures; i++)
- {
- image = gltextures[i];
- if (name.equals(image.name))
- {
- image.registration_sequence = registration_sequence;
- return image;
- }
- }
-
- //
- // load the pic from disk
- //
- image = null;
- byte[] pic = null;
- Dimension dim = new Dimension();
-
- if (name.endsWith(".pcx")) {
-
- pic = LoadPCX(name, null, dim);
- if (pic == null)
- return null;
- image = GL_LoadPic(name, pic, dim.width, dim.height, type, 8);
-
- }
- else if (name.endsWith(".wal")) {
-
- image = GL_LoadWal(name);
-
- }
- else if (name.endsWith(".tga")) {
-
- pic = LoadTGA(name, dim);
-
- if (pic == null)
- return null;
-
- image = GL_LoadPic(name, pic, dim.width, dim.height, type, 32);
-
- }
-
- return image;
- }
-
- /*
- ===============
- R_RegisterSkin
- ===============
- */
- protected image_t R_RegisterSkin(String name) {
- return GL_FindImage(name, it_skin);
- }
-
- IntBuffer texnumBuffer=BufferUtils.createIntBuffer(1);
-
- /*
- ================
- GL_FreeUnusedImages
-
- Any image that was not touched on this registration sequence
- will be freed.
- ================
- */
- void GL_FreeUnusedImages() {
+ /**
+ * GL_FreeUnusedImages
+ *
+ * Any image that was not touched on this registration sequence will be
+ * freed.
+ */
+ protected void GL_FreeUnusedImages() {
// never free r_notexture or particle texture
r_notexture.registration_sequence = registration_sequence;
@@ -1572,122 +388,31 @@ public abstract class Image extends Main {
// free it
// TODO jogl bug
texnumBuffer.clear();
- texnumBuffer.put(0,image.texnum);
+ texnumBuffer.put(0, image.texnum);
gl.glDeleteTextures(texnumBuffer);
image.clear();
}
}
- /*
- ===============
- Draw_GetPalette
- ===============
- */
- protected void Draw_GetPalette() {
- int r, g, b;
- Dimension dim;
- byte[] pic;
- byte[][] palette = new byte[1][]; //new byte[768];
-
- // get the palette
-
- pic = LoadPCX("pics/colormap.pcx", palette, dim = new Dimension());
-
- if (palette[0] == null || palette[0].length != 768)
- Com.Error(Defines.ERR_FATAL, "Couldn't load pics/colormap.pcx");
-
- byte[] pal = palette[0];
-
- int j = 0;
- for (int i = 0; i < 256; i++) {
- r = pal[j++] & 0xFF;
- g = pal[j++] & 0xFF;
- b = pal[j++] & 0xFF;
-
- d_8to24table[i] = (255 << 24) | (b << 16) | (g << 8) | (r << 0);
- }
-
- d_8to24table[255] &= 0x00FFFFFF; // 255 is transparent
-
- particle_t.setColorPalette(d_8to24table);
- }
-
- /*
- ===============
- GL_InitImages
- ===============
- */
- void GL_InitImages() {
- int i, j;
- float g = vid_gamma.value;
-
- registration_sequence = 1;
-
- // init intensity conversions
- intensity = Cvar.Get("intensity", "2", 0);
-
- if (intensity.value <= 1)
- Cvar.Set("intensity", "1");
-
- gl_state.inverse_intensity = 1 / intensity.value;
-
- Draw_GetPalette();
-
- if (qglColorTableEXT) {
- gl_state.d_16to8table = FS.LoadFile("pics/16to8.dat");
- if (gl_state.d_16to8table == null)
- Com.Error(Defines.ERR_FATAL, "Couldn't load pics/16to8.pcx");
- }
-
- if ((gl_config.renderer & (GL_RENDERER_VOODOO | GL_RENDERER_VOODOO2)) != 0) {
- g = 1.0F;
- }
-
- for (i = 0; i < 256; i++) {
-
- if (g == 1.0f) {
- gammatable[i] = (byte) i;
- }
- else {
-
- int inf = (int) (255.0f * Math.pow((i + 0.5) / 255.5, g) + 0.5);
- if (inf < 0)
- inf = 0;
- if (inf > 255)
- inf = 255;
- gammatable[i] = (byte) inf;
- }
- }
- for (i = 0; i < 256; i++) {
- j = (int) (i * intensity.value);
- if (j > 255)
- j = 255;
- intensitytable[i] = (byte) j;
- }
- }
- /*
- ===============
- GL_ShutdownImages
- ===============
- */
- void GL_ShutdownImages() {
+ /**
+ * GL_ShutdownImages.
+ */
+ protected void GL_ShutdownImages() {
image_t image;
-
- for (int i=0; i < numgltextures ; i++)
- {
+
+ for (int i = 0; i < numgltextures; i++) {
image = gltextures[i];
-
+
if (image.registration_sequence == 0)
- continue; // free image_t slot
+ continue; // free image_t slot
// free it
// TODO jogl bug
texnumBuffer.clear();
- texnumBuffer.put(0,image.texnum);
+ texnumBuffer.put(0, image.texnum);
gl.glDeleteTextures(texnumBuffer);
- image.clear();
+ image.clear();
}
}
-
}