ROOT logo
// $Id: ZImage.cxx 2417 2010-07-24 11:31:48Z matevz $

// Copyright (C) 1999-2008, 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/.

//__________________________________________________________________________
//
// 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.
//
// Some ILU image transformations are not wrapped yet.
// Do NOT use shadowing when applying the transforms.
//
// When mMinFilter is one of mip-map ones, the mip-maps are generated
// automatically by calling glGenerateMipmapEXT().

#include "ZImage.h"
#include "ZImage.c7"

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

#include <TMath.h>
#include <TSystem.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);
  }
  const 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";
    }
  }
  const 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: %d\n",
	   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: %s\n",
	   fmt2name(fmt), typ2name(typ));
  }

}


ClassImp(ZImage);

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

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

void ZImage::_init()
{
  // From ZGlass:
  bUseNameStack = false;

  m_data = 0;
  m_bpp  = 0;
  mIL_Name = 0;

  mW = mH = 0;
  mImgFmt = 0;
  mImgTyp = 0;
  mIntFmt = GL_RGB8;

  mSWrap = mTWrap = GL_REPEAT;
  mMagFilter = mMinFilter = GL_NEAREST;
  mEnvMode = GL_DECAL;

  bLoadAdEnlight = false;
  bLoadAdBind    = true;
  bUseShadowing  = true;
  bSmartShadow   = 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;

  if(load_image()) {
    bLoaded = true;
    if(bUseShadowing && !bSmartShadow)
      shadow();
  }

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

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

void ZImage::Save(const Text_t* file)
{
  // Save image to file or mFile (if file not provided).
  // Image must be loaded.

  static const Exc_t _eh("ZImage::Save ");

  if(!bLoaded)
    throw(_eh + "image not loaded.");
  if(file == 0) {
    if(mFile.IsNull())
      throw(_eh + "file-name not provided and mFile empty.");
    file = mFile.Data();
  }

  sILMutex.Lock();
  ilBindImage(mIL_Name);
  ilSaveImage(file);
  il_err(_eh.Data());
  sILMutex.Unlock();
}

Bool_t ZImage::IsBindable()
{
  return bLoaded ||
    (bLoadAdBind && mFile != "" &&
     gSystem->AccessPathName(mFile, kReadPermission) == 0);
}

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

void ZImage::shadow_check(const Exc_t& eh)
{
  if(IsBindable()) {
    if(bUseShadowing && bSmartShadow) {
      warn_caller(eh + "SmartShadow disbling shadowing on '" + Identify() + "'.");
      bUseShadowing = false;
    }
  } else {
    throw(eh + "'" + Identify() + "' not bindable.");
  }
}

void ZImage::BlurAverage(UInt_t count)
{
  static const Exc_t _eh("ZImage::BlurAverage ");
  shadow_check(_eh);

  sILMutex.Lock();
  bind();
  iluBlurAvg(count);
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

void ZImage::BlurGaussian(UInt_t count)
{
  static const Exc_t _eh("ZImage::BlurGaussian ");
  shadow_check(_eh);

  sILMutex.Lock();
  bind();
  iluBlurGaussian(count);
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

void ZImage::Contrastify(Float_t contrast)
{
  static const Exc_t _eh("ZImage::Contrastify ");
  shadow_check(_eh);

  if(contrast > 1.7)  contrast = 1.7;
  if(contrast < -0.5) contrast = -0.5;
  sILMutex.Lock();
  bind();
  iluContrast(contrast);
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

void ZImage::Equalize()
{
  static const Exc_t _eh("ZImage::Equalize ");
  shadow_check(_eh);

  sILMutex.Lock();
  bind();
  iluEqualize();
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

void ZImage::Rotate(Float_t angle)
{
  // Interface to iluRotate (which seems to be badly bugged).

  static const Exc_t _eh("ZImage::Rotate ");
  shadow_check(_eh);

  sILMutex.Lock();
  bind();
  iluRotate(angle);
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

void ZImage::Mirror()
{
  // Interface to iluMirror (flip around y axis).

  static const Exc_t _eh("ZImage::Mirror ");
  shadow_check(_eh);

  sILMutex.Lock();
  bind();
  iluMirror();
  unbind();
  sILMutex.Unlock();
  mStampReqTring = Stamp(FID());
}

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

void ZImage::SetupAsCanvas(Int_t w, Int_t h, Int_t bpp, Bool_t clear_p)
{
  static const Exc_t _eh("ZImage::SetupAsCanvas ");

  switch(bpp) {
  case 1:
    mImgFmt = GL_LUMINANCE;
    mImgTyp = GL_UNSIGNED_BYTE;
    mIntFmt = GL_INTENSITY8;
    break;
  case 2:
    mImgFmt = GL_LUMINANCE;
    mImgTyp = GL_UNSIGNED_SHORT;
    mIntFmt = GL_INTENSITY16;
    break;
  case 3:
    mImgFmt = GL_RGB;
    mImgTyp = GL_UNSIGNED_BYTE;
    mIntFmt = GL_RGB8;
    break;
  case 4:
    mImgFmt = GL_RGBA;
    mImgTyp = GL_UNSIGNED_BYTE;
    mIntFmt = GL_RGBA8;
    break;
  default:
    throw(_eh + "unsupported bytes-per-pixel (1-4 valid).");
  }
  bUseShadowing  = false;

  sILMutex.Lock();
  create_image(w, h, bpp);
  if(clear_p) {
    if(bpp == 1) {
      memset(data(), int(255*mClearColor.gray()), mW*mH);
    }
    else if(bpp == 2) {
      int c = mW*mH;
      unsigned short *p = (unsigned short *) data();
      unsigned short  v = (unsigned short)(65535*mClearColor.gray());
      while(c--) *(p++) = v;
    }
    else {
      ILubyte c[4]; mClearColor.to_ubyte(c);
      ilClearColour(c[0], c[1], c[2], c[3]);
      ilClearImage();
    }
  }
  sILMutex.Unlock();

  mStampReqTring = Stamp(FID());
}

void ZImage::Diagonal(Float_t r, Float_t g, Float_t b)
{
  sILMutex.Lock();
  bind();
  sILMutex.Unlock();

  Int_t max = TMath::Max(mW, mH);
  for(Int_t i=0; i<max; ++i) {
    set_pixel(i, i, r, g, b);
    set_pixel(i, max-i-1, r, g, b);
  }

  mStampReqTring = Stamp(FID());
}

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

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

void ZImage::bind()
{
  static const Exc_t _eh("ZImage::bind ");

  if(!bLoaded && bLoadAdBind) {
    if(load_image())
      bLoaded = true;
    else
      goto error;
  }
  else if(bLoaded && bShadowed) {
    if(load_image())
      bShadowed = false;
    else
      goto error;
  }
  else if(bLoaded) {
    ilBindImage(mIL_Name);
    if(il_err("Bind Image"))
      goto error;
  }
  else {
    warn_caller(_eh + "unexpected state for '" + Identify() + "'.");
    goto error;
  }
  _setup();
  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;
    _reset();
  }
}

bool ZImage::load_image()
{
  ilGenImages(1, &mIL_Name);
  if(il_err("Gen images")) return false;

  ilBindImage(mIL_Name);
  if(il_err("Bind Image")) return false;

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

  if(sVerboseLoad) il_id();

  _setup();
  mW = ilGetInteger(IL_IMAGE_WIDTH);
  mH = ilGetInteger(IL_IMAGE_HEIGHT);
  if(ilGetInteger(IL_IMAGE_FORMAT) == IL_COLOR_INDEX) {
    ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);
  }
  mImgFmt = gl_format();
  mImgTyp = gl_type();

  return true;
}

void ZImage::create_image(Int_t w, Int_t h, Int_t bpp)
{
  static const Exc_t _eh("ZImage::create_image ");

  delete_image();
  bLoaded = false;
  ilGenImages(1, &mIL_Name);
  if(il_err("Gen Images")) throw(_eh + "Gen Images.");

  ilBindImage(mIL_Name);
  if(il_err("Bind Image")) throw(_eh + "Bind Image.");

  ilTexImage(w, h, 1, bpp, mImgFmt, mImgTyp, 0);
  _setup();
  mW = w; mH = h;
  bLoaded = true;
}

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

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

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

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

int ZImage::bpp()
{
  return ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL);
}

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;
  }
}


/**************************************************************************/
// Low-level pixel control
/**************************************************************************/

void ZImage::set_pixel(Int_t x, Int_t y, Float_t w)
{
  Int_t _w = Int_t(255*w);
  switch(m_bpp) {
  case 1: set_byte(x, y, _w); break;
  case 2: set_short(x, y, _w*255); break;
  case 3: set_rgb(x, y, _w, _w, _w); break;
  case 4: set_rgba(x, y, _w, _w, _w, 1); break;
  }
}

void ZImage::get_pixel(Int_t x, Int_t y, Float_t& w)
{
  switch(m_bpp) {
  case 1: { UChar_t  q; get_byte(x, y, q);  w = q/255.0;   break; }
  case 2: { UShort_t q; get_short(x, y, q); w = q/65535.0; break; }
  case 3: { UChar_t r,g,b;   get_rgb(x, y, r, g, b);     w = (r+g+b)/3.0/255.0; break; }
  case 4: { UChar_t r,g,b,a; get_rgba(x, y, r, g, b, a); w = (r+g+b)/3.0/255.0; break; }
  }
}


void  ZImage::set_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b)
{
  Int_t _r = Int_t(255*r), _g = Int_t(255*g), _b = Int_t(255*b);
  switch(m_bpp) {
  case 1: set_byte(x, y, (_r+_g+_b)/3); break;
  case 2: set_short(x, y, 255*(_r+_g+_b)/3); break;
  case 3: set_rgb(x, y, _r, _g, _b); break;
  case 4: set_rgba(x, y, _r, _g, _b, 1); break;
  }
}

