// $Header: /cvs/gled-1.2/Geom1/Glasses/ZImage.cxx,v 1.7 2005/03/11 17:50:14 matevz Exp $

// Copyright (C) 1999-2005, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// ZImage
//
// This is a glass wrapper for DevIL image.
// It should be used for loading/saving/binding of images, as this class
// contains a static mutex to perform locking of all IL operations.

#include "ZImage.h"

#include <IL/il.h>
#include <IL/ilu.h>
#include <GL/gl.h>

namespace {
  /* IL reporting */

  bool il_err(const char* s) {
    ILenum er = ilGetError();
    if(er) {
      printf("DevIL error at %s error: %s\n", s, iluErrorString(er));
    }
    return (er != 0);
  }
  char* fmt2name(ILint fmt) {
    switch(fmt) {
    case IL_COLOR_INDEX: return "COLOR_INDEX";
    case IL_RGB: return "RGB";
    case IL_RGBA: return "RGBA";
    case IL_BGR: return "BGR";
    case IL_BGRA: return "BGRA";
    case IL_LUMINANCE: return "LUMINANCE";
    case IL_LUMINANCE_ALPHA: return "LUMINANCE_ALPHA";
    default: return "unknown";
    }
  }
  char* typ2name(ILint typ) {
    switch(typ) {
    case IL_BYTE: return "BYTE";
    case IL_UNSIGNED_BYTE: return "UNSIGNED_BYTE";
    case IL_SHORT: return "SHORT";
    case IL_UNSIGNED_SHORT: return "UNSIGNED_SHORT";
    case IL_INT: return "INT";
    case IL_UNSIGNED_INT: return "UNSIGNED_INT";
    case IL_FLOAT: return "FLOAT";
    case IL_DOUBLE: return "DOUBLE";
    default: return "unknown";
    }
  }
  void il_id() {
    // Display the image's dimensions to the user.
    ILint fmt, typ;
    printf("Width: %d  Height: %d  Depth: %d Bytespp: %d Bpp: %dn",
	   ilGetInteger(IL_IMAGE_WIDTH),
	   ilGetInteger(IL_IMAGE_HEIGHT),
	   ilGetInteger(IL_IMAGE_DEPTH),
	   ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL),
	   ilGetInteger(IL_IMAGE_BITS_PER_PIXEL));

    fmt = ilGetInteger(IL_IMAGE_FORMAT);
    typ = ilGetInteger(IL_IMAGE_TYPE);

    printf("Format: %s  Type: %sn",
	   fmt2name(fmt), typ2name(typ));
  }

}


ClassImp(ZImage)

GMutex ZImage::sILMutex(GMutex::recursive);
Bool_t ZImage::sVerboseLoad(false);

/**************************************************************************/

 void ZImage::_init()
{
  mIL_Name = 0;
  mW = mH = 0;
  mImgFmt = 0;
  mImgTyp = 0;
  mIntFmt = GL_RGB8;

  mMagFilter = mMinFilter = GL_NEAREST;
  mEnvMode = GL_DECAL;

  bLoadAdEnlight = false;
  bUseShadowing  = true;
  bLoaded        = false;
  bShadowed      = false;
}

 ZImage::~ZImage() {
  delete_image();
}

 void ZImage::AdEnlightenment()
{
  ZGlass::AdEnlightenment();
  if(bLoadAdEnlight) Load();
}

