44#ifdef KICAD_GAL_PROFILE
85 int* layersPtr = aLayers;
129 std::pair<int, int>* newGroups =
new std::pair<int, int>[
m_groupsSize + 1];
176 int new_layer = orig_layer;
178 if( aReorderMap.count( orig_layer ) )
179 new_layer = aReorderMap.at( orig_layer );
195 for(
int i = 0; i < aCount; ++i )
258 m_enableOrderModifier( true ),
260 m_minScale( 0.2 ), m_maxScale( 50000.0 ),
261 m_mirrorX( false ), m_mirrorY( false ),
262 m_painter( nullptr ),
264 m_dynamic( aIsDynamic ),
265 m_useDrawPriority( false ),
266 m_nextDrawPriority( 0 ),
267 m_reverseDrawOrder( false )
273 typedef std::numeric_limits<int> coord_limits;
274 double pos = coord_limits::lowest() / 2 + coord_limits::epsilon();
275 double size = coord_limits::max() - coord_limits::epsilon();
279 m_allItems.reset(
new std::vector<VIEW_ITEM*> );
294 m_layers[ii].items = std::make_shared<VIEW_RTREE>();
321 if( aDrawPriority < 0 )
329 wxS(
"Already in a different view!" ) );
342 for(
int i = 0; i < layers_count; ++i )
344 wxCHECK2_MSG( layers[i] >= 0 &&
static_cast<unsigned>( layers[i] ) <
m_layers.size(),
345 continue, wxS(
"Invalid layer" ) );
348 l.
items->Insert( aItem, bbox );
359 static int s_gcCounter = 0;
365 std::vector<VIEW_ITEM*>::iterator item =
m_allItems->end();
368 if( cachedIndex >= 0 && cachedIndex <
static_cast<ssize_t
>(
m_allItems->size() )
385 if( s_gcCounter > 4096 )
391 return it ==
nullptr;
395 for(
size_t idx = 0; idx <
m_allItems->size(); idx++ )
396 ( *
m_allItems )[idx]->m_viewPrivData->m_cachedIndex = idx;
406 for(
int i = 0; i < layers_count; ++i )
409 l.
items->Remove( aItem, bbox );
427 wxCHECK( (
unsigned) aLayerId <
m_layers.size(), );
428 wxCHECK( (
unsigned) aRequiredId <
m_layers.size(), );
431 m_layers[aLayerId].requiredLayers.insert( aRequiredId );
433 m_layers[aLayerId].requiredLayers.erase( aRequired );
450 std::vector<VIEW_LAYER*>::const_reverse_iterator i;
457 if( ( *i )->displayOnly || !( *i )->visible )
461 ( *i )->items->Query( aRect, visitor );
464 return aResult.size();
476 if( i->displayOnly || !i->visible )
479 i->items->Query( aRect, aFunc );
499 return fabs( matrix.
GetScale().
x * aSize );
524 wxASSERT_MSG(
false, wxT(
"This is not implemented" ) );
530 bool recacheGroups = (
m_gal != nullptr );
563 wxCHECK( fabs(ssize.
x) > 0 && fabs(ssize.
y) > 0, );
567 double zoom = 1.0 / std::max( fabs( vsize.
x / ssize.
x ), fabs( vsize.
y / ssize.
y ) );
576 wxASSERT_MSG( !aMirrorY,
_(
"Mirroring for Y axis is not supported yet" ) );
640 if( obscuringScreenRects.empty() )
647 for(
const BOX2D& obscuringScreenRect : obscuringScreenRects )
663 while( !unobscuredPoly.
IsEmpty() )
665 unobscuredCenter = unobscuredPoly.
BBox().
Centre();
675 m_layers[aLayer].renderingOrder = aRenderingOrder;
683 return m_layers.at( aLayer ).renderingOrder;
689 int maxLay, maxOrd, maxIdx;
691 for(
int i = 0; i < aCount; ++i )
698 for(
int j = i; j < aCount; ++j )
709 aLayers[maxIdx] = aLayers[i];
717 std::vector<VIEW_LAYER> new_map;
721 new_map.push_back( layer );
723 for(
auto& pair : aReorderMap )
725 new_map[pair.second] =
m_layers[pair.first];
726 new_map[pair.second].id = pair.second;
744 item->ViewGetLayers( layers, layers_count );
798 m_layers[aLayer].items->Query( r, visitor );
821 viewData->
getLayers( layers, layers_count );
823 for(
int i = 0; i < layers_count; ++i )
905 std::set<unsigned int>::iterator it;
925 std::set<unsigned int>::iterator it;
957 viewData->
getLayers( layers, layers_count );
959 for(
int i = 0; i < layers_count; ++i )
1016 return b->viewPrivData()->m_drawPriority < a->viewPrivData()->m_drawPriority;
1024 return a->viewPrivData()->m_drawPriority < b->viewPrivData()->m_drawPriority;
1056 else if( l->hasNegatives )
1059 l->items->Query( aRect, drawFunc );
1066 else if( l->hasNegatives )
1077 l->items->Query( aRect, drawFunc );
1091 if(
IsCached( aLayer ) && !aImmediate )
1119 for(
int i = 0; i < layers_count; ++i )
1122 draw( aItem, layers[i], aImmediate );
1129 for(
unsigned int i = 0; i < aGroup->
GetSize(); i++)
1175 layer.items->RemoveAll();
1204#ifdef KICAD_GAL_PROFILE
1220#ifdef KICAD_GAL_PROFILE
1221 totalRealTime.
Stop();
1259 layer.items->Query( r, visitor );
1275 if( aUpdateFlags &
LAYERS )
1285 for(
int i = 0; i < layers_count; ++i )
1287 int layerId = layers[i];
1293 else if( aUpdateFlags &
COLOR )
1323 wxCHECK( (
unsigned) aLayer <
m_layers.size(), );
1342 wxCHECK( (
unsigned) aLayer <
m_layers.size(), );
1380 for(
int i = 0; i < layers_count; ++i )
1383 l.
items->Remove( aItem, old_bbox );
1384 l.
items->Insert( aItem, new_bbox );
1399 viewData->
getLayers( layers, layers_count );
1402 for(
int i = 0; i < layers_count; ++i )
1405 l.
items->Remove( aItem, old_bbox );
1411 int prevGroup = viewData->
getGroup( layers[i] );
1413 if( prevGroup >= 0 )
1426 viewData->
saveLayers( layers, layers_count );
1428 for(
int i = 0; i < layers_count; i++ )
1431 l.
items->Insert( aItem, new_bbox );
1439 wxCHECK( (
unsigned) aLayerId <
m_layers.size(),
false );
1441 std::set<int>::const_iterator it, it_end;
1443 for(
int layer :
m_layers.at( aLayerId ).requiredLayers )
1465 l.items->Query( r, visitor );
1476 unsigned int cntGeomUpdate = 0;
1477 bool anyUpdated =
false;
1484 auto vpd = item->viewPrivData();
1489 if( vpd->m_requiredUpdate !=
NONE )
1502 double ratio = (double) cntGeomUpdate / (
double) cntTotal;
1517 layer.items->RemoveAll();
1525 const BOX2I bbox = item->ViewBBox();
1526 item->m_viewPrivData->m_bbox = bbox;
1528 item->ViewGetLayers( layers, layers_count );
1529 item->viewPrivData()->saveLayers( layers, layers_count );
1531 for(
int i = 0; i < layers_count; ++i )
1533 wxCHECK2_MSG( layers[i] >= 0 &&
static_cast<unsigned>( layers[i] ) <
m_layers.size(),
1534 continue, wxS(
"Invalid layer" ) );
1536 l.
items->Insert( item, bbox );
1540 item->viewPrivData()->m_requiredUpdate &= ~(
LAYERS |
GEOMETRY );
1550 if( item && item->viewPrivData() && item->viewPrivData()->m_requiredUpdate !=
NONE )
1553 item->viewPrivData()->m_requiredUpdate =
NONE;
1559 cntGeomUpdate, (
unsigned) anyUpdated );
1567 if( item && item->viewPrivData() )
1568 item->viewPrivData()->m_requiredUpdate |= aUpdateFlags;
1574 std::function<
bool(
VIEW_ITEM* )> aCondition )
1581 if( aCondition( item ) )
1583 if( item->viewPrivData() )
1584 item->viewPrivData()->m_requiredUpdate |= aUpdateFlags;
1597 if( item->viewPrivData() )
1598 item->viewPrivData()->m_requiredUpdate |= aItemFlagsProvider( item );
1606 std::unique_ptr<VIEW> ret = std::make_unique<VIEW>();
1623 if( cur_visible != aIsVisible )
1628 viewData->
m_flags &= ~VISIBLE;
1677 return viewData && viewData->
m_view ==
this;
1694 assert( aUpdateFlags !=
NONE );
1702 std::shared_ptr<VIEW_OVERLAY>
overlay = std::make_shared<VIEW_OVERLAY>();
1733 Hide( aItem,
false );
1736 if( aTakeOwnership )
constexpr int ARC_LOW_DEF
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
constexpr void SetMaximum()
constexpr void SetOrigin(const Vec &pos)
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr void SetSize(const SizeVec &size)
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr coord_type GetRight() const
constexpr const SizeVec & GetSize() const
constexpr void SetEnd(coord_type x, coord_type y)
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
A color representation with 4 components: red, green, blue, alpha.
Abstract interface for drawing on a 2D-surface.
virtual void SetLayerDepth(double aLayerDepth)
Set the depth of the layer (position on the z-axis)
const MATRIX3x3D & GetWorldScreenMatrix() const
Get the world <-> screen transformation matrix.
virtual void StartDiffLayer()
Begins rendering of a differential layer.
virtual void EndDiffLayer()
Ends rendering of a differential layer.
void SetFlip(bool xAxis, bool yAxis)
Sets flipping of the screen.
virtual void DeleteGroup(int aGroupNumber)
Delete the group from the memory.
const MATRIX3x3D & GetScreenWorldMatrix() const
Get the screen <-> world transformation matrix.
virtual void ClearTarget(RENDER_TARGET aTarget)
Clear the target for rendering.
void SetZoomFactor(double aZoomFactor)
virtual int BeginGroup()
Begin a group.
virtual void ChangeGroupDepth(int aGroupNumber, int aDepth)
Change the depth (Z-axis position) of the group.
virtual void EndNegativesLayer()
Ends rendering of a negatives layer and draws it to the main layer.
virtual void StartNegativesLayer()
Begins rendering in a new layer that will be copied to the main layer in EndNegativesLayer().
virtual void ChangeGroupColor(int aGroupNumber, const COLOR4D &aNewColor)
Change the color used to draw the group.
virtual void DrawGroup(int aGroupNumber)
Draw the stored group.
void SetLookAtPoint(const VECTOR2D &aPoint)
Get/set the Point in world space to look at.
virtual bool IsInitialized() const
Return the initialization status for the canvas.
virtual void ComputeWorldScreenMatrix()
Compute the world <-> screen transformation matrix.
virtual void EndGroup()
End the group.
virtual void ClearCache()
Delete all data created during caching of graphic items.
virtual void SetTarget(RENDER_TARGET aTarget)
Set the target for rendering.
const VECTOR2I & GetScreenPixelSize() const
Return GAL canvas size in pixels.
virtual bool IsVisible() const
Return true if the GAL canvas is visible on the screen.
virtual void EnableDepthTest(bool aEnabled=false)
Contains all the knowledge about how to draw graphical object onto any particular output device.
virtual bool Draw(const VIEW_ITEM *aItem, int aLayer)=0
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
virtual COLOR4D GetColor(const VIEW_ITEM *aItem, int aLayer) const =0
Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer using curr...
Extend VIEW_ITEM by possibility of grouping items into a single object.
virtual unsigned int GetSize() const
Return the number of stored items.
virtual VIEW_ITEM * GetItem(unsigned int aIdx) const
bool storesGroups() const
Return information if the item uses at least one group id (ie.
std::vector< int > m_layers
int requiredUpdate() const
Return current update flag for an item.
int m_requiredUpdate
Flag required for updating.
int m_flags
Visibility flags.
void reorderGroups(std::unordered_map< int, int > aReorderMap)
Reorder the stored groups (to facilitate reordering of layers).
int m_cachedIndex
Cached index in m_allItems.
void deleteGroups()
Remove all of the stored group ids.
bool isRenderable() const
Return if the item should be drawn or not.
int m_drawPriority
Order to draw this item in a layer, lowest first.
VIEW * m_view
Current dynamic view the item is assigned to.
std::pair< int, int > * m_groups
layer_number:group_id pairs for each layer the item occupies.
int getGroup(int aLayer) const
Return number of the group id for the given layer, or -1 in case it was not cached before.
BOX2I m_bbox
Stores layer numbers used by the item.
void getLayers(int *aLayers, int &aCount) const
Return layer numbers used by the item.
void saveLayers(int *aLayers, int aCount)
Save layers used by the item.
void setGroup(int aLayer, int aGroup)
Set a group id for the item and the layer combination.
void clearUpdateFlags()
Mark an item as already updated, so it is not going to be redrawn.
An abstract base class for deriving all objects that can be added to a VIEW.
virtual const BOX2I ViewBBox() const =0
Return the bounding box of the item covering all its layers.
double m_forcedTransparency
Additional transparency for diff'ing items.
VIEW_ITEM_DATA * viewPrivData() const
virtual void ViewDraw(int aLayer, VIEW *aView) const
Draw the parts of the object belonging to layer aLayer.
virtual void ViewGetLayers(int aLayers[], int &aCount) const =0
Return the all the layers within the VIEW the object is painted on.
virtual double ViewGetLOD(int aLayer, VIEW *aView) const
Return the level of detail (LOD) of the item.
VIEW_ITEM_DATA * m_viewPrivData
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
void SortLayers(int aLayers[], int &aCount) const
Change the order of given layer ids, so after sorting the order corresponds to layers rendering order...
void ShowPreview(bool aShow=true)
void sortLayers()
Clear cached GAL group numbers (ONLY numbers stored in VIEW_ITEMs, not group objects used by GAL)
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
std::vector< VIEW_LAYER > m_layers
Sorted list of pointers to members of m_layers.
void CopySettings(const VIEW *aOtherView)
Copy layers and visibility settings from another view.
virtual void SetScale(double aScale, VECTOR2D aAnchor={ 0, 0 })
Set the scaling factor, zooming around a given anchor point.
static constexpr int TOP_LAYER_MODIFIER
void draw(VIEW_ITEM *aItem, int aLayer, bool aImmediate=false)
Draw an item, but on a specified layers.
std::vector< VIEW_ITEM * > m_ownedItems
Whether to use rendering order modifier or not.
void UpdateAllLayersOrder()
Do everything that is needed to apply the rendering order of layers.
void updateItemColor(VIEW_ITEM *aItem, int aLayer)
Update all information needed to draw an item.
void SetViewport(const BOX2D &aViewport)
Set the visible area of the VIEW.
void SetRequired(int aLayerId, int aRequiredId, bool aRequired=true)
Mark the aRequiredId layer as required for the aLayerId layer.
VECTOR2D ToScreen(const VECTOR2D &aCoord, bool aAbsolute=true) const
Convert a world space point/vector to a point/vector in screen space coordinates.
static bool compareRenderingOrder(VIEW_LAYER *aI, VIEW_LAYER *aJ)
Check if every layer required by the aLayerId layer is enabled.
int GetLayerOrder(int aLayer) const
Return rendering order of a particular layer.
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
void ClearTargets()
Clear targets that are marked as dirty.
virtual void EnableTopLayer(bool aEnable)
Enable or disable display of the top layer.
void UpdateAllLayersColor()
Apply the new coloring scheme to all layers.
bool m_mirrorY
PAINTER contains information how do draw items.
std::shared_ptr< std::vector< VIEW_ITEM * > > m_allItems
The set of layers that are displayed on the top.
std::shared_ptr< VIEW_OVERLAY > MakeOverlay()
void SetGAL(GAL *aGal)
Assign a rendering device for the VIEW.
int Query(const BOX2I &aRect, std::vector< LAYER_ITEM_PAIR > &aResult) const
Find all visible items that touch or are within the rectangle aRect.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
void invalidateItem(VIEW_ITEM *aItem, int aUpdateFlags)
Manage dirty flags & redraw queuing when updating an item.
const VECTOR2I & GetScreenPixelSize() const
Return the size of the our rendering area in pixels.
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
virtual int GetTopLayer() const
PAINTER * m_painter
Interface to #PAINTER that is used to draw items.
virtual void Redraw()
Immediately redraws the whole view.
void Clear()
Remove all items from the view.
std::set< unsigned int > m_topLayers
Center point of the VIEW (the point at which we are looking at).
bool m_enableOrderModifier
The set of possible displayed layers and its properties.
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Converts a screen space point/vector to a point/vector in world space coordinates.
bool IsHiddenOnOverlay(const VIEW_ITEM *aItem) const
void ClearTopLayers()
Remove all layers from the on-the-top set (they are no longer displayed over the rest of layers).
void MarkClean()
Force redraw of view on the next rendering.
void updateItemGeometry(VIEW_ITEM *aItem, int aLayer)
Update bounding box of an item.
static constexpr int VIEW_MAX_LAYERS
Rendering order modifier for layers that are marked as top layers.
void updateLayers(VIEW_ITEM *aItem)
Determine rendering order of layers. Used in display order sorting function.
void RecacheAllItems()
Rebuild GAL display lists.
bool areRequiredLayersEnabled(int aLayerId) const
bool IsTargetDirty(int aTarget) const
Return true if any of layers belonging to the target or the target itself should be redrawn.
int m_nextDrawPriority
Flag to reverse the draw order when using draw priority.
VIEW(bool aIsDynamic=true)
bool m_useDrawPriority
The next sequential drawing priority.
void UpdateItems()
Iterate through the list of items that asked for updating and updates them.
bool IsCached(int aLayer) const
Return true if the layer is cached.
std::pair< VIEW_ITEM *, int > LAYER_ITEM_PAIR
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
std::unique_ptr< KIGFX::VIEW_GROUP > m_preview
static void OnDestroy(VIEW_ITEM *aItem)
Nasty hack, invoked by the destructor of VIEW_ITEM to auto-remove the item from the owning VIEW if th...
GAL * m_gal
Dynamic VIEW (eg.
std::unique_ptr< VIEW > DataReference() const
Return a new VIEW object that shares the same set of VIEW_ITEMs and LAYERs.
void Hide(VIEW_ITEM *aItem, bool aHide=true, bool aHideOverlay=false)
Temporarily hide the item in the view (e.g.
virtual void SetTopLayer(int aLayer, bool aEnabled=true)
Set given layer to be displayed on the top or sets back the default order of layers.
void AddToPreview(VIEW_ITEM *aItem, bool aTakeOwnership=true)
void UpdateLayerColor(int aLayer)
Apply the new coloring scheme held by RENDER_SETTINGS in case that it has changed.
void MarkDirty()
Force redraw of view on the next rendering.
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
std::vector< VIEW_LAYER * > m_orderedLayers
Flat list of all items.
void SetLayerOrder(int aLayer, int aRenderingOrder)
Set rendering order of a particular layer.
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
void updateBbox(VIEW_ITEM *aItem)
Update set of layers that an item occupies.
bool IsVisible(const VIEW_ITEM *aItem) const
Return information if the item is visible (or not).
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Set the item visibility.
void ReorderLayerData(std::unordered_map< int, int > aReorderMap)
Remap the data between layer ids without invalidating that data.
void redrawRect(const BOX2I &aRect)
VECTOR2< T > GetScale() const
Get the scale components of the matrix.
A small class to help profiling.
void Stop()
Save the time when this function was called, and set the counter stane to stop.
double msecs(bool aSinceLast=false)
Represent a set of closed polygons.
void BooleanSubtract(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset difference For aFastMode meaning, see function booleanOp.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
const wxChar *const traceGalProfile
Flag to enable debug output of GAL performance profiling.
The Cairo implementation of the graphics abstraction layer.
@ COLOR
Color has changed.
@ INITIAL_ADD
Item is being added to the view.
@ NONE
No updates are required.
@ REPAINT
Item needs to be redrawn.
@ APPEARANCE
Visibility flag has changed.
@ GEOMETRY
Position or shape has changed.
@ LAYERS
Layers have changed.
@ ALL
All except INITIAL_ADD.
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
@ TARGET_CACHED
Main rendering target (cached)
@ TARGET_OVERLAY
Items that may change while the view stays the same (noncached)
@ HIDDEN
Item is temporarily hidden (usually in favor of a being drawn from an overlay, such as a SELECTION).
@ OVERLAY_HIDDEN
Item is temporarily hidden from being drawn on an overlay.
@ VISIBLE
Item is visible (in general)
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
std::shared_ptr< PNS_LOG_VIEWER_OVERLAY > overlay
bool operator()(VIEW_ITEM *aItem)
CLEAR_LAYER_CACHE_VISITOR(VIEW *aView)
bool operator()(VIEW_ITEM *aItem)
DRAW_ITEM_VISITOR(VIEW *aView, int aLayer, bool aUseDrawPriority, bool aReverseDrawOrder)
bool foundForcedTransparent
int layers[VIEW_MAX_LAYERS]
bool drawForcedTransparent
std::vector< VIEW_ITEM * > drawItems
bool operator()(VIEW_ITEM *aItem)
RECACHE_ITEM_VISITOR(VIEW *aView, GAL *aGal, int aLayer)
bool operator()(VIEW_ITEM *aItem)
UPDATE_COLOR_VISITOR(int aLayer, PAINTER *aPainter, GAL *aGal)
UPDATE_DEPTH_VISITOR(int aLayer, int aDepth, GAL *aGal)
bool operator()(VIEW_ITEM *aItem)
int renderingOrder
Rendering order of this layer.
std::shared_ptr< VIEW_RTREE > items
R-tree indexing all items on this layer.
RENDER_TARGET target
Where the layer should be rendered.
wxLogTrace helper definitions.
#define KI_TRACE(aWhat,...)
VECTOR2< double > VECTOR2D