void  ZImage::get_pixel(Int_t x, Int_t y, Float_t& r, Float_t& g, Float_t& b)
{
  switch(m_bpp) {
  case 1: { UChar_t q; get_byte(x, y, q);   r = g = b = q/255.0;   break; }
  case 2: { UShort_t q; get_short(x, y, q); r = g = b = q/65535.0; break; }
  case 3: { UChar_t _r,_g,_b;    get_rgb(x, y, _r, _g, _b);     r=_r/255.0; g=_g/255.0; b=_b/255.0; break; }
  case 4: { UChar_t _r,_g,_b,_a; get_rgba(x, y, _r, _g, _b, _a); r=_r/255.0; g=_g/255.0; b=_b/255.0; break; }
  }
}

void  ZImage::set_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Float_t a)
{
  Int_t _r = Int_t(255*r), _g = Int_t(255*g), _b = Int_t(255*b), _a = Int_t(255*a);
  switch(m_bpp) {
  case 1: set_byte(x, y, (_r+_g+_b)/3); break;
  case 2: set_short(x, y, 255*(_r+_g+_b)/3); break;
  case 3: set_rgb(x, y, _r, _g, _b); break;
  case 4: set_rgba(x, y, _r, _g, _b, _a); break;
  }
}

void  ZImage::get_pixel(Int_t x, Int_t y, Float_t& r, Float_t& g, Float_t& b, Float_t& a)
{
  a = 1;
  switch(m_bpp) {
  case 1: { UChar_t q; get_byte(x, y, q);   r = g = b = q/255.0;   break; }
  case 2: { UShort_t q; get_short(x, y, q); r = g = b = q/65535.0; break; }
  case 3: { UChar_t _r,_g,_b;    get_rgb(x, y, _r, _g, _b);     r=_r/255.0; g=_g/255.0; b=_b/255.0; break; }
  case 4: { UChar_t _r,_g,_b,_a; get_rgba(x, y, _r, _g, _b, _a); r=_r/255.0; g=_g/255.0; b=_b/255.0; a=_a/255.0; break; }
  }
}

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

