00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00024
00025
00026
00027
00028
00030
00031 #ifndef __VIDEODISPLAY_H
00032 #define __VIDEODISPLAY_H
00033
00034 #include <string>
00035 #include <assert.h>
00036 #include <math.h>
00037
00038 #include <X11/Xlib.h>
00039 #include <GL/glx.h>
00040 #include <GL/gl.h>
00041
00042 #include <cvd/exceptions.h>
00043 #include <cvd/image_ref.h>
00044
00045 namespace CVD {
00046
00047 namespace Exceptions
00048 {
00051 namespace VideoDisplay
00052 {
00055 struct All: public CVD::Exceptions::All{};
00056
00059 struct InitialisationError: public All
00060 {
00061 InitialisationError(std::string w);
00062 };
00063
00066 struct RuntimeError: public All
00067 {
00068 RuntimeError(std::string w);
00069 };
00070 }
00071 }
00072
00073
00076 extern int defAttr[];
00077
00087 class VideoDisplay
00088 {
00089 public:
00097 VideoDisplay(double left, double top, double right, double bottom, double scale=1, int* visualAttr = defAttr);
00098
00099
00100
00105 VideoDisplay(ImageRef size, double scale=1, int* visualAttr = defAttr);
00106
00108 ~VideoDisplay();
00109
00112 void set_title(const std::string& s);
00113
00115 int get_fd() {return ConnectionNumber(my_display);}
00118 void select_events(long event_mask);
00122 void get_event(XEvent* event);
00126 void locate_display_pointer(int& x, int& y);
00130 void locate_video_pointer(double& x, double& y);
00132 void flush();
00134 int pending();
00135
00142 void set_zoom(double left, double top, double right, double bottom, double scale);
00147 void zoom_in(double cx, double cy, double factor = 2);
00152 void zoom_out(double cx, double cy, double factor = 2)
00153 {assert(factor != 0.0); zoom_in(cx, cy, 1/factor);}
00155 void zoom_reset()
00156 {set_zoom(my_orig_left, my_orig_top, my_orig_right, my_orig_bottom, my_orig_scale);}
00157
00159 double video_width() const {return fabs(my_right - my_left);}
00161 double video_height() const {return fabs(my_bottom - my_top);}
00162
00168 void display_to_video(int dx, int dy, double& vx, double& vy);
00174 void video_to_display(double dx, double dy, int& vx, int & vy);
00175
00179 void make_current();
00180
00183 void swap_buffers();
00185 Display* display() {return my_display;}
00187 Window window() {return my_window;}
00188
00189 private:
00190 double my_left;
00191 double my_top;
00192 double my_right;
00193 double my_bottom;
00194 bool my_positive_right;
00195 bool my_positive_down;
00196 double my_scale;
00197 double my_orig_left;
00198 double my_orig_top;
00199 double my_orig_right;
00200 double my_orig_bottom;
00201 double my_orig_scale;
00202 Display *my_display;
00203 XVisualInfo* my_visual;
00204 GLXContext my_glx_context;
00205 Colormap my_cmap;
00206 Window my_window;
00207
00208 VideoDisplay( VideoDisplay& copyof );
00209 int operator = ( VideoDisplay& copyof );
00210
00211
00212 void init(double, double, double, double, double, int* visualAttr);
00213 };
00214
00215 }
00216
00217 #endif