// @(#)root/eve:$Id$
// Author: Alja Mrak Tadel 2012

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TEveRGBAPaletteOverlay.h"
#include "TEveRGBAPalette.h"

#include "TGLIncludes.h"
#include "TGLAxis.h"
#include "TGLRnrCtx.h"
#include "TGLUtil.h"

//______________________________________________________________________________
// Description of TEveRGBAPaletteOverlay
//

ClassImp(TEveRGBAPaletteOverlay);

//______________________________________________________________________________
TEveRGBAPaletteOverlay::TEveRGBAPaletteOverlay(TEveRGBAPalette* p, Float_t posx, Float_t posy,
                                               Float_t width, Float_t height) :
   TGLOverlayElement(),
   fPalette(p),
   fPosX(posx),
   fPosY(posy),
   fWidth(width),
   fHeight(height)
{
   // Constructor.

   fAxis.SetNdivisions(900);
   fAxisPainter.SetUseAxisColors(kFALSE);
   fAxisPainter.SetLabelPixelFontSize(10);
   fAxisPainter.SetFontMode(TGLFont::kPixmap);
   fAxisPainter.SetLabelAlign(TGLFont::kCenterH, TGLFont::kBottom);
}

void TEveRGBAPaletteOverlay::Render(TGLRnrCtx& rnrCtx)
{
   // Render the overlay.

   const Double_t ca_min = fPalette->GetCAMinAsDouble();
   const Double_t ca_max = fPalette->GetCAMaxAsDouble();

   // Uninitialized palette.
   if (ca_min == ca_max) return;

   fAxis.SetLimits(ca_min, ca_max);

   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);

   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
   glDisable(GL_CULL_FACE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);

   // reset to [0,1] units
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   glOrtho(0, 1, 0, 1, 0, 1);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();

   // postion pallette
   glTranslatef(fPosX, fPosY, 0);

   // colored quads
   {
      TGLCapabilitySwitch move_to_back(GL_POLYGON_OFFSET_FILL, kTRUE);
      glPolygonOffset(0.5f, 0.5f);

      glBegin(GL_QUAD_STRIP);
      TGLUtil::Color4ubv(fPalette->ColorFromValue(fPalette->fCAMin));
      glVertex2f(0, 0);
      glVertex2f(0, fHeight);
      Float_t xs = fWidth / (fPalette->fCAMax - fPalette->fCAMin);
      Float_t x  = xs;
      for (Int_t i = fPalette->fCAMin + 1; i < fPalette->fCAMax; ++i)
      {
         TGLUtil::Color4ubv(fPalette->ColorFromValue(i));
         glVertex2f(x, 0);
         glVertex2f(x, fHeight);
         x += xs;
      }
      TGLUtil::Color4ubv(fPalette->ColorFromValue(fPalette->fCAMax));
      glVertex2f(fWidth, 0);
      glVertex2f(fWidth, fHeight);
      glEnd();
   }

   // axis
   glPushMatrix();
   Float_t sf = fWidth / (ca_max - ca_min);
   glScalef(sf, 1, 1);
   glTranslatef(-ca_min, 0, 0);
   fAxis.SetTickLength(0.05*fWidth);
   fAxisPainter.RefTMOff(0).Set(0, -1, 0);
   fAxisPainter.PaintAxis(rnrCtx, &fAxis);
   glPopMatrix();

   // frame around palette
   glBegin(GL_LINE_LOOP);
   glVertex2f(0, 0);             glVertex2f(fWidth, 0);
   glVertex2f(fWidth, fHeight);  glVertex2f(0, fHeight);
   glEnd();

   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();

   glPopAttrib();
}
 TEveRGBAPaletteOverlay.cxx:1
 TEveRGBAPaletteOverlay.cxx:2
 TEveRGBAPaletteOverlay.cxx:3
 TEveRGBAPaletteOverlay.cxx:4
 TEveRGBAPaletteOverlay.cxx:5
 TEveRGBAPaletteOverlay.cxx:6
 TEveRGBAPaletteOverlay.cxx:7
 TEveRGBAPaletteOverlay.cxx:8
 TEveRGBAPaletteOverlay.cxx:9
 TEveRGBAPaletteOverlay.cxx:10
 TEveRGBAPaletteOverlay.cxx:11
 TEveRGBAPaletteOverlay.cxx:12
 TEveRGBAPaletteOverlay.cxx:13
 TEveRGBAPaletteOverlay.cxx:14
 TEveRGBAPaletteOverlay.cxx:15
 TEveRGBAPaletteOverlay.cxx:16
 TEveRGBAPaletteOverlay.cxx:17
 TEveRGBAPaletteOverlay.cxx:18
 TEveRGBAPaletteOverlay.cxx:19
 TEveRGBAPaletteOverlay.cxx:20
 TEveRGBAPaletteOverlay.cxx:21
 TEveRGBAPaletteOverlay.cxx:22
 TEveRGBAPaletteOverlay.cxx:23
 TEveRGBAPaletteOverlay.cxx:24
 TEveRGBAPaletteOverlay.cxx:25
 TEveRGBAPaletteOverlay.cxx:26
 TEveRGBAPaletteOverlay.cxx:27
 TEveRGBAPaletteOverlay.cxx:28
 TEveRGBAPaletteOverlay.cxx:29
 TEveRGBAPaletteOverlay.cxx:30
 TEveRGBAPaletteOverlay.cxx:31
 TEveRGBAPaletteOverlay.cxx:32
 TEveRGBAPaletteOverlay.cxx:33
 TEveRGBAPaletteOverlay.cxx:34
 TEveRGBAPaletteOverlay.cxx:35
 TEveRGBAPaletteOverlay.cxx:36
 TEveRGBAPaletteOverlay.cxx:37
 TEveRGBAPaletteOverlay.cxx:38
 TEveRGBAPaletteOverlay.cxx:39
 TEveRGBAPaletteOverlay.cxx:40
 TEveRGBAPaletteOverlay.cxx:41
 TEveRGBAPaletteOverlay.cxx:42
 TEveRGBAPaletteOverlay.cxx:43
 TEveRGBAPaletteOverlay.cxx:44
 TEveRGBAPaletteOverlay.cxx:45
 TEveRGBAPaletteOverlay.cxx:46
 TEveRGBAPaletteOverlay.cxx:47
 TEveRGBAPaletteOverlay.cxx:48
 TEveRGBAPaletteOverlay.cxx:49
 TEveRGBAPaletteOverlay.cxx:50
 TEveRGBAPaletteOverlay.cxx:51
 TEveRGBAPaletteOverlay.cxx:52
 TEveRGBAPaletteOverlay.cxx:53
 TEveRGBAPaletteOverlay.cxx:54
 TEveRGBAPaletteOverlay.cxx:55
 TEveRGBAPaletteOverlay.cxx:56
 TEveRGBAPaletteOverlay.cxx:57
 TEveRGBAPaletteOverlay.cxx:58
 TEveRGBAPaletteOverlay.cxx:59
 TEveRGBAPaletteOverlay.cxx:60
 TEveRGBAPaletteOverlay.cxx:61
 TEveRGBAPaletteOverlay.cxx:62
 TEveRGBAPaletteOverlay.cxx:63
 TEveRGBAPaletteOverlay.cxx:64
 TEveRGBAPaletteOverlay.cxx:65
 TEveRGBAPaletteOverlay.cxx:66
 TEveRGBAPaletteOverlay.cxx:67
 TEveRGBAPaletteOverlay.cxx:68
 TEveRGBAPaletteOverlay.cxx:69
 TEveRGBAPaletteOverlay.cxx:70
 TEveRGBAPaletteOverlay.cxx:71
 TEveRGBAPaletteOverlay.cxx:72
 TEveRGBAPaletteOverlay.cxx:73
 TEveRGBAPaletteOverlay.cxx:74
 TEveRGBAPaletteOverlay.cxx:75
 TEveRGBAPaletteOverlay.cxx:76
 TEveRGBAPaletteOverlay.cxx:77
 TEveRGBAPaletteOverlay.cxx:78
 TEveRGBAPaletteOverlay.cxx:79
 TEveRGBAPaletteOverlay.cxx:80
 TEveRGBAPaletteOverlay.cxx:81
 TEveRGBAPaletteOverlay.cxx:82
 TEveRGBAPaletteOverlay.cxx:83
 TEveRGBAPaletteOverlay.cxx:84
 TEveRGBAPaletteOverlay.cxx:85
 TEveRGBAPaletteOverlay.cxx:86
 TEveRGBAPaletteOverlay.cxx:87
 TEveRGBAPaletteOverlay.cxx:88
 TEveRGBAPaletteOverlay.cxx:89
 TEveRGBAPaletteOverlay.cxx:90
 TEveRGBAPaletteOverlay.cxx:91
 TEveRGBAPaletteOverlay.cxx:92
 TEveRGBAPaletteOverlay.cxx:93
 TEveRGBAPaletteOverlay.cxx:94
 TEveRGBAPaletteOverlay.cxx:95
 TEveRGBAPaletteOverlay.cxx:96
 TEveRGBAPaletteOverlay.cxx:97
 TEveRGBAPaletteOverlay.cxx:98
 TEveRGBAPaletteOverlay.cxx:99
 TEveRGBAPaletteOverlay.cxx:100
 TEveRGBAPaletteOverlay.cxx:101
 TEveRGBAPaletteOverlay.cxx:102
 TEveRGBAPaletteOverlay.cxx:103
 TEveRGBAPaletteOverlay.cxx:104
 TEveRGBAPaletteOverlay.cxx:105
 TEveRGBAPaletteOverlay.cxx:106
 TEveRGBAPaletteOverlay.cxx:107
 TEveRGBAPaletteOverlay.cxx:108
 TEveRGBAPaletteOverlay.cxx:109
 TEveRGBAPaletteOverlay.cxx:110
 TEveRGBAPaletteOverlay.cxx:111
 TEveRGBAPaletteOverlay.cxx:112
 TEveRGBAPaletteOverlay.cxx:113
 TEveRGBAPaletteOverlay.cxx:114
 TEveRGBAPaletteOverlay.cxx:115
 TEveRGBAPaletteOverlay.cxx:116
 TEveRGBAPaletteOverlay.cxx:117
 TEveRGBAPaletteOverlay.cxx:118
 TEveRGBAPaletteOverlay.cxx:119
 TEveRGBAPaletteOverlay.cxx:120
 TEveRGBAPaletteOverlay.cxx:121
 TEveRGBAPaletteOverlay.cxx:122
 TEveRGBAPaletteOverlay.cxx:123