Loading common/view/view.cpp +35 −6 Original line number Diff line number Diff line Loading @@ -633,7 +633,7 @@ void VIEW::draw( VIEW_ITEM* aItem, bool aImmediate ) const { int layers[VIEW_MAX_LAYERS], layers_count; aItem->getLayers( layers, layers_count ); aItem->ViewGetLayers( layers, layers_count ); // Sorting is needed for drawing order dependent GALs (like Cairo) SortLayers( layers, layers_count ); Loading Loading @@ -813,19 +813,23 @@ void VIEW::clearGroupCache() void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags ) { int layers[VIEW_MAX_LAYERS], layers_count; aItem->getLayers( layers, layers_count ); if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) // updateLayers updates geometry too, so we do not have to update both of them at the same time if( aUpdateFlags & VIEW_ITEM::LAYERS ) updateLayers( aItem ); else if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) updateBbox( aItem ); int layers[VIEW_MAX_LAYERS], layers_count; aItem->ViewGetLayers( layers, layers_count ); // Iterate through layers used by the item and recache it immediately for( int i = 0; i < layers_count; i++ ) { int layerId = layers[i]; if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) if( aUpdateFlags & ( VIEW_ITEM::GEOMETRY | VIEW_ITEM::LAYERS ) ) { // Redraw if( IsCached( layerId ) ) updateItemGeometry( aItem, layerId ); } Loading Loading @@ -900,6 +904,31 @@ void VIEW::updateBbox( VIEW_ITEM* aItem ) } void VIEW::updateLayers( VIEW_ITEM* aItem ) { int layers[VIEW_MAX_LAYERS], layers_count; // Remove the item from previous layer set aItem->getLayers( layers, layers_count ); for( int i = 0; i < layers_count; i++ ) { VIEW_LAYER& l = m_layers[layers[i]]; l.items->Remove( aItem ); MarkTargetDirty( l.target ); } // Add the item to new layer set aItem->ViewGetLayers( layers, layers_count ); aItem->saveLayers( layers, layers_count ); for( int i = 0; i < layers_count; i++ ) { VIEW_LAYER& l = m_layers[layers[i]]; l.items->Insert( aItem ); MarkTargetDirty( l.target ); } } bool VIEW::areRequiredLayersEnabled( int aLayerId ) const { wxASSERT( (unsigned) aLayerId < m_layers.size() ); Loading common/view/view_item.cpp +0 −1 Original line number Diff line number Diff line Loading @@ -73,7 +73,6 @@ void VIEW_ITEM::getLayers( int* aLayers, int& aCount ) const { if( m_layers[i] ) *layersPtr++ = i; } aCount = m_layers.count(); Loading include/view/view.h +3 −0 Original line number Diff line number Diff line Loading @@ -569,6 +569,9 @@ private: /// Updates bounding box of an item void updateBbox( VIEW_ITEM* aItem ); /// Updates set of layers that an item occupies void updateLayers( VIEW_ITEM* aItem ); /// Determines rendering order of layers. Used in display order sorting function. static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j ) { Loading include/view/view_item.h +1 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,7 @@ public: APPEARANCE = 0x01, /// Visibility flag has changed COLOR = 0x02, /// Color has changed GEOMETRY = 0x04, /// Position or shape has changed LAYERS = 0x08, /// Layers have changed ALL = 0xff }; Loading Loading
common/view/view.cpp +35 −6 Original line number Diff line number Diff line Loading @@ -633,7 +633,7 @@ void VIEW::draw( VIEW_ITEM* aItem, bool aImmediate ) const { int layers[VIEW_MAX_LAYERS], layers_count; aItem->getLayers( layers, layers_count ); aItem->ViewGetLayers( layers, layers_count ); // Sorting is needed for drawing order dependent GALs (like Cairo) SortLayers( layers, layers_count ); Loading Loading @@ -813,19 +813,23 @@ void VIEW::clearGroupCache() void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags ) { int layers[VIEW_MAX_LAYERS], layers_count; aItem->getLayers( layers, layers_count ); if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) // updateLayers updates geometry too, so we do not have to update both of them at the same time if( aUpdateFlags & VIEW_ITEM::LAYERS ) updateLayers( aItem ); else if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) updateBbox( aItem ); int layers[VIEW_MAX_LAYERS], layers_count; aItem->ViewGetLayers( layers, layers_count ); // Iterate through layers used by the item and recache it immediately for( int i = 0; i < layers_count; i++ ) { int layerId = layers[i]; if( aUpdateFlags & VIEW_ITEM::GEOMETRY ) if( aUpdateFlags & ( VIEW_ITEM::GEOMETRY | VIEW_ITEM::LAYERS ) ) { // Redraw if( IsCached( layerId ) ) updateItemGeometry( aItem, layerId ); } Loading Loading @@ -900,6 +904,31 @@ void VIEW::updateBbox( VIEW_ITEM* aItem ) } void VIEW::updateLayers( VIEW_ITEM* aItem ) { int layers[VIEW_MAX_LAYERS], layers_count; // Remove the item from previous layer set aItem->getLayers( layers, layers_count ); for( int i = 0; i < layers_count; i++ ) { VIEW_LAYER& l = m_layers[layers[i]]; l.items->Remove( aItem ); MarkTargetDirty( l.target ); } // Add the item to new layer set aItem->ViewGetLayers( layers, layers_count ); aItem->saveLayers( layers, layers_count ); for( int i = 0; i < layers_count; i++ ) { VIEW_LAYER& l = m_layers[layers[i]]; l.items->Insert( aItem ); MarkTargetDirty( l.target ); } } bool VIEW::areRequiredLayersEnabled( int aLayerId ) const { wxASSERT( (unsigned) aLayerId < m_layers.size() ); Loading
common/view/view_item.cpp +0 −1 Original line number Diff line number Diff line Loading @@ -73,7 +73,6 @@ void VIEW_ITEM::getLayers( int* aLayers, int& aCount ) const { if( m_layers[i] ) *layersPtr++ = i; } aCount = m_layers.count(); Loading
include/view/view.h +3 −0 Original line number Diff line number Diff line Loading @@ -569,6 +569,9 @@ private: /// Updates bounding box of an item void updateBbox( VIEW_ITEM* aItem ); /// Updates set of layers that an item occupies void updateLayers( VIEW_ITEM* aItem ); /// Determines rendering order of layers. Used in display order sorting function. static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j ) { Loading
include/view/view_item.h +1 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,7 @@ public: APPEARANCE = 0x01, /// Visibility flag has changed COLOR = 0x02, /// Color has changed GEOMETRY = 0x04, /// Position or shape has changed LAYERS = 0x08, /// Layers have changed ALL = 0xff }; Loading