Commit 9c4e0237 authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Added the 'cached' parameter for VIEW_LAYER. The parameter decides if items...

Added the 'cached' parameter for VIEW_LAYER. The parameter decides if items drawn on the layer should be cached or drawn in immediate mode.
Removed m_useGroups from VIEW, as now groups are enabled per layer.
parent aff3787b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin

    m_painter = new KiGfx::PCB_PAINTER( m_gal );

    m_view = new KiGfx::VIEW( true, true );
    m_view = new KiGfx::VIEW( true );
    m_view->SetPainter( m_painter );
    m_view->SetGAL( m_gal );

+31 −43
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ void VIEW::AddLayer( int aLayer, bool aDisplayOnly )
        m_layers[aLayer].items  = new VIEW_RTREE();
        m_layers[aLayer].renderingOrder = aLayer;
        m_layers[aLayer].enabled        = true;
        m_layers[aLayer].cached         = true;
        m_layers[aLayer].isDirty        = false;
        m_layers[aLayer].displayOnly    = aDisplayOnly;
    }
@@ -138,13 +139,12 @@ int VIEW::Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult )
}


VIEW::VIEW( bool aIsDynamic, bool aUseGroups ) :
VIEW::VIEW( bool aIsDynamic ) :
    m_enableTopLayer( false ),
    m_scale ( 1.0 ),
    m_painter( NULL ),
    m_gal( NULL ),
    m_dynamic( aIsDynamic ),
    m_useGroups( aUseGroups )
    m_dynamic( aIsDynamic )
{
    // By default there is no layer on the top
    m_topLayer.enabled = false;
@@ -209,7 +209,6 @@ void VIEW::SetGAL( GAL* aGal )
    m_gal = aGal;

    // clear group numbers, so everything is going to be recached
    if( m_useGroups )
    clearGroupCache();

    // force the new GAL to display the current viewport.
@@ -282,12 +281,6 @@ void VIEW::SetCenter( const VECTOR2D& aCenter )
}


void VIEW::SetLayerVisible( int aLayer, bool aVisible )
{
    m_layers[aLayer].enabled = aVisible;
}


void VIEW::sortLayers()
{
    int n = 0;
@@ -452,7 +445,7 @@ void VIEW::EnableTopLayer( bool aEnable )

struct VIEW::drawItem
{
    drawItem( VIEW* aView, int aCurrentLayer ) :
    drawItem( VIEW* aView, const VIEW_LAYER* aCurrentLayer ) :
        currentLayer( aCurrentLayer ), view( aView )
    {
    }
@@ -461,9 +454,10 @@ struct VIEW::drawItem
    {
        GAL* gal = view->GetGAL();

        if( view->m_useGroups )
        if( currentLayer->cached )
        {
            int group = aItem->getGroup( currentLayer );
            // Draw using cached information or create one
            int group = aItem->getGroup( currentLayer->id );

            if( group >= 0 && aItem->ViewIsVisible() )
            {
@@ -472,18 +466,19 @@ struct VIEW::drawItem
            else
            {
                group = gal->BeginGroup();
                aItem->setGroup( currentLayer, group );
                view->m_painter->Draw( aItem, currentLayer );
                aItem->setGroup( currentLayer->id, group );
                view->m_painter->Draw( aItem, currentLayer->id );
                gal->EndGroup();
            }
        }
        else if( aItem->ViewIsVisible() )
        {
            view->m_painter->Draw( aItem, currentLayer );
            // Immediate mode
            view->m_painter->Draw( aItem, currentLayer->id );
        }
    }

    int      currentLayer;
    const VIEW_LAYER* currentLayer;
    VIEW* view;
};

@@ -494,9 +489,8 @@ void VIEW::redrawRect( const BOX2I& aRect )
    {
        if( l->enabled )
        {
            drawItem drawFunc( this, l->id );
            drawItem drawFunc( this, l );

            if( !m_useGroups )
            m_gal->SetLayerDepth( static_cast<double>( l->renderingOrder ) );
            l->items->Query( aRect, drawFunc );
            l->isDirty = false;
@@ -514,9 +508,9 @@ struct VIEW::unlinkItem
};


struct VIEW::recacheItem
struct VIEW::recacheLayer
{
    recacheItem( VIEW* aView, GAL* aGal, int aLayer, bool aImmediately ) :
    recacheLayer( VIEW* aView, GAL* aGal, int aLayer, bool aImmediately ) :
        view( aView ), gal( aGal ), layer( aLayer ), immediately( aImmediately )
    {
    }
@@ -566,11 +560,8 @@ void VIEW::Clear()
        l->items->RemoveAll();
    }

    if( m_useGroups )
    {
    m_gal->ClearCache();
}
}


void VIEW::Redraw()
@@ -608,12 +599,11 @@ void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
            l->items->Remove( aItem );
            l->items->Insert( aItem );    /* reinsert */

            if( m_useGroups )
            aItem->deleteGroups();
        }
    }

    if( m_useGroups && aItem->storesGroups() )
    if( aItem->storesGroups() )
    {
        std::vector<int> groups = aItem->getAllGroups();
        for(std::vector<int>::iterator i = groups.begin(); i != groups.end(); i++ )
@@ -626,9 +616,9 @@ void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
}