namespace {
  inline Float_t add_clip(Float_t a, Float_t b, Bool_t clip)
  { a += b; if(clip && a > 1) return 1; return a; }
}

void ZImage::add_pixel(Int_t x, Int_t y, Float_t w, Bool_t clip)
{
  Float_t q; get_pixel(x,y,q);
  set_pixel(x, y, add_clip(w,q,clip));
}

void ZImage::add_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Bool_t clip)
{
  Float_t _r,_g,_b;
  get_pixel(x,y,_r,_g,_b);
  set_pixel(x,y, add_clip(_r,r,clip), add_clip(_g,g,clip), add_clip(_b,b,clip));
}

void ZImage::add_pixel(Int_t x, Int_t y, Float_t r, Float_t g, Float_t b, Float_t a, Bool_t clip)
{
  Float_t _r,_g,_b,_a;
  get_pixel(x,y,_r,_g,_b,_a);
  set_pixel(x,y, add_clip(_r,r,clip), add_clip(_g,g,clip), add_clip(_b,b,clip), add_clip(_a,a,clip));
}

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

namespace {
  inline void inc_clip(UChar_t& w, Bool_t clip)
  { if(++w == 0 && clip) --w; }
  inline void inc_clip(UShort_t& w, Bool_t clip)
  { if(++w == 0 && clip) --w; }
}


