changeset 1463:7839d55ac4c0 2.2-b18

Automated merge with ssh://jfxsrc.us.oracle.com//javafx/2.2/MASTER/jfx//rt
author Yao Wang <yao.w.wang@oracle.com>
date Tue, 17 Jul 2012 10:02:08 -0700
parents 264470ba524e 43999fd698ad
children 4e47913d1062 15b6051f1219
files javafx-ui-controls/src/javafx/scene/control/MenuItem.java javafx-ui-controls/src/javafx/scene/control/TableColumn.java
diffstat 76 files changed, 1094 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/javafx-concurrent/src/javafx/concurrent/Task.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-concurrent/src/javafx/concurrent/Task.java	Tue Jul 17 10:02:08 2012 -0700
@@ -953,6 +953,7 @@
      *                 done will be -1 (thus, indeterminate).
      * @param max A value from -1 to Double.MAX_VALUE. Any value outside this
      *            range results in an IllegalArgumentException.
+     * @since 2.2
      */
     protected void updateProgress(double workDone, double max) {
         // Perform the argument sanity check that workDone is < max
--- a/javafx-ui-charts/src/javafx/scene/chart/AreaChart.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-charts/src/javafx/scene/chart/AreaChart.java	Tue Jul 17 10:02:08 2012 -0700
@@ -414,6 +414,7 @@
 
     /**
      * This is called whenever a series is added or removed and the legend needs to be updated
+     * @since 2.2
      */
     @Override protected void updateLegend() {
         legend.getItems().clear();
--- a/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/com/sun/javafx/css/parser/CSSParser.java	Tue Jul 17 10:02:08 2012 -0700
@@ -273,6 +273,10 @@
             }
             stylesheet.getRules().addAll(rules);
         }
+
+        // don't retain reference to the styleable
+        setInputSource((Styleable) null);
+
         return stylesheet;
     }
 
--- a/javafx-ui-common/src/com/sun/javafx/image/impl/ByteBgra.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/com/sun/javafx/image/impl/ByteBgra.java	Tue Jul 17 10:02:08 2012 -0700
@@ -196,8 +196,8 @@
         static final ByteToIntPixelConverter    premul = new ToIntArgbSameConv(true);
 
         private ToIntArgbSameConv(boolean isPremult) {
-            super(isPremult ? ByteBgra.getter : ByteBgraPre.getter,
-                  isPremult ?  IntArgb.setter :  IntArgbPre.setter);
+            super(isPremult ? ByteBgraPre.getter : ByteBgra.getter,
+                  isPremult ?  IntArgbPre.setter :  IntArgb.setter);
         }
 
         @Override
--- a/javafx-ui-common/src/com/sun/javafx/image/impl/ByteRgb.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/com/sun/javafx/image/impl/ByteRgb.java	Tue Jul 17 10:02:08 2012 -0700
@@ -102,7 +102,11 @@
             new ToByteBgrfConv(ByteBgraPre.setter);
 
         private ToByteBgrfConv(BytePixelSetter setter) {
-            super(ByteRgb.getter, setter);
+            // Note that using ByteRgb.getter here causes a circular reference
+            // between the classes that prevents the above *premult fields
+            // from being initialized before the ByteRgb class copies their
+            // (not yet inited = null) values into its owns static fields.
+            super(ByteRgb.Getter.instance, setter);
         }
 
         @Override
@@ -154,7 +158,11 @@
             new ToIntFrgbConv(IntArgbPre.setter);
 
         private ToIntFrgbConv(IntPixelSetter setter) {
-            super(ByteRgb.getter, setter);
+            // Note that using ByteRgb.getter here causes a circular reference
+            // between the classes that prevents the above *premult fields
+            // from being initialized before the ByteRgb class copies their
+            // (not yet inited = null) values into its owns static fields.
+            super(ByteRgb.Getter.instance, setter);
         }
 
         @Override
@@ -200,7 +208,11 @@
             new ToByteFrgbConv(ByteArgb.setter);
 
         private ToByteFrgbConv(BytePixelSetter setter) {
-            super(ByteRgb.getter, setter);
+            // Note that using ByteRgb.getter here causes a circular reference
+            // between the classes that prevents the above *premult fields
+            // from being initialized before the ByteRgb class copies their
+            // (not yet inited = null) values into its owns static fields.
+            super(ByteRgb.Getter.instance, setter);
         }
 
         @Override