struct VIEW::clearItemCache
struct VIEW::clearLayerCache
{
    clearItemCache( VIEW* aView ) :
    clearLayerCache( VIEW* aView ) :
        view( aView )
    {
    }
@@ -647,13 +637,10 @@ struct VIEW::clearItemCache

void VIEW::clearGroupCache()
{
    if( !m_useGroups )
            return;

    BOX2I r;

    r.SetMaximum();
    clearItemCache visitor( this );
    clearLayerCache visitor( this );

    for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
    {
@@ -665,9 +652,6 @@ void VIEW::clearGroupCache()

void VIEW::RecacheAllItems( bool aImmediately )
{
    if( !m_useGroups )
        return;

    BOX2I r;

    r.SetMaximum();
@@ -682,10 +666,14 @@ void VIEW::RecacheAllItems( bool aImmediately )
    for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
    {
        VIEW_LAYER* l = & ( ( *i ).second );

        if( l->cached )
        {
            m_gal->SetLayerDepth( (double) l->renderingOrder );
        recacheItem visitor( this, m_gal, l->id, aImmediately );
            recacheLayer visitor( this, m_gal, l->id, aImmediately );
            l->items->Query( r, visitor );
        }
    }

#ifdef __WXDEBUG__
    prof_end( &totalRealTime );
+21 −8
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ public:
     * @param aIsDynamic decides whether we are creating a static or a dynamic VIEW.
     * @param aUseGroups tells if items added to the VIEW should be stored in groups.
     */
    VIEW( bool aIsDynamic = true, bool aUseGroups = false );
    VIEW( bool aIsDynamic = true );

    ~VIEW();

@@ -251,7 +251,21 @@ public:
     * visibility is updated
     * @param aVisible: the obivous
     */
    void    SetLayerVisible( int aLayer, bool aVisible = true );
    inline void SetLayerVisible( int aLayer, bool aVisible = true )
    {
        m_layers[aLayer].enabled = aVisible;
    }

    /**
     * Function SetLayerDynamic()
     * Turns on or off the dynamic parameter of a particular layer.
     * @param aLayer: the layer
     * @param aDynamic: the parameter
     */
    inline void SetLayerCached( int aLayer, bool aCached = true )
    {
        m_layers[aLayer].cached = aCached;
    }

    /**
     * Function SetLayerOrder()
@@ -339,6 +353,8 @@ private:
        bool                    enabled;         ///* is the layer to be rendered?
        bool                    isDirty;         ///* does it contain any dirty items (updated since last redraw)
        bool                    displayOnly;     ///* is the layer display only?
        bool                    cached;          ///* items on non-cached layers are displayed in
                                                 ///* immediate mode
        VIEW_RTREE*             items;           ///* R-tree indexing all items on this layer.
        std::vector<VIEW_ITEM*> dirtyItems;      ///* set of dirty items collected since last redraw
        int                     renderingOrder;  ///* rendering order of this layer
@@ -354,10 +370,10 @@ private:
    typedef std::vector<VIEW_LAYER*>::iterator      LayerOrderIter;

    // Function objects that need to access VIEW/VIEW_ITEM private/protected members
    struct clearItemCache;
    struct unlinkItem;
    struct recacheItem;
    struct clearLayerCache;
    struct recacheLayer;
    struct drawItem;
    struct unlinkItem;
    struct updateItemsColor;
    struct changeItemsDepth;

@@ -408,9 +424,6 @@ private:
    /// Dynamic VIEW (eg. display PCB in window) allows changes once it is built,
    /// static (eg. image/PDF) - does not.
    bool        m_dynamic;

    /// Determines whether to use cached groups of objects for displaying.
    bool        m_useGroups;
};
} // namespace KiGfx

+0 −2
Original line number Diff line number Diff line
@@ -205,7 +205,6 @@ public:
     * @param aLayers[]: output layer index array
     * @param aCount: number of layer indices in aLayers[]
     */

    virtual void ViewGetLayers( int aLayers[], int& aCount ) const = 0;

    /**
@@ -216,7 +215,6 @@ public:
     */
    void ViewSetVisible( bool aIsVisible = true );


    /**
     * Function ViewIsVisible()
     * Returns if the item is visible (or not).