--- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java 2014-02-12 10:40:48.708175300 +0100 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java 2014-02-12 10:40:48.497163200 +0100 @@ -25,6 +25,10 @@ package com.sun.javafx.scene.control.skin; +import com.sun.javafx.Utils; +import com.sun.javafx.scene.control.behavior.ScrollPaneBehavior; +import com.sun.javafx.scene.traversal.TraversalEngine; +import com.sun.javafx.scene.traversal.TraverseListener; import javafx.animation.Animation.Status; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; @@ -42,6 +46,7 @@ import javafx.event.EventHandler; import javafx.geometry.BoundingBox; import javafx.geometry.Bounds; +import javafx.geometry.Insets; import javafx.geometry.Orientation; import javafx.scene.Cursor; import javafx.scene.Node; @@ -51,18 +56,12 @@ import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; import javafx.scene.input.TouchEvent; -import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.shape.Rectangle; import javafx.util.Duration; -import com.sun.javafx.Utils; -import com.sun.javafx.application.PlatformImpl; -import com.sun.javafx.scene.control.behavior.ScrollPaneBehavior; -import com.sun.javafx.scene.traversal.TraversalEngine; -import com.sun.javafx.scene.traversal.TraverseListener; -import static com.sun.javafx.Utils.*; -import static com.sun.javafx.scene.control.skin.Utils.*; -import javafx.geometry.Insets; + +import static com.sun.javafx.Utils.clamp; +import static com.sun.javafx.scene.control.skin.Utils.boundedSize; public class ScrollPaneSkin extends BehaviorSkinBase implements TraverseListener { /*************************************************************************** @@ -1079,7 +1078,7 @@ private double updatePosY() { final ScrollPane sp = getSkinnable(); double minY = Math.min((- posY / (vsb.getMax() - vsb.getMin()) * (nodeHeight - contentHeight)), 0); - viewContent.setLayoutY(minY); + viewContent.setLayoutY(snapPosition(minY)); if (!sp.vvalueProperty().isBound()) sp.setVvalue(Utils.clamp(sp.getVmin(), posY, sp.getVmax())); return posY; } --- old/modules/graphics/src/main/java/com/sun/javafx/sg/prism/NGNode.java 2014-02-12 10:40:50.757292500 +0100 +++ new/modules/graphics/src/main/java/com/sun/javafx/sg/prism/NGNode.java 2014-02-12 10:40:50.547280500 +0100 @@ -25,9 +25,6 @@ package com.sun.javafx.sg.prism; -import javafx.scene.CacheHint; -import java.util.ArrayList; -import java.util.List; import com.sun.glass.ui.Screen; import com.sun.javafx.geom.BaseBounds; import com.sun.javafx.geom.BoxBounds; @@ -53,6 +50,11 @@ import com.sun.scenario.effect.impl.prism.PrDrawable; import com.sun.scenario.effect.impl.prism.PrEffectHelper; import com.sun.scenario.effect.impl.prism.PrFilterContext; +import javafx.scene.CacheHint; + +import java.util.ArrayList; +import java.util.List; + import static com.sun.javafx.logging.PulseLogger.PULSE_LOGGER; import static com.sun.javafx.logging.PulseLogger.PULSE_LOGGING_ENABLED; @@ -356,6 +358,9 @@ * @param tx must not be null */ public void setTransformMatrix(BaseTransform tx) { + if (transform.equals(tx)) { + return; + } // If the transform matrix has changed, then we need to update it, // and mark this node as dirty. If this node is cached, we DO NOT // invalidate the cache. The cacheFilter will compare its cached