diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index 705d9d69..8d379dbe 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -26,6 +26,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; import java.util.Collection; import java.util.List; import java.util.Map; @@ -192,9 +193,10 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP * @param g2d * @param drawOptions specific drawing options * @param filter - * @param externalZoom + * @param externalZoom + * @param visibleRect */ - void draw(Graphics2D g2d, Set drawOptions, IComponentFiler filter, Double externalZoom); + void draw(Graphics2D g2d, Set drawOptions, IComponentFiler filter, Double externalZoom, Rectangle2D visibleRect); Double[] getAvailableZoomLevels(); diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java index 462f9882..24656fdc 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java @@ -87,7 +87,7 @@ public class DrawingCache { */ @SuppressWarnings("unchecked") public void draw(IDIYComponent component, G2DWrapper g2d, ComponentState componentState, - boolean outlineMode, Project project, double zoom) { + boolean outlineMode, Project project, double zoom, Rectangle2D visibleRect) { ComponentType type = ComponentProcessor.getInstance() .extractComponentTypeFrom((Class>) component.getClass()); @@ -99,17 +99,20 @@ public class DrawingCache { long componentStart = System.nanoTime(); - // temporarily scale the graphic to compensate for the zoom, since we are rendering an image with the zoom appled - if (Math.abs(1.0 - zoom) > 1e-4) { - g2d.getCanvasGraphics().scale(1 / zoom, 1 / zoom); - } - try { - // draw cached image - g2d.getCanvasGraphics().drawImage(value.getImage(), (int) ((firstPoint.x - value.getDx()) * zoom), - (int) ((firstPoint.y - value.getDy())* zoom), null); - } finally { + // only render the cached image if it's within the clipping region + if (visibleRect == null || visibleRect.intersects(value.getCacheBounds())) { + // temporarily scale the graphic to compensate for the zoom, since we are rendering an image with the zoom appled if (Math.abs(1.0 - zoom) > 1e-4) { - g2d.getCanvasGraphics().scale(zoom, zoom); + g2d.getCanvasGraphics().scale(1 / zoom, 1 / zoom); + } + try { + // draw cached image + g2d.getCanvasGraphics().drawImage(value.getImage(), (int) ((firstPoint.x - value.getDx()) * zoom), + (int) ((firstPoint.y - value.getDy())* zoom), null); + } finally { + if (Math.abs(1.0 - zoom) > 1e-4) { + g2d.getCanvasGraphics().scale(zoom, zoom); + } } } @@ -125,7 +128,7 @@ public class DrawingCache { } stats.getSecond().add(componentEnd - componentStart); - // copy over tracking area from the cache + // copy over tracking area from the cache, regardless if we rendered or not g2d.merge(value.getCurrentArea(), value.getContinuityPositiveAreas(), value.getContinuityNegativeAreas()); } else { // no caching, just draw as usual @@ -233,7 +236,7 @@ public class DrawingCache { // add to the cache value = new CacheValue(component, image, wrapper.getCurrentArea(), wrapper.getContinuityPositiveAreas(), - wrapper.getContinuityNegativeAreas(), componentState, zoom, dx, dy); + wrapper.getContinuityNegativeAreas(), componentState, zoom, dx, dy, rect); imageCache.put(component, value); } @@ -250,11 +253,13 @@ public class DrawingCache { double zoom; int dx; int dy; + Rectangle2D cacheBounds; public CacheValue(IDIYComponent component, BufferedImage image, Area currentArea, Map continuityPositiveAreas, Map continuityNegativeAreas, - ComponentState state, double zoom, int dx, int dy) { + ComponentState state, double zoom, int dx, int dy, Rectangle2D cacheBounds) { super(); + this.cacheBounds = cacheBounds; // take a copy of the component, so we can check if it changed in the meantime try { this.component = component.clone(); @@ -305,6 +310,10 @@ public class DrawingCache { public int getDy() { return dy; } + + public Rectangle2D getCacheBounds() { + return cacheBounds; + } @Override public String toString() { diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 6b0810d2..0b477a51 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -139,12 +139,13 @@ public class DrawingManager { * @param componentSlot * @param dragInProgress * @param externalZoom + * @param visibleRect * @return */ public List> drawProject(Graphics2D g2d, Project project, Set drawOptions, IComponentFiler filter, Rectangle selectionRect, Collection> selectedComponents, Set> lockedComponents, Set> groupedComponents, List controlPointSlot, - List> componentSlot, boolean dragInProgress, Double externalZoom) { + List> componentSlot, boolean dragInProgress, Double externalZoom, Rectangle2D visibleRect) { long totalStartTime = System.nanoTime(); failedComponents.clear(); if (project == null) { @@ -242,11 +243,16 @@ public class DrawingManager { // translate to the new (0, 0) g2d.transform(AffineTransform.getTranslateInstance(extraSpace, extraSpace)); + if (visibleRect != null) + visibleRect.setRect(visibleRect.getX() - extraSpace, visibleRect.getY() - extraSpace, + visibleRect.getWidth(), visibleRect.getHeight()); } // apply zoom if (Math.abs(1.0 - zoom) > 1e-4) { g2dWrapper.scale(zoom, zoom); + visibleRect.setRect(visibleRect.getX() / zoom, visibleRect.getY() / zoom, + visibleRect.getWidth() / zoom, visibleRect.getHeight() / zoom); } // Composite mainComposite = g2d.getComposite(); @@ -301,7 +307,7 @@ public class DrawingManager { try { if (drawOptions.contains(DrawOption.ENABLE_CACHING)) // go through the DrawingCache - DrawingCache.Instance.draw(component, g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, zoom); + DrawingCache.Instance.draw(component, g2dWrapper, state, drawOptions.contains(DrawOption.OUTLINE_MODE), project, zoom, visibleRect); else // go stragiht to the wrapper component.draw(g2dWrapper, state, outlineMode, project, g2dWrapper); diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index b6bcac97..11130c1a 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -459,7 +459,7 @@ public class Presenter implements IPlugInPort { } @Override - public void draw(Graphics2D g2d, Set drawOptions, final IComponentFiler filter, Double externalZoom) { + public void draw(Graphics2D g2d, Set drawOptions, final IComponentFiler filter, Double externalZoom, Rectangle2D visibleRect) { if (currentProject == null) { return; } @@ -501,7 +501,8 @@ public class Presenter implements IPlugInPort { getLockedComponents(), groupedComponents, Arrays.asList(instantiationManager.getFirstControlPoint(), - instantiationManager.getPotentialControlPoint()), componentSlotToDraw, dragInProgress, externalZoom); + instantiationManager.getPotentialControlPoint()), componentSlotToDraw, dragInProgress, externalZoom, + visibleRect); List failedComponentNames = new ArrayList(); for (IDIYComponent component : failedComponents) { failedComponentNames.add(component.getName()); diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index dec1e598..af52acbc 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -2902,6 +2902,10 @@ IMPROVEMENT Improved performance math calculations used to model "Twisted Wires" + + IMPROVEMENT + Improved performance of "Highlight Connected Areas" feature + BUG_FIX Older files that contain "Open Jack 1/4" components sometimes open with the jacks rotated the wrong way diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index bebb4c0e..9ae82ec5 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index bebb4c0e..9ae82ec5 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 52370b0c..57e50ddd 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java b/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java index 461399ea..ea9e70d0 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java @@ -158,7 +158,8 @@ public class MainFrame extends JFrame implements ISwingUI { if (presenter.allowFileAction()) { ConfigurationManager.getInstance().writeValue(IPlugInPort.ABNORMAL_EXIT_KEY, false); dispose(); - presenter.dispose(); + presenter.dispose(); + LOG.info("Closing the app"); System.exit(0); } } diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java index 2286372d..daec44d3 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java @@ -290,7 +290,7 @@ public class TemplateDialog extends JDialog { super.paint(g); // Graphics2D g2d = (Graphics2D) g; // AffineTransform transform = g2d.getTransform(); - presenter.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), null, null); + presenter.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), null, null, null); // g2d.setTransform(transform); // Rectangle rect = canvasPanel.getBounds(); // BorderFactory.createEtchedBorder().paintBorder(canvasPanel, diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index 60537076..3598ab09 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -270,7 +270,7 @@ public class CanvasPanel extends JComponent implements Autoscroll { drawOptions.add(DrawOption.ENABLE_CACHING); } - plugInPort.draw(g2d, drawOptions, null, null); + plugInPort.draw(g2d, drawOptions, null, null, visibleRect); if (useHardwareAcceleration) { VolatileImage volatileImage = (VolatileImage) bufferImage; diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index f2786e5c..2ada9160 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -319,7 +319,7 @@ public class UploadDialog extends ButtonDialog { } // g2d.scale(zoomRatio, zoomRatio); - UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio); + UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio, null); } public String getKeywords() { diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java index 8b13dfc5..c6867b6e 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java @@ -72,7 +72,7 @@ public class ProjectDrawingProvider implements IDrawingProvider { if (includeExtraSpace) { drawOptions.add(DrawOption.EXTRA_SPACE); } - plugInPort.draw((Graphics2D) g, drawOptions, null, zoomFactor); + plugInPort.draw((Graphics2D) g, drawOptions, null, zoomFactor, null); } @Override diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java index 7d497365..6cdc957c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java @@ -148,7 +148,7 @@ public class ProjectPreview extends JPanel implements PropertyChangeListener, IF // g2d.translate(x, y); // g2d.scale(zoomRatio, zoomRatio); - presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null, zoomRatio); + presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null, zoomRatio, null); g2d.setColor(Color.black); g2d.drawRect(0, 0, d.width - (int) (1 / zoomRatio), d.height - (int) (1 / zoomRatio)); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java index aff3561c..11ea8973 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java @@ -60,7 +60,7 @@ public class TraceMaskDrawingProvider implements IDrawingProvider { @Override public void draw(int page, Graphics g, double zoomFactor) { - plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page]), zoomFactor); + plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page]), zoomFactor, null); } @Override