void ZImage::inc_pixel(Int_t x, Int_t y, Bool_t clip)
{
  switch(m_bpp) {
  case 1: { inc_clip(m_data[y*mH + x], clip); break; }
  case 2: { inc_clip(((UShort_t*)m_data)[y*mH + x], clip); break; }
  case 3:
  case 4: { UChar_t*p = &m_data[m_bpp*(y*mH + x)]; inc_clip(*p++, clip); inc_clip(*p++, clip); inc_clip(*p++, clip); break; }
  }
}

void ZImage::inc_pixel_idx(Int_t idx, Int_t x, Int_t y, Bool_t clip)
{
  switch(m_bpp) {
  case 1: { inc_clip(m_data[y*mH + x], clip); break; }
  case 2: { inc_clip(((UShort_t*)m_data)[y*mH + x], clip); break; }
  case 3:
  case 4: { UChar_t*p = &m_data[m_bpp*(y*mH + x)+idx]; inc_clip(*p++, clip); inc_clip(*p++, clip); inc_clip(*p++, clip); break; }
  }
}


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

// 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();

  ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
  ilEnable(IL_ORIGIN_SET);
}

void *Geom1_GLED_user_init = (void*)libGeom1_GLED_user_init;

/**************************************************************************/
 ZImage.cxx:1
 ZImage.cxx:2
 ZImage.cxx:3
 ZImage.cxx:4
 ZImage.cxx:5
 ZImage.cxx:6
 ZImage.cxx:7
 ZImage.cxx:8
 ZImage.cxx:9
 ZImage.cxx:10
 ZImage.cxx:11
 ZImage.cxx:12
 ZImage.cxx:13
 ZImage.cxx:14
 ZImage.cxx:15
 ZImage.cxx:16
 ZImage.cxx:17
 ZImage.cxx:18
 ZImage.cxx:19
 ZImage.cxx:20
 ZImage.cxx:21
 ZImage.cxx:22
 ZImage.cxx:23
 ZImage.cxx:24
 ZImage.cxx:25
 ZImage.cxx:26
 ZImage.cxx:27
 ZImage.cxx:28
 ZImage.cxx:29
 ZImage.cxx:30
 ZImage.cxx:31
 ZImage.cxx:32
 ZImage.cxx:33
 ZImage.cxx:34
 ZImage.cxx:35
 ZImage.cxx:36
 ZImage.cxx:37
 ZImage.cxx:38
 ZImage.cxx:39
 ZImage.cxx:40
 ZImage.cxx:41
 ZImage.cxx:42
 ZImage.cxx:43
 ZImage.cxx:44
 ZImage.cxx:45
 ZImage.cxx:46
 ZImage.cxx:47
 ZImage.cxx:48
 ZImage.cxx:49
 ZImage.cxx:50
 ZImage.cxx:51
 ZImage.cxx:52
 ZImage.cxx:53
 ZImage.cxx:54
 ZImage.cxx:55
 ZImage.cxx:56
 ZImage.cxx:57
 ZImage.cxx:58
 ZImage.cxx:59
 ZImage.cxx:60
 ZImage.cxx:61
 ZImage.cxx:62
 ZImage.cxx:63
 ZImage.cxx:64
 ZImage.cxx:65
 ZImage.cxx:66
 ZImage.cxx:67
 ZImage.cxx:68
 ZImage.cxx:69
 ZImage.cxx:70
 ZImage.cxx:71
 ZImage.cxx:72
 ZImage.cxx:73
 ZImage.cxx:74
 ZImage.cxx:75
 ZImage.cxx:76
 ZImage.cxx:77
 ZImage.cxx:78
 ZImage.cxx:79
 ZImage.cxx:80
 ZImage.cxx:81
 ZImage.cxx:82
 ZImage.cxx:83
 ZImage.cxx:84
 ZImage.cxx:85
 ZImage.cxx:86
 ZImage.cxx:87
 ZImage.cxx:88
 ZImage.cxx:89
 ZImage.cxx:90
 ZImage.cxx:91
 ZImage.cxx:92
 ZImage.cxx:93
 ZImage.cxx:94
 ZImage.cxx:95
 ZImage.cxx:96
 ZImage.cxx:97
 ZImage.cxx:98
 ZImage.cxx:99
 ZImage.cxx:100
 ZImage.cxx:101
 ZImage.cxx:102
 ZImage.cxx:103
 ZImage.cxx:104
 ZImage.cxx:105
 ZImage.cxx:106
 ZImage.cxx:107
 ZImage.cxx:108
 ZImage.cxx:109
 ZImage.cxx:110
 ZImage.cxx:111
 ZImage.cxx:112
 ZImage.cxx:113
 ZImage.cxx:114
 ZImage.cxx:115
 ZImage.cxx:116
 ZImage.cxx:117
 ZImage.cxx:118
 ZImage.cxx:119
 ZImage.cxx:120
 ZImage.cxx:121
 ZImage.cxx:122
 ZImage.cxx:123
 ZImage.cxx:124
 ZImage.cxx:125
 ZImage.cxx:126
 ZImage.cxx:127
 ZImage.cxx:128
 ZImage.cxx:129
 ZImage.cxx:130
 ZImage.cxx:131
 ZImage.cxx:132
 ZImage.cxx:133
 ZImage.cxx:134
 ZImage.cxx:135
 ZImage.cxx:136
 ZImage.cxx:137
 ZImage.cxx:138
 ZImage.cxx:139
 ZImage.cxx:140
 ZImage.cxx:141
 ZImage.cxx:142
 ZImage.cxx:143
 ZImage.cxx:144
 ZImage.cxx:145
 ZImage.cxx:146
 ZImage.cxx:147
 ZImage.cxx:148
 ZImage.cxx:149
 ZImage.cxx:150
 ZImage.cxx:151
 ZImage.cxx:152
 ZImage.cxx:153
 ZImage.cxx:154
 ZImage.cxx:155
 ZImage.cxx:156
 ZImage.cxx:157
 ZImage.cxx:158
 ZImage.cxx:159
 ZImage.cxx:160
 ZImage.cxx:161
 ZImage.cxx:162
 ZImage.cxx:163
 ZImage.cxx:164
 ZImage.cxx:165
 ZImage.cxx:166
 ZImage.cxx:167
 ZImage.cxx:168
 ZImage.cxx:169
 ZImage.cxx:170
 ZImage.cxx:171
 ZImage.cxx:172
 ZImage.cxx:173
 ZImage.cxx:174
 ZImage.cxx:175
 ZImage.cxx:176
 ZImage.cxx:177
 ZImage.cxx:178
 ZImage.cxx:179
 ZImage.cxx:180
 ZImage.cxx:181
 ZImage.cxx:182
 ZImage.cxx:183
 ZImage.cxx:184
 ZImage.cxx:185
 ZImage.cxx:186
 ZImage.cxx:187
 ZImage.cxx:188
 ZImage.cxx:189
 ZImage.cxx:190
 ZImage.cxx:191
 ZImage.cxx:192
 ZImage.cxx:193
 ZImage.cxx:194
 ZImage.cxx:195
 ZImage.cxx:196
 ZImage.cxx:197
 ZImage.cxx:198
 ZImage.cxx:199
 ZImage.cxx:200
 ZImage.cxx:201
 ZImage.cxx:202
 ZImage.cxx:203
 ZImage.cxx:204
 ZImage.cxx:205
 ZImage.cxx:206
 ZImage.cxx:207
 ZImage.cxx:208
 ZImage.cxx:209
 ZImage.cxx:210
 ZImage.cxx:211
 ZImage.cxx:212
 ZImage.cxx:213
 ZImage.cxx:214
 ZImage.cxx:215
 ZImage.cxx:216
 ZImage.cxx:217
 ZImage.cxx:218
 ZImage.cxx:219
 ZImage.cxx:220
 ZImage.cxx:221
 ZImage.cxx:222
 ZImage.cxx:223
 ZImage.cxx:224
 ZImage.cxx:225
 ZImage.cxx:226
 ZImage.cxx:227
 ZImage.cxx:228
 ZImage.cxx:229
 ZImage.cxx:230
 ZImage.cxx:231
 ZImage.cxx:232
 ZImage.cxx:233
 ZImage.cxx:234
 ZImage.cxx:235
 ZImage.cxx:236
 ZImage.cxx:237
 ZImage.cxx:238
 ZImage.cxx:239
 ZImage.cxx:240
 ZImage.cxx:241
 ZImage.cxx:242
 ZImage.cxx:243
 ZImage.cxx:244
 ZImage.cxx:245
 ZImage.cxx:246
 ZImage.cxx:247
 ZImage.cxx:248
 ZImage.cxx:249
 ZImage.cxx:250
 ZImage.cxx:251
 ZImage.cxx:252
 ZImage.cxx:253
 ZImage.cxx:254
 ZImage.cxx:255
 ZImage.cxx:256
 ZImage.cxx:257
 ZImage.cxx:258
 ZImage.cxx:259
 ZImage.cxx:260
 ZImage.cxx:261
 ZImage.cxx:262
 ZImage.cxx:263
 ZImage.cxx:264
 ZImage.cxx:265
 ZImage.cxx:266
 ZImage.cxx:267
 ZImage.cxx:268
 ZImage.cxx:269
 ZImage.cxx:270
 ZImage.cxx:271
 ZImage.cxx:272
 ZImage.cxx:273
 ZImage.cxx:274
 ZImage.cxx:275
 ZImage.cxx:276
 ZImage.cxx:277
 ZImage.cxx:278
 ZImage.cxx:279
 ZImage.cxx:280
 ZImage.cxx:281
 ZImage.cxx:282
 ZImage.cxx:283
 ZImage.cxx:284
 ZImage.cxx:285
 ZImage.cxx:286
 ZImage.cxx:287
 ZImage.cxx:288
 ZImage.cxx:289
 ZImage.cxx:290
 ZImage.cxx:291
 ZImage.cxx:292
 ZImage.cxx:293
 ZImage.cxx:294
 ZImage.cxx:295
 ZImage.cxx:296
 ZImage.cxx:297
 ZImage.cxx:298
 ZImage.cxx:299
 ZImage.cxx:300
 ZImage.cxx:301
 ZImage.cxx:302
 ZImage.cxx:303
 ZImage.cxx:304
 ZImage.cxx:305
 ZImage.cxx:306
 ZImage.cxx:307
 ZImage.cxx:308
 ZImage.cxx:309
 ZImage.cxx:310
 ZImage.cxx:311
 ZImage.cxx:312
 ZImage.cxx:313
 ZImage.cxx:314
 ZImage.cxx:315
 ZImage.cxx:316
 ZImage.cxx:317
 ZImage.cxx:318
 ZImage.cxx:319
 ZImage.cxx:320
 ZImage.cxx:321
 ZImage.cxx:322
 ZImage.cxx:323
 ZImage.cxx:324
 ZImage.cxx:325
 ZImage.cxx:326
 ZImage.cxx:327
 ZImage.cxx:328
 ZImage.cxx:329
 ZImage.cxx:330
 ZImage.cxx:331
 ZImage.cxx:332
 ZImage.cxx:333
 ZImage.cxx:334
 ZImage.cxx:335
 ZImage.cxx:336
 ZImage.cxx:337
 ZImage.cxx:338
 ZImage.cxx:339
 ZImage.cxx:340
 ZImage.cxx:341
 ZImage.cxx:342
 ZImage.cxx:343
 ZImage.cxx:344
 ZImage.cxx:345
 ZImage.cxx:346
 ZImage.cxx:347
 ZImage.cxx:348
 ZImage.cxx:349
 ZImage.cxx:350
 ZImage.cxx:351
 ZImage.cxx:352
 ZImage.cxx:353
 ZImage.cxx:354
 ZImage.cxx:355
 ZImage.cxx:356
 ZImage.cxx:357
 ZImage.cxx:358
 ZImage.cxx:359
 ZImage.cxx:360
 ZImage.cxx:361
 ZImage.cxx:362
 ZImage.cxx:363
 ZImage.cxx:364
 ZImage.cxx:365
 ZImage.cxx:366
 ZImage.cxx:367
 ZImage.cxx:368
 ZImage.cxx:369
 ZImage.cxx:370
 ZImage.cxx:371
 ZImage.cxx:372
 ZImage.cxx:373
 ZImage.cxx:374
 ZImage.cxx:375
 ZImage.cxx:376
 ZImage.cxx:377
 ZImage.cxx:378
 ZImage.cxx:379
 ZImage.cxx:380
 ZImage.cxx:381
 ZImage.cxx:382
 ZImage.cxx:383
 ZImage.cxx:384
 ZImage.cxx:385
 ZImage.cxx:386
 ZImage.cxx:387
 ZImage.cxx:388
 ZImage.cxx:389
 ZImage.cxx:390
 ZImage.cxx:391
 ZImage.cxx:392
 ZImage.cxx:393
 ZImage.cxx:394
 ZImage.cxx:395
 ZImage.cxx:396
 ZImage.cxx:397
 ZImage.cxx:398
 ZImage.cxx:399
 ZImage.cxx:400
 ZImage.cxx:401
 ZImage.cxx:402
 ZImage.cxx:403
 ZImage.cxx:404
 ZImage.cxx:405
 ZImage.cxx:406
 ZImage.cxx:407
 ZImage.cxx:408
 ZImage.cxx:409
 ZImage.cxx:410
 ZImage.cxx:411
 ZImage.cxx:412
 ZImage.cxx:413
 ZImage.cxx:414
 ZImage.cxx:415
 ZImage.cxx:416
 ZImage.cxx:417
 ZImage.cxx:418
 ZImage.cxx:419
 ZImage.cxx:420
 ZImage.cxx:421
 ZImage.cxx:422
 ZImage.cxx:423
 ZImage.cxx:424
 ZImage.cxx:425
 ZImage.cxx:426
 ZImage.cxx:427
 ZImage.cxx:428
 ZImage.cxx:429
 ZImage.cxx:430
 ZImage.cxx:431
 ZImage.cxx:432
 ZImage.cxx:433
 ZImage.cxx:434
 ZImage.cxx:435
 ZImage.cxx:436
 ZImage.cxx:437
 ZImage.cxx:438
 ZImage.cxx:439
 ZImage.cxx:440
 ZImage.cxx:441
 ZImage.cxx:442
 ZImage.cxx:443
 ZImage.cxx:444
 ZImage.cxx:445
 ZImage.cxx:446
 ZImage.cxx:447
 ZImage.cxx:448
 ZImage.cxx:449
 ZImage.cxx:450
 ZImage.cxx:451
 ZImage.cxx:452
 ZImage.cxx:453
 ZImage.cxx:454
 ZImage.cxx:455
 ZImage.cxx:456
 ZImage.cxx:457
 ZImage.cxx:458
 ZImage.cxx:459
 ZImage.cxx:460
 ZImage.cxx:461
 ZImage.cxx:462
 ZImage.cxx:463
 ZImage.cxx:464
 ZImage.cxx:465
 ZImage.cxx:466
 ZImage.cxx:467
 ZImage.cxx:468
 ZImage.cxx:469
 ZImage.cxx:470
 ZImage.cxx:471
 ZImage.cxx:472
 ZImage.cxx:473
 ZImage.cxx:474
 ZImage.cxx:475
 ZImage.cxx:476
 ZImage.cxx:477
 ZImage.cxx:478
 ZImage.cxx:479
 ZImage.cxx:480
 ZImage.cxx:481
 ZImage.cxx:482
 ZImage.cxx:483
 ZImage.cxx:484
 ZImage.cxx:485
 ZImage.cxx:486
 ZImage.cxx:487
 ZImage.cxx:488
 ZImage.cxx:489
 ZImage.cxx:490
 ZImage.cxx:491
 ZImage.cxx:492
 ZImage.cxx:493
 ZImage.cxx:494
 ZImage.cxx:495
 ZImage.cxx:496
 ZImage.cxx:497
 ZImage.cxx:498
 ZImage.cxx:499
 ZImage.cxx:500
 ZImage.cxx:501
 ZImage.cxx:502
 ZImage.cxx:503
 ZImage.cxx:504
 ZImage.cxx:505
 ZImage.cxx:506
 ZImage.cxx:507
 ZImage.cxx:508
 ZImage.cxx:509
 ZImage.cxx:510
 ZImage.cxx:511
 ZImage.cxx:512
 ZImage.cxx:513
 ZImage.cxx:514
 ZImage.cxx:515
 ZImage.cxx:516
 ZImage.cxx:517
 ZImage.cxx:518
 ZImage.cxx:519
 ZImage.cxx:520
 ZImage.cxx:521
 ZImage.cxx:522
 ZImage.cxx:523
 ZImage.cxx:524
 ZImage.cxx:525
 ZImage.cxx:526
 ZImage.cxx:527
 ZImage.cxx:528
 ZImage.cxx:529
 ZImage.cxx:530
 ZImage.cxx:531
 ZImage.cxx:532
 ZImage.cxx:533
 ZImage.cxx:534
 ZImage.cxx:535
 ZImage.cxx:536
 ZImage.cxx:537
 ZImage.cxx:538
 ZImage.cxx:539
 ZImage.cxx:540
 ZImage.cxx:541
 ZImage.cxx:542
 ZImage.cxx:543
 ZImage.cxx:544
 ZImage.cxx:545
 ZImage.cxx:546
 ZImage.cxx:547
 ZImage.cxx:548
 ZImage.cxx:549
 ZImage.cxx:550
 ZImage.cxx:551
 ZImage.cxx:552
 ZImage.cxx:553
 ZImage.cxx:554
 ZImage.cxx:555
 ZImage.cxx:556
 ZImage.cxx:557
 ZImage.cxx:558
 ZImage.cxx:559
 ZImage.cxx:560
 ZImage.cxx:561
 ZImage.cxx:562
 ZImage.cxx:563
 ZImage.cxx:564
 ZImage.cxx:565
 ZImage.cxx:566
 ZImage.cxx:567
 ZImage.cxx:568
 ZImage.cxx:569
 ZImage.cxx:570
 ZImage.cxx:571
 ZImage.cxx:572
 ZImage.cxx:573
 ZImage.cxx:574
 ZImage.cxx:575
 ZImage.cxx:576
 ZImage.cxx:577
 ZImage.cxx:578
 ZImage.cxx:579
 ZImage.cxx:580
 ZImage.cxx:581
 ZImage.cxx:582
 ZImage.cxx:583
 ZImage.cxx:584
 ZImage.cxx:585
 ZImage.cxx:586
 ZImage.cxx:587
 ZImage.cxx:588
 ZImage.cxx:589
 ZImage.cxx:590
 ZImage.cxx:591
 ZImage.cxx:592
 ZImage.cxx:593
 ZImage.cxx:594
 ZImage.cxx:595
 ZImage.cxx:596
 ZImage.cxx:597
 ZImage.cxx:598
 ZImage.cxx:599
 ZImage.cxx:600
 ZImage.cxx:601
 ZImage.cxx:602
 ZImage.cxx:603
 ZImage.cxx:604
 ZImage.cxx:605
 ZImage.cxx:606
 ZImage.cxx:607
 ZImage.cxx:608
 ZImage.cxx:609
 ZImage.cxx:610
 ZImage.cxx:611
 ZImage.cxx:612
 ZImage.cxx:613
 ZImage.cxx:614
 ZImage.cxx:615
 ZImage.cxx:616
 ZImage.cxx:617
 ZImage.cxx:618
 ZImage.cxx:619
 ZImage.cxx:620
 ZImage.cxx:621
 ZImage.cxx:622
 ZImage.cxx:623
 ZImage.cxx:624
 ZImage.cxx:625
 ZImage.cxx:626
 ZImage.cxx:627
 ZImage.cxx:628
 ZImage.cxx:629
 ZImage.cxx:630
 ZImage.cxx:631
 ZImage.cxx:632
 ZImage.cxx:633
 ZImage.cxx:634
 ZImage.cxx:635
 ZImage.cxx:636
 ZImage.cxx:637
 ZImage.cxx:638
 ZImage.cxx:639
 ZImage.cxx:640
 ZImage.cxx:641
 ZImage.cxx:642
 ZImage.cxx:643
 ZImage.cxx:644
 ZImage.cxx:645
 ZImage.cxx:646
 ZImage.cxx:647
 ZImage.cxx:648
 ZImage.cxx:649
 ZImage.cxx:650
 ZImage.cxx:651
 ZImage.cxx:652
 ZImage.cxx:653
 ZImage.cxx:654
 ZImage.cxx:655
 ZImage.cxx:656
 ZImage.cxx:657
 ZImage.cxx:658
 ZImage.cxx:659
 ZImage.cxx:660
 ZImage.cxx:661
 ZImage.cxx:662
 ZImage.cxx:663
 ZImage.cxx:664
 ZImage.cxx:665
 ZImage.cxx:666
 ZImage.cxx:667
 ZImage.cxx:668
 ZImage.cxx:669
 ZImage.cxx:670
 ZImage.cxx:671