glpane.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:15k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glpane.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:50:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_GRAPH___GLPANE__HPP
  10. #define GUI_GRAPH___GLPANE__HPP
  11. /*  $Id: glpane.hpp,v 1000.4 2004/06/01 19:50:09 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <corelib/ncbidiag.hpp>
  43. #include <gui/opengl.h>
  44. #include <gui/opengl/glcolor.hpp>
  45. #include <gui/opengl/glrect.hpp>
  46. /** @addtogroup GUI_OPENGL
  47.  *
  48.  * @{
  49.  */
  50. BEGIN_NCBI_SCOPE
  51. // units for coordinates representation on the output device (pixels) and in the model space
  52. typedef int         TVPUnit; 
  53. typedef GLdouble    TModelUnit;
  54. typedef CGlPoint<TVPUnit>   TVPPoint;
  55. typedef CGlPoint<TModelUnit>    TModelPoint;
  56. typedef CGlRect<TVPUnit>      TVPRect;
  57. typedef CGlRect<TModelUnit>   TModelRect;
  58. enum EScaleType {
  59.         eDec,
  60.         eLog10,
  61.         eLog2, 
  62.         eLn
  63.     };
  64. enum    EOrientation    {
  65.     eHorz,
  66.     eVert
  67. };
  68. ////////////////////////////////////////////////////////////////////////////////
  69. /// class CGlPane
  70. // CGlPane represents a rectangular area used for drawing graphs and decorations
  71. // (such as grid, axes, labels etc.) CGlPane provides means for using OpenGL
  72. // projections in order to draw graphs in coordinates of their model space. 
  73. class NCBI_GUIOPENGL_EXPORT CGlPane
  74. {
  75. public:    
  76.     enum EProjectionMode {
  77.         eNone = -1, // closed or invalid
  78.         eOrtho, // orthographic projection, drawing in model space coords
  79.         ePixels // orthographic projection, drawing in pixels
  80.     };
  81.     /// Specifies what point should be preserved during various coordinate 
  82.     /// space adjustments.
  83.     enum EOriginType {
  84.         eOriginLeft,
  85.         eOriginRight,
  86.         eOriginBottom,
  87.         eOriginTop,
  88.         eOriginCenter
  89.     };
  90.     /// EProjMatrixPolicy controls CGlPane behavior in respect to obtaining
  91.     /// projection matrices for future use in Project..(), UnProject...()
  92.     /// functions.
  93.     enum EProjMatrixPolicy
  94.     {
  95.         eNeverUpdate,
  96.         eAlwaysUpdate
  97.     };
  98.     /// EAdjustmentPolicy specifies how visible area should be adjusted if 
  99.     /// some of the prjection parameters change
  100.     enum EAdjustmentPolicy
  101.     {
  102.         fShiftToLimits = 0x1,
  103.         fScaleToLimits = 0x2,
  104.         fAdjustAll = fShiftToLimits | fScaleToLimits
  105.     };
  106.     /// EZoomOptions flags control behavior of Zoom operations.
  107.     enum EZoomOptions
  108.     {
  109.         fZoomX = 0x1,   // zoom by X coordinate
  110.         fZoomY = 0x2,   // zoom by Y coordinate
  111.         fForce = 0x4,   // overrides enable/disable settings in the pane
  112.         fZoomXY = fZoomX | fZoomY        
  113.     };
  114. public:
  115.     CGlPane(EProjMatrixPolicy policy = eAlwaysUpdate);
  116.     virtual ~CGlPane();
  117.     // Viewport manipulation
  118.     void    SetViewport(const TVPRect& R);
  119.     TVPRect&        GetViewport(void);
  120.     const TVPRect&  GetViewport(void) const;
  121.     // Model Space manipulation
  122.     void    SetModelLimitsRect(const TModelRect& R);
  123.     TModelRect&       GetModelLimitsRect(void);
  124.     const TModelRect& GetModelLimitsRect(void) const;
  125.     // Ortho projection - visible ares
  126.     void    SetVisibleRect(const TModelRect& R);
  127.     TModelRect&         GetVisibleRect(void);
  128.     const TModelRect&   GetVisibleRect(void) const;
  129.     
  130.     /// set clipping rect that will be used by glScissor, NULL for reset        
  131.     void    SetClipRect(const TVPRect* rc_clip = NULL);
  132.     /// Offset is used as a workaround for OpenGL precision problems emerging
  133.     /// when  size of visible range is small in comparision to coordinates in
  134.     /// this range.
  135.     void    EnableOffset(bool b_en = true);
  136.     TModelUnit  GetOffsetX()    const;
  137.     TModelUnit  GetOffsetY()    const;
  138.     TModelPoint GetOffset() const;
  139.     bool    Open(EProjectionMode Mode);
  140.     bool    OpenOrtho();
  141.     bool    OpenPixels();
  142.     void    Close(void);    
  143.     EProjectionMode GetProjMode(void) const;
  144.     // scale Model space units per pixel
  145.     TModelUnit  GetScaleX(void) const;
  146.     TModelUnit  GetScaleY(void) const;
  147.     
  148.     void    SetMinScaleX(TModelUnit scale);
  149.     void    SetMinScaleY(TModelUnit scale);
  150.     TModelUnit    GetMinScaleX(void) const;
  151.     TModelUnit    GetMinScaleY(void) const;
  152.     
  153.     TModelUnit    GetZoomAllScaleX(void) const;
  154.     TModelUnit    GetZoomAllScaleY(void) const;
  155.     // in Proportional mode CGlPane will keep horz. and vert. scales equal
  156.     void    SetProportionalMode(bool set);
  157.     bool    IsProportionalMode(void) const;
  158.     void    SetOriginType(EOriginType type_x, EOriginType type_y);
  159.     void    SetAdjustmentPolicy(int adjust_x, int adjust_y);
  160.     void    SetAdjustToLimits(bool adjust_x, bool adjust_y);
  161.     // Zoom functions
  162.     void    EnableZoom(bool en_x, bool en_y);
  163.     bool    IsZoomInAvaiable(void);
  164.     bool    IsZoomOutAvaiable(void);
  165.     void    SetZoomFactor(TModelUnit factor = 2.0);    
  166.     void    ZoomAll(int options = fZoomXY);
  167.     
  168.     void    ZoomInCenter(int options = fZoomXY);
  169.     void    ZoomIn(TModelUnit x, TModelUnit y, int options = fZoomXY);
  170.     void    ZoomIn(TModelPoint p, int options = fZoomXY);
  171.     
  172.     void    ZoomOutCenter(int options = fZoomXY);
  173.     void    ZoomOut(TModelUnit x, TModelUnit y, int options = fZoomXY);
  174.     void    ZoomOut(TModelPoint p, int options = fZoomXY);    
  175.     
  176.     void    ZoomPoint(TModelUnit x, TModelUnit y, TModelUnit factor, int options = fZoomXY);
  177.     void    ZoomPoint(TModelPoint p, TModelUnit factor, int options = fZoomXY);
  178.     
  179.     void    ZoomRect(const TModelRect& r);        
  180.     // Zooms so that p_center becomes a center of visible area, the size of
  181.     // visible area is calculated based on given scales
  182.     void    SetScale(TModelUnit scale_x, TModelUnit scale_y, TModelPoint p_center);
  183.     void    SetScaleRefPoint(TModelUnit scale_x, TModelUnit scale_y, 
  184.                              TModelPoint p_ref);
  185.     // this function preserves current center point
  186.     void    SetScale(TModelUnit scale_x, TModelUnit scale_y);
  187.     // Scroll functions
  188.     bool    NeedsScrollX(void) const;
  189.     bool    NeedsScrollY(void) const;
  190.     void    Scroll(TModelUnit dx, TModelUnit dy);
  191.     void    AdjustToLimits();
  192.     // Coordinate transformations - now only for Ortho mode
  193.     TVPUnit ProjectX(TModelUnit m_x) const;
  194.     TVPUnit ProjectY(TModelUnit m_y) const;
  195.     TVPPoint    Project(TModelUnit m_x, TModelUnit m_y) const;
  196.     
  197.     TModelUnit UnProjectX(TVPUnit m_y) const;
  198.     TModelUnit UnProjectY(TVPUnit m_y) const;
  199.     TModelPoint UnProject(TVPUnit m_x, TVPUnit m_y) const;
  200.     TModelUnit  UnProjectWidth(TVPUnit vp_w);
  201.     TModelUnit  UnProjectHeight(TVPUnit vp_h);
  202. protected:
  203.     bool    x_OpenOrtho();
  204.     bool    x_OpenPixels();
  205.     void    x_Open_SetViewport();
  206.     
  207.     void    x_UpdateProjectMatrices(void);
  208.     // functions enforcing constraints in the display validity
  209.     void    x_CorrectScale(TModelPoint p_center);    
  210.     // shifts visible area so that it is located within limits
  211.     void    x_ShiftToFitLimits(void);
  212.     void    x_ScaleToFitLimits(void);    
  213.     void    x_AdjustVisibleRect(void);    
  214.     static double  s_GetShift(TModelUnit low_shift, TModelUnit high_shift, bool neg_range, EOriginType type);
  215.     void    x_AssertNotOpen(void) const;
  216.     void    x_AssertOrtho(void) const;
  217. protected:
  218.     TVPRect m_rcVP;
  219.     TModelRect  m_rcLimits;
  220.     TModelRect  m_rcVisible;
  221.     TModelRect  m_rcOrigVisible; // used in ProportionalMode
  222.     const TVPRect *m_prcClip;
  223.     EProjectionMode     m_Mode;
  224.     EProjMatrixPolicy   m_MatrixPolicy;
  225.     int   m_AdjustX;
  226.     int   m_AdjustY;
  227.     bool  m_bEnableOffset;
  228.     
  229.     bool    m_bZoomEnX;
  230.     bool    m_bZoomEnY;
  231.     TModelUnit  m_ZoomFactor;
  232.     bool    m_bProportionalMode;
  233.     EOriginType     m_TypeX;
  234.     EOriginType     m_TypeY;
  235.     
  236.     TModelUnit  m_MinScaleX;
  237.     TModelUnit  m_MinScaleY;
  238.     // matrices for using with gluProject gluUnProject
  239.     GLint   m_mxVP[4];
  240.     GLdouble m_mxProjection[16];
  241.     GLdouble m_mxModelView[16];    
  242. };
  243. class CGlPaneGuard
  244. {
  245. public:
  246.     CGlPaneGuard(CGlPane& pane, CGlPane::EProjectionMode mode)
  247.         : m_Pane(pane)
  248.     {
  249.         m_Pane.Open(mode);
  250.     }
  251.     ~CGlPaneGuard()
  252.     {
  253.         m_Pane.Close();
  254.     }
  255. private:
  256.     CGlPane& m_Pane;
  257.     // forbidden
  258.     CGlPaneGuard(const CGlPaneGuard&);
  259.     CGlPaneGuard& operator=(const CGlPaneGuard&);
  260. };
  261. inline TVPRect&    CGlPane::GetViewport(void)
  262. {
  263.     return m_rcVP;
  264. }
  265. inline const TVPRect&  CGlPane::GetViewport(void) const
  266. {
  267.     return m_rcVP;
  268. }
  269. inline void    CGlPane::SetModelLimitsRect(const TModelRect& R)
  270. {
  271.     m_rcLimits = m_rcOrigVisible = R;
  272. }
  273. inline TModelRect&  CGlPane::GetModelLimitsRect(void)
  274. {
  275.     return m_rcLimits;
  276. }
  277. inline const TModelRect&    CGlPane::GetModelLimitsRect(void) const
  278. {
  279.     return m_rcLimits;
  280. }
  281. inline TModelRect& CGlPane::GetVisibleRect(void)
  282. {
  283.     return m_rcVisible;
  284. }
  285. inline const TModelRect&   CGlPane::GetVisibleRect(void) const
  286. {
  287.     return m_rcVisible;
  288. }
  289. inline void    CGlPane::SetProportionalMode(bool set)
  290. {
  291.     m_bProportionalMode = set;
  292. }
  293. inline bool    CGlPane::IsProportionalMode(void) const
  294. {
  295.     return m_bProportionalMode;
  296. }
  297. inline void    CGlPane::SetOriginType(EOriginType type_x, EOriginType type_y)
  298. {
  299.     m_TypeX = type_x;
  300.     m_TypeY = type_y;
  301. }
  302. inline void    CGlPane::SetAdjustmentPolicy(int adjust_x, int adjust_y)
  303. {
  304.     m_AdjustX = adjust_x;
  305.     m_AdjustY = adjust_y;
  306. }
  307. inline void    CGlPane::SetAdjustToLimits(bool adjust_x, bool adjust_y)
  308. {
  309.     m_AdjustX = adjust_x ? fAdjustAll : 0;
  310.     m_AdjustY = adjust_y ? fAdjustAll : 0;
  311. }
  312. inline void     CGlPane::SetClipRect(const TVPRect* rc_clip)
  313. {
  314.     m_prcClip = rc_clip;
  315. }
  316. inline void    CGlPane::EnableOffset(bool b_en)
  317. {
  318.     m_bEnableOffset = b_en;
  319. }
  320. inline TModelUnit  CGlPane::GetOffsetX()    const
  321. {
  322.     return m_bEnableOffset ? m_rcVisible.Left() : 0;
  323. }
  324. inline TModelUnit  CGlPane::GetOffsetY()    const
  325. {
  326.     return m_bEnableOffset ? m_rcVisible.Bottom() : 0;
  327. }
  328. inline TModelPoint CGlPane::GetOffset() const
  329. {
  330.     if(m_bEnableOffset)
  331.             return TModelPoint(m_rcVisible.Left(), m_rcVisible.Bottom());
  332.     else    return TModelPoint(0, 0);
  333. }
  334. inline bool    CGlPane::OpenOrtho()            
  335. {
  336.     return Open(eOrtho);
  337. }
  338. inline bool    CGlPane::OpenPixels()            
  339. {
  340.     return Open(ePixels);
  341. }
  342. inline CGlPane::EProjectionMode  CGlPane::GetProjMode(void) const
  343. {
  344.     return m_Mode;
  345. }
  346. inline void    CGlPane::SetMinScaleX(TModelUnit scale)
  347. {
  348.     m_MinScaleX = scale;
  349. }
  350. inline void    CGlPane::SetMinScaleY(TModelUnit scale)
  351. {
  352.     m_MinScaleY = scale;
  353. }
  354. inline TModelUnit    CGlPane::GetMinScaleX(void) const
  355. {
  356.     return m_MinScaleX;
  357. }
  358. inline TModelUnit    CGlPane::GetMinScaleY(void) const
  359. {
  360.     return m_MinScaleY;
  361. }
  362.         
  363. inline void    CGlPane::EnableZoom(bool en_x, bool en_y)
  364. {
  365.     m_bZoomEnX = en_x;
  366.     m_bZoomEnY = en_y;
  367. }
  368. inline void    CGlPane::SetZoomFactor(TModelUnit factor)
  369. {
  370.     _ASSERT(factor > 0);
  371.     m_ZoomFactor = factor;
  372. }
  373. inline void    CGlPane::ZoomIn(TModelPoint p, int options)
  374. {
  375.     ZoomPoint(p.X(), p.Y(), m_ZoomFactor, options);
  376. }
  377. inline void    CGlPane::ZoomIn(TModelUnit x, TModelUnit y, int options)
  378. {
  379.     ZoomPoint(x, y, m_ZoomFactor);
  380. }
  381. inline void    CGlPane::ZoomOut(TModelPoint p, int options)
  382. {
  383.     ZoomPoint(p.X(), p.Y(), 1 / m_ZoomFactor, options);
  384. }
  385. inline void    CGlPane::ZoomOut(TModelUnit x, TModelUnit y, int options)
  386. {
  387.     ZoomPoint(x, y, 1 / m_ZoomFactor, options);
  388. }
  389. inline void    CGlPane::ZoomPoint(TModelPoint p, TModelUnit factor, int options)
  390. {
  391.     ZoomPoint(p.X(), p.Y(), factor, options);
  392. }
  393. inline void    CGlPane::AdjustToLimits(void)
  394. {
  395.     x_ShiftToFitLimits();
  396. }
  397. END_NCBI_SCOPE
  398. /* @} */
  399. /*
  400.  * ===========================================================================
  401.  * $Log: glpane.hpp,v $
  402.  * Revision 1000.4  2004/06/01 19:50:09  gouriano
  403.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  404.  *
  405.  * Revision 1.11  2004/05/11 18:54:22  dicuccio
  406.  * Added doxygne modules info
  407.  *
  408.  * Revision 1.10  2004/04/20 14:08:37  rsmith
  409.  * trailing commas at the ends of lists are non-standard and give warnings on some platforms.
  410.  *
  411.  * Revision 1.9  2004/04/07 12:38:26  dicuccio
  412.  * Added CGlPaneGuard
  413.  *
  414.  * Revision 1.8  2003/12/08 15:07:36  yazhuk
  415.  * Workaround for OpenGL rounding/precision problems
  416.  *
  417.  * Revision 1.7  2003/12/01 16:30:45  yazhuk
  418.  * Added EOrientation enumeration.
  419.  *
  420.  * Revision 1.6  2003/11/17 20:27:57  yazhuk
  421.  * Introduced zoom options - added EZoomOptions and modified zoom functions.
  422.  *
  423.  * Revision 1.5  2003/10/29 22:23:15  yazhuk
  424.  * Added clipping capabilities
  425.  *
  426.  * Revision 1.4  2003/10/22 18:25:59  lebedev
  427.  * SetScale method with reference point added
  428.  *
  429.  * Revision 1.3  2003/10/20 15:43:14  yazhuk
  430.  * Replaced boolean flags with EAdjustmentPolicy enumeration.
  431.  *
  432.  * Revision 1.2  2003/10/15 21:12:45  yazhuk
  433.  * Introduced projection matrix updating policy
  434.  *
  435.  * Revision 1.1  2003/10/08 12:53:02  dicuccio
  436.  * Moved from gui/graph library
  437.  *
  438.  * Revision 1.10  2003/09/30 16:55:26  yazhuk
  439.  * Added overloaded version of SetScale()
  440.  *
  441.  * Revision 1.9  2003/09/25 20:35:12  yazhuk
  442.  * Added support for Visible rect adjustment
  443.  *
  444.  * Revision 1.8  2003/09/24 19:52:11  yazhuk
  445.  * Enforced coding policy. Added eOriginCenter. Added "force" argument to
  446.  * ZoomAll()
  447.  *
  448.  * Revision 1.7  2003/09/14 16:03:50  dicuccio
  449.  * Restored export specifier
  450.  *
  451.  * Revision 1.6  2003/09/10 21:51:24  yazhuk
  452.  * GCC compilation fixes
  453.  *
  454.  * Revision 1.5  2003/09/10 20:33:24  yazhuk
  455.  * Added GetScale() functions
  456.  *
  457.  * Revision 1.4  2003/09/04 13:58:42  dicuccio
  458.  * Added export specifiers.  Inlined destructors of interface classes
  459.  *
  460.  * Revision 1.3  2003/08/28 19:19:15  yazhuk
  461.  * Implemented specification of the port origin and  autoadjustment of visible
  462.  * rect
  463.  *
  464.  * Revision 1.2  2003/08/10 14:11:18  dicuccio
  465.  * Compilation fixes for gcc
  466.  *
  467.  * Revision 1.1  2003/08/08 16:01:35  yazhuk
  468.  * Initial revision.
  469.  *
  470.  * ===========================================================================
  471.  */
  472. #endif