--- a/javafx-ui-common/src/com/sun/javafx/image/impl/ByteRgba.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/com/sun/javafx/image/impl/ByteRgba.java	Tue Jul 17 10:02:08 2012 -0700
@@ -90,7 +90,7 @@
 
         @Override
         public void setArgb(byte arr[], int offset, int argb) {
-            arr[offset    ] = (byte) (argb >> 24);
+            arr[offset    ] = (byte) (argb >> 16);
             arr[offset + 1] = (byte) (argb >>  8);
             arr[offset + 2] = (byte) (argb      );
             arr[offset + 3] = (byte) (argb >> 24);
--- a/javafx-ui-common/src/javafx/application/Platform.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/application/Platform.java	Tue Jul 17 10:02:08 2012 -0700
@@ -97,6 +97,7 @@
      *
      * @param implicitExit a flag indicating whether or not to implicitly exit
      * when the last window is closed.
+     * @since 2.2
      */
     public static void setImplicitExit(boolean implicitExit) {
         PlatformImpl.setImplicitExit(implicitExit);
@@ -106,6 +107,7 @@
      * Gets the value of the implicitExit attribute.
      *
      * @return the implicitExit attribute
+     * @since 2.2
      */
     public static boolean isImplicitExit() {
         return PlatformImpl.isImplicitExit();
--- a/javafx-ui-common/src/javafx/scene/Node.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/Node.java	Tue Jul 17 10:02:08 2012 -0700
@@ -1658,6 +1658,7 @@
      *     other than the JavaFX Application Thread.
      *
      * @return the rendered image
+     * @since 2.2
      */
     public WritableImage snapshot(SnapshotParameters params, WritableImage image) {
         Toolkit.getToolkit().checkFxUserThread();
@@ -1709,6 +1710,7 @@
      *     other than the JavaFX Application Thread.
      *
      * @throws NullPointerException if the callback parameter is null.
+     * @since 2.2
      */
     public void snapshot(Callback<SnapshotResult, Void> callback,
             SnapshotParameters params, WritableImage image) {
@@ -4214,6 +4216,7 @@
      * An affine transform that holds the computed local-to-parent transform.
      * This is the concatenation of all transforms in this node, including all
      * of the convenience transforms.
+     * @since 2.2
      */
     public final ReadOnlyObjectProperty<Transform> localToParentTransformProperty() {
         return getNodeTransformation().localToParentTransformProperty();
@@ -4241,6 +4244,7 @@
      * property on many nodes may negatively affect performance of
      * transformation changes in their common parents.
      * </p>
+     * @since 2.2
      */
     public final ReadOnlyObjectProperty<Transform> localToSceneTransformProperty() {
         return getNodeTransformation().localToSceneTransformProperty();
@@ -5673,6 +5677,7 @@
 
     /**
      * Defines a function to be called when a scrolling gesture is detected.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super ScrollEvent>>
             onScrollStartedProperty() {
@@ -5709,6 +5714,7 @@
 
     /**
      * Defines a function to be called when a scrolling gesture ends.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super ScrollEvent>>
             onScrollFinishedProperty() {
@@ -5727,6 +5733,7 @@
 
     /**
      * Defines a function to be called when a rotation gesture is detected.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super RotateEvent>>
             onRotationStartedProperty() {
@@ -5745,6 +5752,7 @@
 
     /**
      * Defines a function to be called when user performs a rotation action.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super RotateEvent>>
             onRotateProperty() {
@@ -5763,6 +5771,7 @@
 
     /**
      * Defines a function to be called when a rotation gesture ends.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super RotateEvent>>
             onRotationFinishedProperty() {
@@ -5781,6 +5790,7 @@
 
     /**
      * Defines a function to be called when a zooming gesture is detected.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super ZoomEvent>>
             onZoomStartedProperty() {
@@ -5799,6 +5809,7 @@
 
     /**
      * Defines a function to be called when user performs a zooming action.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super ZoomEvent>>
             onZoomProperty() {
@@ -5817,6 +5828,7 @@
 
     /**
      * Defines a function to be called when a zooming gesture ends.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super ZoomEvent>>
             onZoomFinishedProperty() {
@@ -5836,6 +5848,7 @@
     /**
      * Defines a function to be called when an upward swipe gesture
      * centered over this node happens.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super SwipeEvent>>
             onSwipeUpProperty() {
@@ -5855,6 +5868,7 @@
     /**
      * Defines a function to be called when a downward swipe gesture
      * centered over this node happens.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super SwipeEvent>>
             onSwipeDownProperty() {
@@ -5874,6 +5888,7 @@
     /**
      * Defines a function to be called when a leftward swipe gesture
      * centered over this node happens.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super SwipeEvent>>
             onSwipeLeftProperty() {
@@ -5893,6 +5908,7 @@
     /**
      * Defines a function to be called when an rightward swipe gesture
      * centered over this node happens.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super SwipeEvent>>
             onSwipeRightProperty() {
@@ -5918,6 +5934,7 @@
 
     /**
      * Defines a function to be called when a new touch point is pressed.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super TouchEvent>>
             onTouchPressedProperty() {
@@ -5936,6 +5953,7 @@
 
     /**
      * Defines a function to be called when a touch point is moved.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super TouchEvent>>
             onTouchMovedProperty() {
@@ -5954,6 +5972,7 @@
 
     /**
      * Defines a function to be called when a touch point is released.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super TouchEvent>>
             onTouchReleasedProperty() {
@@ -5973,6 +5992,7 @@
     /**
      * Defines a function to be called when a touch point stays pressed and
      * still.
+     * @since 2.2
      */
     public final ObjectProperty<EventHandler<? super TouchEvent>>
             onTouchStationaryProperty() {
--- a/javafx-ui-common/src/javafx/scene/Scene.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/Scene.java	Tue Jul 17 10:02:08 2012 -0700
@@ -577,16 +577,19 @@
     private ReadOnlyObjectWrapper<Window> windowPropertyImpl() {
         if (window == null) {
             window = new ReadOnlyObjectWrapper<Window>() {
+                private Window oldWindow;
+
                 @Override protected void invalidated() {
-                    if (get() != null) {
+                    final Window newWindow = get();
+                    getKeyHandler().windowForSceneChanged(oldWindow, newWindow);
+                    if (oldWindow != null) {
                         impl_disposePeer();
                     }
-                    Window oldWindow = get();
-                    KeyHandler kh = getKeyHandler();
-                    kh.windowForSceneChanged(oldWindow, get());
-                    if (get() != null) {
+                    if (newWindow != null) {
                         impl_initPeer();
                     }
+
+                    oldWindow = newWindow;
                 }
 
                 @Override
@@ -1232,6 +1235,7 @@
      *     other than the JavaFX Application Thread.
      *
      * @return the rendered image
+     * @since 2.2
      */
     public WritableImage snapshot(WritableImage image) {
         if (!paused) {
@@ -1267,6 +1271,7 @@
      *     other than the JavaFX Application Thread.
      *
      * @throws NullPointerException if the callback parameter is null.
+     * @since 2.2
      */
     public void snapshot(Callback<SnapshotResult, Void> callback, WritableImage image) {
         Toolkit.getToolkit().checkFxUserThread();
@@ -3435,7 +3440,7 @@
             focusOwner.set(value);
         }
 
-        private boolean windowFocused = true;
+        private boolean windowFocused;
         protected boolean isWindowFocused() { return windowFocused; }
         protected void setWindowFocused(boolean value) {
             windowFocused = value;
@@ -3463,10 +3468,6 @@
             }
         };
 
-        public KeyHandler() {
-            windowForSceneChanged(Scene.this.getWindow(), Scene.this.getWindow()); // to init windowFocused properly
-        }
-
         private void process(KeyEvent e) {
             final Node sceneFocusOwner = getFocusOwner();
             final EventTarget eventTarget =
@@ -4246,6 +4247,7 @@
 
     /**
      * Defines a function to be called when a scrolling gesture is detected.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super ScrollEvent>> onScrollStarted;
 
@@ -4318,6 +4320,7 @@
 
     /**
      * Defines a function to be called when a scrolling gesture ends.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super ScrollEvent>> onScrollFinished;
 
@@ -4354,6 +4357,7 @@
 
     /**
      * Defines a function to be called when a rotating gesture is detected.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super RotateEvent>> onRotationStarted;
 
@@ -4390,6 +4394,7 @@
 
     /**
      * Defines a function to be called when user performs a rotating action.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super RotateEvent>> onRotate;
 
@@ -4426,6 +4431,7 @@
 
     /**
      * Defines a function to be called when a rotating gesture ends.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super RotateEvent>> onRotationFinished;
 
@@ -4462,6 +4468,7 @@
 
     /**
      * Defines a function to be called when a zooming gesture is detected.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super ZoomEvent>> onZoomStarted;
 
@@ -4498,6 +4505,7 @@
 
     /**
      * Defines a function to be called when user performs a zooming action.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super ZoomEvent>> onZoom;
 
@@ -4534,6 +4542,7 @@
 
     /**
      * Defines a function to be called when a zooming gesture ends.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super ZoomEvent>> onZoomFinished;
 
@@ -4571,6 +4580,7 @@
     /**
      * Defines a function to be called when an upward swipe gesture
      * happens in this scene.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super SwipeEvent>> onSwipeUp;
 
@@ -4608,6 +4618,7 @@
     /**
      * Defines a function to be called when an downward swipe gesture
      * happens in this scene.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super SwipeEvent>> onSwipeDown;
 
@@ -4645,6 +4656,7 @@
     /**
      * Defines a function to be called when an leftward swipe gesture
      * happens in this scene.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super SwipeEvent>> onSwipeLeft;
 
@@ -4682,6 +4694,7 @@
     /**
      * Defines a function to be called when an rightward swipe gesture
      * happens in this scene.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super SwipeEvent>> onSwipeRight;
 
@@ -4724,6 +4737,7 @@
 
     /**
      * Defines a function to be called when a new touch point is pressed.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super TouchEvent>> onTouchPressed;
 
@@ -4760,6 +4774,7 @@
 
     /**
      * Defines a function to be called when a touch point is moved.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super TouchEvent>> onTouchMoved;
 
@@ -4796,6 +4811,7 @@
 
     /**
      * Defines a function to be called when a new touch point is pressed.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super TouchEvent>> onTouchReleased;
 
@@ -4833,6 +4849,7 @@
     /**
      * Defines a function to be called when a touch point stays pressed and
      * still.
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<? super TouchEvent>> onTouchStationary;
 
--- a/javafx-ui-common/src/javafx/scene/SnapshotParameters.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/SnapshotParameters.java	Tue Jul 17 10:02:08 2012 -0700
@@ -30,6 +30,7 @@
 
 /**
  * Parameters used to specify the rendering attributes for Node snapshot.
+ * @since 2.2
  */
 public class SnapshotParameters {
 
--- a/javafx-ui-common/src/javafx/scene/SnapshotResult.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/SnapshotResult.java	Tue Jul 17 10:02:08 2012 -0700
@@ -28,6 +28,7 @@
 
 /**
  * This class holds the result of a snapshot operation.
+ * @since 2.2
  */
 public class SnapshotResult {
     private WritableImage image;
--- a/javafx-ui-common/src/javafx/scene/canvas/Canvas.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/canvas/Canvas.java	Tue Jul 17 10:02:08 2012 -0700
@@ -68,7 +68,7 @@
  * </pre>
  * </p>
  *
- * @since JavaFX 2.2
+ * @since 2.2
  */
 public class Canvas extends Node {
     private static final int DEFAULT_BUF_SIZE = 1024;
--- a/javafx-ui-common/src/javafx/scene/canvas/GraphicsContext.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/canvas/GraphicsContext.java	Tue Jul 17 10:02:08 2012 -0700
@@ -98,7 +98,7 @@
  * </pre>
  * </p>
  *
- * @since JavaFX 2.2
+ * @since 2.2
  */
 public final class GraphicsContext {
     Canvas theCanvas;
@@ -568,11 +568,13 @@
 
     /**
      * Sets the Global Alpha of the current state.
-     * @param alpha 
+     * @param alpha value in the range {@code 0.0-1.0}. The value is clamped if it is 
+     * out of range.
      */
     public void setGlobalAlpha(double alpha) {
         if (curState.globalAlpha != alpha) {
             curState.globalAlpha = alpha;
+            alpha = (alpha > 1.0) ? 1.0 : (alpha < 0.0) ? 0.0 : alpha;
             writeParam(alpha, PGCanvas.GLOBAL_ALPHA);
         }
     }
--- a/javafx-ui-common/src/javafx/scene/effect/Blend.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Blend.java	Tue Jul 17 10:02:08 2012 -0700
@@ -369,6 +369,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new Blend(this.getMode(), this.getBottomInput(), this.getTopInput());
--- a/javafx-ui-common/src/javafx/scene/effect/Bloom.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Bloom.java	Tue Jul 17 10:02:08 2012 -0700
@@ -199,6 +199,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         Bloom b = new Bloom(this.getThreshold());
--- a/javafx-ui-common/src/javafx/scene/effect/BoxBlur.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/BoxBlur.java	Tue Jul 17 10:02:08 2012 -0700
@@ -333,6 +333,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         BoxBlur bb = new BoxBlur(this.getWidth(), this.getHeight(), this.getIterations());
--- a/javafx-ui-common/src/javafx/scene/effect/ColorAdjust.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/ColorAdjust.java	Tue Jul 17 10:02:08 2012 -0700
@@ -345,6 +345,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         ColorAdjust ca = new ColorAdjust(this.getHue(), this.getSaturation(), 
--- a/javafx-ui-common/src/javafx/scene/effect/ColorInput.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/ColorInput.java	Tue Jul 17 10:02:08 2012 -0700
@@ -344,6 +344,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new ColorInput(this.getX(), this.getY(), this.getWidth(), this.getHeight(), this.getPaint());
--- a/javafx-ui-common/src/javafx/scene/effect/DisplacementMap.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/DisplacementMap.java	Tue Jul 17 10:02:08 2012 -0700
@@ -514,6 +514,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {    
         DisplacementMap dm = new DisplacementMap(this.getMapData().impl_copy(), 
--- a/javafx-ui-common/src/javafx/scene/effect/DropShadow.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/DropShadow.java	Tue Jul 17 10:02:08 2012 -0700
@@ -709,6 +709,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         DropShadow d = new DropShadow(this.getBlurType(), this.getColor(), 
--- a/javafx-ui-common/src/javafx/scene/effect/FloatMap.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/FloatMap.java	Tue Jul 17 10:02:08 2012 -0700
@@ -299,6 +299,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     public FloatMap impl_copy() {
         FloatMap dest = new FloatMap(this.getWidth(), this.getHeight());
         System.arraycopy(buf, 0, dest.buf, 0, buf.length);
--- a/javafx-ui-common/src/javafx/scene/effect/GaussianBlur.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/GaussianBlur.java	Tue Jul 17 10:02:08 2012 -0700
@@ -200,6 +200,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new GaussianBlur(this.getRadius());
--- a/javafx-ui-common/src/javafx/scene/effect/Glow.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Glow.java	Tue Jul 17 10:02:08 2012 -0700
@@ -193,6 +193,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new Glow(this.getLevel());
--- a/javafx-ui-common/src/javafx/scene/effect/ImageInput.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/ImageInput.java	Tue Jul 17 10:02:08 2012 -0700
@@ -253,6 +253,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new ImageInput(this.getSource(), this.getX(), this.getY());
--- a/javafx-ui-common/src/javafx/scene/effect/InnerShadow.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/InnerShadow.java	Tue Jul 17 10:02:08 2012 -0700
@@ -644,6 +644,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         InnerShadow is = new InnerShadow(this.getBlurType(), this.getColor(), 
--- a/javafx-ui-common/src/javafx/scene/effect/Lighting.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Lighting.java	Tue Jul 17 10:02:08 2012 -0700
@@ -137,6 +137,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         Lighting lighting = new Lighting(this.getLight());
--- a/javafx-ui-common/src/javafx/scene/effect/MotionBlur.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/MotionBlur.java	Tue Jul 17 10:02:08 2012 -0700
@@ -264,6 +264,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         MotionBlur mb = new MotionBlur(this.getAngle(), this.getRadius());
--- a/javafx-ui-common/src/javafx/scene/effect/PerspectiveTransform.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/PerspectiveTransform.java	Tue Jul 17 10:02:08 2012 -0700
@@ -543,6 +543,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         return new PerspectiveTransform(this.getUlx(), this.getUly(), 
--- a/javafx-ui-common/src/javafx/scene/effect/Reflection.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Reflection.java	Tue Jul 17 10:02:08 2012 -0700
@@ -372,6 +372,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         Reflection ref = new Reflection(this.getTopOffset(), this.getFraction(), 
--- a/javafx-ui-common/src/javafx/scene/effect/SepiaTone.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/SepiaTone.java	Tue Jul 17 10:02:08 2012 -0700
@@ -193,6 +193,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         SepiaTone st = new SepiaTone(this.getLevel());
--- a/javafx-ui-common/src/javafx/scene/effect/Shadow.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/effect/Shadow.java	Tue Jul 17 10:02:08 2012 -0700
@@ -476,6 +476,7 @@
      * @treatAsPrivate implementation detail
      * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
+    @Deprecated
     @Override
     public Effect impl_copy() {
         Shadow shadow = new Shadow(this.getBlurType(), this.getColor(), this.getRadius());
--- a/javafx-ui-common/src/javafx/scene/image/Image.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/image/Image.java	Tue Jul 17 10:02:08 2012 -0700
@@ -1090,6 +1090,7 @@
      * is not supported for reading and writing pixels to.
      * 
      * @return the {@code PixelReader} for reading the pixel data of the image
+     * @since 2.2
      */
     public final PixelReader getPixelReader() {
         if (!pixelsReadable()) {
--- a/javafx-ui-common/src/javafx/scene/image/PixelFormat.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/image/PixelFormat.java	Tue Jul 17 10:02:08 2012 -0700
@@ -33,6 +33,7 @@
 /**
  * A {@code PixelFormat} object defines the layout of data for a pixel of
  * a given format.
+ * @since 2.2
  */
 public abstract class PixelFormat<T extends Buffer> {
     public enum Type {
--- a/javafx-ui-common/src/javafx/scene/image/WritableImage.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/image/WritableImage.java	Tue Jul 17 10:02:08 2012 -0700
@@ -39,6 +39,7 @@
  * that is constructed from pixels supplied by the application, and possibly
  * from {@code PixelReader} objects from any number of sources, including
  * images read from a file or URL.
+ * @since 2.2
  */
 public class WritableImage extends Image {
 
--- a/javafx-ui-common/src/javafx/scene/image/WritablePixelFormat.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/image/WritablePixelFormat.java	Tue Jul 17 10:02:08 2012 -0700
@@ -33,6 +33,7 @@
  * A {@link PixelFormat} object representing a pixel format that can store
  * full colors and so can be used as a destination format to write pixel
  * data from an arbitrary image.
+ * @since 2.2
  */
 public abstract class WritablePixelFormat<T extends Buffer>
     extends PixelFormat<T>
--- a/javafx-ui-common/src/javafx/scene/input/GestureEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/GestureEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -35,6 +35,7 @@
 /**
  * An event indicating gesture input. Gestures are typically caused by
  * direct (touch screen) or indirect (track pad) touch events.
+ * @since 2.2
  */
 public class GestureEvent extends InputEvent {
 
--- a/javafx-ui-common/src/javafx/scene/input/KeyCode.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/KeyCode.java	Tue Jul 17 10:02:08 2012 -0700
@@ -1206,6 +1206,7 @@
     /**
      * Function keys like F1, F2, etc...
      * @return true if this key code corresponds to a functional key
+     * @since 2.2
      */
     public final boolean isFunctionKey() {
         return (mask & KeyCodeClass.FUNCTION) != 0;
@@ -1215,6 +1216,7 @@
      * Navigation keys are arrow keys and Page Down, Page Up, Home, End
      * (including keypad keys)
      * @return true if this key code corresponds to a navigation key
+     * @since 2.2
      */
     public final boolean isNavigationKey() {
         return (mask & KeyCodeClass.NAVIGATION) != 0;
@@ -1223,6 +1225,7 @@
     /**
      * Left, right, up, down keys (including the keypad arrows)
      * @return true if this key code corresponds to an arrow key
+     * @since 2.2
      */
     public final boolean isArrowKey() {
         return (mask & KeyCodeClass.ARROW) != 0;
@@ -1231,6 +1234,7 @@
     /**
      * Keys that could act as a modifier
      * @return true if this key code corresponds to a modifier key
+     * @since 2.2
      */
     public final boolean isModifierKey() {
         return (mask & KeyCodeClass.MODIFIER) != 0;
@@ -1239,6 +1243,7 @@
     /**
      * All keys with letters
      * @return true if this key code corresponds to a letter key
+     * @since 2.2
      */
     public final boolean isLetterKey() {
         return (mask & KeyCodeClass.LETTER) != 0;
@@ -1247,6 +1252,7 @@
     /**
      * All Digit keys (including the keypad digits)
      * @return true if this key code corresponds to a digit key
+     * @since 2.2
      */
     public final boolean isDigitKey() {
         return (mask & KeyCodeClass.DIGIT) != 0;
@@ -1255,6 +1261,7 @@
     /**
      * All keys on the keypad
      * @return true if this key code corresponds to a keypad key
+     * @since 2.2
      */
     public final boolean isKeypadKey() {
         return (mask & KeyCodeClass.KEYPAD) != 0;
@@ -1263,6 +1270,7 @@
     /**
      * Space, tab and enter
      * @return true if this key code corresponds to a whitespace key
+     * @since 2.2
      */
     public final boolean isWhitespaceKey() {
         return (mask & KeyCodeClass.WHITESPACE) != 0;
@@ -1271,6 +1279,7 @@
     /**
      * All multimedia keys (channel up/down, volume control, etc...)
      * @return true if this key code corresponds to a media key
+     * @since 2.2
      */
     public final boolean isMediaKey() {
         return (mask & KeyCodeClass.MEDIA) != 0;
--- a/javafx-ui-common/src/javafx/scene/input/MouseEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/MouseEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -713,6 +713,7 @@
      * application, this flag can be used to tell apart the usual mouse dragging
      * from the touch screen dragging already handled as scroll events.
      * @return true if this event is synthesized from using a touch screen
+     * @since 2.2
      */
     public boolean isSynthesized() {
         return synthesized;
--- a/javafx-ui-common/src/javafx/scene/input/RotateEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/RotateEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -53,6 +53,8 @@
  * and {@code ROTATION_FINISHED} events. If rotation inertia is active on the
  * given platform, some {@code ROTATE} events with {@code isInertia()} returning
  * {@code true} can come after {@code ROTATION_FINISHED}.
+ *
+ * @since 2.2
  */
 public class RotateEvent extends GestureEvent {
 
--- a/javafx-ui-common/src/javafx/scene/input/ScrollEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/ScrollEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -93,6 +93,8 @@
             break;
     }
  </pre></code>
+ *
+ * @since 2.2
  */
 public class ScrollEvent extends GestureEvent {
 
--- a/javafx-ui-common/src/javafx/scene/input/SwipeEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/SwipeEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -47,6 +47,8 @@
  * is used as gesture coordinates) or indirect (performed
  * indirectly as on track pad - the mouse cursor location is usually used
  * as the gesture coordinates in this case).
+ *
+ * @since 2.2
  */
 public class SwipeEvent extends GestureEvent {
 
--- a/javafx-ui-common/src/javafx/scene/input/TouchEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/TouchEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -53,6 +53,8 @@
  * node on which it was pressed, regardless of where it moves then. It is
  * possible to change this behavior by using a grabbing mechanism described
  * in {@link TouchPoint} documentation.
+ *
+ * @since 2.2
  */
 public final class TouchEvent extends InputEvent {
 
--- a/javafx-ui-common/src/javafx/scene/input/TouchPoint.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/TouchPoint.java	Tue Jul 17 10:02:08 2012 -0700
@@ -47,6 +47,8 @@
  * can be used to alter the event delivery target. When grabbed by a different
  * node, it will next time be targeted to it; when ungrabbed, it will be
  * always targeted to the top-most node on the current location.
+ *
+ * @since 2.2
  */
 public final class TouchPoint {
 
@@ -304,6 +306,8 @@
 
     /**
      * Represents current state of the touch point
+     *
+     * @since 2.2
      */
     public enum State {
         /**
--- a/javafx-ui-common/src/javafx/scene/input/ZoomEvent.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/input/ZoomEvent.java	Tue Jul 17 10:02:08 2012 -0700
@@ -53,6 +53,8 @@
  * and {@code ZOOM_FINISHED} events. If zooming inertia is active on the
  * given platform, some {@code ZOOM} events with {@code isInertia()} returning
  * {@code true} can come after {@code ZOOM_FINISHED}.
+ *
+ * @since 2.2
  */
 public class ZoomEvent extends GestureEvent {
 
--- a/javafx-ui-common/src/javafx/scene/paint/ImagePattern.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/paint/ImagePattern.java	Tue Jul 17 10:02:08 2012 -0700
@@ -124,6 +124,8 @@
 </pre></code>
  * <p>The code above produces the following:</p>
  * <p><img src="doc-files/ImagePattern.png"/></p>
+ *
+ * @since 2.2
  */
 public final class ImagePattern extends Paint {
     
@@ -214,8 +216,16 @@
      * values are used for all other parameters.
      * 
      * @param image the image to be used as the paint.
+     * @throws NullPointerException if the image is null.
+     * @throws IllegalArgumentException if image is not done loading, 
+     * that is if progress is < 1.
      */
     public ImagePattern(Image image) {
+        if (image == null) {
+            throw new NullPointerException("Image must be non-null.");
+        } else if (image.getProgress() < 1.0) {
+            throw new IllegalArgumentException("Image not yet loaded");
+        }
         this.image = image;
     }
 
@@ -229,10 +239,18 @@
      * @param height the height of the anchor rectangle.
      * @param proportional whether the coordinates are proportional
      * to the shape which ImagePattern fills
+     * @throws NullPointerException if the image is null.
+     * @throws IllegalArgumentException if image is not done loading, 
+     * that is if progress is < 1.
      */
     public ImagePattern(Image image, double x, double y, double width,
             double height, boolean proportional) {
 
+        if (image == null) {
+            throw new NullPointerException("Image must be non-null.");
+        } else if (image.getProgress() < 1.0) {
+            throw new IllegalArgumentException("Image not yet loaded");
+        }
         this.image = image;
         this.x = x;
         this.y = y;
--- a/javafx-ui-common/src/javafx/scene/shape/Path.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/shape/Path.java	Tue Jul 17 10:02:08 2012 -0700
@@ -115,8 +115,8 @@
     
     /**
      * Creates new instance of Path
+     * @param elements The collection of the elements of the Path
      * @since 2.2
-     * @param elements The collection of the elements of the Path
      */
     public Path(Collection<? extends PathElement> elements) {
         if (elements != null) {
--- a/javafx-ui-common/src/javafx/scene/transform/Transform.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/scene/transform/Transform.java	Tue Jul 17 10:02:08 2012 -0700
@@ -221,6 +221,8 @@
 
     /**
      * Gets the X coordinate scaling element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMxx() {
         return 1.0;
@@ -228,6 +230,8 @@
 
     /**
      * Gets the XY coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMxy() {
         return 0.0;
@@ -235,6 +239,8 @@
 
     /**
      * Gets the XZ coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMxz() {
         return 0.0;
@@ -242,6 +248,8 @@
 
     /**
      * Gets the X coordinate translation element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getTx() {
         return 0.0;
@@ -249,6 +257,8 @@
 
     /**
      * Gets the YX coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMyx() {
         return 0.0;
@@ -256,6 +266,8 @@
 
     /**
      * Gets the Y coordinate scaling element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMyy() {
         return 1.0;
@@ -263,6 +275,8 @@
 
     /**
      * Gets the YZ coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMyz() {
         return 0.0;
@@ -270,6 +284,8 @@
 
     /**
      * Gets the Y coordinate translation element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getTy() {
         return 0.0;
@@ -277,6 +293,8 @@
 
     /**
      * Gets the ZX coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMzx() {
         return 0.0;
@@ -284,6 +302,8 @@
 
     /**
      * Gets the ZY coordinate element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMzy() {
         return 0.0;
@@ -291,6 +311,8 @@
 
     /**
      * Gets the Z coordinate scaling element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getMzz() {
         return 1.0;
@@ -298,6 +320,8 @@
 
     /**
      * Gets the Z coordinate translation element of the 3x4 matrix.
+     *
+     * @since 2.2
      */
     public  double getTz() {
         return 0.0;
--- a/javafx-ui-common/src/javafx/stage/PopupWindow.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/stage/PopupWindow.java	Tue Jul 17 10:02:08 2012 -0700
@@ -257,6 +257,7 @@
      * consumed. Having the event consumed prevents it from triggering some
      * additional UI response in the Popup's owner window.
      * @defaultValue true
+     * @since 2.2
      */
     private BooleanProperty consumeAutoHidingEvents =
             new SimpleBooleanProperty(this, "consumeAutoHidingEvents",
--- a/javafx-ui-common/src/javafx/stage/Stage.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-common/src/javafx/stage/Stage.java	Tue Jul 17 10:02:08 2012 -0700
@@ -373,6 +373,7 @@
      * @throws IllegalStateException if this method is called on the
      *     primary stage.
      * @throws IllegalStateException if this stage is already showing.
+     * @since 2.2
      */
     public void showAndWait() {
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-ui-common/test/unit/com/sun/javafx/image/ConverterTest.java	Tue Jul 17 10:02:08 2012 -0700
@@ -0,0 +1,860 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.image;
+
+import com.sun.javafx.image.impl.ByteArgb;
+import com.sun.javafx.image.impl.ByteBgra;
+import com.sun.javafx.image.impl.ByteBgraPre;
+import com.sun.javafx.image.impl.ByteGray;
+import com.sun.javafx.image.impl.ByteGrayAlpha;
+import com.sun.javafx.image.impl.ByteGrayAlphaPre;
+import com.sun.javafx.image.impl.ByteRgb;
+import com.sun.javafx.image.impl.ByteRgba;
+import com.sun.javafx.image.impl.IntArgb;
+import com.sun.javafx.image.impl.IntArgbPre;
+import static junit.framework.Assert.*;
+
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import javafx.scene.paint.Color;
+import org.junit.Test;
+
+/**
+ */
+public class ConverterTest {
+    static Color derive(Color c, double opacity) {
+        return new Color(c.getRed(), c.getGreen(), c.getBlue(), c.getOpacity() * opacity);
+    }
+
+    static int RgbToGray(int red, int green, int blue) {
+        return (int) (red * .3 + green * .59 + blue * .11);
+    }
+
+    static int grayify(int argb) {
+        int alpha = (argb >> 24) & 0xff;
+        int red   = (argb >> 16) & 0xff;
+        int green = (argb >>  8) & 0xff;
+        int blue  = (argb      ) & 0xff;
+        int gray  = RgbToGray(red, green, blue);
+        return (alpha << 24) | (gray << 16) | (gray << 8) | gray;
+    }
+
+    static int getArgb(Color c) {
+        int alpha = (int) (c.getOpacity() * 255f);
+        int red   = (int) (c.getRed()     * 255f);
+        int green = (int) (c.getGreen()   * 255f);
+        int blue  = (int) (c.getBlue()    * 255f);
+        return (alpha << 24) | (red << 16) | (green << 8) | blue;
+    }
+
+    static int getArgbPre(Color c) {
+        double a = c.getOpacity();
+        int alpha = (int) (a * 255f);
+        int red   = (int) (a * c.getRed()   * 255f);
+        int green = (int) (a * c.getGreen() * 255f);
+        int blue  = (int) (a * c.getBlue()  * 255f);
+        return (alpha << 24) | (red << 16) | (green << 8) | blue;
+    }
+
+    static class ByteFormat {
+        private final BytePixelGetter getter;
+        private final BytePixelSetter setter;
+        private final int aoff, roff, goff, boff, grayoff;
+        private final int ncomp;
+
+        public ByteFormat(BytePixelGetter getter,
+                          int aoff, int roff, int goff, int boff)
+        {
+            if (getter == null) throw new NullPointerException("getter must not be null");
+
+            this.getter = getter;
+            this.setter = null;
+            this.grayoff = -1;
+            this.aoff = aoff;
+            this.roff = roff;
+            this.goff = goff;
+            this.boff = boff;
+            this.ncomp = (aoff < 0) ? 3 : 4;
+        }
+
+        public ByteFormat(BytePixelGetter getter, BytePixelSetter setter,
+                          int aoff, int roff, int goff, int boff)
+        {
+            if (getter == null) throw new NullPointerException("getter must not be null");
+            if (setter == null) throw new NullPointerException("setter must not be null");
+
+            this.getter = getter;
+            this.setter = setter;
+            this.grayoff = -1;
+            this.aoff = aoff;
+            this.roff = roff;
+            this.goff = goff;
+            this.boff = boff;
+            this.ncomp = (aoff < 0) ? 3 : 4;
+        }
+
+        public ByteFormat(BytePixelGetter getter,
+                          int aoff, int grayoff)
+        {
+            if (getter == null) throw new NullPointerException("getter must not be null");
+
+            this.getter = getter;
+            this.setter = null;
+            this.grayoff = grayoff;
+            this.aoff = aoff;
+            this.roff = -1;
+            this.goff = -1;
+            this.boff = -1;
+            this.ncomp = (aoff < 0) ? 1 : 2;
+        }
+
+        public ByteFormat(BytePixelGetter getter, BytePixelSetter setter,
+                          int aoff, int grayoff)
+        {
+            if (getter == null) throw new NullPointerException("getter must not be null");
+            if (setter == null) throw new NullPointerException("setter must not be null");
+
+            this.getter = getter;
+            this.setter = setter;
+            this.grayoff = grayoff;
+            this.aoff = aoff;
+            this.roff = -1;
+            this.goff = -1;
+            this.boff = -1;
+            this.ncomp = (aoff < 0) ? 1 : 2;
+        }
+
+        public int getNcomp() {
+            return ncomp;
+        }
+
+        public int getArgb(byte barr[], int off) {
+            int alpha = (aoff < 0) ? 255 : (barr[off + aoff] & 0xff);
+            int red, green, blue;
+            if (isGray()) {
+                red = green = blue = barr[off + grayoff] & 0xff;
+            } else {
+                red   = barr[off + roff] & 0xff;
+                green = barr[off + goff] & 0xff;
+                blue  = barr[off + boff] & 0xff;
+            }
+            if (alpha < 255 && alpha > 0 && getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                int halfa = alpha >> 1;
+                red   = (red   >= alpha) ? 255 : (red   * 255 + halfa) / alpha;
+                green = (green >= alpha) ? 255 : (green * 255 + halfa) / alpha;
+                blue  = (blue  >= alpha) ? 255 : (blue  * 255 + halfa) / alpha;
+            }
+            return (alpha << 24) | (red << 16) | (green << 8) | blue;
+        }
+
+        public int getArgb(ByteBuffer bbuf, int off) {
+            int alpha = (aoff < 0) ? 255 : (bbuf.get(off + aoff) & 0xff);
+            int red, green, blue;
+            if (isGray()) {
+                red = green = blue = bbuf.get(off + grayoff) & 0xff;
+            } else {
+                red   = bbuf.get(off + roff) & 0xff;
+                green = bbuf.get(off + goff) & 0xff;
+                blue  = bbuf.get(off + boff) & 0xff;
+            }
+            if (alpha < 255 && alpha > 0 && getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                int halfa = alpha >> 1;
+                red   = (red   >= alpha) ? 255 : (red   * 255 + halfa) / alpha;
+                green = (green >= alpha) ? 255 : (green * 255 + halfa) / alpha;
+                blue  = (blue  >= alpha) ? 255 : (blue  * 255 + halfa) / alpha;
+            }
+            return (alpha << 24) | (red << 16) | (green << 8) | blue;
+        }
+
+        public void setArgb(byte barr[], int off, int argb) {
+            int alpha = (argb >> 24) & 0xff;
+            int red   = (argb >> 16) & 0xff;
+            int green = (argb >>  8) & 0xff;
+            int blue  = (argb      ) & 0xff;
+            if (getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                red   = (red   * alpha + 127) / 255;
+                green = (green * alpha + 127) / 255;
+                blue  = (blue  * alpha + 127) / 255;
+            }
+            if (aoff >= 0) {
+                barr[off + aoff] = (byte) alpha;
+            }
+            if (isGray()) {
+                int gray = RgbToGray(red, green, blue);
+                barr[off + grayoff] = (byte) gray;
+            } else {
+                barr[off + roff] = (byte) red;
+                barr[off + goff] = (byte) green;
+                barr[off + boff] = (byte) blue;
+            }
+        }
+
+        public void setArgb(ByteBuffer bbuf, int off, int argb) {
+            int alpha = (argb >> 24) & 0xff;
+            int red   = (argb >> 16) & 0xff;
+            int green = (argb >>  8) & 0xff;
+            int blue  = (argb      ) & 0xff;
+            if (getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                red   = (red   * alpha + 127) / 255;
+                green = (green * alpha + 127) / 255;
+                blue  = (blue  * alpha + 127) / 255;
+            }
+            if (aoff >= 0) {
+                bbuf.put(off + aoff, (byte) alpha);
+            }
+            if (isGray()) {
+                int gray = RgbToGray(red, green, blue);
+                bbuf.put(off + grayoff, (byte) gray);
+            } else {
+                bbuf.put(off + roff, (byte) red);
+                bbuf.put(off + goff, (byte) green);
+                bbuf.put(off + boff, (byte) blue);
+            }
+        }
+
+        public BytePixelGetter getGetter() {
+            return getter;
+        }
+
+        public BytePixelSetter getSetter() {
+            return setter;
+        }
+
+        public boolean isGray() {
+            return grayoff >= 0;
+        }
+
+        public int getGrayOff() {
+            return grayoff;
+        }
+
+        public int getAoff() {
+            return aoff;
+        }
+
+        public int getRoff() {
+            return roff;
+        }
+
+        public int getGoff() {
+            return goff;
+        }
+
+        public int getBoff() {
+            return boff;
+        }
+
+        @Override
+        public String toString() {
+            if (getter == null) {
+                return "ByteFormat{" + "setter=" + setter + '}';
+            } else if (setter == null) {
+                return "ByteFormat{" + "getter=" + getter + '}';
+            } else if (getter == setter) {
+                return "ByteFormat{" + "accessor=" + getter + '}';
+            } else {
+                return "ByteFormat{" + "getter=" + getter + ", setter=" + setter + '}';
+            }
+        }
+    }
+
+    static class IntFormat {
+        private final IntPixelGetter getter;
+        private final IntPixelSetter setter;
+        private final int ashift, rshift, gshift, bshift;
+
+        public IntFormat(IntPixelGetter getter, IntPixelSetter setter,
+                         int ashift, int rshift, int gshift, int bshift)
+        {
+            if (getter == null) throw new NullPointerException("getter must not be null");
+            if (setter == null) throw new NullPointerException("setter must not be null");
+
+            this.getter = getter;
+            this.setter = setter;
+            this.ashift = ashift;
+            this.rshift = rshift;
+            this.gshift = gshift;
+            this.bshift = bshift;
+        }
+
+        private int convertPixel(int pixel) {
+            int alpha = (pixel >> ashift) & 0xff;
+            int red   = (pixel >> rshift) & 0xff;
+            int green = (pixel >> gshift) & 0xff;
+            int blue  = (pixel >> bshift) & 0xff;
+            if (alpha < 255 && getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                int halfa = alpha >> 1;
+                red   = (red   >= alpha) ? 255 : (red   * 255 + halfa) / alpha;
+                green = (green >= alpha) ? 255 : (green * 255 + halfa) / alpha;
+                blue  = (blue  >= alpha) ? 255 : (blue  * 255 + halfa) / alpha;
+            }
+            return (alpha << 24) | (red << 16) | (green << 8) | blue;
+        }
+
+        private int convertArgb(int argb) {
+            int alpha = (argb >> 24) & 0xff;
+            int red   = (argb >> 16) & 0xff;
+            int green = (argb >>  8) & 0xff;
+            int blue  = (argb      ) & 0xff;
+            if (alpha < 255 && getter.getAlphaType() == AlphaType.PREMULTIPLIED) {
+                red   = (red   * alpha + 127) / 255;
+                green = (green * alpha + 127) / 255;
+                blue  = (blue  * alpha + 127) / 255;
+            }
+            return (alpha << ashift) | (red << rshift) | (green << gshift) | (blue << bshift);
+        }
+
+        public int getArgb(int iarr[], int off) {
+            return convertPixel(iarr[off]);
+        }
+
+        public int getArgb(IntBuffer ibuf, int off) {
+            return convertPixel(ibuf.get(off));
+        }
+
+        public void setArgb(int iarr[], int off, int argb) {
+            iarr[off] = convertArgb(argb);
+        }
+
+        public void setArgb(IntBuffer ibuf, int off, int argb) {
+            ibuf.put(off, convertArgb(argb));
+        }
+
+        public IntPixelGetter getGetter() {
+            return getter;
+        }
+
+        public IntPixelSetter getSetter() {
+            return setter;
+        }
+
+        public int getAshift() {
+            return ashift;
+        }
+
+        public int getRshift() {
+            return rshift;
+        }
+
+        public int getGshift() {
+            return gshift;
+        }
+
+        public int getBshift() {
+            return bshift;
+        }
+
+        @Override
+        public String toString() {
+            if (getter == null) {
+                return "IntFormat{" + "setter=" + setter + '}';
+            } else if (setter == null) {
+                return "IntFormat{" + "getter=" + getter + '}';
+            } else if (getter == setter) {
+                return "IntFormat{" + "accessor=" + getter + '}';
+            } else {
+                return "IntFormat{" + "getter=" + getter + ", setter=" + setter + '}';
+            }
+        }
+    }
+
+    
+    static ByteFormat ByteFormats[] = {
+        new ByteFormat(ByteArgb.getter,    ByteArgb.setter,     0, 1, 2, 3),
+        new ByteFormat(ByteBgra.getter,    ByteBgra.setter,     3, 2, 1, 0),
+        new ByteFormat(ByteBgraPre.getter, ByteBgraPre.setter,  3, 2, 1, 0),
+        new ByteFormat(ByteRgba.getter,    ByteRgba.setter,     3, 0, 1, 2),
+        new ByteFormat(ByteRgb.getter,                         -1, 0, 1, 2),
+
+        new ByteFormat(ByteGray.getter,                                 -1, 0),
+        new ByteFormat(ByteGrayAlpha.getter,    ByteGrayAlpha.setter,    1, 0),
+        new ByteFormat(ByteGrayAlphaPre.getter, ByteGrayAlphaPre.setter, 1, 0),
+    };
+
+    static IntFormat IntFormats[] = {
+        new IntFormat(IntArgb.getter,    IntArgb.setter,    24, 16, 8, 0),
+        new IntFormat(IntArgbPre.getter, IntArgbPre.setter, 24, 16, 8, 0),
+    };
+
+    static Color TestColors[] = {
+        Color.WHITE,
+        Color.BLACK,
+        Color.RED,
+        Color.GREEN,
+        Color.BLUE,
+        Color.TRANSPARENT,
+        derive(Color.WHITE, 0.5),
+        derive(Color.BLACK, 0.5),
+        derive(Color.RED, 0.5),
+        derive(Color.GREEN, 0.5),
+        derive(Color.BLUE, 0.5),
+    };
+
+    static Color OpaqueTestColors[] = {
+        Color.WHITE,
+        Color.BLACK,
+        Color.RED,
+        Color.GREEN,
+        Color.BLUE,
+        Color.CYAN,
+        Color.MAGENTA,
+        Color.YELLOW,
+    };
+
+    static void checkArgb(int argb1, int argb2, double delta) {
+        assertEquals("alpha", (argb1 >> 24) & 0xff, (argb2 >> 24) & 0xff);
+        assertEquals("red",   (argb1 >> 16) & 0xff, (argb2 >> 16) & 0xff, delta);
+        assertEquals("green", (argb1 >>  8) & 0xff, (argb2 >>  8) & 0xff, delta);
+        assertEquals("blue",  (argb1      ) & 0xff, (argb2      ) & 0xff, delta);
+    }
+
+    void testget(ByteFormat bfmt, ByteBuffer bbuf, byte barr[], Color c) {
+        int refnon = getArgb(c);
+        int refpre = getArgbPre(c);
+        bfmt.setArgb(bbuf, 0, refnon);
+        bfmt.setArgb(barr, 0, refnon);
+        BytePixelGetter bpg = bfmt.getGetter();
+        boolean premult = (bpg.getAlphaType() == AlphaType.PREMULTIPLIED);
+        double delta = 0.0;
+        if (bfmt.isGray()) {
+            refnon = grayify(refnon);
+            refpre = grayify(refpre);
+            delta += 1.0;
+        }
+        checkArgb(refnon, bpg.getArgb   (bbuf, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refpre, bpg.getArgbPre(bbuf, 0), delta + (premult ? 0.0 : 1.0));
+        checkArgb(refnon, bpg.getArgb   (barr, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refpre, bpg.getArgbPre(barr, 0), delta + (premult ? 0.0 : 1.0));
+    }
+
+    void testget(IntFormat ifmt, IntBuffer ibuf, int iarr[], Color c) {
+        int refnon = getArgb(c);
+        int refpre = getArgbPre(c);
+        ifmt.setArgb(ibuf, 0, refnon);
+        ifmt.setArgb(iarr, 0, refnon);
+        IntPixelGetter bpg = ifmt.getGetter();
+        boolean premult = (bpg.getAlphaType() == AlphaType.PREMULTIPLIED);
+        checkArgb(refnon, bpg.getArgb   (ibuf, 0), premult ? 1.0 : 0.0);
+        checkArgb(refpre, bpg.getArgbPre(ibuf, 0), premult ? 0.0 : 1.0);
+        checkArgb(refnon, bpg.getArgb   (iarr, 0), premult ? 1.0 : 0.0);
+        checkArgb(refpre, bpg.getArgbPre(iarr, 0), premult ? 0.0 : 1.0);
+    }
+
+    void testset(ByteFormat bfmt, ByteBuffer bbuf, byte barr[], Color c) {
+        int refnon = getArgb(c);
+        int refpre = getArgbPre(c);
+        BytePixelSetter bps = bfmt.getSetter();
+        bps.setArgb   (bbuf, 0, refnon);
+        bps.setArgbPre(bbuf, 4, refpre);
+        bps.setArgb   (barr, 0, refnon);
+        bps.setArgbPre(barr, 4, refpre);
+        boolean premult = (bps.getAlphaType() == AlphaType.PREMULTIPLIED);
+        double delta = 0.0;
+        if (bfmt.isGray()) {
+            refnon = grayify(refnon);
+            delta += 1.0;
+        }
+        checkArgb(refnon, bfmt.getArgb(bbuf, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refnon, bfmt.getArgb(bbuf, 4), delta + (premult ? 1.0 : 1.0));
+        checkArgb(refnon, bfmt.getArgb(barr, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refnon, bfmt.getArgb(barr, 4), delta + (premult ? 1.0 : 1.0));
+    }
+
+    void testset(IntFormat ifmt, IntBuffer ibuf, int iarr[], Color c) {
+        int refnon = getArgb(c);
+        int refpre = getArgbPre(c);
+        IntPixelSetter ips = ifmt.getSetter();
+        ips.setArgb   (ibuf, 0, refnon);
+        ips.setArgbPre(ibuf, 1, refpre);
+        ips.setArgb   (iarr, 0, refnon);
+        ips.setArgbPre(iarr, 1, refpre);
+        boolean premult = (ips.getAlphaType() == AlphaType.PREMULTIPLIED);
+        double delta = 0.0;
+        checkArgb(refnon, ifmt.getArgb(ibuf, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refnon, ifmt.getArgb(ibuf, 1), delta + (premult ? 1.0 : 1.0));
+        checkArgb(refnon, ifmt.getArgb(iarr, 0), delta + (premult ? 1.0 : 0.0));
+        checkArgb(refnon, ifmt.getArgb(iarr, 1), delta + (premult ? 1.0 : 1.0));
+    }
+
+    @Test
+    public void testByteAccessors() {
+        ByteBuffer bbuf = ByteBuffer.allocate(8);
+        byte barr[] = new byte[8];
+        for (ByteFormat bfmt : ByteFormats) {
+            BytePixelGetter getter = bfmt.getGetter();
+            BytePixelSetter setter = bfmt.getSetter();
+            if (getter != null && setter != null) {
+                assertEquals(getter.getAlphaType(), setter.getAlphaType());
+            }
+            Color testColors[] = (getter.getAlphaType() == AlphaType.OPAQUE
+                                  ? OpaqueTestColors : TestColors);
+            for (Color c : testColors) {
+                if (getter != null) {
+                    testget(bfmt, bbuf, barr, c);
+                }
+                if (setter != null) {
+                    testset(bfmt, bbuf, barr, c);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testIntAccessors() {
+        IntBuffer ibuf = IntBuffer.allocate(2);
+        int iarr[] = new int[2];
+        for (IntFormat ifmt : IntFormats) {
+            IntPixelGetter getter = ifmt.getGetter();
+            IntPixelSetter setter = ifmt.getSetter();
+            if (getter != null && setter != null) {
+                assertEquals(getter.getAlphaType(), setter.getAlphaType());
+            }
+            Color testColors[] = (getter.getAlphaType() == AlphaType.OPAQUE
+                                  ? OpaqueTestColors : TestColors);
+            for (Color c : testColors) {
+                if (getter != null) {
+                    testget(ifmt, ibuf, iarr, c);
+                }
+                if (setter != null) {
+                    testset(ifmt, ibuf, iarr, c);
+                }
+            }
+        }
+    }
+
+    static boolean isGeneral(PixelConverter pc) {
+        Class enclosing = pc.getClass().getEnclosingClass();
+        return (enclosing != null &&
+                enclosing.getName().equals("com.sun.javafx.image.impl.General"));
+    }
+
+    static void clear(ByteBuffer hbuf, ByteBuffer dbuf, byte arr[]) {
+        assertEquals(hbuf.capacity(), dbuf.capacity());
+        assertEquals(hbuf.capacity(), arr.length);
+        byte bv = (byte) (Math.random() * 255);
+        for (int i = 0; i < arr.length; i++) {
+            hbuf.put(i, (byte) bv);
+            dbuf.put(i, (byte) bv);
+            arr[i] = bv;
+        }
+    }
+
+    static void clear(IntBuffer hbuf, IntBuffer dbuf, int arr[]) {
+        assertEquals(hbuf.capacity(), dbuf.capacity());
+        assertEquals(hbuf.capacity(), arr.length);
+        int iv = (int) (Math.random() * 0xffffffff);
+        for (int i = 0; i < arr.length; i++) {
+            hbuf.put(i, iv);
+            dbuf.put(i, iv);
+            arr[i] = iv;
+        }
+    }
+
+    @Test
+    public void testB2BConverterTypes() {
+        ByteBuffer srchbuf = ByteBuffer.allocate(4 * TestColors.length);
+        ByteBuffer srcdbuf = ByteBuffer.allocateDirect(4 * TestColors.length);
+        byte srcarr[] = new byte[4 * TestColors.length];
+        ByteBuffer dsthbuf = ByteBuffer.allocate(4 * TestColors.length);
+        ByteBuffer dstdbuf = ByteBuffer.allocateDirect(4 * TestColors.length);
+        byte dstarr[] = new byte[4 * TestColors.length];
+        for (ByteFormat bfmtgetter : ByteFormats) {
+            BytePixelGetter bpg = bfmtgetter.getGetter();
+            for (ByteFormat bfmtsetter : ByteFormats) {
+                BytePixelSetter bps = bfmtsetter.getSetter();
+                if (bps == null) continue;
+                ByteToBytePixelConverter b2bpc =
+                    PixelUtils.getB2BConverter(bpg, bps);
+                if (!isGeneral(b2bpc)) {
+                    PixelConverter pc = PixelUtils.getConverter(bpg, bps);
+                    assertEquals(b2bpc, pc);
+                }
+                assertEquals(b2bpc.getGetter(), bpg);
+                assertEquals(b2bpc.getSetter(), bps);
+                Color testColors[] = ((bpg.getAlphaType() == AlphaType.OPAQUE ||
+                                       bps.getAlphaType() == AlphaType.OPAQUE)
+                                      ? OpaqueTestColors : TestColors);
+                int srcncomp = bfmtgetter.getNcomp();
+                for (int i = 0; i < testColors.length; i++) {
+                    bfmtgetter.setArgb(srchbuf, i * srcncomp, getArgb(testColors[i]));
+                    bfmtgetter.setArgb(srcdbuf, i * srcncomp, getArgb(testColors[i]));
+                    bfmtgetter.setArgb(srcarr,  i * srcncomp, getArgb(testColors[i]));
+                }
+                int dstncomp = bfmtsetter.getNcomp();
+                double delta = 0.0;
+                if (bpg.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                if (bps.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                boolean isgray = bfmtgetter.isGray() || bfmtsetter.isGray();
+                if (isgray) {
+                    delta += 1.0;
+                }
+                b2bpc.convert(srchbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srchbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srchbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                b2bpc.convert(srcdbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srcdbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srcdbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                b2bpc.convert(srcarr, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srcarr, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2bpc.convert(srcarr, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testB2IConverterTypes() {
+        ByteBuffer srchbuf = ByteBuffer.allocate(4 * TestColors.length);
+        ByteBuffer srcdbuf = ByteBuffer.allocateDirect(4 * TestColors.length);
+        byte srcarr[] = new byte[4 * TestColors.length];
+        IntBuffer dsthbuf = IntBuffer.allocate(TestColors.length);
+        IntBuffer dstdbuf = IntBuffer.allocate(TestColors.length);
+        int dstarr[] = new int[TestColors.length];
+        for (ByteFormat bfmtgetter : ByteFormats) {
+            BytePixelGetter bpg = bfmtgetter.getGetter();
+            for (IntFormat ifmtsetter : IntFormats) {
+                IntPixelSetter ips = ifmtsetter.getSetter();
+                if (ips == null) continue;
+                ByteToIntPixelConverter b2ipc =
+                    PixelUtils.getB2IConverter(bpg, ips);
+                if (!isGeneral(b2ipc)) {
+                    PixelConverter pc = PixelUtils.getConverter(bpg, ips);
+                    assertEquals(b2ipc, pc);
+                }
+                assertEquals(b2ipc.getGetter(), bpg);
+                assertEquals(b2ipc.getSetter(), ips);
+                Color testColors[] = ((bpg.getAlphaType() == AlphaType.OPAQUE ||
+                                       ips.getAlphaType() == AlphaType.OPAQUE)
+                                      ? OpaqueTestColors : TestColors);
+                int srcncomp = bfmtgetter.getNcomp();
+                for (int i = 0; i < testColors.length; i++) {
+                    bfmtgetter.setArgb(srchbuf, i * srcncomp, getArgb(testColors[i]));
+                    bfmtgetter.setArgb(srcdbuf, i * srcncomp, getArgb(testColors[i]));
+                    bfmtgetter.setArgb(srcarr,  i * srcncomp, getArgb(testColors[i]));
+                }
+                double delta = 0.0;
+                if (bpg.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                if (ips.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                boolean isgray = bfmtgetter.isGray();
+                if (isgray) {
+                    delta += 1.0;
+                }
+                b2ipc.convert(srchbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srchbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srchbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                b2ipc.convert(srcdbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srcdbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srcdbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                b2ipc.convert(srcarr, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srcarr, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                b2ipc.convert(srcarr, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testI2BConverterTypes() {
+        IntBuffer srchbuf = IntBuffer.allocate(TestColors.length);
+        IntBuffer srcdbuf = IntBuffer.allocate(TestColors.length);
+        int srcarr[] = new int[TestColors.length];
+        ByteBuffer dsthbuf = ByteBuffer.allocate(4 * TestColors.length);
+        ByteBuffer dstdbuf = ByteBuffer.allocateDirect(4 * TestColors.length);
+        byte dstarr[] = new byte[4 * TestColors.length];
+        for (IntFormat ifmtgetter : IntFormats) {
+            IntPixelGetter ipg = ifmtgetter.getGetter();
+            for (ByteFormat bfmtsetter : ByteFormats) {
+                BytePixelSetter bps = bfmtsetter.getSetter();
+                if (bps == null) continue;
+                IntToBytePixelConverter i2bpc =
+                    PixelUtils.getI2BConverter(ipg, bps);
+                if (!isGeneral(i2bpc)) {
+                    PixelConverter pc = PixelUtils.getConverter(ipg, bps);
+                    assertEquals(i2bpc, pc);
+                }
+                assertEquals(i2bpc.getGetter(), ipg);
+                assertEquals(i2bpc.getSetter(), bps);
+                Color testColors[] = ((ipg.getAlphaType() == AlphaType.OPAQUE ||
+                                       bps.getAlphaType() == AlphaType.OPAQUE)
+                                      ? OpaqueTestColors : TestColors);
+                for (int i = 0; i < testColors.length; i++) {
+                    ifmtgetter.setArgb(srchbuf, i, getArgb(testColors[i]));
+                    ifmtgetter.setArgb(srcdbuf, i, getArgb(testColors[i]));
+                    ifmtgetter.setArgb(srcarr,  i, getArgb(testColors[i]));
+                }
+                int dstncomp = bfmtsetter.getNcomp();
+                double delta = 0.0;
+                if (ipg.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                if (bps.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                boolean isgray = bfmtsetter.isGray();
+                if (isgray) {
+                    delta += 1.0;
+                }
+                i2bpc.convert(srchbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srchbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srchbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                i2bpc.convert(srcdbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srcdbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srcdbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                i2bpc.convert(srcarr, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srcarr, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2bpc.convert(srcarr, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    if (isgray) refargb = grayify(refargb);
+                    checkArgb(refargb, bfmtsetter.getArgb(dsthbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstdbuf, i * dstncomp), delta);
+                    checkArgb(refargb, bfmtsetter.getArgb(dstarr,  i * dstncomp), delta);
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testI2IConverterTypes() {
+        IntBuffer srchbuf = IntBuffer.allocate(TestColors.length);
+        IntBuffer srcdbuf = IntBuffer.allocate(TestColors.length);
+        int srcarr[] = new int[TestColors.length];
+        IntBuffer dsthbuf = IntBuffer.allocate(TestColors.length);
+        IntBuffer dstdbuf = IntBuffer.allocate(TestColors.length);
+        int dstarr[] = new int[TestColors.length];
+        for (IntFormat ifmtgetter : IntFormats) {
+            IntPixelGetter ipg = ifmtgetter.getGetter();
+            for (IntFormat ifmtsetter : IntFormats) {
+                IntPixelSetter ips = ifmtsetter.getSetter();
+                if (ips == null) continue;
+                IntToIntPixelConverter i2ipc =
+                    PixelUtils.getI2IConverter(ipg, ips);
+                if (!isGeneral(i2ipc)) {
+                    PixelConverter pc = PixelUtils.getConverter(ipg, ips);
+                    assertEquals(i2ipc, pc);
+                }
+                assertEquals(i2ipc.getGetter(), ipg);
+                assertEquals(i2ipc.getSetter(), ips);
+                Color testColors[] = ((ipg.getAlphaType() == AlphaType.OPAQUE ||
+                                       ips.getAlphaType() == AlphaType.OPAQUE)
+                                      ? OpaqueTestColors : TestColors);
+                for (int i = 0; i < testColors.length; i++) {
+                    ifmtgetter.setArgb(srchbuf, i, getArgb(testColors[i]));
+                    ifmtgetter.setArgb(srcdbuf, i, getArgb(testColors[i]));
+                    ifmtgetter.setArgb(srcarr,  i, getArgb(testColors[i]));
+                }
+                double delta = 0.0;
+                if (ipg.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                if (ips.getAlphaType() == AlphaType.PREMULTIPLIED) delta += 1.0;
+                i2ipc.convert(srchbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srchbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srchbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                i2ipc.convert(srcdbuf, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srcdbuf, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srcdbuf, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+                clear(dsthbuf, dstdbuf, dstarr);
+                i2ipc.convert(srcarr, 0, 0, dsthbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srcarr, 0, 0, dstdbuf, 0, 0, testColors.length, 1);
+                i2ipc.convert(srcarr, 0, 0, dstarr,  0, 0, testColors.length, 1);
+                for (int i = 0; i < testColors.length; i++) {
+                    int refargb = getArgb(testColors[i]);
+                    checkArgb(refargb, ifmtsetter.getArgb(dsthbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstdbuf, i), delta);
+                    checkArgb(refargb, ifmtsetter.getArgb(dstarr,  i), delta);
+                }
+            }
+        }
+    }
+}
--- a/javafx-ui-controls/src/javafx/scene/control/CheckBoxTreeItem.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/CheckBoxTreeItem.java	Tue Jul 17 10:02:08 2012 -0700
@@ -79,6 +79,7 @@
  * @see CheckBoxTreeCell
  * @see TreeItem
  * @see CheckBox
+ * @since 2.2
  */
 // TODO the TreeModificationEvent doesn't actually bubble in the same way as
 // TreeItem - it just looks that way as the 'bubbling' is done via changing the
--- a/javafx-ui-controls/src/javafx/scene/control/ColorPicker.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/ColorPicker.java	Tue Jul 17 10:02:08 2012 -0700
@@ -73,7 +73,7 @@
  * <pre><code>
  * colorPicker.getStyleClass().add("split-button");
  * </pre><code>
- * 
+ * @since 2.2
  */
 public class ColorPicker extends ComboBoxBase<Color> {
 
--- a/javafx-ui-controls/src/javafx/scene/control/ComboBox.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/ComboBox.java	Tue Jul 17 10:02:08 2012 -0700
@@ -309,6 +309,7 @@
      * area. If a cell is set here, it does not change the rendering of the
      * ComboBox popup list - that rendering is controlled via the 
      * {@link #cellFactoryProperty() cell factory} API.
+     * @since 2.2
      */
     public ObjectProperty<ListCell<T>> buttonCellProperty() { return buttonCell; }
     private ObjectProperty<ListCell<T>> buttonCell = 
@@ -358,6 +359,7 @@
     /**
      * The editor for the ComboBox. The editor is null if the ComboBox is not
      * {@link #editableProperty() editable}.
+     * @since 2.2
      */
     private ReadOnlyObjectWrapper<TextField> editor;
     public final TextField getEditor() { 
--- a/javafx-ui-controls/src/javafx/scene/control/ComboBoxBase.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/ComboBoxBase.java	Tue Jul 17 10:02:08 2012 -0700
@@ -281,6 +281,7 @@
     public final ObjectProperty<EventHandler<Event>> onShowingProperty() { return onShowing; }
     /**
      * Called just prior to the {@code ComboBoxBase} popup/display being shown, 
+     * @since 2.2
      */
     public final void setOnShowing(EventHandler<Event> value) { onShowingProperty().set(value); }
     public final EventHandler<Event> getOnShowing() { return onShowingProperty().get(); }
@@ -303,6 +304,7 @@
     public final ObjectProperty<EventHandler<Event>> onShownProperty() { return onShown; }
     /**
      * Called just after the {@link ComboBoxBase} popup/display is shown.
+     * @since 2.2
      */
     public final void setOnShown(EventHandler<Event> value) { onShownProperty().set(value); }
     public final EventHandler<Event> getOnShown() { return onShownProperty().get(); }
@@ -325,6 +327,7 @@
     public final ObjectProperty<EventHandler<Event>> onHidingProperty() { return onHiding; }
     /**
      * Called just prior to the {@link ComboBox} popup/display being hidden.
+     * @since 2.2
      */
     public final void setOnHiding(EventHandler<Event> value) { onHidingProperty().set(value); }
     public final EventHandler<Event> getOnHiding() { return onHidingProperty().get(); }
@@ -347,6 +350,7 @@
     public final ObjectProperty<EventHandler<Event>> onHiddenProperty() { return onHidden; }
     /**
      * Called just after the {@link ComboBoxBase} popup/display has been hidden.
+     * @since 2.2
      */
     public final void setOnHidden(EventHandler<Event> value) { onHiddenProperty().set(value); }
     public final EventHandler<Event> getOnHidden() { return onHiddenProperty().get(); }
--- a/javafx-ui-controls/src/javafx/scene/control/Labeled.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/Labeled.java	Tue Jul 17 10:02:08 2012 -0700
@@ -240,6 +240,7 @@
      * <p>Note that not all fonts support all Unicode characters.
      *
      * @see <a href="http://en.wikipedia.org/wiki/Ellipsis#Computer_representations">Wikipedia:ellipsis</a>
+     * @since 2.2
      */
     public final StringProperty ellipsisStringProperty() {
         if (ellipsisString == null) {
--- a/javafx-ui-controls/src/javafx/scene/control/Menu.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/Menu.java	Tue Jul 17 10:02:08 2012 -0700
@@ -123,6 +123,7 @@
 
     /**
      * Constructs a Menu with an empty string for its display text.
+     * @since 2.2
      */
     public Menu() {
         this("");
--- a/javafx-ui-controls/src/javafx/scene/control/MenuItem.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/MenuItem.java	Tue Jul 17 10:02:08 2012 -0700
@@ -336,6 +336,7 @@
      * The event handler that is associated with invocation of an accelerator for a MenuItem. This 
      * can happen when a key sequence for an accelerator is pressed. The event handler is also  
      * invoked when onShowing event handler is called. 
+     * @since 2.2
      */
     private ObjectProperty<EventHandler<Event>> onMenuValidation;
     
--- a/javafx-ui-controls/src/javafx/scene/control/Pagination.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/Pagination.java	Tue Jul 17 10:02:08 2012 -0700
@@ -109,8 +109,8 @@
  *       }
  *   });
  * }</pre>
+ * @since 2.2
  */
-
 @DefaultProperty("pages")
 public class Pagination extends Control {
 
--- a/javafx-ui-controls/src/javafx/scene/control/Tab.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/Tab.java	Tue Jul 17 10:02:08 2012 -0700
@@ -501,6 +501,7 @@
      * @param value the state to set this tab
      * 
      * @defaultValue false
+     * @since 2.2
      */
     public final void setDisable(boolean value) { 
         disableProperty().set(value);
@@ -508,7 +509,8 @@
 
     /**
      * Returns {@code true} if this tab is disable.
-     */    
+     * @since 2.2
+     */
     public final boolean isDisable() { return disable == null ? false : disable.get(); }
 
     /**
@@ -517,7 +519,8 @@
      * can be selected using {@link TabPane#getSelectionModel()}.
      * 
      * @defaultValue false
-     */    
+     * @since 2.2
+     */
     public final BooleanProperty disableProperty() {
         if (disable == null) {
             disable = new BooleanPropertyBase(false) {
@@ -549,7 +552,7 @@
     /**
      * Returns true when the {@code Tab} {@link #disableProperty disable} is set to
      * {@code true} or if the {@code TabPane} is disabled.
-     * 
+     * @since 2.2
      */
     public final boolean isDisabled() {
         return disabled == null ? false : disabled.get();
@@ -561,7 +564,8 @@
      * itself or if the {@code TabPane} is disabled.
      * 
      * @defaultValue false
-     */    
+     * @since 2.2
+     */
     public final ReadOnlyBooleanProperty disabledProperty() {
         return disabledPropertyImpl().getReadOnlyProperty();
     }
@@ -599,7 +603,8 @@
       *
       * @return an observable map of properties on this Tab for use primarily
       * by application developers
-      */
+     * @since 2.2
+     */
      public final ObservableMap<Object, Object> getProperties() {
         if (properties == null) {
             properties = FXCollections.observableMap(new HashMap<Object, Object>());
@@ -610,6 +615,7 @@
     /**
      * Tests if this Tab has properties.
      * @return true if this tab has properties.
+     * @since 2.2
      */
      public boolean hasProperties() {
         return properties != null;
@@ -625,6 +631,7 @@
      *
      * @param value The value to be stored - this can later be retrieved by calling
      *          {@link Tab#getUserData()}.
+     * @since 2.2
      */
     public void setUserData(Object value) {
         getProperties().put(USER_DATA_KEY, value);
@@ -636,6 +643,7 @@
      *
      * @return The Object that was previously set, or null if no property
      *          has been set or if null was set.
+     * @since 2.2
      */
     public Object getUserData() {
         return getProperties().get(USER_DATA_KEY);
--- a/javafx-ui-controls/src/javafx/scene/control/TableColumn.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/TableColumn.java	Tue Jul 17 10:02:08 2012 -0700
@@ -590,6 +590,7 @@
      * Sets the id of this TableColumn. This simple string identifier is useful 
      * for finding a specific TableColumn within the {@code TableView}. The 
      * default value is {@code null}.
+     * @since 2.2
      */
     public final void setId(String value) { idProperty().set(value); }
 
@@ -597,11 +598,13 @@
      * The id of this TableColumn.
      *
      * @return The id of the TableColumn.
+     * @since 2.2
      */
     public final String getId() { return id == null ? null : id.get(); }
 
     /**
      * The id of this TableColumn.
+     * @since 2.2
      */
     public final StringProperty idProperty() {
         if (id == null) {
@@ -621,7 +624,7 @@
      * <p>
      * Parsing this style might not be supported on some limited
      * platforms. It is recommended to use a standalone CSS file instead.
-     *     
+     * @since 2.2
      */
     public final void setStyle(String value) { styleProperty().set(value); }
 
@@ -629,11 +632,13 @@
      * The CSS style string associated to this TableColumn.
      *
      * @return The CSS style string associated to this TableColumn.
+     * @since 2.2
      */
     public final String getStyle() { return style == null ? null : style.get(); }
 
     /**
      * The CSS style string associated to this TableColumn.
+     * @since 2.2
      */
     public final StringProperty styleProperty() {
         if (style == null) {
@@ -652,6 +657,7 @@
      * each element of the list is a style class to which this Node belongs.
      *
      * @see <a href="http://www.w3.org/TR/css3-selectors/#class-html">CSS3 class selectors</a>
+     * @since 2.2
      */
     public ObservableList<String> getStyleClass() {
         return styleClass;
@@ -664,6 +670,7 @@
     /**
      * <p>Sets the graphic to show in the TableColumn to allow the user to
      * indicate graphically what is in the column. </p>
+     * @since 2.2
      */
     public final void setGraphic(Node value) {
         graphicProperty().set(value);
@@ -673,6 +680,7 @@
      * The graphic shown in the TableColumn.
      *
      * @return The graphic shown in the TableColumn.
+     * @since 2.2
      */
     public final Node getGraphic() {
         return graphic == null ? null : graphic.get();
@@ -682,6 +690,7 @@
      * The graphic in the TableColumn.
      * 
      * @return The graphic in the TableColumn.
+     * @since 2.2
      */
     public final ObjectProperty<Node> graphicProperty() {
         if (graphic == null) {
@@ -702,11 +711,13 @@
      * the TableColumn being in the sort order. If not specified, the
      * TableColumn skin implementation is responsible for providing a default
      * sort node.
+     * @since 2.2
      */
     public final void setSortNode(Node value) { sortNodeProperty().set(value); }
     
     /**
      * Returns the current sort node set in this TableColumn.
+     * @since 2.2
      */
     public final Node getSortNode() { return sortNode.get(); }
     
@@ -714,6 +725,7 @@
      * The sort node is commonly seen represented as a triangle that rotates
      * on screen to indicate whether the TableColumn is part of the sort order, 
      * and if so, what position in the sort order it is in.
+     * @since 2.2
      */
     public final ObjectProperty<Node> sortNodeProperty() { return sortNode; }
     
@@ -1036,8 +1048,9 @@
       *
       * @return an observable map of properties on this TableColumn for use primarily
       * by application developers
-      */
-     public final ObservableMap<Object, Object> getProperties() {
+     * @since 2.2
+     */
+    public final ObservableMap<Object, Object> getProperties() {
         if (properties == null) {
             properties = FXCollections.observableMap(new HashMap<Object, Object>());
         }
@@ -1047,8 +1060,9 @@
     /**
      * Tests if this TableColumn has properties.
      * @return true if node has properties.
+     * @since 2.2
      */
-     public boolean hasProperties() {
+    public boolean hasProperties() {
         return properties != null;
     }
 
@@ -1062,6 +1076,7 @@
      *
      * @param value The value to be stored - this can later be retrieved by calling
      *          {@link TableColumn#getUserData()}.
+     * @since 2.2
      */
     public void setUserData(Object value) {
         getProperties().put(USER_DATA_KEY, value);
@@ -1073,6 +1088,7 @@
      *
      * @return The Object that was previously set, or null if no property
      *          has been set or if null was set.
+     * @since 2.2
      */
     public Object getUserData() {
         return getProperties().get(USER_DATA_KEY);
--- a/javafx-ui-controls/src/javafx/scene/control/TextInputControl.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/TextInputControl.java	Tue Jul 17 10:02:08 2012 -0700
@@ -159,6 +159,7 @@
     /**
      * The prompt text to display in the {@code TextInputControl}, or
      * <tt>null</tt> if no prompt text is displayed.
+     * @since 2.2
      */
     private StringProperty promptText = new SimpleStringProperty(this, "promptText", "") {
         @Override protected void invalidated() {
--- a/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxListCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxListCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -56,6 +56,7 @@
  * @see CheckBox
  * @see ListCell
  * @param <T> The type of the elements contained within the ListView.
+ * @since 2.2
  */
 public class CheckBoxListCell<T> extends ListCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxTableCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxTableCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -56,6 +56,7 @@
  * if it changes externally).
  * 
  * @param <T> The type of the elements contained within the TableColumn.
+ * @since 2.2
  */
 public class CheckBoxTableCell<S,T> extends TableCell<S,T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxTreeCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/CheckBoxTreeCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -74,6 +74,7 @@
  * 
  * @param <T> The type of the elements contained within the TreeView TreeItem 
  *      instances.
+ * @since 2.2
  */
 public class CheckBoxTreeCell<T> extends TreeCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxListCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxListCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -51,6 +51,7 @@
  * {@link ListView#itemsProperty() items} list.
  * 
  * @param <T> The type of the elements contained within the ListView.
+ * @since 2.2
  */
 public class ChoiceBoxListCell<T> extends ListCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxTableCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxTableCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -50,6 +50,7 @@
  * showing. These items must be of the same type as the TableColumn.
  * 
  * @param <T> The type of the elements contained within the TableColumn.
+ * @since 2.2
  */
 public class ChoiceBoxTableCell<S,T> extends TableCell<S,T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxTreeCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ChoiceBoxTreeCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -48,6 +48,7 @@
  * {@link TreeItem#valueProperty()}.
  * 
  * @param <T> The type of the TreeItems contained within the TreeView.
+ * @since 2.2
  */
 public class ChoiceBoxTreeCell<T> extends TreeCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxListCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxListCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -50,6 +50,7 @@
  * {@link ListView#itemsProperty() items} list.
  * 
  * @param <T> The type of the elements contained within the ListView.
+ * @since 2.2
  */
 public class ComboBoxListCell<T> extends ListCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxTableCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxTableCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -52,6 +52,7 @@
  * showing. These items must be of the same type as the TableColumn.
  * 
  * @param <T> The type of the elements contained within the TableColumn.
+ * @since 2.2
  */
 public class ComboBoxTableCell<S,T> extends TableCell<S,T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxTreeCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ComboBoxTreeCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -50,6 +50,7 @@
  * {@link TreeItem#valueProperty()}.
  * 
  * @param <T> The type of the TreeItems contained within the TreeView.
+ * @since 2.2
  */
 public class ComboBoxTreeCell<T> extends TreeCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/MapValueFactory.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/MapValueFactory.java	Tue Jul 17 10:02:08 2012 -0700
@@ -67,6 +67,7 @@
  * @see TableCell
  * @see PropertyValueFactory
  * @param <T> The type of the class contained within the TableColumn cells.
+ * @since 2.2
  */
 public class MapValueFactory<T> implements Callback<CellDataFeatures<Map,T>, ObservableValue<T>> {
 
--- a/javafx-ui-controls/src/javafx/scene/control/cell/ProgressBarTableCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/ProgressBarTableCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -36,6 +36,7 @@
  * {@link ProgressBar} node inside the cell.
  * 
  * @param <S> The type of the elements contained within the TableView.
+ * @since 2.2
  */
 @NoBuilder // @NoBuilder because if the builder is generated, it does not compile
 public class ProgressBarTableCell<S> extends TableCell<S, Double> {
--- a/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldListCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldListCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -43,6 +43,7 @@
  * default, stretch to fill the entire list cell.
  * 
  * @param <T> The type of the elements contained within the ListView.
+ * @since 2.2
  */
 public class TextFieldListCell<T> extends ListCell<T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldTableCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldTableCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -40,6 +40,7 @@
  * default, stretch to fill the entire table cell.
  * 
  * @param <T> The type of the elements contained within the TableColumn.
+ * @since 2.2
  */
 public class TextFieldTableCell<S,T> extends TableCell<S,T> {
     
--- a/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldTreeCell.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-ui-controls/src/javafx/scene/control/cell/TextFieldTreeCell.java	Tue Jul 17 10:02:08 2012 -0700
@@ -43,6 +43,7 @@
  * default, stretch to fill the entire tree cell.
  * 
  * @param <T> The type of the elements contained within the TreeView.
+ * @since 2.2
  */
 public class TextFieldTreeCell<T> extends TreeCell<T> {
     
--- a/javafx-util-converter/src/javafx/util/converter/FormatStringConverter.java	Tue Jul 17 07:17:30 2012 +1200
+++ b/javafx-util-converter/src/javafx/util/converter/FormatStringConverter.java	Tue Jul 17 10:02:08 2012 -0700
@@ -31,6 +31,8 @@
 /**
  * <p>{@link StringConverter} implementation that can use a {@link Format} 
  * instance.</p>
+ *
+ * @since 2.2
  */
 @NoBuilder
 public class FormatStringConverter<T> extends StringConverter<T> {