kuake2.render.lwjgl.Draw.java Source code

Java tutorial

Introduction

Here is the source code for kuake2.render.lwjgl.Draw.java

Source

/*
 * 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 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.
 * 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 kuake2.render.lwjgl;

import kuake2.Defines;
import kuake2.client.VID;
import kuake2.qcommon.Com;
import kuake2.render.image_t;
import kuake2.util.Lib;
import org.lwjgl.opengl.GL11;

import java.awt.*;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

/**
 * Draw
 * (gl_draw.c)
 *
 * @author cwei
 */
public abstract class Draw extends Image {

    // allocate a 256 * 256 texture buffer
    private ByteBuffer image8 = Lib.newByteBuffer(256 * 256 * Defines.SIZE_OF_INT);
    // share the buffer
    private IntBuffer image32 = image8.asIntBuffer();

    /*
    ===============
    Draw_InitLocal
    ===============
    */
    void Draw_InitLocal() {
        // load console characters (don't bilerp characters)
        draw_chars = GL_FindImage("pics/conchars.pcx", it_pic);
        GL_Bind(draw_chars.texnum);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
    }

    /*
    ================
    Draw_Char
        
    Draws one 8*8 graphics character with 0 being transparent.
    It can be clipped to the top of the screen to allow the console to be
    smoothly scrolled off.
    ================
    */
    protected void Draw_Char(int x, int y, int num) {

        num &= 255;

        if ((num & 127) == 32)
            return; // space

        if (y <= -8)
            return; // totally off screen

        int row = num >> 4;
        int col = num & 15;

        float frow = row * 0.0625f;
        float fcol = col * 0.0625f;
        float size = 0.0625f;

        GL_Bind(draw_chars.texnum);

        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(fcol, frow);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(fcol + size, frow);
        GL11.glVertex2f(x + 8, y);
        GL11.glTexCoord2f(fcol + size, frow + size);
        GL11.glVertex2f(x + 8, y + 8);
        GL11.glTexCoord2f(fcol, frow + size);
        GL11.glVertex2f(x, y + 8);
        GL11.glEnd();
    }

    /*
    =============
    Draw_FindPic
    =============
    */
    protected image_t Draw_FindPic(String name) {
        image_t image = null;
        String fullname;

        if (!name.startsWith("/") && !name.startsWith("\\")) {
            fullname = "pics/" + name + ".pcx";
            image = GL_FindImage(fullname, it_pic);
        } else {
            image = GL_FindImage(name.substring(1), it_pic);
        }
        return image;
    }

    /*
    =============
    Draw_GetPicSize
    =============
    */
    protected void Draw_GetPicSize(Dimension dim, String pic) {

        image_t image = Draw_FindPic(pic);
        dim.width = (image != null) ? image.width : -1;
        dim.height = (image != null) ? image.height : -1;
    }

    /*
    =============
    Draw_StretchPic
    =============
    */
    protected void Draw_StretchPic(int x, int y, int w, int h, String pic) {

        image_t image;

        image = Draw_FindPic(pic);
        if (image == null) {
            VID.Printf(Defines.PRINT_ALL, "Can't find pic: " + pic + '\n');
            return;
        }

        if (scrap_dirty)
            Scrap_Upload();

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glDisable(GL11.GL_ALPHA_TEST);

        GL_Bind(image.texnum);
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(image.sl, image.tl);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(image.sh, image.tl);
        GL11.glVertex2f(x + w, y);
        GL11.glTexCoord2f(image.sh, image.th);
        GL11.glVertex2f(x + w, y + h);
        GL11.glTexCoord2f(image.sl, image.th);
        GL11.glVertex2f(x, y + h);
        GL11.glEnd();

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glEnable(GL11.GL_ALPHA_TEST);
    }

    /*
    =============
    Draw_Pic
    =============
    */
    protected void Draw_Pic(int x, int y, String pic) {
        image_t image;

        image = Draw_FindPic(pic);
        if (image == null) {
            VID.Printf(Defines.PRINT_ALL, "Can't find pic: " + pic + '\n');
            return;
        }
        if (scrap_dirty)
            Scrap_Upload();

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glDisable(GL11.GL_ALPHA_TEST);

        GL_Bind(image.texnum);

        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(image.sl, image.tl);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(image.sh, image.tl);
        GL11.glVertex2f(x + image.width, y);
        GL11.glTexCoord2f(image.sh, image.th);
        GL11.glVertex2f(x + image.width, y + image.height);
        GL11.glTexCoord2f(image.sl, image.th);
        GL11.glVertex2f(x, y + image.height);
        GL11.glEnd();

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glEnable(GL11.GL_ALPHA_TEST);
    }

    //=============================================================================

