factor out viewport to display scaling functions
authorDiane Trout <diane@caltech.edu>
Wed, 2 May 2007 23:55:57 +0000 (23:55 +0000)
committerDiane Trout <diane@caltech.edu>
Wed, 2 May 2007 23:55:57 +0000 (23:55 +0000)
alg/glseqbrowser.cpp
alg/glseqbrowser.hpp

index afcf6a97fc72d86df432e88978bb20a86c4f64cf..df9462618b119f56c704a234a059d184ef2c8a4a 100644 (file)
@@ -144,10 +144,8 @@ void GlSeqBrowser::processSelection(GLuint hits, GLuint buffer[], GLuint bufsize
 
 void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
 {
-  GLfloat x_scale = cur_ortho.width()/((float)viewport_size.x);
-  GLfloat y_scale = cur_ortho.height()/((float)viewport_size.y);
-  GLfloat x_left = cur_ortho.left + (left*x_scale);
-  GLfloat x_right = cur_ortho.left + (right * x_scale);
+  GLfloat x_left = viewportXtoWorldX(left);
+  GLfloat x_right = viewportXtoWorldX(right);cur_ortho.left;
 
   if (top > bottom) {
     // woah, someone gave us a rectangle with the origin in the lower left
@@ -156,8 +154,8 @@ void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
     top = temp;
   }
   // swap the orientation of canvas coordinates
-  GLfloat y_top = cur_ortho.top-(bottom*y_scale);
-  GLfloat y_bottom = cur_ortho.top - top * y_scale;
+  GLfloat y_top = viewportYtoWorldY(bottom);
+  GLfloat y_bottom = viewportYtoWorldY(top);
   selectedRegion = rect<float>(y_top, x_left, y_bottom, x_right);
 
   // hopefully this will make a buffer big enough to receive 
index 3e7510770d485c4d3701b8689242583ef5f907e8..f88caf5e7e5bb57e4dea0b1ff56f20d4f8c21408 100644 (file)
@@ -57,6 +57,11 @@ public:
   int viewportPixelHeight() const;
   //! return viewport width in pixels
   int viewportPixelWidth() const;
+  
+  //! convert x axis from display to world coordinates
+  float viewportXtoWorldX(int x);
+  //! convert y axis from display to world coordinates
+  float viewportYtoWorldY(int y);
 
   //! zoom out far enough to show the full size of the sequence
   double zoomOut();
@@ -227,4 +232,15 @@ protected:
   std::list<TrackRegion> selected_tracks;
   typedef std::list<TrackRegion>::iterator selected_track_iterator;
 };
+
+inline float GlSeqBrowser::viewportXtoWorldX(int x) {
+  GLfloat x_scale = cur_ortho.width()/((float)viewport_size.x);
+  return (cur_ortho.left + (x * x_scale));
+}
+
+inline float GlSeqBrowser::viewportYtoWorldY(int y) {
+  GLfloat y_scale = cur_ortho.height()/((float)viewport_size.y);
+  return cur_ortho.top-(y * y_scale);
+}
+
 #endif