/**************************************************************************/

 void ZImage::SetUseShadowing(Bool_t useshadowing)
{
  if(useshadowing == bUseShadowing) return;
  if(useshadowing) {
    if(bLoaded && !bShadowed) {
      shadow();
    }
  } else {
    if(bLoaded && bShadowed) {
      bind();
    }
  }
  bUseShadowing = useshadowing;
  Stamp(FID());
}

 void ZImage::Load()
{
  sILMutex.Lock();

  delete_image();
  bLoaded = false;
  ilGenImages(1, &mIL_Name);
  if(il_err("Gen images")) goto end;

  ilBindImage(mIL_Name);
  if(il_err("Bind Image")) goto end;

  if (!ilLoadImage(const_cast<char *>(mFile.Data()))) {
    il_err(GForm("Load Image <file:%s>", mFile.Data()));
    goto end;
  }

  if(sVerboseLoad) il_id();

  mW = ilGetInteger(IL_IMAGE_WIDTH);
  mH = ilGetInteger(IL_IMAGE_HEIGHT);
  mImgFmt = gl_format();
  mImgTyp = gl_type();
  bLoaded = true;

  if(bUseShadowing) shadow();

 end:
  mStampReqTring = Stamp(FID());
  sILMutex.Unlock();
}

 void ZImage::Unload()
{
  sILMutex.Lock();
  delete_image();
  bLoaded = false; bShadowed = false;
  mStampReqTring = Stamp(FID());
  sILMutex.Unlock();
}

 void ZImage::Save()
{
  // Could easily be implemented now ... that we have devil.
}

/**************************************************************************/

// User's responsibility to lock/unlock image operations
// and assert that image is loaded.

 void ZImage::bind()
{
  if(bShadowed && bUseShadowing) {

    ilGenImages(1, &mIL_Name);
    if(il_err("Gen images")) goto error;

    ilBindImage(mIL_Name);
    if(il_err("Bind Image")) goto error;

    if (!ilLoadImage(const_cast<char *>(mFile.Data()))) {
      il_err("Load Image");
      goto error;
    }

    bShadowed = false;

  } else {

    ilBindImage(mIL_Name);
    if(il_err("Bind Image")) goto error;

  }

  return;

 error:
  bLoaded = false;
  // Do not emit the stamp ...
}

 void ZImage::unbind()
{
  if(bUseShadowing && !bShadowed) {
    shadow();
  }
}

 void ZImage::shadow()
{
  delete_image();
  bShadowed = true;
}

 void ZImage::delete_image()
{
  if(mIL_Name) {
    ilDeleteImages(1, &mIL_Name);
    mIL_Name = 0;
  }
}

/**************************************************************************/

 int ZImage::w() {
  return ilGetInteger(IL_IMAGE_WIDTH);
}

 int ZImage::h() {
  return ilGetInteger(IL_IMAGE_HEIGHT);
}

 void* ZImage::data()
{
  return ilGetData();
}

 int ZImage::gl_format()
{
  ILint fmt = ilGetInteger(IL_IMAGE_FORMAT);
  switch(fmt) {
  case IL_COLOR_INDEX:		return GL_COLOR_INDEX;
  case IL_RGB:			return GL_RGB;
  case IL_RGBA:			return GL_RGBA;
  case IL_BGR:			return GL_BGR;
  case IL_BGRA:			return GL_BGRA;
  case IL_LUMINANCE:		return GL_LUMINANCE;
  case IL_LUMINANCE_ALPHA:	return GL_LUMINANCE_ALPHA;
  default:			return 0;
  }

}

 int ZImage::gl_type()
{
  ILint typ = ilGetInteger(IL_IMAGE_TYPE);
  switch(typ) {
  case IL_BYTE:			return GL_BYTE;
  case IL_UNSIGNED_BYTE:	return GL_UNSIGNED_BYTE;
  case IL_SHORT:		return GL_SHORT;
  case IL_UNSIGNED_SHORT:	return GL_UNSIGNED_SHORT;
  case IL_INT:			return GL_INT;
  case IL_UNSIGNED_INT:		return GL_UNSIGNED_INT;
  case IL_FLOAT:		return GL_FLOAT;
  case IL_DOUBLE:		return GL_DOUBLE;
  default: return 0;
  }
}

/**************************************************************************/

// For now, user init is here ... when another piece will need initialization
// it would better be placed somwhere else.

void libGeom1_GLED_user_init()
{
  ilInit();
  iluInit();
}

void *Geom1_GLED_user_init = (void*)libGeom1_GLED_user_init;

/**************************************************************************/

#include "ZImage.c7"


ROOT page - Home page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.