Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/toolx/X11/pixwin

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.
  3 
  4 #ifndef toolx_X11_pixwin
  5 #define toolx_X11_pixwin
  6 
  7 #include "colors"
  8 #include <tools/sg/zb_viewer>
  9 //#include <tools/sys/atime>
 10 
 11 #include <X11/Xlib.h>
 12 #include <X11/Xutil.h> //XPutPixel
 13 
 14 namespace toolx {
 15 namespace X11 {
 16 
 17 class pixwin {
 18 public:
 19   pixwin(std::ostream& a_out,unsigned int a_monitor,Display* a_display)
 20   :m_out(a_out)
 21   ,m_monitor(a_monitor)
 22   ,m_display(a_display)
 23   ,m_GC(0)
 24   ,m_image(0)
 25   {
 26     if(!m_display) return;
 27     m_GC = ::XCreateGC(m_display,XRootWindow(m_display,m_monitor),0,0);
 28   }
 29   virtual ~pixwin() {
 30     free_pixels();
 31     m_colors.clear();
 32     if(m_GC) ::XFreeGC(m_display,m_GC);
 33     free_XImage();
 34   }
 35 protected:
 36   pixwin(const pixwin& a_from)
 37   :m_out(a_from.m_out)
 38   ,m_monitor(0)
 39   ,m_display(0)
 40   ,m_GC(0)
 41   ,m_image(0)
 42   {}
 43   pixwin& operator=(const pixwin&){
 44     m_monitor = 0;
 45     m_display = 0;
 46     m_GC = 0;
 47     m_image = 0;
 48     return *this;
 49   }
 50 public:
 51   void put_buffer(Window a_win,unsigned int a_ww,unsigned int a_wh,const unsigned char* a_rgbas) {
 52     if(!m_display) return;
 53     if(!m_GC) return;
 54     if(!m_image) alloc_XImage(a_ww,a_wh);
 55     if(!m_image) return;
 56   //tools::atime start = tools::atime::now();
 57     const unsigned int* pos = (const unsigned int*)a_rgbas;
 58     unsigned int row,col;
 59     toolx::X11::Pixel pixel;
 60     for(row=0;row<a_wh;row++) {
 61     for(col=0;col<a_ww;col++) {
 62       if(!get_pixel(m_display,m_monitor,m_pixels,m_colors,*pos,pixel)) {}
 63       pos++;
 64       XPutPixel(m_image,col,row,pixel);
 65     }}
 66   //::printf("debug : map::colors %lu, pixels %lu\n",m_colors.size(),m_pixels.size());
 67     ::XPutImage(m_display,a_win,m_GC,m_image,0,0,0,0,a_ww,a_wh);
 68   //m_out << "pu_buffer : XImage " << tools::atime::elapsed(start) << std::endl;
 69   }
 70   void set_size(unsigned int a_ww,unsigned int a_wh) {
 71     free_XImage();
 72     alloc_XImage(a_ww,a_wh);
 73   }
 74 protected:
 75   void alloc_XImage(unsigned int a_ww,unsigned int a_wh) {
 76     if(m_image) return; //done.
 77     if(!m_display) return;
 78     Screen* screen = ::XScreenOfDisplay(m_display,m_monitor);
 79     m_image = ::XCreateImage(m_display,::XDefaultVisualOfScreen(screen),::XDefaultDepthOfScreen(screen),ZPixmap,0,NULL,a_ww,a_wh,8,0);
 80     if(!m_image) {
 81       m_out << "toolx::X11::pixwin::alloc_XImage : can't create an XImage." << std::endl;
 82       return;
 83     }
 84     //warning : a priori, a_ww*3 != m_image->bytes_per_line.
 85     m_image->data = new char[a_wh*m_image->bytes_per_line];
 86     if(!m_image->data) {
 87       m_out << "toolx::X11::pixwin::alloc_XImage : can't alloc buffer." << std::endl;
 88       ::XFree((char*)m_image);
 89       m_image = 0;
 90       return;
 91     }
 92   }
 93   void free_XImage() {
 94     if(!m_image) return;
 95     delete [] m_image->data;
 96     ::XFree((char*)m_image);
 97     m_image = 0;
 98   }
 99   void free_pixels() {
100     if(!m_display) return;
101     Screen* screen = ::XScreenOfDisplay(m_display,m_monitor);
102     tools_vforit(toolx::X11::Pixel,m_pixels,it) {
103       ::XFreeColors(m_display,XDefaultColormapOfScreen(screen),&(*it),1,0);
104     }
105     m_pixels.clear();
106   }
107 protected:
108   std::ostream& m_out;
109   unsigned int m_monitor;
110   Display* m_display;
111   GC m_GC;
112   std::vector<toolx::X11::Pixel> m_pixels;
113   colors_t m_colors;
114   XImage* m_image;
115 };
116 
117 }}
118 
119 
120 #endif
121