755
756 if (vw > 0 && vh > 0) {
757 viewWidth = vw;
758 viewHeight = vh;
759 }
760
761 // desWidth Note and destHeight are computed by impl_computeGeomBounds()
762 // via a call from Node.contains() before calling
763 // impl_computeContains().
764 // Transform into image's coordinate system.
765 dx = vminx + dx * viewWidth / destWidth;
766 dy = vminy + dy * viewHeight / destHeight;
767 // test whether it's inside the original image AND inside of viewport
768 // (viewport may stick out from the image bounds)
769 if (dx < 0.0 || dy < 0.0 || dx >= srcWidth || dy >= srcHeight ||
770 dx < vminx || dy < vminy ||
771 dx >= vminx + viewWidth || dy >= vminy + viewHeight) {
772 return false;
773 }
774 // Do alpha test on the picked pixel.
775 return Toolkit.getToolkit().imageContains(localImage.impl_getPlatformImage(), (float)dx, (float)dy);
776 }
777
778 /***************************************************************************
779 * * Stylesheet Handling * *
780 **************************************************************************/
781
782 private static final String DEFAULT_STYLE_CLASS = "image-view";
783
784 /**
785 * Super-lazy instantiation pattern from Bill Pugh.
786 * @treatAsPrivate implementation detail
787 */
788 private static class StyleableProperties {
789 // TODO
790 // "preserve-ratio","smooth","viewport","fit-width","fit-height"
791 private static final CssMetaData<ImageView, String> IMAGE =
792 new CssMetaData<ImageView,String>("-fx-image",
793 URLConverter.getInstance()) {
794
795 @Override
819 * @since JavaFX 8.0
820 */
821 public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
822 return StyleableProperties.STYLEABLES;
823 }
824
825 /**
826 * {@inheritDoc}
827 *
828 * @since JavaFX 8.0
829 */
830
831
832 @Override
833 public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
834 return getClassCssMetaData();
835 }
836
837 void updateViewport() {
838 recomputeWidthHeight();
839 if (getImage() == null || getImage().impl_getPlatformImage() == null) {
840 return;
841 }
842
843 Rectangle2D localViewport = getViewport();
844 final NGImageView peer = impl_getPeer();
845 if (localViewport != null) {
846 peer.setViewport((float)localViewport.getMinX(), (float)localViewport.getMinY(),
847 (float)localViewport.getWidth(), (float)localViewport.getHeight(),
848 (float)destWidth, (float)destHeight);
849 } else {
850 peer.setViewport(0, 0, 0, 0, (float)destWidth, (float)destHeight);
851 }
852 }
853
854 /**
855 * @treatAsPrivate implementation detail
856 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
857 */
858 @Deprecated
859 @Override public void impl_updatePeer() {
860 super.impl_updatePeer();
861
862 final NGImageView peer = impl_getPeer();
863 if (impl_isDirty(DirtyBits.NODE_GEOMETRY)) {
864 peer.setX((float)getX());
865 peer.setY((float)getY());
866 }
867 if (impl_isDirty(DirtyBits.NODE_SMOOTH)) {
868 peer.setSmooth(isSmooth());
869 }
870 if (impl_isDirty(DirtyBits.NODE_CONTENTS)) {
871 peer.setImage(getImage()!= null? getImage().impl_getPlatformImage():null);
872 }
873 // The NG part expects this to be called when image changes
874 if (impl_isDirty(DirtyBits.NODE_VIEWPORT) || impl_isDirty(DirtyBits.NODE_CONTENTS)) {
875 updateViewport();
876 }
877 }
878
879 /**
880 * @treatAsPrivate implementation detail
881 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
882 */
883 @Deprecated
884 @Override public Object impl_processMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
885 return alg.processLeafNode(this, ctx);
886 }
887 }
|
755
756 if (vw > 0 && vh > 0) {
757 viewWidth = vw;
758 viewHeight = vh;
759 }
760
761 // desWidth Note and destHeight are computed by impl_computeGeomBounds()
762 // via a call from Node.contains() before calling
763 // impl_computeContains().
764 // Transform into image's coordinate system.
765 dx = vminx + dx * viewWidth / destWidth;
766 dy = vminy + dy * viewHeight / destHeight;
767 // test whether it's inside the original image AND inside of viewport
768 // (viewport may stick out from the image bounds)
769 if (dx < 0.0 || dy < 0.0 || dx >= srcWidth || dy >= srcHeight ||
770 dx < vminx || dy < vminy ||
771 dx >= vminx + viewWidth || dy >= vminy + viewHeight) {
772 return false;
773 }
774 // Do alpha test on the picked pixel.
775 return Toolkit.getToolkit().imageContains(
776 Toolkit.getImageAccessor().getPlatformImage(localImage), (float)dx, (float)dy);
777 }
778
779 /***************************************************************************
780 * * Stylesheet Handling * *
781 **************************************************************************/
782
783 private static final String DEFAULT_STYLE_CLASS = "image-view";
784
785 /**
786 * Super-lazy instantiation pattern from Bill Pugh.
787 * @treatAsPrivate implementation detail
788 */
789 private static class StyleableProperties {
790 // TODO
791 // "preserve-ratio","smooth","viewport","fit-width","fit-height"
792 private static final CssMetaData<ImageView, String> IMAGE =
793 new CssMetaData<ImageView,String>("-fx-image",
794 URLConverter.getInstance()) {
795
796 @Override
820 * @since JavaFX 8.0
821 */
822 public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
823 return StyleableProperties.STYLEABLES;
824 }
825
826 /**
827 * {@inheritDoc}
828 *
829 * @since JavaFX 8.0
830 */
831
832
833 @Override
834 public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
835 return getClassCssMetaData();
836 }
837
838 void updateViewport() {
839 recomputeWidthHeight();
840 if (getImage() == null || Toolkit.getImageAccessor().getPlatformImage(getImage()) == null) {
841 return;
842 }
843
844 Rectangle2D localViewport = getViewport();
845 final NGImageView peer = impl_getPeer();
846 if (localViewport != null) {
847 peer.setViewport((float)localViewport.getMinX(), (float)localViewport.getMinY(),
848 (float)localViewport.getWidth(), (float)localViewport.getHeight(),
849 (float)destWidth, (float)destHeight);
850 } else {
851 peer.setViewport(0, 0, 0, 0, (float)destWidth, (float)destHeight);
852 }
853 }
854
855 /**
856 * @treatAsPrivate implementation detail
857 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
858 */
859 @Deprecated
860 @Override public void impl_updatePeer() {
861 super.impl_updatePeer();
862
863 final NGImageView peer = impl_getPeer();
864 if (impl_isDirty(DirtyBits.NODE_GEOMETRY)) {
865 peer.setX((float)getX());
866 peer.setY((float)getY());
867 }
868 if (impl_isDirty(DirtyBits.NODE_SMOOTH)) {
869 peer.setSmooth(isSmooth());
870 }
871 if (impl_isDirty(DirtyBits.NODE_CONTENTS)) {
872 peer.setImage(getImage() != null
873 ? Toolkit.getImageAccessor().getPlatformImage(getImage()) : null);
874 }
875 // The NG part expects this to be called when image changes
876 if (impl_isDirty(DirtyBits.NODE_VIEWPORT) || impl_isDirty(DirtyBits.NODE_CONTENTS)) {
877 updateViewport();
878 }
879 }
880
881 /**
882 * @treatAsPrivate implementation detail
883 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
884 */
885 @Deprecated
886 @Override public Object impl_processMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
887 return alg.processLeafNode(this, ctx);
888 }
889 }
|