seqgraphic_render.cpp

来自「ncbi源码」· C++ 代码 · 共 755 行 · 第 1/2 页

CPP
755
字号
/* * =========================================================================== * PRODUCTION $Log: seqgraphic_render.cpp,v $ * PRODUCTION Revision 1000.7  2004/06/01 21:12:56  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.97 * PRODUCTION * =========================================================================== *//*  $Id: seqgraphic_render.cpp,v 1000.7 2004/06/01 21:12:56 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Vlad Lebedev * */#include <ncbi_pch.hpp>#include <gui/widgets/seq_graphic/seqgraphic_render.hpp>#include <gui/widgets/seq_graphic/seqgraphic_ds.hpp>#include <gui/opengl/glutils.hpp>#include <gui/widgets/seq_graphic/default_policy.hpp>#include <gui/widgets/seq_graphic/compact_policy.hpp>#include <gui/widgets/seq_graphic/genome_policy.hpp>#include <gui/widgets/seq_graphic/default_layoutpolicy.hpp>#include <gui/widgets/seq_graphic/genome_layoutpolicy.hpp>#include <gui/opengl/glbackground.hpp>#include <math.h>BEGIN_NCBI_SCOPEconst TModelUnit kZoomFactorX     = 2.0;const TModelUnit kLenseZoomFactor = 10.0;const TVPUnit    kMaxPixelsBase   = 12;CSeqGraphicRenderer::CSeqGraphicRenderer(){    m_DS           = NULL;    m_NeedLensZoom = false;    m_MinZoomX     = log(1.0f / kMaxPixelsBase);  // Enougth to fit seq. letters        m_FP.SetMinScaleX(1.0f / kMaxPixelsBase);    m_FP.EnableZoom(true, false);    m_FP.SetAdjustToLimits(true, false);    m_FP.EnableOffset(true);    m_RP.SetMinScaleX(1.0f / kMaxPixelsBase);    m_RP.EnableZoom(true, false);    m_RP.SetAdjustToLimits(true, false);    m_RP.EnableOffset(true);    m_AllPanes.push_back(&m_RP);    m_AllPanes.push_back(&m_FP);        m_ScrollXPanes.push_back(&m_RP);    m_ScrollXPanes.push_back(&m_FP);        m_AllRenderers.push_back(&m_RulerPanel);    m_AllRenderers.push_back(&m_FeatPanel);}CSeqGraphicRenderer::~CSeqGraphicRenderer(){}void CSeqGraphicRenderer::SetConfig(CRef<CSeqGraphicConfig> config){    m_ConfigSettings = config;    m_FeatPanel.SetConfig(config);    ConfigureRenderPolicy();}void CSeqGraphicRenderer::UpdateConfig(){    ConfigureRenderPolicy();}void CSeqGraphicRenderer::ConfigureRenderPolicy(){    if (m_ConfigSettings) {        CRef<IPolicy> policy;        CRef<ILayoutPolicy> layout_policy;        switch (m_ConfigSettings->GetFeaturePanelRenderPolicy()) {                case CRenderPolicyConfig::eRenderPolicyDefault :            policy.Reset(new CDefaultPolicy);            layout_policy.Reset(new CDefaultLayoutPolicy);            break;                case CRenderPolicyConfig::eRenderPolicyCompact :            policy.Reset(new CCompactPolicy);            layout_policy.Reset(new CDefaultLayoutPolicy);            break;                    case CRenderPolicyConfig::eRenderPolicyInline :            //policy.Reset(new CInlinePolicy);            policy.Reset(new CDefaultPolicy);            layout_policy.Reset(new CDefaultLayoutPolicy);            break;                    case CRenderPolicyConfig::eRenderPolicyGenome :            policy.Reset(new CGenomePolicy);   // Change when we get a Genome Policy.            layout_policy.Reset(new CGenomeLayoutPolicy);            break;                    default:            return;        }                //layout_policy.Reset(new CGenomeLayoutPolicy);        //policy.Reset(new CCompactPolicy);                m_FeatPanel.SetRenderPolicy(policy);            m_FeatPanel.SetLayoutPolicy(layout_policy);    }}TModelUnit CSeqGraphicRenderer::GetHeight(){    return m_FeatPanel.GetHeight(m_FP) + m_RulerPanel.GetPreferredSize().Y();}void CSeqGraphicRenderer::SetDataSource(const TVPRect& rc, CSeqGraphicDataSource* ds){    m_DS = ds;    m_FeatPanel.SetHandle(m_DS->GetBioseqHandle());    m_FeatPanel.SetSelectedObjects(&m_SelectedObjects);        m_RulerPanel.SetHorizontal(true, CRuler::eTop);	m_RulerPanel.SetDisplayOptions(CRuler::fHideLabels |								   CRuler::fShowMetric);								       x_SetupViewPorts(rc);    x_SetupModelLimits();        m_MaxZoomX = log(m_FP.GetModelLimitsRect().Width() / rc.Width());}void CSeqGraphicRenderer::x_SetupViewPorts(const TVPRect& rc){    TModelUnit ruler_height = m_RulerPanel.GetPreferredSize().Y();    //TModelUnit height = rc.Height();    TVPRect ruler_viewport(rc.Left(),  rc.Top() - ruler_height,                           rc.Right(), rc.Top());    TVPRect feat_viewport(rc.Left(),  rc.Bottom(),                          rc.Right(), rc.Top() - ruler_height);    feat_viewport.Offset(0, -m_ConfigSettings->GetRulerSpacer());        m_RP.SetViewport(ruler_viewport);    m_FP.SetViewport(feat_viewport);    _TRACE("ruler: "           << ruler_viewport.Left() << ", "           << ruler_viewport.Bottom() << ", "           << ruler_viewport.Right() << ", "           << ruler_viewport.Top());    _TRACE("features: "           << feat_viewport.Left() << ", "           << feat_viewport.Bottom() << ", "           << feat_viewport.Right() << ", "           << feat_viewport.Top());    /**    size_t idx = 0;    TVPUnit bottom = rc.Bottom() + rc.Height();    NON_CONST_ITERATE(TGlPanes, iter, m_AllPanes) {        CGlPane& pane = **iter;        TVPUnit pref_height = m_AllRenderers[idx]->GetVPRect().Height();                if (pref_height == 1) {            // TVPRect adds 1 automatically            pref_height = 0;        }        TVPRect rc_tmp(rc.Left(), bottom - pref_height, rc.Right(), bottom);        _TRACE("viewport: "               << rc_tmp.Left() << ", "               << rc_tmp.Bottom() << ", "               << rc_tmp.Right() << ", "               << rc_tmp.Top());        pane.SetViewport(rc_tmp);        bottom -= pref_height;        ++idx;    }    **/}void CSeqGraphicRenderer::x_SetupModelLimits(){    NON_CONST_ITERATE(TGlPanes, iter, m_AllPanes) {        CGlPane& pane = **iter;                TVPRect& vp = pane.GetViewport();        TModelRect rc;        if (*iter == &m_RP) {            rc = TModelRect(0, 0, m_DS->GetSequenceLength() + 1, vp.Height());        } else {            rc = TModelRect(0, vp.Height(), m_DS->GetSequenceLength() + 1, 0);            rc.Offset(0, -m_ConfigSettings->GetRulerSpacer());        }        pane.SetModelLimitsRect(rc);        pane.SetVisibleRect    (rc);    }}void CSeqGraphicRenderer::Render(){    x_Draw(NULL);}void CSeqGraphicRenderer::Render(TAreaVector& areas){    x_Draw(&areas);}void CSeqGraphicRenderer::Render(TAreaVector* p_areas){    x_Draw(p_areas);}void CSeqGraphicRenderer::x_Draw(TAreaVector* p_areas){    try {        CGlColor bg = m_ConfigSettings->GetElementColor(                            CSeqGraphicColorConfig::eBackground);        /**        CGlBackground back;        back.SetColor(bg);        back.Draw(m_RP.GetViewport());        back.Draw(m_FP.GetViewport());        **/        glClearColor(bg.GetRed(), bg.GetGreen(), bg.GetBlue(), 0.0f);        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);                CGlColor ruler_label = m_ConfigSettings->GetElementColor(                                CSeqGraphicColorConfig::eLabel_Ruler);        CGlColor ruler_grid  = m_ConfigSettings->GetElementColor(                                CSeqGraphicColorConfig::eRuler_Grid);                m_RulerPanel.SetColor(CRuler::eBackground, bg);        m_RulerPanel.SetColor(CRuler::eRuller, ruler_grid);        m_RulerPanel.SetColor(CRuler::eText,   ruler_label);        if ( !m_DS ) {            return;        }        TModelRect& rcM = m_FP.GetModelLimitsRect();        TModelRect  rcV = m_FP.GetVisibleRect();            // retrieve and count data. This is temporary.        TModelUnit rows = m_FeatPanel.GetHeight(m_FP);         // We have a "floating" model space. So, adjust the limits         rcM.SetBottom(rows);        m_FP.SetModelLimitsRect(rcM);        m_FP.SetVisibleRect(rcV);        // Finally, draw all panels        for (size_t idx = 0; idx != m_AllRenderers.size(); idx++) {            m_AllRenderers[idx]->Render( *m_AllPanes[idx] );        }        // collect HTML active areas        if(p_areas)         {            m_FeatPanel.GetHTMLActiveAreas(m_FP, p_areas);            // Offset by the height of Ruler Panel and Spacer            NON_CONST_ITERATE (TAreaVector, iter, *p_areas) {                // RulerBar                (*iter).m_Bounds.Offset(0, m_RP.GetViewport().Height());                                // RulerBar spacer                (*iter).m_Bounds.Offset(0, -m_ConfigSettings->GetRulerSpacer());            }        }        // Draw Zoomed view        if (m_NeedLensZoom) {            x_DimDisplay();            size_t idx = 1;            NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {                CGlPane& pane = **iter;                TModelRect rc = pane.GetVisibleRect();                pane.SetZoomFactor(kLenseZoomFactor);                pane.ZoomIn(m_LensZoom);                            if (&pane == &m_FP) {                    m_FeatPanel.GetHeight(m_FP);                    m_FeatPanel.Render(pane);                } else {                    m_RulerPanel.Render(pane);                }                                pane.SetZoomFactor(kZoomFactorX);                pane.SetVisibleRect(rc);                idx++;            }        }    }    catch (CException& e) {        m_FP.Close();        LOG_POST(Error << "Exception in CSeqGraphicRender::Render(): " << e.GetMsg());    }    CGlUtils::CheckGlError();}void CSeqGraphicRenderer::x_DimDisplay(){    glEnable(GL_BLEND);    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);    glColor4f(1.0f, 1.0f, 1.0f, 0.9f);        NON_CONST_ITERATE(TGlPanes, iter, m_ScrollXPanes) {        CGlPane& pane = **iter;        TVPRect& rc   = pane.GetViewport();                pane.OpenPixels();        glRecti(rc.Left(), rc.Bottom(), rc.Right()+1, rc.Top());        pane.Close();    }    glDisable(GL_BLEND);}void CSeqGraphicRenderer::Resize(const TVPRect& rc){    x_SetupViewPorts(rc);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?