#include "pch.cpp"
#pragma hdrstop

#include "glrend.h"
#include "util.h"

BOOL gl_bUsePalettedTexture = FALSE;

GlTexture::GlTexture(void)
{
    _uiTexObj = 0;
    _im.pvImage = NULL;
}

BOOL GlTexture::Initialize(char* pszFile)
{
    ImageFormat ifmt;

    if (gl_bUsePalettedTexture)
    {
	ifmt.nColorBits = 8;
	ifmt.bQuantize = TRUE;
    }
    else
    {
	ifmt.nColorBits = 24;
	ifmt.bQuantize = FALSE;
	ifmt.iRedBits = 8;
	ifmt.iRedShift = 0;
	ifmt.iGreenBits = 8;
	ifmt.iGreenShift = 8;
	ifmt.iBlueBits = 8;
	ifmt.iBlueShift = 16;
    }

    if (!LoadPPM(pszFile, &ifmt, &_im))
    {
        return FALSE;
    }

    glGenTextures(1, &_uiTexObj);
    glBindTexture(GL_TEXTURE_2D, _uiTexObj);
    // ATTENTION - polytest wants clamping on T but that's pig slow
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, DEF_TEX_MAG);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, DEF_TEX_MIN);
    // ATTENTION - We have to use modulate for correct visual results
    // but this is bad for performance
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, DEF_TEX_MODE);
    if (gl_bUsePalettedTexture)
    {
	PFNGLCOLORTABLEEXTPROC pfnColorTableEXT;

	pfnColorTableEXT = (PFNGLCOLORTABLEEXTPROC)
	    wglGetProcAddress("glColorTableEXT");
	if (pfnColorTableEXT != NULL)
	{
	    glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT,
			 _im.uiWidth, _im.uiHeight, 0,
			 GL_COLOR_INDEX, GL_UNSIGNED_BYTE, _im.pvImage);
	    pfnColorTableEXT(GL_TEXTURE_2D, GL_RGB, 256,
			     GL_BGRA_EXT, GL_UNSIGNED_BYTE, _im.dcolPalette);
	}
	else
	{
	    dpf("OpenGL unable to use paletted texture\n");    
	    glTexImage2D(GL_TEXTURE_2D, 0, 3, _im.uiWidth, _im.uiHeight, 0,
			 GL_RGB, GL_UNSIGNED_BYTE, _im.pvImage);
	}
    }
    else
    {
	glTexImage2D(GL_TEXTURE_2D, 0, 3, _im.uiWidth, _im.uiHeight, 0,
		     GL_RGB, GL_UNSIGNED_BYTE, _im.pvImage);
    }

    // Keep the image data around in case we want to support
    // non-texture-object rendering
    
    return TRUE;
}

GlTexture::~GlTexture(void)
{
    if (_uiTexObj != 0)
    {
        glDeleteTextures(1, &_uiTexObj);
    }
    delete [] _im.pvImage;
}

void GlTexture::Release(void)
{
    delete this;
}

D3DTEXTUREHANDLE GlTexture::Handle(void)
{
    return (D3DTEXTUREHANDLE)_uiTexObj;
}