    /*
    =============
    Draw_TileClear
        
    This repeats a 64*64 tile graphic to fill the screen around a sized down
    refresh window.
    =============
    */
    protected void Draw_TileClear(int x, int y, int w, int h, String pic) {
        image_t image;

        image = Draw_FindPic(pic);
        if (image == null) {
            VID.Printf(Defines.PRINT_ALL, "Can't find pic: " + pic + '\n');
            return;
        }

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glDisable(GL11.GL_ALPHA_TEST);

        GL_Bind(image.texnum);
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(x / 64.0f, y / 64.0f);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f((x + w) / 64.0f, y / 64.0f);
        GL11.glVertex2f(x + w, y);
        GL11.glTexCoord2f((x + w) / 64.0f, (y + h) / 64.0f);
        GL11.glVertex2f(x + w, y + h);
        GL11.glTexCoord2f(x / 64.0f, (y + h) / 64.0f);
        GL11.glVertex2f(x, y + h);
        GL11.glEnd();

        if (((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
                && !image.has_alpha)
            GL11.glEnable(GL11.GL_ALPHA_TEST);
    }

    // ====================================================================

    /*
    =============
    Draw_Fill
        
    Fills a box of pixels with a single color
    =============
    */
    protected void Draw_Fill(int x, int y, int w, int h, int colorIndex) {

        if (colorIndex > 255)
            Com.Error(Defines.ERR_FATAL, "Draw_Fill: bad color");

        GL11.glDisable(GL11.GL_TEXTURE_2D);

        int color = d_8to24table[colorIndex];

        GL11.glColor3ub((byte) ((color >> 0) & 0xff), // r
                (byte) ((color >> 8) & 0xff), // g
                (byte) ((color >> 16) & 0xff) // b
        );

        GL11.glBegin(GL11.GL_QUADS);

        GL11.glVertex2f(x, y);
        GL11.glVertex2f(x + w, y);
        GL11.glVertex2f(x + w, y + h);
        GL11.glVertex2f(x, y + h);

        GL11.glEnd();
        GL11.glColor3f(1, 1, 1);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
    }

    /*
    ================
    Draw_FadeScreen
    ================
    */
    protected void Draw_FadeScreen() {
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glColor4f(0, 0, 0, 0.8f);
        GL11.glBegin(GL11.GL_QUADS);

        GL11.glVertex2f(0, 0);
        GL11.glVertex2f(vid.width, 0);
        GL11.glVertex2f(vid.width, vid.height);
        GL11.glVertex2f(0, vid.height);

        GL11.glEnd();
        GL11.glColor4f(1, 1, 1, 1);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);
    }

    /*
    =============
    Draw_StretchRaw
    =============
    */
    protected void Draw_StretchRaw(int x, int y, int w, int h, int cols, int rows, byte[] data) {
        int i, j, trows;
        int sourceIndex;
        int frac, fracstep;
        float hscale;
        int row;
        float t;

        GL_Bind(0);

        if (rows <= 256) {
            hscale = 1;
            trows = rows;
        } else {
            hscale = rows / 256.0f;
            trows = 256;
        }
        t = rows * hscale / 256;

        if (!qglColorTableEXT) {
            //int[] image32 = new int[256*256];
            image32.clear();
            int destIndex = 0;

            for (i = 0; i < trows; i++) {
                row = (int) (i * hscale);
                if (row > rows)
                    break;
                sourceIndex = cols * row;
                destIndex = i * 256;
                fracstep = cols * 0x10000 / 256;
                frac = fracstep >> 1;
                for (j = 0; j < 256; j++) {
                    image32.put(destIndex + j, r_rawpalette[data[sourceIndex + (frac >> 16)] & 0xff]);
                    frac += fracstep;
                }
            }
            GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, gl_tex_solid_format, 256, 256, 0, GL11.GL_RGBA,
                    GL11.GL_UNSIGNED_BYTE, image32);
        } else {
            //byte[] image8 = new byte[256*256];
            image8.clear();
            int destIndex = 0;
            ;

            for (i = 0; i < trows; i++) {
                row = (int) (i * hscale);
                if (row > rows)
                    break;
                sourceIndex = cols * row;
                destIndex = i * 256;
                fracstep = cols * 0x10000 / 256;
                frac = fracstep >> 1;
                for (j = 0; j < 256; j++) {
                    image8.put(destIndex + j, data[sourceIndex + (frac >> 16)]);
                    frac += fracstep;
                }
            }

            GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, 256, 256, 0, GL11.GL_COLOR_INDEX,
                    GL11.GL_UNSIGNED_BYTE, image8);
        }
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);

        if ((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
            GL11.glDisable(GL11.GL_ALPHA_TEST);

        GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(x, y);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(x + w, y);
        GL11.glTexCoord2f(1, t);
        GL11.glVertex2f(x + w, y + h);
        GL11.glTexCoord2f(0, t);
        GL11.glVertex2f(x, y + h);
        GL11.glEnd();

        if ((gl_config.renderer == GL_RENDERER_MCD) || ((gl_config.renderer & GL_RENDERER_RENDITION) != 0))
            GL11.glEnable(GL11.GL_ALPHA_TEST);
    }

}